diff --git a/data/logo.png b/data/logo.png new file mode 100644 index 00000000..10f903ef Binary files /dev/null and b/data/logo.png differ diff --git a/project.4coder b/project.4coder index 07a58411..f2ae9f7c 100644 --- a/project.4coder +++ b/project.4coder @@ -68,7 +68,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: running target - .f3 = { .win = "raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f3 = { .win = "raddbg_stable --ipc run", .linux = "cd build && ./raddbg && cd ..", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "wsl ./build/raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "pushd build && raddbg --user:dev.raddbg_user && popd", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 881944b3..2e9b3e00 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -29,7 +29,7 @@ internal Arena * arena_alloc_(ArenaParams *params) { ProfBeginFunction(); - + U64 reserve_size = params->reserve_size; U64 commit_size = params->commit_size; @@ -69,13 +69,13 @@ arena_alloc_(ArenaParams *params) } // rjf: panic on arena creation failure -#if OS_FEATURE_GRAPHICAL if(Unlikely(base == 0)) { - wm_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); +#if defined(SHELL_H) + sh_message(1, s("Fatal Allocation Failure"), s("Unexpected memory allocation failure.")); +#endif abort_self(1); } -#endif // rjf: extract arena header & fill AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE); @@ -143,7 +143,7 @@ internal void arena_release(Arena *arena) { ProfBeginFunction(); - + #if PROFILE_TELEMETRY { Arena *base_arena = arena; @@ -176,7 +176,7 @@ arena_release(Arena *arena) AsanUnpoisonMemoryRegion(n, n->cmt); release_memory(n, n->res); } - + ProfEnd(); } @@ -295,13 +295,13 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) #endif // rjf: panic on failure -#if OS_FEATURE_GRAPHICAL if(Unlikely(result == 0)) { - wm_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); +#if defined(SHELL_H) + sh_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); +#endif abort_self(1); } -#endif return result; } diff --git a/src/linux/shell/generated/linux_shell.meta.c b/src/linux/shell/generated/linux_shell.meta.c new file mode 100644 index 00000000..0378fad9 --- /dev/null +++ b/src/linux/shell/generated/linux_shell.meta.c @@ -0,0 +1,5 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + diff --git a/src/linux/shell/generated/linux_shell.meta.h b/src/linux/shell/generated/linux_shell.meta.h new file mode 100644 index 00000000..38dfff03 --- /dev/null +++ b/src/linux/shell/generated/linux_shell.meta.h @@ -0,0 +1,129 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef LINUX_SHELL_META_H +#define LINUX_SHELL_META_H + +C_LINKAGE_BEGIN +read_only global U8 lnx_sh_logo_file_bytes__data[] = +{ +0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x00,0x00,0x5c,0x72,0xa8,0x66,0x00,0x00,0x00,0x04,0x67,0x41,0x4d,0x41,0x00,0x00,0xb1,0x8f,0x0b,0xfc,0x61,0x05,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x01,0xd9,0xc9,0x2c,0x7f,0x00,0x00, +0x00,0x20,0x63,0x48,0x52,0x4d,0x00,0x00,0x7a,0x26,0x00,0x00,0x80,0x84,0x00,0x00,0xfa,0x00,0x00,0x00,0x80,0xe8,0x00,0x00,0x75,0x30,0x00,0x00,0xea,0x60,0x00,0x00,0x3a,0x98,0x00,0x00,0x17,0x70,0x9c,0xba,0x51,0x3c,0x00,0x00,0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,0x00,0x00,0x00,0x09, +0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x1a,0xec,0x49,0x44,0x41,0x54,0x78,0xda,0xed,0x9d,0x79,0x98,0x14,0xd5,0xb9,0xc6,0x7f,0xdd,0x3d,0xdd,0x3d,0x03,0x33,0x30,0x33,0x0c,0xab,0xa0,0x8e,0x48,0xa3,0xa0,0x2c,0x83,0x02,0xea,0xd5,0x28,0xa5,0xa2,0x46,0xdc,0x35,0xee,0x1a, +0xe5,0x46,0x13,0x13,0xd1,0x18,0xcd,0xd5,0xa8,0x31,0x06,0x90,0x5c,0x35,0x41,0x8d,0x7a,0xd5,0xa8,0xb8,0x80,0x5b,0xcc,0xe3,0x86,0xa2,0xa6,0x5d,0x40,0x0c,0x11,0x45,0x01,0x09,0x5a,0xa0,0xb8,0x81,0xc0,0x00,0x33,0xc0,0x30,0xd0,0xb3,0x74,0xdf,0x3f,0xba,0xd4,0x51,0x01,0xa7,0xe9,0xee,0x5a,0xba,0xde,0xdf,0xf3,0xcc,0x33,0x2c,0xd3, +0x53,0xa7,0xbe,0xf3,0xbd,0x6f,0x7d,0xe7,0x54,0xd5,0x39,0x20,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0xef,0x12,0x50,0x08,0x0a,0x9b,0x78,0x8c,0x32,0xa0,0x02,0x28,0x6f,0xf3,0xbd,0xed,0x9f,0x01,0xea,0x81,0x3a,0xeb,0x7b,0xdb,0x3f,0xd7,0x19,0x26, +0x1b,0x15,0x45,0x19,0x80,0x70,0x9f,0xb0,0xbb,0x02,0xc3,0x80,0xa1,0xc0,0x6e,0x5b,0x11,0x76,0x05,0xd0,0x19,0x08,0x65,0x79,0xa8,0x56,0x60,0x7d,0x5b,0x53,0x68,0x63,0x14,0x1f,0x03,0xef,0x02,0xef,0x18,0x26,0xb5,0xea,0x15,0x19,0x80,0xc8,0x8f,0xd8,0xfb,0x00,0x35,0x96,0xd8,0x6b,0xac,0xaf,0x9d,0x5c,0xd6,0xcc,0xe5,0xc0,0xbc,0xb6, +0x5f,0x86,0xc9,0x17,0xea,0x3d,0x19,0x80,0x68,0xbf,0xd0,0x03,0xd6,0xd5,0xbc,0xa6,0xcd,0xd7,0x50,0xa0,0xab,0x47,0x4f,0xa9,0xd6,0xaa,0x10,0xda,0x9a,0xc2,0x47,0xea,0x69,0x19,0x80,0xf8,0xbe,0xf8,0x9f,0x02,0x0e,0xb6,0xca,0xf6,0x42,0x66,0x3d,0xf0,0x9a,0x61,0x72,0x9c,0x7a,0x5d,0x06,0x20,0xd2,0xe2,0xaf,0xb6,0xc6,0xd3,0x7e,0xa2, +0xda,0x30,0xf9,0x44,0xbd,0xef,0x2c,0x41,0x85,0xc0,0x15,0x8c,0xd2,0x39,0x0b,0x19,0x80,0x0c,0x40,0xe7,0x2c,0x64,0x00,0x3e,0xe4,0x10,0x9d,0xb3,0x90,0x01,0xf8,0x73,0xfc,0xbf,0x07,0xd0,0xd3,0x87,0xa7,0xde,0x2b,0x1e,0xa3,0xbf,0x32,0x40,0x06,0xa0,0xf2,0x5f,0xe7,0x2e,0x64,0x00,0x12,0x81,0xce,0x5d,0xd8,0x8d,0x6e,0x03,0x3a,0x5b, +0xfe,0x07,0x48,0x3f,0x2c,0xd3,0xc5,0xa7,0x21,0x58,0x03,0x74,0x33,0x4c,0x52,0xca,0x06,0x55,0x00,0x7e,0x64,0x90,0x8f,0xc5,0x0f,0x50,0x05,0xec,0xad,0x34,0x90,0x01,0xa8,0x04,0x56,0x0c,0x84,0x0c,0x40,0xc9,0xaf,0x18,0x08,0xcd,0x01,0xf8,0x63,0xfc,0x1f,0x02,0xd6,0x01,0x9d,0x7c,0x1e,0x8a,0xf5,0x40,0x17,0xc3,0xa4,0x55,0x59,0xa1, +0x0a,0xc0,0x4f,0x0c,0x93,0xf8,0x81,0xf4,0xcb,0x4f,0x35,0x0a,0x83,0x0c,0x40,0xa5,0xaf,0x62,0x21,0x64,0x00,0x4a,0x7a,0xc5,0x42,0x68,0x0e,0xa0,0xb0,0xc7,0xff,0x11,0xd2,0x4b,0x6b,0x75,0x50,0x34,0x00,0x68,0x04,0xca,0x0d,0x93,0x66,0x85,0x42,0x15,0x80,0x1f,0x18,0x21,0xf1,0x7f,0x8b,0x0e,0x56,0x4c,0x84,0x0c,0x40,0x25,0xaf,0x62, +0x22,0x64,0x00,0x4a,0x76,0xc5,0x44,0x68,0x0e,0xa0,0x00,0xc7,0xff,0x25,0xa4,0x97,0xd4,0x8e,0x28,0x1a,0xdf,0x22,0x01,0x54,0x18,0x26,0x9b,0x15,0x0a,0x55,0x00,0x85,0xcc,0x01,0x12,0xff,0x56,0x89,0x02,0xfb,0x2b,0x0c,0x32,0x00,0x95,0xba,0x8a,0x8d,0x90,0x01,0x28,0xc9,0x15,0x1b,0xa1,0x39,0x80,0xc2,0x1a,0xff,0x77,0x22,0xfd,0xfc, +0x7f,0x48,0xd1,0xd8,0x2a,0x2d,0x40,0xa5,0xf6,0x23,0x54,0x05,0x50,0xa8,0x1c,0x28,0xf1,0x6f,0x97,0x22,0x2b,0x46,0x42,0x15,0x40,0x41,0x5d,0xf9,0x8b,0x81,0x9f,0x01,0xbf,0x05,0x7a,0x29,0x22,0xdb,0x65,0x05,0x30,0x09,0xb8,0xc7,0x30,0xd9,0xa2,0x70,0xc8,0x00,0xbc,0x2c,0xfc,0x12,0xe0,0x42,0xe0,0x0a,0xa0,0x87,0x22,0x92,0x11,0x5f, +0x02,0x37,0x02,0xff,0xa7,0x5b,0x83,0x32,0x00,0xaf,0x09,0xbf,0x23,0xf0,0x0b,0xe0,0x32,0xa0,0xbb,0x22,0x92,0x15,0xab,0x80,0x9b,0x80,0x3b,0x0d,0x93,0x4d,0x0a,0x87,0x0c,0xc0,0xcd,0xc2,0x2f,0x05,0x7e,0x09,0xfc,0x1a,0xef,0xee,0xe8,0xeb,0x56,0x6a,0x81,0x3f,0x03,0x7f,0x35,0x4c,0x1a,0x14,0x0e,0x19,0x80,0x9b,0x84,0xdf,0x09,0xb8, +0x18,0xb8,0x04,0x7f,0x2f,0xf2,0x69,0x07,0x6b,0x81,0xc9,0xc0,0xad,0x86,0xc9,0x06,0x85,0xc3,0x47,0x06,0x10,0x8f,0x11,0x04,0xfe,0x00,0x2c,0x03,0x66,0x18,0x26,0x2b,0x1c,0x6e,0x4f,0x04,0xb8,0x1c,0xf8,0x0d,0x50,0xae,0x74,0xb2,0x95,0x3a,0xe0,0x66,0xe0,0x46,0xc3,0xa4,0xc9,0xe1,0x3c,0xe8,0x05,0x1c,0x01,0xec,0x0a,0x5c,0x67,0x98, +0x24,0x65,0x00,0xf9,0x09,0xf4,0x64,0x60,0x5c,0x9b,0x7f,0x7a,0x1f,0x98,0x01,0xbc,0x08,0xcc,0x32,0x4c,0x12,0x36,0xb6,0xa5,0x06,0x98,0x82,0x96,0xb5,0x76,0x9a,0x85,0xc0,0x39,0x86,0xc9,0xbb,0x36,0xf6,0x7d,0x94,0xf4,0xed,0xca,0xd1,0x96,0xf0,0xf7,0x6a,0xf3,0xdf,0x93,0x0d,0x93,0x4b,0x65,0x00,0xb9,0x0f,0xfa,0x38,0xab,0xf4,0xdb, +0x16,0x8d,0xc0,0x6b,0x5f,0x19,0x82,0x61,0x62,0xe6,0xa9,0x1d,0x61,0xe0,0x1a,0xe0,0x4a,0xd2,0xf7,0xad,0x85,0xf3,0xb4,0x00,0x37,0x00,0x7f,0xcc,0xd7,0xa2,0x22,0xf1,0x18,0xb1,0x36,0x82,0x3f,0x98,0xed,0xaf,0xe7,0x30,0xce,0x30,0xb9,0x55,0x06,0x90,0xbb,0xe0,0x1f,0x07,0x3c,0x49,0x66,0x0f,0x2e,0x2d,0xb3,0x2a,0x83,0x19,0xc0,0x2b, +0xb9,0x78,0xba,0x2c,0x1e,0x63,0xa8,0x75,0xd5,0x1f,0x24,0xcd,0xb9,0x92,0x05,0xc0,0xb9,0xb9,0xa8,0x06,0xe2,0x31,0xca,0x00,0xc3,0x12,0xfd,0x68,0xa0,0x3a,0x83,0x8f,0x27,0x81,0x13,0x0c,0x93,0xa7,0x65,0x00,0xd9,0x77,0xc4,0x70,0xeb,0xca,0x5e,0x92,0xc5,0xaf,0x69,0x06,0xde,0x6c,0x63,0x08,0xef,0x65,0xb2,0x1d,0x95,0x75,0xd5,0xbf, +0x1a,0xb8,0x4a,0x57,0x7d,0xd7,0xd3,0x0c,0x4c,0x04,0x26,0x64,0x52,0x0d,0x58,0xdb,0xb4,0x0d,0x6d,0x73,0x95,0xdf,0x0f,0x08,0x67,0xd1,0x8e,0x46,0xe0,0x60,0xc3,0x64,0xae,0x0c,0x60,0xc7,0xc5,0x5f,0x0d,0xcc,0x01,0xba,0xe5,0xf8,0x57,0xaf,0x02,0x5e,0xb2,0x0c,0xe1,0x25,0xc3,0xa4,0x76,0x3b,0x6d,0x18,0x62,0x5d,0xf5,0x07,0x4b,0x5b, +0x9e,0x62,0xbe,0x35,0x37,0x30,0x7f,0x3b,0x7d,0xdb,0x15,0x38,0xdc,0x12,0xfc,0x61,0xe4,0xfe,0x99,0x8d,0xd5,0xc0,0x48,0xc3,0x64,0x99,0x0c,0x20,0x73,0xf1,0x57,0x58,0x57,0xed,0x3d,0xf2,0x7c,0xa8,0x14,0x30,0xaf,0x4d,0x75,0xf0,0x2f,0xc3,0xa4,0xc5,0xba,0xea,0xff,0xce,0xba,0xea,0x87,0xa5,0x27,0xcf,0x56,0x03,0x13,0x80,0x89,0x86, +0x49,0x73,0x3c,0x46,0x91,0x75,0x65,0x3f,0xc2,0xba,0xd2,0xd7,0xd8,0xa0,0x81,0x0f,0x80,0xfd,0x0d,0x93,0x3a,0x19,0x40,0xfb,0xc5,0x1f,0xb5,0xae,0xd0,0x07,0x39,0x70,0xf8,0x0d,0x40,0xdc,0x1a,0xf3,0x0d,0x91,0x86,0x0a,0x82,0xf7,0x48,0xcf,0x09,0x19,0x38,0xb3,0x19,0xcb,0x4c,0xe0,0x30,0xa7,0x6f,0x57,0x7a,0xc2,0x00,0xac,0xb1,0xd8, +0x54,0xe0,0x34,0xe5,0xad,0x28,0x20,0xa6,0x01,0x67,0xba,0x6d,0x2b,0x74,0x37,0xbe,0x0e,0x3c,0x5e,0xe2,0x17,0x05,0xc8,0xe9,0xc0,0x1f,0x55,0x01,0x6c,0xff,0xea,0x3f,0x16,0xb8,0x47,0xb9,0x22,0x0a,0x98,0xb1,0x86,0xc9,0xbd,0x32,0x80,0xef,0x8b,0xff,0x50,0xe0,0x05,0x74,0x9b,0x4d,0x14,0x36,0x2d,0xc0,0x91,0x86,0xc9,0x3f,0x65,0x00, +0xdf,0x88,0xbf,0x02,0x58,0x04,0xf4,0x54,0x7e,0x08,0x1f,0xf0,0x25,0x30,0xd0,0x0d,0x77,0x06,0xdc,0x32,0x07,0x70,0xab,0xc4,0x2f,0x7c,0x44,0x4f,0xe0,0x16,0x55,0x00,0xe9,0xab,0xff,0x18,0xe0,0x19,0xe5,0x84,0xf0,0x21,0x63,0x0c,0x93,0xe7,0x7c,0x6b,0x00,0x2a,0xfd,0x85,0x86,0x02,0xce,0x0e,0x05,0x9c,0x1e,0x02,0xdc,0x22,0xf1,0x0b, +0x9f,0x0f,0x05,0x26,0xfb,0xb2,0x02,0x50,0xe9,0x2f,0x84,0xf3,0x43,0x81,0x80,0x43,0xe2,0x57,0xe9,0x2f,0xc4,0x37,0xac,0xb0,0x86,0x02,0xf5,0x7e,0x19,0x02,0xa8,0xf4,0x17,0xe2,0x1b,0x7a,0xe1,0xd0,0x5d,0x01,0xdb,0x2b,0x00,0x95,0xfe,0x42,0xb8,0x67,0x28,0x10,0xb0,0x59,0xfc,0x2a,0xfd,0x85,0x70,0xd1,0x50,0xc0,0xee,0x21,0x80,0x4a, +0x7f,0x21,0x5c,0x34,0x14,0xb0,0xad,0x02,0x88,0xc7,0x38,0x1a,0x78,0x56,0x7d,0x2c,0x84,0x7b,0x86,0x02,0x01,0x9b,0xc4,0x1f,0x05,0x96,0x00,0x7d,0xd4,0xb7,0x42,0xfc,0x20,0x9f,0x03,0xbb,0xdb,0xb1,0x80,0x88,0x5d,0x43,0x80,0xf3,0x25,0x7e,0x21,0xda,0x4d,0x1f,0x4b,0x33,0xde,0xaf,0x00,0xac,0xdd,0x73,0x96,0xca,0x00,0x84,0xc8,0x88, +0xcf,0x80,0x7e,0xf9,0xae,0x02,0xec,0xa8,0x00,0x7e,0x2a,0xf1,0x0b,0x91,0x31,0x3b,0x03,0xe7,0x7a,0xba,0x02,0xb0,0x56,0xd6,0x5d,0x02,0xec,0xa2,0xfe,0x14,0x22,0x63,0x3e,0xb5,0xaa,0x80,0xe6,0x7c,0x1d,0x20,0xdf,0x15,0xc0,0x39,0x12,0xbf,0x10,0x3b,0xcc,0x2e,0xc0,0xd9,0x9e,0xac,0x00,0xac,0x35,0xd8,0x4d,0x32,0xdb,0x52,0x49,0x08, +0xf1,0x6d,0x96,0x01,0x31,0xc3,0xa4,0xc5,0x6b,0x15,0xc0,0xd9,0x12,0xbf,0x10,0x59,0x53,0x0d,0x9c,0xe5,0xa9,0x0a,0xc0,0xba,0xfa,0x7f,0x08,0xec,0xa6,0xfe,0x13,0x22,0x6b,0x3e,0x02,0xfa,0x1b,0x26,0xad,0x5e,0xa9,0x00,0xce,0x90,0xf8,0x85,0xc8,0x19,0x7d,0x2d,0x4d,0xb9,0xbf,0x02,0x88,0xc7,0x08,0x91,0xde,0x0f,0x6d,0x77,0xf5,0x9b, +0x10,0x39,0x63,0x09,0xb0,0x67,0xae,0xab,0x80,0x7c,0xac,0xc1,0x7f,0xba,0xc4,0xff,0x03,0x65,0x57,0x38,0x42,0x97,0x51,0x63,0xe8,0x75,0xf2,0x58,0x2a,0xf6,0xfd,0x11,0x00,0xa9,0x54,0x0a,0x48,0x41,0x32,0x99,0xfe,0xb3,0xf5,0x95,0x4a,0x25,0xbf,0xfe,0x33,0xa9,0x14,0xa9,0x64,0x32,0xfd,0x73,0xa9,0x54,0xfa,0xe7,0xda,0xfe,0x3c,0xd6, +0xff,0x6f,0xe3,0xf3,0x5f,0xfd,0x3c,0xa4,0xbe,0xf9,0xcc,0xb7,0x8e,0xf7,0x9d,0x63,0x6f,0xe5,0x58,0xa4,0x52,0xa4,0xd8,0xda,0x67,0xdb,0xd7,0xd6,0xb6,0x9f,0x5f,0xf9,0xf4,0xc3,0xac,0x79,0x45,0x6f,0x86,0xb7,0x93,0x7e,0xa4,0x77,0xcc,0x7a,0xd8,0xb5,0x15,0x40,0x3c,0x46,0x10,0x58,0x0c,0xc4,0xd4,0x5f,0xed,0xa3,0xc3,0x2e,0xfd,0xe8, +0x79,0xca,0x58,0x7a,0x1e,0x7f,0x2e,0x91,0x2e,0xdd,0x7c,0x75,0xee,0xa9,0x96,0x66,0x16,0x5c,0x78,0x0c,0x6b,0x67,0xcd,0x50,0x22,0xb4,0x8f,0x0f,0x81,0x01,0x86,0x49,0xd2,0xad,0x06,0x70,0x2a,0xf0,0x88,0xfa,0x69,0x07,0xab,0x82,0x43,0x8e,0x66,0xe7,0xf3,0x7e,0x43,0xe7,0xa1,0xfb,0xf9,0xe6,0xbc,0x93,0x89,0x2d,0xcc,0x1f,0x7b,0x24, +0x75,0x6f,0xbd,0xa6,0x24,0x68,0x1f,0xa7,0x19,0x26,0x8f,0xe6,0x2c,0xef,0x72,0xdc,0xb8,0xf3,0xd5,0x3f,0x3b,0x28,0x84,0xe6,0x26,0x6a,0x5f,0xfa,0x07,0xf3,0xce,0x38,0x90,0x25,0x37,0xfc,0x9a,0x64,0x62,0x8b,0x3f,0x8c,0x2f,0x5a,0xcc,0xa0,0xbb,0x9f,0xa3,0xd3,0x90,0x91,0x4a,0x82,0xf6,0x71,0x9e,0x2b,0x87,0x00,0xf1,0x18,0xdd,0x48, +0xaf,0x68,0x12,0x52,0x1f,0xe5,0x60,0x68,0xb0,0xdb,0x1e,0x0c,0x98,0x34,0x85,0x4e,0x83,0x47,0xf8,0xe2,0x7c,0x5b,0x36,0xd4,0x33,0xef,0xec,0x43,0x68,0x58,0xfc,0x9e,0x3a,0x7f,0xfb,0xb4,0x02,0x3d,0x0d,0x93,0x5a,0xb7,0x55,0x00,0x27,0x4b,0xfc,0xb9,0xa3,0xf1,0xe3,0x0f,0x78,0xe7,0xb4,0xff,0xe2,0xa3,0x9b,0xaf,0x24,0xd9,0xdc,0x54, +0xf0,0xe7,0x5b,0xd4,0xa9,0x9c,0xa1,0xf7,0xbf,0x4c,0xc7,0xdd,0x07,0xa8,0xf3,0xb7,0x4f,0xc8,0xd2,0x9a,0xeb,0x86,0x00,0xa7,0xaa,0x6f,0x72,0x4b,0xaa,0xb5,0x85,0x4f,0xef,0x9e,0xc4,0xdc,0xe3,0x87,0xd1,0xb8,0xec,0xc3,0x82,0x3f,0xdf,0x70,0x45,0x15,0x43,0xa7,0xfc,0x93,0x92,0x9d,0xfb,0xaa,0xf3,0x6d,0xd2,0x5a,0x4e,0x86,0x00,0xf1, +0x18,0xbd,0x49,0xbf,0xbf,0x1c,0x50,0xdf,0xe4,0x87,0x68,0xf7,0x9d,0xa8,0x99,0x36,0x8b,0x92,0xde,0x85,0xff,0x74,0xf5,0x96,0x15,0x9f,0x32,0xef,0x8c,0x83,0xd8,0xb2,0xe2,0x33,0x75,0xfc,0x36,0xae,0x0d,0x40,0x1f,0xc3,0x64,0xb9,0x5b,0x0c,0xe0,0x32,0xe0,0x26,0xbf,0xf5,0x42,0x51,0x69,0x80,0x8a,0xbd,0x22,0x14,0x77,0x0d,0x11,0xad, +0x08,0x12,0xa9,0x08,0x12,0xad,0x0c,0x12,0x0c,0x07,0x48,0xac,0x4b,0xd2,0xb4,0x2e,0x49,0xa2,0xae,0x95,0xc4,0xda,0x24,0xf5,0x8b,0x9b,0xd9,0x52,0x9b,0xdd,0x33,0x1c,0x25,0xbd,0xab,0xa9,0x99,0x36,0x8b,0x68,0xf7,0x9d,0x0a,0x7f,0x08,0xf4,0xe9,0x12,0xe6,0x9d,0x7e,0x10,0x4d,0x6b,0x56,0x4a,0xee,0x5b,0xe7,0x32,0xc3,0xe4,0xcf,0x6e, +0x31,0x80,0xb9,0xc0,0x3e,0x7e,0x88,0x7a,0x71,0x55,0x88,0xaa,0xe1,0x11,0xba,0x0e,0x8f,0x52,0x3e,0x20,0x42,0x20,0x83,0x59,0x8f,0x86,0x65,0x2d,0xd4,0xbe,0x95,0xa0,0x76,0x6e,0x82,0x86,0x4f,0x5a,0xd2,0x3e,0x9e,0x21,0x1d,0xaa,0xfb,0x53,0x33,0x75,0xa6,0x2f,0x9e,0x19,0xd8,0xb4,0x64,0x11,0xf3,0xce,0x3a,0x98,0xe6,0xba,0x35,0x92, +0xfb,0xf7,0x99,0x6b,0x98,0x0c,0x77,0xdc,0x00,0xe2,0x31,0xfa,0x92,0x5e,0xf2,0xab,0xa0,0xe9,0xd0,0x2b,0x44,0xdf,0x33,0x4b,0xe9,0x3a,0x22,0x9a,0x93,0xdf,0xb7,0xf1,0xa3,0x16,0x96,0x3e,0xd4,0x40,0xdd,0xc2,0xcc,0x27,0xf8,0x4a,0xfb,0x0f,0xa2,0xe6,0xe1,0xd7,0x28,0xea,0x54,0x51,0xf0,0x59,0xbe,0x71,0xd1,0x3c,0xde,0x3d,0x67,0x14, +0x2d,0x1b,0xd7,0x4b,0xf2,0xdf,0xa7,0xaf,0x61,0xf2,0x71,0x36,0xbf,0x20,0x17,0x93,0x80,0x05,0x3d,0xf9,0x17,0xa9,0x08,0xd2,0xff,0x82,0x32,0x46,0xdc,0xd2,0x25,0x67,0xe2,0x07,0x28,0xeb,0x5b,0xc4,0xd0,0xeb,0xca,0x19,0x72,0x4d,0x39,0xa5,0xbb,0x66,0xf6,0x44,0x76,0xc3,0x87,0x0b,0x78,0xef,0xfc,0x23,0x7c,0xf1,0xac,0x40,0xd9,0xc0, +0x1a,0x06,0xdf,0xf3,0x3c,0xa1,0x0e,0xa5,0x92,0x7b,0x1e,0xb4,0x97,0xf5,0x6d,0xbb,0x73,0xba,0x70,0x07,0x50,0x90,0xf5,0x68,0xf7,0xff,0x2a,0x66,0xe8,0x75,0xe5,0x74,0xee,0x1f,0x26,0x90,0xa7,0xe9,0xcd,0x92,0x1e,0x21,0x76,0x3a,0xbc,0x84,0x60,0x24,0x40,0xfd,0xfb,0x4d,0xed,0x1e,0x16,0x24,0x56,0x2d,0x87,0x40,0x80,0x8a,0x91,0xa3, +0x0a,0x7f,0xd8,0xd5,0xb3,0x0f,0x9d,0x87,0x8c,0x64,0xf5,0x8c,0x27,0x48,0xb5,0xb4,0x48,0xf6,0xdf,0xd0,0xed,0xc1,0xb5,0xdc,0xe9,0xd8,0x10,0x20,0x1e,0x63,0x20,0xf0,0x7e,0xa1,0x45,0x35,0x10,0x80,0xea,0xd3,0x3a,0xb2,0xeb,0x89,0x1d,0x6d,0x3d,0xee,0xda,0x77,0x9a,0x58,0xf4,0x97,0xf5,0xb4,0x6c,0x6e,0x9f,0x0b,0x04,0x23,0x51,0x86, +0x3f,0xb7,0x90,0x0e,0xbb,0xf4,0xf3,0x45,0xb6,0xaf,0x7d,0xfd,0x79,0x16,0x5e,0x74,0xbc,0x2f,0x9e,0x8b,0xc8,0x80,0x81,0x86,0xc9,0x7f,0x9c,0x1a,0x02,0x14,0x5c,0xf9,0x1f,0x2a,0x0e,0xb0,0xd7,0x15,0x9d,0x6d,0x17,0x3f,0x40,0x97,0x61,0x11,0x86,0x4d,0xaa,0xa0,0xa4,0x7b,0xfb,0x0a,0xb3,0x64,0x53,0x02,0xf3,0xfa,0x5f,0xfa,0x26,0xd3, +0xbb,0xfc,0xe8,0x28,0x06,0xdc,0x3c,0x95,0x40,0xa8,0x48,0xb2,0xcf,0x91,0x06,0xb3,0x35,0x80,0x9f,0x14,0xd4,0x95,0x3f,0x04,0x83,0xae,0xec,0x4c,0xd7,0xe1,0x51,0xc7,0xda,0xd0,0xb1,0x77,0x11,0x35,0xe3,0x2b,0x88,0x56,0xb6,0xaf,0x6b,0xd6,0xbd,0xf1,0x12,0xab,0x67,0x3c,0xe1,0x9f,0x9a,0x77,0xf4,0x49,0xec,0x79,0xc3,0x7d,0x04,0x82, +0x41,0x49,0x3f,0x07,0x1a,0xdc,0xe1,0x28,0xc6,0x63,0xd4,0x90,0x7e,0x47,0xb9,0x60,0x88,0x9d,0x5f,0x46,0xc5,0x5e,0x11,0xc7,0xdb,0x11,0xad,0x0c,0xb2,0xf7,0x6f,0x3b,0x13,0x8c,0xb4,0x6f,0x84,0xb6,0x64,0xe2,0xa5,0xb4,0x36,0x36,0xf8,0x26,0xe3,0x7b,0x1c,0x7b,0x16,0xb1,0x6b,0x6f,0x27,0x6f,0x13,0x33,0x1e,0x4b,0x5b,0x4b,0x8b,0x3b, +0x56,0xf1,0xee,0xe8,0x07,0xcf,0xe9,0x42,0x23,0x70,0x08,0xd0,0xbb,0x10,0xa2,0xb8,0xd3,0x11,0x25,0x54,0x9f,0xd2,0xd1,0x35,0xed,0x89,0x56,0x86,0x28,0xe9,0x1e,0xa2,0xf6,0xdf,0x89,0x1f,0xfc,0xd9,0xd6,0x4d,0x1b,0x69,0x5e,0xbb,0x9a,0x50,0x59,0x27,0x9a,0x56,0xaf,0xa0,0x79,0xed,0x2a,0x9a,0xeb,0xd6,0xd0,0xb2,0xa1,0x8e,0x96,0x86, +0x0d,0x24,0x37,0x6f,0x22,0x99,0xd8,0x42,0xaa,0xa5,0x99,0x54,0x32,0x49,0x20,0x18,0xf0,0xfc,0x15,0xb4,0xd3,0xde,0xfb,0x10,0xea,0x58,0xc6,0xba,0xd9,0x2f,0xfb,0xdd,0x00,0xe6,0x00,0xb7,0x3d,0xb8,0x96,0xc4,0x8e,0x7c,0x38,0xdb,0x49,0xc0,0x4e,0xc0,0x0b,0xc0,0xfe,0x9e,0x4e,0xa6,0x58,0x98,0x61,0x13,0x2a,0x08,0xb8,0x50,0x13,0x4b, +0xee,0x6b,0xe0,0xf3,0xe9,0x8d,0xb9,0x1f,0xee,0x04,0x83,0x04,0x8a,0xc2,0x04,0xc2,0x11,0x82,0xe1,0xc8,0xd7,0xdf,0x83,0xe1,0x08,0x81,0xc8,0xb7,0xff,0x6d,0x5b,0x3f,0x13,0x28,0x0a,0x7f,0xf3,0x77,0xeb,0x7b,0xb8,0xbc,0x0b,0x3b,0x9d,0x71,0x11,0x81,0x90,0x3d,0xef,0x85,0x2d,0xb8,0x70,0x0c,0x6b,0x5e,0x7d,0xce,0xaf,0xe2,0x9f,0x0d, +0x1c,0x69,0x98,0x6c,0xdc,0xd1,0x5f,0x90,0xd5,0x6c,0x8a,0x61,0xb2,0x21,0x1e,0x63,0x34,0x30,0x1d,0x38,0xc8,0x9b,0x03,0x7f,0xe8,0x77,0x6e,0xa9,0x2b,0xc5,0x0f,0x50,0x7d,0x6a,0x47,0x56,0xce,0xdc,0x42,0xf3,0xc6,0x64,0x4e,0x7f,0x6f,0x2a,0x99,0x24,0xd5,0x94,0x80,0xa6,0x44,0xce,0x16,0x99,0x8b,0x76,0xeb,0xc5,0xe0,0xbb,0xa7,0xdb, +0x26,0xfe,0x2f,0x1e,0xba,0x8d,0x35,0xaf,0x4d,0xf7,0xab,0xf8,0x5f,0x07,0x8e,0x36,0x4c,0xb2,0x1a,0xfb,0x65,0x9d,0xf6,0x56,0x03,0x8e,0x04,0x5e,0xf1,0x62,0x14,0xbb,0x0e,0x8f,0xd2,0xb9,0x7f,0xd8,0xb5,0xed,0x2b,0xea,0x10,0x60,0x97,0x13,0x3b,0xb8,0x3e,0x8e,0x1d,0xfb,0xed,0xc5,0xb0,0xc7,0xe7,0x50,0xba,0xe7,0x10,0xdb,0xc4,0x6f, +0x4e,0x18,0x67,0xad,0x85,0xe8,0x3b,0xe2,0xc0,0x51,0xd9,0x8a,0x3f,0x27,0x06,0x60,0x99,0x40,0x23,0x70,0x34,0xf0,0x92,0xa7,0x2e,0xfe,0x21,0xe8,0x7b,0xa6,0xfb,0x9f,0x30,0xeb,0x7d,0x64,0x09,0xc5,0xdd,0xdc,0xbb,0xd4,0x42,0xc5,0x7e,0x06,0xc3,0x1e,0x9d,0x4d,0x71,0xcf,0x3e,0x12,0x7f,0xfe,0x79,0x11,0x18,0x63,0x69,0x0e,0x57,0x18, +0x80,0x65,0x02,0x9b,0x81,0x63,0x80,0xe7,0xbd,0x12,0xc9,0xee,0x07,0x16,0xd3,0xa1,0x97,0xfb,0xd7,0x30,0x09,0x16,0x05,0xd8,0xf5,0x04,0x77,0x56,0x01,0x3d,0x8e,0x3b,0x9b,0x21,0xf7,0xce,0xa0,0xa8,0xb4,0x93,0xc4,0x9f,0x7f,0xa6,0x03,0xc7,0x5a,0x5a,0xc3,0x55,0x06,0x60,0x99,0x40,0x02,0x38,0x1e,0xf0,0xc4,0x5a,0xcf,0xdd,0xf6,0x8b, +0x7a,0xa6,0xe7,0xbb,0x8e,0x8c,0x66,0xf4,0xe6,0x61,0xfe,0xcb,0xa7,0x00,0xd5,0x17,0x5d,0xcb,0x80,0x3f,0x3d,0x60,0xdb,0x83,0x39,0x3e,0x17,0xff,0xd3,0xc0,0x09,0x96,0xc6,0x70,0xa5,0x01,0x58,0x26,0xd0,0x04,0x9c,0x04,0x3c,0xe9,0xe6,0x68,0x86,0x8a,0x03,0x54,0x0e,0x8e,0x78,0xa6,0xf7,0xc3,0x65,0x41,0xd7,0xcc,0x55,0x04,0x8a,0xc2, +0xec,0x39,0xe1,0x5e,0xaa,0x2f,0xfe,0x83,0x6d,0xc7,0xf4,0xb9,0xf8,0x9f,0x04,0x4e,0xb6,0xb4,0x85,0xab,0x0d,0xc0,0x32,0x81,0x66,0xd2,0x8f,0x28,0x3e,0xee,0xd6,0x88,0x56,0x0e,0x89,0x10,0x0c,0x7b,0xeb,0x41,0x12,0x27,0x9f,0x50,0xfc,0x8a,0xa2,0xd2,0x4e,0x0c,0xbe,0x7b,0x3a,0x3d,0x4f,0xfc,0xa9,0xc4,0x6f,0x0f,0x8f,0x01,0xa7,0x5a, +0x9a,0xc2,0x13,0x06,0x60,0x99,0x40,0x0b,0xe9,0x5d,0x82,0xa6,0xba,0x31,0xaa,0x55,0xfb,0x46,0x3d,0x97,0x09,0x55,0x0e,0x1b,0x40,0xb4,0x47,0x6f,0x6a,0xa6,0xcd,0xa2,0xf2,0x80,0xc3,0x24,0x7e,0x7b,0x78,0x18,0x38,0x23,0x5f,0x5b,0x83,0xe7,0xd5,0x00,0x2c,0x13,0x68,0x25,0xbd,0x4d,0xf8,0x14,0xb7,0x45,0xb6,0xb4,0x8f,0xf7,0x5e,0x28, +0x29,0xe9,0x1e,0x6a,0xf7,0xe3,0xc1,0x39,0x8f,0x57,0xff,0x41,0xec,0xf3,0xf8,0x1c,0x4a,0xfb,0x0f,0x92,0xf8,0xed,0xe1,0x7e,0xe0,0x9c,0x7c,0xec,0x08,0x6c,0x9b,0x01,0x58,0x26,0x90,0x24,0xbd,0x99,0xc1,0x3d,0x6e,0x8a,0x6e,0x7b,0x5f,0xb6,0x71,0x1b,0xd1,0x0a,0xfb,0xdb,0x5d,0x79,0xc0,0x61,0x0c,0x7b,0xe4,0x0d,0x5b,0xd7,0x22,0xf4, +0xb9,0xf8,0xef,0x01,0xce,0xcf,0xe5,0x16,0x60,0x8e,0x19,0x80,0x65,0x02,0x29,0xe0,0x02,0xe0,0x0e,0x37,0x44,0x37,0x10,0x82,0x70,0xb9,0x47,0x0d,0xc0,0x66,0xe3,0xea,0x79,0xe2,0x4f,0xd3,0x2b,0xf2,0x74,0x2c,0x93,0xf8,0xed,0xe1,0x0e,0xe0,0x02,0x4b,0x33,0x79,0xc7,0xb6,0x3a,0xd8,0x3a,0xa1,0x8b,0xe2,0x31,0x9a,0x81,0x71,0x4e,0x46, +0x38,0xd2,0x39,0xe8,0xd9,0x17,0xc9,0x22,0x76,0x55,0x00,0x81,0x00,0xd5,0xbf,0xba,0x8e,0xea,0x8b,0xae,0xb5,0xf5,0xfc,0x7c,0x2e,0xfe,0xc9,0x86,0xc9,0xa5,0x76,0x1e,0xd0,0xf6,0xcb,0xa0,0x61,0x72,0x09,0x0e,0x2f,0x21,0x1e,0x2e,0xf3,0xee,0x9b,0x70,0xe1,0x4e,0xf9,0x6f,0x7b,0x30,0x1c,0x61,0xc0,0xa4,0x29,0x12,0xbf,0xbd,0xdc,0x68, +0xb7,0xf8,0x1d,0x31,0x00,0xcb,0x04,0x2e,0x07,0x6e,0x70,0x2a,0xd2,0xb9,0x7e,0xb1,0xc6,0xd6,0xb6,0x6f,0xc8,0x6f,0xdb,0x8b,0xca,0x3a,0x33,0xf8,0x6f,0x2f,0xd0,0xe3,0xb8,0xb3,0x25,0x7e,0xfb,0x98,0x68,0x98,0x5c,0xe1,0xc4,0x81,0x1d,0xbb,0x14,0x1a,0x26,0x57,0x01,0xd7,0x3b,0x71,0xec,0xa6,0xf5,0x49,0xf0,0x68,0x9e,0x35,0xd5,0xe5, +0xcf,0x00,0x8a,0x7b,0xf6,0x61,0xd8,0x23,0x6f,0xd8,0xbe,0xd0,0xa8,0xcf,0xc5,0xff,0x07,0xc3,0xe4,0x77,0x4e,0x1d,0xdc,0xd1,0x5a,0xd8,0x30,0xf9,0x3d,0x70,0x8d,0xdd,0xc7,0x4d,0xb5,0x5a,0x26,0xe0,0x41,0x12,0x79,0x32,0x80,0xd2,0x3d,0x87,0x30,0xec,0xf1,0x39,0x74,0xec,0xb7,0x97,0xc4,0x6f,0x1f,0x57,0x1b,0x26,0xd7,0x39,0xd9,0x00, +0xc7,0x07,0xc3,0x86,0xc9,0x78,0xe0,0x16,0xdb,0x85,0xb4,0xce,0x9b,0x06,0x90,0x8f,0x0a,0xa0,0xcb,0x81,0x47,0x30,0x6c,0xda,0x2c,0xa2,0xdd,0x7a,0x49,0xfc,0xf6,0x31,0xd9,0x30,0x99,0xe0,0x74,0x23,0xdc,0x32,0x1b,0xf6,0xb9,0xdd,0x07,0xdc,0xf4,0x85,0xf7,0xd6,0x97,0xdf,0xb2,0xba,0x95,0xd6,0x44,0x6e,0xc5,0xd2,0xeb,0xe4,0xb1,0x0c, +0xba,0xeb,0x39,0xdb,0x37,0xde,0xf0,0xb9,0xf8,0x1d,0xc9,0x79,0x37,0x1b,0x40,0xb9,0xdd,0x07,0x5c,0x33,0x37,0xe1,0xb9,0x8c,0x59,0x33,0x37,0x87,0xef,0x82,0x04,0x02,0xec,0x76,0xc9,0x78,0xf6,0x18,0x7f,0x8f,0x6d,0x2b,0xf8,0x48,0xfc,0xce,0xe6,0xfc,0xd6,0x70,0xcb,0xf3,0xb0,0xb6,0x6f,0x72,0xb7,0xf6,0xdd,0x26,0x92,0x2d,0x29,0x82, +0x45,0xde,0x79,0x20,0xa0,0xf6,0xad,0xdc,0x98,0x56,0x30,0x1c,0x61,0x8f,0x89,0xf7,0xd2,0xe3,0x98,0x33,0x6d,0x3f,0x07,0x89,0xdf,0xb9,0x9c,0x77,0x73,0x05,0x60,0x7b,0x30,0x5a,0x37,0xa7,0xa8,0x5b,0xd0,0xec,0x99,0x6c,0x69,0x69,0x48,0x51,0xbf,0x38,0xfb,0x0a,0xa0,0xa8,0x53,0x39,0x83,0xef,0x9d,0x21,0xf1,0xcb,0x00,0xfc,0x6d,0x00, +0x00,0xab,0xff,0xe5,0x9d,0xcd,0x35,0x6b,0xdf,0x4a,0x90,0xca,0xf2,0xb5,0x90,0xe2,0x5e,0xbb,0x30,0xec,0x91,0xd9,0x54,0x8c,0x38,0x44,0xe2,0x97,0x01,0xf8,0x7b,0x0e,0x00,0x60,0xd5,0xcc,0x04,0x9b,0x57,0xb6,0xba,0x3e,0x53,0x52,0xad,0xf0,0xc9,0xdf,0x37,0x65,0xf5,0x3b,0xca,0x06,0xd6,0xb0,0xcf,0x13,0x73,0xe8,0xb8,0xfb,0x00,0x89, +0x5f,0x73,0x00,0xaa,0x00,0x00,0x92,0x2d,0x29,0x3e,0x9a,0xea,0xfe,0x1d,0x75,0x96,0xcf,0xd8,0xcc,0xe6,0x55,0x3b,0x6e,0x54,0x5d,0x7e,0x74,0x14,0x35,0x53,0x67,0x12,0xa9,0xea,0x21,0xf1,0xab,0x02,0x90,0x01,0x7c,0x7b,0x18,0x90,0x60,0xc3,0x52,0xf7,0xce,0x05,0xb4,0x6e,0x4e,0xb1,0x2c,0x8b,0xab,0x7f,0xaf,0x9f,0xfc,0x8c,0x41,0x77, +0x3e,0x43,0xa8,0xa4,0xa3,0xc4,0x2f,0x03,0xd0,0x10,0xe0,0xfb,0xf5,0x35,0x2c,0x9d,0xd2,0xe0,0xda,0x1c,0x5d,0xf6,0xc4,0xa6,0x1d,0x7a,0xfe,0x3f,0x10,0x0c,0xd2,0xf7,0xd7,0x13,0xd9,0xe3,0xfa,0xbb,0x6c,0xbf,0xcd,0x27,0xf1,0xcb,0x00,0xda,0x4d,0x3c,0x46,0x09,0xe0,0xe8,0x5a,0x57,0xf5,0x8b,0x9b,0x59,0x3a,0xc5,0x7d,0x43,0x81,0xd5, +0xff,0x4a,0xf0,0xf9,0x33,0x99,0x2f,0xff,0x1e,0x8c,0x44,0x19,0x70,0xe3,0xc3,0xec,0x72,0xc1,0x95,0x8e,0xb4,0x5b,0xe2,0x6f,0x17,0xd1,0x78,0x8c,0x62,0x55,0x00,0x2e,0x71,0xc2,0xcf,0xa7,0x37,0xf2,0xe5,0x2b,0xee,0xb9,0x2b,0xb0,0x71,0x59,0x0b,0x8b,0x6f,0xdb,0x90,0xb1,0x86,0xc2,0x9d,0x2b,0x19,0x72,0xdf,0x4b,0x74,0x3f,0xfa,0x34, +0x89,0x5f,0x55,0x80,0x0c,0x20,0x93,0xa1,0xc0,0x87,0x77,0x6f,0xa4,0x7e,0xb1,0xf3,0xf3,0x01,0x4d,0xf5,0x49,0x16,0x4e,0x5a,0x9f,0xf1,0x63,0xbf,0x25,0xbd,0xab,0x19,0xf6,0xe8,0x6c,0xca,0xf7,0x3d,0x48,0xe2,0x97,0x01,0x78,0x6a,0x0e,0xc0,0x15,0x24,0x9b,0x53,0x2c,0x98,0x58,0xcf,0xda,0x79,0x4d,0x8e,0xb5,0xa1,0xf1,0xcb,0x56,0xe6, +0x5d,0x5b,0xc7,0x96,0x35,0x99,0xcd,0xfa,0x97,0xed,0xb5,0x0f,0xc3,0x1e,0x9f,0x43,0x87,0xdd,0xf6,0x90,0xf8,0x85,0xa7,0x0c,0xa0,0xce,0x4d,0x01,0x69,0x69,0x4c,0xb1,0xe0,0x86,0x7a,0x3e,0x7b,0xa6,0xd1,0xf6,0x63,0xaf,0x9b,0xdf,0xc4,0xdb,0xff,0xb3,0x8e,0xc6,0xe5,0x99,0x89,0xbf,0x6a,0xd4,0x18,0x6a,0x1e,0x7e,0x9d,0x48,0x97,0x6e, +0x12,0xbf,0xb7,0xa8,0x93,0x01,0xb8,0xcc,0x00,0x00,0x52,0x49,0x58,0xfa,0x40,0x03,0x8b,0xff,0xba,0x81,0x64,0xb3,0x3d,0x49,0xfd,0xf9,0xf4,0x46,0xe6,0x4f,0xa8,0xa7,0xa5,0x21,0xb3,0xe3,0xed,0x74,0xfa,0x2f,0xd8,0xfb,0xf6,0xa7,0x08,0x95,0x38,0xb3,0x77,0xe0,0xca,0xa7,0x1e,0x94,0xf8,0x3d,0x9c,0xfb,0xae,0x78,0x13,0x26,0x1e,0x63, +0x0b,0x0e,0xdf,0x09,0xd8,0x16,0xc5,0x55,0x21,0xaa,0x4f,0xed,0x48,0xcf,0x83,0x8b,0xf3,0x12,0xad,0xfa,0x45,0xcd,0x2c,0x7d,0xa8,0x81,0x0d,0x4b,0x32,0x9b,0x7b,0x08,0x04,0x83,0xf4,0xbd,0x6c,0x12,0x3b,0x8f,0xbd,0xdc,0xd9,0xf9,0x8a,0x35,0x2b,0x99,0x77,0xd6,0x21,0x34,0x7e,0xfc,0x81,0xe4,0x9c,0x19,0x09,0xc3,0x74,0xfe,0x2e,0x80, +0x5b,0x0c,0x60,0x25,0xd0,0xdd,0xcd,0xbd,0x55,0xba,0x4b,0x11,0x7d,0xcf,0x2c,0xa5,0x4b,0x4d,0x6e,0xf6,0x13,0xdc,0xf4,0x59,0x0b,0x4b,0x1f,0x6a,0x60,0xed,0xbb,0x4d,0x19,0x2f,0x4f,0x16,0x8c,0x16,0x33,0xe0,0x4f,0x0f,0xd0,0xed,0xc8,0x53,0x5c,0x11,0x1b,0x99,0xc0,0x8e,0x15,0x4f,0x86,0x49,0x4f,0x19,0x40,0xda,0x00,0x16,0x03,0x7b, +0x78,0xa1,0xd7,0x3a,0xf4,0x0a,0x51,0xb5,0x6f,0x94,0xae,0xc3,0xa3,0xe9,0xcd,0x3a,0x33,0x88,0x60,0xe3,0xf2,0x56,0x6a,0xdf,0x4a,0x50,0xfb,0x56,0x82,0x8d,0x4b,0x9a,0x77,0xa8,0x6a,0x2e,0x2a,0xeb,0xcc,0xa0,0x3b,0x9f,0x71,0x6c,0xa6,0x5f,0x26,0x90,0x33,0x16,0x1b,0x26,0x03,0x64,0x00,0x69,0x03,0x78,0x13,0xd8,0xcf,0x6b,0x3d,0x18, +0x29,0x0f,0x52,0x39,0x28,0x42,0xb4,0x2a,0x48,0xb4,0x32,0x44,0xb4,0x22,0x48,0xa4,0x22,0x48,0x30,0x1c,0x20,0xb1,0xae,0x95,0xa6,0xba,0x24,0x89,0x75,0x49,0x12,0x75,0x49,0xea,0x17,0x35,0xd1,0xb8,0x22,0xbb,0x17,0x8f,0xc2,0x15,0x55,0x0c,0xb9,0xf7,0x45,0xca,0x06,0xd6,0xb8,0x32,0x1e,0x32,0x81,0x8c,0x78,0xd3,0x30,0x39,0xc0,0xe9, +0x46,0xb8,0x65,0x41,0x90,0x7a,0x2f,0xf6,0x60,0x53,0x7d,0x92,0x95,0x33,0xed,0x79,0x78,0x28,0xda,0xad,0x17,0x43,0xee,0x7f,0xd9,0x91,0xb7,0xf9,0xda,0x6d,0x88,0x55,0x3d,0xa8,0x79,0xe8,0x55,0x99,0x80,0x87,0x72,0xde,0x2d,0xcf,0x01,0xd4,0x29,0x1f,0xb6,0x4d,0x49,0xef,0x6a,0x6a,0xa6,0xcd,0x72,0xb5,0xf8,0xbf,0x6b,0x02,0x4e,0x3d, +0x8f,0xe0,0x21,0xea,0x64,0x00,0x32,0x80,0x1f,0x18,0xa0,0x05,0xe8,0x7e,0xd4,0x4f,0xd8,0xe7,0xc9,0xb9,0x94,0xf4,0xd9,0xcd,0x3b,0x43,0x23,0x99,0x80,0x0c,0x40,0x06,0x90,0x1d,0xe1,0xca,0xae,0xec,0x75,0xcb,0xe3,0x0c,0xfc,0xcb,0xa3,0x84,0xcb,0xbb,0x78,0xae,0xfd,0x32,0x01,0x19,0x40,0xc1,0xcf,0x01,0xe4,0x8b,0xae,0xa3,0x4f,0x64, +0xe4,0xf4,0x45,0x74,0x1b,0x7d,0x92,0xa7,0xcf,0x43,0x26,0xa0,0x39,0x80,0xf6,0xd2,0xc7,0xf7,0xd5,0x7e,0x30,0x48,0xd5,0xa8,0x63,0xa8,0x99,0x36,0x8b,0xbd,0x6f,0xfd,0x3b,0xe1,0xca,0xae,0x05,0x71,0x5e,0x32,0x01,0x77,0xe7,0xbc,0xe3,0xb7,0x01,0xe3,0x31,0xae,0xc1,0xa1,0x3d,0x02,0x5d,0xe1,0xc0,0xd1,0x62,0x7a,0x1c,0x77,0x36,0x3b, +0x9f,0x77,0x19,0x1d,0x76,0x8d,0x15,0xec,0x79,0xea,0x16,0xe1,0x56,0xb9,0xc6,0xda,0x19,0xcb,0x9f,0x06,0x10,0x8f,0x71,0x3d,0x0e,0xec,0x0d,0xe8,0xf8,0xf8,0xbe,0xa2,0x8a,0x8a,0x11,0x87,0x50,0xb9,0xff,0xa1,0x54,0x1d,0x7a,0x9c,0x63,0x2f,0xf1,0xc8,0x04,0x5c,0xc1,0xf5,0xd6,0x1e,0x99,0xfe,0x32,0x80,0x78,0x8c,0x89,0xc0,0x95,0x9e, +0xee,0xba,0x40,0xa0,0xdd,0x2f,0xc1,0x04,0x42,0x21,0xca,0x06,0xd4,0x50,0xb1,0xff,0xa1,0x94,0xed,0x39,0x24,0xfd,0xd9,0xaf,0x7e,0xc7,0xf7,0x3a,0x25,0xb0,0xf5,0x63,0x6d,0xe5,0xdf,0x02,0xa1,0x10,0x81,0x70,0x84,0x60,0x51,0x38,0xfd,0x3d,0x1c,0xb1,0xbe,0x7f,0xe7,0xef,0xdf,0xf9,0x7f,0x27,0x96,0x09,0x93,0x09,0x6c,0x93,0x89,0x4e, +0xed,0x10,0x1c,0x70,0x48,0xfc,0x37,0x01,0x97,0xa9,0xdf,0x9d,0x9d,0x73,0x08,0xb4,0x31,0x85,0x8a,0x91,0xa3,0x18,0xf8,0xe7,0x69,0x04,0x42,0x45,0x32,0x01,0x67,0xb8,0xc9,0x30,0xb9,0xbc,0xe0,0x0d,0x20,0x1e,0xe3,0x16,0xe0,0x62,0xf5,0xb7,0xfb,0xa8,0x32,0x8e,0x65,0xef,0xdb,0xfe,0x2e,0x13,0x70,0x8e,0x5b,0x0c,0x93,0x4b,0x0a,0xd2, +0x00,0xe2,0x31,0x02,0xc0,0xed,0xc0,0xcf,0xd5,0xcf,0x32,0x01,0x99,0xc0,0x36,0xb9,0x03,0xf8,0xa5,0x61,0x92,0x2a,0x18,0x03,0x88,0xc7,0x08,0x02,0x77,0x01,0x63,0xd5,0xbf,0x32,0x01,0x99,0xc0,0x0f,0x72,0x0f,0x70,0x81,0x1d,0x26,0x10,0xb0,0x49,0xfc,0xf7,0x01,0xe7,0xa8,0x5f,0x65,0x02,0x32,0x81,0x76,0x33,0x05,0x38,0xdf,0x30,0x49, +0x7a,0xd6,0x00,0xe2,0x31,0x42,0xc0,0x03,0xc0,0x19,0xea,0x4f,0x99,0x80,0x4c,0x20,0x63,0xa6,0x02,0xe7,0x18,0x26,0xad,0x9e,0x33,0x80,0x78,0x8c,0x22,0xeb,0x04,0x4e,0x51,0x3f,0xca,0x04,0x64,0x02,0x3b,0xcc,0x63,0xc0,0x99,0x86,0x49,0x8b,0x67,0x0c,0x20,0x1e,0x23,0x0c,0x3c,0x0a,0x9c,0xa0,0xfe,0x93,0x09,0xc8,0x04,0xb2,0xe6,0x49, +0xe0,0x34,0xc3,0xa4,0xd9,0xf5,0x06,0x10,0x8f,0x11,0x01,0x9e,0x00,0x8e,0x51,0xbf,0xc9,0x04,0x64,0x02,0x39,0xe3,0x69,0xe0,0x14,0xc3,0xa4,0xc9,0xb5,0x06,0x10,0x8f,0x11,0x05,0xfe,0x01,0x1c,0xa5,0xfe,0x92,0x09,0xc8,0x04,0x72,0xce,0x74,0xe0,0x44,0xc3,0x24,0xe1,0x3a,0x03,0xb0,0x36,0xf9,0x7c,0x0a,0x38,0x5c,0xfd,0x24,0x13,0x90, +0x09,0xe4,0x8d,0x97,0x80,0xe3,0x0c,0x93,0xcd,0xae,0x31,0x80,0x78,0x8c,0x0e,0xc0,0xb3,0xc0,0x28,0xf5,0x8f,0x4c,0x40,0x26,0x90,0x77,0x5e,0x01,0xc6,0x18,0x26,0x8d,0x8e,0x1b,0x40,0x3c,0x46,0xa9,0x55,0x9a,0x1c,0xa4,0x7e,0x91,0x09,0xc8,0x04,0x6c,0x63,0x26,0xf0,0x63,0xc3,0xa4,0xc1,0x31,0x03,0x88,0xc7,0xe8,0x04,0xbc,0x00,0xec, +0xaf,0xfe,0x90,0x09,0xc8,0x04,0x6c,0x67,0x36,0x70,0xa4,0x61,0xb2,0xd1,0x76,0x03,0x88,0xc7,0xe8,0x0c,0xbc,0x08,0x8c,0x50,0x3f,0xc8,0x04,0x64,0x02,0x8e,0xf1,0x6f,0x60,0xb4,0x61,0xb2,0x7e,0x47,0x3e,0x9c,0xcd,0x92,0x60,0x7d,0x25,0x7e,0xb1,0x26,0xfe,0x34,0x0b,0x7f,0x75,0x12,0xa9,0xd6,0x96,0xbc,0x1f,0x4b,0xcb,0x8b,0x6d,0x95, +0x11,0x96,0x16,0x1d,0x19,0x02,0x98,0x40,0x3f,0xf5,0x81,0x50,0x25,0xe0,0x18,0xa6,0x61,0xd2,0x7f,0x47,0x3f,0x9c,0xed,0xa2,0xa0,0x8f,0x29,0xfe,0x42,0x95,0x80,0xa3,0x64,0xa5,0xc1,0x6c,0x0d,0xe0,0x11,0xc5,0x5f,0xc8,0x04,0x1c,0xe5,0x11,0xc7,0x0c,0xc0,0x30,0xf9,0x0f,0xf0,0xbe,0x52,0x5f,0x38,0x65,0x02,0x3d,0x8f,0xf7,0xf5,0x5b, +0xe6,0x0b,0x0d,0x93,0xc5,0x4e,0x56,0x00,0x90,0x7e,0xe9,0x47,0x08,0x47,0x4c,0x20,0xd9,0xdc,0xe4,0xe7,0x50,0x67,0xad,0x3d,0x19,0x80,0xf0,0xb4,0x09,0xa4,0x64,0x00,0xce,0x1a,0x80,0x61,0xf2,0x11,0xf0,0xb6,0x52,0x5e,0x38,0x61,0x02,0x3e,0xae,0x00,0xe6,0x1a,0x26,0x1f,0xbb,0xa1,0x02,0x50,0x15,0x20,0x1c,0x33,0x81,0x54,0x73,0xb3, +0x5f,0x43,0x9b,0x13,0xcd,0xe5,0xca,0x00,0x1e,0x03,0x7b,0x56,0x31,0x15,0x32,0x01,0x55,0x00,0xa4,0xc8,0xd1,0x2d,0xf8,0x9c,0x18,0x80,0x61,0xf2,0x05,0xe9,0xe7,0x92,0x85,0xb0,0xd5,0x04,0x7c,0x3a,0x07,0xf0,0x86,0x61,0xb2,0xdc,0x4d,0x15,0x80,0x86,0x01,0xc2,0x11,0x13,0xf0,0x69,0x05,0x90,0x33,0xad,0xe5,0xd2,0x00,0x9e,0x80,0xfc, +0xad,0x5e,0x2a,0x64,0x02,0x5b,0xad,0x00,0x5a,0x7c,0x37,0x07,0xd0,0x6a,0x69,0xcd,0x5d,0x06,0x60,0x98,0xac,0x06,0x5e,0x55,0x8a,0x0b,0x3b,0x4d,0xc0,0x87,0x15,0xc0,0x2b,0x86,0x49,0xad,0x1b,0x2b,0x00,0x80,0x7b,0x95,0xde,0xc2,0x4e,0x13,0xf0,0xe1,0x1c,0xc0,0x7d,0xb9,0xfc,0x65,0xb9,0x36,0x80,0xc7,0x81,0x0f,0x95,0xde,0xc2,0x2e, +0x13,0x48,0x36,0xf9,0xca,0x00,0x3e,0xb4,0x34,0xe6,0x4e,0x03,0xb0,0xb6,0x31,0x9a,0xa0,0xd4,0x16,0x76,0x99,0x80,0xcf,0xe6,0x00,0xc6,0xe7,0x7a,0xab,0xb0,0x60,0x1e,0x1a,0x39,0x0d,0x58,0xa2,0xd4,0x16,0x76,0x98,0x80,0x8f,0x86,0x00,0x4b,0xc8,0xc3,0xdb,0xb7,0x39,0x37,0x00,0x6b,0x1f,0x33,0x55,0x01,0xc2,0x16,0x13,0xf0,0xd1,0x24, +0xe0,0xf8,0x7c,0xec,0x11,0x18,0xcc,0x53,0x63,0xa7,0x02,0x1f,0x29,0xad,0x45,0xbe,0x4d,0xc0,0x27,0x06,0xf0,0x91,0xa5,0x29,0x3c,0x61,0x00,0xd6,0x46,0x86,0x13,0x95,0xd2,0x22,0xdf,0x26,0xe0,0x93,0x21,0xc0,0x84,0x7c,0xed,0x10,0x1c,0xcc,0x63,0xa3,0x1f,0x04,0x96,0x29,0xa5,0x45,0x3e,0x4d,0xc0,0x07,0x2f,0x03,0x7d,0x0c,0x3c,0x94, +0xaf,0x5f,0x9e,0x37,0x03,0x50,0x15,0x20,0xec,0x30,0x01,0x1f,0x0c,0x01,0x26,0xe6,0x6b,0x6b,0xf0,0x7c,0x57,0x00,0x00,0x0f,0x00,0x9f,0x2a,0x9d,0x45,0xbe,0x4c,0xa0,0xc0,0x0d,0xe0,0x13,0xab,0x92,0xc6,0x93,0x06,0x60,0xed,0x67,0x7e,0x83,0x52,0x59,0xe4,0xcb,0x04,0x0a,0x7c,0x0e,0xe0,0x06,0x4b,0x43,0xde,0x34,0x00,0x8b,0xfb,0x81, +0xcf,0x95,0xca,0x22,0x1f,0x26,0x50,0xc0,0x0f,0x02,0x7d,0x66,0x69,0x07,0x4f,0x1b,0x80,0x61,0xd2,0x04,0x4c,0x52,0x1a,0x8b,0x7c,0x98,0x40,0x01,0x0f,0x01,0x26,0xe5,0xfb,0xea,0x6f,0x57,0x05,0x00,0xe9,0x97,0x84,0x54,0x05,0x88,0x9c,0x9b,0x40,0x81,0x56,0x00,0x9f,0x63,0xd3,0x8b,0x75,0xb6,0x18,0x80,0x61,0x92,0x00,0x7e,0xa1,0x14, +0x16,0xb9,0x34,0x81,0x54,0x6b,0x2b,0xa9,0xd6,0x82,0x5c,0x82,0xe2,0xe7,0x56,0xe5,0x5c,0x18,0x06,0x60,0x99,0xc0,0x73,0xe4,0xf1,0x7e,0xa6,0xf0,0x9f,0x09,0xb4,0x6e,0xde,0x54,0x88,0xa7,0xf7,0xa0,0x61,0x32,0xdd,0xae,0x83,0x05,0xec,0x3c,0xb3,0x78,0x8c,0x0a,0x60,0x11,0xd0,0x53,0x69,0x2c,0xb2,0xa5,0xf2,0x80,0xc3,0x58,0x37,0xfb, +0xe5,0x42,0x3a,0xa5,0x15,0xc0,0x40,0xc3,0xa4,0xbe,0x20,0x0d,0xc0,0x32,0x81,0xa3,0x81,0x67,0x95,0xbe,0x42,0x7c,0x8f,0x31,0x56,0xa5,0x6c,0x1b,0x41,0xbb,0xcf,0x50,0x43,0x01,0x21,0xb6,0x59,0xfa,0x3f,0x67,0xf7,0x41,0x83,0x0e,0x9d,0xec,0x38,0xe0,0x4b,0xf5,0xb9,0x10,0x5f,0x97,0xfe,0xe3,0x9c,0x38,0xb0,0x23,0x06,0x60,0x98,0xd4, +0x01,0x3f,0x53,0xbf,0x0b,0x01,0xc0,0x05,0x76,0x8e,0xfb,0xdd,0x50,0x01,0x68,0x28,0x20,0x84,0x83,0xa5,0xbf,0xe3,0x06,0xa0,0xa1,0x80,0x10,0xce,0x95,0xfe,0xae,0x30,0x00,0x6b,0x28,0x70,0x81,0xf2,0x40,0xa8,0xf4,0xf7,0x67,0x05,0x80,0x61,0xf2,0x2c,0xf0,0xb0,0x72,0x41,0xf8,0x8c,0x87,0x9c,0x2c,0xfd,0x5d,0x63,0x00,0x16,0x17,0x6b, +0x28,0x20,0x7c,0xc4,0x97,0x4e,0x97,0xfe,0xae,0x32,0x00,0x6b,0x28,0x70,0x36,0xe4,0x6f,0xe5,0x13,0x21,0x5c,0x42,0x0b,0x70,0xb6,0x95,0xf3,0x32,0x80,0x36,0x26,0xf0,0x4f,0xe0,0xe7,0xca,0x0f,0x51,0xe0,0x5c,0x68,0xe5,0x3a,0x32,0x80,0xef,0x9b,0xc0,0xdf,0xd0,0x3a,0x82,0xa2,0x70,0x99,0x60,0x98,0xee,0xda,0x3f,0x33,0xe8,0xc2,0x20, +0x5d,0x4d,0x7a,0x77,0x21,0x21,0x0a,0x89,0xa9,0x86,0xc9,0xd5,0x6e,0x6b,0x94,0xeb,0x0c,0xc0,0x30,0x49,0x01,0xe7,0x01,0x33,0x1d,0x6a,0xc2,0x7a,0xe0,0x1f,0xc0,0x7b,0xca,0xd9,0x82,0xe1,0x3d,0xab,0x4f,0xd7,0x3b,0x74,0xfc,0xd7,0xad,0x9c,0x46,0x06,0xd0,0x3e,0x13,0x48,0x00,0xc7,0x01,0x1f,0xd8,0x70,0xb8,0x14,0xf0,0x36,0xe9,0xed, +0xcc,0x0e,0x04,0xaa,0x0c,0x93,0x13,0x81,0xe1,0xc0,0x75,0x40,0xb3,0xf4,0xe3,0x59,0x9a,0x81,0xdf,0x03,0xfb,0x5a,0x7d,0x5a,0x65,0xf5,0xf1,0x04,0xab,0xcf,0x53,0x36,0xb4,0xe1,0x03,0xe0,0x78,0xbb,0x16,0xf8,0xc8,0x94,0x80,0x9b,0x7b,0x2f,0x1e,0xa3,0x1a,0x98,0x03,0x74,0xcb,0xf1,0xaf,0x5e,0x05,0xbc,0x68,0x7d,0xbd,0x64,0x98,0xac, +0xd9,0x4e,0x1b,0x86,0x00,0x53,0x80,0xc1,0xd2,0x93,0xe7,0xae,0xfa,0xe7,0x1a,0x26,0xf3,0xb7,0xd3,0xb7,0x5d,0x81,0xc3,0x80,0x23,0x80,0xc3,0x81,0xee,0x79,0xc8,0xb3,0x91,0x86,0xc9,0x27,0x6e,0x0d,0x52,0xc0,0xed,0xbd,0x18,0x8f,0x31,0x1c,0x78,0x15,0xe8,0x90,0xe5,0x95,0x60,0xb6,0x25,0xf8,0x19,0xc0,0x7c,0x6b,0xa8,0xd1,0xde,0x36, +0x84,0x81,0xdf,0x01,0x57,0x01,0x61,0x69,0xcb,0xf5,0x57,0xfd,0x09,0xa4,0x37,0xd4,0x68,0xce,0xa0,0x8f,0x03,0xc0,0x10,0x60,0xb4,0x65,0x08,0xfb,0x67,0xd9,0xd7,0x8d,0xc0,0xc1,0x86,0xc9,0x5c,0x37,0x07,0x2b,0xe0,0x85,0x1e,0x8d,0xc7,0x38,0xd6,0x1a,0xc3,0x65,0x32,0x64,0xf9,0xb8,0x8d,0xe0,0x5f,0x35,0x4c,0x36,0xe6,0xa0,0x1d,0x43, +0x48,0x6f,0x76,0x32,0x48,0x3a,0x73,0x25,0xf3,0xad,0xab,0xfe,0x7b,0x39,0xe8,0xeb,0x32,0x60,0x94,0x65,0x08,0xa3,0x81,0xdd,0x32,0xf8,0x78,0xd2,0x2a,0xfb,0x9f,0x71,0x7b,0xc0,0x02,0x5e,0xe9,0xd9,0x78,0x8c,0x71,0xc0,0xe4,0xed,0xfc,0xc8,0x26,0xe0,0x35,0x4b,0xf0,0x2f,0x1a,0x26,0x4b,0xf2,0xd4,0x8e,0x30,0xe9,0x3b,0x15,0x57,0x01, +0x45,0xd2,0x9c,0x2b,0xf8,0x6a,0x1b,0xba,0xf1,0xf9,0x5a,0x4a,0x3b,0x1e,0xa3,0x5f,0x9b,0xea,0xe0,0x60,0xa0,0xe3,0x76,0x7e,0xfc,0x62,0xc3,0xe4,0x36,0x2f,0x04,0x2e,0xe0,0xa5,0x5e,0x8e,0xc7,0x98,0xcc,0xb7,0x1f,0xa1,0x5c,0xf8,0x95,0xe0,0x81,0x59,0x76,0x4e,0xb4,0xc4,0x63,0xd4,0x58,0x73,0x03,0x7b,0x4b,0x7f,0x8e,0xb2,0xc0,0xba, +0xea,0xbf,0x6b,0x63,0xdf,0x47,0x48,0x4f,0x26,0x7e,0x65,0x08,0x6d,0x73,0x60,0xb2,0x61,0x72,0xa9,0x57,0x82,0xe7,0x35,0x03,0x08,0x92,0x9e,0x99,0x5f,0x66,0x5d,0xe5,0x57,0x38,0xdc,0x9e,0x08,0x70,0x39,0x70,0x19,0x50,0x21,0x2d,0xda,0x4a,0x1d,0x70,0x13,0x70,0xa3,0x1d,0x1b,0x68,0xfc,0x40,0x1e,0xf4,0xb2,0xcc,0xa0,0x1a,0xb8,0xce, +0x30,0x49,0xca,0x00,0x7c,0x44,0x3c,0x46,0x27,0xe0,0x57,0xc0,0xa5,0x40,0x17,0x45,0x24,0xaf,0xac,0x05,0xfe,0x02,0xdc,0x66,0x98,0x6c,0x50,0x38,0x64,0x00,0x6e,0x32,0x82,0x52,0xe0,0x22,0xab,0x22,0xe8,0xaa,0x88,0xe4,0x94,0x5a,0xe0,0x66,0xe0,0x76,0xc3,0xa4,0x41,0xe1,0x90,0x01,0xb8,0xd9,0x08,0x3a,0x92,0x7e,0xb1,0xe9,0x37,0xe4, +0xfe,0xde,0xb2,0xdf,0x58,0x05,0xdc,0x08,0xdc,0x69,0x98,0x34,0x2a,0x1c,0x32,0x00,0x2f,0x19,0x41,0x09,0xe9,0x15,0x8f,0xae,0x40,0x9b,0xa1,0x64,0xca,0x97,0xc0,0xff,0x02,0x77,0x19,0x26,0x9b,0x15,0x0e,0x19,0x80,0x97,0x8d,0xa0,0x18,0xf8,0x6f,0xe0,0xb7,0xc0,0x4e,0x8a,0xc8,0x76,0x59,0x4e,0x7a,0x37,0xe9,0xbf,0x19,0x26,0x5b,0x14, +0x0e,0x19,0x40,0x21,0x19,0xc1,0x8f,0xc1,0xf9,0x65,0xa0,0x5c,0xce,0x8f,0x0d,0x93,0xe7,0x15,0x06,0x7b,0x08,0x2a,0x04,0xb6,0x32,0x13,0xad,0x7a,0xb4,0x3d,0x5a,0x80,0x59,0x0a,0x83,0x0c,0xa0,0x20,0xb1,0x1e,0x47,0x7e,0x47,0x91,0xd8,0x26,0x6f,0xe7,0xe2,0x91,0x6d,0x21,0x03,0x70,0x33,0xaf,0x28,0x04,0x8a,0x8d,0x0c,0x40,0x49,0x2e, +0x14,0x1b,0x19,0x80,0x0f,0x99,0x0d,0xee,0x5c,0x1c,0xc2,0x61,0x12,0xc0,0x9b,0x0a,0x83,0x0c,0xa0,0xd0,0xe7,0x01,0x36,0x93,0x5e,0xe4,0x44,0x7c,0x9b,0x39,0xba,0xdf,0x2f,0x03,0x50,0xa9,0xab,0x98,0x08,0x19,0x80,0x92,0x5d,0x31,0x11,0x32,0x80,0xc2,0xe5,0xdf,0xa0,0xe7,0xda,0xdb,0xd0,0x68,0xc5,0x44,0xc8,0x00,0x7c,0x31,0x0f,0xd0, +0x44,0x7a,0x32,0x50,0xa4,0x79,0xc3,0xe9,0x77,0xfa,0x65,0x00,0x42,0x25,0xaf,0x62,0x21,0x03,0x10,0x4a,0x7a,0xc5,0x42,0x06,0x20,0xf2,0xcf,0x3b,0xa0,0x15,0x6d,0x48,0xef,0xd6,0x33,0x4f,0x61,0x90,0x01,0xf8,0x6d,0x1e,0xa0,0x15,0xe7,0xb6,0x3f,0x73,0x13,0x33,0xad,0x58,0x08,0x19,0x80,0x4a,0x5f,0xc5,0x40,0xc8,0x00,0x94,0xfc,0x8a, +0x81,0x90,0x01,0xf8,0x80,0x05,0xa4,0x57,0xb9,0xf5,0x2b,0x6b,0x48,0xef,0xed,0x20,0x64,0x00,0xbe,0x9c,0x07,0x48,0x91,0xde,0xcd,0xc8,0xaf,0xbc,0x96,0xc9,0x1e,0x8d,0x42,0x06,0xa0,0x12,0x58,0xe7,0x2e,0x64,0x00,0x12,0x81,0xce,0x5d,0xe4,0x02,0x2d,0x0a,0xea,0x02,0xe2,0x31,0x56,0xe0,0xbf,0x65,0xc3,0x57,0x18,0xa6,0x56,0x48,0x56, +0x05,0x20,0x00,0x5e,0xd5,0x39,0x0b,0x19,0x80,0x4a,0x61,0x9d,0xb3,0x90,0x01,0x48,0x0c,0xfe,0x18,0xf9,0xa8,0xdb,0x65,0x00,0x02,0x30,0x4c,0x96,0x01,0x4f,0x93,0x7e,0x2e,0xbe,0xd0,0xa9,0x07,0x9e,0x36,0x4c,0x3e,0x55,0xcf,0x3b,0x8f,0x26,0x01,0xdd,0x74,0x49,0x8c,0x11,0x20,0xbd,0xc7,0x7c,0xcd,0x77,0xbe,0xbc,0xba,0xd3,0xf0,0x6a, +0xe0,0x5d,0xd2,0x2f,0xfb,0xcc,0x03,0xe6,0x19,0x26,0x1f,0xab,0xa7,0x65,0x00,0x22,0x33,0x63,0xe8,0x6d,0x19,0xc1,0xd0,0x36,0xa6,0xd0,0xdb,0x65,0xcd,0xfc,0xa2,0xad,0xd0,0x2d,0xb1,0x2f,0x57,0xef,0xc9,0x00,0x44,0x7e,0x4c,0xa1,0x6b,0x1b,0x33,0xa8,0x06,0xca,0xad,0xaf,0x8a,0x36,0xdf,0x3b,0x03,0x45,0x59,0x1e,0xaa,0xc5,0x1a,0x9a, +0xd4,0x59,0xe5,0xfb,0x57,0xdf,0xeb,0x81,0x65,0x6d,0xc4,0x5e,0xab,0x5e,0x91,0x01,0x08,0xf7,0x19,0x45,0xe9,0x77,0x4c,0xe1,0xbb,0x46,0xc1,0x56,0x84,0xfd,0xb5,0xd8,0x0d,0x93,0x06,0x45,0x51,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0x42,0x08,0x21,0x84,0x10,0xc2,0x8d,0xfc, +0x3f,0x5c,0x56,0xd9,0x0b,0xad,0xff,0xf9,0xa9,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, +}; + +read_only global String8 lnx_sh_logo_file_bytes = {lnx_sh_logo_file_bytes__data, sizeof(lnx_sh_logo_file_bytes__data)}; + +C_LINKAGE_END + +#endif // LINUX_SHELL_META_H diff --git a/src/linux/shell/linux_shell.c b/src/linux/shell/linux_shell.c new file mode 100644 index 00000000..7e7d7713 --- /dev/null +++ b/src/linux/shell/linux_shell.c @@ -0,0 +1,189 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/linux_shell.meta.c" + +//////////////////////////////// +//~ rjf: @per_os_impl Shell Operations + +internal void +sh_message(B32 error, String8 title, String8 message) +{ + B32 done = 0; + B32 text_is_long = (str8_find_needle(message, 0, s("\n"), 0) < message.size); + + //- rjf: try zenity + if(!done) + { + Temp scratch = scratch_begin(0, 0); + if(text_is_long) + { + String8 cmd = str8f(scratch.arena, "echo \"%S\" | zenity --text-info --no-markup --title=\"%S\"", escaped_from_raw_str8(scratch.arena, message), title); + FILE *f = popen((char *)cmd.str, "r"); + done = (f != 0); + pclose(f); + } + else + { + String8 cmd = str8f(scratch.arena, "zenity %s --no-markup --title=\"%S\" --text=\"%S\"", error ? "--error" : "--info", title, escaped_from_raw_str8(scratch.arena, message)); + FILE *f = popen((char *)cmd.str, "r"); + done = (f != 0); + pclose(f); + } + scratch_end(scratch); + } + + //- rjf: fall back to stderr + if(!done) + { + if(error) + { + fprintf(stderr, "[X] "); + } + fprintf(stderr, "%.*s\n", str8_varg(title)); + fprintf(stderr, "%.*s\n\n", str8_varg(message)); + } +} + +internal String8 +sh_pick_file(Arena *arena, String8 title, String8 initial_path) +{ + String8 result = {0}; + B32 done = 0; + + //- rjf: try zenity + if(!done) + { + Temp scratch = scratch_begin(&arena, 1); + String8 cmd = str8f(scratch.arena, "zenity --file-selection --filename=\"%S\" --title=\"%S\"", initial_path, title); + FILE *f = popen((char *)cmd.str, "r"); + done = (f != 0); + if(done) + { + U64 output_buffer_size = 4096; + char *output_buffer = push_array(scratch.arena, char, output_buffer_size); + char *path = fgets(output_buffer, output_buffer_size, f); + if(path != 0) + { + result = str8_copy(arena, str8_chop(str8_cstring_capped(path, output_buffer+output_buffer_size), 1)); + } + } + pclose(f); + scratch_end(scratch); + } + + return result; +} + +internal void +sh_show_in_file_browser(String8 path) +{ + B32 done = 0; + + //- rjf: try xdg-open + if(!done) + { + Temp scratch = scratch_begin(0, 0); + String8 cmd = str8f(scratch.arena, "xdg-open %S", str8_chop_last_slash(path)); + FILE *f = popen((char *)cmd.str, "r"); + pclose(f); + scratch_end(scratch); + } + + //- rjf: fallback -> tell user + if(!done) + { + Temp scratch = scratch_begin(0, 0); + sh_message(1, s("Error"), s("Could not find a way to pick a file using the locally installed system utilities.")); + scratch_end(scratch); + } +} + +internal void +sh_open_in_browser(String8 url) +{ + B32 done = 0; + + //- rjf: try xdg-open + if(!done) + { + Temp scratch = scratch_begin(0, 0); + String8 cmd = str8f(scratch.arena, "xdg-open %S", url); + FILE *f = popen((char *)cmd.str, "r"); + done = (f != 0); + pclose(f); + scratch_end(scratch); + } + + //- rjf: fallback -> tell user + if(!done) + { + Temp scratch = scratch_begin(0, 0); + sh_message(1, s("Error"), str8f(scratch.arena, "Could not find a way to open %S in a locally installed browser.", url)); + scratch_end(scratch); + } +} + +internal void +sh_install_or_uninstall_self(B32 install) +{ + Temp scratch = scratch_begin(0, 0); + + //- rjf: get xdg local application install info path + String8 application_name = str8_chop_last_dot(str8_skip_last_slash(get_process_info()->binary_file_path)); + char *xdg_data_home_cstring = getenv("XDG_DATA_HOME"); + String8 desktop_entries_folder_name = str8_cstring(xdg_data_home_cstring); + if(desktop_entries_folder_name.size == 0) + { + char *home = getenv("HOME"); + desktop_entries_folder_name = str8f(scratch.arena, "%s/.local/share", home); + } + String8 desktop_file_path = str8f(scratch.arena, "%S/applications/%S.desktop", desktop_entries_folder_name, application_name); + + //- rjf: get icon image path + B32 has_icon = 0; + String8 icon_path = {0}; +#if LNX_WM_ICON + { + has_icon = 1; + icon_path = str8f(scratch.arena, "%S/%S.png", get_process_info()->user_program_config_data_path, application_name); + } +#endif + + //- rjf: install -> write files + if(install) + { + //- rjf: write icon + write_data_to_file_path(icon_path, lnx_sh_logo_file_bytes); + + //- rjf: write .desktop file + String8 desktop_file_data = str8f(scratch.arena, + "[Desktop Entry]\n" + "Type=Application\n" + "Version=" BUILD_VERSION_STRING_LITERAL "\n" + "Name=" BUILD_TITLE "\n" + "Comment=" BUILD_TITLE_STRING_LITERAL "\n" + "Exec=%S\n" + "%s%S%s" // (optional icon) + "Terminal=%s\n" + "Categories=Utility;Development;", + get_process_info()->binary_file_path, + has_icon ? "Icon=" : "", + has_icon ? icon_path : s(""), + has_icon ? "\n" : "", + BUILD_CONSOLE_INTERFACE ? "true" : "false"); + write_data_to_file_path(desktop_file_path, desktop_file_data); + } + + //- rjf: uninstall -> delete files + else + { + delete_file_at_path(icon_path); + delete_file_at_path(desktop_file_path); + } + + scratch_end(scratch); +} diff --git a/src/linux/shell/linux_shell.h b/src/linux/shell/linux_shell.h new file mode 100644 index 00000000..69377066 --- /dev/null +++ b/src/linux/shell/linux_shell.h @@ -0,0 +1,12 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef LINUX_SHELL_H +#define LINUX_SHELL_H + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/linux_shell.meta.h" + +#endif // LINUX_SHELL_H diff --git a/src/linux/shell/linux_shell.mdesk b/src/linux/shell/linux_shell.mdesk new file mode 100644 index 00000000..f30b4be9 --- /dev/null +++ b/src/linux/shell/linux_shell.mdesk @@ -0,0 +1,4 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@embed_file lnx_sh_logo_file_bytes: "../data/logo.png" diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index 52983f50..6f37d82d 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -381,6 +381,15 @@ wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) XFlush(lnx_wm_state->display); } + //- rjf: set class + { + XClassHint *class_hints = XAllocClassHint(); + class_hints->res_name = "raddbg"; + class_hints->res_class = "RADDBG"; + XSetClassHint(lnx_wm_state->display, w->window, class_hints); + XFree(class_hints); + } + //- rjf: create xic w->xic = XCreateIC(lnx_wm_state->xim, XNInputStyle, XIMPreeditNothing|XIMStatusNothing, @@ -1097,38 +1106,3 @@ wm_set_cursor(WM_Cursor cursor) { lnx_wm_state->last_set_cursor = cursor; } - -//////////////////////////////// -//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void -wm_graphical_message(B32 error, String8 title, String8 message) -{ - if(error) - { - fprintf(stderr, "[X] "); - } - fprintf(stderr, "%.*s\n", str8_varg(title)); - fprintf(stderr, "%.*s\n\n", str8_varg(message)); -} - -internal String8 -wm_graphical_pick_file(Arena *arena, String8 title, String8 initial_path) -{ - return str8_zero(); -} - -//////////////////////////////// -//~ rjf: @per_os_impl Shell Operations - -internal void -wm_show_in_filesystem_ui(String8 path) -{ - // TODO(rjf) -} - -internal void -wm_open_in_browser(String8 url) -{ - // TODO(rjf) -} diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index ae94b5c5..fa039843 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -440,7 +440,7 @@ RD_VocabInfo rd_vocab_info_table[372] = RD_NameSchemaInfo rd_name_schema_info_table[39] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @expand_if(\"$.animations\") @description(\"Controls whether or not a movement trail animation of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n\n //- rjf: symbol server\n @default(0) @display_name('Auto Download Debug Info') @description(\"Automatically tries to download missing debug info from symbol server(s).\")\n 'auto_download_debug_info': bool,\n\n //- rjf: update check\n @default(1) @display_name('Check For Updates') @description(\"Enables a small network request to check if there is a newer release version available.\")\n 'check_for_updates': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @expand_if(\"$.animations\") @description(\"Controls whether or not a movement trail animation of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n\n //- rjf: symbol server\n @default(0) @display_name('Auto Download Debug Info') @description(\"Automatically tries to download missing debug info from symbol server(s).\")\n 'auto_download_debug_info': bool,\n\n //- rjf: update check\n @default(1) @display_name('Check For Updates') @description(\"Enables a small network request to check if there is a newer release version available.\")\n 'check_for_updates': bool,\n\n //- rjf: system installation\n @display_name('Install To System') @description(\"Controls whether or not associated installation files are created on the system, for tighter integration with the operating system shell.\") 'install_to_system': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 2f38fd18..4c3b98e9 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -325,6 +325,9 @@ RD_VocabTable: //- rjf: update check @default(1) @display_name('Check For Updates') @description("Enables a small network request to check if there is a newer release version available.") 'check_for_updates': bool, + + //- rjf: system installation + @display_name('Install To System') @description("Controls whether or not associated installation files are created on the system, for tighter integration with the operating system shell.") 'install_to_system': bool, } ``` } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index cbedf632..e7ae1924 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -7549,7 +7549,7 @@ rd_window_frame(void) UI_Signal sig = ui_button(str8_lit("Submit request, issue, or bug report")); if(ui_clicked(sig)) { - wm_open_in_browser(url); + sh_open_in_browser(url); } } ui_spacer(ui_em(0.5f, 1.f)); @@ -8018,7 +8018,7 @@ rd_window_frame(void) ui_box_equip_display_fstrs(label, &fstrs); if(ui_clicked(sig)) { - wm_open_in_browser(s("https://github.com/EpicGames/raddebugger/releases/latest")); + sh_open_in_browser(s("https://github.com/EpicGames/raddebugger/releases/latest")); } } @@ -13201,6 +13201,17 @@ rd_frame(void) rd_state->eval_viz_base_string_flags |= EV_StringFlag_DisplayAddressUnmappedStatus; } + //////////////////////////// + //- rjf: do installation/uninstallation of app + // + B32 installed = rd_setting_b32_from_name(s("install_to_system")); + B32 last_installed = rd_state->installed; + if(installed != last_installed) + { + sh_install_or_uninstall_self(installed); + rd_state->installed = installed; + } + //////////////////////////// //- rjf: send update check if needed // @@ -13503,7 +13514,7 @@ rd_frame(void) { cmd_title = info->string; } - String8 file_path = wm_graphical_pick_file(scratch.arena, cmd_title, current_path_string); + String8 file_path = sh_pick_file(scratch.arena, cmd_title, current_path_string); file_path = path_normalized_from_string(scratch.arena, file_path); if(file_path.size != 0) { @@ -15084,7 +15095,7 @@ rd_frame(void) if(rd_regs()->file_path.size != 0) { String8 full_path = rd_regs()->file_path; - wm_show_in_filesystem_ui(full_path); + sh_show_in_file_browser(full_path); }break; //- rjf: source <-> disasm diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 5d314d7e..2294b6be 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -390,6 +390,9 @@ struct RD_State S32 frame_depth; U64 frame_eval_memread_endt_us; + // rjf: installation setting state + B32 installed; + // rjf: update checker B32 sent_update_check; B32 got_update_check; diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index efb1e756..f7b47811 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -387,6 +387,7 @@ #include "minidump/minidump_parse.h" #include "mdesk/mdesk.h" #include "window_manager/window_manager_inc.h" +#include "shell/shell_inc.h" #include "http/http_inc.h" #include "symbol_server/symbol_server_inc.h" #include "config/config_inc.h" @@ -448,6 +449,7 @@ #include "minidump/minidump_parse.c" #include "mdesk/mdesk.c" #include "window_manager/window_manager_inc.c" +#include "shell/shell_inc.c" #include "http/http_inc.c" #include "symbol_server/symbol_server_inc.c" #include "config/config_inc.c" @@ -964,26 +966,26 @@ entry_point(CmdLine *cmd_line) //- rjf: help message box case ExecMode_Help: { - wm_graphical_message(0, - str8_lit("The RAD Debugger - Help"), - str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n" - "--user:\n" - "Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n" - "--project:\n" - "Use to specify the location of a project file which should be used. Project files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made.\n\n" - "--auto_step\n" - "This will step into all active targets after the debugger initially starts.\n\n" - "--auto_run\n" - "This will run all active targets after the debugger initially starts.\n\n" - "--quit_after_success (or -q)\n" - "This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\n\n" - "--ipc \n" - "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n" - "--gen_crash_dump\n" - "Generate mini dump on crash.\n\n" - "--logs:\n" - "Overrides default path to the folder with logs.\n" - )); + sh_message(0, + str8_lit("The RAD Debugger - Help"), + str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n" + "--user:\n" + "Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\n\n" + "--project:\n" + "Use to specify the location of a project file which should be used. Project files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made.\n\n" + "--auto_step\n" + "This will step into all active targets after the debugger initially starts.\n\n" + "--auto_run\n" + "This will run all active targets after the debugger initially starts.\n\n" + "--quit_after_success (or -q)\n" + "This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\n\n" + "--ipc \n" + "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n" + "--gen_crash_dump\n" + "Generate mini dump on crash.\n\n" + "--logs:\n" + "Overrides default path to the folder with logs.\n" + )); }break; } diff --git a/src/render/d3d11/render_d3d11.c b/src/render/d3d11/render_d3d11.c index deb28141..121aebde 100644 --- a/src/render/d3d11/render_d3d11.c +++ b/src/render/d3d11/render_d3d11.c @@ -198,7 +198,7 @@ r_init(CmdLine *cmdln) { char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%lx). The process is terminating.", error); - wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + sh_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); abort_self(1); } ProfEnd(); @@ -370,7 +370,7 @@ r_init(CmdLine *cmdln) { errors = str8((U8 *)vshad_source_errors->lpVtbl->GetBufferPointer(vshad_source_errors), (U64)vshad_source_errors->lpVtbl->GetBufferSize(vshad_source_errors)); - wm_graphical_message(1, str8_lit("Vertex Shader Compilation Failure"), errors); + sh_message(1, str8_lit("Vertex Shader Compilation Failure"), errors); } else { @@ -425,7 +425,7 @@ r_init(CmdLine *cmdln) { errors = str8((U8 *)pshad_source_errors->lpVtbl->GetBufferPointer(pshad_source_errors), (U64)pshad_source_errors->lpVtbl->GetBufferSize(pshad_source_errors)); - wm_graphical_message(1, str8_lit("Pixel Shader Compilation Failure"), errors); + sh_message(1, str8_lit("Pixel Shader Compilation Failure"), errors); } else { @@ -534,7 +534,7 @@ r_window_equip(WM_Window handle) { char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "DXGI swap chain creation failure (%lx). The process is terminating.", error); - wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + sh_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); abort_self(1); } @@ -1052,7 +1052,7 @@ r_window_end_frame(WM_Window window, R_Handle window_equip) { char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "D3D11 present failure (%lx). The process is terminating.", error); - wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + sh_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); abort_self(1); } d_ctx->lpVtbl->ClearState(d_ctx); diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.c b/src/render/opengl/linux/egl/render_opengl_linux_egl.c index 4b05a425..481cf082 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.c +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.c @@ -23,7 +23,7 @@ r_ogl_os_init(CmdLine *cmdln) r_ogl_lnx_state->display = eglGetDisplay((EGLNativeDisplayType)lnx_wm_state->display); if(r_ogl_lnx_state->display == EGL_NO_DISPLAY) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display.")); abort_self(1); } } @@ -33,14 +33,14 @@ r_ogl_os_init(CmdLine *cmdln) EGLint egl_version_minor = 0; if(!eglInitialize(r_ogl_lnx_state->display, &egl_version_major, &egl_version_minor)) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL display.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL display.")); abort_self(1); } if(egl_version_major < 1 || (egl_version_major == 1 && egl_version_minor < 5)) { Temp scratch = scratch_begin(0, 0); String8 message = push_str8f(scratch.arena, "Unsupported EGL version (%i.%i, need at least 1.5)", egl_version_major, egl_version_minor); - wm_graphical_message(1, str8_lit("Fatal Error"), message); + sh_message(1, str8_lit("Fatal Error"), message); abort_self(1); scratch_end(scratch); } @@ -48,7 +48,7 @@ r_ogl_os_init(CmdLine *cmdln) //- rjf: pick GL API if(!eglBindAPI(EGL_OPENGL_API)) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL.")); abort_self(1); } @@ -71,7 +71,7 @@ r_ogl_os_init(CmdLine *cmdln) EGLint configs_count = 0; if(!eglChooseConfig(r_ogl_lnx_state->display, config_filter, configs, ArrayCount(configs), &configs_count) || configs_count == 0) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration.")); abort_self(1); } int screen = DefaultScreen(lnx_wm_state->display); @@ -97,7 +97,7 @@ r_ogl_os_init(CmdLine *cmdln) } if(vi == 0 || r_ogl_lnx_state->config == 0) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find an EGL config with a matching X11 visual.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find an EGL config with a matching X11 visual.")); abort_self(1); } lnx_wm_state->window_visual = vi->visual; @@ -125,7 +125,7 @@ r_ogl_os_init(CmdLine *cmdln) r_ogl_lnx_state->context = eglCreateContext(r_ogl_lnx_state->display, r_ogl_lnx_state->config, EGL_NO_CONTEXT, options); if(r_ogl_lnx_state->context == EGL_NO_CONTEXT) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL.")); abort_self(1); } } @@ -168,7 +168,7 @@ r_ogl_os_window_equip(WM_Window window) } if(w->surface == EGL_NO_SURFACE) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create EGL surface.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create EGL surface.")); abort_self(1); } } diff --git a/src/render/opengl/linux/glx/render_opengl_linux_glx.c b/src/render/opengl/linux/glx/render_opengl_linux_glx.c index 993cdf32..3d7a870a 100644 --- a/src/render/opengl/linux/glx/render_opengl_linux_glx.c +++ b/src/render/opengl/linux/glx/render_opengl_linux_glx.c @@ -20,7 +20,7 @@ r_ogl_os_init(CmdLine *cmdln) { Temp scratch = scratch_begin(0, 0); String8 message = push_str8f(scratch.arena, "Unsupported GLX version (%i.%i, need at least 1.3)", glx_version_major, glx_version_minor); - wm_graphical_message(1, str8_lit("Fatal Error"), message); + sh_message(1, str8_lit("Fatal Error"), message); abort_self(1); scratch_end(scratch); } @@ -45,25 +45,25 @@ r_ogl_os_init(CmdLine *cmdln) GLXFBConfig *framebuffer_configs = glXChooseFBConfig(lnx_wm_state->display, DefaultScreen(lnx_wm_state->display), framebuffer_config_options, &framebuffer_configs_count); if(framebuffer_configs == 0) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration.")); abort_self(1); } GLXFBConfig framebuffer_config = framebuffer_configs[0]; XFree(framebuffer_configs); - + //- extract visual/colormap from chosen fbconfig, publish to os layer { XVisualInfo *vi = glXGetVisualFromFBConfig(lnx_wm_state->display, framebuffer_config); if(vi == 0) { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not get visual from GLX framebuffer config.")); + sh_message(1, str8_lit("Fatal Error"), str8_lit("Could not get visual from GLX framebuffer config.")); abort_self(1); } lnx_wm_state->window_visual = vi->visual; lnx_wm_state->window_depth = vi->depth; lnx_wm_state->window_colormap = XCreateColormap(lnx_wm_state->display, - XRootWindow(lnx_wm_state->display, vi->screen), - vi->visual, AllocNone); + XRootWindow(lnx_wm_state->display, vi->screen), + vi->visual, AllocNone); XFree(vi); } diff --git a/src/shell/shell.c b/src/shell/shell.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/shell/shell.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/shell/shell.h b/src/shell/shell.h new file mode 100644 index 00000000..c5828db0 --- /dev/null +++ b/src/shell/shell.h @@ -0,0 +1,16 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef SHELL_H +#define SHELL_H + +//////////////////////////////// +//~ rjf: @per_os_impl Shell Operations + +internal void sh_message(B32 error, String8 title, String8 message); +internal String8 sh_pick_file(Arena *arena, String8 title, String8 initial_path); +internal void sh_show_in_file_browser(String8 path); +internal void sh_open_in_browser(String8 url); +internal void sh_install_or_uninstall_self(B32 install); + +#endif // SHELL_H diff --git a/src/shell/shell_inc.c b/src/shell/shell_inc.c new file mode 100644 index 00000000..ea89cbfa --- /dev/null +++ b/src/shell/shell_inc.c @@ -0,0 +1,11 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "shell.c" +#if OS_WINDOWS +# include "win32/shell/win32_shell.c" +#elif OS_LINUX +# include "linux/shell/linux_shell.c" +#else +# error Shell functions not implemented for this operating system. +#endif diff --git a/src/shell/shell_inc.h b/src/shell/shell_inc.h new file mode 100644 index 00000000..7decdaeb --- /dev/null +++ b/src/shell/shell_inc.h @@ -0,0 +1,16 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef SHELL_INC_H +#define SHELL_INC_H + +#include "shell.h" +#if OS_WINDOWS +# include "win32/shell/win32_shell.h" +#elif OS_LINUX +# include "linux/shell/linux_shell.h" +#else +# error Shell functions not implemented for this operating system. +#endif + +#endif // SHELL_INC_H diff --git a/src/win32/shell/win32_shell.c b/src/win32/shell/win32_shell.c new file mode 100644 index 00000000..dffb4bff --- /dev/null +++ b/src/win32/shell/win32_shell.c @@ -0,0 +1,78 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: @per_os_impl Shell Operations + +internal void +sh_message(B32 error, String8 title, String8 message) +{ + Temp scratch = scratch_begin(0, 0); + String16 title16 = str16_from_8(scratch.arena, title); + String16 message16 = str16_from_8(scratch.arena, message); + MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR)); + scratch_end(scratch); +} + +internal String8 +sh_pick_file(Arena *arena, String8 title, String8 initial_path) +{ + String8 result = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + U64 buffer_size = 4096; + U16 *buffer = push_array(scratch.arena, U16, buffer_size); + OPENFILENAMEW params = {sizeof(params)}; + { + params.lpstrTitle = (WCHAR *)str16_from_8(scratch.arena, title).str; + params.lpstrFile = (WCHAR *)buffer; + params.nMaxFile = buffer_size; + params.lpstrInitialDir = (WCHAR *)str16_from_8(scratch.arena, initial_path).str; + } + if(GetOpenFileNameW(¶ms)) + { + result = str8_from_16(arena, str16_cstring((U16 *)buffer)); + } + scratch_end(scratch); + } + return result; +} + +internal void +sh_show_in_file_browser(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + for(U64 idx = 0; idx < path_copy.size; idx += 1) + { + if(path_copy.str[idx] == '/') + { + path_copy.str[idx] = '\\'; + } + } + String16 path16 = str16_from_8(scratch.arena, path_copy); + SFGAOF flags = 0; + PIDLIST_ABSOLUTE list = 0; + if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags))) + { + HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0); + CoTaskMemFree(list); + (void)hr; + } + scratch_end(scratch); +} + +internal void +sh_open_in_browser(String8 url) +{ + Temp scratch = scratch_begin(0, 0); + String16 url16 = str16_from_8(scratch.arena, url); + ShellExecuteW(0, L"open", (WCHAR *)url16.str, 0, 0, SW_SHOWNORMAL); + scratch_end(scratch); +} + +internal void +sh_install_or_uninstall_self(B32 install) +{ + // TODO(rjf) +} diff --git a/src/win32/shell/win32_shell.h b/src/win32/shell/win32_shell.h new file mode 100644 index 00000000..13b36c07 --- /dev/null +++ b/src/win32/shell/win32_shell.h @@ -0,0 +1,7 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef WIN32_SHELL_H +#define WIN32_SHELL_H + +#endif // WIN32_SHELL_H diff --git a/src/win32/window_manager/win32_window_manager.c b/src/win32/window_manager/win32_window_manager.c index c107ef58..8719f5ec 100644 --- a/src/win32/window_manager/win32_window_manager.c +++ b/src/win32/window_manager/win32_window_manager.c @@ -1618,76 +1618,3 @@ hcursor = curs; }break; w32_wm_state->hCursor = hcursor; } } - -//////////////////////////////// -//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void -wm_graphical_message(B32 error, String8 title, String8 message) -{ - Temp scratch = scratch_begin(0, 0); - String16 title16 = str16_from_8(scratch.arena, title); - String16 message16 = str16_from_8(scratch.arena, message); - MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR)); - scratch_end(scratch); -} - -internal String8 -wm_graphical_pick_file(Arena *arena, String8 title, String8 initial_path) -{ - String8 result = {0}; - { - Temp scratch = scratch_begin(&arena, 1); - U64 buffer_size = 4096; - U16 *buffer = push_array(scratch.arena, U16, buffer_size); - OPENFILENAMEW params = {sizeof(params)}; - { - params.lpstrTitle = (WCHAR *)str16_from_8(scratch.arena, title).str; - params.lpstrFile = (WCHAR *)buffer; - params.nMaxFile = buffer_size; - params.lpstrInitialDir = (WCHAR *)str16_from_8(scratch.arena, initial_path).str; - } - if(GetOpenFileNameW(¶ms)) - { - result = str8_from_16(arena, str16_cstring((U16 *)buffer)); - } - scratch_end(scratch); - } - return result; -} - -//////////////////////////////// -//~ rjf: @per_os_impl Shell Operations - -internal void -wm_show_in_filesystem_ui(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); - for(U64 idx = 0; idx < path_copy.size; idx += 1) - { - if(path_copy.str[idx] == '/') - { - path_copy.str[idx] = '\\'; - } - } - String16 path16 = str16_from_8(scratch.arena, path_copy); - SFGAOF flags = 0; - PIDLIST_ABSOLUTE list = 0; - if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags))) - { - HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0); - CoTaskMemFree(list); - (void)hr; - } - scratch_end(scratch); -} - -internal void -wm_open_in_browser(String8 url) -{ - Temp scratch = scratch_begin(0, 0); - String16 url16 = str16_from_8(scratch.arena, url); - ShellExecuteW(0, L"open", (WCHAR *)url16.str, 0, 0, SW_SHOWNORMAL); - scratch_end(scratch); -} diff --git a/src/window_manager/window_manager.h b/src/window_manager/window_manager.h index 804e5468..d2d5dd98 100644 --- a/src/window_manager/window_manager.h +++ b/src/window_manager/window_manager.h @@ -231,16 +231,4 @@ internal Vec2F32 wm_mouse_from_window(WM_Window window); internal void wm_set_cursor(WM_Cursor cursor); -//////////////////////////////// -//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void wm_graphical_message(B32 error, String8 title, String8 message); -internal String8 wm_graphical_pick_file(Arena *arena, String8 title, String8 initial_path); - -//////////////////////////////// -//~ rjf: @per_os_impl Shell Operations - -internal void wm_show_in_filesystem_ui(String8 path); -internal void wm_open_in_browser(String8 url); - #endif // WINDOW_MANAGER_H diff --git a/src/window_manager/window_manager_stub.c b/src/window_manager/window_manager_stub.c index cc81368e..6910ba2d 100644 --- a/src/window_manager/window_manager_stub.c +++ b/src/window_manager/window_manager_stub.c @@ -249,30 +249,3 @@ internal void wm_set_cursor(WM_Cursor cursor) { } - -//////////////////////////////// -//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void -wm_graphical_message(B32 error, String8 title, String8 message) -{ -} - -internal String8 -wm_graphical_pick_file(Arena *arena, String8 title, String8 initial_path) -{ - return str8_zero(); -} - -//////////////////////////////// -//~ rjf: @per_os_impl Shell Operations - -internal void -wm_show_in_filesystem_ui(String8 path) -{ -} - -internal void -wm_open_in_browser(String8 url) -{ -}