diff --git a/CLAUDE.md b/CLAUDE.md index 25124eb..0f493ef 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,14 +11,15 @@ Coffee Crisis is a C++20 arcade game built with SDL3. The player controls a char Dependencies: `libsdl3-dev` and `g++` (Linux) or `clang++` (macOS). Build system is CMake (driven by `Makefile` wrappers). ```bash -make # Release build -make debug # Debug build (defines DEBUG and PAUSE) -make release # Empaqueta .tar.gz / .dmg / .zip segons SO -make pack # Regenera resources.pack -make controllerdb # Descarga gamecontrollerdb.txt -make format # clang-format -i -make tidy # clang-tidy -make cppcheck # cppcheck +make # Release build +make debug # Debug build (defines DEBUG and PAUSE) +make release # Empaqueta .tar.gz / .dmg / .zip segons SO +make pack # Regenera resources.pack +make compile_shaders # Compila shaders GLSL → headers SPIR-V (requereix glslc) +make controllerdb # Descarga gamecontrollerdb.txt +make format # clang-format -i +make tidy # clang-tidy +make cppcheck # cppcheck ``` ## Architecture @@ -33,6 +34,10 @@ source/ │ ├── input/ input.*, mouse.* │ ├── locale/ lang.* │ ├── rendering/ screen, fade, text, writer, texture, sprite + animated/moving/smart +│ │ ├── shader_backend.hpp (interfície abstracta de post-procesado) +│ │ └── sdl3gpu/ (pipeline SDL3 GPU) +│ │ ├── sdl3gpu_shader.* (implementació del backend GPU) +│ │ └── spv/ (headers SPIR-V generats — protegits amb dummies `.clang-*`) │ ├── resources/ asset, resource, resource_pack, resource_loader, resource_helper │ └── system/ director ├── game/ @@ -66,6 +71,24 @@ Flux general controlat per la classe **Director** (`core/system/director.h`): in **jail_audio** (`core/audio/jail_audio.hpp`): wrapper audio SDL3 first-party. Usa stb_vorbis per OGG. API `JA_*` per música i efectes amb mesclat per canals. +### GPU / shaders (post-procesado) + +Pipeline SDL3 GPU portat de `coffee_crisis_arcade_edition`. El canvas 256×192 es pot passar per un backend GPU que aplica PostFX (vinyeta, scanlines, chroma, gamma, mask, curvatura, bleeding, flicker) o CrtPi (scanlines continues amb bloom). Fallback transparent al `SDL_Renderer` clàssic si la GPU falla o si es desactiva. + +- **Interfície**: `core/rendering/shader_backend.hpp` (`Rendering::ShaderBackend`). +- **Implementació**: `core/rendering/sdl3gpu/sdl3gpu_shader.*` + shaders GLSL a `data/shaders/` compilats a `spv/*_spv.h` via `glslc` (o precompilats si no hi ha `glslc`). +- **Emscripten**: compile-time `NO_SHADERS` → sempre ruta clàssica. +- **macOS**: shaders Metal (MSL) inline dins `sdl3gpu_shader.cpp`; no SPIR-V. +- **Opcions persistents** a `config.txt` (migració a YAML pendent): + - `videoGpuAcceleration` (bool) + - `videoGpuPreferredDriver` (string, buit = auto) + - `videoShaderEnabled` (bool) + - `videoShaderType` (0=POSTFX, 1=CRTPI) +- **Hotkeys** (provisionals fins que hi hagi menú d'opcions): `F9` toggle GPU · `F10` toggle shader · `F11` alterna POSTFX ↔ CRTPI. +- **API** a `Screen`: `setGpuAcceleration`/`toggleGpuAcceleration`/`isGpuAccelerated`, `setShaderEnabled`/`toggleShaderEnabled`/`isShaderEnabled`, `setActiveShader`/`toggleActiveShader`/`getActiveShader`. + +Presets PostFX/CrtPi i cicle de presets encara **no** estan implementats — arribaran amb la migració a YAML. Per ara, valors per defecte hardcoded. + ## Data Directory - `data/gfx/` — PNG spritesheets and `.ani` animation definition files @@ -74,6 +97,7 @@ Flux general controlat per la classe **Director** (`core/system/director.h`): in - `data/lang/` — language files (es_ES, ba_BA, en_UK) - `data/demo/` — demo recording data (gamecontrollerdb.txt vive en la raíz del proyecto, fuera del pack) - `data/menu/` — menu definition files +- `data/shaders/` — fonts GLSL per al post-procesado SDL3 GPU (no van al pack; s'empotren al binari via headers SPIR-V) ## Language diff --git a/CMakeLists.txt b/CMakeLists.txt index d1255ea..00cd0b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,12 @@ set(DIR_SOURCES "${CMAKE_SOURCE_DIR}/source") file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS "${DIR_SOURCES}/*.cpp") list(FILTER SOURCES EXCLUDE REGEX "${DIR_SOURCES}/external/.*") +# En Emscripten no compilamos sdl3gpu_shader (SDL3 GPU no está soportado en WebGL2). +# Define NO_SHADERS más abajo y filtra el fuente aquí. +if(EMSCRIPTEN) + list(REMOVE_ITEM SOURCES "${DIR_SOURCES}/core/rendering/sdl3gpu/sdl3gpu_shader.cpp") +endif() + # Verificar si se encontraron archivos fuente if(NOT SOURCES) message(FATAL_ERROR "No se encontraron archivos fuente en ${DIR_SOURCES}.") @@ -55,9 +61,78 @@ else() message(STATUS "SDL3 encontrado: ${SDL3_INCLUDE_DIRS}") endif() +# --- SHADER COMPILATION (Linux/Windows only - macOS uses Metal, Emscripten no soporta SDL3 GPU) --- +if(NOT APPLE AND NOT EMSCRIPTEN) + find_program(GLSLC_EXE NAMES glslc) + + set(SHADER_VERT_SRC "${CMAKE_SOURCE_DIR}/data/shaders/postfx.vert") + set(SHADER_FRAG_SRC "${CMAKE_SOURCE_DIR}/data/shaders/postfx.frag") + set(SHADER_CRTPI_SRC "${CMAKE_SOURCE_DIR}/data/shaders/crtpi_frag.glsl") + set(SHADER_UPSCALE_SRC "${CMAKE_SOURCE_DIR}/data/shaders/upscale.frag") + set(SHADER_DOWNSCALE_SRC "${CMAKE_SOURCE_DIR}/data/shaders/downscale.frag") + + set(SHADER_VERT_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/postfx_vert_spv.h") + set(SHADER_FRAG_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h") + set(SHADER_CRTPI_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/crtpi_frag_spv.h") + set(SHADER_UPSCALE_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/upscale_frag_spv.h") + set(SHADER_DOWNSCALE_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/downscale_frag_spv.h") + + set(ALL_SHADER_HEADERS "${SHADER_VERT_H}" "${SHADER_FRAG_H}" "${SHADER_CRTPI_H}" "${SHADER_UPSCALE_H}" "${SHADER_DOWNSCALE_H}") + + if(GLSLC_EXE) + set(COMPILE_SHADER_SCRIPT "${CMAKE_SOURCE_DIR}/tools/shaders/compile_shader.cmake") + + macro(add_shader SRC_FILE OUT_H VAR_NAME) + cmake_parse_arguments(S "" "STAGE" "" ${ARGN}) + add_custom_command( + OUTPUT "${OUT_H}" + COMMAND ${CMAKE_COMMAND} + "-DGLSLC=${GLSLC_EXE}" + "-DSRC=${SRC_FILE}" + "-DOUT_H=${OUT_H}" + "-DVAR=${VAR_NAME}" + "-DSTAGE=${S_STAGE}" + -P "${COMPILE_SHADER_SCRIPT}" + DEPENDS "${SRC_FILE}" "${COMPILE_SHADER_SCRIPT}" + COMMENT "Compilando shader: ${VAR_NAME}" + ) + endmacro() + + add_shader("${SHADER_VERT_SRC}" "${SHADER_VERT_H}" "postfx_vert_spv") + add_shader("${SHADER_FRAG_SRC}" "${SHADER_FRAG_H}" "postfx_frag_spv") + add_shader("${SHADER_CRTPI_SRC}" "${SHADER_CRTPI_H}" "crtpi_frag_spv" STAGE fragment) + add_shader("${SHADER_UPSCALE_SRC}" "${SHADER_UPSCALE_H}" "upscale_frag_spv") + add_shader("${SHADER_DOWNSCALE_SRC}" "${SHADER_DOWNSCALE_H}" "downscale_frag_spv") + + add_custom_target(shaders DEPENDS ${ALL_SHADER_HEADERS}) + message(STATUS "glslc encontrado: shaders se compilarán automáticamente") + else() + foreach(_h IN LISTS ALL_SHADER_HEADERS) + if(NOT EXISTS "${_h}") + message(FATAL_ERROR + "glslc no encontrado y header SPIR-V no existe: ${_h}\n" + " Instala glslc: sudo apt install glslang-tools (Linux)\n" + " choco install vulkan-sdk (Windows)" + ) + endif() + endforeach() + message(STATUS "glslc no encontrado - usando headers SPIR-V precompilados") + endif() +else() + if(EMSCRIPTEN) + message(STATUS "Emscripten: shaders SPIR-V omitidos (SDL3 GPU no soportado en WebGL2)") + else() + message(STATUS "macOS: shaders SPIR-V omitidos (usa Metal inline)") + endif() +endif() + # Añadir ejecutable principal add_executable(${PROJECT_NAME} ${SOURCES}) +if(NOT APPLE AND NOT EMSCRIPTEN AND GLSLC_EXE) + add_dependencies(${PROJECT_NAME} shaders) +endif() + # Includes relatius a source/ (p.e. `#include "core/rendering/texture.h"`) target_include_directories(${PROJECT_NAME} PRIVATE ${DIR_SOURCES}) @@ -96,7 +171,7 @@ elseif(APPLE) ) endif() elseif(EMSCRIPTEN) - target_compile_definitions(${PROJECT_NAME} PRIVATE EMSCRIPTEN_BUILD) + target_compile_definitions(${PROJECT_NAME} PRIVATE EMSCRIPTEN_BUILD NO_SHADERS) # En wasm NO empaquetamos un resources.pack: el propio --preload-file de # emscripten ya hace el mismo trabajo (bundle del directorio en un .data), # así que metemos directamente 'data' y dejamos que el Resource lea por diff --git a/Makefile b/Makefile index 5bb30b3..348b226 100644 --- a/Makefile +++ b/Makefile @@ -349,6 +349,11 @@ cppcheck: @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) @cmake --build build --target cppcheck +# SHADERS (SPIR-V) — sólo Linux/Windows. Requiere glslc en el PATH. +compile_shaders: + @cmake $(CMAKE_GEN) -S . -B build -DCMAKE_BUILD_TYPE=Release -DGIT_HASH=$(GIT_HASH) + @cmake --build build --target shaders + # DESCARGA DE GAMECONTROLLERDB # ============================================================================== controllerdb: @@ -378,6 +383,7 @@ help: @echo "" @echo " Herramientas:" @echo " make pack - Empaquetar recursos a resources.pack" + @echo " make compile_shaders - Compilar shaders GLSL a headers SPIR-V (requiere glslc)" @echo " make controllerdb - Descargar gamecontrollerdb.txt actualizado" @echo "" @echo " Calidad de codigo:" @@ -391,4 +397,4 @@ help: @echo " make show_version - Mostrar version actual ($(VERSION))" @echo " make help - Mostrar esta ayuda" -.PHONY: all debug release _windows_release _macos_release _linux_release wasm wasm_debug controllerdb pack format format-check tidy tidy-fix cppcheck show_version help +.PHONY: all debug release _windows_release _macos_release _linux_release wasm wasm_debug controllerdb pack format format-check tidy tidy-fix cppcheck compile_shaders show_version help diff --git a/data/shaders/crtpi_frag.glsl b/data/shaders/crtpi_frag.glsl new file mode 100644 index 0000000..48f0fa3 --- /dev/null +++ b/data/shaders/crtpi_frag.glsl @@ -0,0 +1,152 @@ +#version 450 + +// Vulkan GLSL fragment shader — CRT-Pi PostFX +// Algoritmo de scanlines continuas con pesos gaussianos, bloom y máscara de fósforo. +// Basado en el shader CRT-Pi original (GLSL 3.3), portado a GLSL 4.50 con parámetros uniformes. +// +// Compile: glslc -fshader-stage=frag --target-env=vulkan1.0 crtpi_frag.glsl -o crtpi_frag.spv +// xxd -i crtpi_frag.spv > ../../source/core/rendering/sdl3gpu/crtpi_frag_spv.h + +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 out_color; + +layout(set = 2, binding = 0) uniform sampler2D Texture; + +layout(set = 3, binding = 0) uniform CrtPiBlock { + // vec4 #0 + float scanline_weight; // Ajuste gaussiano de scanlines (default 6.0) + float scanline_gap_brightness; // Brillo mínimo entre scanlines (default 0.12) + float bloom_factor; // Factor de brillo en zonas iluminadas (default 3.5) + float input_gamma; // Gamma de entrada — linealización (default 2.4) + // vec4 #1 + float output_gamma; // Gamma de salida — codificación (default 2.2) + float mask_brightness; // Brillo sub-píxeles de la máscara (default 0.80) + float curvature_x; // Distorsión barrel eje X (default 0.05) + float curvature_y; // Distorsión barrel eje Y (default 0.10) + // vec4 #2 + int mask_type; // 0=ninguna, 1=verde/magenta, 2=RGB fósforo + int enable_scanlines; // 0 = off, 1 = on + int enable_multisample; // 0 = off, 1 = on (antialiasing analítico de scanlines) + int enable_gamma; // 0 = off, 1 = on + // vec4 #3 + int enable_curvature; // 0 = off, 1 = on + int enable_sharper; // 0 = off, 1 = on + float texture_width; // Ancho del canvas lógico en píxeles + float texture_height; // Alto del canvas lógico en píxeles +} u; + +// Distorsión barrel CRT +vec2 distort(vec2 coord, vec2 screen_scale) { + vec2 curvature = vec2(u.curvature_x, u.curvature_y); + vec2 barrel_scale = 1.0 - (0.23 * curvature); + coord *= screen_scale; + coord -= vec2(0.5); + float rsq = coord.x * coord.x + coord.y * coord.y; + coord += coord * (curvature * rsq); + coord *= barrel_scale; + if (abs(coord.x) >= 0.5 || abs(coord.y) >= 0.5) { + return vec2(-1.0); // fuera de pantalla + } + coord += vec2(0.5); + coord /= screen_scale; + return coord; +} + +float calcScanLineWeight(float dist) { + return max(1.0 - dist * dist * u.scanline_weight, u.scanline_gap_brightness); +} + +float calcScanLine(float dy, float filter_width) { + float weight = calcScanLineWeight(dy); + if (u.enable_multisample != 0) { + weight += calcScanLineWeight(dy - filter_width); + weight += calcScanLineWeight(dy + filter_width); + weight *= 0.3333333; + } + return weight; +} + +void main() { + vec2 tex_size = vec2(u.texture_width, u.texture_height); + + // filterWidth: equivalente al original (768.0 / TextureSize.y) / 3.0 + float filter_width = (768.0 / u.texture_height) / 3.0; + + vec2 texcoord = v_uv; + + // Curvatura barrel opcional + if (u.enable_curvature != 0) { + texcoord = distort(texcoord, vec2(1.0, 1.0)); + if (texcoord.x < 0.0) { + out_color = vec4(0.0, 0.0, 0.0, 1.0); + return; + } + } + + vec2 texcoord_in_pixels = texcoord * tex_size; + vec2 tc; + float scan_line_weight; + + if (u.enable_sharper != 0) { + // Modo SHARPER: filtrado bicúbico-like con subpixel sharpen + vec2 temp_coord = floor(texcoord_in_pixels) + 0.5; + tc = temp_coord / tex_size; + vec2 deltas = texcoord_in_pixels - temp_coord; + scan_line_weight = calcScanLine(deltas.y, filter_width); + vec2 signs = sign(deltas); + deltas.x *= 2.0; + deltas = deltas * deltas; + deltas.y = deltas.y * deltas.y; + deltas.x *= 0.5; + deltas.y *= 8.0; + deltas /= tex_size; + deltas *= signs; + tc = tc + deltas; + } else { + // Modo estándar + float temp_y = floor(texcoord_in_pixels.y) + 0.5; + float y_coord = temp_y / tex_size.y; + float dy = texcoord_in_pixels.y - temp_y; + scan_line_weight = calcScanLine(dy, filter_width); + float sign_y = sign(dy); + dy = dy * dy; + dy = dy * dy; + dy *= 8.0; + dy /= tex_size.y; + dy *= sign_y; + tc = vec2(texcoord.x, y_coord + dy); + } + + vec3 colour = texture(Texture, tc).rgb; + + if (u.enable_scanlines != 0) { + if (u.enable_gamma != 0) { + colour = pow(colour, vec3(u.input_gamma)); + } + colour *= scan_line_weight * u.bloom_factor; + if (u.enable_gamma != 0) { + colour = pow(colour, vec3(1.0 / u.output_gamma)); + } + } + + // Máscara de fósforo + if (u.mask_type == 1) { + float which_mask = fract(gl_FragCoord.x * 0.5); + vec3 mask = (which_mask < 0.5) + ? vec3(u.mask_brightness, 1.0, u.mask_brightness) + : vec3(1.0, u.mask_brightness, 1.0); + colour *= mask; + } else if (u.mask_type == 2) { + float which_mask = fract(gl_FragCoord.x * 0.3333333); + vec3 mask = vec3(u.mask_brightness); + if (which_mask < 0.3333333) + mask.x = 1.0; + else if (which_mask < 0.6666666) + mask.y = 1.0; + else + mask.z = 1.0; + colour *= mask; + } + + out_color = vec4(colour, 1.0); +} diff --git a/data/shaders/downscale.frag b/data/shaders/downscale.frag new file mode 100644 index 0000000..fe5b9b5 --- /dev/null +++ b/data/shaders/downscale.frag @@ -0,0 +1,48 @@ +#version 450 +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 out_color; + +layout(set = 2, binding = 0) uniform sampler2D source; + +layout(set = 3, binding = 0) uniform DownscaleUniforms { + int algorithm; // 0 = Lanczos2 (ventana 2, ±2 taps), 1 = Lanczos3 (ventana 3, ±3 taps) + float pad0; + float pad1; + float pad2; +} u; + +// Kernel Lanczos normalizado: sinc(t) * sinc(t/a) para |t| < a, 0 fuera. +float lanczos(float t, float a) { + t = abs(t); + if (t < 0.0001) { return 1.0; } + if (t >= a) { return 0.0; } + const float PI = 3.14159265358979; + float pt = PI * t; + return (a * sin(pt) * sin(pt / a)) / (pt * pt); +} + +void main() { + vec2 src_size = vec2(textureSize(source, 0)); + // Posición en coordenadas de texel (centros de texel en N+0.5) + vec2 p = v_uv * src_size; + vec2 p_floor = floor(p); + + float a = (u.algorithm == 0) ? 2.0 : 3.0; + int win = int(a); + + vec4 color = vec4(0.0); + float weight_sum = 0.0; + + for (int j = -win; j <= win; j++) { + for (int i = -win; i <= win; i++) { + // Centro del texel (i,j) relativo a p_floor + vec2 tap_center = p_floor + vec2(float(i), float(j)) + 0.5; + vec2 offset = tap_center - p; + float w = lanczos(offset.x, a) * lanczos(offset.y, a); + color += texture(source, tap_center / src_size) * w; + weight_sum += w; + } + } + + out_color = (weight_sum > 0.0) ? (color / weight_sum) : vec4(0.0, 0.0, 0.0, 1.0); +} diff --git a/data/shaders/postfx.frag b/data/shaders/postfx.frag new file mode 100644 index 0000000..238c7a7 --- /dev/null +++ b/data/shaders/postfx.frag @@ -0,0 +1,142 @@ +#version 450 + +// Vulkan GLSL fragment shader — PostFX effects +// Used for SDL3 GPU API (SPIR-V path, Win/Linux). +// Compile: glslc postfx.frag -o postfx.frag.spv +// xxd -i postfx.frag.spv > ../../source/core/rendering/sdl3gpu/postfx_frag_spv.h +// +// PostFXUniforms must match exactly the C++ struct in sdl3gpu_shader.hpp +// (8 floats, 32 bytes, std140/scalar layout). + +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 out_color; + +layout(set = 2, binding = 0) uniform sampler2D scene; + +layout(set = 3, binding = 0) uniform PostFXUniforms { + float vignette_strength; + float chroma_strength; + float scanline_strength; + float screen_height; + float mask_strength; + float gamma_strength; + float curvature; + float bleeding; + float pixel_scale; // physical pixels per logical pixel (vh / tex_height_) + float time; // seconds since SDL init + float oversample; // supersampling factor (1.0 = off, 3.0 = 3×SS) + float flicker; // 0 = off, 1 = phosphor flicker ~50 Hz — 48 bytes total (3 × 16) +} u; + +// YCbCr helpers for NTSC bleeding +vec3 rgb_to_ycc(vec3 rgb) { + return vec3( + 0.299*rgb.r + 0.587*rgb.g + 0.114*rgb.b, + -0.169*rgb.r - 0.331*rgb.g + 0.500*rgb.b + 0.5, + 0.500*rgb.r - 0.419*rgb.g - 0.081*rgb.b + 0.5 + ); +} +vec3 ycc_to_rgb(vec3 ycc) { + float y = ycc.x; + float cb = ycc.y - 0.5; + float cr = ycc.z - 0.5; + return clamp(vec3( + y + 1.402*cr, + y - 0.344*cb - 0.714*cr, + y + 1.772*cb + ), 0.0, 1.0); +} + +void main() { + vec2 uv = v_uv; + + // Curvatura barrel CRT + if (u.curvature > 0.0) { + vec2 c = uv - 0.5; + float rsq = dot(c, c); + vec2 dist = vec2(0.05, 0.1) * u.curvature; + vec2 barrelScale = vec2(1.0) - 0.23 * dist; + c += c * (dist * rsq); + c *= barrelScale; + if (abs(c.x) >= 0.5 || abs(c.y) >= 0.5) { + out_color = vec4(0.0, 0.0, 0.0, 1.0); + return; + } + uv = c + 0.5; + } + + // Muestra base + vec3 base = texture(scene, uv).rgb; + + // Sangrado NTSC — difuminado horizontal de crominancia. + // step = 1 pixel lógico de juego en UV (corrige SS: textureSize.x = game_w * oversample). + vec3 colour; + if (u.bleeding > 0.0) { + float tw = float(textureSize(scene, 0).x); + float step = u.oversample / tw; // 1 pixel lógico en UV + vec3 ycc = rgb_to_ycc(base); + vec3 ycc_l2 = rgb_to_ycc(texture(scene, uv - vec2(2.0*step, 0.0)).rgb); + vec3 ycc_l1 = rgb_to_ycc(texture(scene, uv - vec2(1.0*step, 0.0)).rgb); + vec3 ycc_r1 = rgb_to_ycc(texture(scene, uv + vec2(1.0*step, 0.0)).rgb); + vec3 ycc_r2 = rgb_to_ycc(texture(scene, uv + vec2(2.0*step, 0.0)).rgb); + ycc.yz = (ycc_l2.yz + ycc_l1.yz*2.0 + ycc.yz*2.0 + ycc_r1.yz*2.0 + ycc_r2.yz) / 8.0; + colour = mix(base, ycc_to_rgb(ycc), u.bleeding); + } else { + colour = base; + } + + // Aberración cromática (drift animado con time para efecto NTSC real) + float ca = u.chroma_strength * 0.005 * (1.0 + 0.15 * sin(u.time * 7.3)); + colour.r = texture(scene, uv + vec2(ca, 0.0)).r; + colour.b = texture(scene, uv - vec2(ca, 0.0)).b; + + // Corrección gamma (linealizar antes de scanlines, codificar después) + if (u.gamma_strength > 0.0) { + vec3 lin = pow(colour, vec3(2.4)); + colour = mix(colour, lin, u.gamma_strength); + } + + // Scanlines — 1 pixel físico oscuro por fila lógica. + // Modelo sustractivo: las filas de scanline se oscurecen, las demás no cambian. + // Esto evita el efecto de sobrebrillo en contenido con colores vivos. + if (u.scanline_strength > 0.0) { + float ps = max(1.0, round(u.pixel_scale)); + float frac_in_row = fract(uv.y * u.screen_height); + float row_pos = floor(frac_in_row * ps); + float is_dark = step(ps - 1.0, row_pos); + float scan = mix(1.0, 0.0, is_dark); + colour *= mix(1.0, scan, u.scanline_strength); + } + + if (u.gamma_strength > 0.0) { + vec3 enc = pow(colour, vec3(1.0 / 2.2)); + colour = mix(colour, enc, u.gamma_strength); + } + + // Viñeta + vec2 d = uv - 0.5; + float vignette = 1.0 - dot(d, d) * u.vignette_strength; + colour *= clamp(vignette, 0.0, 1.0); + + // Máscara de fósforo RGB — después de scanlines (orden original): + // filas brillantes saturadas → máscara invisible, filas oscuras → RGB visible. + if (u.mask_strength > 0.0) { + float whichMask = fract(gl_FragCoord.x * 0.3333333); + vec3 mask = vec3(0.80); + if (whichMask < 0.3333333) + mask.x = 1.0; + else if (whichMask < 0.6666666) + mask.y = 1.0; + else + mask.z = 1.0; + colour = mix(colour, colour * mask, u.mask_strength); + } + + // Parpadeo de fósforo CRT (~50 Hz) + if (u.flicker > 0.0) { + float flicker_wave = sin(u.time * 100.0) * 0.5 + 0.5; + colour *= 1.0 - u.flicker * 0.04 * flicker_wave; + } + + out_color = vec4(colour, 1.0); +} diff --git a/data/shaders/postfx.vert b/data/shaders/postfx.vert new file mode 100644 index 0000000..eab75cf --- /dev/null +++ b/data/shaders/postfx.vert @@ -0,0 +1,24 @@ +#version 450 + +// Vulkan GLSL vertex shader — postfx full-screen triangle +// Used for SDL3 GPU API (SPIR-V path, Win/Linux). +// Compile: glslc postfx.vert -o postfx.vert.spv +// xxd -i postfx.vert.spv > ../../source/core/rendering/sdl3gpu/postfx_vert_spv.h + +layout(location = 0) out vec2 v_uv; + +void main() { + // Full-screen triangle (no vertex buffer needed) + const vec2 positions[3] = vec2[3]( + vec2(-1.0, -1.0), + vec2( 3.0, -1.0), + vec2(-1.0, 3.0) + ); + const vec2 uvs[3] = vec2[3]( + vec2(0.0, 1.0), + vec2(2.0, 1.0), + vec2(0.0,-1.0) + ); + gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); + v_uv = uvs[gl_VertexIndex]; +} diff --git a/data/shaders/upscale.frag b/data/shaders/upscale.frag new file mode 100644 index 0000000..fb9200d --- /dev/null +++ b/data/shaders/upscale.frag @@ -0,0 +1,15 @@ +#version 450 + +// Vulkan GLSL fragment shader — Nearest-neighbour upscale pass +// Used as the first render pass when supersampling is active. +// Compile: glslc upscale.frag -o upscale.frag.spv +// xxd -i upscale.frag.spv > ../../source/core/rendering/sdl3gpu/upscale_frag_spv.h + +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 out_color; + +layout(set = 2, binding = 0) uniform sampler2D scene; + +void main() { + out_color = texture(scene, v_uv); +} diff --git a/source/core/input/input.h b/source/core/input/input.h index 9d635ef..b9d00d0 100644 --- a/source/core/input/input.h +++ b/source/core/input/input.h @@ -34,6 +34,11 @@ enum inputs_e { input_window_inc_size, input_window_dec_size, + // GPU / shaders (hotkeys provisionales hasta que haya menú de opciones) + input_toggle_gpu, + input_toggle_shader, + input_toggle_shader_type, + // Input obligatorio input_number_of_inputs }; diff --git a/source/core/rendering/screen.cpp b/source/core/rendering/screen.cpp index 95c1014..c92a59e 100644 --- a/source/core/rendering/screen.cpp +++ b/source/core/rendering/screen.cpp @@ -3,6 +3,7 @@ #include #include // for max, min +#include // for memcpy #include // for basic_ostream, operator<<, cout, endl #include // for basic_string, char_traits, string @@ -11,6 +12,10 @@ #include "core/resources/asset.h" // for Asset #include "core/resources/resource.h" +#ifndef NO_SHADERS +#include "core/rendering/sdl3gpu/sdl3gpu_shader.hpp" // for Rendering::SDL3GPUShader +#endif + #ifdef __EMSCRIPTEN__ #include #include @@ -69,8 +74,23 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options // Define el color del borde para el modo de pantalla completa borderColor = {0x00, 0x00, 0x00}; - // Crea la textura donde se dibujan los graficos del juego - gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, gameCanvasWidth, gameCanvasHeight); + // Establece el modo de video (fullscreen/ventana + logical presentation) + // ANTES de crear la textura — SDL3 GPU necesita la logical presentation + // del renderer ya aplicada al swapchain quan es reclama la ventana per a GPU. + // Mirror del pattern de jaildoctors_dilemma (que usa exactament 256×192 i + // funciona) on `initSDLVideo` configura la presentation abans de crear cap + // textura. + setVideoMode(options->videoMode != 0); + + // Força al window manager a completar el resize/posicionat abans de passar + // la ventana al dispositiu GPU. Sense açò en Linux/X11 hi ha un race + // condition que deixa el swapchain en estat inestable i fa crashear el + // driver Vulkan en `SDL_CreateGPUGraphicsPipeline`. + SDL_SyncWindow(window); + + // Crea la textura donde se dibujan los graficos del juego. + // ARGB8888 per simplificar el readback cap al pipeline SDL3 GPU. + gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, gameCanvasWidth, gameCanvasHeight); if (gameCanvas != nullptr) { SDL_SetTextureScaleMode(gameCanvas, options->filter == FILTER_NEAREST ? SDL_SCALEMODE_NEAREST : SDL_SCALEMODE_LINEAR); } @@ -80,11 +100,24 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options } } - // Establece el modo de video - setVideoMode(options->videoMode != 0); +#ifndef NO_SHADERS + // Buffer de readback del gameCanvas (lo dimensionamos una vez) + pixel_buffer_.resize(static_cast(gameCanvasWidth) * static_cast(gameCanvasHeight)); +#endif - // Inicializa el sistema de notificaciones (Text compartido de Resource) - notificationText = Resource::get()->getText("8bithud"); + // Renderiza una vez la textura vacía al renderer abans d'inicialitzar els + // shaders: jaildoctors_dilemma ho fa així i evita que el driver Vulkan + // crashegi en la creació del pipeline gràfic. `initShaders()` es crida + // després des de `Director` amb el swapchain ja estable. + SDL_RenderTexture(renderer, gameCanvas, nullptr, nullptr); + + // Estado inicial de las notificaciones. El Text real se enlaza después vía + // `initNotifications()` quan `Resource` ja estigui inicialitzat. Dividim + // això del constructor perquè `initShaders()` (GPU) ha de cridar-se ABANS + // de carregar recursos: si el SDL_Renderer ha fet abans moltes + // allocacions (carrega de textures), el driver Vulkan crasheja quan + // després es reclama la ventana per al dispositiu GPU. + notificationText = nullptr; notificationMessage = ""; notificationTextColor = {0xFF, 0xFF, 0xFF}; notificationOutlineColor = {0x00, 0x00, 0x00}; @@ -95,9 +128,18 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options registerEmscriptenEventCallbacks(); } +// Enllaça el Text de les notificacions amb el recurs compartit de `Resource`. +// S'ha de cridar després de `Resource::init(...)`. +void Screen::initNotifications() { + notificationText = Resource::get()->getText("8bithud"); +} + // Destructor Screen::~Screen() { // notificationText es propiedad de Resource — no liberar. +#ifndef NO_SHADERS + shutdownShaders(); +#endif SDL_DestroyTexture(gameCanvas); } @@ -118,6 +160,51 @@ void Screen::blit() { SDL_SetRenderTarget(renderer, gameCanvas); renderNotification(); +#ifndef NO_SHADERS + // Si el backend GPU està viu i accelerat, passem sempre per ell (tant amb + // shaders com sense). Seguim el mateix pattern que aee_plus: quan shader + // està desactivat, forcem POSTFX + params a zero només per a aquest frame + // i restaurem el shader actiu, així CRTPI no aplica les seues scanlines + // quan l'usuari ho ha desactivat. + if (shader_backend_ && shader_backend_->isHardwareAccelerated()) { + SDL_Surface *surface = SDL_RenderReadPixels(renderer, nullptr); + if (surface != nullptr) { + if (surface->format == SDL_PIXELFORMAT_ARGB8888) { + std::memcpy(pixel_buffer_.data(), surface->pixels, pixel_buffer_.size() * sizeof(Uint32)); + } else { + SDL_Surface *converted = SDL_ConvertSurface(surface, SDL_PIXELFORMAT_ARGB8888); + if (converted != nullptr) { + std::memcpy(pixel_buffer_.data(), converted->pixels, pixel_buffer_.size() * sizeof(Uint32)); + SDL_DestroySurface(converted); + } + } + SDL_DestroySurface(surface); + } + SDL_SetRenderTarget(renderer, nullptr); + + if (options->videoShaderEnabled) { + // Ruta normal: shader amb els seus params. + shader_backend_->uploadPixels(pixel_buffer_.data(), gameCanvasWidth, gameCanvasHeight); + shader_backend_->render(); + } else { + // Shader off: POSTFX amb params zero (passa-per-aquí). CRTPI no + // val perque sempre aplica els seus efectes interns; salvem i + // restaurem el shader actiu. + const auto PREV_SHADER = shader_backend_->getActiveShader(); + if (PREV_SHADER != Rendering::ShaderType::POSTFX) { + shader_backend_->setActiveShader(Rendering::ShaderType::POSTFX); + } + shader_backend_->setPostFXParams(Rendering::PostFXParams{}); + shader_backend_->uploadPixels(pixel_buffer_.data(), gameCanvasWidth, gameCanvasHeight); + shader_backend_->render(); + if (PREV_SHADER != Rendering::ShaderType::POSTFX) { + shader_backend_->setActiveShader(PREV_SHADER); + } + } + return; + } +#endif + // Vuelve a dejar el renderizador en modo normal SDL_SetRenderTarget(renderer, nullptr); @@ -199,6 +286,11 @@ void Screen::toggleIntegerScale() { void Screen::setVSync(bool enabled) { options->vSync = enabled; SDL_SetRenderVSync(renderer, enabled ? 1 : SDL_RENDERER_VSYNC_DISABLED); +#ifndef NO_SHADERS + if (shader_backend_) { + shader_backend_->setVSync(enabled); + } +#endif } // Alterna el V-Sync @@ -321,7 +413,7 @@ void Screen::clearNotification() { // Dibuja la notificación activa (si la hay) sobre el gameCanvas void Screen::renderNotification() { - if (SDL_GetTicks() >= notificationEndTime) { + if (notificationText == nullptr || SDL_GetTicks() >= notificationEndTime) { return; } notificationText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, @@ -367,3 +459,144 @@ void Screen::registerEmscriptenEventCallbacks() { emscripten_set_orientationchange_callback(nullptr, EM_TRUE, onEmOrientationChange); #endif } + +// ============================================================================ +// GPU / shaders (SDL3 GPU post-procesado). En builds con NO_SHADERS (Emscripten) +// las operaciones son no-op; la ruta clásica sigue siendo la única disponible. +// ============================================================================ + +#ifndef NO_SHADERS +// Aplica al backend el preset del shader actiu segons options. +// Només s'ha de cridar quan `videoShaderEnabled=true` (en cas contrari el +// blit() ja força POSTFX+zero params per a desactivar els efectes sense +// tocar els paràmetres emmagatzemats). +void Screen::applyShaderParams() { + if (!shader_backend_ || !shader_backend_->isHardwareAccelerated()) { + return; + } + const Rendering::ShaderType ACTIVE = options->videoShaderType == 1 + ? Rendering::ShaderType::CRTPI + : Rendering::ShaderType::POSTFX; + shader_backend_->setActiveShader(ACTIVE); + + // Preset per defecte (carregador YAML pendent). Valors estil "CRT" de CCAE. + Rendering::PostFXParams POSTFX; + POSTFX.vignette = 0.15F; + POSTFX.scanlines = 0.7F; + POSTFX.chroma = 0.2F; + shader_backend_->setPostFXParams(POSTFX); + + // CrtPi: defaults del struct ja raonables (scanline_weight=6.0, bloom=3.5…). + shader_backend_->setCrtPiParams(Rendering::CrtPiParams{}); +} +#endif + +void Screen::initShaders() { +#ifndef NO_SHADERS + if (!shader_backend_) { + shader_backend_ = std::make_unique(); + const std::string FALLBACK_DRIVER = "none"; + shader_backend_->setPreferredDriver( + options->videoGpuAcceleration ? options->videoGpuPreferredDriver : FALLBACK_DRIVER); + } + if (!shader_backend_->isHardwareAccelerated()) { + const bool ok = shader_backend_->init(window, gameCanvas, "", ""); + if (options->console) { + std::cout << "Screen::initShaders: SDL3GPUShader::init() = " << (ok ? "OK" : "FAILED") << '\n'; + } + } + if (shader_backend_->isHardwareAccelerated()) { + shader_backend_->setScaleMode(options->integerScale); + shader_backend_->setVSync(options->vSync); + applyShaderParams(); // aplica preset del shader actiu + } +#endif +} + +void Screen::shutdownShaders() { +#ifndef NO_SHADERS + // Només es crida des del destructor de Screen. Els toggles runtime NO la + // poden cridar: destruir + recrear el dispositiu SDL3 GPU amb la ventana + // ja reclamada és inestable (Vulkan/Radeon crasheja en el següent claim). + if (shader_backend_) { + shader_backend_->cleanup(); + shader_backend_.reset(); + } +#endif +} + +void Screen::setGpuAcceleration(bool enabled) { + if (options->videoGpuAcceleration == enabled) { return; } + options->videoGpuAcceleration = enabled; + // Soft toggle: el backend es manté viu (vegeu shutdownShaders). El canvi + // s'aplica al proper arrencada. S'emet una notificació perquè l'usuari + // sap que ha tocat la tecla però el canvi no és immediat. + const color_t YELLOW = {0xFF, 0xFF, 0x00}; + const color_t BLACK = {0x00, 0x00, 0x00}; + const Uint32 DUR_MS = 2500; + notify(enabled ? "GPU: ON (restart)" : "GPU: OFF (restart)", YELLOW, BLACK, DUR_MS); +} + +void Screen::toggleGpuAcceleration() { + setGpuAcceleration(!options->videoGpuAcceleration); +} + +auto Screen::isGpuAccelerated() const -> bool { +#ifndef NO_SHADERS + return shader_backend_ && shader_backend_->isHardwareAccelerated(); +#else + return false; +#endif +} + +void Screen::setShaderEnabled(bool enabled) { + if (options->videoShaderEnabled == enabled) { return; } + options->videoShaderEnabled = enabled; +#ifndef NO_SHADERS + if (enabled) { + applyShaderParams(); // restaura preset del shader actiu + } + // Si enabled=false, blit() forçarà POSTFX+zero per frame — no cal tocar + // res ara. +#endif + const color_t CYAN = {0x00, 0xFF, 0xFF}; + const color_t BLACK = {0x00, 0x00, 0x00}; + const Uint32 DUR_MS = 1500; + notify(enabled ? "Shader: ON" : "Shader: OFF", CYAN, BLACK, DUR_MS); +} + +void Screen::toggleShaderEnabled() { + setShaderEnabled(!options->videoShaderEnabled); +} + +auto Screen::isShaderEnabled() const -> bool { + return options->videoShaderEnabled; +} + +#ifndef NO_SHADERS +void Screen::setActiveShader(Rendering::ShaderType type) { + options->videoShaderType = type == Rendering::ShaderType::CRTPI ? 1 : 0; + if (options->videoShaderEnabled) { + applyShaderParams(); + } + const color_t MAGENTA = {0xFF, 0x00, 0xFF}; + const color_t BLACK = {0x00, 0x00, 0x00}; + const Uint32 DUR_MS = 1500; + notify(type == Rendering::ShaderType::CRTPI ? "Shader: CRTPI" : "Shader: POSTFX", MAGENTA, BLACK, DUR_MS); +} + +auto Screen::getActiveShader() const -> Rendering::ShaderType { + return options->videoShaderType == 1 ? Rendering::ShaderType::CRTPI : Rendering::ShaderType::POSTFX; +} +#endif + +void Screen::toggleActiveShader() { +#ifndef NO_SHADERS + const Rendering::ShaderType NEXT = getActiveShader() == Rendering::ShaderType::POSTFX + ? Rendering::ShaderType::CRTPI + : Rendering::ShaderType::POSTFX; + setActiveShader(NEXT); +#else + options->videoShaderType = options->videoShaderType == 1 ? 0 : 1; +#endif +} diff --git a/source/core/rendering/screen.h b/source/core/rendering/screen.h index 35fad14..25cbffa 100644 --- a/source/core/rendering/screen.h +++ b/source/core/rendering/screen.h @@ -2,9 +2,19 @@ #include +#include // for unique_ptr #include // for string +#include // for vector #include "utils/utils.h" // for color_t + +#ifndef NO_SHADERS +#include "core/rendering/shader_backend.hpp" // for Rendering::ShaderType +namespace Rendering { + class ShaderBackend; +} +#endif + class Asset; class Text; @@ -50,9 +60,25 @@ class Screen { void setBorderColor(color_t color); // Cambia el color del borde // Notificaciones + void initNotifications(); // Enllaça el Text de notificacions amb `Resource`. A cridar després de `Resource::init(...)`. void notify(const std::string &text, color_t textColor, color_t outlineColor, Uint32 durationMs); // Muestra una notificación en la línea superior del canvas durante durationMs. Sobrescribe cualquier notificación activa (sin apilación). void clearNotification(); // Limpia la notificación actual + // GPU / shaders (post-procesado). En builds con NO_SHADERS (Emscripten) son no-op. + void initShaders(); // Crea el backend GPU si no existe y lo inicializa + void shutdownShaders(); // Libera el backend GPU + void setGpuAcceleration(bool enabled); // Crea/destruye el backend según valor, persiste options + void toggleGpuAcceleration(); // Alterna aceleración GPU + auto isGpuAccelerated() const -> bool; // true si el backend existe y reporta hardware OK + void setShaderEnabled(bool enabled); // Activa o desactiva el post-procesado (persiste) + void toggleShaderEnabled(); // Alterna post-procesado + auto isShaderEnabled() const -> bool; // Estado actual (lee options) +#ifndef NO_SHADERS + void setActiveShader(Rendering::ShaderType type); // POSTFX o CRTPI + auto getActiveShader() const -> Rendering::ShaderType; +#endif + void toggleActiveShader(); // Alterna POSTFX ↔ CRTPI + private: // Helpers internos de setVideoMode void applyFullscreen(bool fullscreen); // SDL_SetWindowFullscreen + visibilidad del cursor @@ -67,6 +93,12 @@ class Screen { // Notificaciones void renderNotification(); // Dibuja la notificación activa (si la hay) sobre el gameCanvas +#ifndef NO_SHADERS + // Aplica els paràmetres actuals del shader al backend segons options + // (pass-through si `videoShaderEnabled==false`, preset per defecte si true). + void applyShaderParams(); +#endif + // Objetos y punteros SDL_Window *window; // Ventana de la aplicación SDL_Renderer *renderer; // El renderizador de la ventana @@ -91,4 +123,10 @@ class Screen { color_t notificationOutlineColor; // Color del outline Uint32 notificationEndTime; // SDL_GetTicks() hasta el cual se muestra int notificationY; // Fila vertical en el canvas virtual + +#ifndef NO_SHADERS + // GPU / shaders + std::unique_ptr shader_backend_; // Backend GPU (nullptr si inactivo) + std::vector pixel_buffer_; // Buffer de readback del gameCanvas (ARGB8888) +#endif }; diff --git a/source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp b/source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp new file mode 100644 index 0000000..cc43cc0 --- /dev/null +++ b/source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp @@ -0,0 +1,1329 @@ +#include "core/rendering/sdl3gpu/sdl3gpu_shader.hpp" + +#include + +#include // std::min, std::max, std::floor +#include // std::floor +#include // memcpy, strlen +#include // std::cout + +#ifndef __APPLE__ +#include "core/rendering/sdl3gpu/spv/crtpi_frag_spv.h" +#include "core/rendering/sdl3gpu/spv/downscale_frag_spv.h" +#include "core/rendering/sdl3gpu/spv/postfx_frag_spv.h" +#include "core/rendering/sdl3gpu/spv/postfx_vert_spv.h" +#include "core/rendering/sdl3gpu/spv/upscale_frag_spv.h" +#endif + +#ifdef __APPLE__ +// ============================================================================ +// MSL shaders (Metal Shading Language) — macOS +// ============================================================================ + +// NOLINTBEGIN(readability-identifier-naming) +static const char* POSTFX_VERT_MSL = R"( +#include +using namespace metal; + +struct PostVOut { + float4 pos [[position]]; + float2 uv; +}; + +vertex PostVOut postfx_vs(uint vid [[vertex_id]]) { + const float2 positions[3] = { {-1.0, -1.0}, {3.0, -1.0}, {-1.0, 3.0} }; + const float2 uvs[3] = { { 0.0, 1.0}, {2.0, 1.0}, { 0.0,-1.0} }; + PostVOut out; + out.pos = float4(positions[vid], 0.0, 1.0); + out.uv = uvs[vid]; + return out; +} +)"; + +static const char* POSTFX_FRAG_MSL = R"( +#include +using namespace metal; + +struct PostVOut { + float4 pos [[position]]; + float2 uv; +}; + +struct PostFXUniforms { + float vignette_strength; + float chroma_strength; + float scanline_strength; + float screen_height; + float mask_strength; + float gamma_strength; + float curvature; + float bleeding; + float pixel_scale; + float time; + float oversample; // 1.0 = sin SS, 3.0 = 3× supersampling + float flicker; // 0 = off, 1 = phosphor flicker ~50 Hz +}; + +// YCbCr helpers for NTSC bleeding +static float3 rgb_to_ycc(float3 rgb) { + return float3( + 0.299f*rgb.r + 0.587f*rgb.g + 0.114f*rgb.b, + -0.169f*rgb.r - 0.331f*rgb.g + 0.500f*rgb.b + 0.5f, + 0.500f*rgb.r - 0.419f*rgb.g - 0.081f*rgb.b + 0.5f + ); +} +static float3 ycc_to_rgb(float3 ycc) { + float y = ycc.x; + float cb = ycc.y - 0.5f; + float cr = ycc.z - 0.5f; + return clamp(float3( + y + 1.402f*cr, + y - 0.344f*cb - 0.714f*cr, + y + 1.772f*cb + ), 0.0f, 1.0f); +} + +fragment float4 postfx_fs(PostVOut in [[stage_in]], + texture2d scene [[texture(0)]], + sampler samp [[sampler(0)]], + constant PostFXUniforms& u [[buffer(0)]]) { + float2 uv = in.uv; + + // Curvatura barrel CRT + if (u.curvature > 0.0f) { + float2 c = uv - 0.5f; + float rsq = dot(c, c); + float2 dist = float2(0.05f, 0.1f) * u.curvature; + float2 barrelScale = 1.0f - 0.23f * dist; + c += c * (dist * rsq); + c *= barrelScale; + if (abs(c.x) >= 0.5f || abs(c.y) >= 0.5f) { + return float4(0.0f, 0.0f, 0.0f, 1.0f); + } + uv = c + 0.5f; + } + + // Muestra base + float3 base = scene.sample(samp, uv).rgb; + + // Sangrado NTSC — difuminado horizontal de crominancia. + // step = 1 pixel de juego en espacio UV (corrige SS: scene.get_width() = game_w * oversample). + float3 colour; + if (u.bleeding > 0.0f) { + float tw = float(scene.get_width()); + float step = u.oversample / tw; // 1 pixel lógico en UV + float3 ycc = rgb_to_ycc(base); + float3 ycc_l2 = rgb_to_ycc(scene.sample(samp, uv - float2(2.0f*step, 0.0f)).rgb); + float3 ycc_l1 = rgb_to_ycc(scene.sample(samp, uv - float2(1.0f*step, 0.0f)).rgb); + float3 ycc_r1 = rgb_to_ycc(scene.sample(samp, uv + float2(1.0f*step, 0.0f)).rgb); + float3 ycc_r2 = rgb_to_ycc(scene.sample(samp, uv + float2(2.0f*step, 0.0f)).rgb); + ycc.yz = (ycc_l2.yz + ycc_l1.yz*2.0f + ycc.yz*2.0f + ycc_r1.yz*2.0f + ycc_r2.yz) / 8.0f; + colour = mix(base, ycc_to_rgb(ycc), u.bleeding); + } else { + colour = base; + } + + // Aberración cromática (drift animado con time para efecto NTSC real) + float ca = u.chroma_strength * 0.005f * (1.0f + 0.15f * sin(u.time * 7.3f)); + colour.r = scene.sample(samp, uv + float2(ca, 0.0f)).r; + colour.b = scene.sample(samp, uv - float2(ca, 0.0f)).b; + + // Corrección gamma (linealizar antes de scanlines, codificar después) + if (u.gamma_strength > 0.0f) { + float3 lin = pow(colour, float3(2.4f)); + colour = mix(colour, lin, u.gamma_strength); + } + + // Scanlines — proporción 2/3 brillantes + 1/3 oscuras por fila lógica. + // Casos especiales: 1 subfila → sin efecto; 2 subfilas → 1+1 (50/50). + // Constantes ajustables: + const float SCAN_DARK_RATIO = 0.333f; // fracción de subfilas oscuras (ps >= 3) + const float SCAN_DARK_FLOOR = 0.42f; // multiplicador de brillo de subfilas oscuras + if (u.scanline_strength > 0.0f) { + float ps = max(1.0f, round(u.pixel_scale)); + float frac_in_row = fract(uv.y * u.screen_height); + float row_pos = floor(frac_in_row * ps); + float bright_rows = (ps < 2.0f) ? ps : ((ps < 3.0f) ? 1.0f : floor(ps * (1.0f - SCAN_DARK_RATIO))); + float is_dark = step(bright_rows, row_pos); + float scan = mix(1.0f, SCAN_DARK_FLOOR, is_dark); + colour *= mix(1.0f, scan, u.scanline_strength); + } + + if (u.gamma_strength > 0.0f) { + float3 enc = pow(colour, float3(1.0f/2.2f)); + colour = mix(colour, enc, u.gamma_strength); + } + + // Viñeta + float2 d = uv - 0.5f; + float vignette = 1.0f - dot(d, d) * u.vignette_strength; + colour *= clamp(vignette, 0.0f, 1.0f); + + // Máscara de fósforo RGB — después de scanlines (orden original): + // filas brillantes saturadas → máscara invisible, filas oscuras → RGB visible. + if (u.mask_strength > 0.0f) { + float whichMask = fract(in.pos.x * 0.3333333f); + float3 mask = float3(0.80f); + if (whichMask < 0.3333333f) mask.x = 1.0f; + else if (whichMask < 0.6666667f) mask.y = 1.0f; + else mask.z = 1.0f; + colour = mix(colour, colour * mask, u.mask_strength); + } + + // Parpadeo de fósforo CRT (~50 Hz) + if (u.flicker > 0.0f) { + float flicker_wave = sin(u.time * 100.0f) * 0.5f + 0.5f; + colour *= 1.0f - u.flicker * 0.04f * flicker_wave; + } + + return float4(colour, 1.0f); +} +)"; +static const char* UPSCALE_FRAG_MSL = R"( +#include +using namespace metal; +struct VertOut { float4 pos [[position]]; float2 uv; }; +fragment float4 upscale_fs(VertOut in [[stage_in]], + texture2d scene [[texture(0)]], + sampler smp [[sampler(0)]]) +{ + return scene.sample(smp, in.uv); +} +)"; + +static const char* DOWNSCALE_FRAG_MSL = R"( +#include +using namespace metal; +struct VertOut { float4 pos [[position]]; float2 uv; }; +struct DownscaleUniforms { int algorithm; float pad0; float pad1; float pad2; }; + +static float lanczos_w(float t, float a) { + t = abs(t); + if (t < 0.0001f) { return 1.0f; } + if (t >= a) { return 0.0f; } + const float PI = 3.14159265358979f; + float pt = PI * t; + return (a * sin(pt) * sin(pt / a)) / (pt * pt); +} + +fragment float4 downscale_fs(VertOut in [[stage_in]], + texture2d source [[texture(0)]], + sampler smp [[sampler(0)]], + constant DownscaleUniforms& u [[buffer(0)]]) +{ + float2 src_size = float2(source.get_width(), source.get_height()); + float2 p = in.uv * src_size; + float2 p_floor = floor(p); + float a = (u.algorithm == 0) ? 2.0f : 3.0f; + int win = int(a); + float4 color = float4(0.0f); + float weight_sum = 0.0f; + for (int j = -win; j <= win; j++) { + for (int i = -win; i <= win; i++) { + float2 tap_center = p_floor + float2(float(i), float(j)) + 0.5f; + float2 offset = tap_center - p; + float w = lanczos_w(offset.x, a) * lanczos_w(offset.y, a); + color += source.sample(smp, tap_center / src_size) * w; + weight_sum += w; + } + } + return (weight_sum > 0.0f) ? (color / weight_sum) : float4(0.0f, 0.0f, 0.0f, 1.0f); +} +)"; +static const char* CRTPI_FRAG_MSL = R"( +#include +using namespace metal; + +struct PostVOut { + float4 pos [[position]]; + float2 uv; +}; + +struct CrtPiUniforms { + // vec4 #0 + float scanline_weight; + float scanline_gap_brightness; + float bloom_factor; + float input_gamma; + // vec4 #1 + float output_gamma; + float mask_brightness; + float curvature_x; + float curvature_y; + // vec4 #2 + int mask_type; + int enable_scanlines; + int enable_multisample; + int enable_gamma; + // vec4 #3 + int enable_curvature; + int enable_sharper; + float texture_width; + float texture_height; +}; + +static float2 crtpi_distort(float2 coord, float2 screen_scale, float cx, float cy) { + float2 curvature = float2(cx, cy); + float2 barrel_scale = 1.0f - (0.23f * curvature); + coord *= screen_scale; + coord -= 0.5f; + float rsq = coord.x * coord.x + coord.y * coord.y; + coord += coord * (curvature * rsq); + coord *= barrel_scale; + if (abs(coord.x) >= 0.5f || abs(coord.y) >= 0.5f) { return float2(-1.0f); } + coord += 0.5f; + coord /= screen_scale; + return coord; +} + +static float crtpi_scan_weight(float dist, float sw, float gap) { + return max(1.0f - dist * dist * sw, gap); +} + +static float crtpi_scan_line(float dy, float filter_w, float sw, float gap, bool ms) { + float w = crtpi_scan_weight(dy, sw, gap); + if (ms) { + w += crtpi_scan_weight(dy - filter_w, sw, gap); + w += crtpi_scan_weight(dy + filter_w, sw, gap); + w *= 0.3333333f; + } + return w; +} + +fragment float4 crtpi_fs(PostVOut in [[stage_in]], + texture2d tex [[texture(0)]], + sampler samp [[sampler(0)]], + constant CrtPiUniforms& u [[buffer(0)]]) { + float2 tex_size = float2(u.texture_width, u.texture_height); + float filter_width = (768.0f / u.texture_height) / 3.0f; + float2 texcoord = in.uv; + + if (u.enable_curvature != 0) { + texcoord = crtpi_distort(texcoord, float2(1.0f, 1.0f), u.curvature_x, u.curvature_y); + if (texcoord.x < 0.0f) { return float4(0.0f, 0.0f, 0.0f, 1.0f); } + } + + float2 coord_in_pixels = texcoord * tex_size; + float2 tc; + float scan_weight; + + if (u.enable_sharper != 0) { + float2 temp = floor(coord_in_pixels) + 0.5f; + tc = temp / tex_size; + float2 deltas = coord_in_pixels - temp; + scan_weight = crtpi_scan_line(deltas.y, filter_width, u.scanline_weight, u.scanline_gap_brightness, u.enable_multisample != 0); + float2 signs = sign(deltas); + deltas.x *= 2.0f; + deltas = deltas * deltas; + deltas.y = deltas.y * deltas.y; + deltas.x *= 0.5f; + deltas.y *= 8.0f; + deltas /= tex_size; + deltas *= signs; + tc = tc + deltas; + } else { + float temp_y = floor(coord_in_pixels.y) + 0.5f; + float y_coord = temp_y / tex_size.y; + float dy = coord_in_pixels.y - temp_y; + scan_weight = crtpi_scan_line(dy, filter_width, u.scanline_weight, u.scanline_gap_brightness, u.enable_multisample != 0); + float sign_y = sign(dy); + dy = dy * dy; + dy = dy * dy; + dy *= 8.0f; + dy /= tex_size.y; + dy *= sign_y; + tc = float2(texcoord.x, y_coord + dy); + } + + float3 colour = tex.sample(samp, tc).rgb; + + if (u.enable_scanlines != 0) { + if (u.enable_gamma != 0) { colour = pow(colour, float3(u.input_gamma)); } + colour *= scan_weight * u.bloom_factor; + if (u.enable_gamma != 0) { colour = pow(colour, float3(1.0f / u.output_gamma)); } + } + + if (u.mask_type == 1) { + float wm = fract(in.pos.x * 0.5f); + float3 mask = (wm < 0.5f) ? float3(u.mask_brightness, 1.0f, u.mask_brightness) + : float3(1.0f, u.mask_brightness, 1.0f); + colour *= mask; + } else if (u.mask_type == 2) { + float wm = fract(in.pos.x * 0.3333333f); + float3 mask = float3(u.mask_brightness); + if (wm < 0.3333333f) mask.x = 1.0f; + else if (wm < 0.6666666f) mask.y = 1.0f; + else mask.z = 1.0f; + colour *= mask; + } + + return float4(colour, 1.0f); +} +)"; +// NOLINTEND(readability-identifier-naming) + +#endif // __APPLE__ + +namespace Rendering { + + // --------------------------------------------------------------------------- + // Destructor + // --------------------------------------------------------------------------- + SDL3GPUShader::~SDL3GPUShader() { + destroy(); + } + + // --------------------------------------------------------------------------- + // init + // --------------------------------------------------------------------------- + auto SDL3GPUShader::init(SDL_Window* window, + SDL_Texture* texture, + const std::string& /*vertex_source*/, + const std::string& /*fragment_source*/) -> bool { + // Si ya estaba inicializado (p.ej. al cambiar borde), liberar recursos + // de textura/pipeline pero mantener el device vivo para evitar conflictos + // con SDL_Renderer en Windows/Vulkan. + if (is_initialized_) { + cleanup(); + } + + window_ = window; + + // Dimensions from the SDL_Texture placeholder + float fw = 0.0F; + float fh = 0.0F; + SDL_GetTextureSize(texture, &fw, &fh); + game_width_ = static_cast(fw); + game_height_ = static_cast(fh); + uniforms_.screen_height = static_cast(game_height_); + uniforms_.oversample = static_cast(oversample_); + + // ---------------------------------------------------------------- + // 1. Create GPU device (solo si no existe ya) + // ---------------------------------------------------------------- + if (preferred_driver_ == "none") { + SDL_Log("SDL3GPUShader: GPU disabled by config, using SDL_Renderer fallback"); + driver_name_ = ""; // vacío → RenderInfo mostrará "sdl" + return false; + } + if (device_ == nullptr) { +#ifdef __APPLE__ + const SDL_GPUShaderFormat PREFERRED = SDL_GPU_SHADERFORMAT_MSL | SDL_GPU_SHADERFORMAT_METALLIB; +#else + const SDL_GPUShaderFormat PREFERRED = SDL_GPU_SHADERFORMAT_SPIRV; +#endif + const char* preferred = preferred_driver_.empty() ? nullptr : preferred_driver_.c_str(); + device_ = SDL_CreateGPUDevice(PREFERRED, false, preferred); + if (device_ == nullptr && preferred != nullptr) { + SDL_Log("SDL3GPUShader: driver '%s' not available, falling back to auto", preferred); + device_ = SDL_CreateGPUDevice(PREFERRED, false, nullptr); + } + if (device_ == nullptr) { + SDL_Log("SDL3GPUShader: SDL_CreateGPUDevice failed: %s", SDL_GetError()); + return false; + } + driver_name_ = SDL_GetGPUDeviceDriver(device_); + std::cout << "GPU Driver : " << driver_name_ << '\n'; + + // ---------------------------------------------------------------- + // 2. Claim window (una sola vez — no liberar hasta destroy()) + // ---------------------------------------------------------------- + if (!SDL_ClaimWindowForGPUDevice(device_, window_)) { + SDL_Log("SDL3GPUShader: SDL_ClaimWindowForGPUDevice failed: %s", SDL_GetError()); + SDL_DestroyGPUDevice(device_); + device_ = nullptr; + return false; + } + SDL_SetGPUSwapchainParameters(device_, window_, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, bestPresentMode(vsync_)); + } + + // ---------------------------------------------------------------- + // 3. Create scene texture (upload target, always game resolution) + // Format: B8G8R8A8_UNORM matches SDL ARGB8888 byte layout on LE + // ---------------------------------------------------------------- + SDL_GPUTextureCreateInfo tex_info = {}; + tex_info.type = SDL_GPU_TEXTURETYPE_2D; + tex_info.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; + tex_info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER; + tex_info.width = static_cast(game_width_); + tex_info.height = static_cast(game_height_); + tex_info.layer_count_or_depth = 1; + tex_info.num_levels = 1; + scene_texture_ = SDL_CreateGPUTexture(device_, &tex_info); + if (scene_texture_ == nullptr) { + SDL_Log("SDL3GPUShader: failed to create scene texture: %s", SDL_GetError()); + cleanup(); + return false; + } + + // scaled_texture_ se creará en el primer render() una vez conocido el zoom de ventana + ss_factor_ = 0; + + // ---------------------------------------------------------------- + // 4. Create upload transfer buffer (CPU → GPU, always game resolution) + // ---------------------------------------------------------------- + SDL_GPUTransferBufferCreateInfo tb_info = {}; + tb_info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD; + tb_info.size = static_cast(game_width_ * game_height_ * 4); + upload_buffer_ = SDL_CreateGPUTransferBuffer(device_, &tb_info); + if (upload_buffer_ == nullptr) { + SDL_Log("SDL3GPUShader: failed to create upload buffer: %s", SDL_GetError()); + cleanup(); + return false; + } + + // ---------------------------------------------------------------- + // 5. Create samplers: NEAREST (pixel art) + LINEAR (supersampling) + // ---------------------------------------------------------------- + SDL_GPUSamplerCreateInfo samp_info = {}; + samp_info.min_filter = SDL_GPU_FILTER_NEAREST; + samp_info.mag_filter = SDL_GPU_FILTER_NEAREST; + samp_info.mipmap_mode = SDL_GPU_SAMPLERMIPMAPMODE_NEAREST; + samp_info.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; + samp_info.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; + samp_info.address_mode_w = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; + sampler_ = SDL_CreateGPUSampler(device_, &samp_info); + if (sampler_ == nullptr) { + SDL_Log("SDL3GPUShader: failed to create sampler: %s", SDL_GetError()); + cleanup(); + return false; + } + + SDL_GPUSamplerCreateInfo lsamp_info = {}; + lsamp_info.min_filter = SDL_GPU_FILTER_LINEAR; + lsamp_info.mag_filter = SDL_GPU_FILTER_LINEAR; + lsamp_info.mipmap_mode = SDL_GPU_SAMPLERMIPMAPMODE_NEAREST; + lsamp_info.address_mode_u = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; + lsamp_info.address_mode_v = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; + lsamp_info.address_mode_w = SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE; + linear_sampler_ = SDL_CreateGPUSampler(device_, &lsamp_info); + if (linear_sampler_ == nullptr) { + SDL_Log("SDL3GPUShader: failed to create linear sampler: %s", SDL_GetError()); + cleanup(); + return false; + } + + // ---------------------------------------------------------------- + // 6. Create PostFX graphics pipeline + // ---------------------------------------------------------------- + if (!createPipeline()) { + cleanup(); + return false; + } + + // ---------------------------------------------------------------- + // 7. Create CrtPi graphics pipeline + // ---------------------------------------------------------------- + if (!createCrtPiPipeline()) { + cleanup(); + return false; + } + + is_initialized_ = true; + std::cout << "GPU Shader : initialized OK — game " << game_width_ << 'x' << game_height_ << ", oversample " << oversample_ << '\n'; + return true; + } + + // --------------------------------------------------------------------------- + // createPipeline + // --------------------------------------------------------------------------- + auto SDL3GPUShader::createPipeline() -> bool { // NOLINT(readability-function-cognitive-complexity) + const SDL_GPUTextureFormat SWAPCHAIN_FMT = SDL_GetGPUSwapchainTextureFormat(device_, window_); + + // ---- PostFX pipeline (scene/scaled → swapchain) ---- +#ifdef __APPLE__ + SDL_GPUShader* vert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* frag = createShaderMSL(device_, POSTFX_FRAG_MSL, "postfx_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#else + SDL_GPUShader* vert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* frag = createShaderSPIRV(device_, kpostfx_frag_spv, kpostfx_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#endif + + if ((vert == nullptr) || (frag == nullptr)) { + SDL_Log("SDL3GPUShader: failed to compile PostFX shaders"); + if (vert != nullptr) { SDL_ReleaseGPUShader(device_, vert); } + if (frag != nullptr) { SDL_ReleaseGPUShader(device_, frag); } + return false; + } + + SDL_GPUColorTargetBlendState no_blend = {}; + no_blend.enable_blend = false; + no_blend.enable_color_write_mask = false; + + SDL_GPUColorTargetDescription color_target = {}; + color_target.format = SWAPCHAIN_FMT; + color_target.blend_state = no_blend; + + SDL_GPUVertexInputState no_input = {}; + + SDL_GPUGraphicsPipelineCreateInfo pipe_info = {}; + pipe_info.vertex_shader = vert; + pipe_info.fragment_shader = frag; + pipe_info.vertex_input_state = no_input; + pipe_info.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + pipe_info.target_info.num_color_targets = 1; + pipe_info.target_info.color_target_descriptions = &color_target; + + pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &pipe_info); + + SDL_ReleaseGPUShader(device_, vert); + SDL_ReleaseGPUShader(device_, frag); + + if (pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: PostFX pipeline creation failed: %s", SDL_GetError()); + return false; + } + + // ---- Upscale pipeline (scene → scaled_texture_, nearest) ---- +#ifdef __APPLE__ + SDL_GPUShader* uvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* ufrag = createShaderMSL(device_, UPSCALE_FRAG_MSL, "upscale_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 0); +#else + SDL_GPUShader* uvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* ufrag = createShaderSPIRV(device_, kupscale_frag_spv, kupscale_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 0); +#endif + + if ((uvert == nullptr) || (ufrag == nullptr)) { + SDL_Log("SDL3GPUShader: failed to compile upscale shaders"); + if (uvert != nullptr) { SDL_ReleaseGPUShader(device_, uvert); } + if (ufrag != nullptr) { SDL_ReleaseGPUShader(device_, ufrag); } + return false; + } + + SDL_GPUColorTargetDescription upscale_color_target = {}; + upscale_color_target.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; + upscale_color_target.blend_state = no_blend; + + SDL_GPUGraphicsPipelineCreateInfo upscale_pipe_info = {}; + upscale_pipe_info.vertex_shader = uvert; + upscale_pipe_info.fragment_shader = ufrag; + upscale_pipe_info.vertex_input_state = no_input; + upscale_pipe_info.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + upscale_pipe_info.target_info.num_color_targets = 1; + upscale_pipe_info.target_info.color_target_descriptions = &upscale_color_target; + + upscale_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &upscale_pipe_info); + + SDL_ReleaseGPUShader(device_, uvert); + SDL_ReleaseGPUShader(device_, ufrag); + + if (upscale_pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: upscale pipeline creation failed: %s", SDL_GetError()); + return false; + } + + // ---- PostFX offscreen pipeline (scaled_texture_ → postfx_texture_, B8G8R8A8) ---- + // Mismos shaders que pipeline_ pero con formato de salida B8G8R8A8_UNORM para textura intermedia. +#ifdef __APPLE__ + SDL_GPUShader* ofvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* offrag = createShaderMSL(device_, POSTFX_FRAG_MSL, "postfx_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#else + SDL_GPUShader* ofvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* offrag = createShaderSPIRV(device_, kpostfx_frag_spv, kpostfx_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#endif + + if ((ofvert == nullptr) || (offrag == nullptr)) { + SDL_Log("SDL3GPUShader: failed to compile PostFX offscreen shaders"); + if (ofvert != nullptr) { SDL_ReleaseGPUShader(device_, ofvert); } + if (offrag != nullptr) { SDL_ReleaseGPUShader(device_, offrag); } + return false; + } + + SDL_GPUColorTargetDescription offscreen_color_target = {}; + offscreen_color_target.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; + offscreen_color_target.blend_state = no_blend; + + SDL_GPUGraphicsPipelineCreateInfo offscreen_pipe_info = {}; + offscreen_pipe_info.vertex_shader = ofvert; + offscreen_pipe_info.fragment_shader = offrag; + offscreen_pipe_info.vertex_input_state = no_input; + offscreen_pipe_info.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + offscreen_pipe_info.target_info.num_color_targets = 1; + offscreen_pipe_info.target_info.color_target_descriptions = &offscreen_color_target; + + postfx_offscreen_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &offscreen_pipe_info); + + SDL_ReleaseGPUShader(device_, ofvert); + SDL_ReleaseGPUShader(device_, offrag); + + if (postfx_offscreen_pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: PostFX offscreen pipeline creation failed: %s", SDL_GetError()); + return false; + } + + // ---- Downscale pipeline (postfx_texture_ → swapchain, Lanczos) ---- +#ifdef __APPLE__ + SDL_GPUShader* dvert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* dfrag = createShaderMSL(device_, DOWNSCALE_FRAG_MSL, "downscale_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#else + SDL_GPUShader* dvert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* dfrag = createShaderSPIRV(device_, kdownscale_frag_spv, kdownscale_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#endif + + if ((dvert == nullptr) || (dfrag == nullptr)) { + SDL_Log("SDL3GPUShader: failed to compile downscale shaders"); + if (dvert != nullptr) { SDL_ReleaseGPUShader(device_, dvert); } + if (dfrag != nullptr) { SDL_ReleaseGPUShader(device_, dfrag); } + return false; + } + + SDL_GPUColorTargetDescription downscale_color_target = {}; + downscale_color_target.format = SWAPCHAIN_FMT; + downscale_color_target.blend_state = no_blend; + + SDL_GPUGraphicsPipelineCreateInfo downscale_pipe_info = {}; + downscale_pipe_info.vertex_shader = dvert; + downscale_pipe_info.fragment_shader = dfrag; + downscale_pipe_info.vertex_input_state = no_input; + downscale_pipe_info.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + downscale_pipe_info.target_info.num_color_targets = 1; + downscale_pipe_info.target_info.color_target_descriptions = &downscale_color_target; + + downscale_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &downscale_pipe_info); + + SDL_ReleaseGPUShader(device_, dvert); + SDL_ReleaseGPUShader(device_, dfrag); + + if (downscale_pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: downscale pipeline creation failed: %s", SDL_GetError()); + return false; + } + + return true; + } + + // --------------------------------------------------------------------------- + // createCrtPiPipeline — pipeline dedicado para el shader CRT-Pi. + // Usa el mismo vertex shader que postfx (fullscreen-triangle genérico). + // El fragment shader es específico para el algoritmo CRT-Pi. + // Sin supersampling ni Lanczos: va siempre directo al swapchain. + // --------------------------------------------------------------------------- + auto SDL3GPUShader::createCrtPiPipeline() -> bool { + const SDL_GPUTextureFormat SWAPCHAIN_FMT = SDL_GetGPUSwapchainTextureFormat(device_, window_); + +#ifdef __APPLE__ + SDL_GPUShader* vert = createShaderMSL(device_, POSTFX_VERT_MSL, "postfx_vs", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* frag = createShaderMSL(device_, CRTPI_FRAG_MSL, "crtpi_fs", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#else + SDL_GPUShader* vert = createShaderSPIRV(device_, kpostfx_vert_spv, kpostfx_vert_spv_size, "main", SDL_GPU_SHADERSTAGE_VERTEX, 0, 0); + SDL_GPUShader* frag = createShaderSPIRV(device_, kcrtpi_frag_spv, kcrtpi_frag_spv_size, "main", SDL_GPU_SHADERSTAGE_FRAGMENT, 1, 1); +#endif + + if ((vert == nullptr) || (frag == nullptr)) { + SDL_Log("SDL3GPUShader: failed to compile CrtPi shaders"); + if (vert != nullptr) { SDL_ReleaseGPUShader(device_, vert); } + if (frag != nullptr) { SDL_ReleaseGPUShader(device_, frag); } + return false; + } + + SDL_GPUColorTargetBlendState no_blend = {}; + no_blend.enable_blend = false; + no_blend.enable_color_write_mask = false; + + SDL_GPUColorTargetDescription color_target = {}; + color_target.format = SWAPCHAIN_FMT; + color_target.blend_state = no_blend; + + SDL_GPUVertexInputState no_input = {}; + + SDL_GPUGraphicsPipelineCreateInfo pipe_info = {}; + pipe_info.vertex_shader = vert; + pipe_info.fragment_shader = frag; + pipe_info.vertex_input_state = no_input; + pipe_info.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + pipe_info.target_info.num_color_targets = 1; + pipe_info.target_info.color_target_descriptions = &color_target; + + crtpi_pipeline_ = SDL_CreateGPUGraphicsPipeline(device_, &pipe_info); + + SDL_ReleaseGPUShader(device_, vert); + SDL_ReleaseGPUShader(device_, frag); + + if (crtpi_pipeline_ == nullptr) { + SDL_Log("SDL3GPUShader: CrtPi pipeline creation failed: %s", SDL_GetError()); + return false; + } + + return true; + } + + // --------------------------------------------------------------------------- + // uploadPixels — copies ARGB8888 CPU pixels into the GPU transfer buffer. + // Con supersampling (oversample_ > 1) expande cada pixel del juego a un bloque + // oversample × oversample y hornea la scanline oscura en la última fila del bloque. + // --------------------------------------------------------------------------- + void SDL3GPUShader::uploadPixels(const Uint32* pixels, int width, int height) { + if (!is_initialized_ || (upload_buffer_ == nullptr)) { return; } + + void* mapped = SDL_MapGPUTransferBuffer(device_, upload_buffer_, false); + if (mapped == nullptr) { + SDL_Log("SDL3GPUShader: SDL_MapGPUTransferBuffer failed: %s", SDL_GetError()); + return; + } + + // Copia directa — el upscale lo hace la GPU en el primer render pass + std::memcpy(mapped, pixels, static_cast(width * height * 4)); + + SDL_UnmapGPUTransferBuffer(device_, upload_buffer_); + } + + // --------------------------------------------------------------------------- + // render — upload scene texture + PostFX pass → swapchain + // --------------------------------------------------------------------------- + void SDL3GPUShader::render() { // NOLINT(readability-function-cognitive-complexity) + if (!is_initialized_) { return; } + + // Paso 0: si SS activo, calcular el factor necesario según el zoom actual y recrear si cambió. + // Factor = primer múltiplo de 3 >= zoom (mín 3). Se recrea solo en saltos de factor. + if (oversample_ > 1 && game_height_ > 0) { + int win_w = 0; + int win_h = 0; + SDL_GetWindowSizeInPixels(window_, &win_w, &win_h); + const float ZOOM = static_cast(win_h) / static_cast(game_height_); + const int NEED_FACTOR = calcSsFactor(ZOOM); + if (NEED_FACTOR != ss_factor_) { + SDL_WaitForGPUIdle(device_); + recreateScaledTexture(NEED_FACTOR); + } + } + + SDL_GPUCommandBuffer* cmd = SDL_AcquireGPUCommandBuffer(device_); + if (cmd == nullptr) { + SDL_Log("SDL3GPUShader: SDL_AcquireGPUCommandBuffer failed: %s", SDL_GetError()); + return; + } + + // ---- Copy pass: transfer buffer → scene texture (siempre a resolución del juego) ---- + SDL_GPUCopyPass* copy = SDL_BeginGPUCopyPass(cmd); + if (copy != nullptr) { + SDL_GPUTextureTransferInfo src = {}; + src.transfer_buffer = upload_buffer_; + src.offset = 0; + src.pixels_per_row = static_cast(game_width_); + src.rows_per_layer = static_cast(game_height_); + + SDL_GPUTextureRegion dst = {}; + dst.texture = scene_texture_; + dst.w = static_cast(game_width_); + dst.h = static_cast(game_height_); + dst.d = 1; + + SDL_UploadToGPUTexture(copy, &src, &dst, false); + SDL_EndGPUCopyPass(copy); + } + + // ---- Upscale pass: scene_texture_ → scaled_texture_ (NEAREST o LINEAR según linear_upscale_) ---- + if (oversample_ > 1 && scaled_texture_ != nullptr && upscale_pipeline_ != nullptr) { + SDL_GPUColorTargetInfo upscale_target = {}; + upscale_target.texture = scaled_texture_; + upscale_target.load_op = SDL_GPU_LOADOP_DONT_CARE; + upscale_target.store_op = SDL_GPU_STOREOP_STORE; + + SDL_GPURenderPass* upass = SDL_BeginGPURenderPass(cmd, &upscale_target, 1, nullptr); + if (upass != nullptr) { + SDL_BindGPUGraphicsPipeline(upass, upscale_pipeline_); + SDL_GPUTextureSamplerBinding ubinding = {}; + ubinding.texture = scene_texture_; + ubinding.sampler = (linear_upscale_ && linear_sampler_ != nullptr) ? linear_sampler_ : sampler_; + SDL_BindGPUFragmentSamplers(upass, 0, &ubinding, 1); + SDL_DrawGPUPrimitives(upass, 3, 1, 0, 0); + SDL_EndGPURenderPass(upass); + } + } + + // ---- Acquire swapchain texture ---- + SDL_GPUTexture* swapchain = nullptr; + Uint32 sw = 0; + Uint32 sh = 0; + if (!SDL_AcquireGPUSwapchainTexture(cmd, window_, &swapchain, &sw, &sh)) { + SDL_Log("SDL3GPUShader: SDL_AcquireGPUSwapchainTexture failed: %s", SDL_GetError()); + SDL_SubmitGPUCommandBuffer(cmd); + return; + } + if (swapchain == nullptr) { + // Window minimized — skip frame + SDL_SubmitGPUCommandBuffer(cmd); + return; + } + + // ---- Calcular viewport (dimensiones lógicas del canvas, no de textura GPU) ---- + float vx = 0.0F; + float vy = 0.0F; + float vw = 0.0F; + float vh = 0.0F; + if (integer_scale_) { + const int SCALE = std::max(1, std::min(static_cast(sw) / game_width_, static_cast(sh) / game_height_)); + vw = static_cast(game_width_ * SCALE); + vh = static_cast(game_height_ * SCALE); + } else { + const float SCALE = std::min( + static_cast(sw) / static_cast(game_width_), + static_cast(sh) / static_cast(game_height_)); + vw = static_cast(game_width_) * SCALE; + vh = static_cast(game_height_) * SCALE; + } + vx = std::floor((static_cast(sw) - vw) * 0.5F); + vy = std::floor((static_cast(sh) - vh) * 0.5F); + + // pixel_scale: subpíxeles por pixel lógico. + // Sin SS: vh/game_height (zoom de ventana). + // Con SS: ss_factor_ exacto (3, 6, 9...). + if (oversample_ > 1 && ss_factor_ > 0) { + uniforms_.pixel_scale = static_cast(ss_factor_); + } else { + uniforms_.pixel_scale = (game_height_ > 0) ? (vh / static_cast(game_height_)) : 1.0F; + } + uniforms_.time = static_cast(SDL_GetTicks()) / 1000.0F; + uniforms_.oversample = (oversample_ > 1 && ss_factor_ > 0) + ? static_cast(ss_factor_) + : 1.0F; + + // ---- Path CrtPi: directo scene_texture_ → swapchain, sin SS ni Lanczos ---- + if (active_shader_ == ShaderType::CRTPI && crtpi_pipeline_ != nullptr) { + SDL_GPUColorTargetInfo color_target = {}; + color_target.texture = swapchain; + color_target.load_op = SDL_GPU_LOADOP_CLEAR; + color_target.store_op = SDL_GPU_STOREOP_STORE; + color_target.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + + SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cmd, &color_target, 1, nullptr); + if (pass != nullptr) { + SDL_BindGPUGraphicsPipeline(pass, crtpi_pipeline_); + SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; + SDL_SetGPUViewport(pass, &vp); + + SDL_GPUTextureSamplerBinding binding = {}; + binding.texture = scene_texture_; + binding.sampler = sampler_; // NEAREST: el shader CrtPi hace su propio filtrado analítico + SDL_BindGPUFragmentSamplers(pass, 0, &binding, 1); + + // Inyectar texture_width/height antes del push + crtpi_uniforms_.texture_width = static_cast(game_width_); + crtpi_uniforms_.texture_height = static_cast(game_height_); + SDL_PushGPUFragmentUniformData(cmd, 0, &crtpi_uniforms_, sizeof(CrtPiUniforms)); + + SDL_DrawGPUPrimitives(pass, 3, 1, 0, 0); + SDL_EndGPURenderPass(pass); + } + + SDL_SubmitGPUCommandBuffer(cmd); + return; + } + + // ---- Determinar si usar el path Lanczos (SS activo + algo seleccionado) ---- + const bool USE_LANCZOS = (oversample_ > 1 && downscale_algo_ > 0 && scaled_texture_ != nullptr && postfx_texture_ != nullptr && postfx_offscreen_pipeline_ != nullptr && downscale_pipeline_ != nullptr); + + if (USE_LANCZOS) { + // ---- Pass A: PostFX → postfx_texture_ (full scaled size, sin viewport) ---- + SDL_GPUColorTargetInfo postfx_target = {}; + postfx_target.texture = postfx_texture_; + postfx_target.load_op = SDL_GPU_LOADOP_CLEAR; + postfx_target.store_op = SDL_GPU_STOREOP_STORE; + postfx_target.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + + SDL_GPURenderPass* ppass = SDL_BeginGPURenderPass(cmd, &postfx_target, 1, nullptr); + if (ppass != nullptr) { + SDL_BindGPUGraphicsPipeline(ppass, postfx_offscreen_pipeline_); + SDL_GPUTextureSamplerBinding pbinding = {}; + pbinding.texture = scaled_texture_; + pbinding.sampler = sampler_; // NEAREST: 1:1 pass, efectos calculados analíticamente + SDL_BindGPUFragmentSamplers(ppass, 0, &pbinding, 1); + SDL_PushGPUFragmentUniformData(cmd, 0, &uniforms_, sizeof(PostFXUniforms)); + SDL_DrawGPUPrimitives(ppass, 3, 1, 0, 0); + SDL_EndGPURenderPass(ppass); + } + + // ---- Pass B: Downscale Lanczos → swapchain (con viewport/letterbox) ---- + SDL_GPUColorTargetInfo ds_target = {}; + ds_target.texture = swapchain; + ds_target.load_op = SDL_GPU_LOADOP_CLEAR; + ds_target.store_op = SDL_GPU_STOREOP_STORE; + ds_target.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + + SDL_GPURenderPass* dpass = SDL_BeginGPURenderPass(cmd, &ds_target, 1, nullptr); + if (dpass != nullptr) { + SDL_BindGPUGraphicsPipeline(dpass, downscale_pipeline_); + SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; + SDL_SetGPUViewport(dpass, &vp); + SDL_GPUTextureSamplerBinding dbinding = {}; + dbinding.texture = postfx_texture_; + dbinding.sampler = sampler_; // NEAREST: el shader Lanczos hace su propia interpolación + SDL_BindGPUFragmentSamplers(dpass, 0, &dbinding, 1); + // algorithm: 0=Lanczos2, 1=Lanczos3 (downscale_algo_ es 1-based) + DownscaleUniforms downscale_u = {.algorithm = downscale_algo_ - 1, .pad0 = 0.0F, .pad1 = 0.0F, .pad2 = 0.0F}; + SDL_PushGPUFragmentUniformData(cmd, 0, &downscale_u, sizeof(DownscaleUniforms)); + SDL_DrawGPUPrimitives(dpass, 3, 1, 0, 0); + SDL_EndGPURenderPass(dpass); + } + } else { + // ---- Render pass: PostFX → swapchain directamente (bilinear, comportamiento original) ---- + SDL_GPUColorTargetInfo color_target = {}; + color_target.texture = swapchain; + color_target.load_op = SDL_GPU_LOADOP_CLEAR; + color_target.store_op = SDL_GPU_STOREOP_STORE; + color_target.clear_color = {.r = 0.0F, .g = 0.0F, .b = 0.0F, .a = 1.0F}; + + SDL_GPURenderPass* pass = SDL_BeginGPURenderPass(cmd, &color_target, 1, nullptr); + if (pass != nullptr) { + SDL_BindGPUGraphicsPipeline(pass, pipeline_); + SDL_GPUViewport vp = {.x = vx, .y = vy, .w = vw, .h = vh, .min_depth = 0.0F, .max_depth = 1.0F}; + SDL_SetGPUViewport(pass, &vp); + + // Con SS: leer de scaled_texture_ con LINEAR; sin SS: scene_texture_ con NEAREST. + SDL_GPUTexture* input_texture = (oversample_ > 1 && scaled_texture_ != nullptr) + ? scaled_texture_ + : scene_texture_; + SDL_GPUSampler* active_sampler = (oversample_ > 1 && linear_sampler_ != nullptr) + ? linear_sampler_ + : sampler_; + + SDL_GPUTextureSamplerBinding binding = {}; + binding.texture = input_texture; + binding.sampler = active_sampler; + SDL_BindGPUFragmentSamplers(pass, 0, &binding, 1); + + SDL_PushGPUFragmentUniformData(cmd, 0, &uniforms_, sizeof(PostFXUniforms)); + + SDL_DrawGPUPrimitives(pass, 3, 1, 0, 0); + SDL_EndGPURenderPass(pass); + } + } + + SDL_SubmitGPUCommandBuffer(cmd); + } + + // --------------------------------------------------------------------------- + // cleanup — libera pipeline/texturas/buffer pero mantiene device + swapchain + // --------------------------------------------------------------------------- + void SDL3GPUShader::cleanup() { + is_initialized_ = false; + + if (device_ != nullptr) { + SDL_WaitForGPUIdle(device_); + + if (pipeline_ != nullptr) { + SDL_ReleaseGPUGraphicsPipeline(device_, pipeline_); + pipeline_ = nullptr; + } + if (crtpi_pipeline_ != nullptr) { + SDL_ReleaseGPUGraphicsPipeline(device_, crtpi_pipeline_); + crtpi_pipeline_ = nullptr; + } + if (postfx_offscreen_pipeline_ != nullptr) { + SDL_ReleaseGPUGraphicsPipeline(device_, postfx_offscreen_pipeline_); + postfx_offscreen_pipeline_ = nullptr; + } + if (upscale_pipeline_ != nullptr) { + SDL_ReleaseGPUGraphicsPipeline(device_, upscale_pipeline_); + upscale_pipeline_ = nullptr; + } + if (downscale_pipeline_ != nullptr) { + SDL_ReleaseGPUGraphicsPipeline(device_, downscale_pipeline_); + downscale_pipeline_ = nullptr; + } + if (scene_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, scene_texture_); + scene_texture_ = nullptr; + } + if (scaled_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, scaled_texture_); + scaled_texture_ = nullptr; + } + if (postfx_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, postfx_texture_); + postfx_texture_ = nullptr; + } + ss_factor_ = 0; + if (upload_buffer_ != nullptr) { + SDL_ReleaseGPUTransferBuffer(device_, upload_buffer_); + upload_buffer_ = nullptr; + } + if (sampler_ != nullptr) { + SDL_ReleaseGPUSampler(device_, sampler_); + sampler_ = nullptr; + } + if (linear_sampler_ != nullptr) { + SDL_ReleaseGPUSampler(device_, linear_sampler_); + linear_sampler_ = nullptr; + } + // device_ y el claim de la ventana se mantienen vivos + } + } + + // --------------------------------------------------------------------------- + // destroy — limpieza completa incluyendo device y swapchain (solo al cerrar) + // --------------------------------------------------------------------------- + void SDL3GPUShader::destroy() { + cleanup(); + + if (device_ != nullptr) { + if (window_ != nullptr) { + SDL_ReleaseWindowFromGPUDevice(device_, window_); + } + SDL_DestroyGPUDevice(device_); + device_ = nullptr; + } + window_ = nullptr; + } + + // --------------------------------------------------------------------------- + // Shader creation helpers + // --------------------------------------------------------------------------- + auto SDL3GPUShader::createShaderMSL(SDL_GPUDevice* device, + const char* msl_source, + const char* entrypoint, + SDL_GPUShaderStage stage, + Uint32 num_samplers, + Uint32 num_uniform_buffers) -> SDL_GPUShader* { + SDL_GPUShaderCreateInfo info = {}; + info.code = reinterpret_cast(msl_source); + info.code_size = std::strlen(msl_source) + 1; + info.entrypoint = entrypoint; + info.format = SDL_GPU_SHADERFORMAT_MSL; + info.stage = stage; + info.num_samplers = num_samplers; + info.num_uniform_buffers = num_uniform_buffers; + SDL_GPUShader* shader = SDL_CreateGPUShader(device, &info); + if (shader == nullptr) { + SDL_Log("SDL3GPUShader: MSL shader '%s' failed: %s", entrypoint, SDL_GetError()); + } + return shader; + } + + auto SDL3GPUShader::createShaderSPIRV(SDL_GPUDevice* device, // NOLINT(readability-convert-member-functions-to-static) + const uint8_t* spv_code, + size_t spv_size, + const char* entrypoint, + SDL_GPUShaderStage stage, + Uint32 num_samplers, + Uint32 num_uniform_buffers) -> SDL_GPUShader* { + SDL_GPUShaderCreateInfo info = {}; + info.code = spv_code; + info.code_size = spv_size; + info.entrypoint = entrypoint; + info.format = SDL_GPU_SHADERFORMAT_SPIRV; + info.stage = stage; + info.num_samplers = num_samplers; + info.num_uniform_buffers = num_uniform_buffers; + SDL_GPUShader* shader = SDL_CreateGPUShader(device, &info); + if (shader == nullptr) { + SDL_Log("SDL3GPUShader: SPIRV shader '%s' failed: %s", entrypoint, SDL_GetError()); + } + return shader; + } + + void SDL3GPUShader::setPostFXParams(const PostFXParams& p) { + uniforms_.vignette_strength = p.vignette; + uniforms_.chroma_strength = p.chroma; + uniforms_.mask_strength = p.mask; + uniforms_.gamma_strength = p.gamma; + uniforms_.curvature = p.curvature; + uniforms_.bleeding = p.bleeding; + uniforms_.flicker = p.flicker; + + // Las scanlines siempre las aplica el shader PostFX en GPU. + uniforms_.scanline_strength = p.scanlines; + } + + void SDL3GPUShader::setCrtPiParams(const CrtPiParams& p) { + crtpi_uniforms_.scanline_weight = p.scanline_weight; + crtpi_uniforms_.scanline_gap_brightness = p.scanline_gap_brightness; + crtpi_uniforms_.bloom_factor = p.bloom_factor; + crtpi_uniforms_.input_gamma = p.input_gamma; + crtpi_uniforms_.output_gamma = p.output_gamma; + crtpi_uniforms_.mask_brightness = p.mask_brightness; + crtpi_uniforms_.curvature_x = p.curvature_x; + crtpi_uniforms_.curvature_y = p.curvature_y; + crtpi_uniforms_.mask_type = p.mask_type; + crtpi_uniforms_.enable_scanlines = p.enable_scanlines ? 1 : 0; + crtpi_uniforms_.enable_multisample = p.enable_multisample ? 1 : 0; + crtpi_uniforms_.enable_gamma = p.enable_gamma ? 1 : 0; + crtpi_uniforms_.enable_curvature = p.enable_curvature ? 1 : 0; + crtpi_uniforms_.enable_sharper = p.enable_sharper ? 1 : 0; + // texture_width/height se inyectan en render() cada frame + } + + void SDL3GPUShader::setActiveShader(ShaderType type) { + active_shader_ = type; + } + + auto SDL3GPUShader::bestPresentMode(bool vsync) const -> SDL_GPUPresentMode { + if (vsync) { + return SDL_GPU_PRESENTMODE_VSYNC; + } + // IMMEDIATE: sin sincronización — el driver puede no soportarlo en Wayland/compositing + if (SDL_WindowSupportsGPUPresentMode(device_, window_, SDL_GPU_PRESENTMODE_IMMEDIATE)) { + return SDL_GPU_PRESENTMODE_IMMEDIATE; + } + // MAILBOX: presenta en el siguiente VBlank pero sin bloquear el hilo (triple buffer) + if (SDL_WindowSupportsGPUPresentMode(device_, window_, SDL_GPU_PRESENTMODE_MAILBOX)) { + SDL_Log("SDL3GPUShader: IMMEDIATE no soportado, usando MAILBOX para VSync desactivado"); + return SDL_GPU_PRESENTMODE_MAILBOX; + } + SDL_Log("SDL3GPUShader: IMMEDIATE y MAILBOX no soportados, forzando VSYNC"); + return SDL_GPU_PRESENTMODE_VSYNC; + } + + void SDL3GPUShader::setVSync(bool vsync) { + vsync_ = vsync; + if (device_ != nullptr && window_ != nullptr) { + SDL_SetGPUSwapchainParameters(device_, window_, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, bestPresentMode(vsync_)); + } + } + + void SDL3GPUShader::setScaleMode(bool integer_scale) { + integer_scale_ = integer_scale; + } + + // --------------------------------------------------------------------------- + // setOversample — cambia el factor SS; recrea texturas si ya está inicializado + // --------------------------------------------------------------------------- + void SDL3GPUShader::setOversample(int factor) { + const int NEW_FACTOR = std::max(1, factor); + if (NEW_FACTOR == oversample_) { return; } + oversample_ = NEW_FACTOR; + if (is_initialized_) { + reinitTexturesAndBuffer(); + // scanline_strength se actualizará en el próximo setPostFXParams + } + } + + void SDL3GPUShader::setLinearUpscale(bool linear) { + linear_upscale_ = linear; + } + + void SDL3GPUShader::setDownscaleAlgo(int algo) { + downscale_algo_ = std::max(0, std::min(algo, 2)); + } + + auto SDL3GPUShader::getSsTextureSize() const -> std::pair { + if (ss_factor_ <= 1) { return {0, 0}; } + return {game_width_ * ss_factor_, game_height_ * ss_factor_}; + } + + // --------------------------------------------------------------------------- + // reinitTexturesAndBuffer — recrea scene_texture_, scaled_texture_ y + // upload_buffer_ con el factor oversample_ actual. No toca pipelines ni samplers. + // --------------------------------------------------------------------------- + auto SDL3GPUShader::reinitTexturesAndBuffer() -> bool { + if (device_ == nullptr) { return false; } + SDL_WaitForGPUIdle(device_); + + if (scene_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, scene_texture_); + scene_texture_ = nullptr; + } + // scaled_texture_ se libera aquí; se recreará en el primer render() con el factor correcto + if (scaled_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, scaled_texture_); + scaled_texture_ = nullptr; + } + ss_factor_ = 0; + + if (upload_buffer_ != nullptr) { + SDL_ReleaseGPUTransferBuffer(device_, upload_buffer_); + upload_buffer_ = nullptr; + } + + uniforms_.screen_height = static_cast(game_height_); + uniforms_.oversample = static_cast(oversample_); + + // scene_texture_: siempre a resolución del juego + SDL_GPUTextureCreateInfo tex_info = {}; + tex_info.type = SDL_GPU_TEXTURETYPE_2D; + tex_info.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; + tex_info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER; + tex_info.width = static_cast(game_width_); + tex_info.height = static_cast(game_height_); + tex_info.layer_count_or_depth = 1; + tex_info.num_levels = 1; + scene_texture_ = SDL_CreateGPUTexture(device_, &tex_info); + if (scene_texture_ == nullptr) { + SDL_Log("SDL3GPUShader: reinit — failed to create scene texture: %s", SDL_GetError()); + return false; + } + + // upload_buffer_: siempre a resolución del juego + SDL_GPUTransferBufferCreateInfo tb_info = {}; + tb_info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD; + tb_info.size = static_cast(game_width_ * game_height_ * 4); + upload_buffer_ = SDL_CreateGPUTransferBuffer(device_, &tb_info); + if (upload_buffer_ == nullptr) { + SDL_Log("SDL3GPUShader: reinit — failed to create upload buffer: %s", SDL_GetError()); + SDL_ReleaseGPUTexture(device_, scene_texture_); + scene_texture_ = nullptr; + return false; + } + + SDL_Log("SDL3GPUShader: reinit — scene %dx%d, SS %s (scaled se creará en render)", + game_width_, + game_height_, + oversample_ > 1 ? "on" : "off"); + return true; + } + + // --------------------------------------------------------------------------- + // calcSsFactor — primer múltiplo de 3 >= zoom, mínimo 3. + // Ejemplos: zoom 1,2,3 → 3; zoom 4,5,6 → 6; zoom 4.4 → 6; zoom 7,8,9 → 9. + // --------------------------------------------------------------------------- + auto SDL3GPUShader::calcSsFactor(float zoom) -> int { + const int MULTIPLE = 3; + const int N = static_cast(std::ceil(zoom / static_cast(MULTIPLE))); + return std::max(1, N) * MULTIPLE; + } + + // --------------------------------------------------------------------------- + // recreateScaledTexture — libera y recrea scaled_texture_ para el factor dado. + // Llamar solo cuando device_ no esté ejecutando comandos (SDL_WaitForGPUIdle previo). + // --------------------------------------------------------------------------- + auto SDL3GPUShader::recreateScaledTexture(int factor) -> bool { + if (scaled_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, scaled_texture_); + scaled_texture_ = nullptr; + } + if (postfx_texture_ != nullptr) { + SDL_ReleaseGPUTexture(device_, postfx_texture_); + postfx_texture_ = nullptr; + } + ss_factor_ = 0; + + const int W = game_width_ * factor; + const int H = game_height_ * factor; + + SDL_GPUTextureCreateInfo info = {}; + info.type = SDL_GPU_TEXTURETYPE_2D; + info.format = SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM; + info.usage = SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET; + info.width = static_cast(W); + info.height = static_cast(H); + info.layer_count_or_depth = 1; + info.num_levels = 1; + + scaled_texture_ = SDL_CreateGPUTexture(device_, &info); + if (scaled_texture_ == nullptr) { + SDL_Log("SDL3GPUShader: failed to create scaled texture %dx%d (factor %d): %s", + W, + H, + factor, + SDL_GetError()); + return false; + } + + postfx_texture_ = SDL_CreateGPUTexture(device_, &info); + if (postfx_texture_ == nullptr) { + SDL_Log("SDL3GPUShader: failed to create postfx texture %dx%d (factor %d): %s", + W, + H, + factor, + SDL_GetError()); + SDL_ReleaseGPUTexture(device_, scaled_texture_); + scaled_texture_ = nullptr; + return false; + } + + ss_factor_ = factor; + SDL_Log("SDL3GPUShader: scaled+postfx textures %dx%d (factor %d×)", W, H, factor); + return true; + } + +} // namespace Rendering diff --git a/source/core/rendering/sdl3gpu/sdl3gpu_shader.hpp b/source/core/rendering/sdl3gpu/sdl3gpu_shader.hpp new file mode 100644 index 0000000..6298898 --- /dev/null +++ b/source/core/rendering/sdl3gpu/sdl3gpu_shader.hpp @@ -0,0 +1,178 @@ +#pragma once + +#include +#include + +#include "core/rendering/shader_backend.hpp" + +// PostFX uniforms pushed to fragment stage each frame. +// Must match the MSL struct and GLSL uniform block layout. +// 12 floats = 48 bytes — meets Metal/Vulkan 16-byte alignment requirement. +struct PostFXUniforms { + float vignette_strength; // 0 = none, ~0.8 = subtle + float chroma_strength; // 0 = off, ~0.2 = subtle chromatic aberration + float scanline_strength; // 0 = off, 1 = full + float screen_height; // logical height in pixels (used by bleeding effect) + float mask_strength; // 0 = off, 1 = full phosphor dot mask + float gamma_strength; // 0 = off, 1 = full gamma 2.4/2.2 correction + float curvature; // 0 = flat, 1 = max barrel distortion + float bleeding; // 0 = off, 1 = max NTSC chrominance bleeding + float pixel_scale; // physical pixels per logical pixel (vh / tex_height_) + float time; // seconds since SDL init (SDL_GetTicks() / 1000.0f) + float oversample; // supersampling factor (1.0 = off, 3.0 = 3×SS) + float flicker; // 0 = off, 1 = phosphor flicker ~50 Hz — keep struct at 48 bytes (3 × 16) +}; + +// CrtPi uniforms pushed to fragment stage each frame. +// Must match the MSL struct and GLSL uniform block layout. +// 14 fields (8 floats + 6 ints) + 2 floats (texture size) = 16 fields = 64 bytes — 4 × 16-byte alignment. +struct CrtPiUniforms { + // vec4 #0 + float scanline_weight; // Ajuste gaussiano (default 6.0) + float scanline_gap_brightness; // Brillo mínimo entre scanlines (default 0.12) + float bloom_factor; // Factor brillo zonas iluminadas (default 3.5) + float input_gamma; // Gamma de entrada (default 2.4) + // vec4 #1 + float output_gamma; // Gamma de salida (default 2.2) + float mask_brightness; // Brillo sub-píxeles máscara (default 0.80) + float curvature_x; // Distorsión barrel X (default 0.05) + float curvature_y; // Distorsión barrel Y (default 0.10) + // vec4 #2 + int mask_type; // 0=ninguna, 1=verde/magenta, 2=RGB fósforo + int enable_scanlines; // 0 = off, 1 = on + int enable_multisample; // 0 = off, 1 = on (antialiasing analítico) + int enable_gamma; // 0 = off, 1 = on + // vec4 #3 + int enable_curvature; // 0 = off, 1 = on + int enable_sharper; // 0 = off, 1 = on + float texture_width; // Ancho del canvas en píxeles (inyectado en render) + float texture_height; // Alto del canvas en píxeles (inyectado en render) +}; + +// Downscale uniforms pushed to the Lanczos downscale fragment stage. +// 1 int + 3 floats = 16 bytes — meets Metal/Vulkan alignment. +struct DownscaleUniforms { + int algorithm; // 0 = Lanczos2 (ventana 2), 1 = Lanczos3 (ventana 3) + float pad0; + float pad1; + float pad2; +}; + +namespace Rendering { + + /** + * @brief Backend de shaders usando SDL3 GPU API (Metal en macOS, Vulkan/SPIR-V en Win/Linux) + * + * Reemplaza el backend OpenGL para que los shaders PostFX funcionen en macOS. + * Pipeline: Surface pixels (CPU) → SDL_GPUTransferBuffer → SDL_GPUTexture (scene) + * → PostFX render pass → swapchain → present + */ + class SDL3GPUShader : public ShaderBackend { + public: + SDL3GPUShader() = default; + ~SDL3GPUShader() override; + + auto init(SDL_Window* window, + SDL_Texture* texture, + const std::string& vertex_source, + const std::string& fragment_source) -> bool override; + + void render() override; + void setTextureSize(float width, float height) override {} + void cleanup() final; // Libera pipeline/texturas pero mantiene el device vivo + void destroy(); // Limpieza completa (device + swapchain); llamar solo al cerrar + [[nodiscard]] auto isHardwareAccelerated() const -> bool override { return is_initialized_; } + [[nodiscard]] auto getDriverName() const -> std::string override { return driver_name_; } + + // Establece el driver GPU preferido (vacío = auto). Debe llamarse antes de init(). + void setPreferredDriver(const std::string& driver) override { preferred_driver_ = driver; } + + // Sube píxeles ARGB8888 desde CPU; llamado antes de render() + void uploadPixels(const Uint32* pixels, int width, int height) override; + + // Actualiza los parámetros de intensidad de los efectos PostFX + void setPostFXParams(const PostFXParams& p) override; + + // Activa/desactiva VSync en el swapchain + void setVSync(bool vsync) override; + + // Activa/desactiva escalado entero (integer scale) + void setScaleMode(bool integer_scale) override; + + // Establece factor de supersampling (1 = off, 3 = 3×SS) + void setOversample(int factor) override; + + // Activa/desactiva interpolación LINEAR en el upscale (false = NEAREST) + void setLinearUpscale(bool linear) override; + + // Selecciona algoritmo de downscale: 0=bilinear legacy, 1=Lanczos2, 2=Lanczos3 + void setDownscaleAlgo(int algo) override; + + // Devuelve las dimensiones de la textura de supersampling (0,0 si SS desactivado) + [[nodiscard]] auto getSsTextureSize() const -> std::pair override; + + // Selecciona el shader de post-procesado activo (POSTFX o CRTPI) + void setActiveShader(ShaderType type) override; + + // Actualiza los parámetros del shader CRT-Pi + void setCrtPiParams(const CrtPiParams& p) override; + + // Devuelve el shader activo + [[nodiscard]] auto getActiveShader() const -> ShaderType override { return active_shader_; } + + private: + static auto createShaderMSL(SDL_GPUDevice* device, + const char* msl_source, + const char* entrypoint, + SDL_GPUShaderStage stage, + Uint32 num_samplers, + Uint32 num_uniform_buffers) -> SDL_GPUShader*; + + static auto createShaderSPIRV(SDL_GPUDevice* device, + const uint8_t* spv_code, + size_t spv_size, + const char* entrypoint, + SDL_GPUShaderStage stage, + Uint32 num_samplers, + Uint32 num_uniform_buffers) -> SDL_GPUShader*; + + auto createPipeline() -> bool; + auto createCrtPiPipeline() -> bool; // Pipeline dedicado para el shader CrtPi + auto reinitTexturesAndBuffer() -> bool; // Recrea scene_texture_ y upload_buffer_ + auto recreateScaledTexture(int factor) -> bool; // Recrea scaled_texture_ para factor dado + static auto calcSsFactor(float zoom) -> int; // Primer múltiplo de 3 >= zoom (mín 3) + // Devuelve el mejor present mode disponible: IMMEDIATE > MAILBOX > VSYNC + [[nodiscard]] auto bestPresentMode(bool vsync) const -> SDL_GPUPresentMode; + + SDL_Window* window_ = nullptr; + SDL_GPUDevice* device_ = nullptr; + SDL_GPUGraphicsPipeline* pipeline_ = nullptr; // PostFX pass (→ swapchain o → postfx_texture_) + SDL_GPUGraphicsPipeline* crtpi_pipeline_ = nullptr; // CrtPi pass (→ swapchain directo, sin SS) + SDL_GPUGraphicsPipeline* postfx_offscreen_pipeline_ = nullptr; // PostFX → postfx_texture_ (B8G8R8A8, solo con Lanczos) + SDL_GPUGraphicsPipeline* upscale_pipeline_ = nullptr; // Upscale pass (solo con SS) + SDL_GPUGraphicsPipeline* downscale_pipeline_ = nullptr; // Lanczos downscale (solo con SS + algo > 0) + SDL_GPUTexture* scene_texture_ = nullptr; // Canvas del juego (game_width_ × game_height_) + SDL_GPUTexture* scaled_texture_ = nullptr; // Upscale target (game×factor), solo con SS + SDL_GPUTexture* postfx_texture_ = nullptr; // PostFX output a resolución escalada, solo con Lanczos + SDL_GPUTransferBuffer* upload_buffer_ = nullptr; + SDL_GPUSampler* sampler_ = nullptr; // NEAREST + SDL_GPUSampler* linear_sampler_ = nullptr; // LINEAR + + PostFXUniforms uniforms_{.vignette_strength = 0.6F, .chroma_strength = 0.15F, .scanline_strength = 0.7F, .screen_height = 192.0F, .pixel_scale = 1.0F, .oversample = 1.0F}; + CrtPiUniforms crtpi_uniforms_{.scanline_weight = 6.0F, .scanline_gap_brightness = 0.12F, .bloom_factor = 3.5F, .input_gamma = 2.4F, .output_gamma = 2.2F, .mask_brightness = 0.80F, .curvature_x = 0.05F, .curvature_y = 0.10F, .mask_type = 2, .enable_scanlines = 1, .enable_multisample = 1, .enable_gamma = 1}; + ShaderType active_shader_ = ShaderType::POSTFX; // Shader de post-procesado activo + + int game_width_ = 0; // Dimensiones originales del canvas + int game_height_ = 0; + int ss_factor_ = 0; // Factor SS activo (3, 6, 9...) o 0 si SS desactivado + int oversample_ = 1; // SS on/off (1 = off, >1 = on) + int downscale_algo_ = 1; // 0 = bilinear legacy, 1 = Lanczos2, 2 = Lanczos3 + std::string driver_name_; + std::string preferred_driver_; // Driver preferido; vacío = auto (SDL elige) + bool is_initialized_ = false; + bool vsync_ = true; + bool integer_scale_ = false; + bool linear_upscale_ = false; // Upscale NEAREST (false) o LINEAR (true) + }; + +} // namespace Rendering diff --git a/source/core/rendering/sdl3gpu/spv/.clang-format b/source/core/rendering/sdl3gpu/spv/.clang-format new file mode 100644 index 0000000..47a38a9 --- /dev/null +++ b/source/core/rendering/sdl3gpu/spv/.clang-format @@ -0,0 +1,2 @@ +DisableFormat: true +SortIncludes: Never diff --git a/source/core/rendering/sdl3gpu/spv/.clang-tidy b/source/core/rendering/sdl3gpu/spv/.clang-tidy new file mode 100644 index 0000000..46f35e3 --- /dev/null +++ b/source/core/rendering/sdl3gpu/spv/.clang-tidy @@ -0,0 +1,4 @@ +# source/core/rendering/sdl3gpu/spv/.clang-tidy +Checks: '-*' +WarningsAsErrors: '' +HeaderFilterRegex: '' diff --git a/source/core/rendering/sdl3gpu/spv/crtpi_frag_spv.h b/source/core/rendering/sdl3gpu/spv/crtpi_frag_spv.h new file mode 100644 index 0000000..e3c1757 --- /dev/null +++ b/source/core/rendering/sdl3gpu/spv/crtpi_frag_spv.h @@ -0,0 +1,10362 @@ +#pragma once +#include +#include +static const uint8_t kcrtpi_frag_spv[] = { + 0x03, + 0x02, + 0x23, + 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x00, + 0x0d, + 0x00, + 0xa2, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x06, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x47, + 0x4c, + 0x53, + 0x4c, + 0x2e, + 0x73, + 0x74, + 0x64, + 0x2e, + 0x34, + 0x35, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x08, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x10, + 0x00, + 0x03, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x63, + 0x70, + 0x70, + 0x5f, + 0x73, + 0x74, + 0x79, + 0x6c, + 0x65, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x69, + 0x6e, + 0x63, + 0x6c, + 0x75, + 0x64, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x64, + 0x69, + 0x73, + 0x74, + 0x6f, + 0x72, + 0x74, + 0x28, + 0x76, + 0x66, + 0x32, + 0x3b, + 0x76, + 0x66, + 0x32, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x72, + 0x65, + 0x65, + 0x6e, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x08, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x63, + 0x61, + 0x6c, + 0x63, + 0x53, + 0x63, + 0x61, + 0x6e, + 0x4c, + 0x69, + 0x6e, + 0x65, + 0x57, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x28, + 0x66, + 0x31, + 0x3b, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x64, + 0x69, + 0x73, + 0x74, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x63, + 0x61, + 0x6c, + 0x63, + 0x53, + 0x63, + 0x61, + 0x6e, + 0x4c, + 0x69, + 0x6e, + 0x65, + 0x28, + 0x66, + 0x31, + 0x3b, + 0x66, + 0x31, + 0x3b, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x64, + 0x79, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x66, + 0x69, + 0x6c, + 0x74, + 0x65, + 0x72, + 0x5f, + 0x77, + 0x69, + 0x64, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x43, + 0x72, + 0x74, + 0x50, + 0x69, + 0x42, + 0x6c, + 0x6f, + 0x63, + 0x6b, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x77, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x06, + 0x00, + 0x09, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x67, + 0x61, + 0x70, + 0x5f, + 0x62, + 0x72, + 0x69, + 0x67, + 0x68, + 0x74, + 0x6e, + 0x65, + 0x73, + 0x73, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x62, + 0x6c, + 0x6f, + 0x6f, + 0x6d, + 0x5f, + 0x66, + 0x61, + 0x63, + 0x74, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x69, + 0x6e, + 0x70, + 0x75, + 0x74, + 0x5f, + 0x67, + 0x61, + 0x6d, + 0x6d, + 0x61, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x70, + 0x75, + 0x74, + 0x5f, + 0x67, + 0x61, + 0x6d, + 0x6d, + 0x61, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x5f, + 0x62, + 0x72, + 0x69, + 0x67, + 0x68, + 0x74, + 0x6e, + 0x65, + 0x73, + 0x73, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x5f, + 0x78, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x5f, + 0x79, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x5f, + 0x74, + 0x79, + 0x70, + 0x65, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x08, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x73, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x08, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x6d, + 0x75, + 0x6c, + 0x74, + 0x69, + 0x73, + 0x61, + 0x6d, + 0x70, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x67, + 0x61, + 0x6d, + 0x6d, + 0x61, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x08, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x5f, + 0x73, + 0x68, + 0x61, + 0x72, + 0x70, + 0x65, + 0x72, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x74, + 0x75, + 0x72, + 0x65, + 0x5f, + 0x77, + 0x69, + 0x64, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x74, + 0x75, + 0x72, + 0x65, + 0x5f, + 0x68, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x62, + 0x61, + 0x72, + 0x72, + 0x65, + 0x6c, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x72, + 0x73, + 0x71, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x77, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x5f, + 0x73, + 0x69, + 0x7a, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x66, + 0x69, + 0x6c, + 0x74, + 0x65, + 0x72, + 0x5f, + 0x77, + 0x69, + 0x64, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x76, + 0x5f, + 0x75, + 0x76, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x5f, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x78, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x5f, + 0x69, + 0x6e, + 0x5f, + 0x70, + 0x69, + 0x78, + 0x65, + 0x6c, + 0x73, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x6d, + 0x70, + 0x5f, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x74, + 0x63, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x64, + 0x65, + 0x6c, + 0x74, + 0x61, + 0x73, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x77, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x73, + 0x69, + 0x67, + 0x6e, + 0x73, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x74, + 0x65, + 0x6d, + 0x70, + 0x5f, + 0x79, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x79, + 0x5f, + 0x63, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x64, + 0x79, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x73, + 0x69, + 0x67, + 0x6e, + 0x5f, + 0x79, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x75, + 0x72, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x54, + 0x65, + 0x78, + 0x74, + 0x75, + 0x72, + 0x65, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0x77, + 0x68, + 0x69, + 0x63, + 0x68, + 0x5f, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x46, + 0x72, + 0x61, + 0x67, + 0x43, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x77, + 0x68, + 0x69, + 0x63, + 0x68, + 0x5f, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x03, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x02, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x03, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x05, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x04, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x12, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x85, + 0x6b, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x02, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0xbf, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0xaa, + 0xaa, + 0xaa, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x44, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x20, + 0x00, + 0x04, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xac, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0xb8, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xb8, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x07, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0xc0, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x41, + 0x17, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x19, + 0x00, + 0x09, + 0x00, + 0x2d, + 0x01, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x03, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x2d, + 0x01, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x2f, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2f, + 0x01, + 0x00, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x35, + 0x01, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x42, + 0x01, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x48, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x54, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x61, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x61, + 0x01, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0xaa, + 0xaa, + 0x2a, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x98, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0xac, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xb6, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0xb5, + 0x00, + 0x00, + 0x00, + 0xb6, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb5, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb6, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbd, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0xbd, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0xc0, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0xc3, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xc3, + 0x00, + 0x00, + 0x00, + 0xc4, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xde, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x00, + 0x00, + 0x00, + 0xde, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x00, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x00, + 0x00, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xea, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xea, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xed, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xee, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xee, + 0x00, + 0x00, + 0x00, + 0xed, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf2, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0xf2, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfc, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0xfc, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xfd, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0xff, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0xff, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x01, + 0x00, + 0x00, + 0x01, + 0x01, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x02, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x01, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x01, + 0x00, + 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x07, + 0x01, + 0x00, + 0x00, + 0x04, + 0x01, + 0x00, + 0x00, + 0x06, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x07, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x09, + 0x01, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x01, + 0x00, + 0x00, + 0x09, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x01, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0x0a, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x0e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x10, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x10, + 0x01, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x11, + 0x01, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x11, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x14, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x14, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x15, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x17, + 0x01, + 0x00, + 0x00, + 0x15, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x17, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x18, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x19, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x01, + 0x00, + 0x00, + 0x18, + 0x01, + 0x00, + 0x00, + 0x19, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x1a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x1b, + 0x01, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x01, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x01, + 0x00, + 0x00, + 0x1d, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x01, + 0x00, + 0x00, + 0x1f, + 0x01, + 0x00, + 0x00, + 0x1e, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x20, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x22, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x01, + 0x00, + 0x00, + 0x22, + 0x01, + 0x00, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x23, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x24, + 0x01, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x25, + 0x01, + 0x00, + 0x00, + 0x24, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x26, + 0x01, + 0x00, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x26, + 0x01, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0x25, + 0x01, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x31, + 0x01, + 0x00, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x32, + 0x01, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x33, + 0x01, + 0x00, + 0x00, + 0x31, + 0x01, + 0x00, + 0x00, + 0x32, + 0x01, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x34, + 0x01, + 0x00, + 0x00, + 0x33, + 0x01, + 0x00, + 0x00, + 0x33, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x34, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x36, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x35, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x37, + 0x01, + 0x00, + 0x00, + 0x36, + 0x01, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x38, + 0x01, + 0x00, + 0x00, + 0x37, + 0x01, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x38, + 0x01, + 0x00, + 0x00, + 0x39, + 0x01, + 0x00, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x39, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x01, + 0x00, + 0x00, + 0x3c, + 0x01, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x01, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x3e, + 0x01, + 0x00, + 0x00, + 0x3f, + 0x01, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x3f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x43, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x42, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x43, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x45, + 0x01, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x46, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x45, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x46, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x01, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x01, + 0x00, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0x4a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x4d, + 0x01, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x4b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x4d, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x4e, + 0x01, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x50, + 0x01, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x50, + 0x01, + 0x00, + 0x00, + 0x51, + 0x01, + 0x00, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x51, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x53, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x54, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x56, + 0x01, + 0x00, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x56, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x59, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x53, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x59, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x01, + 0x00, + 0x00, + 0x5b, + 0x01, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x01, + 0x00, + 0x00, + 0x5c, + 0x01, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x5d, + 0x01, + 0x00, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x64, + 0x01, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x65, + 0x01, + 0x00, + 0x00, + 0x64, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x65, + 0x01, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x67, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0x67, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x69, + 0x01, + 0x00, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x01, + 0x00, + 0x00, + 0x69, + 0x01, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x6a, + 0x01, + 0x00, + 0x00, + 0x6c, + 0x01, + 0x00, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x70, + 0x01, + 0x00, + 0x00, + 0x6f, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x72, + 0x01, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x73, + 0x01, + 0x00, + 0x00, + 0x70, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x72, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x73, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x48, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x90, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x90, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x91, + 0x01, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x91, + 0x01, + 0x00, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x94, + 0x01, + 0x00, + 0x00, + 0x97, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x94, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x96, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x96, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x97, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x99, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x98, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x99, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x9c, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x9c, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x07, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x01, + 0x00, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0xa0, + 0x01, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x01, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x42, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x42, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x04, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x07, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x68, + 0x00, + 0x00, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x68, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, +}; +static const size_t kcrtpi_frag_spv_size = 10356; diff --git a/source/core/rendering/sdl3gpu/spv/downscale_frag_spv.h b/source/core/rendering/sdl3gpu/spv/downscale_frag_spv.h new file mode 100644 index 0000000..6d96082 --- /dev/null +++ b/source/core/rendering/sdl3gpu/spv/downscale_frag_spv.h @@ -0,0 +1,4253 @@ +#pragma once +#include +#include +static const uint8_t kdownscale_frag_spv[] = { + 0x03, + 0x02, + 0x23, + 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x00, + 0x0d, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x06, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x47, + 0x4c, + 0x53, + 0x4c, + 0x2e, + 0x73, + 0x74, + 0x64, + 0x2e, + 0x34, + 0x35, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x07, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x03, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x63, + 0x70, + 0x70, + 0x5f, + 0x73, + 0x74, + 0x79, + 0x6c, + 0x65, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x69, + 0x6e, + 0x63, + 0x6c, + 0x75, + 0x64, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x61, + 0x6e, + 0x63, + 0x7a, + 0x6f, + 0x73, + 0x28, + 0x66, + 0x31, + 0x3b, + 0x66, + 0x31, + 0x3b, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x70, + 0x74, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x73, + 0x72, + 0x63, + 0x5f, + 0x73, + 0x69, + 0x7a, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x73, + 0x6f, + 0x75, + 0x72, + 0x63, + 0x65, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x76, + 0x5f, + 0x75, + 0x76, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x70, + 0x5f, + 0x66, + 0x6c, + 0x6f, + 0x6f, + 0x72, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x44, + 0x6f, + 0x77, + 0x6e, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x55, + 0x6e, + 0x69, + 0x66, + 0x6f, + 0x72, + 0x6d, + 0x73, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x61, + 0x6c, + 0x67, + 0x6f, + 0x72, + 0x69, + 0x74, + 0x68, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x64, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x64, + 0x31, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x64, + 0x32, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x77, + 0x69, + 0x6e, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x77, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x5f, + 0x73, + 0x75, + 0x6d, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x74, + 0x61, + 0x70, + 0x5f, + 0x63, + 0x65, + 0x6e, + 0x74, + 0x65, + 0x72, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x66, + 0x66, + 0x73, + 0x65, + 0x74, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x5f, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x03, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x02, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x03, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x05, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x17, + 0xb7, + 0xd1, + 0x38, + 0x14, + 0x00, + 0x02, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x0f, + 0x49, + 0x40, + 0x17, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x09, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x03, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x06, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x20, + 0x00, + 0x04, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x07, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x15, + 0x00, + 0x04, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x07, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x04, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x05, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x42, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x42, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0xa9, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x04, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x65, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x00, + 0x00, + 0x65, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x68, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x68, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x04, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0xb3, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x73, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x73, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x91, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x91, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x92, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x92, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x05, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x67, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x05, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x07, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xac, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0xac, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x05, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00}; +static const size_t kdownscale_frag_spv_size = 4248; diff --git a/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h b/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h new file mode 100644 index 0000000..8811d52 --- /dev/null +++ b/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h @@ -0,0 +1,11717 @@ +#pragma once +#include +#include +static const uint8_t kpostfx_frag_spv[] = { + 0x03, + 0x02, + 0x23, + 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x00, + 0x0d, + 0x00, + 0xf2, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x06, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x47, + 0x4c, + 0x53, + 0x4c, + 0x2e, + 0x73, + 0x74, + 0x64, + 0x2e, + 0x34, + 0x35, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x08, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0xb6, + 0x01, + 0x00, + 0x00, + 0x10, + 0x00, + 0x03, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x63, + 0x70, + 0x70, + 0x5f, + 0x73, + 0x74, + 0x79, + 0x6c, + 0x65, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x69, + 0x6e, + 0x63, + 0x6c, + 0x75, + 0x64, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x72, + 0x67, + 0x62, + 0x5f, + 0x74, + 0x6f, + 0x5f, + 0x79, + 0x63, + 0x63, + 0x28, + 0x76, + 0x66, + 0x33, + 0x3b, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x72, + 0x67, + 0x62, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x79, + 0x63, + 0x63, + 0x5f, + 0x74, + 0x6f, + 0x5f, + 0x72, + 0x67, + 0x62, + 0x28, + 0x76, + 0x66, + 0x33, + 0x3b, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x79, + 0x63, + 0x63, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x63, + 0x62, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x63, + 0x72, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x75, + 0x76, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x76, + 0x5f, + 0x75, + 0x76, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x50, + 0x6f, + 0x73, + 0x74, + 0x46, + 0x58, + 0x55, + 0x6e, + 0x69, + 0x66, + 0x6f, + 0x72, + 0x6d, + 0x73, + 0x00, + 0x00, + 0x06, + 0x00, + 0x08, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x76, + 0x69, + 0x67, + 0x6e, + 0x65, + 0x74, + 0x74, + 0x65, + 0x5f, + 0x73, + 0x74, + 0x72, + 0x65, + 0x6e, + 0x67, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x63, + 0x68, + 0x72, + 0x6f, + 0x6d, + 0x61, + 0x5f, + 0x73, + 0x74, + 0x72, + 0x65, + 0x6e, + 0x67, + 0x74, + 0x68, + 0x00, + 0x06, + 0x00, + 0x08, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x73, + 0x74, + 0x72, + 0x65, + 0x6e, + 0x67, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x72, + 0x65, + 0x65, + 0x6e, + 0x5f, + 0x68, + 0x65, + 0x69, + 0x67, + 0x68, + 0x74, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x5f, + 0x73, + 0x74, + 0x72, + 0x65, + 0x6e, + 0x67, + 0x74, + 0x68, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x67, + 0x61, + 0x6d, + 0x6d, + 0x61, + 0x5f, + 0x73, + 0x74, + 0x72, + 0x65, + 0x6e, + 0x67, + 0x74, + 0x68, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x63, + 0x75, + 0x72, + 0x76, + 0x61, + 0x74, + 0x75, + 0x72, + 0x65, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x62, + 0x6c, + 0x65, + 0x65, + 0x64, + 0x69, + 0x6e, + 0x67, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x70, + 0x69, + 0x78, + 0x65, + 0x6c, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x74, + 0x69, + 0x6d, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x76, + 0x65, + 0x72, + 0x73, + 0x61, + 0x6d, + 0x70, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x06, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x66, + 0x6c, + 0x69, + 0x63, + 0x6b, + 0x65, + 0x72, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x72, + 0x73, + 0x71, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x64, + 0x69, + 0x73, + 0x74, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x62, + 0x61, + 0x72, + 0x72, + 0x65, + 0x6c, + 0x53, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x5f, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x62, + 0x61, + 0x73, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x65, + 0x6e, + 0x65, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x74, + 0x77, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x73, + 0x74, + 0x65, + 0x70, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x79, + 0x63, + 0x63, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0x79, + 0x63, + 0x63, + 0x5f, + 0x6c, + 0x32, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x79, + 0x63, + 0x63, + 0x5f, + 0x6c, + 0x31, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0x79, + 0x63, + 0x63, + 0x5f, + 0x72, + 0x31, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0x79, + 0x63, + 0x63, + 0x5f, + 0x72, + 0x32, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x75, + 0x72, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x18, + 0x01, + 0x00, + 0x00, + 0x70, + 0x61, + 0x72, + 0x61, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x63, + 0x61, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0x6c, + 0x69, + 0x6e, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x70, + 0x73, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x66, + 0x72, + 0x61, + 0x63, + 0x5f, + 0x69, + 0x6e, + 0x5f, + 0x72, + 0x6f, + 0x77, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x72, + 0x6f, + 0x77, + 0x5f, + 0x70, + 0x6f, + 0x73, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x62, + 0x72, + 0x69, + 0x67, + 0x68, + 0x74, + 0x5f, + 0x72, + 0x6f, + 0x77, + 0x73, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x69, + 0x73, + 0x5f, + 0x64, + 0x61, + 0x72, + 0x6b, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x73, + 0x63, + 0x61, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x65, + 0x6e, + 0x63, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x64, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xa2, + 0x01, + 0x00, + 0x00, + 0x76, + 0x69, + 0x67, + 0x6e, + 0x65, + 0x74, + 0x74, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0xb4, + 0x01, + 0x00, + 0x00, + 0x77, + 0x68, + 0x69, + 0x63, + 0x68, + 0x4d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0xb6, + 0x01, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x46, + 0x72, + 0x61, + 0x67, + 0x43, + 0x6f, + 0x6f, + 0x72, + 0x64, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x73, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0xdc, + 0x01, + 0x00, + 0x00, + 0x66, + 0x6c, + 0x69, + 0x63, + 0x6b, + 0x65, + 0x72, + 0x5f, + 0x77, + 0x61, + 0x76, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x03, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0xb6, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x02, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x03, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x04, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x87, + 0x16, + 0x99, + 0x3e, + 0x15, + 0x00, + 0x04, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x45, + 0x16, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x78, + 0xe9, + 0x3d, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x56, + 0x0e, + 0x2d, + 0xbe, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x78, + 0xa9, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x87, + 0xd6, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x54, + 0xe3, + 0xa5, + 0x3d, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x74, + 0xb3, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0xc5, + 0x20, + 0xb0, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0xb4, + 0xc8, + 0x36, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x00, + 0x00, + 0x00, + 0xe5, + 0xd0, + 0xe2, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x3f, + 0x17, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x6c, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x0e, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x73, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x02, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0xcd, + 0xcc, + 0x4c, + 0x3d, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0xcd, + 0xcc, + 0xcc, + 0x3d, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x84, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x85, + 0x6b, + 0x3e, + 0x17, + 0x00, + 0x04, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xa9, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x07, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x09, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x03, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xb3, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0xc3, + 0x00, + 0x00, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x41, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x22, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x25, + 0x01, + 0x00, + 0x00, + 0x0a, + 0xd7, + 0xa3, + 0x3b, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x99, + 0x19, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x99, + 0xe9, + 0x40, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x99, + 0x19, + 0x40, + 0x2c, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x01, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x49, + 0x01, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x59, + 0x01, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0x61, + 0x01, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0x83, + 0xc0, + 0x2a, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x0a, + 0xd7, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0x2f, + 0xba, + 0xe8, + 0x3e, + 0x2c, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x96, + 0x01, + 0x00, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0x95, + 0x01, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0xae, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0xb5, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0xb5, + 0x01, + 0x00, + 0x00, + 0xb6, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0xb7, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xba, + 0x01, + 0x00, + 0x00, + 0xaa, + 0xaa, + 0xaa, + 0x3e, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x01, + 0x00, + 0x00, + 0xcd, + 0xcc, + 0x4c, + 0x3f, + 0x2c, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x01, + 0x00, + 0x00, + 0xbe, + 0x01, + 0x00, + 0x00, + 0xbe, + 0x01, + 0x00, + 0x00, + 0xbe, + 0x01, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x01, + 0x00, + 0x00, + 0xaa, + 0xaa, + 0x2a, + 0x3f, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x42, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x01, + 0x00, + 0x00, + 0x0a, + 0xd7, + 0x23, + 0x3d, + 0x36, + 0x00, + 0x05, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x18, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x6a, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x01, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x73, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x75, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x76, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x78, + 0x00, + 0x00, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x82, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x73, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x87, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x86, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x89, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x91, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x92, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x91, + 0x00, + 0x00, + 0x00, + 0x92, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x90, + 0x00, + 0x00, + 0x00, + 0x93, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x95, + 0x00, + 0x00, + 0x00, + 0x94, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x96, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x98, + 0x00, + 0x00, + 0x00, + 0x97, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x99, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x00, + 0x04, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x9e, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0xa2, + 0x00, + 0x00, + 0x00, + 0xbe, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0xa3, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xa0, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x07, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x00, + 0x00, + 0x00, + 0x79, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xa5, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xa6, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0xab, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xa7, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0x7b, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0xad, + 0x00, + 0x00, + 0x00, + 0xae, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x7a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xb5, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xb6, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0xb5, + 0x00, + 0x00, + 0x00, + 0xb6, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x00, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0xb7, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xbb, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0xbb, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xbc, + 0x00, + 0x00, + 0x00, + 0xbd, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xbd, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xc0, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x04, + 0x00, + 0xb1, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x00, + 0x00, + 0x00, + 0xc0, + 0x00, + 0x00, + 0x00, + 0x67, + 0x00, + 0x05, + 0x00, + 0xc3, + 0x00, + 0x00, + 0x00, + 0xc4, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x72, + 0x00, + 0x00, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0xc4, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0xc5, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x00, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0xc9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0xbf, + 0x00, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, + 0xca, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0xcc, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xce, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0xdb, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xda, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0xdc, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xde, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x00, + 0x00, + 0x00, + 0xdf, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0xde, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0xe6, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xe5, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xea, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xed, + 0x00, + 0x00, + 0x00, + 0xec, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xee, + 0x00, + 0x00, + 0x00, + 0xea, + 0x00, + 0x00, + 0x00, + 0xed, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x00, + 0x00, + 0x00, + 0xee, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0xef, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xf2, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0xf2, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0xc7, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xf6, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x00, + 0x00, + 0xf5, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0xf4, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfc, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, + 0xfc, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0xfb, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x07, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xff, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0xdd, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x07, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x01, + 0x01, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x02, + 0x01, + 0x00, + 0x00, + 0x01, + 0x01, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0xff, + 0x00, + 0x00, + 0x00, + 0x02, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x04, + 0x01, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x07, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0x04, + 0x01, + 0x00, + 0x00, + 0x04, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x06, + 0x01, + 0x00, + 0x00, + 0x05, + 0x01, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x07, + 0x01, + 0x00, + 0x00, + 0x03, + 0x01, + 0x00, + 0x00, + 0x06, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0xe8, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x07, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x09, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x08, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x01, + 0x00, + 0x00, + 0x09, + 0x01, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x01, + 0x00, + 0x00, + 0x07, + 0x01, + 0x00, + 0x00, + 0x0a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0xf3, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x07, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x01, + 0x00, + 0x00, + 0x0b, + 0x01, + 0x00, + 0x00, + 0x0d, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x10, + 0x01, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x0f, + 0x01, + 0x00, + 0x00, + 0x88, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x11, + 0x01, + 0x00, + 0x00, + 0x0e, + 0x01, + 0x00, + 0x00, + 0x10, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x11, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x12, + 0x01, + 0x00, + 0x00, + 0x13, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x14, + 0x01, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x15, + 0x01, + 0x00, + 0x00, + 0x11, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x14, + 0x01, + 0x00, + 0x00, + 0x15, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x17, + 0x01, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x19, + 0x01, + 0x00, + 0x00, + 0xcd, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x18, + 0x01, + 0x00, + 0x00, + 0x19, + 0x01, + 0x00, + 0x00, + 0x39, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x01, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x18, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x1b, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x1c, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x17, + 0x01, + 0x00, + 0x00, + 0x1a, + 0x01, + 0x00, + 0x00, + 0x1d, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x1e, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x1f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x20, + 0x01, + 0x00, + 0x00, + 0xb0, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x20, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xbe, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x23, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x22, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x24, + 0x01, + 0x00, + 0x00, + 0x23, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x26, + 0x01, + 0x00, + 0x00, + 0x24, + 0x01, + 0x00, + 0x00, + 0x25, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x29, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x2a, + 0x01, + 0x00, + 0x00, + 0x2b, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x27, + 0x01, + 0x00, + 0x00, + 0x2d, + 0x01, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x26, + 0x01, + 0x00, + 0x00, + 0x2f, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x30, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0x31, + 0x01, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x32, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x33, + 0x01, + 0x00, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x34, + 0x01, + 0x00, + 0x00, + 0x33, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x35, + 0x01, + 0x00, + 0x00, + 0x32, + 0x01, + 0x00, + 0x00, + 0x34, + 0x01, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x36, + 0x01, + 0x00, + 0x00, + 0x31, + 0x01, + 0x00, + 0x00, + 0x35, + 0x01, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x37, + 0x01, + 0x00, + 0x00, + 0x36, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x38, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x38, + 0x01, + 0x00, + 0x00, + 0x37, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0xb2, + 0x00, + 0x00, + 0x00, + 0x39, + 0x01, + 0x00, + 0x00, + 0xb4, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x01, + 0x00, + 0x00, + 0x21, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x01, + 0x00, + 0x00, + 0x3b, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x01, + 0x00, + 0x00, + 0x3a, + 0x01, + 0x00, + 0x00, + 0x3c, + 0x01, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x01, + 0x00, + 0x00, + 0x39, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x01, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x40, + 0x01, + 0x00, + 0x00, + 0x3f, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x42, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x43, + 0x01, + 0x00, + 0x00, + 0x42, + 0x01, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x43, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x46, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x44, + 0x01, + 0x00, + 0x00, + 0x45, + 0x01, + 0x00, + 0x00, + 0x46, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x45, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x48, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x48, + 0x01, + 0x00, + 0x00, + 0x4a, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0x4b, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x01, + 0x00, + 0x00, + 0x47, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x4e, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x50, + 0x01, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x4f, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x51, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x4c, + 0x01, + 0x00, + 0x00, + 0x4d, + 0x01, + 0x00, + 0x00, + 0x50, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x51, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x46, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x46, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x53, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x54, + 0x01, + 0x00, + 0x00, + 0x53, + 0x01, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x54, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x55, + 0x01, + 0x00, + 0x00, + 0x56, + 0x01, + 0x00, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x56, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x59, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x01, + 0x00, + 0x00, + 0x5a, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x5d, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0x5f, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x61, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x62, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x64, + 0x01, + 0x00, + 0x00, + 0x60, + 0x01, + 0x00, + 0x00, + 0x63, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x65, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x64, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x65, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x67, + 0x01, + 0x00, + 0x00, + 0x5e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x69, + 0x01, + 0x00, + 0x00, + 0x67, + 0x01, + 0x00, + 0x00, + 0x68, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6a, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x69, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x6a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x6c, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x6c, + 0x01, + 0x00, + 0x00, + 0xd4, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x70, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x6d, + 0x01, + 0x00, + 0x00, + 0x6f, + 0x01, + 0x00, + 0x00, + 0x72, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x6f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x71, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x70, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x72, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x73, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x73, + 0x01, + 0x00, + 0x00, + 0x74, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x75, + 0x01, + 0x00, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x77, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x79, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x58, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x7a, + 0x01, + 0x00, + 0x00, + 0x7b, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x7c, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x7d, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x78, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0x76, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x7e, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x70, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x70, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x6e, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x7f, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x66, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x81, + 0x01, + 0x00, + 0x00, + 0x82, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x83, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x80, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x85, + 0x01, + 0x00, + 0x00, + 0x86, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x87, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x84, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x52, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x89, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x88, + 0x01, + 0x00, + 0x00, + 0x8a, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0x8c, + 0x01, + 0x00, + 0x00, + 0x8b, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x8d, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x57, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x01, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0x90, + 0x01, + 0x00, + 0x00, + 0x8f, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0x90, + 0x01, + 0x00, + 0x00, + 0x91, + 0x01, + 0x00, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x91, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x94, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x07, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x97, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x94, + 0x01, + 0x00, + 0x00, + 0x96, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x97, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x98, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x99, + 0x01, + 0x00, + 0x00, + 0x93, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0x9a, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x41, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x9a, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x9c, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x9b, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x98, + 0x01, + 0x00, + 0x00, + 0x99, + 0x01, + 0x00, + 0x00, + 0x9c, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x9d, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x92, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0x6b, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xa1, + 0x01, + 0x00, + 0x00, + 0x9f, + 0x01, + 0x00, + 0x00, + 0xa0, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0xa1, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xa3, + 0x01, + 0x00, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x69, + 0x00, + 0x00, + 0x00, + 0xa4, + 0x01, + 0x00, + 0x00, + 0x9e, + 0x01, + 0x00, + 0x00, + 0x94, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa5, + 0x01, + 0x00, + 0x00, + 0xa3, + 0x01, + 0x00, + 0x00, + 0xa4, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xa6, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa7, + 0x01, + 0x00, + 0x00, + 0xa6, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x01, + 0x00, + 0x00, + 0xa5, + 0x01, + 0x00, + 0x00, + 0xa7, + 0x01, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xa9, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xa8, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xa2, + 0x01, + 0x00, + 0x00, + 0xa9, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x01, + 0x00, + 0x00, + 0xa2, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xab, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0xaa, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xac, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xad, + 0x01, + 0x00, + 0x00, + 0xac, + 0x01, + 0x00, + 0x00, + 0xab, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0xad, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xaf, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xae, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xb0, + 0x01, + 0x00, + 0x00, + 0xaf, + 0x01, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xb1, + 0x01, + 0x00, + 0x00, + 0xb0, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xb3, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xb1, + 0x01, + 0x00, + 0x00, + 0xb2, + 0x01, + 0x00, + 0x00, + 0xb3, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb2, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0xb7, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x01, + 0x00, + 0x00, + 0xb6, + 0x01, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xb9, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xbb, + 0x01, + 0x00, + 0x00, + 0xb9, + 0x01, + 0x00, + 0x00, + 0xba, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xbc, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xbb, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xb4, + 0x01, + 0x00, + 0x00, + 0xbc, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0xbf, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xc0, + 0x01, + 0x00, + 0x00, + 0xb4, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xc1, + 0x01, + 0x00, + 0x00, + 0xc0, + 0x01, + 0x00, + 0x00, + 0xba, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xc3, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xc1, + 0x01, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0xc5, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xc4, + 0x01, + 0x00, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xc4, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xc3, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc5, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xc6, + 0x01, + 0x00, + 0x00, + 0xb4, + 0x01, + 0x00, + 0x00, + 0xb8, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xc8, + 0x01, + 0x00, + 0x00, + 0xc6, + 0x01, + 0x00, + 0x00, + 0xc7, + 0x01, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xca, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xc8, + 0x01, + 0x00, + 0x00, + 0xc9, + 0x01, + 0x00, + 0x00, + 0xcc, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc9, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xcb, + 0x01, + 0x00, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcb, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xca, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xcc, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xcd, + 0x01, + 0x00, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xcd, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xca, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xca, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xc3, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xc3, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xce, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xcf, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd0, + 0x01, + 0x00, + 0x00, + 0xbd, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd1, + 0x01, + 0x00, + 0x00, + 0xcf, + 0x01, + 0x00, + 0x00, + 0xd0, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xd2, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xae, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd3, + 0x01, + 0x00, + 0x00, + 0xd2, + 0x01, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd4, + 0x01, + 0x00, + 0x00, + 0xd3, + 0x01, + 0x00, + 0x00, + 0xd3, + 0x01, + 0x00, + 0x00, + 0xd3, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xd5, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0xce, + 0x01, + 0x00, + 0x00, + 0xd1, + 0x01, + 0x00, + 0x00, + 0xd4, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0xd5, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xb3, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xb3, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xd7, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xd8, + 0x01, + 0x00, + 0x00, + 0xd7, + 0x01, + 0x00, + 0x00, + 0xba, + 0x00, + 0x05, + 0x00, + 0x77, + 0x00, + 0x00, + 0x00, + 0xd9, + 0x01, + 0x00, + 0x00, + 0xd8, + 0x01, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0xf7, + 0x00, + 0x03, + 0x00, + 0xdb, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xfa, + 0x00, + 0x04, + 0x00, + 0xd9, + 0x01, + 0x00, + 0x00, + 0xda, + 0x01, + 0x00, + 0x00, + 0xdb, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xda, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xdd, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0x28, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xde, + 0x01, + 0x00, + 0x00, + 0xdd, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x01, + 0x00, + 0x00, + 0xde, + 0x01, + 0x00, + 0x00, + 0xdf, + 0x01, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0xe0, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x01, + 0x00, + 0x00, + 0xe1, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe3, + 0x01, + 0x00, + 0x00, + 0xe2, + 0x01, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xdc, + 0x01, + 0x00, + 0x00, + 0xe3, + 0x01, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x74, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x01, + 0x00, + 0x00, + 0x71, + 0x00, + 0x00, + 0x00, + 0xd6, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe5, + 0x01, + 0x00, + 0x00, + 0xe4, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe7, + 0x01, + 0x00, + 0x00, + 0xe5, + 0x01, + 0x00, + 0x00, + 0xe6, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x01, + 0x00, + 0x00, + 0xdc, + 0x01, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x01, + 0x00, + 0x00, + 0xe7, + 0x01, + 0x00, + 0x00, + 0xe8, + 0x01, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xea, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0xe9, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xeb, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x8e, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xec, + 0x01, + 0x00, + 0x00, + 0xeb, + 0x01, + 0x00, + 0x00, + 0xea, + 0x01, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0xec, + 0x01, + 0x00, + 0x00, + 0xf9, + 0x00, + 0x02, + 0x00, + 0xdb, + 0x01, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0xdb, + 0x01, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0xed, + 0x01, + 0x00, + 0x00, + 0x16, + 0x01, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xee, + 0x01, + 0x00, + 0x00, + 0xed, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xef, + 0x01, + 0x00, + 0x00, + 0xed, + 0x01, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x01, + 0x00, + 0x00, + 0xed, + 0x01, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x07, + 0x00, + 0xa8, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x01, + 0x00, + 0x00, + 0xee, + 0x01, + 0x00, + 0x00, + 0xef, + 0x01, + 0x00, + 0x00, + 0xf0, + 0x01, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0xaa, + 0x00, + 0x00, + 0x00, + 0xf1, + 0x01, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x35, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x34, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x3a, + 0x00, + 0x00, + 0x00, + 0x3c, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x39, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x40, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x37, + 0x00, + 0x03, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x45, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x49, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x4b, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0x4c, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x4d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x4f, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x4e, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x54, + 0x00, + 0x00, + 0x00, + 0x55, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x53, + 0x00, + 0x00, + 0x00, + 0x56, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x4a, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x58, + 0x00, + 0x00, + 0x00, + 0x59, + 0x00, + 0x00, + 0x00, + 0x83, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x00, + 0x00, + 0x5a, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x43, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0x46, + 0x00, + 0x00, + 0x00, + 0x85, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0x5d, + 0x00, + 0x00, + 0x00, + 0x5e, + 0x00, + 0x00, + 0x00, + 0x81, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x5c, + 0x00, + 0x00, + 0x00, + 0x5f, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x52, + 0x00, + 0x00, + 0x00, + 0x5b, + 0x00, + 0x00, + 0x00, + 0x60, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x62, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x65, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x63, + 0x00, + 0x00, + 0x00, + 0x0c, + 0x00, + 0x08, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x61, + 0x00, + 0x00, + 0x00, + 0x64, + 0x00, + 0x00, + 0x00, + 0x65, + 0x00, + 0x00, + 0x00, + 0xfe, + 0x00, + 0x02, + 0x00, + 0x66, + 0x00, + 0x00, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00}; +static const size_t kpostfx_frag_spv_size = 11712; diff --git a/source/core/rendering/sdl3gpu/spv/postfx_vert_spv.h b/source/core/rendering/sdl3gpu/spv/postfx_vert_spv.h new file mode 100644 index 0000000..1be581e --- /dev/null +++ b/source/core/rendering/sdl3gpu/spv/postfx_vert_spv.h @@ -0,0 +1,1449 @@ +#pragma once +#include +#include +static const uint8_t kpostfx_vert_spv[] = { + 0x03, + 0x02, + 0x23, + 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x00, + 0x0d, + 0x00, + 0x33, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x06, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x47, + 0x4c, + 0x53, + 0x4c, + 0x2e, + 0x73, + 0x74, + 0x64, + 0x2e, + 0x34, + 0x35, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x63, + 0x70, + 0x70, + 0x5f, + 0x73, + 0x74, + 0x79, + 0x6c, + 0x65, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x69, + 0x6e, + 0x63, + 0x6c, + 0x75, + 0x64, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x50, + 0x65, + 0x72, + 0x56, + 0x65, + 0x72, + 0x74, + 0x65, + 0x78, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x06, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x50, + 0x6f, + 0x73, + 0x69, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x50, + 0x6f, + 0x69, + 0x6e, + 0x74, + 0x53, + 0x69, + 0x7a, + 0x65, + 0x00, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x43, + 0x6c, + 0x69, + 0x70, + 0x44, + 0x69, + 0x73, + 0x74, + 0x61, + 0x6e, + 0x63, + 0x65, + 0x00, + 0x06, + 0x00, + 0x07, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x43, + 0x75, + 0x6c, + 0x6c, + 0x44, + 0x69, + 0x73, + 0x74, + 0x61, + 0x6e, + 0x63, + 0x65, + 0x00, + 0x05, + 0x00, + 0x03, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x67, + 0x6c, + 0x5f, + 0x56, + 0x65, + 0x72, + 0x74, + 0x65, + 0x78, + 0x49, + 0x6e, + 0x64, + 0x65, + 0x78, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x69, + 0x6e, + 0x64, + 0x65, + 0x78, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x76, + 0x5f, + 0x75, + 0x76, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x69, + 0x6e, + 0x64, + 0x65, + 0x78, + 0x61, + 0x62, + 0x6c, + 0x65, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x03, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x05, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x02, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x03, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x06, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x1c, + 0x00, + 0x04, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0xbf, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x40, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x15, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x06, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x19, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x3f, + 0x20, + 0x00, + 0x04, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x28, + 0x00, + 0x00, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x04, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x40, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x2b, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x05, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x06, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x2a, + 0x00, + 0x00, + 0x00, + 0x2c, + 0x00, + 0x00, + 0x00, + 0x2d, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x1c, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x1d, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x1f, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x51, + 0x00, + 0x05, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x50, + 0x00, + 0x07, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x23, + 0x00, + 0x00, + 0x00, + 0x24, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x27, + 0x00, + 0x00, + 0x00, + 0x25, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x1a, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x2e, + 0x00, + 0x00, + 0x00, + 0x41, + 0x00, + 0x05, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x30, + 0x00, + 0x00, + 0x00, + 0x2f, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0x31, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x29, + 0x00, + 0x00, + 0x00, + 0x32, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00}; +static const size_t kpostfx_vert_spv_size = 1444; diff --git a/source/core/rendering/sdl3gpu/spv/upscale_frag_spv.h b/source/core/rendering/sdl3gpu/spv/upscale_frag_spv.h new file mode 100644 index 0000000..af2b2da --- /dev/null +++ b/source/core/rendering/sdl3gpu/spv/upscale_frag_spv.h @@ -0,0 +1,633 @@ +#pragma once +#include +#include +static const uint8_t kupscale_frag_spv[] = { + 0x03, + 0x02, + 0x23, + 0x07, + 0x00, + 0x00, + 0x01, + 0x00, + 0x0b, + 0x00, + 0x0d, + 0x00, + 0x14, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x02, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x06, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x47, + 0x4c, + 0x53, + 0x4c, + 0x2e, + 0x73, + 0x74, + 0x64, + 0x2e, + 0x34, + 0x35, + 0x30, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x07, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x03, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0xc2, + 0x01, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0a, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x63, + 0x70, + 0x70, + 0x5f, + 0x73, + 0x74, + 0x79, + 0x6c, + 0x65, + 0x5f, + 0x6c, + 0x69, + 0x6e, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x47, + 0x4c, + 0x5f, + 0x47, + 0x4f, + 0x4f, + 0x47, + 0x4c, + 0x45, + 0x5f, + 0x69, + 0x6e, + 0x63, + 0x6c, + 0x75, + 0x64, + 0x65, + 0x5f, + 0x64, + 0x69, + 0x72, + 0x65, + 0x63, + 0x74, + 0x69, + 0x76, + 0x65, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x6d, + 0x61, + 0x69, + 0x6e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x05, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x6f, + 0x75, + 0x74, + 0x5f, + 0x63, + 0x6f, + 0x6c, + 0x6f, + 0x72, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x73, + 0x63, + 0x65, + 0x6e, + 0x65, + 0x00, + 0x00, + 0x00, + 0x05, + 0x00, + 0x04, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x76, + 0x5f, + 0x75, + 0x76, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x22, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x47, + 0x00, + 0x04, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x1e, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x02, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x21, + 0x00, + 0x03, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x16, + 0x00, + 0x03, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x08, + 0x00, + 0x00, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x19, + 0x00, + 0x09, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1b, + 0x00, + 0x03, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x0a, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x0c, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x17, + 0x00, + 0x04, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x3b, + 0x00, + 0x04, + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x36, + 0x00, + 0x05, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0xf8, + 0x00, + 0x02, + 0x00, + 0x05, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x0d, + 0x00, + 0x00, + 0x00, + 0x3d, + 0x00, + 0x04, + 0x00, + 0x0f, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x11, + 0x00, + 0x00, + 0x00, + 0x57, + 0x00, + 0x05, + 0x00, + 0x07, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0x0e, + 0x00, + 0x00, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x3e, + 0x00, + 0x03, + 0x00, + 0x09, + 0x00, + 0x00, + 0x00, + 0x13, + 0x00, + 0x00, + 0x00, + 0xfd, + 0x00, + 0x01, + 0x00, + 0x38, + 0x00, + 0x01, + 0x00}; +static const size_t kupscale_frag_spv_size = 628; diff --git a/source/core/rendering/shader_backend.hpp b/source/core/rendering/shader_backend.hpp new file mode 100644 index 0000000..df5427b --- /dev/null +++ b/source/core/rendering/shader_backend.hpp @@ -0,0 +1,175 @@ +#pragma once + +#include + +#include +#include + +namespace Rendering { + + /** @brief Identificador del shader de post-procesado activo */ + enum class ShaderType { POSTFX, + CRTPI }; + + /** + * @brief Parámetros de intensidad de los efectos PostFX + * Definido a nivel de namespace para facilitar el uso desde subclases y screen.cpp + */ + struct PostFXParams { + float vignette = 0.0F; // Intensidad de la viñeta + float scanlines = 0.0F; // Intensidad de las scanlines + float chroma = 0.0F; // Aberración cromática + float mask = 0.0F; // Máscara de fósforo RGB + float gamma = 0.0F; // Corrección gamma (blend 0=off, 1=full) + float curvature = 0.0F; // Curvatura barrel CRT + float bleeding = 0.0F; // Sangrado de color NTSC + float flicker = 0.0F; // Parpadeo de fósforo CRT ~50 Hz + }; + + /** + * @brief Parámetros del shader CRT-Pi (algoritmo de scanlines continuas) + * Diferente al PostFX: usa pesos gaussianos por distancia subpixel y bloom. + */ + struct CrtPiParams { + float scanline_weight{6.0F}; // Ajuste gaussiano (mayor = scanlines más estrechas) + float scanline_gap_brightness{0.12F}; // Brillo mínimo en las ranuras entre scanlines + float bloom_factor{3.5F}; // Factor de brillo para zonas iluminadas + float input_gamma{2.4F}; // Gamma de entrada (linealización) + float output_gamma{2.2F}; // Gamma de salida (codificación) + float mask_brightness{0.80F}; // Sub-píxeles tenues en la máscara de fósforo + float curvature_x{0.05F}; // Distorsión barrel eje X + float curvature_y{0.10F}; // Distorsión barrel eje Y + int mask_type{2}; // 0=ninguna, 1=verde/magenta, 2=RGB fósforo + bool enable_scanlines{true}; // Activar efecto de scanlines + bool enable_multisample{true}; // Antialiasing analítico de scanlines + bool enable_gamma{true}; // Corrección gamma + bool enable_curvature{false}; // Distorsión barrel CRT + bool enable_sharper{false}; // Submuestreo más nítido (modo SHARPER) + }; + + /** + * @brief Interfaz abstracta para backends de renderizado con shaders + * + * Esta interfaz define el contrato que todos los backends de shaders + * deben cumplir (OpenGL, Metal, Vulkan, etc.) + */ + class ShaderBackend { + public: + virtual ~ShaderBackend() = default; + + /** + * @brief Inicializa el backend de shaders + * @param window Ventana SDL + * @param texture Textura de backbuffer a la que aplicar shaders + * @param vertex_source Código fuente del vertex shader + * @param fragment_source Código fuente del fragment shader + * @return true si la inicialización fue exitosa + */ + virtual auto init(SDL_Window* window, + SDL_Texture* texture, + const std::string& vertex_source, + const std::string& fragment_source) -> bool = 0; + + /** + * @brief Renderiza la textura con los shaders aplicados + */ + virtual void render() = 0; + + /** + * @brief Establece el tamaño de la textura como parámetro del shader + * @param width Ancho de la textura + * @param height Alto de la textura + */ + virtual void setTextureSize(float width, float height) = 0; + + /** + * @brief Limpia y libera recursos del backend + */ + virtual void cleanup() = 0; + + /** + * @brief Sube píxeles ARGB8888 desde la CPU al backend de shaders + * Usado por SDL3GPUShader para evitar pasar por SDL_Texture + */ + virtual void uploadPixels(const Uint32* /*pixels*/, int /*width*/, int /*height*/) {} + + /** + * @brief Establece los parámetros de intensidad de los efectos PostFX + * @param p Struct con todos los parámetros PostFX + */ + virtual void setPostFXParams(const PostFXParams& /*p*/) {} + + /** + * @brief Activa o desactiva VSync en el swapchain del GPU device + */ + virtual void setVSync(bool /*vsync*/) {} + + /** + * @brief Activa o desactiva el escalado entero (integer scale) + */ + virtual void setScaleMode(bool /*integer_scale*/) {} + + /** + * @brief Establece el factor de supersampling (1 = off, 3 = 3× SS) + * Con factor > 1, la textura GPU se crea a game×factor resolución y + * las scanlines se hornean en CPU (uploadPixels). El sampler usa LINEAR. + */ + virtual void setOversample(int /*factor*/) {} + + /** + * @brief Activa/desactiva interpolación LINEAR en el paso de upscale (SS). + * Por defecto NEAREST (false). Solo tiene efecto con supersampling activo. + */ + virtual void setLinearUpscale(bool /*linear*/) {} + [[nodiscard]] virtual auto isLinearUpscale() const -> bool { return false; } + + /** + * @brief Selecciona el algoritmo de downscale tras el PostFX (SS activo). + * 0 = bilinear legacy (comportamiento actual, sin textura intermedia), + * 1 = Lanczos2 (ventana 2, ~25 muestras), 2 = Lanczos3 (ventana 3, ~49 muestras). + */ + virtual void setDownscaleAlgo(int /*algo*/) {} + [[nodiscard]] virtual auto getDownscaleAlgo() const -> int { return 0; } + + /** + * @brief Devuelve las dimensiones de la textura de supersampling. + * @return Par (ancho, alto) en píxeles; (0, 0) si SS está desactivado. + */ + [[nodiscard]] virtual auto getSsTextureSize() const -> std::pair { return {0, 0}; } + + /** + * @brief Verifica si el backend está usando aceleración por hardware + * @return true si usa aceleración (OpenGL/Metal/Vulkan) + */ + [[nodiscard]] virtual auto isHardwareAccelerated() const -> bool = 0; + + /** + * @brief Nombre del driver GPU activo (p.ej. "vulkan", "metal", "direct3d12") + * @return Cadena vacía si no disponible + */ + [[nodiscard]] virtual auto getDriverName() const -> std::string { return {}; } + + /** + * @brief Establece el driver GPU preferido antes de init(). + * Vacío = selección automática de SDL. Implementado en SDL3GPUShader. + */ + virtual void setPreferredDriver(const std::string& /*driver*/) {} + + /** + * @brief Selecciona el shader de post-procesado activo (POSTFX o CRTPI). + * Debe llamarse antes de render(). No recrea pipelines. + */ + virtual void setActiveShader(ShaderType /*type*/) {} + + /** + * @brief Establece los parámetros del shader CRT-Pi. + */ + virtual void setCrtPiParams(const CrtPiParams& /*p*/) {} + + /** + * @brief Devuelve el shader de post-procesado activo. + */ + [[nodiscard]] virtual auto getActiveShader() const -> ShaderType { return ShaderType::POSTFX; } + }; + +} // namespace Rendering diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index cf0d1ca..6111959 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -114,12 +114,29 @@ Director::Director(int argc, const char *argv[]) { #endif initInput(); - // Precarga todos los recursos en memoria (texturas, sonidos, música, ...). - // Vivirán durante toda la vida de la app; las escenas leen handles compartidos. - // Debe ir antes de crear Screen porque Screen usa Text (propiedad de Resource). + // Orden importante: Screen + initShaders ANTES de Resource::init. + // Si `Resource::init` se ejecuta primero, carga ~100 texturas vía + // `SDL_CreateTexture` que dejan el SDL_Renderer con el swapchain en un + // estado que hace crashear al driver Vulkan cuando después `initShaders` + // intenta reclamar la ventana para el dispositivo SDL3 GPU. + // + // Por eso el constructor de Screen NO carga notificationText desde + // Resource; se enlaza después vía `screen->initNotifications()`. + screen = new Screen(window, renderer, asset, options); + +#ifndef NO_SHADERS + if (options->videoGpuAcceleration) { + screen->initShaders(); + } +#endif + + // Ahora sí, precarga todos los recursos en memoria (texturas, sonidos, + // música, ...). Vivirán durante toda la vida de la app. Resource::init(renderer, asset, input); - screen = new Screen(window, renderer, asset, options); + // Completa el enlazado de Screen con recursos que necesitan Resource + // inicializado (actualmente sólo el Text de las notificaciones). + screen->initNotifications(); activeSection = ActiveSection::None; } @@ -183,6 +200,9 @@ void Director::initInput() { input->bindKey(input_window_dec_size, SDL_SCANCODE_F1); input->bindKey(input_window_inc_size, SDL_SCANCODE_F2); input->bindKey(input_window_fullscreen, SDL_SCANCODE_F3); + input->bindKey(input_toggle_gpu, SDL_SCANCODE_F9); + input->bindKey(input_toggle_shader, SDL_SCANCODE_F10); + input->bindKey(input_toggle_shader_type, SDL_SCANCODE_F11); // Mando - Movimiento del jugador input->bindGameControllerButton(input_up, SDL_GAMEPAD_BUTTON_DPAD_UP); @@ -250,6 +270,10 @@ bool Director::initSDL() { } success = false; } else { + // Modo de blending por defecto (consistente con CCAE): + // permite alpha blending para fades y notificaciones. + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + // Activa vsync si es necesario if (options->vSync) { SDL_SetRenderVSync(renderer, 1); @@ -626,6 +650,12 @@ bool Director::saveConfigFile() { file << "borderWidth=" + std::to_string(options->borderWidth) + "\n"; file << "borderHeight=" + std::to_string(options->borderHeight) + "\n"; + // Opciones de GPU / shaders (post-procesado) + file << "videoGpuAcceleration=" + boolToString(options->videoGpuAcceleration) + "\n"; + file << "videoGpuPreferredDriver=" + options->videoGpuPreferredDriver + "\n"; + file << "videoShaderEnabled=" + boolToString(options->videoShaderEnabled) + "\n"; + file << "videoShaderType=" + std::to_string(options->videoShaderType) + "\n"; + // Otras opciones del programa file << "\n## OTHER OPTIONS\n"; file << "language=" + std::to_string(options->language) + "\n"; @@ -835,6 +865,26 @@ bool Director::setOptions(options_t *options, std::string var, std::string value options->borderHeight = std::stoi(value); } + // Opciones de GPU / shaders + else if (var == "videoGpuAcceleration") { + options->videoGpuAcceleration = stringToBool(value); + } + + else if (var == "videoGpuPreferredDriver") { + options->videoGpuPreferredDriver = value; + } + + else if (var == "videoShaderEnabled") { + options->videoShaderEnabled = stringToBool(value); + } + + else if (var == "videoShaderType") { + options->videoShaderType = std::stoi(value); + if (options->videoShaderType < 0 || options->videoShaderType > 1) { + options->videoShaderType = 0; + } + } + // Opciones varias else if (var == "language") { options->language = std::stoi(value); diff --git a/source/external/fkyaml_node.hpp b/source/external/fkyaml_node.hpp new file mode 100644 index 0000000..05e7957 --- /dev/null +++ b/source/external/fkyaml_node.hpp @@ -0,0 +1,14726 @@ +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +#ifndef FK_YAML_NODE_HPP +#define FK_YAML_NODE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// #include +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +#ifndef FK_YAML_DETAIL_MACROS_DEFINE_MACROS_HPP +#define FK_YAML_DETAIL_MACROS_DEFINE_MACROS_HPP + +// #include +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +// Check version definitions if already defined. +#if defined(FK_YAML_MAJOR_VERSION) && defined(FK_YAML_MINOR_VERSION) && defined(FK_YAML_PATCH_VERSION) +#if FK_YAML_MAJOR_VERSION != 0 || FK_YAML_MINOR_VERSION != 4 || FK_YAML_PATCH_VERSION != 2 +#warning Already included a different version of the fkYAML library! +#else +// define macros to skip defining macros down below. +#define FK_YAML_VERCHECK_SUCCEEDED +#endif +#endif + +#ifndef FK_YAML_VERCHECK_SUCCEEDED + +#define FK_YAML_MAJOR_VERSION 0 +#define FK_YAML_MINOR_VERSION 4 +#define FK_YAML_PATCH_VERSION 2 + +#define FK_YAML_NAMESPACE_VERSION_CONCAT_IMPL(major, minor, patch) v##major##_##minor##_##patch + +#define FK_YAML_NAMESPACE_VERSION_CONCAT(major, minor, patch) FK_YAML_NAMESPACE_VERSION_CONCAT_IMPL(major, minor, patch) + +#define FK_YAML_NAMESPACE_VERSION \ + FK_YAML_NAMESPACE_VERSION_CONCAT(FK_YAML_MAJOR_VERSION, FK_YAML_MINOR_VERSION, FK_YAML_PATCH_VERSION) + +#define FK_YAML_NAMESPACE_BEGIN \ + namespace fkyaml { \ + inline namespace FK_YAML_NAMESPACE_VERSION { + +#define FK_YAML_NAMESPACE_END \ + } /* inline namespace FK_YAML_NAMESPACE_VERSION */ \ + } // namespace fkyaml + +#define FK_YAML_DETAIL_NAMESPACE_BEGIN \ + FK_YAML_NAMESPACE_BEGIN \ + namespace detail { + +#define FK_YAML_DETAIL_NAMESPACE_END \ + } /* namespace detail */ \ + FK_YAML_NAMESPACE_END + +#endif // !defined(FK_YAML_VERCHECK_SUCCEEDED) + +// #include +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +#ifndef FK_YAML_DETAIL_MACROS_CPP_CONFIG_MACROS_HPP +#define FK_YAML_DETAIL_MACROS_CPP_CONFIG_MACROS_HPP + +// This file is assumed to be included only by version_macros.hpp file. +// To avoid redundant inclusion, do not include version_macros.hpp file as the other files do. + +// With the MSVC compilers, the value of __cplusplus is by default always "199611L"(C++98). +// To avoid that, the library instead references _MSVC_LANG which is always set a correct value. +// See https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ for more details. +#if defined(_MSVC_LANG) && !defined(__clang__) +#define FK_YAML_CPLUSPLUS _MSVC_LANG +#else +#define FK_YAML_CPLUSPLUS __cplusplus +#endif + +// C++ language standard detection +// Skip detection if the definitions listed below already exist. +#if !defined(FK_YAML_HAS_CXX_23) && !defined(FK_YAML_HAS_CXX_20) && !defined(FK_YAML_HAS_CXX_17) && \ + !defined(FK_YAML_HAS_CXX_14) && !defined(FK_YAML_CXX_11) +#if FK_YAML_CPLUSPLUS >= 202302L +#define FK_YAML_HAS_CXX_23 +#define FK_YAML_HAS_CXX_20 +#define FK_YAML_HAS_CXX_17 +#define FK_YAML_HAS_CXX_14 +#elif FK_YAML_CPLUSPLUS >= 202002L +#define FK_YAML_HAS_CXX_20 +#define FK_YAML_HAS_CXX_17 +#define FK_YAML_HAS_CXX_14 +#elif FK_YAML_CPLUSPLUS >= 201703L +#define FK_YAML_HAS_CXX_17 +#define FK_YAML_HAS_CXX_14 +#elif FK_YAML_CPLUSPLUS >= 201402L +#define FK_YAML_HAS_CXX_14 +#endif + +// C++11 is the minimum required version of the fkYAML library. +#define FK_YAML_HAS_CXX_11 +#endif + +// switch usage of the deprecated attribute. [[deprecated]] is available since C++14. +#if defined(FK_YAML_HAS_CXX_14) +#define FK_YAML_DEPRECATED(msg) [[deprecated(msg)]] +#else +#if defined(_MSC_VER) +#define FK_YAML_DEPRECATED(msg) __declspec(deprecated(msg)) +#elif defined(__GNUC__) || defined(__clang__) +#define FK_YAML_DEPRECATED(msg) __attribute__((deprecated(msg))) +#else +#define FK_YAML_DEPRECATED(msg) +#endif +#endif + +// switch usage of inline variables which have been available since C++17. +#if defined(FK_YAML_HAS_CXX_17) +#define FK_YAML_INLINE_VAR inline +#else +#define FK_YAML_INLINE_VAR +#endif + +// switch usage of constexpr keyword depending on active C++ standard. +#if defined(FK_YAML_HAS_CXX_17) +#define FK_YAML_CXX17_CONSTEXPR constexpr +#else +#define FK_YAML_CXX17_CONSTEXPR +#endif + +// Detect __has_* macros. +// The following macros replace redundant `defined(__has_*) && __has_*(...)`. + +#ifdef __has_include +#define FK_YAML_HAS_INCLUDE(header) __has_include(header) +#else +#define FK_YAML_HAS_INCLUDE(header) (0) +#endif + +#ifdef __has_builtin +#define FK_YAML_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else +#define FK_YAML_HAS_BUILTIN(builtin) (0) +#endif + +#ifdef __has_cpp_attribute +#define FK_YAML_HAS_CPP_ATTRIBUTE(attr) __has_cpp_attribute(attr) +#else +#define FK_YAML_HAS_CPP_ATTRIBUTE(attr) (0) +#endif + +#ifdef __has_feature +#define FK_YAML_HAS_FEATURE(feat) __has_feature(feat) +#else +#define FK_YAML_HAS_FEATURE(feat) (0) +#endif + +// switch usage of the no_sanitize attribute only when Clang sanitizer is active. +#if defined(__clang__) && FK_YAML_HAS_FEATURE(address_sanitizer) +#define FK_YAML_NO_SANITIZE(...) __attribute__((no_sanitize(__VA_ARGS__))) +#else +#define FK_YAML_NO_SANITIZE(...) +#endif + +#if FK_YAML_HAS_INCLUDE() +// is available since C++20 +#include +#endif + +// +// C++ feature detections +// + +// switch usages of the std::to_chars()/std::from_chars() functions which have been available since C++17. +#if defined(FK_YAML_HAS_CXX_17) && defined(__cpp_lib_to_chars) && __cpp_lib_to_chars >= 201611L +#define FK_YAML_HAS_TO_CHARS (1) +#else +#define FK_YAML_HAS_TO_CHARS (0) +#endif + +// switch usage of char8_t which has been available since C++20. +#if defined(FK_YAML_HAS_CXX_20) && defined(__cpp_char8_t) && __cpp_char8_t >= 201811L +#define FK_YAML_HAS_CHAR8_T (1) +#else +#define FK_YAML_HAS_CHAR8_T (0) +#endif + +// +// utility macros +// + +// switch usage of [[likely]] C++ attribute which has been available since C++20. +#if defined(FK_YAML_HAS_CXX_20) && FK_YAML_HAS_CPP_ATTRIBUTE(likely) >= 201803L +#define FK_YAML_LIKELY(expr) (!!(expr)) [[likely]] +#elif FK_YAML_HAS_BUILTIN(__builtin_expect) +#define FK_YAML_LIKELY(expr) (__builtin_expect(!!(expr), 1)) +#else +#define FK_YAML_LIKELY(expr) (!!(expr)) +#endif + +// switch usage of [[unlikely]] C++ attribute which has been available since C++20. +#if defined(FK_YAML_HAS_CXX_20) && FK_YAML_HAS_CPP_ATTRIBUTE(unlikely) >= 201803L +#define FK_YAML_UNLIKELY(expr) (!!(expr)) [[unlikely]] +#elif FK_YAML_HAS_BUILTIN(__builtin_expect) +#define FK_YAML_UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) +#else +#define FK_YAML_UNLIKELY(expr) (!!(expr)) +#endif + +#endif /* FK_YAML_DETAIL_MACROS_CPP_CONFIG_MACROS_HPP */ + + +#endif /* FK_YAML_DETAIL_MACROS_DEFINE_MACROS_HPP */ + +// #include +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +#ifndef FK_YAML_DETAIL_ASSERT_HPP +#define FK_YAML_DETAIL_ASSERT_HPP + +// if FK_YAML_ASSERT is not user-defined. apply the default assert impl. +#ifndef FK_YAML_ASSERT +#ifndef NDEBUG +#include +#define FK_YAML_ASSERT(x) assert(x) +#else +#define FK_YAML_ASSERT(x) +#endif +#endif + +#endif /* FK_YAML_DETAIL_ASSERT_HPP */ + +// #include +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +#ifndef FK_YAML_DETAIL_DOCUMENT_METAINFO_HPP +#define FK_YAML_DETAIL_DOCUMENT_METAINFO_HPP + +#include +#include + +// #include + +// #include +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +#ifndef FK_YAML_DETAIL_META_NODE_TRAITS_HPP +#define FK_YAML_DETAIL_META_NODE_TRAITS_HPP + +// #include + +// #include +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +#ifndef FK_YAML_DETAIL_META_DETECT_HPP +#define FK_YAML_DETAIL_META_DETECT_HPP + +#include +#include + +// #include + +// #include +// _______ __ __ __ _____ __ __ __ +// | __| |_/ | \_/ |/ _ \ / \/ \| | fkYAML: A C++ header-only YAML library +// | __| _ < \_ _/| ___ | _ | |___ version 0.4.2 +// |__| |_| \__| |_| |_| |_|___||___|______| https://github.com/fktn-k/fkYAML +// +// SPDX-FileCopyrightText: 2023-2025 Kensuke Fukutani +// SPDX-License-Identifier: MIT + +#ifndef FK_YAML_DETAIL_META_STL_SUPPLEMENT_HPP +#define FK_YAML_DETAIL_META_STL_SUPPLEMENT_HPP + +#include +#include + +// #include + + +#ifdef FK_YAML_HAS_CXX_14 +#include +#endif + +FK_YAML_DETAIL_NAMESPACE_BEGIN + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// For contributors: +// This file is for supplementing future C++ STL implementations to utilize some useful features +// implemented in C++14 or better. +// This file is needed to keep the fkYAML library requirement to C++11. +// **DO NOT** implement features which are not included any version of STL in this file. +// Such implementations must be in the type_traits.hpp file. +///////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef FK_YAML_HAS_CXX_14 + +/// @brief An alias template for std::add_pointer::type with C++11. +/// @note std::add_pointer_t is available since C++14. +/// @sa https://en.cppreference.com/w/cpp/types/add_pointer +/// @tparam T A type to be added a pointer. +template +using add_pointer_t = typename std::add_pointer::type; + +/// @brief An alias template for std::enable_if::type with C++11. +/// @note std::enable_if_t is available since C++14. +/// @sa https://en.cppreference.com/w/cpp/types/enable_if +/// @tparam Condition A condition tested at compile time. +/// @tparam T The type defined only if Condition is true. +template +using enable_if_t = typename std::enable_if::type; + +/// @brief A simple implementation to use std::is_null_pointer with C++11. +/// @note std::is_null_pointer is available since C++14. +/// @sa https://en.cppreference.com/w/cpp/types/is_null_pointer +/// @tparam T The type to be checked if it's equal to std::nullptr_t. +template +struct is_null_pointer : std::is_same::type> {}; + +/// @brief An alias template for std::remove_cv::type with C++11. +/// @note std::remove_cv_t is available since C++14. +/// @sa https://en.cppreference.com/w/cpp/types/remove_cv +/// @tparam T A type from which const-volatile qualifiers are removed. +template +using remove_cv_t = typename std::remove_cv::type; + +/// @brief An alias template for std::remove_pointer::type with C++11. +/// @note std::remove_pointer_t is available since C++14. +/// @sa https://en.cppreference.com/w/cpp/types/remove_pointer +/// @tparam T A type from which a pointer is removed. +template +using remove_pointer_t = typename std::remove_pointer::type; + +/// @brief An alias template for std::remove_reference::type with C++11. +/// @note std::remove_reference_t is available since C++14. +/// @sa https://en.cppreference.com/w/cpp/types/remove_reference +/// @tparam T A type from which a reference is removed. +template +using remove_reference_t = typename std::remove_reference::type; + +template +struct integer_sequence { + using value_type = T; + static constexpr std::size_t size() noexcept { + return sizeof...(I); + } +}; + +#if !FK_YAML_HAS_BUILTIN(__make_integer_seq) && !FK_YAML_HAS_BUILTIN(__integer_pack) + +namespace make_int_seq_impl { + +template +struct merger; + +template +struct merger, integer_sequence> { + using type = integer_sequence; +}; + +template +struct generator { + using type = + typename merger::type, typename generator::type>::type; +}; + +template +struct generator { + using type = integer_sequence; +}; + +template +struct generator { + using type = integer_sequence; +}; + +} // namespace make_int_seq_impl + +#endif + +template +using make_integer_sequence +#if FK_YAML_HAS_BUILTIN(__make_integer_seq) + // clang defines built-in __make_integer_seq to generate an integer sequence. + = __make_integer_seq; +#elif FK_YAML_HAS_BUILTIN(__integer_pack) + // GCC or other compilers may implement built-in __integer_pack to generate an + // integer sequence. + = integer_sequence; +#else + // fallback to the library implementation of make_integer_sequence. + = typename make_int_seq_impl::generator::type; +#endif + +template +using index_sequence = integer_sequence; + +template +using make_index_sequence = make_integer_sequence; + +template +using index_sequence_for = make_index_sequence; + +#else // !defined(FK_YAML_HAS_CXX_14) + +using std::add_pointer_t; +using std::enable_if_t; +using std::index_sequence; +using std::index_sequence_for; +using std::integer_sequence; +using std::is_null_pointer; +using std::make_index_sequence; +using std::make_integer_sequence; +using std::remove_cv_t; +using std::remove_pointer_t; +using std::remove_reference_t; + +#endif // !defined(FK_YAML_HAS_CXX_14) + +#ifndef FK_YAML_HAS_CXX_17 + +/// @brief A simple implementation to use std::bool_constant with C++11/C++14. +/// @tparam Val +template +using bool_constant = std::integral_constant; + +/// @brief A simple implementation to use std::void_t with C++11/C++14. +/// @note +/// std::conjunction is available since C++17. +/// This is applied when no traits are specified as inputs. +/// @sa https://en.cppreference.com/w/cpp/types/conjunction +/// @tparam Traits Type traits to be checked if their ::value are all true. +template +struct conjunction : std::true_type {}; + +/// @brief A partial specialization of conjunction if only one Trait is given. +/// @tparam Trait Type trait to be checked if its ::value is true. +template +struct conjunction : Trait {}; + +/// @brief A partial specialization of conjunction if more than one traits are given. +/// @tparam First The first type trait to be checked if its ::value is true. +/// @tparam Rest The rest of traits passed as another conjunction template arguments if First::value is true. +template +struct conjunction : std::conditional, First>::type {}; + +/// @brief A simple implementation to use std::disjunction with C++11/C++14. +/// @note +/// std::disjunction is available since C++17. +/// This is applied when no traits are specified as inputs. +/// @sa https://en.cppreference.com/w/cpp/types/disjunction +/// @tparam Traits Type traits to be checked if at least one of their ::value is true. +template +struct disjunction : std::false_type {}; + +/// @brief A partial specialization of disjunction if only one Trait is given. +/// @tparam Trait Type trait to be checked if its ::value is true. +template +struct disjunction : Trait {}; + +/// @brief A partial specialization of disjunction if more than one traits are given. +/// @tparam First The first type trait to be checked if its ::value is true. +/// @tparam Rest The rest of traits passed as another conjunction template arguments if First::value is false. +template +struct disjunction : std::conditional>::type {}; + +/// @brief A simple implementation to use std::negation with C++11/C++14. +/// @note std::negation is available since C++17. +/// @sa https://en.cppreference.com/w/cpp/types/negation +/// @tparam Trait Type trait whose ::value is negated. +template +struct negation : std::integral_constant {}; + +/// @brief A helper for void_t. +/// @tparam Types Any types to be transformed to void type. +template +struct make_void { + using type = void; +}; + +/// @brief A simple implementation to use std::void_t with C++11/C++14. +/// @note std::void_t is available since C++17. +/// @sa https://en.cppreference.com/w/cpp/types/void_t +/// @tparam Types Any types to be transformed to void type. +template +using void_t = typename make_void::type; + +#else // !defined(FK_YAML_HAS_CXX_17) + +using std::bool_constant; +using std::conjunction; +using std::disjunction; +using std::negation; +using std::void_t; + +#endif // !defined(FK_YAML_HAS_CXX_17) + +#ifndef FK_YAML_HAS_CXX_20 + +/// @brief A simple implementation to use std::remove_cvref_t with C++11/C++14/C++17. +/// @note std::remove_cvref & std::remove_cvref_t are available since C++20. +/// @sa https://en.cppreference.com/w/cpp/types/remove_cvref +/// @tparam T A type from which cv-qualifiers and reference are removed. +template +using remove_cvref_t = typename std::remove_cv::type>::type; + +#else + +using std::remove_cvref_t; + +#endif + +/// @brief A wrapper function to call std::unreachable() (since C++23) or similar compiler specific extensions. +/// @note This function is implemented only for better code optimization against dead code and thus excluded from +/// coverage report. +// LCOV_EXCL_START +[[noreturn]] inline void unreachable() { + // use compiler specific extensions if possible. + // undefined behavior should be raised by an empty function with noreturn attribute. + +#if defined(FK_YAML_HAS_CXX_23) || (defined(__cpp_lib_unreachable) && __cpp_lib_unreachable >= 202202L) + std::unreachable(); +#elif defined(_MSC_VER) && !defined(__clang__) // MSVC + __assume(false); +#else + __builtin_unreachable(); +#endif +} +// LCOV_EXCL_STOP + +FK_YAML_DETAIL_NAMESPACE_END + +#endif /* FK_YAML_DETAIL_META_STL_SUPPLEMENT_HPP */ + + +FK_YAML_DETAIL_NAMESPACE_BEGIN + +/// @brief A dummy struct to represent detection failure. +struct nonesuch { + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(const nonesuch&) = delete; + nonesuch(nonesuch&&) = delete; + nonesuch& operator=(const nonesuch&) = delete; + nonesuch& operator=(nonesuch&&) = delete; +}; + +/// @brief namespace to implement detector type traits +namespace detector_impl { + +/// @brief A helper for general type detection. +/// @tparam Default A type to represent detection failure. +/// @tparam AlwaysVoid This must be void type. +/// @tparam Op A type for desired operation type. +/// @tparam Args Argument types passed to desired operation. +template class Op, typename... Args> +struct detector : std::false_type { + /// @brief A type which represents detection failure. + using type = Default; +}; + +/// @brief A partial specialization of detector if desired operation type is found. +/// @tparam Default A type to represent detection failure. +/// @tparam Op A type for desired operation type. +/// @tparam Args Argument types passed to desired operation. +template class Op, typename... Args> +struct detector>, Op, Args...> : std::true_type { + /// @brief A detected type. + using type = Op; +}; + +} // namespace detector_impl + +/// @brief Type traits to detect Op operation with Args argument types +/// @tparam Op A desired operation type. +/// @tparam Args Argument types passed to desired operation. +template