diff --git a/gpu/vk/shaders/fg_scale.comp b/gpu/vk/shaders/fg_scale.comp index 1721e3c3..50c89623 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,24 @@ 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. 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)); + 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 +62,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..b97032a8 100644 --- a/gpu/vk/shaders/fg_scale_comp_spv.h +++ b/gpu/vk/shaders/fg_scale_comp_spv.h @@ -1,255 +1,315 @@ +// 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[] = { - 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/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` diff --git a/tests/run_all.py b/tests/run_all.py index 8d5d3bc1..1dc2e112 100644 --- a/tests/run_all.py +++ b/tests/run_all.py @@ -42,6 +42,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..9184d332 --- /dev/null +++ b/tests/test_fg_scale_sharpen.py @@ -0,0 +1,182 @@ +"""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. +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] [--write] +""" +import argparse +import hashlib +import re +import shutil +import subprocess +import tempfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +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 + 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") + 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)"):] + 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("PASS: the header names this shader (no %s: its compile not checked)" % a.glslang) + return + 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 != 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") + + +if __name__ == "__main__": + main()