From 0ca14b318031891c16106d3a39eabd230f0fb9fd Mon Sep 17 00:00:00 2001 From: hckrman101 <239247847+hckrman101@users.noreply.github.com> Date: Mon, 9 Nov 2026 12:50:45 -0500 Subject: [PATCH 1/3] Sharpness: neighbours one picture pixel apart and a contrast-adaptive sharpen in the manner of AMD FidelityFX RCAS The window pass took the sharpen's neighbours one window pixel apart: a fraction of a picture pixel when the window is larger than the picture, so what the slider did hung on the window's size. They are now one picture pixel apart (one window pixel when the window is the smaller), and the sharpen is RCAS's: a negative lobe on the four neighbours, the largest that keeps the result inside 0..1 for the neighbourhood, the slider 0..100% on 0..RCAS's strongest lobe, then held to the neighbourhood's light range (no halos, no clipping). tests/test_fg_scale_sharpen.py: the spacing, sharpen() compiled as C++ (unchanged at 0, never outside the neighbourhood or 0..1, edges steeper as the setting rises) and the SPIR-V header matching the shader. --- gpu/vk/shaders/fg_scale.comp | 26 +- gpu/vk/shaders/fg_scale_comp_spv.h | 549 ++++++++++++++++------------- gpu/vk/vk_framegen.cpp | 3 +- tests/run_all.py | 1 + tests/test_fg_scale_sharpen.py | 156 ++++++++ 5 files changed, 485 insertions(+), 250 deletions(-) create mode 100644 tests/test_fg_scale_sharpen.py diff --git a/gpu/vk/shaders/fg_scale.comp b/gpu/vk/shaders/fg_scale.comp index 1721e3c3..bf421257 100644 --- a/gpu/vk/shaders/fg_scale.comp +++ b/gpu/vk/shaders/fg_scale.comp @@ -1,6 +1,7 @@ #version 450 // the frame to the window's size (the Insert menu's Upscaling, Sharpness): Catmull-Rom or Lanczos 2, or the linear filter, then -// a contrast-limited sharpen that cannot go past the light around the pixel, so it adds no halos and no flashes +// a contrast-adaptive sharpen in the manner of AMD FidelityFX RCAS that cannot go past the light around the pixel, so it adds no halos, +// no clipping and no flashes layout(local_size_x = 8, local_size_y = 8) in; layout(binding = 0) uniform sampler2D src; layout(binding = 1, rgba8) uniform writeonly image2D dst; @@ -36,6 +37,21 @@ vec3 filtered(vec2 uv) { } return sum / weight; } +// The Sharpness slider (pc.sharp 0 to 1) is RCAS's strength: 0 the picture as filtered, 1 its strongest lobe. +const float kMaxLobe = 0.25 - 1.0 / 16.0; +vec3 sharpen(vec3 c, vec3 n, vec3 s, vec3 w, vec3 e, float amount) { + // RCAS: the four neighbours weighted by a negative lobe, the largest that keeps the result inside 0..1 for this + // neighbourhood (smaller where the light is near black or white), then normalized + const vec3 lo4 = min(min(n, s), min(w, e)), hi4 = max(max(n, s), max(w, e)); + const vec3 lo = min(lo4, c), hi = max(hi4, c); + const vec3 to_black = lo / max(4.0 * hi, vec3(1.0 / 1024.0)); + const vec3 to_white = (1.0 - hi) / max(4.0 - 4.0 * lo4, vec3(1.0 / 1024.0)); + const vec3 room = min(to_black, to_white); + const float lobe = -clamp(min(min(room.r, room.g), room.b), 0.0, kMaxLobe) * clamp(amount, 0.0, 1.0); + const vec3 sharp = (c + lobe * (n + s + w + e)) / (1.0 + 4.0 * lobe); + // (and no further than the lightest and darkest pixel around it: an edge gets steeper, no halo beside it) + return clamp(sharp, lo, hi); +} void main() { const ivec2 g = ivec2(gl_GlobalInvocationID.xy); const ivec2 d = imageSize(dst); @@ -43,11 +59,13 @@ void main() { const vec2 uv = (vec2(g) + 0.5) / vec2(d); vec3 c = filtered(uv); if (pc.sharp > 0.0) { - const vec2 e = 1.0 / vec2(d); + // The neighbours one picture pixel away (one window pixel when the window is the smaller). They were one window + // pixel away, a fraction of a picture pixel when the window is larger (0.53 for 2048 x 1152 on a 3840 x 2160 + // screen): what the slider did then hung on the window's size, not on the picture. + const vec2 e = max(1.0 / vec2(textureSize(src, 0)), 1.0 / vec2(d)); const vec3 n = textureLod(src, uv + vec2(0.0, -e.y), 0.0).rgb, s = textureLod(src, uv + vec2(0.0, e.y), 0.0).rgb; const vec3 w = textureLod(src, uv + vec2(-e.x, 0.0), 0.0).rgb, r = textureLod(src, uv + vec2(e.x, 0.0), 0.0).rgb; - const vec3 lo = min(min(min(n, s), min(w, r)), c), hi = max(max(max(n, s), max(w, r)), c); - c = clamp(c + pc.sharp * (c - (n + s + w + r) * 0.25), lo, hi); + c = sharpen(c, n, s, w, r, pc.sharp); } imageStore(dst, g, vec4(c, 1.0)); } diff --git a/gpu/vk/shaders/fg_scale_comp_spv.h b/gpu/vk/shaders/fg_scale_comp_spv.h index 747d403a..deb04473 100644 --- a/gpu/vk/shaders/fg_scale_comp_spv.h +++ b/gpu/vk/shaders/fg_scale_comp_spv.h @@ -1,255 +1,314 @@ // 1116.6.0 #pragma once const uint32_t FG_SCALE_COMP_SPV[] = { - 0x07230203,0x00010500,0x0008000b,0x00000172,0x00000000,0x00020011,0x00000001,0x00020011, + 0x07230203,0x00010500,0x0008000b,0x000001be,0x00000000,0x00020011,0x00000001,0x00020011, 0x00000032,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e, - 0x00000000,0x00000001,0x0009000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000069, - 0x00000074,0x000000f2,0x000000fa,0x00060010,0x00000004,0x00000011,0x00000008,0x00000008, + 0x00000000,0x00000001,0x0009000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000073, + 0x0000007e,0x00000150,0x00000158,0x00060010,0x00000004,0x00000011,0x00000008,0x00000008, 0x00000001,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000, 0x00060005,0x0000000a,0x636e616c,0x32736f7a,0x3b316628,0x00000000,0x00030005,0x00000009, 0x00000078,0x00050005,0x0000000d,0x6d746163,0x286c6c75,0x003b3166,0x00030005,0x0000000c, 0x00000078,0x00060005,0x00000014,0x746c6966,0x64657265,0x32667628,0x0000003b,0x00030005, - 0x00000013,0x00007675,0x00030005,0x00000027,0x00000070,0x00030005,0x00000067,0x00000050, - 0x00050006,0x00000067,0x00000000,0x65646f6d,0x00000000,0x00050006,0x00000067,0x00000001, - 0x72616873,0x00000070,0x00030005,0x00000069,0x00006370,0x00030005,0x00000074,0x00637273, - 0x00040005,0x0000007b,0x657a6973,0x00000000,0x00030005,0x00000081,0x00000070,0x00030005, - 0x00000088,0x00000062,0x00030005,0x0000008c,0x00000066,0x00030005,0x00000092,0x006d7573, - 0x00040005,0x00000094,0x67696577,0x00007468,0x00030005,0x00000096,0x00000079,0x00030005, - 0x000000a0,0x00000078,0x00030005,0x000000a8,0x00000064,0x00030005,0x000000b0,0x00000077, - 0x00040005,0x000000b7,0x61726170,0x0000006d,0x00040005,0x000000bd,0x61726170,0x0000006d, - 0x00040005,0x000000c4,0x61726170,0x0000006d,0x00040005,0x000000c8,0x61726170,0x0000006d, - 0x00030005,0x000000ef,0x00000067,0x00080005,0x000000f2,0x475f6c67,0x61626f6c,0x766e496c, - 0x7461636f,0x496e6f69,0x00000044,0x00030005,0x000000f7,0x00000064,0x00030005,0x000000fa, - 0x00747364,0x00030005,0x00000105,0x00007675,0x00030005,0x0000010d,0x00000063,0x00040005, - 0x0000010e,0x61726170,0x0000006d,0x00030005,0x00000117,0x00000065,0x00030005,0x0000011c, - 0x0000006e,0x00030005,0x00000126,0x00000073,0x00030005,0x0000012f,0x00000077,0x00030005, - 0x00000139,0x00000072,0x00030005,0x00000142,0x00006f6c,0x00030005,0x0000014c,0x00006968, - 0x00030047,0x00000067,0x00000002,0x00050048,0x00000067,0x00000000,0x00000023,0x00000000, - 0x00050048,0x00000067,0x00000001,0x00000023,0x00000004,0x00040047,0x00000074,0x00000021, - 0x00000000,0x00040047,0x00000074,0x00000022,0x00000000,0x00040047,0x000000f2,0x0000000b, - 0x0000001c,0x00030047,0x000000fa,0x00000019,0x00040047,0x000000fa,0x00000021,0x00000001, - 0x00040047,0x000000fa,0x00000022,0x00000000,0x00040047,0x00000171,0x0000000b,0x00000019, - 0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020, - 0x00040020,0x00000007,0x00000007,0x00000006,0x00040021,0x00000008,0x00000006,0x00000007, - 0x00040017,0x0000000f,0x00000006,0x00000002,0x00040020,0x00000010,0x00000007,0x0000000f, - 0x00040017,0x00000011,0x00000006,0x00000003,0x00040021,0x00000012,0x00000011,0x00000010, - 0x0004002b,0x00000006,0x00000019,0x38d1b717,0x00020014,0x0000001a,0x0004002b,0x00000006, - 0x0000001e,0x3f800000,0x0004002b,0x00000006,0x00000021,0x40000000,0x0004002b,0x00000006, - 0x00000025,0x00000000,0x0004002b,0x00000006,0x00000028,0x40490fdb,0x0004002b,0x00000006, - 0x0000002f,0x3f000000,0x0004002b,0x00000006,0x0000003f,0x3fc00000,0x0004002b,0x00000006, - 0x00000046,0x40200000,0x0004002b,0x00000006,0x00000052,0xbf000000,0x0004002b,0x00000006, - 0x0000005e,0x40800000,0x00040015,0x00000066,0x00000020,0x00000001,0x0004001e,0x00000067, - 0x00000066,0x00000006,0x00040020,0x00000068,0x00000009,0x00000067,0x0004003b,0x00000068, - 0x00000069,0x00000009,0x0004002b,0x00000066,0x0000006a,0x00000000,0x00040020,0x0000006b, - 0x00000009,0x00000066,0x00090019,0x00000071,0x00000006,0x00000001,0x00000000,0x00000000, - 0x00000000,0x00000001,0x00000000,0x0003001b,0x00000072,0x00000071,0x00040020,0x00000073, - 0x00000000,0x00000072,0x0004003b,0x00000073,0x00000074,0x00000000,0x00040017,0x00000077, - 0x00000006,0x00000004,0x00040017,0x0000007e,0x00000066,0x00000002,0x00040020,0x00000087, - 0x00000007,0x0000007e,0x00040020,0x00000091,0x00000007,0x00000011,0x0006002c,0x00000011, - 0x00000093,0x00000025,0x00000025,0x00000025,0x00040020,0x00000095,0x00000007,0x00000066, - 0x0004002b,0x00000066,0x00000097,0xffffffff,0x0004002b,0x00000066,0x0000009e,0x00000002, - 0x00040015,0x000000b8,0x00000020,0x00000000,0x0004002b,0x000000b8,0x000000b9,0x00000000, - 0x0004002b,0x000000b8,0x000000be,0x00000001,0x0005002c,0x0000007e,0x000000d5,0x0000006a, - 0x0000006a,0x0004002b,0x00000066,0x000000d8,0x00000001,0x00040017,0x000000f0,0x000000b8, - 0x00000003,0x00040020,0x000000f1,0x00000001,0x000000f0,0x0004003b,0x000000f1,0x000000f2, - 0x00000001,0x00040017,0x000000f3,0x000000b8,0x00000002,0x00090019,0x000000f8,0x00000006, - 0x00000001,0x00000000,0x00000000,0x00000000,0x00000002,0x00000004,0x00040020,0x000000f9, - 0x00000000,0x000000f8,0x0004003b,0x000000f9,0x000000fa,0x00000000,0x00040017,0x000000ff, - 0x0000001a,0x00000002,0x00040020,0x00000111,0x00000009,0x00000006,0x0004002b,0x00000006, - 0x00000161,0x3e800000,0x0004002b,0x000000b8,0x00000170,0x00000008,0x0006002c,0x000000f0, - 0x00000171,0x00000170,0x00000170,0x000000be,0x00050036,0x00000002,0x00000004,0x00000000, - 0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000087,0x000000ef,0x00000007,0x0004003b, - 0x00000087,0x000000f7,0x00000007,0x0004003b,0x00000010,0x00000105,0x00000007,0x0004003b, - 0x00000091,0x0000010d,0x00000007,0x0004003b,0x00000010,0x0000010e,0x00000007,0x0004003b, - 0x00000010,0x00000117,0x00000007,0x0004003b,0x00000091,0x0000011c,0x00000007,0x0004003b, - 0x00000091,0x00000126,0x00000007,0x0004003b,0x00000091,0x0000012f,0x00000007,0x0004003b, - 0x00000091,0x00000139,0x00000007,0x0004003b,0x00000091,0x00000142,0x00000007,0x0004003b, - 0x00000091,0x0000014c,0x00000007,0x0004003d,0x000000f0,0x000000f4,0x000000f2,0x0007004f, - 0x000000f3,0x000000f5,0x000000f4,0x000000f4,0x00000000,0x00000001,0x0004007c,0x0000007e, - 0x000000f6,0x000000f5,0x0003003e,0x000000ef,0x000000f6,0x0004003d,0x000000f8,0x000000fb, - 0x000000fa,0x00040068,0x0000007e,0x000000fc,0x000000fb,0x0003003e,0x000000f7,0x000000fc, - 0x0004003d,0x0000007e,0x000000fd,0x000000ef,0x0004003d,0x0000007e,0x000000fe,0x000000f7, - 0x000500af,0x000000ff,0x00000100,0x000000fd,0x000000fe,0x0004009a,0x0000001a,0x00000101, - 0x00000100,0x000300f7,0x00000103,0x00000000,0x000400fa,0x00000101,0x00000102,0x00000103, - 0x000200f8,0x00000102,0x000100fd,0x000200f8,0x00000103,0x0004003d,0x0000007e,0x00000106, - 0x000000ef,0x0004006f,0x0000000f,0x00000107,0x00000106,0x00050050,0x0000000f,0x00000108, - 0x0000002f,0x0000002f,0x00050081,0x0000000f,0x00000109,0x00000107,0x00000108,0x0004003d, - 0x0000007e,0x0000010a,0x000000f7,0x0004006f,0x0000000f,0x0000010b,0x0000010a,0x00050088, - 0x0000000f,0x0000010c,0x00000109,0x0000010b,0x0003003e,0x00000105,0x0000010c,0x0004003d, - 0x0000000f,0x0000010f,0x00000105,0x0003003e,0x0000010e,0x0000010f,0x00050039,0x00000011, - 0x00000110,0x00000014,0x0000010e,0x0003003e,0x0000010d,0x00000110,0x00050041,0x00000111, - 0x00000112,0x00000069,0x000000d8,0x0004003d,0x00000006,0x00000113,0x00000112,0x000500ba, - 0x0000001a,0x00000114,0x00000113,0x00000025,0x000300f7,0x00000116,0x00000000,0x000400fa, - 0x00000114,0x00000115,0x00000116,0x000200f8,0x00000115,0x0004003d,0x0000007e,0x00000118, - 0x000000f7,0x0004006f,0x0000000f,0x00000119,0x00000118,0x00050050,0x0000000f,0x0000011a, - 0x0000001e,0x0000001e,0x00050088,0x0000000f,0x0000011b,0x0000011a,0x00000119,0x0003003e, - 0x00000117,0x0000011b,0x0004003d,0x00000072,0x0000011d,0x00000074,0x0004003d,0x0000000f, - 0x0000011e,0x00000105,0x00050041,0x00000007,0x0000011f,0x00000117,0x000000be,0x0004003d, - 0x00000006,0x00000120,0x0000011f,0x0004007f,0x00000006,0x00000121,0x00000120,0x00050050, - 0x0000000f,0x00000122,0x00000025,0x00000121,0x00050081,0x0000000f,0x00000123,0x0000011e, - 0x00000122,0x00070058,0x00000077,0x00000124,0x0000011d,0x00000123,0x00000002,0x00000025, - 0x0008004f,0x00000011,0x00000125,0x00000124,0x00000124,0x00000000,0x00000001,0x00000002, - 0x0003003e,0x0000011c,0x00000125,0x0004003d,0x00000072,0x00000127,0x00000074,0x0004003d, - 0x0000000f,0x00000128,0x00000105,0x00050041,0x00000007,0x00000129,0x00000117,0x000000be, - 0x0004003d,0x00000006,0x0000012a,0x00000129,0x00050050,0x0000000f,0x0000012b,0x00000025, - 0x0000012a,0x00050081,0x0000000f,0x0000012c,0x00000128,0x0000012b,0x00070058,0x00000077, - 0x0000012d,0x00000127,0x0000012c,0x00000002,0x00000025,0x0008004f,0x00000011,0x0000012e, - 0x0000012d,0x0000012d,0x00000000,0x00000001,0x00000002,0x0003003e,0x00000126,0x0000012e, - 0x0004003d,0x00000072,0x00000130,0x00000074,0x0004003d,0x0000000f,0x00000131,0x00000105, - 0x00050041,0x00000007,0x00000132,0x00000117,0x000000b9,0x0004003d,0x00000006,0x00000133, - 0x00000132,0x0004007f,0x00000006,0x00000134,0x00000133,0x00050050,0x0000000f,0x00000135, - 0x00000134,0x00000025,0x00050081,0x0000000f,0x00000136,0x00000131,0x00000135,0x00070058, - 0x00000077,0x00000137,0x00000130,0x00000136,0x00000002,0x00000025,0x0008004f,0x00000011, - 0x00000138,0x00000137,0x00000137,0x00000000,0x00000001,0x00000002,0x0003003e,0x0000012f, - 0x00000138,0x0004003d,0x00000072,0x0000013a,0x00000074,0x0004003d,0x0000000f,0x0000013b, - 0x00000105,0x00050041,0x00000007,0x0000013c,0x00000117,0x000000b9,0x0004003d,0x00000006, - 0x0000013d,0x0000013c,0x00050050,0x0000000f,0x0000013e,0x0000013d,0x00000025,0x00050081, - 0x0000000f,0x0000013f,0x0000013b,0x0000013e,0x00070058,0x00000077,0x00000140,0x0000013a, - 0x0000013f,0x00000002,0x00000025,0x0008004f,0x00000011,0x00000141,0x00000140,0x00000140, - 0x00000000,0x00000001,0x00000002,0x0003003e,0x00000139,0x00000141,0x0004003d,0x00000011, - 0x00000143,0x0000011c,0x0004003d,0x00000011,0x00000144,0x00000126,0x0007000c,0x00000011, - 0x00000145,0x00000001,0x00000025,0x00000143,0x00000144,0x0004003d,0x00000011,0x00000146, - 0x0000012f,0x0004003d,0x00000011,0x00000147,0x00000139,0x0007000c,0x00000011,0x00000148, - 0x00000001,0x00000025,0x00000146,0x00000147,0x0007000c,0x00000011,0x00000149,0x00000001, - 0x00000025,0x00000145,0x00000148,0x0004003d,0x00000011,0x0000014a,0x0000010d,0x0007000c, - 0x00000011,0x0000014b,0x00000001,0x00000025,0x00000149,0x0000014a,0x0003003e,0x00000142, - 0x0000014b,0x0004003d,0x00000011,0x0000014d,0x0000011c,0x0004003d,0x00000011,0x0000014e, - 0x00000126,0x0007000c,0x00000011,0x0000014f,0x00000001,0x00000028,0x0000014d,0x0000014e, - 0x0004003d,0x00000011,0x00000150,0x0000012f,0x0004003d,0x00000011,0x00000151,0x00000139, - 0x0007000c,0x00000011,0x00000152,0x00000001,0x00000028,0x00000150,0x00000151,0x0007000c, - 0x00000011,0x00000153,0x00000001,0x00000028,0x0000014f,0x00000152,0x0004003d,0x00000011, - 0x00000154,0x0000010d,0x0007000c,0x00000011,0x00000155,0x00000001,0x00000028,0x00000153, - 0x00000154,0x0003003e,0x0000014c,0x00000155,0x0004003d,0x00000011,0x00000156,0x0000010d, - 0x00050041,0x00000111,0x00000157,0x00000069,0x000000d8,0x0004003d,0x00000006,0x00000158, - 0x00000157,0x0004003d,0x00000011,0x00000159,0x0000010d,0x0004003d,0x00000011,0x0000015a, - 0x0000011c,0x0004003d,0x00000011,0x0000015b,0x00000126,0x00050081,0x00000011,0x0000015c, - 0x0000015a,0x0000015b,0x0004003d,0x00000011,0x0000015d,0x0000012f,0x00050081,0x00000011, - 0x0000015e,0x0000015c,0x0000015d,0x0004003d,0x00000011,0x0000015f,0x00000139,0x00050081, - 0x00000011,0x00000160,0x0000015e,0x0000015f,0x0005008e,0x00000011,0x00000162,0x00000160, - 0x00000161,0x00050083,0x00000011,0x00000163,0x00000159,0x00000162,0x0005008e,0x00000011, - 0x00000164,0x00000163,0x00000158,0x00050081,0x00000011,0x00000165,0x00000156,0x00000164, - 0x0004003d,0x00000011,0x00000166,0x00000142,0x0004003d,0x00000011,0x00000167,0x0000014c, - 0x0008000c,0x00000011,0x00000168,0x00000001,0x0000002b,0x00000165,0x00000166,0x00000167, - 0x0003003e,0x0000010d,0x00000168,0x000200f9,0x00000116,0x000200f8,0x00000116,0x0004003d, - 0x000000f8,0x00000169,0x000000fa,0x0004003d,0x0000007e,0x0000016a,0x000000ef,0x0004003d, - 0x00000011,0x0000016b,0x0000010d,0x00050051,0x00000006,0x0000016c,0x0000016b,0x00000000, - 0x00050051,0x00000006,0x0000016d,0x0000016b,0x00000001,0x00050051,0x00000006,0x0000016e, - 0x0000016b,0x00000002,0x00070050,0x00000077,0x0000016f,0x0000016c,0x0000016d,0x0000016e, - 0x0000001e,0x00040063,0x00000169,0x0000016a,0x0000016f,0x000100fd,0x00010038,0x00050036, - 0x00000006,0x0000000a,0x00000000,0x00000008,0x00030037,0x00000007,0x00000009,0x000200f8, - 0x0000000b,0x0004003b,0x00000007,0x00000027,0x00000007,0x0004003d,0x00000006,0x00000016, - 0x00000009,0x0006000c,0x00000006,0x00000017,0x00000001,0x00000004,0x00000016,0x0003003e, - 0x00000009,0x00000017,0x0004003d,0x00000006,0x00000018,0x00000009,0x000500b8,0x0000001a, - 0x0000001b,0x00000018,0x00000019,0x000300f7,0x0000001d,0x00000000,0x000400fa,0x0000001b, - 0x0000001c,0x0000001d,0x000200f8,0x0000001c,0x000200fe,0x0000001e,0x000200f8,0x0000001d, - 0x0004003d,0x00000006,0x00000020,0x00000009,0x000500be,0x0000001a,0x00000022,0x00000020, - 0x00000021,0x000300f7,0x00000024,0x00000000,0x000400fa,0x00000022,0x00000023,0x00000024, - 0x000200f8,0x00000023,0x000200fe,0x00000025,0x000200f8,0x00000024,0x0004003d,0x00000006, - 0x00000029,0x00000009,0x00050085,0x00000006,0x0000002a,0x00000028,0x00000029,0x0003003e, - 0x00000027,0x0000002a,0x0004003d,0x00000006,0x0000002b,0x00000027,0x0006000c,0x00000006, - 0x0000002c,0x00000001,0x0000000d,0x0000002b,0x00050085,0x00000006,0x0000002d,0x00000021, - 0x0000002c,0x0004003d,0x00000006,0x0000002e,0x00000027,0x00050085,0x00000006,0x00000030, - 0x0000002e,0x0000002f,0x0006000c,0x00000006,0x00000031,0x00000001,0x0000000d,0x00000030, - 0x00050085,0x00000006,0x00000032,0x0000002d,0x00000031,0x0004003d,0x00000006,0x00000033, - 0x00000027,0x0004003d,0x00000006,0x00000034,0x00000027,0x00050085,0x00000006,0x00000035, - 0x00000033,0x00000034,0x00050088,0x00000006,0x00000036,0x00000032,0x00000035,0x000200fe, - 0x00000036,0x00010038,0x00050036,0x00000006,0x0000000d,0x00000000,0x00000008,0x00030037, - 0x00000007,0x0000000c,0x000200f8,0x0000000e,0x0004003d,0x00000006,0x00000039,0x0000000c, - 0x0006000c,0x00000006,0x0000003a,0x00000001,0x00000004,0x00000039,0x0003003e,0x0000000c, - 0x0000003a,0x0004003d,0x00000006,0x0000003b,0x0000000c,0x000500b8,0x0000001a,0x0000003c, - 0x0000003b,0x0000001e,0x000300f7,0x0000003e,0x00000000,0x000400fa,0x0000003c,0x0000003d, - 0x0000003e,0x000200f8,0x0000003d,0x0004003d,0x00000006,0x00000040,0x0000000c,0x00050085, - 0x00000006,0x00000041,0x0000003f,0x00000040,0x0004003d,0x00000006,0x00000042,0x0000000c, - 0x00050085,0x00000006,0x00000043,0x00000041,0x00000042,0x0004003d,0x00000006,0x00000044, - 0x0000000c,0x00050085,0x00000006,0x00000045,0x00000043,0x00000044,0x0004003d,0x00000006, - 0x00000047,0x0000000c,0x00050085,0x00000006,0x00000048,0x00000046,0x00000047,0x0004003d, - 0x00000006,0x00000049,0x0000000c,0x00050085,0x00000006,0x0000004a,0x00000048,0x00000049, - 0x00050083,0x00000006,0x0000004b,0x00000045,0x0000004a,0x00050081,0x00000006,0x0000004c, - 0x0000004b,0x0000001e,0x000200fe,0x0000004c,0x000200f8,0x0000003e,0x0004003d,0x00000006, - 0x0000004e,0x0000000c,0x000500b8,0x0000001a,0x0000004f,0x0000004e,0x00000021,0x000300f7, - 0x00000051,0x00000000,0x000400fa,0x0000004f,0x00000050,0x00000051,0x000200f8,0x00000050, + 0x00000013,0x00007675,0x000a0005,0x0000001e,0x72616873,0x286e6570,0x3b336676,0x3b336676, + 0x3b336676,0x3b336676,0x3b336676,0x003b3166,0x00030005,0x00000018,0x00000063,0x00030005, + 0x00000019,0x0000006e,0x00030005,0x0000001a,0x00000073,0x00030005,0x0000001b,0x00000077, + 0x00030005,0x0000001c,0x00000065,0x00040005,0x0000001d,0x756f6d61,0x0000746e,0x00030005, + 0x00000031,0x00000070,0x00030005,0x00000071,0x00000050,0x00050006,0x00000071,0x00000000, + 0x65646f6d,0x00000000,0x00050006,0x00000071,0x00000001,0x72616873,0x00000070,0x00030005, + 0x00000073,0x00006370,0x00030005,0x0000007e,0x00637273,0x00040005,0x00000085,0x657a6973, + 0x00000000,0x00030005,0x0000008b,0x00000070,0x00030005,0x00000092,0x00000062,0x00030005, + 0x00000096,0x00000066,0x00030005,0x0000009b,0x006d7573,0x00040005,0x0000009d,0x67696577, + 0x00007468,0x00030005,0x0000009f,0x00000079,0x00030005,0x000000a9,0x00000078,0x00030005, + 0x000000b1,0x00000064,0x00030005,0x000000b9,0x00000077,0x00040005,0x000000c0,0x61726170, + 0x0000006d,0x00040005,0x000000c6,0x61726170,0x0000006d,0x00040005,0x000000cd,0x61726170, + 0x0000006d,0x00040005,0x000000d1,0x61726170,0x0000006d,0x00030005,0x000000f8,0x00346f6c, + 0x00030005,0x00000100,0x00346968,0x00030005,0x00000108,0x00006f6c,0x00030005,0x0000010c, + 0x00006968,0x00050005,0x00000110,0x625f6f74,0x6b63616c,0x00000000,0x00050005,0x00000118, + 0x775f6f74,0x65746968,0x00000000,0x00040005,0x00000122,0x6d6f6f72,0x00000000,0x00040005, + 0x00000126,0x65626f6c,0x00000000,0x00040005,0x00000136,0x72616873,0x00000070,0x00030005, + 0x0000014d,0x00000067,0x00080005,0x00000150,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f, + 0x496e6f69,0x00000044,0x00030005,0x00000155,0x00000064,0x00030005,0x00000158,0x00747364, + 0x00030005,0x00000163,0x00007675,0x00030005,0x0000016b,0x00000063,0x00040005,0x0000016c, + 0x61726170,0x0000006d,0x00030005,0x00000175,0x00000065,0x00030005,0x00000181,0x0000006e, + 0x00030005,0x0000018b,0x00000073,0x00030005,0x00000194,0x00000077,0x00030005,0x0000019e, + 0x00000072,0x00040005,0x000001a7,0x61726170,0x0000006d,0x00040005,0x000001a9,0x61726170, + 0x0000006d,0x00040005,0x000001ab,0x61726170,0x0000006d,0x00040005,0x000001ad,0x61726170, + 0x0000006d,0x00040005,0x000001af,0x61726170,0x0000006d,0x00040005,0x000001b1,0x61726170, + 0x0000006d,0x00030047,0x00000071,0x00000002,0x00050048,0x00000071,0x00000000,0x00000023, + 0x00000000,0x00050048,0x00000071,0x00000001,0x00000023,0x00000004,0x00040047,0x0000007e, + 0x00000021,0x00000000,0x00040047,0x0000007e,0x00000022,0x00000000,0x00040047,0x00000150, + 0x0000000b,0x0000001c,0x00030047,0x00000158,0x00000019,0x00040047,0x00000158,0x00000021, + 0x00000001,0x00040047,0x00000158,0x00000022,0x00000000,0x00040047,0x000001bd,0x0000000b, + 0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006, + 0x00000020,0x00040020,0x00000007,0x00000007,0x00000006,0x00040021,0x00000008,0x00000006, + 0x00000007,0x00040017,0x0000000f,0x00000006,0x00000002,0x00040020,0x00000010,0x00000007, + 0x0000000f,0x00040017,0x00000011,0x00000006,0x00000003,0x00040021,0x00000012,0x00000011, + 0x00000010,0x00040020,0x00000016,0x00000007,0x00000011,0x00090021,0x00000017,0x00000011, + 0x00000016,0x00000016,0x00000016,0x00000016,0x00000016,0x00000007,0x0004002b,0x00000006, + 0x00000023,0x38d1b717,0x00020014,0x00000024,0x0004002b,0x00000006,0x00000028,0x3f800000, + 0x0004002b,0x00000006,0x0000002b,0x40000000,0x0004002b,0x00000006,0x0000002f,0x00000000, + 0x0004002b,0x00000006,0x00000032,0x40490fdb,0x0004002b,0x00000006,0x00000039,0x3f000000, + 0x0004002b,0x00000006,0x00000049,0x3fc00000,0x0004002b,0x00000006,0x00000050,0x40200000, + 0x0004002b,0x00000006,0x0000005c,0xbf000000,0x0004002b,0x00000006,0x00000068,0x40800000, + 0x00040015,0x00000070,0x00000020,0x00000001,0x0004001e,0x00000071,0x00000070,0x00000006, + 0x00040020,0x00000072,0x00000009,0x00000071,0x0004003b,0x00000072,0x00000073,0x00000009, + 0x0004002b,0x00000070,0x00000074,0x00000000,0x00040020,0x00000075,0x00000009,0x00000070, + 0x00090019,0x0000007b,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000,0x00000001, + 0x00000000,0x0003001b,0x0000007c,0x0000007b,0x00040020,0x0000007d,0x00000000,0x0000007c, + 0x0004003b,0x0000007d,0x0000007e,0x00000000,0x00040017,0x00000081,0x00000006,0x00000004, + 0x00040017,0x00000088,0x00000070,0x00000002,0x00040020,0x00000091,0x00000007,0x00000088, + 0x0006002c,0x00000011,0x0000009c,0x0000002f,0x0000002f,0x0000002f,0x00040020,0x0000009e, + 0x00000007,0x00000070,0x0004002b,0x00000070,0x000000a0,0xffffffff,0x0004002b,0x00000070, + 0x000000a7,0x00000002,0x00040015,0x000000c1,0x00000020,0x00000000,0x0004002b,0x000000c1, + 0x000000c2,0x00000000,0x0004002b,0x000000c1,0x000000c7,0x00000001,0x0005002c,0x00000088, + 0x000000de,0x00000074,0x00000074,0x0004002b,0x00000070,0x000000e1,0x00000001,0x0004002b, + 0x00000006,0x00000114,0x3a800000,0x0006002c,0x00000011,0x00000115,0x00000114,0x00000114, + 0x00000114,0x0004002b,0x000000c1,0x0000012c,0x00000002,0x0004002b,0x00000006,0x00000130, + 0x3e400000,0x00040017,0x0000014e,0x000000c1,0x00000003,0x00040020,0x0000014f,0x00000001, + 0x0000014e,0x0004003b,0x0000014f,0x00000150,0x00000001,0x00040017,0x00000151,0x000000c1, + 0x00000002,0x00090019,0x00000156,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000, + 0x00000002,0x00000004,0x00040020,0x00000157,0x00000000,0x00000156,0x0004003b,0x00000157, + 0x00000158,0x00000000,0x00040017,0x0000015d,0x00000024,0x00000002,0x00040020,0x0000016f, + 0x00000009,0x00000006,0x0004002b,0x000000c1,0x000001bc,0x00000008,0x0006002c,0x0000014e, + 0x000001bd,0x000001bc,0x000001bc,0x000000c7,0x00050036,0x00000002,0x00000004,0x00000000, + 0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000091,0x0000014d,0x00000007,0x0004003b, + 0x00000091,0x00000155,0x00000007,0x0004003b,0x00000010,0x00000163,0x00000007,0x0004003b, + 0x00000016,0x0000016b,0x00000007,0x0004003b,0x00000010,0x0000016c,0x00000007,0x0004003b, + 0x00000010,0x00000175,0x00000007,0x0004003b,0x00000016,0x00000181,0x00000007,0x0004003b, + 0x00000016,0x0000018b,0x00000007,0x0004003b,0x00000016,0x00000194,0x00000007,0x0004003b, + 0x00000016,0x0000019e,0x00000007,0x0004003b,0x00000016,0x000001a7,0x00000007,0x0004003b, + 0x00000016,0x000001a9,0x00000007,0x0004003b,0x00000016,0x000001ab,0x00000007,0x0004003b, + 0x00000016,0x000001ad,0x00000007,0x0004003b,0x00000016,0x000001af,0x00000007,0x0004003b, + 0x00000007,0x000001b1,0x00000007,0x0004003d,0x0000014e,0x00000152,0x00000150,0x0007004f, + 0x00000151,0x00000153,0x00000152,0x00000152,0x00000000,0x00000001,0x0004007c,0x00000088, + 0x00000154,0x00000153,0x0003003e,0x0000014d,0x00000154,0x0004003d,0x00000156,0x00000159, + 0x00000158,0x00040068,0x00000088,0x0000015a,0x00000159,0x0003003e,0x00000155,0x0000015a, + 0x0004003d,0x00000088,0x0000015b,0x0000014d,0x0004003d,0x00000088,0x0000015c,0x00000155, + 0x000500af,0x0000015d,0x0000015e,0x0000015b,0x0000015c,0x0004009a,0x00000024,0x0000015f, + 0x0000015e,0x000300f7,0x00000161,0x00000000,0x000400fa,0x0000015f,0x00000160,0x00000161, + 0x000200f8,0x00000160,0x000100fd,0x000200f8,0x00000161,0x0004003d,0x00000088,0x00000164, + 0x0000014d,0x0004006f,0x0000000f,0x00000165,0x00000164,0x00050050,0x0000000f,0x00000166, + 0x00000039,0x00000039,0x00050081,0x0000000f,0x00000167,0x00000165,0x00000166,0x0004003d, + 0x00000088,0x00000168,0x00000155,0x0004006f,0x0000000f,0x00000169,0x00000168,0x00050088, + 0x0000000f,0x0000016a,0x00000167,0x00000169,0x0003003e,0x00000163,0x0000016a,0x0004003d, + 0x0000000f,0x0000016d,0x00000163,0x0003003e,0x0000016c,0x0000016d,0x00050039,0x00000011, + 0x0000016e,0x00000014,0x0000016c,0x0003003e,0x0000016b,0x0000016e,0x00050041,0x0000016f, + 0x00000170,0x00000073,0x000000e1,0x0004003d,0x00000006,0x00000171,0x00000170,0x000500ba, + 0x00000024,0x00000172,0x00000171,0x0000002f,0x000300f7,0x00000174,0x00000000,0x000400fa, + 0x00000172,0x00000173,0x00000174,0x000200f8,0x00000173,0x0004003d,0x0000007c,0x00000176, + 0x0000007e,0x00040064,0x0000007b,0x00000177,0x00000176,0x00050067,0x00000088,0x00000178, + 0x00000177,0x00000074,0x0004006f,0x0000000f,0x00000179,0x00000178,0x00050050,0x0000000f, + 0x0000017a,0x00000028,0x00000028,0x00050088,0x0000000f,0x0000017b,0x0000017a,0x00000179, + 0x0004003d,0x00000088,0x0000017c,0x00000155,0x0004006f,0x0000000f,0x0000017d,0x0000017c, + 0x00050050,0x0000000f,0x0000017e,0x00000028,0x00000028,0x00050088,0x0000000f,0x0000017f, + 0x0000017e,0x0000017d,0x0007000c,0x0000000f,0x00000180,0x00000001,0x00000028,0x0000017b, + 0x0000017f,0x0003003e,0x00000175,0x00000180,0x0004003d,0x0000007c,0x00000182,0x0000007e, + 0x0004003d,0x0000000f,0x00000183,0x00000163,0x00050041,0x00000007,0x00000184,0x00000175, + 0x000000c7,0x0004003d,0x00000006,0x00000185,0x00000184,0x0004007f,0x00000006,0x00000186, + 0x00000185,0x00050050,0x0000000f,0x00000187,0x0000002f,0x00000186,0x00050081,0x0000000f, + 0x00000188,0x00000183,0x00000187,0x00070058,0x00000081,0x00000189,0x00000182,0x00000188, + 0x00000002,0x0000002f,0x0008004f,0x00000011,0x0000018a,0x00000189,0x00000189,0x00000000, + 0x00000001,0x00000002,0x0003003e,0x00000181,0x0000018a,0x0004003d,0x0000007c,0x0000018c, + 0x0000007e,0x0004003d,0x0000000f,0x0000018d,0x00000163,0x00050041,0x00000007,0x0000018e, + 0x00000175,0x000000c7,0x0004003d,0x00000006,0x0000018f,0x0000018e,0x00050050,0x0000000f, + 0x00000190,0x0000002f,0x0000018f,0x00050081,0x0000000f,0x00000191,0x0000018d,0x00000190, + 0x00070058,0x00000081,0x00000192,0x0000018c,0x00000191,0x00000002,0x0000002f,0x0008004f, + 0x00000011,0x00000193,0x00000192,0x00000192,0x00000000,0x00000001,0x00000002,0x0003003e, + 0x0000018b,0x00000193,0x0004003d,0x0000007c,0x00000195,0x0000007e,0x0004003d,0x0000000f, + 0x00000196,0x00000163,0x00050041,0x00000007,0x00000197,0x00000175,0x000000c2,0x0004003d, + 0x00000006,0x00000198,0x00000197,0x0004007f,0x00000006,0x00000199,0x00000198,0x00050050, + 0x0000000f,0x0000019a,0x00000199,0x0000002f,0x00050081,0x0000000f,0x0000019b,0x00000196, + 0x0000019a,0x00070058,0x00000081,0x0000019c,0x00000195,0x0000019b,0x00000002,0x0000002f, + 0x0008004f,0x00000011,0x0000019d,0x0000019c,0x0000019c,0x00000000,0x00000001,0x00000002, + 0x0003003e,0x00000194,0x0000019d,0x0004003d,0x0000007c,0x0000019f,0x0000007e,0x0004003d, + 0x0000000f,0x000001a0,0x00000163,0x00050041,0x00000007,0x000001a1,0x00000175,0x000000c2, + 0x0004003d,0x00000006,0x000001a2,0x000001a1,0x00050050,0x0000000f,0x000001a3,0x000001a2, + 0x0000002f,0x00050081,0x0000000f,0x000001a4,0x000001a0,0x000001a3,0x00070058,0x00000081, + 0x000001a5,0x0000019f,0x000001a4,0x00000002,0x0000002f,0x0008004f,0x00000011,0x000001a6, + 0x000001a5,0x000001a5,0x00000000,0x00000001,0x00000002,0x0003003e,0x0000019e,0x000001a6, + 0x0004003d,0x00000011,0x000001a8,0x0000016b,0x0003003e,0x000001a7,0x000001a8,0x0004003d, + 0x00000011,0x000001aa,0x00000181,0x0003003e,0x000001a9,0x000001aa,0x0004003d,0x00000011, + 0x000001ac,0x0000018b,0x0003003e,0x000001ab,0x000001ac,0x0004003d,0x00000011,0x000001ae, + 0x00000194,0x0003003e,0x000001ad,0x000001ae,0x0004003d,0x00000011,0x000001b0,0x0000019e, + 0x0003003e,0x000001af,0x000001b0,0x00050041,0x0000016f,0x000001b2,0x00000073,0x000000e1, + 0x0004003d,0x00000006,0x000001b3,0x000001b2,0x0003003e,0x000001b1,0x000001b3,0x000a0039, + 0x00000011,0x000001b4,0x0000001e,0x000001a7,0x000001a9,0x000001ab,0x000001ad,0x000001af, + 0x000001b1,0x0003003e,0x0000016b,0x000001b4,0x000200f9,0x00000174,0x000200f8,0x00000174, + 0x0004003d,0x00000156,0x000001b5,0x00000158,0x0004003d,0x00000088,0x000001b6,0x0000014d, + 0x0004003d,0x00000011,0x000001b7,0x0000016b,0x00050051,0x00000006,0x000001b8,0x000001b7, + 0x00000000,0x00050051,0x00000006,0x000001b9,0x000001b7,0x00000001,0x00050051,0x00000006, + 0x000001ba,0x000001b7,0x00000002,0x00070050,0x00000081,0x000001bb,0x000001b8,0x000001b9, + 0x000001ba,0x00000028,0x00040063,0x000001b5,0x000001b6,0x000001bb,0x000100fd,0x00010038, + 0x00050036,0x00000006,0x0000000a,0x00000000,0x00000008,0x00030037,0x00000007,0x00000009, + 0x000200f8,0x0000000b,0x0004003b,0x00000007,0x00000031,0x00000007,0x0004003d,0x00000006, + 0x00000020,0x00000009,0x0006000c,0x00000006,0x00000021,0x00000001,0x00000004,0x00000020, + 0x0003003e,0x00000009,0x00000021,0x0004003d,0x00000006,0x00000022,0x00000009,0x000500b8, + 0x00000024,0x00000025,0x00000022,0x00000023,0x000300f7,0x00000027,0x00000000,0x000400fa, + 0x00000025,0x00000026,0x00000027,0x000200f8,0x00000026,0x000200fe,0x00000028,0x000200f8, + 0x00000027,0x0004003d,0x00000006,0x0000002a,0x00000009,0x000500be,0x00000024,0x0000002c, + 0x0000002a,0x0000002b,0x000300f7,0x0000002e,0x00000000,0x000400fa,0x0000002c,0x0000002d, + 0x0000002e,0x000200f8,0x0000002d,0x000200fe,0x0000002f,0x000200f8,0x0000002e,0x0004003d, + 0x00000006,0x00000033,0x00000009,0x00050085,0x00000006,0x00000034,0x00000032,0x00000033, + 0x0003003e,0x00000031,0x00000034,0x0004003d,0x00000006,0x00000035,0x00000031,0x0006000c, + 0x00000006,0x00000036,0x00000001,0x0000000d,0x00000035,0x00050085,0x00000006,0x00000037, + 0x0000002b,0x00000036,0x0004003d,0x00000006,0x00000038,0x00000031,0x00050085,0x00000006, + 0x0000003a,0x00000038,0x00000039,0x0006000c,0x00000006,0x0000003b,0x00000001,0x0000000d, + 0x0000003a,0x00050085,0x00000006,0x0000003c,0x00000037,0x0000003b,0x0004003d,0x00000006, + 0x0000003d,0x00000031,0x0004003d,0x00000006,0x0000003e,0x00000031,0x00050085,0x00000006, + 0x0000003f,0x0000003d,0x0000003e,0x00050088,0x00000006,0x00000040,0x0000003c,0x0000003f, + 0x000200fe,0x00000040,0x00010038,0x00050036,0x00000006,0x0000000d,0x00000000,0x00000008, + 0x00030037,0x00000007,0x0000000c,0x000200f8,0x0000000e,0x0004003d,0x00000006,0x00000043, + 0x0000000c,0x0006000c,0x00000006,0x00000044,0x00000001,0x00000004,0x00000043,0x0003003e, + 0x0000000c,0x00000044,0x0004003d,0x00000006,0x00000045,0x0000000c,0x000500b8,0x00000024, + 0x00000046,0x00000045,0x00000028,0x000300f7,0x00000048,0x00000000,0x000400fa,0x00000046, + 0x00000047,0x00000048,0x000200f8,0x00000047,0x0004003d,0x00000006,0x0000004a,0x0000000c, + 0x00050085,0x00000006,0x0000004b,0x00000049,0x0000004a,0x0004003d,0x00000006,0x0000004c, + 0x0000000c,0x00050085,0x00000006,0x0000004d,0x0000004b,0x0000004c,0x0004003d,0x00000006, + 0x0000004e,0x0000000c,0x00050085,0x00000006,0x0000004f,0x0000004d,0x0000004e,0x0004003d, + 0x00000006,0x00000051,0x0000000c,0x00050085,0x00000006,0x00000052,0x00000050,0x00000051, 0x0004003d,0x00000006,0x00000053,0x0000000c,0x00050085,0x00000006,0x00000054,0x00000052, - 0x00000053,0x0004003d,0x00000006,0x00000055,0x0000000c,0x00050085,0x00000006,0x00000056, - 0x00000054,0x00000055,0x0004003d,0x00000006,0x00000057,0x0000000c,0x00050085,0x00000006, - 0x00000058,0x00000056,0x00000057,0x0004003d,0x00000006,0x00000059,0x0000000c,0x00050085, - 0x00000006,0x0000005a,0x00000046,0x00000059,0x0004003d,0x00000006,0x0000005b,0x0000000c, - 0x00050085,0x00000006,0x0000005c,0x0000005a,0x0000005b,0x00050081,0x00000006,0x0000005d, - 0x00000058,0x0000005c,0x0004003d,0x00000006,0x0000005f,0x0000000c,0x00050085,0x00000006, - 0x00000060,0x0000005e,0x0000005f,0x00050083,0x00000006,0x00000061,0x0000005d,0x00000060, - 0x00050081,0x00000006,0x00000062,0x00000061,0x00000021,0x000200fe,0x00000062,0x000200f8, - 0x00000051,0x000200fe,0x00000025,0x00010038,0x00050036,0x00000011,0x00000014,0x00000000, - 0x00000012,0x00030037,0x00000010,0x00000013,0x000200f8,0x00000015,0x0004003b,0x00000010, - 0x0000007b,0x00000007,0x0004003b,0x00000010,0x00000081,0x00000007,0x0004003b,0x00000087, - 0x00000088,0x00000007,0x0004003b,0x00000010,0x0000008c,0x00000007,0x0004003b,0x00000091, - 0x00000092,0x00000007,0x0004003b,0x00000007,0x00000094,0x00000007,0x0004003b,0x00000095, - 0x00000096,0x00000007,0x0004003b,0x00000095,0x000000a0,0x00000007,0x0004003b,0x00000010, - 0x000000a8,0x00000007,0x0004003b,0x00000007,0x000000b0,0x00000007,0x0004003b,0x00000007, - 0x000000b4,0x00000007,0x0004003b,0x00000007,0x000000b7,0x00000007,0x0004003b,0x00000007, - 0x000000bd,0x00000007,0x0004003b,0x00000007,0x000000c4,0x00000007,0x0004003b,0x00000007, - 0x000000c8,0x00000007,0x00050041,0x0000006b,0x0000006c,0x00000069,0x0000006a,0x0004003d, - 0x00000066,0x0000006d,0x0000006c,0x000500aa,0x0000001a,0x0000006e,0x0000006d,0x0000006a, - 0x000300f7,0x00000070,0x00000000,0x000400fa,0x0000006e,0x0000006f,0x00000070,0x000200f8, - 0x0000006f,0x0004003d,0x00000072,0x00000075,0x00000074,0x0004003d,0x0000000f,0x00000076, - 0x00000013,0x00070058,0x00000077,0x00000078,0x00000075,0x00000076,0x00000002,0x00000025, - 0x0008004f,0x00000011,0x00000079,0x00000078,0x00000078,0x00000000,0x00000001,0x00000002, - 0x000200fe,0x00000079,0x000200f8,0x00000070,0x0004003d,0x00000072,0x0000007c,0x00000074, - 0x00040064,0x00000071,0x0000007d,0x0000007c,0x00050067,0x0000007e,0x0000007f,0x0000007d, - 0x0000006a,0x0004006f,0x0000000f,0x00000080,0x0000007f,0x0003003e,0x0000007b,0x00000080, - 0x0004003d,0x0000000f,0x00000082,0x00000013,0x0004003d,0x0000000f,0x00000083,0x0000007b, - 0x00050085,0x0000000f,0x00000084,0x00000082,0x00000083,0x00050050,0x0000000f,0x00000085, - 0x0000002f,0x0000002f,0x00050083,0x0000000f,0x00000086,0x00000084,0x00000085,0x0003003e, - 0x00000081,0x00000086,0x0004003d,0x0000000f,0x00000089,0x00000081,0x0006000c,0x0000000f, - 0x0000008a,0x00000001,0x00000008,0x00000089,0x0004006e,0x0000007e,0x0000008b,0x0000008a, - 0x0003003e,0x00000088,0x0000008b,0x0004003d,0x0000000f,0x0000008d,0x00000081,0x0004003d, - 0x0000007e,0x0000008e,0x00000088,0x0004006f,0x0000000f,0x0000008f,0x0000008e,0x00050083, - 0x0000000f,0x00000090,0x0000008d,0x0000008f,0x0003003e,0x0000008c,0x00000090,0x0003003e, - 0x00000092,0x00000093,0x0003003e,0x00000094,0x00000025,0x0003003e,0x00000096,0x00000097, - 0x000200f9,0x00000098,0x000200f8,0x00000098,0x000400f6,0x0000009a,0x0000009b,0x00000000, - 0x000200f9,0x0000009c,0x000200f8,0x0000009c,0x0004003d,0x00000066,0x0000009d,0x00000096, - 0x000500b3,0x0000001a,0x0000009f,0x0000009d,0x0000009e,0x000400fa,0x0000009f,0x00000099, - 0x0000009a,0x000200f8,0x00000099,0x0003003e,0x000000a0,0x00000097,0x000200f9,0x000000a1, - 0x000200f8,0x000000a1,0x000400f6,0x000000a3,0x000000a4,0x00000000,0x000200f9,0x000000a5, - 0x000200f8,0x000000a5,0x0004003d,0x00000066,0x000000a6,0x000000a0,0x000500b3,0x0000001a, - 0x000000a7,0x000000a6,0x0000009e,0x000400fa,0x000000a7,0x000000a2,0x000000a3,0x000200f8, - 0x000000a2,0x0004003d,0x00000066,0x000000a9,0x000000a0,0x0004006f,0x00000006,0x000000aa, - 0x000000a9,0x0004003d,0x00000066,0x000000ab,0x00000096,0x0004006f,0x00000006,0x000000ac, - 0x000000ab,0x00050050,0x0000000f,0x000000ad,0x000000aa,0x000000ac,0x0004003d,0x0000000f, - 0x000000ae,0x0000008c,0x00050083,0x0000000f,0x000000af,0x000000ad,0x000000ae,0x0003003e, - 0x000000a8,0x000000af,0x00050041,0x0000006b,0x000000b1,0x00000069,0x0000006a,0x0004003d, - 0x00000066,0x000000b2,0x000000b1,0x000500aa,0x0000001a,0x000000b3,0x000000b2,0x0000009e, - 0x000300f7,0x000000b6,0x00000000,0x000400fa,0x000000b3,0x000000b5,0x000000c3,0x000200f8, - 0x000000b5,0x00050041,0x00000007,0x000000ba,0x000000a8,0x000000b9,0x0004003d,0x00000006, - 0x000000bb,0x000000ba,0x0003003e,0x000000b7,0x000000bb,0x00050039,0x00000006,0x000000bc, - 0x0000000a,0x000000b7,0x00050041,0x00000007,0x000000bf,0x000000a8,0x000000be,0x0004003d, - 0x00000006,0x000000c0,0x000000bf,0x0003003e,0x000000bd,0x000000c0,0x00050039,0x00000006, - 0x000000c1,0x0000000a,0x000000bd,0x00050085,0x00000006,0x000000c2,0x000000bc,0x000000c1, - 0x0003003e,0x000000b4,0x000000c2,0x000200f9,0x000000b6,0x000200f8,0x000000c3,0x00050041, - 0x00000007,0x000000c5,0x000000a8,0x000000b9,0x0004003d,0x00000006,0x000000c6,0x000000c5, - 0x0003003e,0x000000c4,0x000000c6,0x00050039,0x00000006,0x000000c7,0x0000000d,0x000000c4, - 0x00050041,0x00000007,0x000000c9,0x000000a8,0x000000be,0x0004003d,0x00000006,0x000000ca, - 0x000000c9,0x0003003e,0x000000c8,0x000000ca,0x00050039,0x00000006,0x000000cb,0x0000000d, - 0x000000c8,0x00050085,0x00000006,0x000000cc,0x000000c7,0x000000cb,0x0003003e,0x000000b4, - 0x000000cc,0x000200f9,0x000000b6,0x000200f8,0x000000b6,0x0004003d,0x00000006,0x000000cd, - 0x000000b4,0x0003003e,0x000000b0,0x000000cd,0x0004003d,0x00000006,0x000000ce,0x000000b0, - 0x0004003d,0x00000072,0x000000cf,0x00000074,0x0004003d,0x0000007e,0x000000d0,0x00000088, - 0x0004003d,0x00000066,0x000000d1,0x000000a0,0x0004003d,0x00000066,0x000000d2,0x00000096, - 0x00050050,0x0000007e,0x000000d3,0x000000d1,0x000000d2,0x00050080,0x0000007e,0x000000d4, - 0x000000d0,0x000000d3,0x0004003d,0x0000000f,0x000000d6,0x0000007b,0x0004006e,0x0000007e, - 0x000000d7,0x000000d6,0x00050050,0x0000007e,0x000000d9,0x000000d8,0x000000d8,0x00050082, - 0x0000007e,0x000000da,0x000000d7,0x000000d9,0x0008000c,0x0000007e,0x000000db,0x00000001, - 0x0000002d,0x000000d4,0x000000d5,0x000000da,0x00040064,0x00000071,0x000000dc,0x000000cf, - 0x0007005f,0x00000077,0x000000dd,0x000000dc,0x000000db,0x00000002,0x0000006a,0x0008004f, - 0x00000011,0x000000de,0x000000dd,0x000000dd,0x00000000,0x00000001,0x00000002,0x0005008e, - 0x00000011,0x000000df,0x000000de,0x000000ce,0x0004003d,0x00000011,0x000000e0,0x00000092, - 0x00050081,0x00000011,0x000000e1,0x000000e0,0x000000df,0x0003003e,0x00000092,0x000000e1, - 0x0004003d,0x00000006,0x000000e2,0x000000b0,0x0004003d,0x00000006,0x000000e3,0x00000094, - 0x00050081,0x00000006,0x000000e4,0x000000e3,0x000000e2,0x0003003e,0x00000094,0x000000e4, - 0x000200f9,0x000000a4,0x000200f8,0x000000a4,0x0004003d,0x00000066,0x000000e5,0x000000a0, - 0x00050080,0x00000066,0x000000e6,0x000000e5,0x000000d8,0x0003003e,0x000000a0,0x000000e6, - 0x000200f9,0x000000a1,0x000200f8,0x000000a3,0x000200f9,0x0000009b,0x000200f8,0x0000009b, - 0x0004003d,0x00000066,0x000000e7,0x00000096,0x00050080,0x00000066,0x000000e8,0x000000e7, - 0x000000d8,0x0003003e,0x00000096,0x000000e8,0x000200f9,0x00000098,0x000200f8,0x0000009a, - 0x0004003d,0x00000011,0x000000e9,0x00000092,0x0004003d,0x00000006,0x000000ea,0x00000094, - 0x00060050,0x00000011,0x000000eb,0x000000ea,0x000000ea,0x000000ea,0x00050088,0x00000011, - 0x000000ec,0x000000e9,0x000000eb,0x000200fe,0x000000ec,0x00010038 + 0x00000053,0x00050083,0x00000006,0x00000055,0x0000004f,0x00000054,0x00050081,0x00000006, + 0x00000056,0x00000055,0x00000028,0x000200fe,0x00000056,0x000200f8,0x00000048,0x0004003d, + 0x00000006,0x00000058,0x0000000c,0x000500b8,0x00000024,0x00000059,0x00000058,0x0000002b, + 0x000300f7,0x0000005b,0x00000000,0x000400fa,0x00000059,0x0000005a,0x0000005b,0x000200f8, + 0x0000005a,0x0004003d,0x00000006,0x0000005d,0x0000000c,0x00050085,0x00000006,0x0000005e, + 0x0000005c,0x0000005d,0x0004003d,0x00000006,0x0000005f,0x0000000c,0x00050085,0x00000006, + 0x00000060,0x0000005e,0x0000005f,0x0004003d,0x00000006,0x00000061,0x0000000c,0x00050085, + 0x00000006,0x00000062,0x00000060,0x00000061,0x0004003d,0x00000006,0x00000063,0x0000000c, + 0x00050085,0x00000006,0x00000064,0x00000050,0x00000063,0x0004003d,0x00000006,0x00000065, + 0x0000000c,0x00050085,0x00000006,0x00000066,0x00000064,0x00000065,0x00050081,0x00000006, + 0x00000067,0x00000062,0x00000066,0x0004003d,0x00000006,0x00000069,0x0000000c,0x00050085, + 0x00000006,0x0000006a,0x00000068,0x00000069,0x00050083,0x00000006,0x0000006b,0x00000067, + 0x0000006a,0x00050081,0x00000006,0x0000006c,0x0000006b,0x0000002b,0x000200fe,0x0000006c, + 0x000200f8,0x0000005b,0x000200fe,0x0000002f,0x00010038,0x00050036,0x00000011,0x00000014, + 0x00000000,0x00000012,0x00030037,0x00000010,0x00000013,0x000200f8,0x00000015,0x0004003b, + 0x00000010,0x00000085,0x00000007,0x0004003b,0x00000010,0x0000008b,0x00000007,0x0004003b, + 0x00000091,0x00000092,0x00000007,0x0004003b,0x00000010,0x00000096,0x00000007,0x0004003b, + 0x00000016,0x0000009b,0x00000007,0x0004003b,0x00000007,0x0000009d,0x00000007,0x0004003b, + 0x0000009e,0x0000009f,0x00000007,0x0004003b,0x0000009e,0x000000a9,0x00000007,0x0004003b, + 0x00000010,0x000000b1,0x00000007,0x0004003b,0x00000007,0x000000b9,0x00000007,0x0004003b, + 0x00000007,0x000000bd,0x00000007,0x0004003b,0x00000007,0x000000c0,0x00000007,0x0004003b, + 0x00000007,0x000000c6,0x00000007,0x0004003b,0x00000007,0x000000cd,0x00000007,0x0004003b, + 0x00000007,0x000000d1,0x00000007,0x00050041,0x00000075,0x00000076,0x00000073,0x00000074, + 0x0004003d,0x00000070,0x00000077,0x00000076,0x000500aa,0x00000024,0x00000078,0x00000077, + 0x00000074,0x000300f7,0x0000007a,0x00000000,0x000400fa,0x00000078,0x00000079,0x0000007a, + 0x000200f8,0x00000079,0x0004003d,0x0000007c,0x0000007f,0x0000007e,0x0004003d,0x0000000f, + 0x00000080,0x00000013,0x00070058,0x00000081,0x00000082,0x0000007f,0x00000080,0x00000002, + 0x0000002f,0x0008004f,0x00000011,0x00000083,0x00000082,0x00000082,0x00000000,0x00000001, + 0x00000002,0x000200fe,0x00000083,0x000200f8,0x0000007a,0x0004003d,0x0000007c,0x00000086, + 0x0000007e,0x00040064,0x0000007b,0x00000087,0x00000086,0x00050067,0x00000088,0x00000089, + 0x00000087,0x00000074,0x0004006f,0x0000000f,0x0000008a,0x00000089,0x0003003e,0x00000085, + 0x0000008a,0x0004003d,0x0000000f,0x0000008c,0x00000013,0x0004003d,0x0000000f,0x0000008d, + 0x00000085,0x00050085,0x0000000f,0x0000008e,0x0000008c,0x0000008d,0x00050050,0x0000000f, + 0x0000008f,0x00000039,0x00000039,0x00050083,0x0000000f,0x00000090,0x0000008e,0x0000008f, + 0x0003003e,0x0000008b,0x00000090,0x0004003d,0x0000000f,0x00000093,0x0000008b,0x0006000c, + 0x0000000f,0x00000094,0x00000001,0x00000008,0x00000093,0x0004006e,0x00000088,0x00000095, + 0x00000094,0x0003003e,0x00000092,0x00000095,0x0004003d,0x0000000f,0x00000097,0x0000008b, + 0x0004003d,0x00000088,0x00000098,0x00000092,0x0004006f,0x0000000f,0x00000099,0x00000098, + 0x00050083,0x0000000f,0x0000009a,0x00000097,0x00000099,0x0003003e,0x00000096,0x0000009a, + 0x0003003e,0x0000009b,0x0000009c,0x0003003e,0x0000009d,0x0000002f,0x0003003e,0x0000009f, + 0x000000a0,0x000200f9,0x000000a1,0x000200f8,0x000000a1,0x000400f6,0x000000a3,0x000000a4, + 0x00000000,0x000200f9,0x000000a5,0x000200f8,0x000000a5,0x0004003d,0x00000070,0x000000a6, + 0x0000009f,0x000500b3,0x00000024,0x000000a8,0x000000a6,0x000000a7,0x000400fa,0x000000a8, + 0x000000a2,0x000000a3,0x000200f8,0x000000a2,0x0003003e,0x000000a9,0x000000a0,0x000200f9, + 0x000000aa,0x000200f8,0x000000aa,0x000400f6,0x000000ac,0x000000ad,0x00000000,0x000200f9, + 0x000000ae,0x000200f8,0x000000ae,0x0004003d,0x00000070,0x000000af,0x000000a9,0x000500b3, + 0x00000024,0x000000b0,0x000000af,0x000000a7,0x000400fa,0x000000b0,0x000000ab,0x000000ac, + 0x000200f8,0x000000ab,0x0004003d,0x00000070,0x000000b2,0x000000a9,0x0004006f,0x00000006, + 0x000000b3,0x000000b2,0x0004003d,0x00000070,0x000000b4,0x0000009f,0x0004006f,0x00000006, + 0x000000b5,0x000000b4,0x00050050,0x0000000f,0x000000b6,0x000000b3,0x000000b5,0x0004003d, + 0x0000000f,0x000000b7,0x00000096,0x00050083,0x0000000f,0x000000b8,0x000000b6,0x000000b7, + 0x0003003e,0x000000b1,0x000000b8,0x00050041,0x00000075,0x000000ba,0x00000073,0x00000074, + 0x0004003d,0x00000070,0x000000bb,0x000000ba,0x000500aa,0x00000024,0x000000bc,0x000000bb, + 0x000000a7,0x000300f7,0x000000bf,0x00000000,0x000400fa,0x000000bc,0x000000be,0x000000cc, + 0x000200f8,0x000000be,0x00050041,0x00000007,0x000000c3,0x000000b1,0x000000c2,0x0004003d, + 0x00000006,0x000000c4,0x000000c3,0x0003003e,0x000000c0,0x000000c4,0x00050039,0x00000006, + 0x000000c5,0x0000000a,0x000000c0,0x00050041,0x00000007,0x000000c8,0x000000b1,0x000000c7, + 0x0004003d,0x00000006,0x000000c9,0x000000c8,0x0003003e,0x000000c6,0x000000c9,0x00050039, + 0x00000006,0x000000ca,0x0000000a,0x000000c6,0x00050085,0x00000006,0x000000cb,0x000000c5, + 0x000000ca,0x0003003e,0x000000bd,0x000000cb,0x000200f9,0x000000bf,0x000200f8,0x000000cc, + 0x00050041,0x00000007,0x000000ce,0x000000b1,0x000000c2,0x0004003d,0x00000006,0x000000cf, + 0x000000ce,0x0003003e,0x000000cd,0x000000cf,0x00050039,0x00000006,0x000000d0,0x0000000d, + 0x000000cd,0x00050041,0x00000007,0x000000d2,0x000000b1,0x000000c7,0x0004003d,0x00000006, + 0x000000d3,0x000000d2,0x0003003e,0x000000d1,0x000000d3,0x00050039,0x00000006,0x000000d4, + 0x0000000d,0x000000d1,0x00050085,0x00000006,0x000000d5,0x000000d0,0x000000d4,0x0003003e, + 0x000000bd,0x000000d5,0x000200f9,0x000000bf,0x000200f8,0x000000bf,0x0004003d,0x00000006, + 0x000000d6,0x000000bd,0x0003003e,0x000000b9,0x000000d6,0x0004003d,0x00000006,0x000000d7, + 0x000000b9,0x0004003d,0x0000007c,0x000000d8,0x0000007e,0x0004003d,0x00000088,0x000000d9, + 0x00000092,0x0004003d,0x00000070,0x000000da,0x000000a9,0x0004003d,0x00000070,0x000000db, + 0x0000009f,0x00050050,0x00000088,0x000000dc,0x000000da,0x000000db,0x00050080,0x00000088, + 0x000000dd,0x000000d9,0x000000dc,0x0004003d,0x0000000f,0x000000df,0x00000085,0x0004006e, + 0x00000088,0x000000e0,0x000000df,0x00050050,0x00000088,0x000000e2,0x000000e1,0x000000e1, + 0x00050082,0x00000088,0x000000e3,0x000000e0,0x000000e2,0x0008000c,0x00000088,0x000000e4, + 0x00000001,0x0000002d,0x000000dd,0x000000de,0x000000e3,0x00040064,0x0000007b,0x000000e5, + 0x000000d8,0x0007005f,0x00000081,0x000000e6,0x000000e5,0x000000e4,0x00000002,0x00000074, + 0x0008004f,0x00000011,0x000000e7,0x000000e6,0x000000e6,0x00000000,0x00000001,0x00000002, + 0x0005008e,0x00000011,0x000000e8,0x000000e7,0x000000d7,0x0004003d,0x00000011,0x000000e9, + 0x0000009b,0x00050081,0x00000011,0x000000ea,0x000000e9,0x000000e8,0x0003003e,0x0000009b, + 0x000000ea,0x0004003d,0x00000006,0x000000eb,0x000000b9,0x0004003d,0x00000006,0x000000ec, + 0x0000009d,0x00050081,0x00000006,0x000000ed,0x000000ec,0x000000eb,0x0003003e,0x0000009d, + 0x000000ed,0x000200f9,0x000000ad,0x000200f8,0x000000ad,0x0004003d,0x00000070,0x000000ee, + 0x000000a9,0x00050080,0x00000070,0x000000ef,0x000000ee,0x000000e1,0x0003003e,0x000000a9, + 0x000000ef,0x000200f9,0x000000aa,0x000200f8,0x000000ac,0x000200f9,0x000000a4,0x000200f8, + 0x000000a4,0x0004003d,0x00000070,0x000000f0,0x0000009f,0x00050080,0x00000070,0x000000f1, + 0x000000f0,0x000000e1,0x0003003e,0x0000009f,0x000000f1,0x000200f9,0x000000a1,0x000200f8, + 0x000000a3,0x0004003d,0x00000011,0x000000f2,0x0000009b,0x0004003d,0x00000006,0x000000f3, + 0x0000009d,0x00060050,0x00000011,0x000000f4,0x000000f3,0x000000f3,0x000000f3,0x00050088, + 0x00000011,0x000000f5,0x000000f2,0x000000f4,0x000200fe,0x000000f5,0x00010038,0x00050036, + 0x00000011,0x0000001e,0x00000000,0x00000017,0x00030037,0x00000016,0x00000018,0x00030037, + 0x00000016,0x00000019,0x00030037,0x00000016,0x0000001a,0x00030037,0x00000016,0x0000001b, + 0x00030037,0x00000016,0x0000001c,0x00030037,0x00000007,0x0000001d,0x000200f8,0x0000001f, + 0x0004003b,0x00000016,0x000000f8,0x00000007,0x0004003b,0x00000016,0x00000100,0x00000007, + 0x0004003b,0x00000016,0x00000108,0x00000007,0x0004003b,0x00000016,0x0000010c,0x00000007, + 0x0004003b,0x00000016,0x00000110,0x00000007,0x0004003b,0x00000016,0x00000118,0x00000007, + 0x0004003b,0x00000016,0x00000122,0x00000007,0x0004003b,0x00000007,0x00000126,0x00000007, + 0x0004003b,0x00000016,0x00000136,0x00000007,0x0004003d,0x00000011,0x000000f9,0x00000019, + 0x0004003d,0x00000011,0x000000fa,0x0000001a,0x0007000c,0x00000011,0x000000fb,0x00000001, + 0x00000025,0x000000f9,0x000000fa,0x0004003d,0x00000011,0x000000fc,0x0000001b,0x0004003d, + 0x00000011,0x000000fd,0x0000001c,0x0007000c,0x00000011,0x000000fe,0x00000001,0x00000025, + 0x000000fc,0x000000fd,0x0007000c,0x00000011,0x000000ff,0x00000001,0x00000025,0x000000fb, + 0x000000fe,0x0003003e,0x000000f8,0x000000ff,0x0004003d,0x00000011,0x00000101,0x00000019, + 0x0004003d,0x00000011,0x00000102,0x0000001a,0x0007000c,0x00000011,0x00000103,0x00000001, + 0x00000028,0x00000101,0x00000102,0x0004003d,0x00000011,0x00000104,0x0000001b,0x0004003d, + 0x00000011,0x00000105,0x0000001c,0x0007000c,0x00000011,0x00000106,0x00000001,0x00000028, + 0x00000104,0x00000105,0x0007000c,0x00000011,0x00000107,0x00000001,0x00000028,0x00000103, + 0x00000106,0x0003003e,0x00000100,0x00000107,0x0004003d,0x00000011,0x00000109,0x000000f8, + 0x0004003d,0x00000011,0x0000010a,0x00000018,0x0007000c,0x00000011,0x0000010b,0x00000001, + 0x00000025,0x00000109,0x0000010a,0x0003003e,0x00000108,0x0000010b,0x0004003d,0x00000011, + 0x0000010d,0x00000100,0x0004003d,0x00000011,0x0000010e,0x00000018,0x0007000c,0x00000011, + 0x0000010f,0x00000001,0x00000028,0x0000010d,0x0000010e,0x0003003e,0x0000010c,0x0000010f, + 0x0004003d,0x00000011,0x00000111,0x00000108,0x0004003d,0x00000011,0x00000112,0x0000010c, + 0x0005008e,0x00000011,0x00000113,0x00000112,0x00000068,0x0007000c,0x00000011,0x00000116, + 0x00000001,0x00000028,0x00000113,0x00000115,0x00050088,0x00000011,0x00000117,0x00000111, + 0x00000116,0x0003003e,0x00000110,0x00000117,0x0004003d,0x00000011,0x00000119,0x0000010c, + 0x00060050,0x00000011,0x0000011a,0x00000028,0x00000028,0x00000028,0x00050083,0x00000011, + 0x0000011b,0x0000011a,0x00000119,0x0004003d,0x00000011,0x0000011c,0x000000f8,0x0005008e, + 0x00000011,0x0000011d,0x0000011c,0x00000068,0x00060050,0x00000011,0x0000011e,0x00000068, + 0x00000068,0x00000068,0x00050083,0x00000011,0x0000011f,0x0000011e,0x0000011d,0x0007000c, + 0x00000011,0x00000120,0x00000001,0x00000028,0x0000011f,0x00000115,0x00050088,0x00000011, + 0x00000121,0x0000011b,0x00000120,0x0003003e,0x00000118,0x00000121,0x0004003d,0x00000011, + 0x00000123,0x00000110,0x0004003d,0x00000011,0x00000124,0x00000118,0x0007000c,0x00000011, + 0x00000125,0x00000001,0x00000025,0x00000123,0x00000124,0x0003003e,0x00000122,0x00000125, + 0x00050041,0x00000007,0x00000127,0x00000122,0x000000c2,0x0004003d,0x00000006,0x00000128, + 0x00000127,0x00050041,0x00000007,0x00000129,0x00000122,0x000000c7,0x0004003d,0x00000006, + 0x0000012a,0x00000129,0x0007000c,0x00000006,0x0000012b,0x00000001,0x00000025,0x00000128, + 0x0000012a,0x00050041,0x00000007,0x0000012d,0x00000122,0x0000012c,0x0004003d,0x00000006, + 0x0000012e,0x0000012d,0x0007000c,0x00000006,0x0000012f,0x00000001,0x00000025,0x0000012b, + 0x0000012e,0x0008000c,0x00000006,0x00000131,0x00000001,0x0000002b,0x0000012f,0x0000002f, + 0x00000130,0x0004007f,0x00000006,0x00000132,0x00000131,0x0004003d,0x00000006,0x00000133, + 0x0000001d,0x0008000c,0x00000006,0x00000134,0x00000001,0x0000002b,0x00000133,0x0000002f, + 0x00000028,0x00050085,0x00000006,0x00000135,0x00000132,0x00000134,0x0003003e,0x00000126, + 0x00000135,0x0004003d,0x00000011,0x00000137,0x00000018,0x0004003d,0x00000006,0x00000138, + 0x00000126,0x0004003d,0x00000011,0x00000139,0x00000019,0x0004003d,0x00000011,0x0000013a, + 0x0000001a,0x00050081,0x00000011,0x0000013b,0x00000139,0x0000013a,0x0004003d,0x00000011, + 0x0000013c,0x0000001b,0x00050081,0x00000011,0x0000013d,0x0000013b,0x0000013c,0x0004003d, + 0x00000011,0x0000013e,0x0000001c,0x00050081,0x00000011,0x0000013f,0x0000013d,0x0000013e, + 0x0005008e,0x00000011,0x00000140,0x0000013f,0x00000138,0x00050081,0x00000011,0x00000141, + 0x00000137,0x00000140,0x0004003d,0x00000006,0x00000142,0x00000126,0x00050085,0x00000006, + 0x00000143,0x00000068,0x00000142,0x00050081,0x00000006,0x00000144,0x00000028,0x00000143, + 0x00060050,0x00000011,0x00000145,0x00000144,0x00000144,0x00000144,0x00050088,0x00000011, + 0x00000146,0x00000141,0x00000145,0x0003003e,0x00000136,0x00000146,0x0004003d,0x00000011, + 0x00000147,0x00000136,0x0004003d,0x00000011,0x00000148,0x00000108,0x0004003d,0x00000011, + 0x00000149,0x0000010c,0x0008000c,0x00000011,0x0000014a,0x00000001,0x0000002b,0x00000147, + 0x00000148,0x00000149,0x000200fe,0x0000014a,0x00010038 }; diff --git a/gpu/vk/vk_framegen.cpp b/gpu/vk/vk_framegen.cpp index 68cf6c0f..00e10e71 100644 --- a/gpu/vk/vk_framegen.cpp +++ b/gpu/vk/vk_framegen.cpp @@ -418,7 +418,8 @@ VkImage framegen_scale(VkCommandBuffer cmd, VkImageView src, VkImage image, uint static bool reported = false; if (report && !reported) { reported = true; - logf("vk: upscale dispatched: mode %d, sharpness %d, source %ux%u, crop request %d,%d %dx%d, destination %ux%u", + logf("vk: upscale dispatched: mode %d, sharpness %d%% (of RCAS's strongest, neighbours one source pixel apart), source %ux%u, " + "crop request %d,%d %dx%d, destination %ux%u", opts.upscale, opts.sharpness, sw, sh, crop ? crop[0] : 0, crop ? crop[1] : 0, crop ? crop[2] : (int)sw, crop ? crop[3] : (int)sh, dw, dh); } diff --git a/tests/run_all.py b/tests/run_all.py index c95fa44c..bc2ef00d 100644 --- a/tests/run_all.py +++ b/tests/run_all.py @@ -39,6 +39,7 @@ "tests/test_text_speed.py": ["--cc", "gcc"], "tests/test_audio_in.py": ["--cc", "gcc", "--cxx", "g++"], "tests/test_upscale_fallback.py": ["--cxx", "g++"], + "tests/test_fg_scale_sharpen.py": ["--cxx", "g++"], "tests/test_taau_env_lookup.py": ["--cxx", "g++"], "tests/test_target_overlap.py": ["--cxx", "g++"], "tests/test_menu_hit.py": ["--cxx", "g++"], diff --git a/tests/test_fg_scale_sharpen.py b/tests/test_fg_scale_sharpen.py new file mode 100644 index 00000000..6722490d --- /dev/null +++ b/tests/test_fg_scale_sharpen.py @@ -0,0 +1,156 @@ +"""The window pass's Sharpness (gpu/vk/shaders/fg_scale.comp): its neighbours are one picture (source) pixel apart, not one +window pixel (inside the same picture pixel when the window is the larger, so Sharpness did next to nothing), and its +per-pixel math, the shader's own sharpen() compiled as C++, is the picture unchanged at 0, never past the lightest or +darkest pixel around it nor outside 0..1 (no halos, no clipping) at any setting, and steeper edges as the setting rises. +With glslangValidator the shader compiles, and with the version the header names, fg_scale_comp_spv.h is its output. + +python -I -B tests/test_fg_scale_sharpen.py [--cxx g++] [--glslang glslangValidator] +""" +import argparse +import re +import shutil +import subprocess +import tempfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +SHADERS = ROOT / "gpu" / "vk" / "shaders" + + +def block(text, marker): + start = text.index(marker) + end = text.index("{", start) + 1 + depth = 1 + while depth: + depth += (text[end] == "{") - (text[end] == "}") + end += 1 + return text[start:end] + + +# (just enough of GLSL's vec3 for sharpen()) +SHIM = r''' +#include +#include +#include +#include +struct vec3 { + float r, g, b; + vec3() : r(0), g(0), b(0) {} + explicit vec3(float v) : r(v), g(v), b(v) {} + vec3(float x, float y, float z) : r(x), g(y), b(z) {} +}; +static vec3 map2(vec3 a, vec3 b, float (*f)(float, float)) { return {f(a.r, b.r), f(a.g, b.g), f(a.b, b.b)}; } +static float fadd(float a, float b) { return a + b; } +static float fsub(float a, float b) { return a - b; } +static float fmul(float a, float b) { return a * b; } +static float fdiv(float a, float b) { return a / b; } +static float fmin_(float a, float b) { return std::min(a, b); } +static float fmax_(float a, float b) { return std::max(a, b); } +static vec3 operator+(vec3 a, vec3 b) { return map2(a, b, fadd); } +static vec3 operator-(vec3 a, vec3 b) { return map2(a, b, fsub); } +static vec3 operator*(vec3 a, vec3 b) { return map2(a, b, fmul); } +static vec3 operator/(vec3 a, vec3 b) { return map2(a, b, fdiv); } +static vec3 operator+(float a, vec3 b) { return vec3(a) + b; } +static vec3 operator-(float a, vec3 b) { return vec3(a) - b; } +static vec3 operator*(float a, vec3 b) { return vec3(a) * b; } +static vec3 operator/(vec3 a, float b) { return a / vec3(b); } +static vec3 min(vec3 a, vec3 b) { return map2(a, b, fmin_); } +static vec3 max(vec3 a, vec3 b) { return map2(a, b, fmax_); } +static float min(float a, float b) { return std::min(a, b); } +static float max(float a, float b) { return std::max(a, b); } +static float clamp(float v, float lo, float hi) { return std::min(std::max(v, lo), hi); } +static vec3 clamp(vec3 v, vec3 lo, vec3 hi) { return min(max(v, lo), hi); } +''' + +FIXTURE = r''' +#define CHECK(x) do { if (!(x)) { std::fprintf(stderr, "FAIL:%d %s\n", __LINE__, #x); std::exit(1); } } while (0) +static unsigned seed = 12345; +static float rnd() { seed = seed * 1664525u + 1013904223u; return (seed >> 8) / 16777216.0f; } +static vec3 rnd3() { return {rnd(), rnd(), rnd()}; } +static float ch(vec3 v, int i) { return i == 0 ? v.r : i == 1 ? v.g : v.b; } +// a blurred edge (the picture as it reaches the window pass), sampled one picture pixel apart around x +static float edge(float x) { return 0.1f + 0.8f / (1.0f + std::exp(-2.0f * x)); } +int main() { + const float amounts[] = {0.0f, 0.1f, 0.4f, 0.8f, 1.0f}; + for (int i = 0; i < 200000; i++) { + const vec3 c = rnd3(), n = rnd3(), s = rnd3(), w = rnd3(), e = rnd3(); + for (float a : amounts) { + const vec3 o = sharpen(c, n, s, w, e, a); + for (int k = 0; k < 3; k++) { + const float lo = std::min({ch(c, k), ch(n, k), ch(s, k), ch(w, k), ch(e, k)}); + const float hi = std::max({ch(c, k), ch(n, k), ch(s, k), ch(w, k), ch(e, k)}); + CHECK(ch(o, k) >= lo - 1e-6f && ch(o, k) <= hi + 1e-6f); // no halo: inside the neighbourhood + CHECK(ch(o, k) >= 0.0f && ch(o, k) <= 1.0f); // no clipping + CHECK(std::isfinite(ch(o, k))); + if (a == 0.0f) CHECK(ch(o, k) == ch(c, k)); // 0: the picture unchanged + } + } + } + // flat light, black and white stay as they are at full strength + for (float v : {0.0f, 0.5f, 1.0f}) { + const vec3 o = sharpen(vec3(v), vec3(v), vec3(v), vec3(v), vec3(v), 1.0f); + CHECK(o.r == v && o.g == v && o.b == v); + } + // a blurred edge gets steeper as the setting rises: the pixel on the light side lighter, never past the light beyond it + float last = edge(0.6f); + for (float a : {0.25f, 0.5f, 0.75f, 1.0f}) { + const vec3 c(edge(0.6f)), mid(edge(0.6f)); + const vec3 o = sharpen(c, mid, mid, vec3(edge(-0.4f)), vec3(edge(1.6f)), a); + CHECK(o.r > last && o.r <= edge(1.6f)); + last = o.r; + } + CHECK(last - edge(0.6f) > 0.01f); // (a visible step, not a rounding) + std::printf("PASS: sharpen() is the picture at 0, stays inside its neighbourhood and 0..1, and steepens edges with the setting\n"); +} +''' + + +def main(): + p = argparse.ArgumentParser(description=__doc__) + p.add_argument("--cxx", default="g++") + p.add_argument("--glslang", default="glslangValidator") + a = p.parse_args() + comp = SHADERS / "fg_scale.comp" + text = comp.read_text(encoding="utf-8") + body = block(text, "void main()") + sharp = body[body.index("if (pc.sharp > 0.0)"):] + if "textureSize(src, 0)" not in sharp: + raise SystemExit("the sharpen's neighbours are not spaced by the picture's size (textureSize(src, 0))") + spacing = re.search(r"const vec2 e = ([^;]*);", sharp) + if not spacing or "textureSize(src, 0)" not in spacing.group(1): + raise SystemExit("the neighbour spacing e is not one picture pixel") + for tap in ("uv + vec2(0.0, -e.y)", "uv + vec2(0.0, e.y)", "uv + vec2(-e.x, 0.0)", "uv + vec2(e.x, 0.0)"): + if tap not in sharp: + raise SystemExit("missing the neighbour at %s" % tap) + lobe = re.search(r"const float kMaxLobe = [^;]*;", text).group(0) + fn = block(text, "vec3 sharpen(") + fixture = SHIM + lobe.replace("const float", "static const float") + "\nstatic " + fn + FIXTURE + with tempfile.TemporaryDirectory(prefix="fg-sharpen-") as tmp: + cpp = Path(tmp) / "fixture.cpp" + exe = Path(tmp) / "fixture" + cpp.write_text(fixture, encoding="utf-8") + subprocess.run([a.cxx, "-std=c++20", "-O1", "-Wall", "-Wextra", "-Wno-unused-function", str(cpp), "-o", str(exe)], check=True) + subprocess.run([str(exe)], check=True) + glslang = shutil.which(a.glslang) + if not glslang: + print("SKIP: no %s, the shader's compile not checked" % a.glslang) + return + out = Path(tmp) / "fg_scale_comp_spv.h" + r = subprocess.run([glslang, "-V", "--target-env", "vulkan1.2", "--vn", "FG_SCALE_COMP_SPV", "-o", str(out), str(comp)], + capture_output=True, text=True) + if r.returncode: + raise SystemExit("fg_scale.comp does not compile:\n" + r.stdout + r.stderr) + header = (SHADERS / "fg_scale_comp_spv.h").read_bytes() + made = out.read_bytes() + if made.splitlines()[0] != header.splitlines()[0]: + print("PASS: the shader compiles (glslang %s, the header's is %s: not compared)" % + (made.splitlines()[0].decode().strip(), header.splitlines()[0].decode().strip())) + return + if made != header: + raise SystemExit("fg_scale_comp_spv.h is not fg_scale.comp compiled: glslangValidator -V --target-env vulkan1.2 " + "--vn FG_SCALE_COMP_SPV -o fg_scale_comp_spv.h fg_scale.comp") + print("PASS: fg_scale_comp_spv.h is fg_scale.comp compiled") + + +if __name__ == "__main__": + main() From b48cb1423e7b5477ea6f6bdbafb5bbe4ba5beed6 Mon Sep 17 00:00:00 2001 From: hckrman101 <239247847+hckrman101@users.noreply.github.com> Date: Mon, 9 Nov 2026 14:29:26 -0500 Subject: [PATCH 2/3] Sharpness: the SPIR-V header names the shader it was made from, and the comments say where the sharpen differs from RCAS fg_scale_comp_spv.h's first line is the sha256 of the fg_scale.comp it was made from, so the test checks the header against the shader without the glslang that made it (in CI); with that glslang it still compares every byte. tests/test_fg_scale_sharpen.py --write makes the header. --- gpu/vk/shaders/fg_scale.comp | 5 ++- gpu/vk/shaders/fg_scale_comp_spv.h | 1 + tests/test_fg_scale_sharpen.py | 58 +++++++++++++++++++++--------- 3 files changed, 47 insertions(+), 17 deletions(-) diff --git a/gpu/vk/shaders/fg_scale.comp b/gpu/vk/shaders/fg_scale.comp index bf421257..50c89623 100644 --- a/gpu/vk/shaders/fg_scale.comp +++ b/gpu/vk/shaders/fg_scale.comp @@ -41,7 +41,10 @@ vec3 filtered(vec2 uv) { const float kMaxLobe = 0.25 - 1.0 / 16.0; vec3 sharpen(vec3 c, vec3 n, vec3 s, vec3 w, vec3 e, float amount) { // RCAS: the four neighbours weighted by a negative lobe, the largest that keeps the result inside 0..1 for this - // neighbourhood (smaller where the light is near black or white), then normalized + // neighbourhood (smaller where the light is near black or white), then normalized. Two differences from RCAS's own + // maths: the room to black divides by 4 x the lightest of the pixel and its neighbours (RCAS: of the neighbours + // alone), never more room than RCAS gives, so only more careful; and like RCAS the room is the smallest of the three + // channels, so a saturated colour (a channel near 0 or 1, not only near black or white) is sharpened little const vec3 lo4 = min(min(n, s), min(w, e)), hi4 = max(max(n, s), max(w, e)); const vec3 lo = min(lo4, c), hi = max(hi4, c); const vec3 to_black = lo / max(4.0 * hi, vec3(1.0 / 1024.0)); diff --git a/gpu/vk/shaders/fg_scale_comp_spv.h b/gpu/vk/shaders/fg_scale_comp_spv.h index deb04473..b97032a8 100644 --- a/gpu/vk/shaders/fg_scale_comp_spv.h +++ b/gpu/vk/shaders/fg_scale_comp_spv.h @@ -1,3 +1,4 @@ +// fg_scale.comp sha256 fb4a95e910c935a9238f5f5ffaff59a82400b6375791021e553001e1f92edc55 (tests/test_fg_scale_sharpen.py --write: glslangValidator -V --target-env vulkan1.2 --vn FG_SCALE_COMP_SPV) // 1116.6.0 #pragma once const uint32_t FG_SCALE_COMP_SPV[] = { diff --git a/tests/test_fg_scale_sharpen.py b/tests/test_fg_scale_sharpen.py index 6722490d..9184d332 100644 --- a/tests/test_fg_scale_sharpen.py +++ b/tests/test_fg_scale_sharpen.py @@ -2,11 +2,14 @@ window pixel (inside the same picture pixel when the window is the larger, so Sharpness did next to nothing), and its per-pixel math, the shader's own sharpen() compiled as C++, is the picture unchanged at 0, never past the lightest or darkest pixel around it nor outside 0..1 (no halos, no clipping) at any setting, and steeper edges as the setting rises. -With glslangValidator the shader compiles, and with the version the header names, fg_scale_comp_spv.h is its output. +fg_scale_comp_spv.h names the hash of the fg_scale.comp it was made from (its first line), checked against the shader as it +is now with or without glslang; with glslangValidator the shader compiles, and with the version the header names, the rest of +the header is its output byte for byte. --write makes the header: glslang's output with that line on top. -python -I -B tests/test_fg_scale_sharpen.py [--cxx g++] [--glslang glslangValidator] +python -I -B tests/test_fg_scale_sharpen.py [--cxx g++] [--glslang glslangValidator] [--write] """ import argparse +import hashlib import re import shutil import subprocess @@ -17,6 +20,21 @@ SHADERS = ROOT / "gpu" / "vk" / "shaders" +def source_line(comp): + """the header's first line: the shader's hash (line ends as LF, as the checkout has them) and how the header is made""" + digest = hashlib.sha256(comp.read_bytes().replace(b"\r\n", b"\n")).hexdigest() + return ("// fg_scale.comp sha256 %s (tests/test_fg_scale_sharpen.py --write: glslangValidator -V --target-env vulkan1.2 " + "--vn FG_SCALE_COMP_SPV)\n" % digest).encode() + + +def compile_header(glslang, comp, out): + r = subprocess.run([glslang, "-V", "--target-env", "vulkan1.2", "--vn", "FG_SCALE_COMP_SPV", "-o", str(out), str(comp)], + capture_output=True, text=True) + if r.returncode: + raise SystemExit("fg_scale.comp does not compile:\n" + r.stdout + r.stderr) + return out.read_bytes() + + def block(text, marker): start = text.index(marker) end = text.index("{", start) + 1 @@ -109,8 +127,23 @@ def main(): p = argparse.ArgumentParser(description=__doc__) p.add_argument("--cxx", default="g++") p.add_argument("--glslang", default="glslangValidator") + p.add_argument("--write", action="store_true", help="make fg_scale_comp_spv.h from fg_scale.comp") a = p.parse_args() comp = SHADERS / "fg_scale.comp" + header_path = SHADERS / "fg_scale_comp_spv.h" + if a.write: + glslang = shutil.which(a.glslang) + if not glslang: + raise SystemExit("--write needs %s" % a.glslang) + with tempfile.TemporaryDirectory(prefix="fg-sharpen-") as tmp: + header_path.write_bytes(source_line(comp) + compile_header(glslang, comp, Path(tmp) / "out.h")) + print("wrote %s" % header_path) + return + header = header_path.read_bytes() + first, _, hbody = header.partition(b"\n") + if first + b"\n" != source_line(comp): + raise SystemExit("fg_scale_comp_spv.h was not made from this fg_scale.comp (its first line names another hash): " + "python -I -B tests/test_fg_scale_sharpen.py --write") text = comp.read_text(encoding="utf-8") body = block(text, "void main()") sharp = body[body.index("if (pc.sharp > 0.0)"):] @@ -133,22 +166,15 @@ def main(): subprocess.run([str(exe)], check=True) glslang = shutil.which(a.glslang) if not glslang: - print("SKIP: no %s, the shader's compile not checked" % a.glslang) + print("PASS: the header names this shader (no %s: its compile not checked)" % a.glslang) return - out = Path(tmp) / "fg_scale_comp_spv.h" - r = subprocess.run([glslang, "-V", "--target-env", "vulkan1.2", "--vn", "FG_SCALE_COMP_SPV", "-o", str(out), str(comp)], - capture_output=True, text=True) - if r.returncode: - raise SystemExit("fg_scale.comp does not compile:\n" + r.stdout + r.stderr) - header = (SHADERS / "fg_scale_comp_spv.h").read_bytes() - made = out.read_bytes() - if made.splitlines()[0] != header.splitlines()[0]: - print("PASS: the shader compiles (glslang %s, the header's is %s: not compared)" % - (made.splitlines()[0].decode().strip(), header.splitlines()[0].decode().strip())) + made = compile_header(glslang, comp, Path(tmp) / "fg_scale_comp_spv.h") + if made.splitlines()[0] != hbody.splitlines()[0]: + print("PASS: the header names this shader, and it compiles (glslang %s, the header's is %s: bytes not compared)" % + (made.splitlines()[0].decode().strip(), hbody.splitlines()[0].decode().strip())) return - if made != header: - raise SystemExit("fg_scale_comp_spv.h is not fg_scale.comp compiled: glslangValidator -V --target-env vulkan1.2 " - "--vn FG_SCALE_COMP_SPV -o fg_scale_comp_spv.h fg_scale.comp") + if made != hbody: + raise SystemExit("fg_scale_comp_spv.h is not fg_scale.comp compiled: python -I -B tests/test_fg_scale_sharpen.py --write") print("PASS: fg_scale_comp_spv.h is fg_scale.comp compiled") From 488ec955143a18bbb9d427b08c371170571f910d Mon Sep 17 00:00:00 2001 From: hckrman101 <239247847+hckrman101@users.noreply.github.com> Date: Mon, 9 Nov 2026 14:55:33 -0500 Subject: [PATCH 3/3] Quality presets: Sharpness re-tuned for the picture-pixel sharpen Each preset's Sharpness gives about the sharpening the old value gave on a 3840 x 2160 window at that preset's picture (2048 x 1152, or the handheld profile's 1536 x 864), on the slider's steps: Minimum 50 -> 30, Low 35 -> 30, Balanced 25 -> 30, High 30 -> 40, Ultra 40 -> 50. The readme says a Sharpness kept from an older version is stronger than it was when the window is much larger than the picture. --- gpu/vk/vk_menu.cpp | 13 ++++++++----- readme.md | 4 +++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gpu/vk/vk_menu.cpp b/gpu/vk/vk_menu.cpp index 0e3bd44c..fa8e940d 100644 --- a/gpu/vk/vk_menu.cpp +++ b/gpu/vk/vk_menu.cpp @@ -350,26 +350,29 @@ void sync_preset_budgets(int p) { default: opts.vram_mb = 0; opts.mirror_mb = 0; break; } } +// (Sharpness: tuned for the window pass's neighbours one picture pixel apart, each about the old setting's sharpening on a +// 3840 x 2160 window at that preset's picture, 2048 x 1152 or the handheld profile's 1536 x 864: same frame, mean |Laplacian| +// of the window and of the picture, on the slider's steps) void apply_preset(int p) { switch (p) { case 1: // Minimum (4GB VRAM / iGPU) - opts.resolution = 4; opts.upscale = 2; opts.sharpness = 50; + opts.resolution = 4; opts.upscale = 2; opts.sharpness = 30; opts.framegen = 2; opts.pace = 1; opts.realtime = 1; opts.handheld = 1; break; case 2: // Low (6GB VRAM) - opts.resolution = 2; opts.upscale = 2; opts.sharpness = 35; + opts.resolution = 2; opts.upscale = 2; opts.sharpness = 30; opts.framegen = 2; opts.pace = 1; opts.realtime = 1; opts.handheld = 1; break; case 3: // Balanced (8GB VRAM) - opts.resolution = 1; opts.upscale = 1; opts.sharpness = 25; + opts.resolution = 1; opts.upscale = 1; opts.sharpness = 30; opts.framegen = 2; opts.pace = 1; opts.realtime = 1; opts.handheld = 0; break; case 4: // High (12GB VRAM) - opts.resolution = 1; opts.upscale = 2; opts.sharpness = 30; + opts.resolution = 1; opts.upscale = 2; opts.sharpness = 40; opts.framegen = 2; opts.pace = 1; opts.realtime = 1; opts.handheld = 0; break; case 5: // Ultra (16GB+ VRAM) - opts.resolution = 1; opts.upscale = 2; opts.sharpness = 40; + opts.resolution = 1; opts.upscale = 2; opts.sharpness = 50; opts.framegen = 3; opts.pace = 1; opts.realtime = 1; opts.handheld = 0; break; default: diff --git a/readme.md b/readme.md index 896d57c9..554f3321 100644 --- a/readme.md +++ b/readme.md @@ -262,7 +262,9 @@ choices and starts the game again, so progress since your last save is lost. edges smoothed). Both look softer than the game's own: set **Sharpness** to around 80% with them. **DLSS model** chooses their network (below). **Render resolution** is the 3D's share of the output. The **Window scaling filter** then scales the frame to your window, - and **Sharpness** sharpens it. + and **Sharpness** sharpens it, by the picture's pixels: when the window is much larger than the picture (the Handheld + profile's 1536x864 on a 4K screen), a Sharpness kept from an older version is stronger than it was, so a lower one may + suit. - **Output resolution:** its rows below show the sizes for the output you chose. Docked only. On a 1920x1080 display, the 1920x1080 option keeps HUD and text sharp when the game fills the screen by mapping them pixel for pixel. At 3840x2160 the game's render targets get a bigger GPU pool, so a full-size 3D fits. For one run, set `HOS_OUTPUT_RES`