summaryrefslogtreecommitdiff
path: root/SDL-3.2.8/src/render
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2026-03-06 13:26:57 -0800
committer3gg <3gg@shellblade.net>2026-03-06 13:26:57 -0800
commitf5c89b3bd5d74849757fd5b4d1a300068522a3ca (patch)
treed6f6e4c81745b393d7594b334710f30c0b2df3bd /SDL-3.2.8/src/render
Initial commitHEADmain
Diffstat (limited to 'SDL-3.2.8/src/render')
-rw-r--r--SDL-3.2.8/src/render/SDL_d3dmath.c135
-rw-r--r--SDL-3.2.8/src/render/SDL_d3dmath.h85
-rw-r--r--SDL-3.2.8/src/render/SDL_render.c5676
-rw-r--r--SDL-3.2.8/src/render/SDL_render_debug_font.h2331
-rw-r--r--SDL-3.2.8/src/render/SDL_render_unsupported.c22
-rw-r--r--SDL-3.2.8/src/render/SDL_sysrender.h372
-rw-r--r--SDL-3.2.8/src/render/SDL_yuv_sw.c404
-rw-r--r--SDL-3.2.8/src/render/SDL_yuv_sw_c.h63
-rw-r--r--SDL-3.2.8/src/render/direct3d/D3D9_PixelShader_YUV.h164
-rw-r--r--SDL-3.2.8/src/render/direct3d/D3D9_PixelShader_YUV.hlsl47
-rw-r--r--SDL-3.2.8/src/render/direct3d/SDL_render_d3d.c1778
-rw-r--r--SDL-3.2.8/src/render/direct3d/SDL_shaders_d3d.c48
-rw-r--r--SDL-3.2.8/src/render/direct3d/SDL_shaders_d3d.h32
-rw-r--r--SDL-3.2.8/src/render/direct3d/compile_shaders.bat1
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Advanced.h1060
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Advanced.hlsl7
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Colors.h284
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Colors.hlsl7
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Common.hlsli235
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Textures.h332
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Textures.hlsl9
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_VertexShader.h339
-rw-r--r--SDL-3.2.8/src/render/direct3d11/D3D11_VertexShader.hlsl38
-rw-r--r--SDL-3.2.8/src/render/direct3d11/SDL_render_d3d11.c2767
-rw-r--r--SDL-3.2.8/src/render/direct3d11/SDL_shaders_d3d11.c116
-rw-r--r--SDL-3.2.8/src/render/direct3d11/SDL_shaders_d3d11.h35
-rw-r--r--SDL-3.2.8/src/render/direct3d11/compile_shaders.bat4
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Advanced.h1389
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Advanced.hlsl8
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Colors.h490
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Colors.hlsl8
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Common.hlsli236
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Textures.h586
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Textures.hlsl8
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Advanced.h31
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Color.h16
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Texture.h23
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_Shader_Common.hlsli37
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader.hlsl45
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Advanced.h653
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Color.h637
-rw-r--r--SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Texture.h645
-rw-r--r--SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12.c3309
-rw-r--r--SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12_xbox.cpp174
-rw-r--r--SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12_xbox.h44
-rw-r--r--SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12.c125
-rw-r--r--SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12.h54
-rw-r--r--SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp132
-rw-r--r--SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp133
-rw-r--r--SDL-3.2.8/src/render/direct3d12/compile_shaders.bat21
-rw-r--r--SDL-3.2.8/src/render/direct3d12/compile_shaders_xbox.bat13
-rw-r--r--SDL-3.2.8/src/render/gpu/SDL_gpu_util.h74
-rw-r--r--SDL-3.2.8/src/render/gpu/SDL_pipeline_gpu.c202
-rw-r--r--SDL-3.2.8/src/render/gpu/SDL_pipeline_gpu.h47
-rw-r--r--SDL-3.2.8/src/render/gpu/SDL_render_gpu.c1276
-rw-r--r--SDL-3.2.8/src/render/gpu/SDL_shaders_gpu.c232
-rw-r--r--SDL-3.2.8/src/render/gpu/SDL_shaders_gpu.h63
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/.gitattributes1
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/.gitignore4
-rwxr-xr-xSDL-3.2.8/src/render/gpu/shaders/build-shaders.sh106
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/color.frag9
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/color.frag.metal.h28
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/color.frag.sm50.dxbc.h85
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/color.frag.sm60.dxil.h340
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/color.frag.spv.h29
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/dxbc50.h6
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/dxil60.h6
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/linepoint.vert17
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.metal.h51
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.sm50.dxbc.h172
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.sm60.dxil.h496
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.spv.h93
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/metal.h6
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/spir-v.h6
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag12
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.metal.h41
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.sm50.dxbc.h123
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.sm60.dxil.h465
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.spv.h59
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag12
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.metal.h40
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.sm50.dxbc.h120
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.sm60.dxil.h467
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.spv.h50
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_color.vert17
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.metal.h48
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.sm50.dxbc.h178
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.sm60.dxil.h515
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.spv.h89
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert20
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.metal.h56
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.sm50.dxbc.h195
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.sm60.dxil.h558
-rw-r--r--SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.spv.h106
-rw-r--r--SDL-3.2.8/src/render/metal/SDL_render_metal.m2196
-rw-r--r--SDL-3.2.8/src/render/metal/SDL_shaders_metal.metal299
-rw-r--r--SDL-3.2.8/src/render/metal/SDL_shaders_metal_ios.h2612
-rw-r--r--SDL-3.2.8/src/render/metal/SDL_shaders_metal_iphonesimulator.h3155
-rw-r--r--SDL-3.2.8/src/render/metal/SDL_shaders_metal_macos.h2532
-rw-r--r--SDL-3.2.8/src/render/metal/SDL_shaders_metal_tvos.h2612
-rw-r--r--SDL-3.2.8/src/render/metal/SDL_shaders_metal_tvsimulator.h3155
-rwxr-xr-xSDL-3.2.8/src/render/metal/build-metal-shaders.sh24
-rw-r--r--SDL-3.2.8/src/render/opengl/SDL_glfuncs.h476
-rw-r--r--SDL-3.2.8/src/render/opengl/SDL_render_gl.c1844
-rw-r--r--SDL-3.2.8/src/render/opengl/SDL_shaders_gl.c545
-rw-r--r--SDL-3.2.8/src/render/opengl/SDL_shaders_gl.h52
-rw-r--r--SDL-3.2.8/src/render/opengles2/SDL_gles2funcs.h78
-rw-r--r--SDL-3.2.8/src/render/opengles2/SDL_render_gles2.c2226
-rw-r--r--SDL-3.2.8/src/render/opengles2/SDL_shaders_gles2.c387
-rw-r--r--SDL-3.2.8/src/render/opengles2/SDL_shaders_gles2.h65
-rw-r--r--SDL-3.2.8/src/render/ps2/SDL_render_ps2.c727
-rw-r--r--SDL-3.2.8/src/render/psp/SDL_render_psp.c1400
-rw-r--r--SDL-3.2.8/src/render/psp/SDL_render_psp_c.h30
-rw-r--r--SDL-3.2.8/src/render/software/SDL_blendfillrect.c371
-rw-r--r--SDL-3.2.8/src/render/software/SDL_blendfillrect.h30
-rw-r--r--SDL-3.2.8/src/render/software/SDL_blendline.c986
-rw-r--r--SDL-3.2.8/src/render/software/SDL_blendline.h30
-rw-r--r--SDL-3.2.8/src/render/software/SDL_blendpoint.c376
-rw-r--r--SDL-3.2.8/src/render/software/SDL_blendpoint.h30
-rw-r--r--SDL-3.2.8/src/render/software/SDL_draw.h723
-rw-r--r--SDL-3.2.8/src/render/software/SDL_drawline.c199
-rw-r--r--SDL-3.2.8/src/render/software/SDL_drawline.h30
-rw-r--r--SDL-3.2.8/src/render/software/SDL_drawpoint.c108
-rw-r--r--SDL-3.2.8/src/render/software/SDL_drawpoint.h30
-rw-r--r--SDL-3.2.8/src/render/software/SDL_render_sw.c1202
-rw-r--r--SDL-3.2.8/src/render/software/SDL_render_sw_c.h27
-rw-r--r--SDL-3.2.8/src/render/software/SDL_rotate.c612
-rw-r--r--SDL-3.2.8/src/render/software/SDL_rotate.h30
-rw-r--r--SDL-3.2.8/src/render/software/SDL_triangle.c945
-rw-r--r--SDL-3.2.8/src/render/software/SDL_triangle.h42
-rw-r--r--SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm.c1198
-rw-r--r--SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_memory.c179
-rw-r--r--SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_memory.h42
-rw-r--r--SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_shaders.h282
-rw-r--r--SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_tools.c1213
-rw-r--r--SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_tools.h63
-rw-r--r--SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_types.h210
-rw-r--r--SDL-3.2.8/src/render/vitagxm/shader_src/clear_f.cg4
-rw-r--r--SDL-3.2.8/src/render/vitagxm/shader_src/clear_v.cg4
-rw-r--r--SDL-3.2.8/src/render/vitagxm/shader_src/color_f.cg4
-rw-r--r--SDL-3.2.8/src/render/vitagxm/shader_src/color_v.cg13
-rw-r--r--SDL-3.2.8/src/render/vitagxm/shader_src/texture_f.cg4
-rw-r--r--SDL-3.2.8/src/render/vitagxm/shader_src/texture_v.cg14
-rw-r--r--SDL-3.2.8/src/render/vulkan/SDL_render_vulkan.c4349
-rw-r--r--SDL-3.2.8/src/render/vulkan/SDL_shaders_vulkan.c60
-rw-r--r--SDL-3.2.8/src/render/vulkan/SDL_shaders_vulkan.h44
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Advanced.h271
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Advanced.hlsl7
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Colors.h41
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Colors.hlsl7
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Common.hlsli181
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Textures.h50
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Textures.hlsl7
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_VertexShader.h51
-rw-r--r--SDL-3.2.8/src/render/vulkan/VULKAN_VertexShader.hlsl45
-rw-r--r--SDL-3.2.8/src/render/vulkan/compile_shaders.bat5
156 files changed, 70262 insertions, 0 deletions
diff --git a/SDL-3.2.8/src/render/SDL_d3dmath.c b/SDL-3.2.8/src/render/SDL_d3dmath.c
new file mode 100644
index 0000000..6a1ab59
--- /dev/null
+++ b/SDL-3.2.8/src/render/SDL_d3dmath.c
@@ -0,0 +1,135 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#if defined(SDL_VIDEO_RENDER_D3D) || \
24 defined(SDL_VIDEO_RENDER_D3D11) || \
25 defined(SDL_VIDEO_RENDER_D3D12) || \
26 defined(SDL_VIDEO_RENDER_VULKAN)
27
28#include "SDL_d3dmath.h"
29
30// Direct3D matrix math functions
31
32Float4X4 MatrixIdentity(void)
33{
34 Float4X4 m;
35 SDL_zero(m);
36 m.v._11 = 1.0f;
37 m.v._22 = 1.0f;
38 m.v._33 = 1.0f;
39 m.v._44 = 1.0f;
40 return m;
41}
42
43Float4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2)
44{
45 Float4X4 m;
46 m.v._11 = M1.v._11 * M2.v._11 + M1.v._12 * M2.v._21 + M1.v._13 * M2.v._31 + M1.v._14 * M2.v._41;
47 m.v._12 = M1.v._11 * M2.v._12 + M1.v._12 * M2.v._22 + M1.v._13 * M2.v._32 + M1.v._14 * M2.v._42;
48 m.v._13 = M1.v._11 * M2.v._13 + M1.v._12 * M2.v._23 + M1.v._13 * M2.v._33 + M1.v._14 * M2.v._43;
49 m.v._14 = M1.v._11 * M2.v._14 + M1.v._12 * M2.v._24 + M1.v._13 * M2.v._34 + M1.v._14 * M2.v._44;
50 m.v._21 = M1.v._21 * M2.v._11 + M1.v._22 * M2.v._21 + M1.v._23 * M2.v._31 + M1.v._24 * M2.v._41;
51 m.v._22 = M1.v._21 * M2.v._12 + M1.v._22 * M2.v._22 + M1.v._23 * M2.v._32 + M1.v._24 * M2.v._42;
52 m.v._23 = M1.v._21 * M2.v._13 + M1.v._22 * M2.v._23 + M1.v._23 * M2.v._33 + M1.v._24 * M2.v._43;
53 m.v._24 = M1.v._21 * M2.v._14 + M1.v._22 * M2.v._24 + M1.v._23 * M2.v._34 + M1.v._24 * M2.v._44;
54 m.v._31 = M1.v._31 * M2.v._11 + M1.v._32 * M2.v._21 + M1.v._33 * M2.v._31 + M1.v._34 * M2.v._41;
55 m.v._32 = M1.v._31 * M2.v._12 + M1.v._32 * M2.v._22 + M1.v._33 * M2.v._32 + M1.v._34 * M2.v._42;
56 m.v._33 = M1.v._31 * M2.v._13 + M1.v._32 * M2.v._23 + M1.v._33 * M2.v._33 + M1.v._34 * M2.v._43;
57 m.v._34 = M1.v._31 * M2.v._14 + M1.v._32 * M2.v._24 + M1.v._33 * M2.v._34 + M1.v._34 * M2.v._44;
58 m.v._41 = M1.v._41 * M2.v._11 + M1.v._42 * M2.v._21 + M1.v._43 * M2.v._31 + M1.v._44 * M2.v._41;
59 m.v._42 = M1.v._41 * M2.v._12 + M1.v._42 * M2.v._22 + M1.v._43 * M2.v._32 + M1.v._44 * M2.v._42;
60 m.v._43 = M1.v._41 * M2.v._13 + M1.v._42 * M2.v._23 + M1.v._43 * M2.v._33 + M1.v._44 * M2.v._43;
61 m.v._44 = M1.v._41 * M2.v._14 + M1.v._42 * M2.v._24 + M1.v._43 * M2.v._34 + M1.v._44 * M2.v._44;
62 return m;
63}
64
65Float4X4 MatrixScaling(float x, float y, float z)
66{
67 Float4X4 m;
68 SDL_zero(m);
69 m.v._11 = x;
70 m.v._22 = y;
71 m.v._33 = z;
72 m.v._44 = 1.0f;
73 return m;
74}
75
76Float4X4 MatrixTranslation(float x, float y, float z)
77{
78 Float4X4 m;
79 SDL_zero(m);
80 m.v._11 = 1.0f;
81 m.v._22 = 1.0f;
82 m.v._33 = 1.0f;
83 m.v._44 = 1.0f;
84 m.v._41 = x;
85 m.v._42 = y;
86 m.v._43 = z;
87 return m;
88}
89
90Float4X4 MatrixRotationX(float r)
91{
92 float sinR = SDL_sinf(r);
93 float cosR = SDL_cosf(r);
94 Float4X4 m;
95 SDL_zero(m);
96 m.v._11 = 1.0f;
97 m.v._22 = cosR;
98 m.v._23 = sinR;
99 m.v._32 = -sinR;
100 m.v._33 = cosR;
101 m.v._44 = 1.0f;
102 return m;
103}
104
105Float4X4 MatrixRotationY(float r)
106{
107 float sinR = SDL_sinf(r);
108 float cosR = SDL_cosf(r);
109 Float4X4 m;
110 SDL_zero(m);
111 m.v._11 = cosR;
112 m.v._13 = -sinR;
113 m.v._22 = 1.0f;
114 m.v._31 = sinR;
115 m.v._33 = cosR;
116 m.v._44 = 1.0f;
117 return m;
118}
119
120Float4X4 MatrixRotationZ(float r)
121{
122 float sinR = SDL_sinf(r);
123 float cosR = SDL_cosf(r);
124 Float4X4 m;
125 SDL_zero(m);
126 m.v._11 = cosR;
127 m.v._12 = sinR;
128 m.v._21 = -sinR;
129 m.v._22 = cosR;
130 m.v._33 = 1.0f;
131 m.v._44 = 1.0f;
132 return m;
133}
134
135#endif // SDL_VIDEO_RENDER_D3D || SDL_VIDEO_RENDER_D3D11 || SDL_VIDEO_RENDER_D3D12 || SDL_VIDEO_RENDER_VULKAN
diff --git a/SDL-3.2.8/src/render/SDL_d3dmath.h b/SDL-3.2.8/src/render/SDL_d3dmath.h
new file mode 100644
index 0000000..84cff9e
--- /dev/null
+++ b/SDL-3.2.8/src/render/SDL_d3dmath.h
@@ -0,0 +1,85 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#if defined(SDL_VIDEO_RENDER_D3D) || \
24 defined(SDL_VIDEO_RENDER_D3D11) || \
25 defined(SDL_VIDEO_RENDER_D3D12) || \
26 defined(SDL_VIDEO_RENDER_GPU) || \
27 defined(SDL_VIDEO_RENDER_VULKAN)
28
29// Set up for C function definitions, even when using C++
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34// Direct3D matrix math functions
35
36typedef struct
37{
38 float x;
39 float y;
40} Float2;
41
42typedef struct
43{
44 float x;
45 float y;
46 float z;
47} Float3;
48
49typedef struct
50{
51 float x;
52 float y;
53 float z;
54 float w;
55} Float4;
56
57typedef struct
58{
59 union
60 {
61 struct
62 {
63 float _11, _12, _13, _14;
64 float _21, _22, _23, _24;
65 float _31, _32, _33, _34;
66 float _41, _42, _43, _44;
67 } v;
68 float m[4][4];
69 };
70} Float4X4;
71
72extern Float4X4 MatrixIdentity(void);
73extern Float4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2);
74extern Float4X4 MatrixScaling(float x, float y, float z);
75extern Float4X4 MatrixTranslation(float x, float y, float z);
76extern Float4X4 MatrixRotationX(float r);
77extern Float4X4 MatrixRotationY(float r);
78extern Float4X4 MatrixRotationZ(float r);
79
80// Ends C function definitions when using C++
81#ifdef __cplusplus
82}
83#endif
84
85#endif // SDL_VIDEO_RENDER_D3D || SDL_VIDEO_RENDER_D3D11 || SDL_VIDEO_RENDER_D3D12 || SDL_VIDEO_RENDER_VULKAN
diff --git a/SDL-3.2.8/src/render/SDL_render.c b/SDL-3.2.8/src/render/SDL_render.c
new file mode 100644
index 0000000..82ecb88
--- /dev/null
+++ b/SDL-3.2.8/src/render/SDL_render.c
@@ -0,0 +1,5676 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23// The SDL 2D rendering system
24
25#include "SDL_sysrender.h"
26#include "SDL_render_debug_font.h"
27#include "software/SDL_render_sw_c.h"
28#include "../events/SDL_windowevents_c.h"
29#include "../video/SDL_pixels_c.h"
30#include "../video/SDL_video_c.h"
31
32#ifdef SDL_PLATFORM_ANDROID
33#include "../core/android/SDL_android.h"
34#include "../video/android/SDL_androidevents.h"
35#endif
36
37/* as a courtesy to iOS apps, we don't try to draw when in the background, as
38that will crash the app. However, these apps _should_ have used
39SDL_AddEventWatch to catch SDL_EVENT_WILL_ENTER_BACKGROUND events and stopped
40drawing themselves. Other platforms still draw, as the compositor can use it,
41and more importantly: drawing to render targets isn't lost. But I still think
42this should probably be removed at some point in the future. --ryan. */
43#if defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_TVOS) || defined(SDL_PLATFORM_ANDROID)
44#define DONT_DRAW_WHILE_HIDDEN 1
45#else
46#define DONT_DRAW_WHILE_HIDDEN 0
47#endif
48
49#define SDL_PROP_WINDOW_RENDERER_POINTER "SDL.internal.window.renderer"
50#define SDL_PROP_TEXTURE_PARENT_POINTER "SDL.internal.texture.parent"
51
52#define CHECK_RENDERER_MAGIC_BUT_NOT_DESTROYED_FLAG(renderer, result) \
53 if (!SDL_ObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER)) { \
54 SDL_InvalidParamError("renderer"); \
55 return result; \
56 }
57
58#define CHECK_RENDERER_MAGIC(renderer, result) \
59 CHECK_RENDERER_MAGIC_BUT_NOT_DESTROYED_FLAG(renderer, result); \
60 if ((renderer)->destroyed) { \
61 SDL_SetError("Renderer's window has been destroyed, can't use further"); \
62 return result; \
63 }
64
65#define CHECK_TEXTURE_MAGIC(texture, result) \
66 if (!SDL_ObjectValid(texture, SDL_OBJECT_TYPE_TEXTURE)) { \
67 SDL_InvalidParamError("texture"); \
68 return result; \
69 }
70
71// Predefined blend modes
72#define SDL_COMPOSE_BLENDMODE(srcColorFactor, dstColorFactor, colorOperation, \
73 srcAlphaFactor, dstAlphaFactor, alphaOperation) \
74 (SDL_BlendMode)(((Uint32)(colorOperation) << 0) | \
75 ((Uint32)(srcColorFactor) << 4) | \
76 ((Uint32)(dstColorFactor) << 8) | \
77 ((Uint32)(alphaOperation) << 16) | \
78 ((Uint32)(srcAlphaFactor) << 20) | \
79 ((Uint32)(dstAlphaFactor) << 24))
80
81#define SDL_BLENDMODE_NONE_FULL \
82 SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ZERO, SDL_BLENDOPERATION_ADD, \
83 SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ZERO, SDL_BLENDOPERATION_ADD)
84
85#define SDL_BLENDMODE_BLEND_FULL \
86 SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD, \
87 SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD)
88
89#define SDL_BLENDMODE_BLEND_PREMULTIPLIED_FULL \
90 SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD, \
91 SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD)
92
93#define SDL_BLENDMODE_ADD_FULL \
94 SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD, \
95 SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD)
96
97#define SDL_BLENDMODE_ADD_PREMULTIPLIED_FULL \
98 SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ONE, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD, \
99 SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD)
100
101#define SDL_BLENDMODE_MOD_FULL \
102 SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_SRC_COLOR, SDL_BLENDOPERATION_ADD, \
103 SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD)
104
105#define SDL_BLENDMODE_MUL_FULL \
106 SDL_COMPOSE_BLENDMODE(SDL_BLENDFACTOR_DST_COLOR, SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_BLENDOPERATION_ADD, \
107 SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_ONE, SDL_BLENDOPERATION_ADD)
108
109#ifndef SDL_RENDER_DISABLED
110static const SDL_RenderDriver *render_drivers[] = {
111#ifdef SDL_VIDEO_RENDER_D3D11
112 &D3D11_RenderDriver,
113#endif
114#ifdef SDL_VIDEO_RENDER_D3D12
115 &D3D12_RenderDriver,
116#endif
117#ifdef SDL_VIDEO_RENDER_D3D
118 &D3D_RenderDriver,
119#endif
120#ifdef SDL_VIDEO_RENDER_METAL
121 &METAL_RenderDriver,
122#endif
123#ifdef SDL_VIDEO_RENDER_OGL
124 &GL_RenderDriver,
125#endif
126#ifdef SDL_VIDEO_RENDER_OGL_ES2
127 &GLES2_RenderDriver,
128#endif
129#ifdef SDL_VIDEO_RENDER_PS2
130 &PS2_RenderDriver,
131#endif
132#ifdef SDL_VIDEO_RENDER_PSP
133 &PSP_RenderDriver,
134#endif
135#ifdef SDL_VIDEO_RENDER_VITA_GXM
136 &VITA_GXM_RenderDriver,
137#endif
138#ifdef SDL_VIDEO_RENDER_VULKAN
139 &VULKAN_RenderDriver,
140#endif
141#ifdef SDL_VIDEO_RENDER_GPU
142 &GPU_RenderDriver,
143#endif
144#ifdef SDL_VIDEO_RENDER_SW
145 &SW_RenderDriver,
146#endif
147 NULL
148};
149#endif // !SDL_RENDER_DISABLED
150
151static SDL_Renderer *SDL_renderers;
152
153static const int rect_index_order[] = { 0, 1, 2, 0, 2, 3 };
154
155void SDL_QuitRender(void)
156{
157 while (SDL_renderers) {
158 SDL_DestroyRenderer(SDL_renderers);
159 }
160}
161
162bool SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormat format)
163{
164 SDL_PixelFormat *texture_formats = (SDL_PixelFormat *)SDL_realloc((void *)renderer->texture_formats, (renderer->num_texture_formats + 2) * sizeof(SDL_PixelFormat));
165 if (!texture_formats) {
166 return false;
167 }
168 texture_formats[renderer->num_texture_formats++] = format;
169 texture_formats[renderer->num_texture_formats] = SDL_PIXELFORMAT_UNKNOWN;
170 renderer->texture_formats = texture_formats;
171 SDL_SetPointerProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER, texture_formats);
172 return true;
173}
174
175void SDL_SetupRendererColorspace(SDL_Renderer *renderer, SDL_PropertiesID props)
176{
177 renderer->output_colorspace = (SDL_Colorspace)SDL_GetNumberProperty(props, SDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER, SDL_COLORSPACE_SRGB);
178}
179
180bool SDL_RenderingLinearSpace(SDL_Renderer *renderer)
181{
182 SDL_Colorspace colorspace;
183
184 if (renderer->target) {
185 colorspace = renderer->target->colorspace;
186 } else {
187 colorspace = renderer->output_colorspace;
188 }
189 if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
190 return true;
191 }
192 return false;
193}
194
195void SDL_ConvertToLinear(SDL_FColor *color)
196{
197 color->r = SDL_sRGBtoLinear(color->r);
198 color->g = SDL_sRGBtoLinear(color->g);
199 color->b = SDL_sRGBtoLinear(color->b);
200}
201
202void SDL_ConvertFromLinear(SDL_FColor *color)
203{
204 color->r = SDL_sRGBfromLinear(color->r);
205 color->g = SDL_sRGBfromLinear(color->g);
206 color->b = SDL_sRGBfromLinear(color->b);
207}
208
209static SDL_INLINE void DebugLogRenderCommands(const SDL_RenderCommand *cmd)
210{
211#if 0
212 unsigned int i = 1;
213 SDL_Log("Render commands to flush:");
214 while (cmd) {
215 switch (cmd->command) {
216 case SDL_RENDERCMD_NO_OP:
217 SDL_Log(" %u. no-op", i++);
218 break;
219
220 case SDL_RENDERCMD_SETVIEWPORT:
221 SDL_Log(" %u. set viewport (first=%u, rect={(%d, %d), %dx%d})", i++,
222 (unsigned int) cmd->data.viewport.first,
223 cmd->data.viewport.rect.x, cmd->data.viewport.rect.y,
224 cmd->data.viewport.rect.w, cmd->data.viewport.rect.h);
225 break;
226
227 case SDL_RENDERCMD_SETCLIPRECT:
228 SDL_Log(" %u. set cliprect (enabled=%s, rect={(%d, %d), %dx%d})", i++,
229 cmd->data.cliprect.enabled ? "true" : "false",
230 cmd->data.cliprect.rect.x, cmd->data.cliprect.rect.y,
231 cmd->data.cliprect.rect.w, cmd->data.cliprect.rect.h);
232 break;
233
234 case SDL_RENDERCMD_SETDRAWCOLOR:
235 SDL_Log(" %u. set draw color (first=%u, r=%d, g=%d, b=%d, a=%d, color_scale=%g)", i++,
236 (unsigned int) cmd->data.color.first,
237 (int) cmd->data.color.color.r, (int) cmd->data.color.color.g,
238 (int) cmd->data.color.color.b, (int) cmd->data.color.color.a, cmd->data.color.color_scale);
239 break;
240
241 case SDL_RENDERCMD_CLEAR:
242 SDL_Log(" %u. clear (first=%u, r=%d, g=%d, b=%d, a=%d, color_scale=%g)", i++,
243 (unsigned int) cmd->data.color.first,
244 (int) cmd->data.color.color.r, (int) cmd->data.color.color.g,
245 (int) cmd->data.color.color.b, (int) cmd->data.color.color.a, cmd->data.color.color_scale);
246 break;
247
248 case SDL_RENDERCMD_DRAW_POINTS:
249 SDL_Log(" %u. draw points (first=%u, count=%u, r=%d, g=%d, b=%d, a=%d, blend=%d, color_scale=%g)", i++,
250 (unsigned int) cmd->data.draw.first,
251 (unsigned int) cmd->data.draw.count,
252 (int) cmd->data.draw.color.r, (int) cmd->data.draw.color.g,
253 (int) cmd->data.draw.color.b, (int) cmd->data.draw.color.a,
254 (int) cmd->data.draw.blend, cmd->data.draw.color_scale);
255 break;
256
257 case SDL_RENDERCMD_DRAW_LINES:
258 SDL_Log(" %u. draw lines (first=%u, count=%u, r=%d, g=%d, b=%d, a=%d, blend=%d, color_scale=%g)", i++,
259 (unsigned int) cmd->data.draw.first,
260 (unsigned int) cmd->data.draw.count,
261 (int) cmd->data.draw.color.r, (int) cmd->data.draw.color.g,
262 (int) cmd->data.draw.color.b, (int) cmd->data.draw.color.a,
263 (int) cmd->data.draw.blend, cmd->data.draw.color_scale);
264 break;
265
266 case SDL_RENDERCMD_FILL_RECTS:
267 SDL_Log(" %u. fill rects (first=%u, count=%u, r=%d, g=%d, b=%d, a=%d, blend=%d, color_scale=%g)", i++,
268 (unsigned int) cmd->data.draw.first,
269 (unsigned int) cmd->data.draw.count,
270 (int) cmd->data.draw.color.r, (int) cmd->data.draw.color.g,
271 (int) cmd->data.draw.color.b, (int) cmd->data.draw.color.a,
272 (int) cmd->data.draw.blend, cmd->data.draw.color_scale);
273 break;
274
275 case SDL_RENDERCMD_COPY:
276 SDL_Log(" %u. copy (first=%u, count=%u, r=%d, g=%d, b=%d, a=%d, blend=%d, color_scale=%g, tex=%p)", i++,
277 (unsigned int) cmd->data.draw.first,
278 (unsigned int) cmd->data.draw.count,
279 (int) cmd->data.draw.color.r, (int) cmd->data.draw.color.g,
280 (int) cmd->data.draw.color.b, (int) cmd->data.draw.color.a,
281 (int) cmd->data.draw.blend, cmd->data.draw.color_scale, cmd->data.draw.texture);
282 break;
283
284
285 case SDL_RENDERCMD_COPY_EX:
286 SDL_Log(" %u. copyex (first=%u, count=%u, r=%d, g=%d, b=%d, a=%d, blend=%d, color_scale=%g, tex=%p)", i++,
287 (unsigned int) cmd->data.draw.first,
288 (unsigned int) cmd->data.draw.count,
289 (int) cmd->data.draw.color.r, (int) cmd->data.draw.color.g,
290 (int) cmd->data.draw.color.b, (int) cmd->data.draw.color.a,
291 (int) cmd->data.draw.blend, cmd->data.draw.color_scale, cmd->data.draw.texture);
292 break;
293
294 case SDL_RENDERCMD_GEOMETRY:
295 SDL_Log(" %u. geometry (first=%u, count=%u, r=%d, g=%d, b=%d, a=%d, blend=%d, color_scale=%g, tex=%p)", i++,
296 (unsigned int) cmd->data.draw.first,
297 (unsigned int) cmd->data.draw.count,
298 (int) cmd->data.draw.color.r, (int) cmd->data.draw.color.g,
299 (int) cmd->data.draw.color.b, (int) cmd->data.draw.color.a,
300 (int) cmd->data.draw.blend, cmd->data.draw.color_scale, cmd->data.draw.texture);
301 break;
302
303 }
304 cmd = cmd->next;
305 }
306#endif
307}
308
309static bool FlushRenderCommands(SDL_Renderer *renderer)
310{
311 bool result;
312
313 SDL_assert((renderer->render_commands == NULL) == (renderer->render_commands_tail == NULL));
314
315 if (!renderer->render_commands) { // nothing to do!
316 SDL_assert(renderer->vertex_data_used == 0);
317 return true;
318 }
319
320 DebugLogRenderCommands(renderer->render_commands);
321
322 result = renderer->RunCommandQueue(renderer, renderer->render_commands, renderer->vertex_data, renderer->vertex_data_used);
323
324 // Move the whole render command queue to the unused pool so we can reuse them next time.
325 if (renderer->render_commands_tail) {
326 renderer->render_commands_tail->next = renderer->render_commands_pool;
327 renderer->render_commands_pool = renderer->render_commands;
328 renderer->render_commands_tail = NULL;
329 renderer->render_commands = NULL;
330 }
331 renderer->vertex_data_used = 0;
332 renderer->render_command_generation++;
333 renderer->color_queued = false;
334 renderer->viewport_queued = false;
335 renderer->cliprect_queued = false;
336 return result;
337}
338
339static bool FlushRenderCommandsIfTextureNeeded(SDL_Texture *texture)
340{
341 SDL_Renderer *renderer = texture->renderer;
342 if (texture->last_command_generation == renderer->render_command_generation) {
343 // the current command queue depends on this texture, flush the queue now before it changes
344 return FlushRenderCommands(renderer);
345 }
346 return true;
347}
348
349bool SDL_FlushRenderer(SDL_Renderer *renderer)
350{
351 if (!FlushRenderCommands(renderer)) {
352 return false;
353 }
354 renderer->InvalidateCachedState(renderer);
355 return true;
356}
357
358void *SDL_AllocateRenderVertices(SDL_Renderer *renderer, size_t numbytes, size_t alignment, size_t *offset)
359{
360 const size_t needed = renderer->vertex_data_used + numbytes + alignment;
361 const size_t current_offset = renderer->vertex_data_used;
362
363 const size_t aligner = (alignment && ((current_offset & (alignment - 1)) != 0)) ? (alignment - (current_offset & (alignment - 1))) : 0;
364 const size_t aligned = current_offset + aligner;
365
366 if (renderer->vertex_data_allocation < needed) {
367 const size_t current_allocation = renderer->vertex_data ? renderer->vertex_data_allocation : 1024;
368 size_t newsize = current_allocation * 2;
369 void *ptr;
370 while (newsize < needed) {
371 newsize *= 2;
372 }
373
374 ptr = SDL_realloc(renderer->vertex_data, newsize);
375
376 if (!ptr) {
377 return NULL;
378 }
379 renderer->vertex_data = ptr;
380 renderer->vertex_data_allocation = newsize;
381 }
382
383 if (offset) {
384 *offset = aligned;
385 }
386
387 renderer->vertex_data_used += aligner + numbytes;
388
389 return ((Uint8 *)renderer->vertex_data) + aligned;
390}
391
392static SDL_RenderCommand *AllocateRenderCommand(SDL_Renderer *renderer)
393{
394 SDL_RenderCommand *result = NULL;
395
396 result = renderer->render_commands_pool;
397 if (result) {
398 renderer->render_commands_pool = result->next;
399 result->next = NULL;
400 } else {
401 result = (SDL_RenderCommand *)SDL_calloc(1, sizeof(*result));
402 if (!result) {
403 return NULL;
404 }
405 }
406
407 SDL_assert((renderer->render_commands == NULL) == (renderer->render_commands_tail == NULL));
408 if (renderer->render_commands_tail) {
409 renderer->render_commands_tail->next = result;
410 } else {
411 renderer->render_commands = result;
412 }
413 renderer->render_commands_tail = result;
414
415 return result;
416}
417
418static void UpdatePixelViewport(SDL_Renderer *renderer, SDL_RenderViewState *view)
419{
420 view->pixel_viewport.x = (int)SDL_floorf((view->viewport.x * view->current_scale.x) + view->logical_offset.x);
421 view->pixel_viewport.y = (int)SDL_floorf((view->viewport.y * view->current_scale.y) + view->logical_offset.y);
422 if (view->viewport.w >= 0) {
423 view->pixel_viewport.w = (int)SDL_ceilf(view->viewport.w * view->current_scale.x);
424 } else {
425 view->pixel_viewport.w = view->pixel_w;
426 }
427 if (view->viewport.h >= 0) {
428 view->pixel_viewport.h = (int)SDL_ceilf(view->viewport.h * view->current_scale.y);
429 } else {
430 view->pixel_viewport.h = view->pixel_h;
431 }
432}
433
434static bool QueueCmdSetViewport(SDL_Renderer *renderer)
435{
436 bool result = true;
437
438 SDL_Rect viewport = renderer->view->pixel_viewport;
439
440 if (!renderer->viewport_queued ||
441 SDL_memcmp(&viewport, &renderer->last_queued_viewport, sizeof(viewport)) != 0) {
442 SDL_RenderCommand *cmd = AllocateRenderCommand(renderer);
443 if (cmd) {
444 cmd->command = SDL_RENDERCMD_SETVIEWPORT;
445 cmd->data.viewport.first = 0; // render backend will fill this in.
446 SDL_copyp(&cmd->data.viewport.rect, &viewport);
447 result = renderer->QueueSetViewport(renderer, cmd);
448 if (!result) {
449 cmd->command = SDL_RENDERCMD_NO_OP;
450 } else {
451 SDL_copyp(&renderer->last_queued_viewport, &viewport);
452 renderer->viewport_queued = true;
453 }
454 } else {
455 result = false;
456 }
457 }
458 return result;
459}
460
461static void UpdatePixelClipRect(SDL_Renderer *renderer, SDL_RenderViewState *view)
462{
463 const float scale_x = view->current_scale.x;
464 const float scale_y = view->current_scale.y;
465 view->pixel_clip_rect.x = (int)SDL_floorf(view->clip_rect.x * scale_x);
466 view->pixel_clip_rect.y = (int)SDL_floorf(view->clip_rect.y * scale_y);
467 view->pixel_clip_rect.w = (int)SDL_ceilf(view->clip_rect.w * scale_x);
468 view->pixel_clip_rect.h = (int)SDL_ceilf(view->clip_rect.h * scale_y);
469}
470
471static bool QueueCmdSetClipRect(SDL_Renderer *renderer)
472{
473 bool result = true;
474
475 const SDL_RenderViewState *view = renderer->view;
476 SDL_Rect clip_rect = view->pixel_clip_rect;
477 if (!renderer->cliprect_queued ||
478 view->clipping_enabled != renderer->last_queued_cliprect_enabled ||
479 SDL_memcmp(&clip_rect, &renderer->last_queued_cliprect, sizeof(clip_rect)) != 0) {
480 SDL_RenderCommand *cmd = AllocateRenderCommand(renderer);
481 if (cmd) {
482 cmd->command = SDL_RENDERCMD_SETCLIPRECT;
483 cmd->data.cliprect.enabled = view->clipping_enabled;
484 SDL_copyp(&cmd->data.cliprect.rect, &clip_rect);
485 SDL_copyp(&renderer->last_queued_cliprect, &clip_rect);
486 renderer->last_queued_cliprect_enabled = view->clipping_enabled;
487 renderer->cliprect_queued = true;
488 } else {
489 result = false;
490 }
491 }
492 return result;
493}
494
495static bool QueueCmdSetDrawColor(SDL_Renderer *renderer, SDL_FColor *color)
496{
497 bool result = true;
498
499 if (!renderer->color_queued ||
500 color->r != renderer->last_queued_color.r ||
501 color->g != renderer->last_queued_color.g ||
502 color->b != renderer->last_queued_color.b ||
503 color->a != renderer->last_queued_color.a) {
504 SDL_RenderCommand *cmd = AllocateRenderCommand(renderer);
505 result = false;
506
507 if (cmd) {
508 cmd->command = SDL_RENDERCMD_SETDRAWCOLOR;
509 cmd->data.color.first = 0; // render backend will fill this in.
510 cmd->data.color.color_scale = renderer->color_scale;
511 cmd->data.color.color = *color;
512 result = renderer->QueueSetDrawColor(renderer, cmd);
513 if (!result) {
514 cmd->command = SDL_RENDERCMD_NO_OP;
515 } else {
516 renderer->last_queued_color = *color;
517 renderer->color_queued = true;
518 }
519 }
520 }
521 return result;
522}
523
524static bool QueueCmdClear(SDL_Renderer *renderer)
525{
526 SDL_RenderCommand *cmd = AllocateRenderCommand(renderer);
527 if (!cmd) {
528 return false;
529 }
530
531 cmd->command = SDL_RENDERCMD_CLEAR;
532 cmd->data.color.first = 0;
533 cmd->data.color.color_scale = renderer->color_scale;
534 cmd->data.color.color = renderer->color;
535 return true;
536}
537
538static SDL_RenderCommand *PrepQueueCmdDraw(SDL_Renderer *renderer, const SDL_RenderCommandType cmdtype, SDL_Texture *texture)
539{
540 SDL_RenderCommand *cmd = NULL;
541 bool result = true;
542 SDL_FColor *color;
543 SDL_BlendMode blendMode;
544
545 if (texture) {
546 color = &texture->color;
547 blendMode = texture->blendMode;
548 } else {
549 color = &renderer->color;
550 blendMode = renderer->blendMode;
551 }
552
553 if (cmdtype != SDL_RENDERCMD_GEOMETRY) {
554 result = QueueCmdSetDrawColor(renderer, color);
555 }
556
557 /* Set the viewport and clip rect directly before draws, so the backends
558 * don't have to worry about that state not being valid at draw time. */
559 if (result && !renderer->viewport_queued) {
560 result = QueueCmdSetViewport(renderer);
561 }
562 if (result && !renderer->cliprect_queued) {
563 result = QueueCmdSetClipRect(renderer);
564 }
565
566 if (result) {
567 cmd = AllocateRenderCommand(renderer);
568 if (cmd) {
569 cmd->command = cmdtype;
570 cmd->data.draw.first = 0; // render backend will fill this in.
571 cmd->data.draw.count = 0; // render backend will fill this in.
572 cmd->data.draw.color_scale = renderer->color_scale;
573 cmd->data.draw.color = *color;
574 cmd->data.draw.blend = blendMode;
575 cmd->data.draw.texture = texture;
576 cmd->data.draw.texture_address_mode = SDL_TEXTURE_ADDRESS_CLAMP;
577 }
578 }
579 return cmd;
580}
581
582static bool QueueCmdDrawPoints(SDL_Renderer *renderer, const SDL_FPoint *points, const int count)
583{
584 SDL_RenderCommand *cmd = PrepQueueCmdDraw(renderer, SDL_RENDERCMD_DRAW_POINTS, NULL);
585 bool result = false;
586 if (cmd) {
587 result = renderer->QueueDrawPoints(renderer, cmd, points, count);
588 if (!result) {
589 cmd->command = SDL_RENDERCMD_NO_OP;
590 }
591 }
592 return result;
593}
594
595static bool QueueCmdDrawLines(SDL_Renderer *renderer, const SDL_FPoint *points, const int count)
596{
597 SDL_RenderCommand *cmd = PrepQueueCmdDraw(renderer, SDL_RENDERCMD_DRAW_LINES, NULL);
598 bool result = false;
599 if (cmd) {
600 result = renderer->QueueDrawLines(renderer, cmd, points, count);
601 if (!result) {
602 cmd->command = SDL_RENDERCMD_NO_OP;
603 }
604 }
605 return result;
606}
607
608static bool QueueCmdFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, const int count)
609{
610 SDL_RenderCommand *cmd;
611 bool result = false;
612 const int use_rendergeometry = (!renderer->QueueFillRects);
613
614 cmd = PrepQueueCmdDraw(renderer, (use_rendergeometry ? SDL_RENDERCMD_GEOMETRY : SDL_RENDERCMD_FILL_RECTS), NULL);
615
616 if (cmd) {
617 if (use_rendergeometry) {
618 bool isstack1;
619 bool isstack2;
620 float *xy = SDL_small_alloc(float, 4 * 2 * count, &isstack1);
621 int *indices = SDL_small_alloc(int, 6 * count, &isstack2);
622
623 if (xy && indices) {
624 int i;
625 float *ptr_xy = xy;
626 int *ptr_indices = indices;
627 const int xy_stride = 2 * sizeof(float);
628 const int num_vertices = 4 * count;
629 const int num_indices = 6 * count;
630 const int size_indices = 4;
631 int cur_index = 0;
632
633 for (i = 0; i < count; ++i) {
634 float minx, miny, maxx, maxy;
635
636 minx = rects[i].x;
637 miny = rects[i].y;
638 maxx = rects[i].x + rects[i].w;
639 maxy = rects[i].y + rects[i].h;
640
641 *ptr_xy++ = minx;
642 *ptr_xy++ = miny;
643 *ptr_xy++ = maxx;
644 *ptr_xy++ = miny;
645 *ptr_xy++ = maxx;
646 *ptr_xy++ = maxy;
647 *ptr_xy++ = minx;
648 *ptr_xy++ = maxy;
649
650 *ptr_indices++ = cur_index + rect_index_order[0];
651 *ptr_indices++ = cur_index + rect_index_order[1];
652 *ptr_indices++ = cur_index + rect_index_order[2];
653 *ptr_indices++ = cur_index + rect_index_order[3];
654 *ptr_indices++ = cur_index + rect_index_order[4];
655 *ptr_indices++ = cur_index + rect_index_order[5];
656 cur_index += 4;
657 }
658
659 result = renderer->QueueGeometry(renderer, cmd, NULL,
660 xy, xy_stride, &renderer->color, 0 /* color_stride */, NULL, 0,
661 num_vertices, indices, num_indices, size_indices,
662 1.0f, 1.0f);
663
664 if (!result) {
665 cmd->command = SDL_RENDERCMD_NO_OP;
666 }
667 }
668 SDL_small_free(xy, isstack1);
669 SDL_small_free(indices, isstack2);
670
671 } else {
672 result = renderer->QueueFillRects(renderer, cmd, rects, count);
673 if (!result) {
674 cmd->command = SDL_RENDERCMD_NO_OP;
675 }
676 }
677 }
678 return result;
679}
680
681static bool QueueCmdCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect)
682{
683 SDL_RenderCommand *cmd = PrepQueueCmdDraw(renderer, SDL_RENDERCMD_COPY, texture);
684 bool result = false;
685 if (cmd) {
686 result = renderer->QueueCopy(renderer, cmd, texture, srcrect, dstrect);
687 if (!result) {
688 cmd->command = SDL_RENDERCMD_NO_OP;
689 }
690 }
691 return result;
692}
693
694static bool QueueCmdCopyEx(SDL_Renderer *renderer, SDL_Texture *texture,
695 const SDL_FRect *srcquad, const SDL_FRect *dstrect,
696 const double angle, const SDL_FPoint *center, const SDL_FlipMode flip, float scale_x, float scale_y)
697{
698 SDL_RenderCommand *cmd = PrepQueueCmdDraw(renderer, SDL_RENDERCMD_COPY_EX, texture);
699 bool result = false;
700 if (cmd) {
701 result = renderer->QueueCopyEx(renderer, cmd, texture, srcquad, dstrect, angle, center, flip, scale_x, scale_y);
702 if (!result) {
703 cmd->command = SDL_RENDERCMD_NO_OP;
704 }
705 }
706 return result;
707}
708
709static bool QueueCmdGeometry(SDL_Renderer *renderer, SDL_Texture *texture,
710 const float *xy, int xy_stride,
711 const SDL_FColor *color, int color_stride,
712 const float *uv, int uv_stride,
713 int num_vertices,
714 const void *indices, int num_indices, int size_indices,
715 float scale_x, float scale_y, SDL_TextureAddressMode texture_address_mode)
716{
717 SDL_RenderCommand *cmd;
718 bool result = false;
719 cmd = PrepQueueCmdDraw(renderer, SDL_RENDERCMD_GEOMETRY, texture);
720 if (cmd) {
721 cmd->data.draw.texture_address_mode = texture_address_mode;
722 result = renderer->QueueGeometry(renderer, cmd, texture,
723 xy, xy_stride,
724 color, color_stride, uv, uv_stride,
725 num_vertices, indices, num_indices, size_indices,
726 scale_x, scale_y);
727 if (!result) {
728 cmd->command = SDL_RENDERCMD_NO_OP;
729 }
730 }
731 return result;
732}
733
734static void UpdateMainViewDimensions(SDL_Renderer *renderer)
735{
736 int window_w = 0, window_h = 0;
737
738 if (renderer->window) {
739 SDL_GetWindowSize(renderer->window, &window_w, &window_h);
740 }
741
742 SDL_GetRenderOutputSize(renderer, &renderer->main_view.pixel_w, &renderer->main_view.pixel_h);
743
744 if (window_w > 0 && window_h > 0) {
745 renderer->dpi_scale.x = (float)renderer->main_view.pixel_w / window_w;
746 renderer->dpi_scale.y = (float)renderer->main_view.pixel_h / window_h;
747 } else {
748 renderer->dpi_scale.x = 1.0f;
749 renderer->dpi_scale.y = 1.0f;
750 }
751 UpdatePixelViewport(renderer, &renderer->main_view);
752}
753
754static void UpdateColorScale(SDL_Renderer *renderer)
755{
756 float SDR_white_point;
757 if (renderer->target) {
758 SDR_white_point = renderer->target->SDR_white_point;
759 } else {
760 SDR_white_point = renderer->SDR_white_point;
761 }
762 renderer->color_scale = renderer->desired_color_scale * SDR_white_point;
763}
764
765static void UpdateHDRProperties(SDL_Renderer *renderer)
766{
767 SDL_PropertiesID window_props;
768 SDL_PropertiesID renderer_props;
769
770 window_props = SDL_GetWindowProperties(renderer->window);
771 if (!window_props) {
772 return;
773 }
774
775 renderer_props = SDL_GetRendererProperties(renderer);
776 if (!renderer_props) {
777 return;
778 }
779
780 if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
781 renderer->SDR_white_point = SDL_GetFloatProperty(window_props, SDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT, 1.0f);
782 renderer->HDR_headroom = SDL_GetFloatProperty(window_props, SDL_PROP_WINDOW_HDR_HEADROOM_FLOAT, 1.0f);
783 } else {
784 renderer->SDR_white_point = 1.0f;
785 renderer->HDR_headroom = 1.0f;
786 }
787
788 if (renderer->HDR_headroom > 1.0f) {
789 SDL_SetBooleanProperty(renderer_props, SDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN, true);
790 } else {
791 SDL_SetBooleanProperty(renderer_props, SDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN, false);
792 }
793 SDL_SetFloatProperty(renderer_props, SDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT, renderer->SDR_white_point);
794 SDL_SetFloatProperty(renderer_props, SDL_PROP_RENDERER_HDR_HEADROOM_FLOAT, renderer->HDR_headroom);
795
796 UpdateColorScale(renderer);
797}
798
799static void UpdateLogicalPresentation(SDL_Renderer *renderer);
800
801
802int SDL_GetNumRenderDrivers(void)
803{
804#ifndef SDL_RENDER_DISABLED
805 return SDL_arraysize(render_drivers) - 1;
806#else
807 return 0;
808#endif
809}
810
811const char *SDL_GetRenderDriver(int index)
812{
813#ifndef SDL_RENDER_DISABLED
814 if (index < 0 || index >= SDL_GetNumRenderDrivers()) {
815 SDL_InvalidParamError("index");
816 return NULL;
817 }
818 return render_drivers[index]->name;
819#else
820 SDL_SetError("SDL not built with rendering support");
821 return NULL;
822#endif
823}
824
825static bool SDL_RendererEventWatch(void *userdata, SDL_Event *event)
826{
827 SDL_Renderer *renderer = (SDL_Renderer *)userdata;
828 SDL_Window *window = renderer->window;
829
830 if (renderer->WindowEvent) {
831 renderer->WindowEvent(renderer, &event->window);
832 }
833
834 if (event->type == SDL_EVENT_WINDOW_RESIZED ||
835 event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED ||
836 event->type == SDL_EVENT_WINDOW_METAL_VIEW_RESIZED) {
837 SDL_RenderViewState *view = renderer->view;
838 renderer->view = &renderer->main_view; // only update the main_view (the window framebuffer) for window changes.
839 UpdateLogicalPresentation(renderer);
840 renderer->view = view; // put us back on whatever the current render target's actual view is.
841 } else if (event->type == SDL_EVENT_WINDOW_HIDDEN) {
842 renderer->hidden = true;
843 } else if (event->type == SDL_EVENT_WINDOW_SHOWN) {
844 if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) {
845 renderer->hidden = false;
846 }
847 } else if (event->type == SDL_EVENT_WINDOW_MINIMIZED) {
848 renderer->hidden = true;
849 } else if (event->type == SDL_EVENT_WINDOW_RESTORED ||
850 event->type == SDL_EVENT_WINDOW_MAXIMIZED) {
851 if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) {
852 renderer->hidden = false;
853 }
854 } else if (event->type == SDL_EVENT_WINDOW_DISPLAY_CHANGED ||
855 event->type == SDL_EVENT_WINDOW_HDR_STATE_CHANGED) {
856 UpdateHDRProperties(renderer);
857 }
858 return true;
859}
860
861bool SDL_CreateWindowAndRenderer(const char *title, int width, int height, SDL_WindowFlags window_flags, SDL_Window **window, SDL_Renderer **renderer)
862{
863 bool hidden = (window_flags & SDL_WINDOW_HIDDEN) != 0;
864
865 if (!window) {
866 return SDL_InvalidParamError("window");
867 }
868
869 if (!renderer) {
870 return SDL_InvalidParamError("renderer");
871 }
872
873 // Hide the window so if the renderer recreates it, we don't get a visual flash on screen
874 window_flags |= SDL_WINDOW_HIDDEN;
875 *window = SDL_CreateWindow(title, width, height, window_flags);
876 if (!*window) {
877 *renderer = NULL;
878 return false;
879 }
880
881 *renderer = SDL_CreateRenderer(*window, NULL);
882 if (!*renderer) {
883 SDL_DestroyWindow(*window);
884 *window = NULL;
885 return false;
886 }
887
888 if (!hidden) {
889 SDL_ShowWindow(*window);
890 }
891
892 return true;
893}
894
895#ifndef SDL_RENDER_DISABLED
896static SDL_INLINE void VerifyDrawQueueFunctions(const SDL_Renderer *renderer)
897{
898 /* all of these functions are required to be implemented, even as no-ops, so we don't
899 have to check that they aren't NULL over and over. */
900 SDL_assert(renderer->QueueSetViewport != NULL);
901 SDL_assert(renderer->QueueSetDrawColor != NULL);
902 SDL_assert(renderer->QueueDrawPoints != NULL);
903 SDL_assert(renderer->QueueDrawLines != NULL || renderer->QueueGeometry != NULL);
904 SDL_assert(renderer->QueueFillRects != NULL || renderer->QueueGeometry != NULL);
905 SDL_assert(renderer->QueueCopy != NULL || renderer->QueueGeometry != NULL);
906 SDL_assert(renderer->RunCommandQueue != NULL);
907}
908
909static SDL_RenderLineMethod SDL_GetRenderLineMethod(void)
910{
911 const char *hint = SDL_GetHint(SDL_HINT_RENDER_LINE_METHOD);
912
913 int method = 0;
914 if (hint) {
915 method = SDL_atoi(hint);
916 }
917 switch (method) {
918 case 1:
919 return SDL_RENDERLINEMETHOD_POINTS;
920 case 2:
921 return SDL_RENDERLINEMETHOD_LINES;
922 case 3:
923 return SDL_RENDERLINEMETHOD_GEOMETRY;
924 default:
925 return SDL_RENDERLINEMETHOD_POINTS;
926 }
927}
928
929static void SDL_CalculateSimulatedVSyncInterval(SDL_Renderer *renderer, SDL_Window *window)
930{
931 SDL_DisplayID displayID = SDL_GetDisplayForWindow(window);
932 const SDL_DisplayMode *mode;
933 int refresh_num, refresh_den;
934
935 if (displayID == 0) {
936 displayID = SDL_GetPrimaryDisplay();
937 }
938 mode = SDL_GetDesktopDisplayMode(displayID);
939 if (mode && mode->refresh_rate_numerator > 0 && mode->refresh_rate_denominator > 0) {
940 refresh_num = mode->refresh_rate_numerator;
941 refresh_den = mode->refresh_rate_denominator;
942 } else {
943 // Pick a good default refresh rate
944 refresh_num = 60;
945 refresh_den = 1;
946 }
947 // Flip numerator and denominator to change from framerate to interval
948 renderer->simulate_vsync_interval_ns = (SDL_NS_PER_SECOND * refresh_den) / refresh_num;
949}
950
951#endif // !SDL_RENDER_DISABLED
952
953
954SDL_Renderer *SDL_CreateRendererWithProperties(SDL_PropertiesID props)
955{
956#ifndef SDL_RENDER_DISABLED
957 SDL_Window *window = (SDL_Window *)SDL_GetPointerProperty(props, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, NULL);
958 SDL_Surface *surface = (SDL_Surface *)SDL_GetPointerProperty(props, SDL_PROP_RENDERER_CREATE_SURFACE_POINTER, NULL);
959 const char *driver_name = SDL_GetStringProperty(props, SDL_PROP_RENDERER_CREATE_NAME_STRING, NULL);
960 const char *hint;
961 SDL_PropertiesID new_props;
962
963#ifdef SDL_PLATFORM_ANDROID
964 if (!Android_WaitActiveAndLockActivity()) {
965 return NULL;
966 }
967#endif
968
969 SDL_Renderer *renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(*renderer));
970 if (!renderer) {
971 goto error;
972 }
973
974 SDL_SetObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER, true);
975
976 if ((!window && !surface) || (window && surface)) {
977 SDL_InvalidParamError("window");
978 goto error;
979 }
980
981 if (window && SDL_WindowHasSurface(window)) {
982 SDL_SetError("Surface already associated with window");
983 goto error;
984 }
985
986 if (window && SDL_GetRenderer(window)) {
987 SDL_SetError("Renderer already associated with window");
988 goto error;
989 }
990
991 hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC);
992 if (hint && *hint) {
993 SDL_SetNumberProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, SDL_GetHintBoolean(SDL_HINT_RENDER_VSYNC, true));
994 }
995
996 if (surface) {
997#ifdef SDL_VIDEO_RENDER_SW
998 const bool rc = SW_CreateRendererForSurface(renderer, surface, props);
999#else
1000 const bool rc = SDL_SetError("SDL not built with software renderer");
1001#endif
1002 if (!rc) {
1003 goto error;
1004 }
1005 } else {
1006 bool rc = false;
1007 if (!driver_name) {
1008 driver_name = SDL_GetHint(SDL_HINT_RENDER_DRIVER);
1009 }
1010
1011 if (driver_name && *driver_name != 0) {
1012 const char *driver_attempt = driver_name;
1013 while (driver_attempt && *driver_attempt != 0 && !rc) {
1014 const char *driver_attempt_end = SDL_strchr(driver_attempt, ',');
1015 const size_t driver_attempt_len = (driver_attempt_end) ? (driver_attempt_end - driver_attempt) : SDL_strlen(driver_attempt);
1016
1017 for (int i = 0; render_drivers[i]; i++) {
1018 const SDL_RenderDriver *driver = render_drivers[i];
1019 if ((driver_attempt_len == SDL_strlen(driver->name)) && (SDL_strncasecmp(driver->name, driver_attempt, driver_attempt_len) == 0)) {
1020 rc = driver->CreateRenderer(renderer, window, props);
1021 if (rc) {
1022 break;
1023 }
1024 }
1025 }
1026
1027 driver_attempt = (driver_attempt_end) ? (driver_attempt_end + 1) : NULL;
1028 }
1029 } else {
1030 for (int i = 0; render_drivers[i]; i++) {
1031 const SDL_RenderDriver *driver = render_drivers[i];
1032 rc = driver->CreateRenderer(renderer, window, props);
1033 if (rc) {
1034 break;
1035 }
1036 SDL_DestroyRendererWithoutFreeing(renderer);
1037 SDL_zerop(renderer); // make sure we don't leave function pointers from a previous CreateRenderer() in this struct.
1038 }
1039 }
1040
1041 if (!rc) {
1042 if (driver_name) {
1043 SDL_SetError("%s not available", driver_name);
1044 } else {
1045 SDL_SetError("Couldn't find matching render driver");
1046 }
1047 goto error;
1048 }
1049 }
1050
1051 VerifyDrawQueueFunctions(renderer);
1052
1053 renderer->window = window;
1054 renderer->target_mutex = SDL_CreateMutex();
1055 if (surface) {
1056 renderer->main_view.pixel_w = surface->w;
1057 renderer->main_view.pixel_h = surface->h;
1058 }
1059 renderer->main_view.viewport.w = -1;
1060 renderer->main_view.viewport.h = -1;
1061 renderer->main_view.scale.x = 1.0f;
1062 renderer->main_view.scale.y = 1.0f;
1063 renderer->main_view.logical_scale.x = 1.0f;
1064 renderer->main_view.logical_scale.y = 1.0f;
1065 renderer->main_view.current_scale.x = 1.0f;
1066 renderer->main_view.current_scale.y = 1.0f;
1067 renderer->view = &renderer->main_view;
1068 renderer->dpi_scale.x = 1.0f;
1069 renderer->dpi_scale.y = 1.0f;
1070 UpdatePixelViewport(renderer, &renderer->main_view);
1071 UpdatePixelClipRect(renderer, &renderer->main_view);
1072 UpdateMainViewDimensions(renderer);
1073
1074 // new textures start at zero, so we start at 1 so first render doesn't flush by accident.
1075 renderer->render_command_generation = 1;
1076
1077 if (renderer->software) {
1078 // Software renderer always uses line method, for speed
1079 renderer->line_method = SDL_RENDERLINEMETHOD_LINES;
1080 } else {
1081 renderer->line_method = SDL_GetRenderLineMethod();
1082 }
1083
1084 renderer->SDR_white_point = 1.0f;
1085 renderer->HDR_headroom = 1.0f;
1086 renderer->desired_color_scale = 1.0f;
1087 renderer->color_scale = 1.0f;
1088
1089 if (window) {
1090 if (SDL_GetWindowFlags(window) & SDL_WINDOW_TRANSPARENT) {
1091 renderer->transparent_window = true;
1092 }
1093
1094 if (SDL_GetWindowFlags(window) & (SDL_WINDOW_HIDDEN | SDL_WINDOW_MINIMIZED)) {
1095 renderer->hidden = true;
1096 }
1097 }
1098
1099 new_props = SDL_GetRendererProperties(renderer);
1100 SDL_SetStringProperty(new_props, SDL_PROP_RENDERER_NAME_STRING, renderer->name);
1101 if (window) {
1102 SDL_SetPointerProperty(new_props, SDL_PROP_RENDERER_WINDOW_POINTER, window);
1103 }
1104 if (surface) {
1105 SDL_SetPointerProperty(new_props, SDL_PROP_RENDERER_SURFACE_POINTER, surface);
1106 }
1107 SDL_SetNumberProperty(new_props, SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER, renderer->output_colorspace);
1108 UpdateHDRProperties(renderer);
1109
1110 if (window) {
1111 SDL_SetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_RENDERER_POINTER, renderer);
1112 SDL_AddWindowRenderer(window, renderer);
1113 }
1114
1115 SDL_SetRenderViewport(renderer, NULL);
1116
1117 if (window) {
1118 SDL_AddWindowEventWatch(SDL_WINDOW_EVENT_WATCH_NORMAL, SDL_RendererEventWatch, renderer);
1119 }
1120
1121 int vsync = (int)SDL_GetNumberProperty(props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 0);
1122 if (!SDL_SetRenderVSync(renderer, vsync)) {
1123 if (vsync == 0) {
1124 // Some renderers require vsync enabled
1125 SDL_SetRenderVSync(renderer, 1);
1126 }
1127 }
1128 SDL_CalculateSimulatedVSyncInterval(renderer, window);
1129
1130 SDL_LogInfo(SDL_LOG_CATEGORY_RENDER,
1131 "Created renderer: %s", renderer->name);
1132
1133 renderer->next = SDL_renderers;
1134 SDL_renderers = renderer;
1135
1136#ifdef SDL_PLATFORM_ANDROID
1137 Android_UnlockActivityMutex();
1138#endif
1139
1140 SDL_ClearError();
1141
1142 return renderer;
1143
1144error:
1145#ifdef SDL_PLATFORM_ANDROID
1146 Android_UnlockActivityMutex();
1147#endif
1148
1149 if (renderer) {
1150 SDL_DestroyRenderer(renderer);
1151 }
1152 return NULL;
1153
1154#else
1155 SDL_SetError("SDL not built with rendering support");
1156 return NULL;
1157#endif
1158}
1159
1160SDL_Renderer *SDL_CreateRenderer(SDL_Window *window, const char *name)
1161{
1162 SDL_Renderer *renderer;
1163 SDL_PropertiesID props = SDL_CreateProperties();
1164 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_CREATE_WINDOW_POINTER, window);
1165 SDL_SetStringProperty(props, SDL_PROP_RENDERER_CREATE_NAME_STRING, name);
1166 renderer = SDL_CreateRendererWithProperties(props);
1167 SDL_DestroyProperties(props);
1168 return renderer;
1169}
1170
1171SDL_Renderer *SDL_CreateSoftwareRenderer(SDL_Surface *surface)
1172{
1173#ifdef SDL_VIDEO_RENDER_SW
1174 SDL_Renderer *renderer;
1175
1176 if (!surface) {
1177 SDL_InvalidParamError("surface");
1178 return NULL;
1179 }
1180
1181 SDL_PropertiesID props = SDL_CreateProperties();
1182 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_CREATE_SURFACE_POINTER, surface);
1183 renderer = SDL_CreateRendererWithProperties(props);
1184 SDL_DestroyProperties(props);
1185 return renderer;
1186#else
1187 SDL_SetError("SDL not built with rendering support");
1188 return NULL;
1189#endif // !SDL_RENDER_DISABLED
1190}
1191
1192SDL_Renderer *SDL_GetRenderer(SDL_Window *window)
1193{
1194 return (SDL_Renderer *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_RENDERER_POINTER, NULL);
1195}
1196
1197SDL_Window *SDL_GetRenderWindow(SDL_Renderer *renderer)
1198{
1199 CHECK_RENDERER_MAGIC(renderer, NULL);
1200 return renderer->window;
1201}
1202
1203const char *SDL_GetRendererName(SDL_Renderer *renderer)
1204{
1205 CHECK_RENDERER_MAGIC(renderer, NULL);
1206
1207 return SDL_GetPersistentString(renderer->name);
1208}
1209
1210SDL_PropertiesID SDL_GetRendererProperties(SDL_Renderer *renderer)
1211{
1212 CHECK_RENDERER_MAGIC(renderer, 0);
1213
1214 if (renderer->props == 0) {
1215 renderer->props = SDL_CreateProperties();
1216 }
1217 return renderer->props;
1218}
1219
1220bool SDL_GetRenderOutputSize(SDL_Renderer *renderer, int *w, int *h)
1221{
1222 if (w) {
1223 *w = 0;
1224 }
1225 if (h) {
1226 *h = 0;
1227 }
1228
1229 CHECK_RENDERER_MAGIC(renderer, false);
1230
1231 if (renderer->GetOutputSize) {
1232 return renderer->GetOutputSize(renderer, w, h);
1233 } else if (renderer->window) {
1234 return SDL_GetWindowSizeInPixels(renderer->window, w, h);
1235 } else {
1236 SDL_assert(!"This should never happen");
1237 return SDL_SetError("Renderer doesn't support querying output size");
1238 }
1239}
1240
1241bool SDL_GetCurrentRenderOutputSize(SDL_Renderer *renderer, int *w, int *h)
1242{
1243 if (w) {
1244 *w = 0;
1245 }
1246 if (h) {
1247 *h = 0;
1248 }
1249
1250 CHECK_RENDERER_MAGIC(renderer, false);
1251
1252 const SDL_RenderViewState *view = renderer->view;
1253 if (w) {
1254 *w = view->pixel_w;
1255 }
1256 if (h) {
1257 *h = view->pixel_h;
1258 }
1259 return true;
1260}
1261
1262static bool IsSupportedBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
1263{
1264 switch (blendMode) {
1265 // These are required to be supported by all renderers
1266 case SDL_BLENDMODE_NONE:
1267 case SDL_BLENDMODE_BLEND:
1268 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
1269 case SDL_BLENDMODE_ADD:
1270 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
1271 case SDL_BLENDMODE_MOD:
1272 case SDL_BLENDMODE_MUL:
1273 return true;
1274
1275 default:
1276 return renderer->SupportsBlendMode && renderer->SupportsBlendMode(renderer, blendMode);
1277 }
1278}
1279
1280static bool IsSupportedFormat(SDL_Renderer *renderer, SDL_PixelFormat format)
1281{
1282 int i;
1283
1284 for (i = 0; i < renderer->num_texture_formats; ++i) {
1285 if (renderer->texture_formats[i] == format) {
1286 return true;
1287 }
1288 }
1289 return false;
1290}
1291
1292static SDL_PixelFormat GetClosestSupportedFormat(SDL_Renderer *renderer, SDL_PixelFormat format)
1293{
1294 int i;
1295
1296 if (format == SDL_PIXELFORMAT_MJPG) {
1297 // We'll decode to SDL_PIXELFORMAT_NV12 or SDL_PIXELFORMAT_RGBA32
1298 for (i = 0; i < renderer->num_texture_formats; ++i) {
1299 if (renderer->texture_formats[i] == SDL_PIXELFORMAT_NV12) {
1300 return renderer->texture_formats[i];
1301 }
1302 }
1303 for (i = 0; i < renderer->num_texture_formats; ++i) {
1304 if (renderer->texture_formats[i] == SDL_PIXELFORMAT_RGBA32) {
1305 return renderer->texture_formats[i];
1306 }
1307 }
1308 } else if (SDL_ISPIXELFORMAT_FOURCC(format)) {
1309 // Look for an exact match
1310 for (i = 0; i < renderer->num_texture_formats; ++i) {
1311 if (renderer->texture_formats[i] == format) {
1312 return renderer->texture_formats[i];
1313 }
1314 }
1315 } else if (SDL_ISPIXELFORMAT_10BIT(format) || SDL_ISPIXELFORMAT_FLOAT(format)) {
1316 if (SDL_ISPIXELFORMAT_10BIT(format)) {
1317 for (i = 0; i < renderer->num_texture_formats; ++i) {
1318 if (SDL_ISPIXELFORMAT_10BIT(renderer->texture_formats[i])) {
1319 return renderer->texture_formats[i];
1320 }
1321 }
1322 }
1323 for (i = 0; i < renderer->num_texture_formats; ++i) {
1324 if (SDL_ISPIXELFORMAT_FLOAT(renderer->texture_formats[i])) {
1325 return renderer->texture_formats[i];
1326 }
1327 }
1328 } else {
1329 bool hasAlpha = SDL_ISPIXELFORMAT_ALPHA(format);
1330
1331 // We just want to match the first format that has the same channels
1332 for (i = 0; i < renderer->num_texture_formats; ++i) {
1333 if (!SDL_ISPIXELFORMAT_FOURCC(renderer->texture_formats[i]) &&
1334 SDL_ISPIXELFORMAT_ALPHA(renderer->texture_formats[i]) == hasAlpha) {
1335 return renderer->texture_formats[i];
1336 }
1337 }
1338 }
1339 return renderer->texture_formats[0];
1340}
1341
1342SDL_Texture *SDL_CreateTextureWithProperties(SDL_Renderer *renderer, SDL_PropertiesID props)
1343{
1344 SDL_Texture *texture;
1345 SDL_PixelFormat format = (SDL_PixelFormat)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER, SDL_PIXELFORMAT_UNKNOWN);
1346 SDL_TextureAccess access = (SDL_TextureAccess)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER, SDL_TEXTUREACCESS_STATIC);
1347 int w = (int)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER, 0);
1348 int h = (int)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER, 0);
1349 SDL_Colorspace default_colorspace;
1350 bool texture_is_fourcc_and_target;
1351
1352 CHECK_RENDERER_MAGIC(renderer, NULL);
1353
1354 if (!format) {
1355 format = renderer->texture_formats[0];
1356 }
1357 if (SDL_BYTESPERPIXEL(format) == 0) {
1358 SDL_SetError("Invalid texture format");
1359 return NULL;
1360 }
1361 if (SDL_ISPIXELFORMAT_INDEXED(format)) {
1362 if (!IsSupportedFormat(renderer, format)) {
1363 SDL_SetError("Palettized textures are not supported");
1364 return NULL;
1365 }
1366 }
1367 if (w <= 0 || h <= 0) {
1368 SDL_SetError("Texture dimensions can't be 0");
1369 return NULL;
1370 }
1371 int max_texture_size = (int)SDL_GetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 0);
1372 if (max_texture_size && (w > max_texture_size || h > max_texture_size)) {
1373 SDL_SetError("Texture dimensions are limited to %dx%d", max_texture_size, max_texture_size);
1374 return NULL;
1375 }
1376
1377 default_colorspace = SDL_GetDefaultColorspaceForFormat(format);
1378
1379 texture = (SDL_Texture *)SDL_calloc(1, sizeof(*texture));
1380 if (!texture) {
1381 return NULL;
1382 }
1383 texture->refcount = 1;
1384 SDL_SetObjectValid(texture, SDL_OBJECT_TYPE_TEXTURE, true);
1385 texture->colorspace = (SDL_Colorspace)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER, default_colorspace);
1386 texture->format = format;
1387 texture->access = access;
1388 texture->w = w;
1389 texture->h = h;
1390 texture->color.r = 1.0f;
1391 texture->color.g = 1.0f;
1392 texture->color.b = 1.0f;
1393 texture->color.a = 1.0f;
1394 texture->blendMode = SDL_ISPIXELFORMAT_ALPHA(format) ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE;
1395 texture->scaleMode = SDL_SCALEMODE_LINEAR;
1396 texture->view.pixel_w = w;
1397 texture->view.pixel_h = h;
1398 texture->view.viewport.w = -1;
1399 texture->view.viewport.h = -1;
1400 texture->view.scale.x = 1.0f;
1401 texture->view.scale.y = 1.0f;
1402 texture->view.logical_scale.x = 1.0f;
1403 texture->view.logical_scale.y = 1.0f;
1404 texture->view.current_scale.x = 1.0f;
1405 texture->view.current_scale.y = 1.0f;
1406 texture->renderer = renderer;
1407 texture->next = renderer->textures;
1408 if (renderer->textures) {
1409 renderer->textures->prev = texture;
1410 }
1411 renderer->textures = texture;
1412
1413 UpdatePixelViewport(renderer, &texture->view);
1414 UpdatePixelClipRect(renderer, &texture->view);
1415
1416 texture->SDR_white_point = SDL_GetFloatProperty(props, SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT, SDL_GetDefaultSDRWhitePoint(texture->colorspace));
1417 texture->HDR_headroom = SDL_GetFloatProperty(props, SDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT, SDL_GetDefaultHDRHeadroom(texture->colorspace));
1418
1419 // FOURCC format cannot be used directly by renderer back-ends for target texture
1420 texture_is_fourcc_and_target = (access == SDL_TEXTUREACCESS_TARGET && SDL_ISPIXELFORMAT_FOURCC(format));
1421
1422 if (!texture_is_fourcc_and_target && IsSupportedFormat(renderer, format)) {
1423 if (!renderer->CreateTexture(renderer, texture, props)) {
1424 SDL_DestroyTexture(texture);
1425 return NULL;
1426 }
1427 } else {
1428 SDL_PixelFormat closest_format;
1429 SDL_PropertiesID native_props = SDL_CreateProperties();
1430
1431 if (!texture_is_fourcc_and_target) {
1432 closest_format = GetClosestSupportedFormat(renderer, format);
1433 } else {
1434 closest_format = renderer->texture_formats[0];
1435 }
1436
1437 if (format == SDL_PIXELFORMAT_MJPG && closest_format == SDL_PIXELFORMAT_NV12) {
1438 SDL_SetNumberProperty(native_props, SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER, SDL_COLORSPACE_JPEG);
1439 } else {
1440 default_colorspace = SDL_GetDefaultColorspaceForFormat(closest_format);
1441 if (SDL_COLORSPACETYPE(texture->colorspace) == SDL_COLORSPACETYPE(default_colorspace)) {
1442 SDL_SetNumberProperty(native_props, SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER, texture->colorspace);
1443 } else {
1444 SDL_SetNumberProperty(native_props, SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER, default_colorspace);
1445 }
1446 }
1447 SDL_SetNumberProperty(native_props, SDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER, closest_format);
1448 SDL_SetNumberProperty(native_props, SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER, texture->access);
1449 SDL_SetNumberProperty(native_props, SDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER, texture->w);
1450 SDL_SetNumberProperty(native_props, SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER, texture->h);
1451
1452 texture->native = SDL_CreateTextureWithProperties(renderer, native_props);
1453 SDL_DestroyProperties(native_props);
1454 if (!texture->native) {
1455 SDL_DestroyTexture(texture);
1456 return NULL;
1457 }
1458
1459 SDL_SetPointerProperty(SDL_GetTextureProperties(texture->native), SDL_PROP_TEXTURE_PARENT_POINTER, texture);
1460
1461 // Swap textures to have texture before texture->native in the list
1462 texture->native->next = texture->next;
1463 if (texture->native->next) {
1464 texture->native->next->prev = texture->native;
1465 }
1466 texture->prev = texture->native->prev;
1467 if (texture->prev) {
1468 texture->prev->next = texture;
1469 }
1470 texture->native->prev = texture;
1471 texture->next = texture->native;
1472 renderer->textures = texture;
1473
1474 if (texture->format == SDL_PIXELFORMAT_MJPG) {
1475 // We have a custom decode + upload path for this
1476 } else if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
1477#ifdef SDL_HAVE_YUV
1478 texture->yuv = SDL_SW_CreateYUVTexture(texture->format, texture->colorspace, w, h);
1479#else
1480 SDL_SetError("SDL not built with YUV support");
1481#endif
1482 if (!texture->yuv) {
1483 SDL_DestroyTexture(texture);
1484 return NULL;
1485 }
1486 } else if (access == SDL_TEXTUREACCESS_STREAMING) {
1487 // The pitch is 4 byte aligned
1488 texture->pitch = (((w * SDL_BYTESPERPIXEL(format)) + 3) & ~3);
1489 texture->pixels = SDL_calloc(1, (size_t)texture->pitch * h);
1490 if (!texture->pixels) {
1491 SDL_DestroyTexture(texture);
1492 return NULL;
1493 }
1494 }
1495 }
1496
1497 // Now set the properties for the new texture
1498 props = SDL_GetTextureProperties(texture);
1499 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_COLORSPACE_NUMBER, texture->colorspace);
1500 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_FORMAT_NUMBER, texture->format);
1501 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_ACCESS_NUMBER, texture->access);
1502 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_WIDTH_NUMBER, texture->w);
1503 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_HEIGHT_NUMBER, texture->h);
1504 SDL_SetFloatProperty(props, SDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT, texture->SDR_white_point);
1505 if (texture->HDR_headroom > 0.0f) {
1506 SDL_SetFloatProperty(props, SDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT, texture->HDR_headroom);
1507 }
1508 return texture;
1509}
1510
1511SDL_Texture *SDL_CreateTexture(SDL_Renderer *renderer, SDL_PixelFormat format, SDL_TextureAccess access, int w, int h)
1512{
1513 SDL_Texture *texture;
1514 SDL_PropertiesID props = SDL_CreateProperties();
1515 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER, format);
1516 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER, access);
1517 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER, w);
1518 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER, h);
1519 texture = SDL_CreateTextureWithProperties(renderer, props);
1520 SDL_DestroyProperties(props);
1521 return texture;
1522}
1523
1524static bool SDL_UpdateTextureFromSurface(SDL_Texture *texture, SDL_Rect *rect, SDL_Surface *surface)
1525{
1526 SDL_TextureAccess access;
1527 bool direct_update;
1528 SDL_PixelFormat tex_format;
1529 SDL_PropertiesID surface_props;
1530 SDL_PropertiesID tex_props;
1531 SDL_Colorspace surface_colorspace = SDL_COLORSPACE_UNKNOWN;
1532 SDL_Colorspace texture_colorspace = SDL_COLORSPACE_UNKNOWN;
1533
1534 if (texture == NULL || surface == NULL) {
1535 return false;
1536 }
1537
1538 tex_props = SDL_GetTextureProperties(texture);
1539 if (!tex_props) {
1540 return false;
1541 }
1542
1543 surface_props = SDL_GetSurfaceProperties(surface);
1544 if (!surface_props) {
1545 return false;
1546 }
1547
1548 tex_format = (SDL_PixelFormat)SDL_GetNumberProperty(tex_props, SDL_PROP_TEXTURE_FORMAT_NUMBER, 0);
1549 access = (SDL_TextureAccess)SDL_GetNumberProperty(tex_props, SDL_PROP_TEXTURE_ACCESS_NUMBER, 0);
1550
1551 if (access != SDL_TEXTUREACCESS_STATIC && access != SDL_TEXTUREACCESS_STREAMING) {
1552 return false;
1553 }
1554
1555 surface_colorspace = SDL_GetSurfaceColorspace(surface);
1556 texture_colorspace = surface_colorspace;
1557
1558 if (surface_colorspace == SDL_COLORSPACE_SRGB_LINEAR ||
1559 SDL_COLORSPACETRANSFER(surface_colorspace) == SDL_TRANSFER_CHARACTERISTICS_PQ) {
1560 if (SDL_ISPIXELFORMAT_FLOAT(tex_format)) {
1561 texture_colorspace = SDL_COLORSPACE_SRGB_LINEAR;
1562 } else if (SDL_ISPIXELFORMAT_10BIT(tex_format)) {
1563 texture_colorspace = SDL_COLORSPACE_HDR10;
1564 } else {
1565 texture_colorspace = SDL_COLORSPACE_SRGB;
1566 }
1567 }
1568
1569 if (tex_format == surface->format && texture_colorspace == surface_colorspace) {
1570 if (SDL_ISPIXELFORMAT_ALPHA(surface->format) && SDL_SurfaceHasColorKey(surface)) {
1571 /* Surface and Renderer formats are identical.
1572 * Intermediate conversion is needed to convert color key to alpha (SDL_ConvertColorkeyToAlpha()). */
1573 direct_update = false;
1574 } else {
1575 // Update Texture directly
1576 direct_update = true;
1577 }
1578 } else {
1579 // Surface and Renderer formats are different, it needs an intermediate conversion.
1580 direct_update = false;
1581 }
1582
1583 if (direct_update) {
1584 if (SDL_MUSTLOCK(surface)) {
1585 SDL_LockSurface(surface);
1586 SDL_UpdateTexture(texture, rect, surface->pixels, surface->pitch);
1587 SDL_UnlockSurface(surface);
1588 } else {
1589 SDL_UpdateTexture(texture, rect, surface->pixels, surface->pitch);
1590 }
1591 } else {
1592 SDL_Surface *temp = NULL;
1593
1594 // Set up a destination surface for the texture update
1595 temp = SDL_ConvertSurfaceAndColorspace(surface, tex_format, NULL, texture_colorspace, surface_props);
1596 if (temp) {
1597 SDL_UpdateTexture(texture, NULL, temp->pixels, temp->pitch);
1598 SDL_DestroySurface(temp);
1599 } else {
1600 return false;
1601 }
1602 }
1603
1604 {
1605 Uint8 r, g, b, a;
1606 SDL_BlendMode blendMode;
1607
1608 SDL_GetSurfaceColorMod(surface, &r, &g, &b);
1609 SDL_SetTextureColorMod(texture, r, g, b);
1610
1611 SDL_GetSurfaceAlphaMod(surface, &a);
1612 SDL_SetTextureAlphaMod(texture, a);
1613
1614 if (SDL_SurfaceHasColorKey(surface)) {
1615 // We converted to a texture with alpha format
1616 SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
1617 } else {
1618 SDL_GetSurfaceBlendMode(surface, &blendMode);
1619 SDL_SetTextureBlendMode(texture, blendMode);
1620 }
1621 }
1622
1623 return true;
1624}
1625
1626SDL_Texture *SDL_CreateTextureFromSurface(SDL_Renderer *renderer, SDL_Surface *surface)
1627{
1628 bool needAlpha;
1629 int i;
1630 SDL_PixelFormat format = SDL_PIXELFORMAT_UNKNOWN;
1631 SDL_Palette *palette;
1632 SDL_Texture *texture;
1633 SDL_PropertiesID props;
1634 SDL_Colorspace surface_colorspace = SDL_COLORSPACE_UNKNOWN;
1635 SDL_Colorspace texture_colorspace = SDL_COLORSPACE_UNKNOWN;
1636
1637 CHECK_RENDERER_MAGIC(renderer, NULL);
1638
1639 if (!SDL_SurfaceValid(surface)) {
1640 SDL_InvalidParamError("SDL_CreateTextureFromSurface(): surface");
1641 return NULL;
1642 }
1643
1644 // See what the best texture format is
1645 if (SDL_ISPIXELFORMAT_ALPHA(surface->format) || SDL_SurfaceHasColorKey(surface)) {
1646 needAlpha = true;
1647 } else {
1648 needAlpha = false;
1649 }
1650
1651 // If Palette contains alpha values, promotes to alpha format
1652 palette = SDL_GetSurfacePalette(surface);
1653 if (palette) {
1654 bool is_opaque, has_alpha_channel;
1655 SDL_DetectPalette(palette, &is_opaque, &has_alpha_channel);
1656 if (!is_opaque) {
1657 needAlpha = true;
1658 }
1659 }
1660
1661 surface_colorspace = SDL_GetSurfaceColorspace(surface);
1662
1663 // Try to have the best pixel format for the texture
1664 // No alpha, but a colorkey => promote to alpha
1665 if (!SDL_ISPIXELFORMAT_ALPHA(surface->format) && SDL_SurfaceHasColorKey(surface)) {
1666 if (surface->format == SDL_PIXELFORMAT_XRGB8888) {
1667 for (i = 0; i < renderer->num_texture_formats; ++i) {
1668 if (renderer->texture_formats[i] == SDL_PIXELFORMAT_ARGB8888) {
1669 format = SDL_PIXELFORMAT_ARGB8888;
1670 break;
1671 }
1672 }
1673 } else if (surface->format == SDL_PIXELFORMAT_XBGR8888) {
1674 for (i = 0; i < renderer->num_texture_formats; ++i) {
1675 if (renderer->texture_formats[i] == SDL_PIXELFORMAT_ABGR8888) {
1676 format = SDL_PIXELFORMAT_ABGR8888;
1677 break;
1678 }
1679 }
1680 }
1681 } else {
1682 // Exact match would be fine
1683 for (i = 0; i < renderer->num_texture_formats; ++i) {
1684 if (renderer->texture_formats[i] == surface->format) {
1685 format = surface->format;
1686 break;
1687 }
1688 }
1689 }
1690
1691 // Look for 10-bit pixel formats if needed
1692 if (format == SDL_PIXELFORMAT_UNKNOWN && SDL_ISPIXELFORMAT_10BIT(surface->format)) {
1693 for (i = 0; i < renderer->num_texture_formats; ++i) {
1694 if (SDL_ISPIXELFORMAT_10BIT(renderer->texture_formats[i])) {
1695 format = renderer->texture_formats[i];
1696 break;
1697 }
1698 }
1699 }
1700
1701 // Look for floating point pixel formats if needed
1702 if (format == SDL_PIXELFORMAT_UNKNOWN &&
1703 (SDL_ISPIXELFORMAT_10BIT(surface->format) || SDL_ISPIXELFORMAT_FLOAT(surface->format))) {
1704 for (i = 0; i < renderer->num_texture_formats; ++i) {
1705 if (SDL_ISPIXELFORMAT_FLOAT(renderer->texture_formats[i])) {
1706 format = renderer->texture_formats[i];
1707 break;
1708 }
1709 }
1710 }
1711
1712 // Fallback, choose a valid pixel format
1713 if (format == SDL_PIXELFORMAT_UNKNOWN) {
1714 format = renderer->texture_formats[0];
1715 for (i = 0; i < renderer->num_texture_formats; ++i) {
1716 if (!SDL_ISPIXELFORMAT_FOURCC(renderer->texture_formats[i]) &&
1717 SDL_ISPIXELFORMAT_ALPHA(renderer->texture_formats[i]) == needAlpha) {
1718 format = renderer->texture_formats[i];
1719 break;
1720 }
1721 }
1722 }
1723
1724 if (surface_colorspace == SDL_COLORSPACE_SRGB_LINEAR ||
1725 SDL_COLORSPACETRANSFER(surface_colorspace) == SDL_TRANSFER_CHARACTERISTICS_PQ) {
1726 if (SDL_ISPIXELFORMAT_FLOAT(format)) {
1727 texture_colorspace = SDL_COLORSPACE_SRGB_LINEAR;
1728 } else if (SDL_ISPIXELFORMAT_10BIT(format)) {
1729 texture_colorspace = SDL_COLORSPACE_HDR10;
1730 } else {
1731 texture_colorspace = SDL_COLORSPACE_SRGB;
1732 }
1733 }
1734
1735 props = SDL_CreateProperties();
1736 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER, texture_colorspace);
1737 if (surface_colorspace == texture_colorspace) {
1738 SDL_SetFloatProperty(props, SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT,
1739 SDL_GetSurfaceSDRWhitePoint(surface, surface_colorspace));
1740 }
1741 SDL_SetFloatProperty(props, SDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT,
1742 SDL_GetSurfaceHDRHeadroom(surface, surface_colorspace));
1743 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER, format);
1744 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER, SDL_TEXTUREACCESS_STATIC);
1745 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER, surface->w);
1746 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER, surface->h);
1747 texture = SDL_CreateTextureWithProperties(renderer, props);
1748 SDL_DestroyProperties(props);
1749 if (!texture) {
1750 return NULL;
1751 }
1752
1753 if (!SDL_UpdateTextureFromSurface(texture, NULL, surface)) {
1754 SDL_DestroyTexture(texture);
1755 return NULL;
1756 }
1757
1758 return texture;
1759}
1760
1761SDL_Renderer *SDL_GetRendererFromTexture(SDL_Texture *texture)
1762{
1763 CHECK_TEXTURE_MAGIC(texture, NULL);
1764
1765 return texture->renderer;
1766}
1767
1768SDL_PropertiesID SDL_GetTextureProperties(SDL_Texture *texture)
1769{
1770 CHECK_TEXTURE_MAGIC(texture, 0);
1771
1772 if (texture->props == 0) {
1773 texture->props = SDL_CreateProperties();
1774 }
1775 return texture->props;
1776}
1777
1778bool SDL_GetTextureSize(SDL_Texture *texture, float *w, float *h)
1779{
1780 if (w) {
1781 *w = 0;
1782 }
1783 if (h) {
1784 *h = 0;
1785 }
1786
1787 CHECK_TEXTURE_MAGIC(texture, false);
1788
1789 if (w) {
1790 *w = (float)texture->w;
1791 }
1792 if (h) {
1793 *h = (float)texture->h;
1794 }
1795 return true;
1796}
1797
1798bool SDL_SetTextureColorMod(SDL_Texture *texture, Uint8 r, Uint8 g, Uint8 b)
1799{
1800 const float fR = (float)r / 255.0f;
1801 const float fG = (float)g / 255.0f;
1802 const float fB = (float)b / 255.0f;
1803
1804 return SDL_SetTextureColorModFloat(texture, fR, fG, fB);
1805}
1806
1807bool SDL_SetTextureColorModFloat(SDL_Texture *texture, float r, float g, float b)
1808{
1809 CHECK_TEXTURE_MAGIC(texture, false);
1810
1811 texture->color.r = r;
1812 texture->color.g = g;
1813 texture->color.b = b;
1814 if (texture->native) {
1815 return SDL_SetTextureColorModFloat(texture->native, r, g, b);
1816 }
1817 return true;
1818}
1819
1820bool SDL_GetTextureColorMod(SDL_Texture *texture, Uint8 *r, Uint8 *g, Uint8 *b)
1821{
1822 float fR = 1.0f, fG = 1.0f, fB = 1.0f;
1823
1824 if (!SDL_GetTextureColorModFloat(texture, &fR, &fG, &fB)) {
1825 if (r) {
1826 *r = 255;
1827 }
1828 if (g) {
1829 *g = 255;
1830 }
1831 if (b) {
1832 *b = 255;
1833 }
1834 return false;
1835 }
1836
1837 if (r) {
1838 *r = (Uint8)SDL_roundf(SDL_clamp(fR, 0.0f, 1.0f) * 255.0f);
1839 }
1840 if (g) {
1841 *g = (Uint8)SDL_roundf(SDL_clamp(fG, 0.0f, 1.0f) * 255.0f);
1842 }
1843 if (b) {
1844 *b = (Uint8)SDL_roundf(SDL_clamp(fB, 0.0f, 1.0f) * 255.0f);
1845 }
1846 return true;
1847}
1848
1849bool SDL_GetTextureColorModFloat(SDL_Texture *texture, float *r, float *g, float *b)
1850{
1851 SDL_FColor color;
1852
1853 if (r) {
1854 *r = 1.0f;
1855 }
1856 if (g) {
1857 *g = 1.0f;
1858 }
1859 if (b) {
1860 *b = 1.0f;
1861 }
1862
1863 CHECK_TEXTURE_MAGIC(texture, false);
1864
1865 color = texture->color;
1866
1867 if (r) {
1868 *r = color.r;
1869 }
1870 if (g) {
1871 *g = color.g;
1872 }
1873 if (b) {
1874 *b = color.b;
1875 }
1876 return true;
1877}
1878
1879bool SDL_SetTextureAlphaMod(SDL_Texture *texture, Uint8 alpha)
1880{
1881 const float fA = (float)alpha / 255.0f;
1882
1883 return SDL_SetTextureAlphaModFloat(texture, fA);
1884}
1885
1886bool SDL_SetTextureAlphaModFloat(SDL_Texture *texture, float alpha)
1887{
1888 CHECK_TEXTURE_MAGIC(texture, false);
1889
1890 texture->color.a = alpha;
1891 if (texture->native) {
1892 return SDL_SetTextureAlphaModFloat(texture->native, alpha);
1893 }
1894 return true;
1895}
1896
1897bool SDL_GetTextureAlphaMod(SDL_Texture *texture, Uint8 *alpha)
1898{
1899 float fA = 1.0f;
1900
1901 if (!SDL_GetTextureAlphaModFloat(texture, &fA)) {
1902 if (alpha) {
1903 *alpha = 255;
1904 }
1905 return false;
1906 }
1907
1908 if (alpha) {
1909 *alpha = (Uint8)SDL_roundf(SDL_clamp(fA, 0.0f, 1.0f) * 255.0f);
1910 }
1911 return true;
1912}
1913
1914bool SDL_GetTextureAlphaModFloat(SDL_Texture *texture, float *alpha)
1915{
1916 if (alpha) {
1917 *alpha = 1.0f;
1918 }
1919
1920 CHECK_TEXTURE_MAGIC(texture, false);
1921
1922 if (alpha) {
1923 *alpha = texture->color.a;
1924 }
1925 return true;
1926}
1927
1928bool SDL_SetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode blendMode)
1929{
1930 SDL_Renderer *renderer;
1931
1932 CHECK_TEXTURE_MAGIC(texture, false);
1933
1934 if (blendMode == SDL_BLENDMODE_INVALID) {
1935 return SDL_InvalidParamError("blendMode");
1936 }
1937
1938 renderer = texture->renderer;
1939 if (!IsSupportedBlendMode(renderer, blendMode)) {
1940 return SDL_Unsupported();
1941 }
1942 texture->blendMode = blendMode;
1943 if (texture->native) {
1944 return SDL_SetTextureBlendMode(texture->native, blendMode);
1945 }
1946 return true;
1947}
1948
1949bool SDL_GetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode *blendMode)
1950{
1951 if (blendMode) {
1952 *blendMode = SDL_BLENDMODE_INVALID;
1953 }
1954
1955 CHECK_TEXTURE_MAGIC(texture, false);
1956
1957 if (blendMode) {
1958 *blendMode = texture->blendMode;
1959 }
1960 return true;
1961}
1962
1963bool SDL_SetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode scaleMode)
1964{
1965 SDL_Renderer *renderer;
1966
1967 CHECK_TEXTURE_MAGIC(texture, false);
1968
1969 if (scaleMode != SDL_SCALEMODE_NEAREST &&
1970 scaleMode != SDL_SCALEMODE_LINEAR) {
1971 return SDL_InvalidParamError("scaleMode");
1972 }
1973
1974 renderer = texture->renderer;
1975 texture->scaleMode = scaleMode;
1976 if (texture->native) {
1977 return SDL_SetTextureScaleMode(texture->native, scaleMode);
1978 } else {
1979 renderer->SetTextureScaleMode(renderer, texture, scaleMode);
1980 }
1981 return true;
1982}
1983
1984bool SDL_GetTextureScaleMode(SDL_Texture *texture, SDL_ScaleMode *scaleMode)
1985{
1986 if (scaleMode) {
1987 *scaleMode = SDL_SCALEMODE_LINEAR;
1988 }
1989
1990 CHECK_TEXTURE_MAGIC(texture, false);
1991
1992 if (scaleMode) {
1993 *scaleMode = texture->scaleMode;
1994 }
1995 return true;
1996}
1997
1998#ifdef SDL_HAVE_YUV
1999static bool SDL_UpdateTextureYUV(SDL_Texture *texture, const SDL_Rect *rect,
2000 const void *pixels, int pitch)
2001{
2002 SDL_Texture *native = texture->native;
2003 SDL_Rect full_rect;
2004
2005 if (!SDL_SW_UpdateYUVTexture(texture->yuv, rect, pixels, pitch)) {
2006 return false;
2007 }
2008
2009 full_rect.x = 0;
2010 full_rect.y = 0;
2011 full_rect.w = texture->w;
2012 full_rect.h = texture->h;
2013 rect = &full_rect;
2014
2015 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
2016 // We can lock the texture and copy to it
2017 void *native_pixels = NULL;
2018 int native_pitch = 0;
2019
2020 if (!SDL_LockTexture(native, rect, &native_pixels, &native_pitch)) {
2021 return false;
2022 }
2023 SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
2024 rect->w, rect->h, native_pixels, native_pitch);
2025 SDL_UnlockTexture(native);
2026 } else {
2027 // Use a temporary buffer for updating
2028 const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
2029 const size_t alloclen = (size_t)rect->h * temp_pitch;
2030 if (alloclen > 0) {
2031 void *temp_pixels = SDL_malloc(alloclen);
2032 if (!temp_pixels) {
2033 return false;
2034 }
2035 SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
2036 rect->w, rect->h, temp_pixels, temp_pitch);
2037 SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
2038 SDL_free(temp_pixels);
2039 }
2040 }
2041 return true;
2042}
2043#endif // SDL_HAVE_YUV
2044
2045static bool SDL_UpdateTextureNative(SDL_Texture *texture, const SDL_Rect *rect,
2046 const void *pixels, int pitch)
2047{
2048 SDL_Texture *native = texture->native;
2049
2050 if (!rect->w || !rect->h) {
2051 return true; // nothing to do.
2052 }
2053
2054 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
2055 // We can lock the texture and copy to it
2056 void *native_pixels = NULL;
2057 int native_pitch = 0;
2058
2059 if (!SDL_LockTexture(native, rect, &native_pixels, &native_pitch)) {
2060 return false;
2061 }
2062 SDL_ConvertPixelsAndColorspace(rect->w, rect->h,
2063 texture->format, texture->colorspace, 0, pixels, pitch,
2064 native->format, native->colorspace, 0, native_pixels, native_pitch);
2065 SDL_UnlockTexture(native);
2066 } else {
2067 // Use a temporary buffer for updating
2068 const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
2069 const size_t alloclen = (size_t)rect->h * temp_pitch;
2070 if (alloclen > 0) {
2071 void *temp_pixels = SDL_malloc(alloclen);
2072 if (!temp_pixels) {
2073 return false;
2074 }
2075 SDL_ConvertPixelsAndColorspace(rect->w, rect->h,
2076 texture->format, texture->colorspace, 0, pixels, pitch,
2077 native->format, native->colorspace, 0, temp_pixels, temp_pitch);
2078 SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
2079 SDL_free(temp_pixels);
2080 }
2081 }
2082 return true;
2083}
2084
2085bool SDL_UpdateTexture(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
2086{
2087 SDL_Rect real_rect;
2088
2089 CHECK_TEXTURE_MAGIC(texture, false);
2090
2091 if (!pixels) {
2092 return SDL_InvalidParamError("pixels");
2093 }
2094 if (!pitch) {
2095 return SDL_InvalidParamError("pitch");
2096 }
2097
2098 real_rect.x = 0;
2099 real_rect.y = 0;
2100 real_rect.w = texture->w;
2101 real_rect.h = texture->h;
2102 if (rect) {
2103 if (!SDL_GetRectIntersection(rect, &real_rect, &real_rect)) {
2104 return true;
2105 }
2106 }
2107
2108 if (real_rect.w == 0 || real_rect.h == 0) {
2109 return true; // nothing to do.
2110#ifdef SDL_HAVE_YUV
2111 } else if (texture->yuv) {
2112 return SDL_UpdateTextureYUV(texture, &real_rect, pixels, pitch);
2113#endif
2114 } else if (texture->native) {
2115 return SDL_UpdateTextureNative(texture, &real_rect, pixels, pitch);
2116 } else {
2117 SDL_Renderer *renderer = texture->renderer;
2118 if (!FlushRenderCommandsIfTextureNeeded(texture)) {
2119 return false;
2120 }
2121 return renderer->UpdateTexture(renderer, texture, &real_rect, pixels, pitch);
2122 }
2123}
2124
2125#ifdef SDL_HAVE_YUV
2126static bool SDL_UpdateTextureYUVPlanar(SDL_Texture *texture, const SDL_Rect *rect,
2127 const Uint8 *Yplane, int Ypitch,
2128 const Uint8 *Uplane, int Upitch,
2129 const Uint8 *Vplane, int Vpitch)
2130{
2131 SDL_Texture *native = texture->native;
2132 SDL_Rect full_rect;
2133
2134 if (!SDL_SW_UpdateYUVTexturePlanar(texture->yuv, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch)) {
2135 return false;
2136 }
2137
2138 full_rect.x = 0;
2139 full_rect.y = 0;
2140 full_rect.w = texture->w;
2141 full_rect.h = texture->h;
2142 rect = &full_rect;
2143
2144 if (!rect->w || !rect->h) {
2145 return true; // nothing to do.
2146 }
2147
2148 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
2149 // We can lock the texture and copy to it
2150 void *native_pixels = NULL;
2151 int native_pitch = 0;
2152
2153 if (!SDL_LockTexture(native, rect, &native_pixels, &native_pitch)) {
2154 return false;
2155 }
2156 SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
2157 rect->w, rect->h, native_pixels, native_pitch);
2158 SDL_UnlockTexture(native);
2159 } else {
2160 // Use a temporary buffer for updating
2161 const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
2162 const size_t alloclen = (size_t)rect->h * temp_pitch;
2163 if (alloclen > 0) {
2164 void *temp_pixels = SDL_malloc(alloclen);
2165 if (!temp_pixels) {
2166 return false;
2167 }
2168 SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
2169 rect->w, rect->h, temp_pixels, temp_pitch);
2170 SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
2171 SDL_free(temp_pixels);
2172 }
2173 }
2174 return true;
2175}
2176
2177static bool SDL_UpdateTextureNVPlanar(SDL_Texture *texture, const SDL_Rect *rect,
2178 const Uint8 *Yplane, int Ypitch,
2179 const Uint8 *UVplane, int UVpitch)
2180{
2181 SDL_Texture *native = texture->native;
2182 SDL_Rect full_rect;
2183
2184 if (!SDL_SW_UpdateNVTexturePlanar(texture->yuv, rect, Yplane, Ypitch, UVplane, UVpitch)) {
2185 return false;
2186 }
2187
2188 full_rect.x = 0;
2189 full_rect.y = 0;
2190 full_rect.w = texture->w;
2191 full_rect.h = texture->h;
2192 rect = &full_rect;
2193
2194 if (!rect->w || !rect->h) {
2195 return true; // nothing to do.
2196 }
2197
2198 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
2199 // We can lock the texture and copy to it
2200 void *native_pixels = NULL;
2201 int native_pitch = 0;
2202
2203 if (!SDL_LockTexture(native, rect, &native_pixels, &native_pitch)) {
2204 return false;
2205 }
2206 SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
2207 rect->w, rect->h, native_pixels, native_pitch);
2208 SDL_UnlockTexture(native);
2209 } else {
2210 // Use a temporary buffer for updating
2211 const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
2212 const size_t alloclen = (size_t)rect->h * temp_pitch;
2213 if (alloclen > 0) {
2214 void *temp_pixels = SDL_malloc(alloclen);
2215 if (!temp_pixels) {
2216 return false;
2217 }
2218 SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
2219 rect->w, rect->h, temp_pixels, temp_pitch);
2220 SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
2221 SDL_free(temp_pixels);
2222 }
2223 }
2224 return true;
2225}
2226
2227#endif // SDL_HAVE_YUV
2228
2229bool SDL_UpdateYUVTexture(SDL_Texture *texture, const SDL_Rect *rect,
2230 const Uint8 *Yplane, int Ypitch,
2231 const Uint8 *Uplane, int Upitch,
2232 const Uint8 *Vplane, int Vpitch)
2233{
2234#ifdef SDL_HAVE_YUV
2235 SDL_Renderer *renderer;
2236 SDL_Rect real_rect;
2237
2238 CHECK_TEXTURE_MAGIC(texture, false);
2239
2240 if (!Yplane) {
2241 return SDL_InvalidParamError("Yplane");
2242 }
2243 if (!Ypitch) {
2244 return SDL_InvalidParamError("Ypitch");
2245 }
2246 if (!Uplane) {
2247 return SDL_InvalidParamError("Uplane");
2248 }
2249 if (!Upitch) {
2250 return SDL_InvalidParamError("Upitch");
2251 }
2252 if (!Vplane) {
2253 return SDL_InvalidParamError("Vplane");
2254 }
2255 if (!Vpitch) {
2256 return SDL_InvalidParamError("Vpitch");
2257 }
2258
2259 if (texture->format != SDL_PIXELFORMAT_YV12 &&
2260 texture->format != SDL_PIXELFORMAT_IYUV) {
2261 return SDL_SetError("Texture format must by YV12 or IYUV");
2262 }
2263
2264 real_rect.x = 0;
2265 real_rect.y = 0;
2266 real_rect.w = texture->w;
2267 real_rect.h = texture->h;
2268 if (rect) {
2269 SDL_GetRectIntersection(rect, &real_rect, &real_rect);
2270 }
2271
2272 if (real_rect.w == 0 || real_rect.h == 0) {
2273 return true; // nothing to do.
2274 }
2275
2276 if (texture->yuv) {
2277 return SDL_UpdateTextureYUVPlanar(texture, &real_rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
2278 } else {
2279 SDL_assert(!texture->native);
2280 renderer = texture->renderer;
2281 SDL_assert(renderer->UpdateTextureYUV);
2282 if (renderer->UpdateTextureYUV) {
2283 if (!FlushRenderCommandsIfTextureNeeded(texture)) {
2284 return false;
2285 }
2286 return renderer->UpdateTextureYUV(renderer, texture, &real_rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
2287 } else {
2288 return SDL_Unsupported();
2289 }
2290 }
2291#else
2292 return false;
2293#endif
2294}
2295
2296bool SDL_UpdateNVTexture(SDL_Texture *texture, const SDL_Rect *rect,
2297 const Uint8 *Yplane, int Ypitch,
2298 const Uint8 *UVplane, int UVpitch)
2299{
2300#ifdef SDL_HAVE_YUV
2301 SDL_Renderer *renderer;
2302 SDL_Rect real_rect;
2303
2304 CHECK_TEXTURE_MAGIC(texture, false);
2305
2306 if (!Yplane) {
2307 return SDL_InvalidParamError("Yplane");
2308 }
2309 if (!Ypitch) {
2310 return SDL_InvalidParamError("Ypitch");
2311 }
2312 if (!UVplane) {
2313 return SDL_InvalidParamError("UVplane");
2314 }
2315 if (!UVpitch) {
2316 return SDL_InvalidParamError("UVpitch");
2317 }
2318
2319 if (texture->format != SDL_PIXELFORMAT_NV12 &&
2320 texture->format != SDL_PIXELFORMAT_NV21) {
2321 return SDL_SetError("Texture format must by NV12 or NV21");
2322 }
2323
2324 real_rect.x = 0;
2325 real_rect.y = 0;
2326 real_rect.w = texture->w;
2327 real_rect.h = texture->h;
2328 if (rect) {
2329 SDL_GetRectIntersection(rect, &real_rect, &real_rect);
2330 }
2331
2332 if (real_rect.w == 0 || real_rect.h == 0) {
2333 return true; // nothing to do.
2334 }
2335
2336 if (texture->yuv) {
2337 return SDL_UpdateTextureNVPlanar(texture, &real_rect, Yplane, Ypitch, UVplane, UVpitch);
2338 } else {
2339 SDL_assert(!texture->native);
2340 renderer = texture->renderer;
2341 SDL_assert(renderer->UpdateTextureNV);
2342 if (renderer->UpdateTextureNV) {
2343 if (!FlushRenderCommandsIfTextureNeeded(texture)) {
2344 return false;
2345 }
2346 return renderer->UpdateTextureNV(renderer, texture, &real_rect, Yplane, Ypitch, UVplane, UVpitch);
2347 } else {
2348 return SDL_Unsupported();
2349 }
2350 }
2351#else
2352 return false;
2353#endif
2354}
2355
2356#ifdef SDL_HAVE_YUV
2357static bool SDL_LockTextureYUV(SDL_Texture *texture, const SDL_Rect *rect,
2358 void **pixels, int *pitch)
2359{
2360 return SDL_SW_LockYUVTexture(texture->yuv, rect, pixels, pitch);
2361}
2362#endif // SDL_HAVE_YUV
2363
2364static bool SDL_LockTextureNative(SDL_Texture *texture, const SDL_Rect *rect,
2365 void **pixels, int *pitch)
2366{
2367 texture->locked_rect = *rect;
2368 *pixels = (void *)((Uint8 *)texture->pixels +
2369 rect->y * texture->pitch +
2370 rect->x * SDL_BYTESPERPIXEL(texture->format));
2371 *pitch = texture->pitch;
2372 return true;
2373}
2374
2375bool SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
2376{
2377 SDL_Rect full_rect;
2378
2379 CHECK_TEXTURE_MAGIC(texture, false);
2380
2381 if (texture->access != SDL_TEXTUREACCESS_STREAMING) {
2382 return SDL_SetError("SDL_LockTexture(): texture must be streaming");
2383 }
2384
2385 if (!rect) {
2386 full_rect.x = 0;
2387 full_rect.y = 0;
2388 full_rect.w = texture->w;
2389 full_rect.h = texture->h;
2390 rect = &full_rect;
2391 }
2392
2393#ifdef SDL_HAVE_YUV
2394 if (texture->yuv) {
2395 if (!FlushRenderCommandsIfTextureNeeded(texture)) {
2396 return false;
2397 }
2398 return SDL_LockTextureYUV(texture, rect, pixels, pitch);
2399 } else
2400#endif
2401 if (texture->native) {
2402 // Calls a real SDL_LockTexture/SDL_UnlockTexture on unlock, flushing then.
2403 return SDL_LockTextureNative(texture, rect, pixels, pitch);
2404 } else {
2405 SDL_Renderer *renderer = texture->renderer;
2406 if (!FlushRenderCommandsIfTextureNeeded(texture)) {
2407 return false;
2408 }
2409 return renderer->LockTexture(renderer, texture, rect, pixels, pitch);
2410 }
2411}
2412
2413bool SDL_LockTextureToSurface(SDL_Texture *texture, const SDL_Rect *rect, SDL_Surface **surface)
2414{
2415 SDL_Rect real_rect;
2416 void *pixels = NULL;
2417 int pitch = 0; // fix static analysis
2418
2419 if (!texture || !surface) {
2420 return false;
2421 }
2422
2423 real_rect.x = 0;
2424 real_rect.y = 0;
2425 real_rect.w = texture->w;
2426 real_rect.h = texture->h;
2427 if (rect) {
2428 SDL_GetRectIntersection(rect, &real_rect, &real_rect);
2429 }
2430
2431 if (!SDL_LockTexture(texture, &real_rect, &pixels, &pitch)) {
2432 return false;
2433 }
2434
2435 texture->locked_surface = SDL_CreateSurfaceFrom(real_rect.w, real_rect.h, texture->format, pixels, pitch);
2436 if (!texture->locked_surface) {
2437 SDL_UnlockTexture(texture);
2438 return false;
2439 }
2440
2441 *surface = texture->locked_surface;
2442 return true;
2443}
2444
2445#ifdef SDL_HAVE_YUV
2446static void SDL_UnlockTextureYUV(SDL_Texture *texture)
2447{
2448 SDL_Texture *native = texture->native;
2449 void *native_pixels = NULL;
2450 int native_pitch = 0;
2451 SDL_Rect rect;
2452
2453 rect.x = 0;
2454 rect.y = 0;
2455 rect.w = texture->w;
2456 rect.h = texture->h;
2457
2458 if (!SDL_LockTexture(native, &rect, &native_pixels, &native_pitch)) {
2459 return;
2460 }
2461 SDL_SW_CopyYUVToRGB(texture->yuv, &rect, native->format,
2462 rect.w, rect.h, native_pixels, native_pitch);
2463 SDL_UnlockTexture(native);
2464}
2465#endif // SDL_HAVE_YUV
2466
2467static void SDL_UnlockTextureNative(SDL_Texture *texture)
2468{
2469 SDL_Texture *native = texture->native;
2470 void *native_pixels = NULL;
2471 int native_pitch = 0;
2472 const SDL_Rect *rect = &texture->locked_rect;
2473 const void *pixels = (void *)((Uint8 *)texture->pixels +
2474 rect->y * texture->pitch +
2475 rect->x * SDL_BYTESPERPIXEL(texture->format));
2476 int pitch = texture->pitch;
2477
2478 if (!SDL_LockTexture(native, rect, &native_pixels, &native_pitch)) {
2479 return;
2480 }
2481 SDL_ConvertPixels(rect->w, rect->h,
2482 texture->format, pixels, pitch,
2483 native->format, native_pixels, native_pitch);
2484 SDL_UnlockTexture(native);
2485}
2486
2487void SDL_UnlockTexture(SDL_Texture *texture)
2488{
2489 CHECK_TEXTURE_MAGIC(texture,);
2490
2491 if (texture->access != SDL_TEXTUREACCESS_STREAMING) {
2492 return;
2493 }
2494#ifdef SDL_HAVE_YUV
2495 if (texture->yuv) {
2496 SDL_UnlockTextureYUV(texture);
2497 } else
2498#endif
2499 if (texture->native) {
2500 SDL_UnlockTextureNative(texture);
2501 } else {
2502 SDL_Renderer *renderer = texture->renderer;
2503 renderer->UnlockTexture(renderer, texture);
2504 }
2505
2506 SDL_DestroySurface(texture->locked_surface);
2507 texture->locked_surface = NULL;
2508}
2509
2510bool SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
2511{
2512 // texture == NULL is valid and means reset the target to the window
2513 if (texture) {
2514 CHECK_TEXTURE_MAGIC(texture, false);
2515 if (renderer != texture->renderer) {
2516 return SDL_SetError("Texture was not created with this renderer");
2517 }
2518 if (texture->access != SDL_TEXTUREACCESS_TARGET) {
2519 return SDL_SetError("Texture not created with SDL_TEXTUREACCESS_TARGET");
2520 }
2521 if (texture->native) {
2522 // Always render to the native texture
2523 texture = texture->native;
2524 }
2525 }
2526
2527 if (texture == renderer->target) {
2528 // Nothing to do!
2529 return true;
2530 }
2531
2532 FlushRenderCommands(renderer); // time to send everything to the GPU!
2533
2534 SDL_LockMutex(renderer->target_mutex);
2535
2536 renderer->target = texture;
2537 if (texture) {
2538 renderer->view = &texture->view;
2539 } else {
2540 renderer->view = &renderer->main_view;
2541 }
2542 UpdateColorScale(renderer);
2543
2544 if (!renderer->SetRenderTarget(renderer, texture)) {
2545 SDL_UnlockMutex(renderer->target_mutex);
2546 return false;
2547 }
2548
2549 SDL_UnlockMutex(renderer->target_mutex);
2550
2551 if (!QueueCmdSetViewport(renderer)) {
2552 return false;
2553 }
2554 if (!QueueCmdSetClipRect(renderer)) {
2555 return false;
2556 }
2557
2558 // All set!
2559 return true;
2560}
2561
2562SDL_Texture *SDL_GetRenderTarget(SDL_Renderer *renderer)
2563{
2564 CHECK_RENDERER_MAGIC(renderer, NULL);
2565 if (!renderer->target) {
2566 return NULL;
2567 }
2568 return (SDL_Texture *) SDL_GetPointerProperty(SDL_GetTextureProperties(renderer->target), SDL_PROP_TEXTURE_PARENT_POINTER, renderer->target);
2569}
2570
2571static void UpdateLogicalPresentation(SDL_Renderer *renderer)
2572{
2573 SDL_RenderViewState *view = renderer->view;
2574 const bool is_main_view = (view == &renderer->main_view);
2575 const float logical_w = view->logical_w;
2576 const float logical_h = view->logical_h;
2577 int iwidth, iheight;
2578
2579 if (renderer->target) {
2580 iwidth = (int)renderer->target->w;
2581 iheight = (int)renderer->target->h;
2582 } else {
2583 SDL_GetRenderOutputSize(renderer, &iwidth, &iheight);
2584 }
2585
2586 view->logical_src_rect.x = 0.0f;
2587 view->logical_src_rect.y = 0.0f;
2588 view->logical_src_rect.w = logical_w;
2589 view->logical_src_rect.h = logical_h;
2590
2591 if (view->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_DISABLED) {
2592 view->logical_dst_rect.x = 0.0f;
2593 view->logical_dst_rect.y = 0.0f;
2594 view->logical_dst_rect.w = iwidth;
2595 view->logical_dst_rect.h = iheight;
2596 view->logical_offset.x = view->logical_offset.y = 0.0f;
2597 view->logical_scale.x = view->logical_scale.y = 1.0f;
2598 view->current_scale.x = view->scale.x; // skip the multiplications against 1.0f.
2599 view->current_scale.y = view->scale.y;
2600 } else {
2601 const float output_w = (float)iwidth;
2602 const float output_h = (float)iheight;
2603 const float want_aspect = logical_w / logical_h;
2604 const float real_aspect = output_w / output_h;
2605
2606 if ((logical_w <= 0.0f) || (logical_h <= 0.0f)) {
2607 view->logical_dst_rect.x = 0.0f;
2608 view->logical_dst_rect.y = 0.0f;
2609 view->logical_dst_rect.w = output_w;
2610 view->logical_dst_rect.h = output_h;
2611 } else if (view->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_INTEGER_SCALE) {
2612 float scale;
2613 if (want_aspect > real_aspect) {
2614 scale = (float)((int)output_w / (int)logical_w); // This an integer division!
2615 } else {
2616 scale = (float)((int)output_h / (int)logical_h); // This an integer division!
2617 }
2618
2619 if (scale < 1.0f) {
2620 scale = 1.0f;
2621 }
2622
2623 view->logical_dst_rect.w = SDL_floorf(logical_w * scale);
2624 view->logical_dst_rect.x = (output_w - view->logical_dst_rect.w) / 2.0f;
2625 view->logical_dst_rect.h = SDL_floorf(logical_h * scale);
2626 view->logical_dst_rect.y = (output_h - view->logical_dst_rect.h) / 2.0f;
2627
2628 } else if (view->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_STRETCH || SDL_fabsf(want_aspect - real_aspect) < 0.0001f) {
2629 view->logical_dst_rect.x = 0.0f;
2630 view->logical_dst_rect.y = 0.0f;
2631 view->logical_dst_rect.w = output_w;
2632 view->logical_dst_rect.h = output_h;
2633
2634 } else if (want_aspect > real_aspect) {
2635 if (view->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_LETTERBOX) {
2636 // We want a wider aspect ratio than is available - letterbox it
2637 const float scale = output_w / logical_w;
2638 view->logical_dst_rect.x = 0.0f;
2639 view->logical_dst_rect.w = output_w;
2640 view->logical_dst_rect.h = SDL_floorf(logical_h * scale);
2641 view->logical_dst_rect.y = (output_h - view->logical_dst_rect.h) / 2.0f;
2642 } else { // view->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_OVERSCAN
2643 /* We want a wider aspect ratio than is available -
2644 zoom so logical height matches the real height
2645 and the width will grow off the screen
2646 */
2647 const float scale = output_h / logical_h;
2648 view->logical_dst_rect.y = 0.0f;
2649 view->logical_dst_rect.h = output_h;
2650 view->logical_dst_rect.w = SDL_floorf(logical_w * scale);
2651 view->logical_dst_rect.x = (output_w - view->logical_dst_rect.w) / 2.0f;
2652 }
2653 } else {
2654 if (view->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_LETTERBOX) {
2655 // We want a narrower aspect ratio than is available - use side-bars
2656 const float scale = output_h / logical_h;
2657 view->logical_dst_rect.y = 0.0f;
2658 view->logical_dst_rect.h = output_h;
2659 view->logical_dst_rect.w = SDL_floorf(logical_w * scale);
2660 view->logical_dst_rect.x = (output_w - view->logical_dst_rect.w) / 2.0f;
2661 } else { // view->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_OVERSCAN
2662 /* We want a narrower aspect ratio than is available -
2663 zoom so logical width matches the real width
2664 and the height will grow off the screen
2665 */
2666 const float scale = output_w / logical_w;
2667 view->logical_dst_rect.x = 0.0f;
2668 view->logical_dst_rect.w = output_w;
2669 view->logical_dst_rect.h = SDL_floorf(logical_h * scale);
2670 view->logical_dst_rect.y = (output_h - view->logical_dst_rect.h) / 2.0f;
2671 }
2672 }
2673
2674 view->logical_scale.x = (logical_w > 0.0f) ? view->logical_dst_rect.w / logical_w : 0.0f;
2675 view->logical_scale.y = (logical_h > 0.0f) ? view->logical_dst_rect.h / logical_h : 0.0f;
2676 view->current_scale.x = view->scale.x * view->logical_scale.x;
2677 view->current_scale.y = view->scale.y * view->logical_scale.y;
2678 view->logical_offset.x = view->logical_dst_rect.x;
2679 view->logical_offset.y = view->logical_dst_rect.y;
2680 }
2681
2682 if (is_main_view) {
2683 // This makes sure the dpi_scale is right. It also sets pixel_w and pixel_h, but we're going to change them directly below here.
2684 UpdateMainViewDimensions(renderer);
2685 }
2686
2687 view->pixel_w = (int) view->logical_dst_rect.w;
2688 view->pixel_h = (int) view->logical_dst_rect.h;
2689 UpdatePixelViewport(renderer, view);
2690 UpdatePixelClipRect(renderer, view);
2691}
2692
2693bool SDL_SetRenderLogicalPresentation(SDL_Renderer *renderer, int w, int h, SDL_RendererLogicalPresentation mode)
2694{
2695 CHECK_RENDERER_MAGIC(renderer, false);
2696
2697 SDL_RenderViewState *view = renderer->view;
2698 view->logical_presentation_mode = mode;
2699 view->logical_w = w;
2700 view->logical_h = h;
2701
2702 UpdateLogicalPresentation(renderer);
2703
2704 return true;
2705}
2706
2707bool SDL_GetRenderLogicalPresentation(SDL_Renderer *renderer, int *w, int *h, SDL_RendererLogicalPresentation *mode)
2708{
2709 #define SETVAL(ptr, val) if (ptr) { *ptr = val; }
2710
2711 SETVAL(w, 0);
2712 SETVAL(h, 0);
2713 SETVAL(mode, SDL_LOGICAL_PRESENTATION_DISABLED);
2714
2715 CHECK_RENDERER_MAGIC(renderer, false);
2716
2717 const SDL_RenderViewState *view = renderer->view;
2718 SETVAL(w, view->logical_w);
2719 SETVAL(h, view->logical_h);
2720 SETVAL(mode, view->logical_presentation_mode);
2721
2722 #undef SETVAL
2723
2724 return true;
2725}
2726
2727bool SDL_GetRenderLogicalPresentationRect(SDL_Renderer *renderer, SDL_FRect *rect)
2728{
2729 if (rect) {
2730 SDL_zerop(rect);
2731 }
2732
2733 CHECK_RENDERER_MAGIC(renderer, false);
2734
2735 if (rect) {
2736 SDL_copyp(rect, &renderer->view->logical_dst_rect);
2737 }
2738 return true;
2739}
2740
2741static void SDL_RenderLogicalBorders(SDL_Renderer *renderer, const SDL_FRect *dst)
2742{
2743 const SDL_RenderViewState *view = renderer->view;
2744
2745 if (dst->x > 0.0f || dst->y > 0.0f) {
2746 SDL_BlendMode saved_blend_mode = renderer->blendMode;
2747 SDL_FColor saved_color = renderer->color;
2748
2749 SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE);
2750 SDL_SetRenderDrawColorFloat(renderer, 0.0f, 0.0f, 0.0f, 1.0f);
2751
2752 if (dst->x > 0.0f) {
2753 SDL_FRect rect;
2754
2755 rect.x = 0.0f;
2756 rect.y = 0.0f;
2757 rect.w = dst->x;
2758 rect.h = (float)view->pixel_h;
2759 SDL_RenderFillRect(renderer, &rect);
2760
2761 rect.x = dst->x + dst->w;
2762 rect.w = (float)view->pixel_w - rect.x;
2763 SDL_RenderFillRect(renderer, &rect);
2764 }
2765
2766 if (dst->y > 0.0f) {
2767 SDL_FRect rect;
2768
2769 rect.x = 0.0f;
2770 rect.y = 0.0f;
2771 rect.w = (float)view->pixel_w;
2772 rect.h = dst->y;
2773 SDL_RenderFillRect(renderer, &rect);
2774
2775 rect.y = dst->y + dst->h;
2776 rect.h = (float)view->pixel_h - rect.y;
2777 SDL_RenderFillRect(renderer, &rect);
2778 }
2779
2780 SDL_SetRenderDrawBlendMode(renderer, saved_blend_mode);
2781 SDL_SetRenderDrawColorFloat(renderer, saved_color.r, saved_color.g, saved_color.b, saved_color.a);
2782 }
2783}
2784
2785static void SDL_RenderLogicalPresentation(SDL_Renderer *renderer)
2786{
2787 SDL_assert(renderer->view == &renderer->main_view);
2788
2789 SDL_RenderViewState *view = &renderer->main_view;
2790 const SDL_RendererLogicalPresentation mode = view->logical_presentation_mode;
2791 if (mode == SDL_LOGICAL_PRESENTATION_LETTERBOX) {
2792 // save off some state we're going to trample.
2793 const int logical_w = view->logical_w;
2794 const int logical_h = view->logical_h;
2795 const float scale_x = view->scale.x;
2796 const float scale_y = view->scale.y;
2797 const bool clipping_enabled = view->clipping_enabled;
2798 SDL_Rect orig_viewport, orig_cliprect;
2799 const SDL_FRect logical_dst_rect = view->logical_dst_rect;
2800
2801 SDL_copyp(&orig_viewport, &view->viewport);
2802 if (clipping_enabled) {
2803 SDL_copyp(&orig_cliprect, &view->clip_rect);
2804 }
2805
2806 // trample some state.
2807 SDL_SetRenderLogicalPresentation(renderer, logical_w, logical_h, SDL_LOGICAL_PRESENTATION_DISABLED);
2808 SDL_SetRenderViewport(renderer, NULL);
2809 if (clipping_enabled) {
2810 SDL_SetRenderClipRect(renderer, NULL);
2811 }
2812 SDL_SetRenderScale(renderer, 1.0f, 1.0f);
2813
2814 // draw the borders.
2815 SDL_RenderLogicalBorders(renderer, &logical_dst_rect);
2816
2817 // now set everything back.
2818 view->logical_presentation_mode = mode;
2819 SDL_SetRenderViewport(renderer, &orig_viewport);
2820 if (clipping_enabled) {
2821 SDL_SetRenderClipRect(renderer, &orig_cliprect);
2822 }
2823 SDL_SetRenderScale(renderer, scale_x, scale_y);
2824
2825 SDL_SetRenderLogicalPresentation(renderer, logical_w, logical_h, mode);
2826 }
2827}
2828
2829static bool SDL_RenderVectorFromWindow(SDL_Renderer *renderer, float window_dx, float window_dy, float *dx, float *dy)
2830{
2831 // Convert from window coordinates to pixels within the window
2832 window_dx *= renderer->dpi_scale.x;
2833 window_dy *= renderer->dpi_scale.y;
2834
2835 // Convert from pixels within the window to pixels within the view
2836 const SDL_RenderViewState *view = &renderer->main_view;
2837 if (view->logical_presentation_mode != SDL_LOGICAL_PRESENTATION_DISABLED) {
2838 const SDL_FRect *src = &view->logical_src_rect;
2839 const SDL_FRect *dst = &view->logical_dst_rect;
2840 window_dx = (window_dx * src->w) / dst->w;
2841 window_dy = (window_dy * src->h) / dst->h;
2842 }
2843
2844 window_dx /= view->scale.x;
2845 window_dy /= view->scale.y;
2846
2847 *dx = window_dx;
2848 *dy = window_dy;
2849 return true;
2850}
2851
2852bool SDL_RenderCoordinatesFromWindow(SDL_Renderer *renderer, float window_x, float window_y, float *x, float *y)
2853{
2854 float render_x, render_y;
2855
2856 CHECK_RENDERER_MAGIC(renderer, false);
2857
2858 // Convert from window coordinates to pixels within the window
2859 render_x = window_x * renderer->dpi_scale.x;
2860 render_y = window_y * renderer->dpi_scale.y;
2861
2862 // Convert from pixels within the window to pixels within the view
2863 const SDL_RenderViewState *view = &renderer->main_view;
2864 if (view->logical_presentation_mode != SDL_LOGICAL_PRESENTATION_DISABLED) {
2865 const SDL_FRect *src = &view->logical_src_rect;
2866 const SDL_FRect *dst = &view->logical_dst_rect;
2867 render_x = ((render_x - dst->x) * src->w) / dst->w;
2868 render_y = ((render_y - dst->y) * src->h) / dst->h;
2869 }
2870
2871 render_x = (render_x / view->scale.x) - view->viewport.x;
2872 render_y = (render_y / view->scale.y) - view->viewport.y;
2873
2874 if (x) {
2875 *x = render_x;
2876 }
2877 if (y) {
2878 *y = render_y;
2879 }
2880 return true;
2881}
2882
2883bool SDL_RenderCoordinatesToWindow(SDL_Renderer *renderer, float x, float y, float *window_x, float *window_y)
2884{
2885 CHECK_RENDERER_MAGIC(renderer, false);
2886
2887 const SDL_RenderViewState *view = &renderer->main_view;
2888 x = (view->viewport.x + x) * view->scale.x;
2889 y = (view->viewport.y + y) * view->scale.y;
2890
2891 // Convert from render coordinates to pixels within the window
2892 if (view->logical_presentation_mode != SDL_LOGICAL_PRESENTATION_DISABLED) {
2893 const SDL_FRect *src = &view->logical_src_rect;
2894 const SDL_FRect *dst = &view->logical_dst_rect;
2895 x = dst->x + ((x * dst->w) / src->w);
2896 y = dst->y + ((y * dst->h) / src->h);
2897 }
2898
2899 // Convert from pixels within the window to window coordinates
2900 x /= renderer->dpi_scale.x;
2901 y /= renderer->dpi_scale.y;
2902
2903 if (window_x) {
2904 *window_x = x;
2905 }
2906 if (window_y) {
2907 *window_y = y;
2908 }
2909 return true;
2910}
2911
2912bool SDL_ConvertEventToRenderCoordinates(SDL_Renderer *renderer, SDL_Event *event)
2913{
2914 CHECK_RENDERER_MAGIC(renderer, false);
2915
2916 if (event->type == SDL_EVENT_MOUSE_MOTION) {
2917 SDL_Window *window = SDL_GetWindowFromID(event->motion.windowID);
2918 if (window == renderer->window) {
2919 SDL_RenderCoordinatesFromWindow(renderer, event->motion.x, event->motion.y, &event->motion.x, &event->motion.y);
2920 SDL_RenderVectorFromWindow(renderer, event->motion.xrel, event->motion.yrel, &event->motion.xrel, &event->motion.yrel);
2921 }
2922 } else if (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN ||
2923 event->type == SDL_EVENT_MOUSE_BUTTON_UP) {
2924 SDL_Window *window = SDL_GetWindowFromID(event->button.windowID);
2925 if (window == renderer->window) {
2926 SDL_RenderCoordinatesFromWindow(renderer, event->button.x, event->button.y, &event->button.x, &event->button.y);
2927 }
2928 } else if (event->type == SDL_EVENT_MOUSE_WHEEL) {
2929 SDL_Window *window = SDL_GetWindowFromID(event->wheel.windowID);
2930 if (window == renderer->window) {
2931 SDL_RenderCoordinatesFromWindow(renderer, event->wheel.mouse_x,
2932 event->wheel.mouse_y,
2933 &event->wheel.mouse_x,
2934 &event->wheel.mouse_y);
2935 }
2936 } else if (event->type == SDL_EVENT_FINGER_DOWN ||
2937 event->type == SDL_EVENT_FINGER_UP ||
2938 event->type == SDL_EVENT_FINGER_CANCELED ||
2939 event->type == SDL_EVENT_FINGER_MOTION) {
2940 // FIXME: Are these events guaranteed to be window relative?
2941 if (renderer->window) {
2942 int w, h;
2943 if (!SDL_GetWindowSize(renderer->window, &w, &h)) {
2944 return false;
2945 }
2946 SDL_RenderCoordinatesFromWindow(renderer, event->tfinger.x * w, event->tfinger.y * h, &event->tfinger.x, &event->tfinger.y);
2947 SDL_RenderVectorFromWindow(renderer, event->tfinger.dx * w, event->tfinger.dy * h, &event->tfinger.dx, &event->tfinger.dy);
2948 }
2949 } else if (event->type == SDL_EVENT_PEN_MOTION) {
2950 SDL_Window *window = SDL_GetWindowFromID(event->pmotion.windowID);
2951 if (window == renderer->window) {
2952 SDL_RenderCoordinatesFromWindow(renderer, event->pmotion.x, event->pmotion.y, &event->pmotion.x, &event->pmotion.y);
2953 }
2954 } else if ((event->type == SDL_EVENT_PEN_DOWN) || (event->type == SDL_EVENT_PEN_UP)) {
2955 SDL_Window *window = SDL_GetWindowFromID(event->ptouch.windowID);
2956 if (window == renderer->window) {
2957 SDL_RenderCoordinatesFromWindow(renderer, event->ptouch.x, event->ptouch.y, &event->ptouch.x, &event->ptouch.y);
2958 }
2959 } else if ((event->type == SDL_EVENT_PEN_BUTTON_DOWN) || (event->type == SDL_EVENT_PEN_BUTTON_UP)) {
2960 SDL_Window *window = SDL_GetWindowFromID(event->pbutton.windowID);
2961 if (window == renderer->window) {
2962 SDL_RenderCoordinatesFromWindow(renderer, event->pbutton.x, event->pbutton.y, &event->pbutton.x, &event->pbutton.y);
2963 }
2964 } else if (event->type == SDL_EVENT_PEN_AXIS) {
2965 SDL_Window *window = SDL_GetWindowFromID(event->paxis.windowID);
2966 if (window == renderer->window) {
2967 SDL_RenderCoordinatesFromWindow(renderer, event->paxis.x, event->paxis.y, &event->paxis.x, &event->paxis.y);
2968 }
2969 } else if (event->type == SDL_EVENT_DROP_POSITION ||
2970 event->type == SDL_EVENT_DROP_FILE ||
2971 event->type == SDL_EVENT_DROP_TEXT ||
2972 event->type == SDL_EVENT_DROP_COMPLETE) {
2973 SDL_Window *window = SDL_GetWindowFromID(event->drop.windowID);
2974 if (window == renderer->window) {
2975 SDL_RenderCoordinatesFromWindow(renderer, event->drop.x, event->drop.y, &event->drop.x, &event->drop.y);
2976 }
2977 }
2978 return true;
2979}
2980
2981bool SDL_SetRenderViewport(SDL_Renderer *renderer, const SDL_Rect *rect)
2982{
2983 CHECK_RENDERER_MAGIC(renderer, false);
2984
2985 SDL_RenderViewState *view = renderer->view;
2986 if (rect) {
2987 if ((rect->w < 0) || (rect->h < 0)) {
2988 return SDL_SetError("rect has a negative size");
2989 }
2990 SDL_copyp(&view->viewport, rect);
2991 } else {
2992 view->viewport.x = view->viewport.y = 0;
2993 view->viewport.w = view->viewport.h = -1;
2994 }
2995 UpdatePixelViewport(renderer, view);
2996
2997 return QueueCmdSetViewport(renderer);
2998}
2999
3000bool SDL_GetRenderViewport(SDL_Renderer *renderer, SDL_Rect *rect)
3001{
3002 if (rect) {
3003 SDL_zerop(rect);
3004 }
3005
3006 CHECK_RENDERER_MAGIC(renderer, false);
3007
3008 if (rect) {
3009 const SDL_RenderViewState *view = renderer->view;
3010 rect->x = view->viewport.x;
3011 rect->y = view->viewport.y;
3012 if (view->viewport.w >= 0) {
3013 rect->w = view->viewport.w;
3014 } else {
3015 rect->w = (int)SDL_ceilf(view->pixel_w / view->current_scale.x);
3016 }
3017 if (view->viewport.h >= 0) {
3018 rect->h = view->viewport.h;
3019 } else {
3020 rect->h = (int)SDL_ceilf(view->pixel_h / view->current_scale.y);
3021 }
3022 }
3023 return true;
3024}
3025
3026bool SDL_RenderViewportSet(SDL_Renderer *renderer)
3027{
3028 CHECK_RENDERER_MAGIC(renderer, false);
3029
3030 const SDL_RenderViewState *view = renderer->view;
3031 return (view->viewport.w >= 0 && view->viewport.h >= 0);
3032}
3033
3034static void GetRenderViewportSize(SDL_Renderer *renderer, SDL_FRect *rect)
3035{
3036 const SDL_RenderViewState *view = renderer->view;
3037 const float scale_x = view->current_scale.x;
3038 const float scale_y = view->current_scale.y;
3039
3040 rect->x = 0.0f;
3041 rect->y = 0.0f;
3042
3043 if (view->viewport.w >= 0) {
3044 rect->w = (float)view->viewport.w;
3045 } else {
3046 rect->w = view->pixel_w / scale_x;
3047 }
3048
3049 if (view->viewport.h >= 0) {
3050 rect->h = (float)view->viewport.h;
3051 } else {
3052 rect->h = view->pixel_h / scale_y;
3053 }
3054}
3055
3056bool SDL_GetRenderSafeArea(SDL_Renderer *renderer, SDL_Rect *rect)
3057{
3058 if (rect) {
3059 SDL_zerop(rect);
3060 }
3061
3062 CHECK_RENDERER_MAGIC(renderer, false);
3063
3064 if (renderer->target || !renderer->window) {
3065 // The entire viewport is safe for rendering
3066 return SDL_GetRenderViewport(renderer, rect);
3067 }
3068
3069 if (rect) {
3070 // Get the window safe rect
3071 SDL_Rect safe;
3072 if (!SDL_GetWindowSafeArea(renderer->window, &safe)) {
3073 return false;
3074 }
3075
3076 // Convert the coordinates into the render space
3077 float minx = (float)safe.x;
3078 float miny = (float)safe.y;
3079 float maxx = (float)safe.x + safe.w;
3080 float maxy = (float)safe.y + safe.h;
3081 if (!SDL_RenderCoordinatesFromWindow(renderer, minx, miny, &minx, &miny) ||
3082 !SDL_RenderCoordinatesFromWindow(renderer, maxx, maxy, &maxx, &maxy)) {
3083 return false;
3084 }
3085
3086 rect->x = (int)SDL_ceilf(minx);
3087 rect->y = (int)SDL_ceilf(miny);
3088 rect->w = (int)SDL_ceilf(maxx - minx);
3089 rect->h = (int)SDL_ceilf(maxy - miny);
3090
3091 // Clip with the viewport
3092 SDL_Rect viewport;
3093 if (!SDL_GetRenderViewport(renderer, &viewport)) {
3094 return false;
3095 }
3096 if (!SDL_GetRectIntersection(rect, &viewport, rect)) {
3097 return SDL_SetError("No safe area within viewport");
3098 }
3099 }
3100 return true;
3101}
3102
3103bool SDL_SetRenderClipRect(SDL_Renderer *renderer, const SDL_Rect *rect)
3104{
3105 CHECK_RENDERER_MAGIC(renderer, false)
3106
3107 SDL_RenderViewState *view = renderer->view;
3108 if (rect && rect->w >= 0 && rect->h >= 0) {
3109 view->clipping_enabled = true;
3110 SDL_copyp(&view->clip_rect, rect);
3111 } else {
3112 view->clipping_enabled = false;
3113 SDL_zero(view->clip_rect);
3114 }
3115 UpdatePixelClipRect(renderer, view);
3116
3117 return QueueCmdSetClipRect(renderer);
3118}
3119
3120bool SDL_GetRenderClipRect(SDL_Renderer *renderer, SDL_Rect *rect)
3121{
3122 if (rect) {
3123 SDL_zerop(rect);
3124 }
3125
3126 CHECK_RENDERER_MAGIC(renderer, false)
3127
3128 if (rect) {
3129 SDL_copyp(rect, &renderer->view->clip_rect);
3130 }
3131 return true;
3132}
3133
3134bool SDL_RenderClipEnabled(SDL_Renderer *renderer)
3135{
3136 CHECK_RENDERER_MAGIC(renderer, false)
3137 return renderer->view->clipping_enabled;
3138}
3139
3140bool SDL_SetRenderScale(SDL_Renderer *renderer, float scaleX, float scaleY)
3141{
3142 bool result = true;
3143
3144 CHECK_RENDERER_MAGIC(renderer, false);
3145
3146 SDL_RenderViewState *view = renderer->view;
3147
3148 if ((view->scale.x == scaleX) && (view->scale.y == scaleY)) {
3149 return true;
3150 }
3151
3152 view->scale.x = scaleX;
3153 view->scale.y = scaleY;
3154 view->current_scale.x = scaleX * view->logical_scale.x;
3155 view->current_scale.y = scaleY * view->logical_scale.y;
3156 UpdatePixelViewport(renderer, view);
3157 UpdatePixelClipRect(renderer, view);
3158
3159 // The scale affects the existing viewport and clip rectangle
3160 result &= QueueCmdSetViewport(renderer);
3161 result &= QueueCmdSetClipRect(renderer);
3162 return result;
3163}
3164
3165bool SDL_GetRenderScale(SDL_Renderer *renderer, float *scaleX, float *scaleY)
3166{
3167 if (scaleX) {
3168 *scaleX = 1.0f;
3169 }
3170 if (scaleY) {
3171 *scaleY = 1.0f;
3172 }
3173
3174 CHECK_RENDERER_MAGIC(renderer, false);
3175
3176 const SDL_RenderViewState *view = renderer->view;
3177
3178 if (scaleX) {
3179 *scaleX = view->scale.x;
3180 }
3181 if (scaleY) {
3182 *scaleY = view->scale.y;
3183 }
3184 return true;
3185}
3186
3187bool SDL_SetRenderDrawColor(SDL_Renderer *renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
3188{
3189 const float fR = (float)r / 255.0f;
3190 const float fG = (float)g / 255.0f;
3191 const float fB = (float)b / 255.0f;
3192 const float fA = (float)a / 255.0f;
3193
3194 return SDL_SetRenderDrawColorFloat(renderer, fR, fG, fB, fA);
3195}
3196
3197bool SDL_SetRenderDrawColorFloat(SDL_Renderer *renderer, float r, float g, float b, float a)
3198{
3199 CHECK_RENDERER_MAGIC(renderer, false);
3200
3201 renderer->color.r = r;
3202 renderer->color.g = g;
3203 renderer->color.b = b;
3204 renderer->color.a = a;
3205 return true;
3206}
3207
3208bool SDL_GetRenderDrawColor(SDL_Renderer *renderer, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a)
3209{
3210 float fR, fG, fB, fA;
3211
3212 if (!SDL_GetRenderDrawColorFloat(renderer, &fR, &fG, &fB, &fA)) {
3213 if (r) {
3214 *r = 0;
3215 }
3216 if (g) {
3217 *g = 0;
3218 }
3219 if (b) {
3220 *b = 0;
3221 }
3222 if (a) {
3223 *a = 0;
3224 }
3225 return false;
3226 }
3227
3228 if (r) {
3229 *r = (Uint8)(fR * 255.0f);
3230 }
3231 if (g) {
3232 *g = (Uint8)(fG * 255.0f);
3233 }
3234 if (b) {
3235 *b = (Uint8)(fB * 255.0f);
3236 }
3237 if (a) {
3238 *a = (Uint8)(fA * 255.0f);
3239 }
3240 return true;
3241}
3242
3243bool SDL_GetRenderDrawColorFloat(SDL_Renderer *renderer, float *r, float *g, float *b, float *a)
3244{
3245 SDL_FColor color;
3246
3247 if (r) {
3248 *r = 0.0f;
3249 }
3250 if (g) {
3251 *g = 0.0f;
3252 }
3253 if (b) {
3254 *b = 0.0f;
3255 }
3256 if (a) {
3257 *a = 0.0f;
3258 }
3259
3260 CHECK_RENDERER_MAGIC(renderer, false);
3261
3262 color = renderer->color;
3263
3264 if (r) {
3265 *r = color.r;
3266 }
3267 if (g) {
3268 *g = color.g;
3269 }
3270 if (b) {
3271 *b = color.b;
3272 }
3273 if (a) {
3274 *a = color.a;
3275 }
3276 return true;
3277}
3278
3279bool SDL_SetRenderColorScale(SDL_Renderer *renderer, float scale)
3280{
3281 CHECK_RENDERER_MAGIC(renderer, false);
3282
3283 renderer->desired_color_scale = scale;
3284 UpdateColorScale(renderer);
3285 return true;
3286}
3287
3288bool SDL_GetRenderColorScale(SDL_Renderer *renderer, float *scale)
3289{
3290 if (scale) {
3291 *scale = 1.0f;
3292 }
3293
3294 CHECK_RENDERER_MAGIC(renderer, false);
3295
3296 if (scale) {
3297 *scale = renderer->desired_color_scale;
3298 }
3299 return true;
3300}
3301
3302bool SDL_SetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
3303{
3304 CHECK_RENDERER_MAGIC(renderer, false);
3305
3306 if (blendMode == SDL_BLENDMODE_INVALID) {
3307 return SDL_InvalidParamError("blendMode");
3308 }
3309
3310 if (blendMode == SDL_BLENDMODE_INVALID) {
3311 return SDL_InvalidParamError("blendMode");
3312 }
3313
3314 if (!IsSupportedBlendMode(renderer, blendMode)) {
3315 return SDL_Unsupported();
3316 }
3317
3318 renderer->blendMode = blendMode;
3319 return true;
3320}
3321
3322bool SDL_GetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode *blendMode)
3323{
3324 if (blendMode) {
3325 *blendMode = SDL_BLENDMODE_INVALID;
3326 }
3327
3328 CHECK_RENDERER_MAGIC(renderer, false);
3329
3330 if (blendMode) {
3331 *blendMode = renderer->blendMode;
3332 }
3333 return true;
3334}
3335
3336bool SDL_RenderClear(SDL_Renderer *renderer)
3337{
3338 CHECK_RENDERER_MAGIC(renderer, false);
3339
3340 return QueueCmdClear(renderer);
3341}
3342
3343bool SDL_RenderPoint(SDL_Renderer *renderer, float x, float y)
3344{
3345 SDL_FPoint fpoint;
3346 fpoint.x = x;
3347 fpoint.y = y;
3348 return SDL_RenderPoints(renderer, &fpoint, 1);
3349}
3350
3351static bool RenderPointsWithRects(SDL_Renderer *renderer, const SDL_FPoint *fpoints, const int count)
3352{
3353 bool result;
3354 bool isstack;
3355 SDL_FRect *frects;
3356 int i;
3357
3358 if (count < 1) {
3359 return true;
3360 }
3361
3362 frects = SDL_small_alloc(SDL_FRect, count, &isstack);
3363 if (!frects) {
3364 return false;
3365 }
3366
3367 const SDL_RenderViewState *view = renderer->view;
3368 const float scale_x = view->current_scale.x;
3369 const float scale_y = view->current_scale.y;
3370 for (i = 0; i < count; ++i) {
3371 frects[i].x = fpoints[i].x * scale_x;
3372 frects[i].y = fpoints[i].y * scale_y;
3373 frects[i].w = scale_x;
3374 frects[i].h = scale_y;
3375 }
3376
3377 result = QueueCmdFillRects(renderer, frects, count);
3378
3379 SDL_small_free(frects, isstack);
3380
3381 return result;
3382}
3383
3384bool SDL_RenderPoints(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
3385{
3386 bool result;
3387
3388 CHECK_RENDERER_MAGIC(renderer, false);
3389
3390 if (!points) {
3391 return SDL_InvalidParamError("SDL_RenderPoints(): points");
3392 }
3393 if (count < 1) {
3394 return true;
3395 }
3396
3397#if DONT_DRAW_WHILE_HIDDEN
3398 // Don't draw while we're hidden
3399 if (renderer->hidden) {
3400 return true;
3401 }
3402#endif
3403
3404 const SDL_RenderViewState *view = renderer->view;
3405 if ((view->current_scale.x != 1.0f) || (view->current_scale.y != 1.0f)) {
3406 result = RenderPointsWithRects(renderer, points, count);
3407 } else {
3408 result = QueueCmdDrawPoints(renderer, points, count);
3409 }
3410 return result;
3411}
3412
3413bool SDL_RenderLine(SDL_Renderer *renderer, float x1, float y1, float x2, float y2)
3414{
3415 SDL_FPoint points[2];
3416 points[0].x = x1;
3417 points[0].y = y1;
3418 points[1].x = x2;
3419 points[1].y = y2;
3420 return SDL_RenderLines(renderer, points, 2);
3421}
3422
3423static bool RenderLineBresenham(SDL_Renderer *renderer, int x1, int y1, int x2, int y2, bool draw_last)
3424{
3425 const SDL_RenderViewState *view = renderer->view;
3426 const int MAX_PIXELS = SDL_max(view->pixel_w, view->pixel_h) * 4;
3427 int i, deltax, deltay, numpixels;
3428 int d, dinc1, dinc2;
3429 int x, xinc1, xinc2;
3430 int y, yinc1, yinc2;
3431 bool result;
3432 bool isstack;
3433 SDL_FPoint *points;
3434 SDL_Rect viewport;
3435
3436 /* the backend might clip this further to the clipping rect, but we
3437 just want a basic safety against generating millions of points for
3438 massive lines. */
3439 viewport = view->pixel_viewport;
3440 viewport.x = 0;
3441 viewport.y = 0;
3442 if (!SDL_GetRectAndLineIntersection(&viewport, &x1, &y1, &x2, &y2)) {
3443 return true;
3444 }
3445
3446 deltax = SDL_abs(x2 - x1);
3447 deltay = SDL_abs(y2 - y1);
3448
3449 if (deltax >= deltay) {
3450 numpixels = deltax + 1;
3451 d = (2 * deltay) - deltax;
3452 dinc1 = deltay * 2;
3453 dinc2 = (deltay - deltax) * 2;
3454 xinc1 = 1;
3455 xinc2 = 1;
3456 yinc1 = 0;
3457 yinc2 = 1;
3458 } else {
3459 numpixels = deltay + 1;
3460 d = (2 * deltax) - deltay;
3461 dinc1 = deltax * 2;
3462 dinc2 = (deltax - deltay) * 2;
3463 xinc1 = 0;
3464 xinc2 = 1;
3465 yinc1 = 1;
3466 yinc2 = 1;
3467 }
3468
3469 if (x1 > x2) {
3470 xinc1 = -xinc1;
3471 xinc2 = -xinc2;
3472 }
3473 if (y1 > y2) {
3474 yinc1 = -yinc1;
3475 yinc2 = -yinc2;
3476 }
3477
3478 x = x1;
3479 y = y1;
3480
3481 if (!draw_last) {
3482 --numpixels;
3483 }
3484
3485 if (numpixels > MAX_PIXELS) {
3486 return SDL_SetError("Line too long (tried to draw %d pixels, max %d)", numpixels, MAX_PIXELS);
3487 }
3488
3489 points = SDL_small_alloc(SDL_FPoint, numpixels, &isstack);
3490 if (!points) {
3491 return false;
3492 }
3493 for (i = 0; i < numpixels; ++i) {
3494 points[i].x = (float)x;
3495 points[i].y = (float)y;
3496
3497 if (d < 0) {
3498 d += dinc1;
3499 x += xinc1;
3500 y += yinc1;
3501 } else {
3502 d += dinc2;
3503 x += xinc2;
3504 y += yinc2;
3505 }
3506 }
3507
3508 if ((view->current_scale.x != 1.0f) || (view->current_scale.y != 1.0f)) {
3509 result = RenderPointsWithRects(renderer, points, numpixels);
3510 } else {
3511 result = QueueCmdDrawPoints(renderer, points, numpixels);
3512 }
3513
3514 SDL_small_free(points, isstack);
3515
3516 return result;
3517}
3518
3519static bool RenderLinesWithRectsF(SDL_Renderer *renderer, const SDL_FPoint *points, const int count)
3520{
3521 const SDL_RenderViewState *view = renderer->view;
3522 const float scale_x = view->current_scale.x;
3523 const float scale_y = view->current_scale.y;
3524 SDL_FRect *frect;
3525 SDL_FRect *frects;
3526 int i, nrects = 0;
3527 bool result = true;
3528 bool isstack;
3529 bool drew_line = false;
3530 bool draw_last = false;
3531
3532 frects = SDL_small_alloc(SDL_FRect, count - 1, &isstack);
3533 if (!frects) {
3534 return false;
3535 }
3536
3537 for (i = 0; i < count - 1; ++i) {
3538 bool same_x = (points[i].x == points[i + 1].x);
3539 bool same_y = (points[i].y == points[i + 1].y);
3540
3541 if (i == (count - 2)) {
3542 if (!drew_line || points[i + 1].x != points[0].x || points[i + 1].y != points[0].y) {
3543 draw_last = true;
3544 }
3545 } else {
3546 if (same_x && same_y) {
3547 continue;
3548 }
3549 }
3550 if (same_x) {
3551 const float minY = SDL_min(points[i].y, points[i + 1].y);
3552 const float maxY = SDL_max(points[i].y, points[i + 1].y);
3553
3554 frect = &frects[nrects++];
3555 frect->x = points[i].x * scale_x;
3556 frect->y = minY * scale_y;
3557 frect->w = scale_x;
3558 frect->h = (maxY - minY + draw_last) * scale_y;
3559 if (!draw_last && points[i + 1].y < points[i].y) {
3560 frect->y += scale_y;
3561 }
3562 } else if (same_y) {
3563 const float minX = SDL_min(points[i].x, points[i + 1].x);
3564 const float maxX = SDL_max(points[i].x, points[i + 1].x);
3565
3566 frect = &frects[nrects++];
3567 frect->x = minX * scale_x;
3568 frect->y = points[i].y * scale_y;
3569 frect->w = (maxX - minX + draw_last) * scale_x;
3570 frect->h = scale_y;
3571 if (!draw_last && points[i + 1].x < points[i].x) {
3572 frect->x += scale_x;
3573 }
3574 } else {
3575 result &= RenderLineBresenham(renderer, (int)SDL_roundf(points[i].x), (int)SDL_roundf(points[i].y),
3576 (int)SDL_roundf(points[i + 1].x), (int)SDL_roundf(points[i + 1].y), draw_last);
3577 }
3578 drew_line = true;
3579 }
3580
3581 if (nrects) {
3582 result &= QueueCmdFillRects(renderer, frects, nrects);
3583 }
3584
3585 SDL_small_free(frects, isstack);
3586
3587 return result;
3588}
3589
3590bool SDL_RenderLines(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
3591{
3592 bool result = true;
3593
3594 CHECK_RENDERER_MAGIC(renderer, false);
3595
3596 if (!points) {
3597 return SDL_InvalidParamError("SDL_RenderLines(): points");
3598 }
3599 if (count < 2) {
3600 return true;
3601 }
3602
3603#if DONT_DRAW_WHILE_HIDDEN
3604 // Don't draw while we're hidden
3605 if (renderer->hidden) {
3606 return true;
3607 }
3608#endif
3609
3610 SDL_RenderViewState *view = renderer->view;
3611 const bool islogical = ((view == &renderer->main_view) && (view->logical_presentation_mode != SDL_LOGICAL_PRESENTATION_DISABLED));
3612
3613 if (islogical || (renderer->line_method == SDL_RENDERLINEMETHOD_GEOMETRY)) {
3614 const float scale_x = view->current_scale.x;
3615 const float scale_y = view->current_scale.y;
3616 bool isstack1;
3617 bool isstack2;
3618 float *xy = SDL_small_alloc(float, 4 * 2 * count, &isstack1);
3619 int *indices = SDL_small_alloc(int, (4) * 3 * (count - 1) + (2) * 3 * (count), &isstack2);
3620
3621 if (xy && indices) {
3622 int i;
3623 float *ptr_xy = xy;
3624 int *ptr_indices = indices;
3625 const int xy_stride = 2 * sizeof(float);
3626 int num_vertices = 4 * count;
3627 int num_indices = 0;
3628 const int size_indices = 4;
3629 int cur_index = -4;
3630 const int is_looping = (points[0].x == points[count - 1].x && points[0].y == points[count - 1].y);
3631 SDL_FPoint p; // previous point
3632 p.x = p.y = 0.0f;
3633 /* p q
3634
3635 0----1------ 4----5
3636 | \ |``\ | \ |
3637 | \ | ` `\| \ |
3638 3----2-------7----6
3639 */
3640 for (i = 0; i < count; ++i) {
3641 SDL_FPoint q = points[i]; // current point
3642
3643 q.x *= scale_x;
3644 q.y *= scale_y;
3645
3646 *ptr_xy++ = q.x;
3647 *ptr_xy++ = q.y;
3648 *ptr_xy++ = q.x + scale_x;
3649 *ptr_xy++ = q.y;
3650 *ptr_xy++ = q.x + scale_x;
3651 *ptr_xy++ = q.y + scale_y;
3652 *ptr_xy++ = q.x;
3653 *ptr_xy++ = q.y + scale_y;
3654
3655#define ADD_TRIANGLE(i1, i2, i3) \
3656 *ptr_indices++ = cur_index + (i1); \
3657 *ptr_indices++ = cur_index + (i2); \
3658 *ptr_indices++ = cur_index + (i3); \
3659 num_indices += 3;
3660
3661 // closed polyline, don´t draw twice the point
3662 if (i || is_looping == 0) {
3663 ADD_TRIANGLE(4, 5, 6)
3664 ADD_TRIANGLE(4, 6, 7)
3665 }
3666
3667 // first point only, no segment
3668 if (i == 0) {
3669 p = q;
3670 cur_index += 4;
3671 continue;
3672 }
3673
3674 // draw segment
3675 if (p.y == q.y) {
3676 if (p.x < q.x) {
3677 ADD_TRIANGLE(1, 4, 7)
3678 ADD_TRIANGLE(1, 7, 2)
3679 } else {
3680 ADD_TRIANGLE(5, 0, 3)
3681 ADD_TRIANGLE(5, 3, 6)
3682 }
3683 } else if (p.x == q.x) {
3684 if (p.y < q.y) {
3685 ADD_TRIANGLE(2, 5, 4)
3686 ADD_TRIANGLE(2, 4, 3)
3687 } else {
3688 ADD_TRIANGLE(6, 1, 0)
3689 ADD_TRIANGLE(6, 0, 7)
3690 }
3691 } else {
3692 if (p.y < q.y) {
3693 if (p.x < q.x) {
3694 ADD_TRIANGLE(1, 5, 4)
3695 ADD_TRIANGLE(1, 4, 2)
3696 ADD_TRIANGLE(2, 4, 7)
3697 ADD_TRIANGLE(2, 7, 3)
3698 } else {
3699 ADD_TRIANGLE(4, 0, 5)
3700 ADD_TRIANGLE(5, 0, 3)
3701 ADD_TRIANGLE(5, 3, 6)
3702 ADD_TRIANGLE(6, 3, 2)
3703 }
3704 } else {
3705 if (p.x < q.x) {
3706 ADD_TRIANGLE(0, 4, 7)
3707 ADD_TRIANGLE(0, 7, 1)
3708 ADD_TRIANGLE(1, 7, 6)
3709 ADD_TRIANGLE(1, 6, 2)
3710 } else {
3711 ADD_TRIANGLE(6, 5, 1)
3712 ADD_TRIANGLE(6, 1, 0)
3713 ADD_TRIANGLE(7, 6, 0)
3714 ADD_TRIANGLE(7, 0, 3)
3715 }
3716 }
3717 }
3718
3719 p = q;
3720 cur_index += 4;
3721 }
3722
3723 result = QueueCmdGeometry(renderer, NULL,
3724 xy, xy_stride, &renderer->color, 0 /* color_stride */, NULL, 0,
3725 num_vertices, indices, num_indices, size_indices,
3726 1.0f, 1.0f, SDL_TEXTURE_ADDRESS_CLAMP);
3727 }
3728
3729 SDL_small_free(xy, isstack1);
3730 SDL_small_free(indices, isstack2);
3731
3732 } else if (renderer->line_method == SDL_RENDERLINEMETHOD_POINTS) {
3733 result = RenderLinesWithRectsF(renderer, points, count);
3734 } else if (view->scale.x != 1.0f || view->scale.y != 1.0f) { /* we checked for logical scale elsewhere. */
3735 result = RenderLinesWithRectsF(renderer, points, count);
3736 } else {
3737 result = QueueCmdDrawLines(renderer, points, count);
3738 }
3739
3740 return result;
3741}
3742
3743bool SDL_RenderRect(SDL_Renderer *renderer, const SDL_FRect *rect)
3744{
3745 SDL_FRect frect;
3746 SDL_FPoint points[5];
3747
3748 CHECK_RENDERER_MAGIC(renderer, false);
3749
3750 // If 'rect' == NULL, then outline the whole surface
3751 if (!rect) {
3752 GetRenderViewportSize(renderer, &frect);
3753 rect = &frect;
3754 }
3755
3756 points[0].x = rect->x;
3757 points[0].y = rect->y;
3758 points[1].x = rect->x + rect->w - 1;
3759 points[1].y = rect->y;
3760 points[2].x = rect->x + rect->w - 1;
3761 points[2].y = rect->y + rect->h - 1;
3762 points[3].x = rect->x;
3763 points[3].y = rect->y + rect->h - 1;
3764 points[4].x = rect->x;
3765 points[4].y = rect->y;
3766 return SDL_RenderLines(renderer, points, 5);
3767}
3768
3769bool SDL_RenderRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
3770{
3771 int i;
3772
3773 CHECK_RENDERER_MAGIC(renderer, false);
3774
3775 if (!rects) {
3776 return SDL_InvalidParamError("SDL_RenderRects(): rects");
3777 }
3778 if (count < 1) {
3779 return true;
3780 }
3781
3782#if DONT_DRAW_WHILE_HIDDEN
3783 // Don't draw while we're hidden
3784 if (renderer->hidden) {
3785 return true;
3786 }
3787#endif
3788
3789 for (i = 0; i < count; ++i) {
3790 if (!SDL_RenderRect(renderer, &rects[i])) {
3791 return false;
3792 }
3793 }
3794 return true;
3795}
3796
3797bool SDL_RenderFillRect(SDL_Renderer *renderer, const SDL_FRect *rect)
3798{
3799 SDL_FRect frect;
3800
3801 CHECK_RENDERER_MAGIC(renderer, false);
3802
3803 // If 'rect' == NULL, then fill the whole surface
3804 if (!rect) {
3805 GetRenderViewportSize(renderer, &frect);
3806 rect = &frect;
3807 }
3808 return SDL_RenderFillRects(renderer, rect, 1);
3809}
3810
3811bool SDL_RenderFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
3812{
3813 SDL_FRect *frects;
3814 int i;
3815 bool result;
3816 bool isstack;
3817
3818 CHECK_RENDERER_MAGIC(renderer, false);
3819
3820 if (!rects) {
3821 return SDL_InvalidParamError("SDL_RenderFillRects(): rects");
3822 }
3823 if (count < 1) {
3824 return true;
3825 }
3826
3827#if DONT_DRAW_WHILE_HIDDEN
3828 // Don't draw while we're hidden
3829 if (renderer->hidden) {
3830 return true;
3831 }
3832#endif
3833
3834 frects = SDL_small_alloc(SDL_FRect, count, &isstack);
3835 if (!frects) {
3836 return false;
3837 }
3838
3839 const SDL_RenderViewState *view = renderer->view;
3840 const float scale_x = view->current_scale.x;
3841 const float scale_y = view->current_scale.y;
3842 for (i = 0; i < count; ++i) {
3843 frects[i].x = rects[i].x * scale_x;
3844 frects[i].y = rects[i].y * scale_y;
3845 frects[i].w = rects[i].w * scale_x;
3846 frects[i].h = rects[i].h * scale_y;
3847 }
3848
3849 result = QueueCmdFillRects(renderer, frects, count);
3850
3851 SDL_small_free(frects, isstack);
3852
3853 return result;
3854}
3855
3856static bool SDL_RenderTextureInternal(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect)
3857{
3858 const SDL_RenderViewState *view = renderer->view;
3859 const float scale_x = view->current_scale.x;
3860 const float scale_y = view->current_scale.y;
3861 const bool use_rendergeometry = (!renderer->QueueCopy);
3862 bool result;
3863
3864 if (use_rendergeometry) {
3865 float xy[8];
3866 const int xy_stride = 2 * sizeof(float);
3867 float uv[8];
3868 const int uv_stride = 2 * sizeof(float);
3869 const int num_vertices = 4;
3870 const int *indices = rect_index_order;
3871 const int num_indices = 6;
3872 const int size_indices = 4;
3873 float minu, minv, maxu, maxv;
3874 float minx, miny, maxx, maxy;
3875
3876 minu = srcrect->x / texture->w;
3877 minv = srcrect->y / texture->h;
3878 maxu = (srcrect->x + srcrect->w) / texture->w;
3879 maxv = (srcrect->y + srcrect->h) / texture->h;
3880
3881 minx = dstrect->x;
3882 miny = dstrect->y;
3883 maxx = dstrect->x + dstrect->w;
3884 maxy = dstrect->y + dstrect->h;
3885
3886 uv[0] = minu;
3887 uv[1] = minv;
3888 uv[2] = maxu;
3889 uv[3] = minv;
3890 uv[4] = maxu;
3891 uv[5] = maxv;
3892 uv[6] = minu;
3893 uv[7] = maxv;
3894
3895 xy[0] = minx;
3896 xy[1] = miny;
3897 xy[2] = maxx;
3898 xy[3] = miny;
3899 xy[4] = maxx;
3900 xy[5] = maxy;
3901 xy[6] = minx;
3902 xy[7] = maxy;
3903
3904 result = QueueCmdGeometry(renderer, texture,
3905 xy, xy_stride, &texture->color, 0 /* color_stride */, uv, uv_stride,
3906 num_vertices, indices, num_indices, size_indices,
3907 scale_x, scale_y, SDL_TEXTURE_ADDRESS_CLAMP);
3908 } else {
3909 const SDL_FRect rect = { dstrect->x * scale_x, dstrect->y * scale_y, dstrect->w * scale_x, dstrect->h * scale_y };
3910 result = QueueCmdCopy(renderer, texture, srcrect, &rect);
3911 }
3912 return result;
3913}
3914
3915bool SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect)
3916{
3917 CHECK_RENDERER_MAGIC(renderer, false);
3918 CHECK_TEXTURE_MAGIC(texture, false);
3919
3920 if (renderer != texture->renderer) {
3921 return SDL_SetError("Texture was not created with this renderer");
3922 }
3923
3924#if DONT_DRAW_WHILE_HIDDEN
3925 // Don't draw while we're hidden
3926 if (renderer->hidden) {
3927 return true;
3928 }
3929#endif
3930
3931 SDL_FRect real_srcrect;
3932 real_srcrect.x = 0.0f;
3933 real_srcrect.y = 0.0f;
3934 real_srcrect.w = (float)texture->w;
3935 real_srcrect.h = (float)texture->h;
3936 if (srcrect) {
3937 if (!SDL_GetRectIntersectionFloat(srcrect, &real_srcrect, &real_srcrect) ||
3938 real_srcrect.w == 0.0f || real_srcrect.h == 0.0f) {
3939 return true;
3940 }
3941 }
3942
3943 SDL_FRect full_dstrect;
3944 if (!dstrect) {
3945 GetRenderViewportSize(renderer, &full_dstrect);
3946 dstrect = &full_dstrect;
3947 }
3948
3949 if (texture->native) {
3950 texture = texture->native;
3951 }
3952
3953 texture->last_command_generation = renderer->render_command_generation;
3954
3955 return SDL_RenderTextureInternal(renderer, texture, &real_srcrect, dstrect);
3956}
3957
3958bool SDL_RenderTextureAffine(SDL_Renderer *renderer, SDL_Texture *texture,
3959 const SDL_FRect *srcrect, const SDL_FPoint *origin, const SDL_FPoint *right, const SDL_FPoint *down)
3960{
3961 SDL_FRect real_srcrect;
3962 SDL_FRect real_dstrect;
3963 bool result;
3964
3965 CHECK_RENDERER_MAGIC(renderer, false);
3966 CHECK_TEXTURE_MAGIC(texture, false);
3967
3968 if (renderer != texture->renderer) {
3969 return SDL_SetError("Texture was not created with this renderer");
3970 }
3971 if (!renderer->QueueCopyEx && !renderer->QueueGeometry) {
3972 return SDL_SetError("Renderer does not support RenderCopyEx");
3973 }
3974
3975#if DONT_DRAW_WHILE_HIDDEN
3976 // Don't draw while we're hidden
3977 if (renderer->hidden) {
3978 return true;
3979 }
3980#endif
3981
3982 real_srcrect.x = 0.0f;
3983 real_srcrect.y = 0.0f;
3984 real_srcrect.w = (float)texture->w;
3985 real_srcrect.h = (float)texture->h;
3986 if (srcrect) {
3987 if (!SDL_GetRectIntersectionFloat(srcrect, &real_srcrect, &real_srcrect)) {
3988 return true;
3989 }
3990 }
3991
3992 GetRenderViewportSize(renderer, &real_dstrect);
3993
3994 if (texture->native) {
3995 texture = texture->native;
3996 }
3997
3998 texture->last_command_generation = renderer->render_command_generation;
3999
4000 const SDL_RenderViewState *view = renderer->view;
4001 const float scale_x = view->current_scale.x;
4002 const float scale_y = view->current_scale.y;
4003
4004 {
4005 float xy[8];
4006 const int xy_stride = 2 * sizeof(float);
4007 float uv[8];
4008 const int uv_stride = 2 * sizeof(float);
4009 const int num_vertices = 4;
4010 const int *indices = rect_index_order;
4011 const int num_indices = 6;
4012 const int size_indices = 4;
4013
4014 float minu = real_srcrect.x / texture->w;
4015 float minv = real_srcrect.y / texture->h;
4016 float maxu = (real_srcrect.x + real_srcrect.w) / texture->w;
4017 float maxv = (real_srcrect.y + real_srcrect.h) / texture->h;
4018
4019 uv[0] = minu;
4020 uv[1] = minv;
4021 uv[2] = maxu;
4022 uv[3] = minv;
4023 uv[4] = maxu;
4024 uv[5] = maxv;
4025 uv[6] = minu;
4026 uv[7] = maxv;
4027
4028 // (minx, miny)
4029 if (origin) {
4030 xy[0] = origin->x;
4031 xy[1] = origin->y;
4032 } else {
4033 xy[0] = real_dstrect.x;
4034 xy[1] = real_dstrect.y;
4035 }
4036
4037 // (maxx, miny)
4038 if (right) {
4039 xy[2] = right->x;
4040 xy[3] = right->y;
4041 } else {
4042 xy[2] = real_dstrect.x + real_dstrect.w;
4043 xy[3] = real_dstrect.y;
4044 }
4045
4046 // (minx, maxy)
4047 if (down) {
4048 xy[6] = down->x;
4049 xy[7] = down->y;
4050 } else {
4051 xy[6] = real_dstrect.x;
4052 xy[7] = real_dstrect.y + real_dstrect.h;
4053 }
4054
4055 // (maxx, maxy)
4056 if (origin || right || down) {
4057 xy[4] = xy[2] + xy[6] - xy[0];
4058 xy[5] = xy[3] + xy[7] - xy[1];
4059 } else {
4060 xy[4] = real_dstrect.x + real_dstrect.w;
4061 xy[5] = real_dstrect.y + real_dstrect.h;
4062 }
4063
4064 result = QueueCmdGeometry(
4065 renderer, texture,
4066 xy, xy_stride,
4067 &texture->color, 0 /* color_stride */,
4068 uv, uv_stride,
4069 num_vertices, indices, num_indices, size_indices,
4070 scale_x, scale_y, SDL_TEXTURE_ADDRESS_CLAMP
4071 );
4072 }
4073 return result;
4074}
4075
4076bool SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture,
4077 const SDL_FRect *srcrect, const SDL_FRect *dstrect,
4078 const double angle, const SDL_FPoint *center, const SDL_FlipMode flip)
4079{
4080 SDL_FRect real_srcrect;
4081 SDL_FPoint real_center;
4082 bool result;
4083
4084 if (flip == SDL_FLIP_NONE && (int)(angle / 360) == angle / 360) { // fast path when we don't need rotation or flipping
4085 return SDL_RenderTexture(renderer, texture, srcrect, dstrect);
4086 }
4087
4088 CHECK_RENDERER_MAGIC(renderer, false);
4089 CHECK_TEXTURE_MAGIC(texture, false);
4090
4091 if (renderer != texture->renderer) {
4092 return SDL_SetError("Texture was not created with this renderer");
4093 }
4094 if (!renderer->QueueCopyEx && !renderer->QueueGeometry) {
4095 return SDL_SetError("Renderer does not support RenderCopyEx");
4096 }
4097
4098#if DONT_DRAW_WHILE_HIDDEN
4099 // Don't draw while we're hidden
4100 if (renderer->hidden) {
4101 return true;
4102 }
4103#endif
4104
4105 real_srcrect.x = 0.0f;
4106 real_srcrect.y = 0.0f;
4107 real_srcrect.w = (float)texture->w;
4108 real_srcrect.h = (float)texture->h;
4109 if (srcrect) {
4110 if (!SDL_GetRectIntersectionFloat(srcrect, &real_srcrect, &real_srcrect)) {
4111 return true;
4112 }
4113 }
4114
4115 // We don't intersect the dstrect with the viewport as RenderCopy does because of potential rotation clipping issues... TODO: should we?
4116 SDL_FRect full_dstrect;
4117 if (!dstrect) {
4118 GetRenderViewportSize(renderer, &full_dstrect);
4119 dstrect = &full_dstrect;
4120 }
4121
4122 if (texture->native) {
4123 texture = texture->native;
4124 }
4125
4126 if (center) {
4127 real_center = *center;
4128 } else {
4129 real_center.x = dstrect->w / 2.0f;
4130 real_center.y = dstrect->h / 2.0f;
4131 }
4132
4133 texture->last_command_generation = renderer->render_command_generation;
4134
4135 const SDL_RenderViewState *view = renderer->view;
4136 const float scale_x = view->current_scale.x;
4137 const float scale_y = view->current_scale.y;
4138
4139 const bool use_rendergeometry = (!renderer->QueueCopyEx);
4140 if (use_rendergeometry) {
4141 float xy[8];
4142 const int xy_stride = 2 * sizeof(float);
4143 float uv[8];
4144 const int uv_stride = 2 * sizeof(float);
4145 const int num_vertices = 4;
4146 const int *indices = rect_index_order;
4147 const int num_indices = 6;
4148 const int size_indices = 4;
4149 float minu, minv, maxu, maxv;
4150 float minx, miny, maxx, maxy;
4151 float centerx, centery;
4152
4153 float s_minx, s_miny, s_maxx, s_maxy;
4154 float c_minx, c_miny, c_maxx, c_maxy;
4155
4156 const float radian_angle = (float)((SDL_PI_D * angle) / 180.0);
4157 const float s = SDL_sinf(radian_angle);
4158 const float c = SDL_cosf(radian_angle);
4159
4160 minu = real_srcrect.x / texture->w;
4161 minv = real_srcrect.y / texture->h;
4162 maxu = (real_srcrect.x + real_srcrect.w) / texture->w;
4163 maxv = (real_srcrect.y + real_srcrect.h) / texture->h;
4164
4165 centerx = real_center.x + dstrect->x;
4166 centery = real_center.y + dstrect->y;
4167
4168 if (flip & SDL_FLIP_HORIZONTAL) {
4169 minx = dstrect->x + dstrect->w;
4170 maxx = dstrect->x;
4171 } else {
4172 minx = dstrect->x;
4173 maxx = dstrect->x + dstrect->w;
4174 }
4175
4176 if (flip & SDL_FLIP_VERTICAL) {
4177 miny = dstrect->y + dstrect->h;
4178 maxy = dstrect->y;
4179 } else {
4180 miny = dstrect->y;
4181 maxy = dstrect->y + dstrect->h;
4182 }
4183
4184 uv[0] = minu;
4185 uv[1] = minv;
4186 uv[2] = maxu;
4187 uv[3] = minv;
4188 uv[4] = maxu;
4189 uv[5] = maxv;
4190 uv[6] = minu;
4191 uv[7] = maxv;
4192
4193 /* apply rotation with 2x2 matrix ( c -s )
4194 * ( s c ) */
4195 s_minx = s * (minx - centerx);
4196 s_miny = s * (miny - centery);
4197 s_maxx = s * (maxx - centerx);
4198 s_maxy = s * (maxy - centery);
4199 c_minx = c * (minx - centerx);
4200 c_miny = c * (miny - centery);
4201 c_maxx = c * (maxx - centerx);
4202 c_maxy = c * (maxy - centery);
4203
4204 // (minx, miny)
4205 xy[0] = (c_minx - s_miny) + centerx;
4206 xy[1] = (s_minx + c_miny) + centery;
4207 // (maxx, miny)
4208 xy[2] = (c_maxx - s_miny) + centerx;
4209 xy[3] = (s_maxx + c_miny) + centery;
4210 // (maxx, maxy)
4211 xy[4] = (c_maxx - s_maxy) + centerx;
4212 xy[5] = (s_maxx + c_maxy) + centery;
4213 // (minx, maxy)
4214 xy[6] = (c_minx - s_maxy) + centerx;
4215 xy[7] = (s_minx + c_maxy) + centery;
4216
4217 result = QueueCmdGeometry(renderer, texture,
4218 xy, xy_stride, &texture->color, 0 /* color_stride */, uv, uv_stride,
4219 num_vertices, indices, num_indices, size_indices,
4220 scale_x, scale_y, SDL_TEXTURE_ADDRESS_CLAMP);
4221 } else {
4222 result = QueueCmdCopyEx(renderer, texture, &real_srcrect, dstrect, angle, &real_center, flip, scale_x, scale_y);
4223 }
4224 return result;
4225}
4226
4227static bool SDL_RenderTextureTiled_Wrap(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float scale, const SDL_FRect *dstrect)
4228{
4229 float xy[8];
4230 const int xy_stride = 2 * sizeof(float);
4231 float uv[8];
4232 const int uv_stride = 2 * sizeof(float);
4233 const int num_vertices = 4;
4234 const int *indices = rect_index_order;
4235 const int num_indices = 6;
4236 const int size_indices = 4;
4237 float minu, minv, maxu, maxv;
4238 float minx, miny, maxx, maxy;
4239
4240 minu = 0.0f;
4241 minv = 0.0f;
4242 maxu = dstrect->w / (srcrect->w * scale);
4243 maxv = dstrect->h / (srcrect->h * scale);
4244
4245 minx = dstrect->x;
4246 miny = dstrect->y;
4247 maxx = dstrect->x + dstrect->w;
4248 maxy = dstrect->y + dstrect->h;
4249
4250 uv[0] = minu;
4251 uv[1] = minv;
4252 uv[2] = maxu;
4253 uv[3] = minv;
4254 uv[4] = maxu;
4255 uv[5] = maxv;
4256 uv[6] = minu;
4257 uv[7] = maxv;
4258
4259 xy[0] = minx;
4260 xy[1] = miny;
4261 xy[2] = maxx;
4262 xy[3] = miny;
4263 xy[4] = maxx;
4264 xy[5] = maxy;
4265 xy[6] = minx;
4266 xy[7] = maxy;
4267
4268 const SDL_RenderViewState *view = renderer->view;
4269 return QueueCmdGeometry(renderer, texture,
4270 xy, xy_stride, &texture->color, 0 /* color_stride */, uv, uv_stride,
4271 num_vertices, indices, num_indices, size_indices,
4272 view->current_scale.x, view->current_scale.y, SDL_TEXTURE_ADDRESS_WRAP);
4273}
4274
4275static bool SDL_RenderTextureTiled_Iterate(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float scale, const SDL_FRect *dstrect)
4276{
4277 float tile_width = srcrect->w * scale;
4278 float tile_height = srcrect->h * scale;
4279 float float_rows, float_cols;
4280 float remaining_w = SDL_modff(dstrect->w / tile_width, &float_cols);
4281 float remaining_h = SDL_modff(dstrect->h / tile_height, &float_rows);
4282 float remaining_src_w = remaining_w * srcrect->w;
4283 float remaining_src_h = remaining_h * srcrect->h;
4284 float remaining_dst_w = remaining_w * tile_width;
4285 float remaining_dst_h = remaining_h * tile_height;
4286 int rows = (int)float_rows;
4287 int cols = (int)float_cols;
4288 SDL_FRect curr_src, curr_dst;
4289
4290 SDL_copyp(&curr_src, srcrect);
4291 curr_dst.y = dstrect->y;
4292 curr_dst.w = tile_width;
4293 curr_dst.h = tile_height;
4294 for (int y = 0; y < rows; ++y) {
4295 curr_dst.x = dstrect->x;
4296 for (int x = 0; x < cols; ++x) {
4297 if (!SDL_RenderTextureInternal(renderer, texture, &curr_src, &curr_dst)) {
4298 return false;
4299 }
4300 curr_dst.x += curr_dst.w;
4301 }
4302 if (remaining_dst_w > 0.0f) {
4303 curr_src.w = remaining_src_w;
4304 curr_dst.w = remaining_dst_w;
4305 if (!SDL_RenderTextureInternal(renderer, texture, &curr_src, &curr_dst)) {
4306 return false;
4307 }
4308 curr_src.w = srcrect->w;
4309 curr_dst.w = tile_width;
4310 }
4311 curr_dst.y += curr_dst.h;
4312 }
4313 if (remaining_dst_h > 0.0f) {
4314 curr_src.h = remaining_src_h;
4315 curr_dst.h = remaining_dst_h;
4316 curr_dst.x = dstrect->x;
4317 for (int x = 0; x < cols; ++x) {
4318 if (!SDL_RenderTextureInternal(renderer, texture, &curr_src, &curr_dst)) {
4319 return false;
4320 }
4321 curr_dst.x += curr_dst.w;
4322 }
4323 if (remaining_dst_w > 0.0f) {
4324 curr_src.w = remaining_src_w;
4325 curr_dst.w = remaining_dst_w;
4326 if (!SDL_RenderTextureInternal(renderer, texture, &curr_src, &curr_dst)) {
4327 return false;
4328 }
4329 }
4330 }
4331 return true;
4332}
4333
4334bool SDL_RenderTextureTiled(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float scale, const SDL_FRect *dstrect)
4335{
4336 SDL_FRect real_srcrect;
4337
4338 CHECK_RENDERER_MAGIC(renderer, false);
4339 CHECK_TEXTURE_MAGIC(texture, false);
4340
4341 if (renderer != texture->renderer) {
4342 return SDL_SetError("Texture was not created with this renderer");
4343 }
4344
4345 if (scale <= 0.0f) {
4346 return SDL_InvalidParamError("scale");
4347 }
4348
4349#if DONT_DRAW_WHILE_HIDDEN
4350 // Don't draw while we're hidden
4351 if (renderer->hidden) {
4352 return true;
4353 }
4354#endif
4355
4356 real_srcrect.x = 0.0f;
4357 real_srcrect.y = 0.0f;
4358 real_srcrect.w = (float)texture->w;
4359 real_srcrect.h = (float)texture->h;
4360 if (srcrect) {
4361 if (!SDL_GetRectIntersectionFloat(srcrect, &real_srcrect, &real_srcrect)) {
4362 return true;
4363 }
4364 }
4365
4366 SDL_FRect full_dstrect;
4367 if (!dstrect) {
4368 GetRenderViewportSize(renderer, &full_dstrect);
4369 dstrect = &full_dstrect;
4370 }
4371
4372 if (texture->native) {
4373 texture = texture->native;
4374 }
4375
4376 texture->last_command_generation = renderer->render_command_generation;
4377
4378 // See if we can use geometry with repeating texture coordinates
4379 if (!renderer->software &&
4380 (!srcrect ||
4381 (real_srcrect.x == 0.0f && real_srcrect.y == 0.0f &&
4382 real_srcrect.w == (float)texture->w && real_srcrect.h == (float)texture->h))) {
4383 return SDL_RenderTextureTiled_Wrap(renderer, texture, &real_srcrect, scale, dstrect);
4384 } else {
4385 return SDL_RenderTextureTiled_Iterate(renderer, texture, &real_srcrect, scale, dstrect);
4386 }
4387}
4388
4389bool SDL_RenderTexture9Grid(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, float left_width, float right_width, float top_height, float bottom_height, float scale, const SDL_FRect *dstrect)
4390{
4391 SDL_FRect full_src, full_dst;
4392 SDL_FRect curr_src, curr_dst;
4393 float dst_left_width;
4394 float dst_right_width;
4395 float dst_top_height;
4396 float dst_bottom_height;
4397
4398 CHECK_RENDERER_MAGIC(renderer, false);
4399 CHECK_TEXTURE_MAGIC(texture, false);
4400
4401 if (renderer != texture->renderer) {
4402 return SDL_SetError("Texture was not created with this renderer");
4403 }
4404
4405 if (!srcrect) {
4406 full_src.x = 0;
4407 full_src.y = 0;
4408 full_src.w = (float)texture->w;
4409 full_src.h = (float)texture->h;
4410 srcrect = &full_src;
4411 }
4412
4413 if (!dstrect) {
4414 GetRenderViewportSize(renderer, &full_dst);
4415 dstrect = &full_dst;
4416 }
4417
4418 if (scale <= 0.0f || scale == 1.0f) {
4419 dst_left_width = SDL_ceilf(left_width);
4420 dst_right_width = SDL_ceilf(right_width);
4421 dst_top_height = SDL_ceilf(top_height);
4422 dst_bottom_height = SDL_ceilf(bottom_height);
4423 } else {
4424 dst_left_width = SDL_ceilf(left_width * scale);
4425 dst_right_width = SDL_ceilf(right_width * scale);
4426 dst_top_height = SDL_ceilf(top_height * scale);
4427 dst_bottom_height = SDL_ceilf(bottom_height * scale);
4428 }
4429
4430 // Center
4431 curr_src.x = srcrect->x + left_width;
4432 curr_src.y = srcrect->y + top_height;
4433 curr_src.w = srcrect->w - left_width - right_width;
4434 curr_src.h = srcrect->h - top_height - bottom_height;
4435 curr_dst.x = dstrect->x + dst_left_width;
4436 curr_dst.y = dstrect->y + dst_top_height;
4437 curr_dst.w = dstrect->w - dst_left_width - dst_right_width;
4438 curr_dst.h = dstrect->h - dst_top_height - dst_bottom_height;
4439 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4440 return false;
4441 }
4442
4443 // Upper-left corner
4444 curr_src.x = srcrect->x;
4445 curr_src.y = srcrect->y;
4446 curr_src.w = left_width;
4447 curr_src.h = top_height;
4448 curr_dst.x = dstrect->x;
4449 curr_dst.y = dstrect->y;
4450 curr_dst.w = dst_left_width;
4451 curr_dst.h = dst_top_height;
4452 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4453 return false;
4454 }
4455
4456 // Upper-right corner
4457 curr_src.x = srcrect->x + srcrect->w - right_width;
4458 curr_src.w = right_width;
4459 curr_dst.x = dstrect->x + dstrect->w - dst_right_width;
4460 curr_dst.w = dst_right_width;
4461 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4462 return false;
4463 }
4464
4465 // Lower-right corner
4466 curr_src.y = srcrect->y + srcrect->h - bottom_height;
4467 curr_src.h = bottom_height;
4468 curr_dst.y = dstrect->y + dstrect->h - dst_bottom_height;
4469 curr_dst.h = dst_bottom_height;
4470 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4471 return false;
4472 }
4473
4474 // Lower-left corner
4475 curr_src.x = srcrect->x;
4476 curr_src.w = left_width;
4477 curr_dst.x = dstrect->x;
4478 curr_dst.w = dst_left_width;
4479 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4480 return false;
4481 }
4482
4483 // Left
4484 curr_src.y = srcrect->y + top_height;
4485 curr_src.h = srcrect->h - top_height - bottom_height;
4486 curr_dst.y = dstrect->y + dst_top_height;
4487 curr_dst.h = dstrect->h - dst_top_height - dst_bottom_height;
4488 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4489 return false;
4490 }
4491
4492 // Right
4493 curr_src.x = srcrect->x + srcrect->w - right_width;
4494 curr_src.w = right_width;
4495 curr_dst.x = dstrect->x + dstrect->w - dst_right_width;
4496 curr_dst.w = dst_right_width;
4497 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4498 return false;
4499 }
4500
4501 // Top
4502 curr_src.x = srcrect->x + left_width;
4503 curr_src.y = srcrect->y;
4504 curr_src.w = srcrect->w - left_width - right_width;
4505 curr_src.h = top_height;
4506 curr_dst.x = dstrect->x + dst_left_width;
4507 curr_dst.y = dstrect->y;
4508 curr_dst.w = dstrect->w - dst_left_width - dst_right_width;
4509 curr_dst.h = dst_top_height;
4510 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4511 return false;
4512 }
4513
4514 // Bottom
4515 curr_src.y = srcrect->y + srcrect->h - bottom_height;
4516 curr_src.h = bottom_height;
4517 curr_dst.y = dstrect->y + dstrect->h - dst_bottom_height;
4518 curr_dst.h = dst_bottom_height;
4519 if (!SDL_RenderTexture(renderer, texture, &curr_src, &curr_dst)) {
4520 return false;
4521 }
4522
4523 return true;
4524}
4525
4526bool SDL_RenderGeometry(SDL_Renderer *renderer,
4527 SDL_Texture *texture,
4528 const SDL_Vertex *vertices, int num_vertices,
4529 const int *indices, int num_indices)
4530{
4531 if (vertices) {
4532 const float *xy = &vertices->position.x;
4533 int xy_stride = sizeof(SDL_Vertex);
4534 const SDL_FColor *color = &vertices->color;
4535 int color_stride = sizeof(SDL_Vertex);
4536 const float *uv = &vertices->tex_coord.x;
4537 int uv_stride = sizeof(SDL_Vertex);
4538 int size_indices = 4;
4539 return SDL_RenderGeometryRaw(renderer, texture, xy, xy_stride, color, color_stride, uv, uv_stride, num_vertices, indices, num_indices, size_indices);
4540 } else {
4541 return SDL_InvalidParamError("vertices");
4542 }
4543}
4544
4545#ifdef SDL_VIDEO_RENDER_SW
4546static int remap_one_indice(
4547 int prev,
4548 int k,
4549 SDL_Texture *texture,
4550 const float *xy, int xy_stride,
4551 const SDL_FColor *color, int color_stride,
4552 const float *uv, int uv_stride)
4553{
4554 const float *xy0_, *xy1_, *uv0_, *uv1_;
4555 const SDL_FColor *col0_, *col1_;
4556 xy0_ = (const float *)((const char *)xy + prev * xy_stride);
4557 xy1_ = (const float *)((const char *)xy + k * xy_stride);
4558 if (xy0_[0] != xy1_[0]) {
4559 return k;
4560 }
4561 if (xy0_[1] != xy1_[1]) {
4562 return k;
4563 }
4564 if (texture) {
4565 uv0_ = (const float *)((const char *)uv + prev * uv_stride);
4566 uv1_ = (const float *)((const char *)uv + k * uv_stride);
4567 if (uv0_[0] != uv1_[0]) {
4568 return k;
4569 }
4570 if (uv0_[1] != uv1_[1]) {
4571 return k;
4572 }
4573 }
4574 col0_ = (const SDL_FColor *)((const char *)color + prev * color_stride);
4575 col1_ = (const SDL_FColor *)((const char *)color + k * color_stride);
4576
4577 if (SDL_memcmp(col0_, col1_, sizeof(*col0_)) != 0) {
4578 return k;
4579 }
4580
4581 return prev;
4582}
4583
4584static int remap_indices(
4585 int prev[3],
4586 int k,
4587 SDL_Texture *texture,
4588 const float *xy, int xy_stride,
4589 const SDL_FColor *color, int color_stride,
4590 const float *uv, int uv_stride)
4591{
4592 int i;
4593 if (prev[0] == -1) {
4594 return k;
4595 }
4596
4597 for (i = 0; i < 3; i++) {
4598 int new_k = remap_one_indice(prev[i], k, texture, xy, xy_stride, color, color_stride, uv, uv_stride);
4599 if (new_k != k) {
4600 return new_k;
4601 }
4602 }
4603 return k;
4604}
4605
4606#define DEBUG_SW_RENDER_GEOMETRY 0
4607// For the software renderer, try to reinterpret triangles as SDL_Rect
4608static bool SDLCALL SDL_SW_RenderGeometryRaw(SDL_Renderer *renderer,
4609 SDL_Texture *texture,
4610 const float *xy, int xy_stride,
4611 const SDL_FColor *color, int color_stride,
4612 const float *uv, int uv_stride,
4613 int num_vertices,
4614 const void *indices, int num_indices, int size_indices)
4615{
4616 int i;
4617 bool result = true;
4618 int count = indices ? num_indices : num_vertices;
4619 int prev[3]; // Previous triangle vertex indices
4620 float texw = 0.0f, texh = 0.0f;
4621 SDL_BlendMode blendMode = SDL_BLENDMODE_NONE;
4622 float r = 0, g = 0, b = 0, a = 0;
4623 const SDL_RenderViewState *view = renderer->view;
4624 const float scale_x = view->current_scale.x;
4625 const float scale_y = view->current_scale.y;
4626
4627 // Save
4628 SDL_GetRenderDrawBlendMode(renderer, &blendMode);
4629 SDL_GetRenderDrawColorFloat(renderer, &r, &g, &b, &a);
4630
4631 if (texture) {
4632 SDL_GetTextureSize(texture, &texw, &texh);
4633 }
4634
4635 prev[0] = -1;
4636 prev[1] = -1;
4637 prev[2] = -1;
4638 size_indices = indices ? size_indices : 0;
4639
4640 for (i = 0; i < count; i += 3) {
4641 int k0, k1, k2; // Current triangle indices
4642 int is_quad = 1;
4643#if DEBUG_SW_RENDER_GEOMETRY
4644 int is_uniform = 1;
4645 int is_rectangle = 1;
4646#endif
4647 int A = -1; // Top left vertex
4648 int B = -1; // Bottom right vertex
4649 int C = -1; // Third vertex of current triangle
4650 int C2 = -1; // Last, vertex of previous triangle
4651
4652 if (size_indices == 4) {
4653 k0 = ((const Uint32 *)indices)[i];
4654 k1 = ((const Uint32 *)indices)[i + 1];
4655 k2 = ((const Uint32 *)indices)[i + 2];
4656 } else if (size_indices == 2) {
4657 k0 = ((const Uint16 *)indices)[i];
4658 k1 = ((const Uint16 *)indices)[i + 1];
4659 k2 = ((const Uint16 *)indices)[i + 2];
4660 } else if (size_indices == 1) {
4661 k0 = ((const Uint8 *)indices)[i];
4662 k1 = ((const Uint8 *)indices)[i + 1];
4663 k2 = ((const Uint8 *)indices)[i + 2];
4664 } else {
4665 /* Vertices were not provided by indices. Maybe some are duplicated.
4666 * We try to indentificate the duplicates by comparing with the previous three vertices */
4667 k0 = remap_indices(prev, i, texture, xy, xy_stride, color, color_stride, uv, uv_stride);
4668 k1 = remap_indices(prev, i + 1, texture, xy, xy_stride, color, color_stride, uv, uv_stride);
4669 k2 = remap_indices(prev, i + 2, texture, xy, xy_stride, color, color_stride, uv, uv_stride);
4670 }
4671
4672 if (prev[0] == -1) {
4673 prev[0] = k0;
4674 prev[1] = k1;
4675 prev[2] = k2;
4676 continue;
4677 }
4678
4679 /* Two triangles forming a quadialateral,
4680 * prev and current triangles must have exactly 2 common vertices */
4681 {
4682 int cnt = 0, j = 3;
4683 while (j--) {
4684 int p = prev[j];
4685 if (p == k0 || p == k1 || p == k2) {
4686 cnt++;
4687 }
4688 }
4689 is_quad = (cnt == 2);
4690 }
4691
4692 // Identify vertices
4693 if (is_quad) {
4694 const float *xy0_, *xy1_, *xy2_;
4695 float x0, x1, x2;
4696 float y0, y1, y2;
4697 xy0_ = (const float *)((const char *)xy + k0 * xy_stride);
4698 xy1_ = (const float *)((const char *)xy + k1 * xy_stride);
4699 xy2_ = (const float *)((const char *)xy + k2 * xy_stride);
4700 x0 = xy0_[0];
4701 y0 = xy0_[1];
4702 x1 = xy1_[0];
4703 y1 = xy1_[1];
4704 x2 = xy2_[0];
4705 y2 = xy2_[1];
4706
4707 // Find top-left
4708 if (x0 <= x1 && y0 <= y1) {
4709 if (x0 <= x2 && y0 <= y2) {
4710 A = k0;
4711 } else {
4712 A = k2;
4713 }
4714 } else {
4715 if (x1 <= x2 && y1 <= y2) {
4716 A = k1;
4717 } else {
4718 A = k2;
4719 }
4720 }
4721
4722 // Find bottom-right
4723 if (x0 >= x1 && y0 >= y1) {
4724 if (x0 >= x2 && y0 >= y2) {
4725 B = k0;
4726 } else {
4727 B = k2;
4728 }
4729 } else {
4730 if (x1 >= x2 && y1 >= y2) {
4731 B = k1;
4732 } else {
4733 B = k2;
4734 }
4735 }
4736
4737 // Find C
4738 if (k0 != A && k0 != B) {
4739 C = k0;
4740 } else if (k1 != A && k1 != B) {
4741 C = k1;
4742 } else {
4743 C = k2;
4744 }
4745
4746 // Find C2
4747 if (prev[0] != A && prev[0] != B) {
4748 C2 = prev[0];
4749 } else if (prev[1] != A && prev[1] != B) {
4750 C2 = prev[1];
4751 } else {
4752 C2 = prev[2];
4753 }
4754
4755 xy0_ = (const float *)((const char *)xy + A * xy_stride);
4756 xy1_ = (const float *)((const char *)xy + B * xy_stride);
4757 xy2_ = (const float *)((const char *)xy + C * xy_stride);
4758 x0 = xy0_[0];
4759 y0 = xy0_[1];
4760 x1 = xy1_[0];
4761 y1 = xy1_[1];
4762 x2 = xy2_[0];
4763 y2 = xy2_[1];
4764
4765 // Check if triangle A B C is rectangle
4766 if ((x0 == x2 && y1 == y2) || (y0 == y2 && x1 == x2)) {
4767 // ok
4768 } else {
4769 is_quad = 0;
4770#if DEBUG_SW_RENDER_GEOMETRY
4771 is_rectangle = 0;
4772#endif
4773 }
4774
4775 xy2_ = (const float *)((const char *)xy + C2 * xy_stride);
4776 x2 = xy2_[0];
4777 y2 = xy2_[1];
4778
4779 // Check if triangle A B C2 is rectangle
4780 if ((x0 == x2 && y1 == y2) || (y0 == y2 && x1 == x2)) {
4781 // ok
4782 } else {
4783 is_quad = 0;
4784#if DEBUG_SW_RENDER_GEOMETRY
4785 is_rectangle = 0;
4786#endif
4787 }
4788 }
4789
4790 // Check if uniformly colored
4791 if (is_quad) {
4792 const SDL_FColor *col0_ = (const SDL_FColor *)((const char *)color + A * color_stride);
4793 const SDL_FColor *col1_ = (const SDL_FColor *)((const char *)color + B * color_stride);
4794 const SDL_FColor *col2_ = (const SDL_FColor *)((const char *)color + C * color_stride);
4795 const SDL_FColor *col3_ = (const SDL_FColor *)((const char *)color + C2 * color_stride);
4796 if (SDL_memcmp(col0_, col1_, sizeof(*col0_)) == 0 &&
4797 SDL_memcmp(col0_, col2_, sizeof(*col0_)) == 0 &&
4798 SDL_memcmp(col0_, col3_, sizeof(*col0_)) == 0) {
4799 // ok
4800 } else {
4801 is_quad = 0;
4802#if DEBUG_SW_RENDER_GEOMETRY
4803 is_uniform = 0;
4804#endif
4805 }
4806 }
4807
4808 // Start rendering rect
4809 if (is_quad) {
4810 SDL_FRect s;
4811 SDL_FRect d;
4812 const float *xy0_, *xy1_, *uv0_, *uv1_;
4813 const SDL_FColor *col0_ = (const SDL_FColor *)((const char *)color + k0 * color_stride);
4814
4815 xy0_ = (const float *)((const char *)xy + A * xy_stride);
4816 xy1_ = (const float *)((const char *)xy + B * xy_stride);
4817
4818 if (texture) {
4819 uv0_ = (const float *)((const char *)uv + A * uv_stride);
4820 uv1_ = (const float *)((const char *)uv + B * uv_stride);
4821 s.x = uv0_[0] * texw;
4822 s.y = uv0_[1] * texh;
4823 s.w = uv1_[0] * texw - s.x;
4824 s.h = uv1_[1] * texh - s.y;
4825 } else {
4826 s.x = s.y = s.w = s.h = 0;
4827 }
4828
4829 d.x = xy0_[0];
4830 d.y = xy0_[1];
4831 d.w = xy1_[0] - d.x;
4832 d.h = xy1_[1] - d.y;
4833
4834 // Rect + texture
4835 if (texture && s.w != 0 && s.h != 0) {
4836 SDL_SetTextureAlphaModFloat(texture, col0_->a);
4837 SDL_SetTextureColorModFloat(texture, col0_->r, col0_->g, col0_->b);
4838 if (s.w > 0 && s.h > 0) {
4839 SDL_RenderTexture(renderer, texture, &s, &d);
4840 } else {
4841 int flags = 0;
4842 if (s.w < 0) {
4843 flags |= SDL_FLIP_HORIZONTAL;
4844 s.w *= -1;
4845 s.x -= s.w;
4846 }
4847 if (s.h < 0) {
4848 flags |= SDL_FLIP_VERTICAL;
4849 s.h *= -1;
4850 s.y -= s.h;
4851 }
4852 SDL_RenderTextureRotated(renderer, texture, &s, &d, 0, NULL, (SDL_FlipMode)flags);
4853 }
4854
4855#if DEBUG_SW_RENDER_GEOMETRY
4856 SDL_Log("Rect-COPY: RGB %f %f %f - Alpha:%f - texture=%p: src=(%d,%d, %d x %d) dst (%f, %f, %f x %f)", col0_->r, col0_->g, col0_->b, col0_->a,
4857 (void *)texture, s.x, s.y, s.w, s.h, d.x, d.y, d.w, d.h);
4858#endif
4859 } else if (d.w != 0.0f && d.h != 0.0f) { // Rect, no texture
4860 SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND);
4861 SDL_SetRenderDrawColorFloat(renderer, col0_->r, col0_->g, col0_->b, col0_->a);
4862 SDL_RenderFillRect(renderer, &d);
4863#if DEBUG_SW_RENDER_GEOMETRY
4864 SDL_Log("Rect-FILL: RGB %f %f %f - Alpha:%f - texture=%p: dst (%f, %f, %f x %f)", col0_->r, col0_->g, col0_->b, col0_->a,
4865 (void *)texture, d.x, d.y, d.w, d.h);
4866 } else {
4867 SDL_Log("Rect-DISMISS: RGB %f %f %f - Alpha:%f - texture=%p: src=(%d,%d, %d x %d) dst (%f, %f, %f x %f)", col0_->r, col0_->g, col0_->b, col0_->a,
4868 (void *)texture, s.x, s.y, s.w, s.h, d.x, d.y, d.w, d.h);
4869#endif
4870 }
4871
4872 prev[0] = -1;
4873 } else {
4874 // Render triangles
4875 if (prev[0] != -1) {
4876#if DEBUG_SW_RENDER_GEOMETRY
4877 SDL_Log("Triangle %d %d %d - is_uniform:%d is_rectangle:%d", prev[0], prev[1], prev[2], is_uniform, is_rectangle);
4878#endif
4879 result = QueueCmdGeometry(renderer, texture,
4880 xy, xy_stride, color, color_stride, uv, uv_stride,
4881 num_vertices, prev, 3, 4,
4882 scale_x, scale_y, SDL_TEXTURE_ADDRESS_CLAMP);
4883 if (!result) {
4884 goto end;
4885 }
4886 }
4887
4888 prev[0] = k0;
4889 prev[1] = k1;
4890 prev[2] = k2;
4891 }
4892 } // End for (), next triangle
4893
4894 if (prev[0] != -1) {
4895 // flush the last triangle
4896#if DEBUG_SW_RENDER_GEOMETRY
4897 SDL_Log("Last triangle %d %d %d", prev[0], prev[1], prev[2]);
4898#endif
4899 result = QueueCmdGeometry(renderer, texture,
4900 xy, xy_stride, color, color_stride, uv, uv_stride,
4901 num_vertices, prev, 3, 4,
4902 scale_x, scale_y, SDL_TEXTURE_ADDRESS_CLAMP);
4903 if (!result) {
4904 goto end;
4905 }
4906 }
4907
4908end:
4909 // Restore
4910 SDL_SetRenderDrawBlendMode(renderer, blendMode);
4911 SDL_SetRenderDrawColorFloat(renderer, r, g, b, a);
4912
4913 return result;
4914}
4915#endif // SDL_VIDEO_RENDER_SW
4916
4917bool SDL_RenderGeometryRaw(SDL_Renderer *renderer,
4918 SDL_Texture *texture,
4919 const float *xy, int xy_stride,
4920 const SDL_FColor *color, int color_stride,
4921 const float *uv, int uv_stride,
4922 int num_vertices,
4923 const void *indices, int num_indices, int size_indices)
4924{
4925 int i;
4926 int count = indices ? num_indices : num_vertices;
4927 SDL_TextureAddressMode texture_address_mode;
4928
4929 CHECK_RENDERER_MAGIC(renderer, false);
4930
4931 if (!renderer->QueueGeometry) {
4932 return SDL_Unsupported();
4933 }
4934
4935 if (texture) {
4936 CHECK_TEXTURE_MAGIC(texture, false);
4937
4938 if (renderer != texture->renderer) {
4939 return SDL_SetError("Texture was not created with this renderer");
4940 }
4941 }
4942
4943 if (!xy) {
4944 return SDL_InvalidParamError("xy");
4945 }
4946
4947 if (!color) {
4948 return SDL_InvalidParamError("color");
4949 }
4950
4951 if (texture && !uv) {
4952 return SDL_InvalidParamError("uv");
4953 }
4954
4955 if (count % 3 != 0) {
4956 return SDL_InvalidParamError(indices ? "num_indices" : "num_vertices");
4957 }
4958
4959 if (indices) {
4960 if (size_indices != 1 && size_indices != 2 && size_indices != 4) {
4961 return SDL_InvalidParamError("size_indices");
4962 }
4963 } else {
4964 size_indices = 0;
4965 }
4966
4967#if DONT_DRAW_WHILE_HIDDEN
4968 // Don't draw while we're hidden
4969 if (renderer->hidden) {
4970 return true;
4971 }
4972#endif
4973
4974 if (num_vertices < 3) {
4975 return true;
4976 }
4977
4978 if (texture && texture->native) {
4979 texture = texture->native;
4980 }
4981
4982 texture_address_mode = renderer->texture_address_mode;
4983 if (texture_address_mode == SDL_TEXTURE_ADDRESS_AUTO && texture) {
4984 texture_address_mode = SDL_TEXTURE_ADDRESS_CLAMP;
4985 for (i = 0; i < num_vertices; ++i) {
4986 const float *uv_ = (const float *)((const char *)uv + i * uv_stride);
4987 float u = uv_[0];
4988 float v = uv_[1];
4989 if (u < 0.0f || v < 0.0f || u > 1.0f || v > 1.0f) {
4990 texture_address_mode = SDL_TEXTURE_ADDRESS_WRAP;
4991 break;
4992 }
4993 }
4994 }
4995
4996 if (indices) {
4997 for (i = 0; i < num_indices; ++i) {
4998 int j;
4999 if (size_indices == 4) {
5000 j = ((const Uint32 *)indices)[i];
5001 } else if (size_indices == 2) {
5002 j = ((const Uint16 *)indices)[i];
5003 } else {
5004 j = ((const Uint8 *)indices)[i];
5005 }
5006 if (j < 0 || j >= num_vertices) {
5007 return SDL_SetError("Values of 'indices' out of bounds");
5008 }
5009 }
5010 }
5011
5012 if (texture) {
5013 texture->last_command_generation = renderer->render_command_generation;
5014 }
5015
5016 // For the software renderer, try to reinterpret triangles as SDL_Rect
5017#ifdef SDL_VIDEO_RENDER_SW
5018 if (renderer->software && texture_address_mode == SDL_TEXTURE_ADDRESS_CLAMP) {
5019 return SDL_SW_RenderGeometryRaw(renderer, texture,
5020 xy, xy_stride, color, color_stride, uv, uv_stride, num_vertices,
5021 indices, num_indices, size_indices);
5022 }
5023#endif
5024
5025 const SDL_RenderViewState *view = renderer->view;
5026 return QueueCmdGeometry(renderer, texture,
5027 xy, xy_stride, color, color_stride, uv, uv_stride,
5028 num_vertices, indices, num_indices, size_indices,
5029 view->current_scale.x, view->current_scale.y,
5030 texture_address_mode);
5031}
5032
5033SDL_Surface *SDL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
5034{
5035 CHECK_RENDERER_MAGIC(renderer, NULL);
5036
5037 if (!renderer->RenderReadPixels) {
5038 SDL_Unsupported();
5039 return NULL;
5040 }
5041
5042 FlushRenderCommands(renderer); // we need to render before we read the results.
5043
5044 SDL_Rect real_rect = renderer->view->pixel_viewport;
5045
5046 if (rect) {
5047 if (!SDL_GetRectIntersection(rect, &real_rect, &real_rect)) {
5048 SDL_SetError("Can't read outside the current viewport");
5049 return NULL;
5050 }
5051 }
5052
5053 SDL_Surface *surface = renderer->RenderReadPixels(renderer, &real_rect);
5054 if (surface) {
5055 SDL_PropertiesID props = SDL_GetSurfaceProperties(surface);
5056
5057 if (renderer->target) {
5058 SDL_Texture *target = renderer->target;
5059 SDL_Texture *parent = SDL_GetPointerProperty(SDL_GetTextureProperties(target), SDL_PROP_TEXTURE_PARENT_POINTER, NULL);
5060 SDL_PixelFormat expected_format = (parent ? parent->format : target->format);
5061
5062 SDL_SetFloatProperty(props, SDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT, target->SDR_white_point);
5063 SDL_SetFloatProperty(props, SDL_PROP_SURFACE_HDR_HEADROOM_FLOAT, target->HDR_headroom);
5064
5065 // Set the expected surface format
5066 if ((surface->format == SDL_PIXELFORMAT_ARGB8888 && expected_format == SDL_PIXELFORMAT_XRGB8888) ||
5067 (surface->format == SDL_PIXELFORMAT_RGBA8888 && expected_format == SDL_PIXELFORMAT_RGBX8888) ||
5068 (surface->format == SDL_PIXELFORMAT_ABGR8888 && expected_format == SDL_PIXELFORMAT_XBGR8888) ||
5069 (surface->format == SDL_PIXELFORMAT_BGRA8888 && expected_format == SDL_PIXELFORMAT_BGRX8888)) {
5070 surface->format = expected_format;
5071 surface->fmt = SDL_GetPixelFormatDetails(expected_format);
5072 }
5073 } else {
5074 SDL_SetFloatProperty(props, SDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT, renderer->SDR_white_point);
5075 SDL_SetFloatProperty(props, SDL_PROP_SURFACE_HDR_HEADROOM_FLOAT, renderer->HDR_headroom);
5076 }
5077 }
5078 return surface;
5079}
5080
5081static void SDL_RenderApplyWindowShape(SDL_Renderer *renderer)
5082{
5083 SDL_Surface *shape = (SDL_Surface *)SDL_GetPointerProperty(SDL_GetWindowProperties(renderer->window), SDL_PROP_WINDOW_SHAPE_POINTER, NULL);
5084 if (shape != renderer->shape_surface) {
5085 if (renderer->shape_texture) {
5086 SDL_DestroyTexture(renderer->shape_texture);
5087 renderer->shape_texture = NULL;
5088 }
5089
5090 if (shape) {
5091 // There's nothing we can do if this fails, so just keep on going
5092 renderer->shape_texture = SDL_CreateTextureFromSurface(renderer, shape);
5093
5094 SDL_SetTextureBlendMode(renderer->shape_texture,
5095 SDL_ComposeCustomBlendMode(
5096 SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDOPERATION_ADD,
5097 SDL_BLENDFACTOR_ZERO, SDL_BLENDFACTOR_SRC_ALPHA, SDL_BLENDOPERATION_ADD));
5098 }
5099 renderer->shape_surface = shape;
5100 }
5101
5102 if (renderer->shape_texture) {
5103 SDL_RenderTexture(renderer, renderer->shape_texture, NULL, NULL);
5104 }
5105}
5106
5107static void SDL_SimulateRenderVSync(SDL_Renderer *renderer)
5108{
5109 Uint64 now, elapsed;
5110 const Uint64 interval = renderer->simulate_vsync_interval_ns;
5111
5112 if (!interval) {
5113 // We can't do sub-ns delay, so just return here
5114 return;
5115 }
5116
5117 now = SDL_GetTicksNS();
5118 elapsed = (now - renderer->last_present);
5119 if (elapsed < interval) {
5120 Uint64 duration = (interval - elapsed);
5121 SDL_DelayPrecise(duration);
5122 now = SDL_GetTicksNS();
5123 }
5124
5125 elapsed = (now - renderer->last_present);
5126 if (!renderer->last_present || elapsed > SDL_MS_TO_NS(1000)) {
5127 // It's been too long, reset the presentation timeline
5128 renderer->last_present = now;
5129 } else {
5130 renderer->last_present += (elapsed / interval) * interval;
5131 }
5132}
5133
5134bool SDL_RenderPresent(SDL_Renderer *renderer)
5135{
5136 bool presented = true;
5137
5138 CHECK_RENDERER_MAGIC(renderer, false);
5139
5140 SDL_Texture *target = renderer->target;
5141 if (target) {
5142 SDL_SetRenderTarget(renderer, NULL);
5143 }
5144
5145 SDL_RenderLogicalPresentation(renderer);
5146
5147 if (renderer->transparent_window) {
5148 SDL_RenderApplyWindowShape(renderer);
5149 }
5150
5151 FlushRenderCommands(renderer); // time to send everything to the GPU!
5152
5153#if DONT_DRAW_WHILE_HIDDEN
5154 // Don't present while we're hidden
5155 if (renderer->hidden) {
5156 presented = false;
5157 } else
5158#endif
5159 if (!renderer->RenderPresent(renderer)) {
5160 presented = false;
5161 }
5162
5163 if (target) {
5164 SDL_SetRenderTarget(renderer, target);
5165 }
5166
5167 if (renderer->simulate_vsync ||
5168 (!presented && renderer->wanted_vsync)) {
5169 SDL_SimulateRenderVSync(renderer);
5170 }
5171 return true;
5172}
5173
5174static void SDL_DestroyTextureInternal(SDL_Texture *texture, bool is_destroying)
5175{
5176 SDL_Renderer *renderer;
5177
5178 SDL_DestroyProperties(texture->props);
5179
5180 renderer = texture->renderer;
5181 if (is_destroying) {
5182 // Renderer get destroyed, avoid to queue more commands
5183 } else {
5184 if (texture == renderer->target) {
5185 SDL_SetRenderTarget(renderer, NULL); // implies command queue flush
5186 } else {
5187 FlushRenderCommandsIfTextureNeeded(texture);
5188 }
5189 }
5190
5191 SDL_SetObjectValid(texture, SDL_OBJECT_TYPE_TEXTURE, false);
5192
5193 if (texture->next) {
5194 texture->next->prev = texture->prev;
5195 }
5196 if (texture->prev) {
5197 texture->prev->next = texture->next;
5198 } else {
5199 renderer->textures = texture->next;
5200 }
5201
5202 if (texture->native) {
5203 SDL_DestroyTextureInternal(texture->native, is_destroying);
5204 }
5205#ifdef SDL_HAVE_YUV
5206 if (texture->yuv) {
5207 SDL_SW_DestroyYUVTexture(texture->yuv);
5208 }
5209#endif
5210 SDL_free(texture->pixels);
5211
5212 renderer->DestroyTexture(renderer, texture);
5213
5214 SDL_DestroySurface(texture->locked_surface);
5215 texture->locked_surface = NULL;
5216
5217 SDL_free(texture);
5218}
5219
5220void SDL_DestroyTexture(SDL_Texture *texture)
5221{
5222 CHECK_TEXTURE_MAGIC(texture, );
5223
5224 if (--texture->refcount > 0) {
5225 return;
5226 }
5227
5228 SDL_DestroyTextureInternal(texture, false /* is_destroying */);
5229}
5230
5231static void SDL_DiscardAllCommands(SDL_Renderer *renderer)
5232{
5233 SDL_RenderCommand *cmd;
5234
5235 if (renderer->render_commands_tail) {
5236 renderer->render_commands_tail->next = renderer->render_commands_pool;
5237 cmd = renderer->render_commands;
5238 } else {
5239 cmd = renderer->render_commands_pool;
5240 }
5241
5242 renderer->render_commands_pool = NULL;
5243 renderer->render_commands_tail = NULL;
5244 renderer->render_commands = NULL;
5245 renderer->vertex_data_used = 0;
5246
5247 while (cmd) {
5248 SDL_RenderCommand *next = cmd->next;
5249 SDL_free(cmd);
5250 cmd = next;
5251 }
5252}
5253
5254void SDL_DestroyRendererWithoutFreeing(SDL_Renderer *renderer)
5255{
5256 SDL_assert(renderer != NULL);
5257 SDL_assert(!renderer->destroyed);
5258
5259 renderer->destroyed = true;
5260
5261 SDL_RemoveWindowEventWatch(SDL_WINDOW_EVENT_WATCH_NORMAL, SDL_RendererEventWatch, renderer);
5262
5263 if (renderer->window) {
5264 SDL_PropertiesID props = SDL_GetWindowProperties(renderer->window);
5265 if (SDL_GetPointerProperty(props, SDL_PROP_WINDOW_RENDERER_POINTER, NULL) == renderer) {
5266 SDL_ClearProperty(props, SDL_PROP_WINDOW_RENDERER_POINTER);
5267 }
5268 SDL_RemoveWindowRenderer(renderer->window, renderer);
5269 }
5270
5271 if (renderer->software) {
5272 // Make sure all drawing to a surface is complete
5273 FlushRenderCommands(renderer);
5274 }
5275 SDL_DiscardAllCommands(renderer);
5276
5277 if (renderer->debug_char_texture_atlas) {
5278 SDL_DestroyTexture(renderer->debug_char_texture_atlas);
5279 renderer->debug_char_texture_atlas = NULL;
5280 }
5281
5282 // Free existing textures for this renderer
5283 while (renderer->textures) {
5284 SDL_Texture *tex = renderer->textures;
5285 SDL_DestroyTextureInternal(renderer->textures, true /* is_destroying */);
5286 SDL_assert(tex != renderer->textures); // satisfy static analysis.
5287 }
5288
5289 // Clean up renderer-specific resources
5290 if (renderer->DestroyRenderer) {
5291 renderer->DestroyRenderer(renderer);
5292 }
5293
5294 if (renderer->target_mutex) {
5295 SDL_DestroyMutex(renderer->target_mutex);
5296 renderer->target_mutex = NULL;
5297 }
5298 if (renderer->vertex_data) {
5299 SDL_free(renderer->vertex_data);
5300 renderer->vertex_data = NULL;
5301 }
5302 if (renderer->texture_formats) {
5303 SDL_free(renderer->texture_formats);
5304 renderer->texture_formats = NULL;
5305 }
5306 if (renderer->props) {
5307 SDL_DestroyProperties(renderer->props);
5308 renderer->props = 0;
5309 }
5310}
5311
5312void SDL_DestroyRenderer(SDL_Renderer *renderer)
5313{
5314 CHECK_RENDERER_MAGIC_BUT_NOT_DESTROYED_FLAG(renderer,);
5315
5316 // if we've already destroyed the renderer through SDL_DestroyWindow, we just need
5317 // to free the renderer pointer. This lets apps destroy the window and renderer
5318 // in either order.
5319 if (!renderer->destroyed) {
5320 SDL_DestroyRendererWithoutFreeing(renderer);
5321 }
5322
5323 SDL_Renderer *curr = SDL_renderers;
5324 SDL_Renderer *prev = NULL;
5325 while (curr) {
5326 if (curr == renderer) {
5327 if (prev) {
5328 prev->next = renderer->next;
5329 } else {
5330 SDL_renderers = renderer->next;
5331 }
5332 break;
5333 }
5334 prev = curr;
5335 curr = curr->next;
5336 }
5337
5338 SDL_SetObjectValid(renderer, SDL_OBJECT_TYPE_RENDERER, false); // It's no longer magical...
5339
5340 SDL_free(renderer);
5341}
5342
5343void *SDL_GetRenderMetalLayer(SDL_Renderer *renderer)
5344{
5345 CHECK_RENDERER_MAGIC(renderer, NULL);
5346
5347 if (renderer->GetMetalLayer) {
5348 FlushRenderCommands(renderer); // in case the app is going to mess with it.
5349 return renderer->GetMetalLayer(renderer);
5350 }
5351 return NULL;
5352}
5353
5354void *SDL_GetRenderMetalCommandEncoder(SDL_Renderer *renderer)
5355{
5356 CHECK_RENDERER_MAGIC(renderer, NULL);
5357
5358 if (renderer->GetMetalCommandEncoder) {
5359 FlushRenderCommands(renderer); // in case the app is going to mess with it.
5360 return renderer->GetMetalCommandEncoder(renderer);
5361 }
5362 return NULL;
5363}
5364
5365bool SDL_AddVulkanRenderSemaphores(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore)
5366{
5367 CHECK_RENDERER_MAGIC(renderer, false);
5368
5369 if (!renderer->AddVulkanRenderSemaphores) {
5370 return SDL_Unsupported();
5371 }
5372 return renderer->AddVulkanRenderSemaphores(renderer, wait_stage_mask, wait_semaphore, signal_semaphore);
5373}
5374
5375static SDL_BlendMode SDL_GetShortBlendMode(SDL_BlendMode blendMode)
5376{
5377 if (blendMode == SDL_BLENDMODE_NONE_FULL) {
5378 return SDL_BLENDMODE_NONE;
5379 }
5380 if (blendMode == SDL_BLENDMODE_BLEND_FULL) {
5381 return SDL_BLENDMODE_BLEND;
5382 }
5383 if (blendMode == SDL_BLENDMODE_BLEND_PREMULTIPLIED_FULL) {
5384 return SDL_BLENDMODE_BLEND_PREMULTIPLIED;
5385 }
5386 if (blendMode == SDL_BLENDMODE_ADD_FULL) {
5387 return SDL_BLENDMODE_ADD;
5388 }
5389 if (blendMode == SDL_BLENDMODE_ADD_PREMULTIPLIED_FULL) {
5390 return SDL_BLENDMODE_ADD_PREMULTIPLIED;
5391 }
5392 if (blendMode == SDL_BLENDMODE_MOD_FULL) {
5393 return SDL_BLENDMODE_MOD;
5394 }
5395 if (blendMode == SDL_BLENDMODE_MUL_FULL) {
5396 return SDL_BLENDMODE_MUL;
5397 }
5398 return blendMode;
5399}
5400
5401static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
5402{
5403 if (blendMode == SDL_BLENDMODE_NONE) {
5404 return SDL_BLENDMODE_NONE_FULL;
5405 }
5406 if (blendMode == SDL_BLENDMODE_BLEND) {
5407 return SDL_BLENDMODE_BLEND_FULL;
5408 }
5409 if (blendMode == SDL_BLENDMODE_BLEND_PREMULTIPLIED) {
5410 return SDL_BLENDMODE_BLEND_PREMULTIPLIED_FULL;
5411 }
5412 if (blendMode == SDL_BLENDMODE_ADD) {
5413 return SDL_BLENDMODE_ADD_FULL;
5414 }
5415 if (blendMode == SDL_BLENDMODE_ADD_PREMULTIPLIED) {
5416 return SDL_BLENDMODE_ADD_PREMULTIPLIED_FULL;
5417 }
5418 if (blendMode == SDL_BLENDMODE_MOD) {
5419 return SDL_BLENDMODE_MOD_FULL;
5420 }
5421 if (blendMode == SDL_BLENDMODE_MUL) {
5422 return SDL_BLENDMODE_MUL_FULL;
5423 }
5424 return blendMode;
5425}
5426
5427SDL_BlendMode SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor, SDL_BlendFactor dstColorFactor,
5428 SDL_BlendOperation colorOperation,
5429 SDL_BlendFactor srcAlphaFactor, SDL_BlendFactor dstAlphaFactor,
5430 SDL_BlendOperation alphaOperation)
5431{
5432 SDL_BlendMode blendMode = SDL_COMPOSE_BLENDMODE(srcColorFactor, dstColorFactor, colorOperation,
5433 srcAlphaFactor, dstAlphaFactor, alphaOperation);
5434 return SDL_GetShortBlendMode(blendMode);
5435}
5436
5437SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode)
5438{
5439 blendMode = SDL_GetLongBlendMode(blendMode);
5440 return (SDL_BlendFactor)(((Uint32)blendMode >> 4) & 0xF);
5441}
5442
5443SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode)
5444{
5445 blendMode = SDL_GetLongBlendMode(blendMode);
5446 return (SDL_BlendFactor)(((Uint32)blendMode >> 8) & 0xF);
5447}
5448
5449SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode)
5450{
5451 blendMode = SDL_GetLongBlendMode(blendMode);
5452 return (SDL_BlendOperation)(((Uint32)blendMode >> 0) & 0xF);
5453}
5454
5455SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode)
5456{
5457 blendMode = SDL_GetLongBlendMode(blendMode);
5458 return (SDL_BlendFactor)(((Uint32)blendMode >> 20) & 0xF);
5459}
5460
5461SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode)
5462{
5463 blendMode = SDL_GetLongBlendMode(blendMode);
5464 return (SDL_BlendFactor)(((Uint32)blendMode >> 24) & 0xF);
5465}
5466
5467SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode)
5468{
5469 blendMode = SDL_GetLongBlendMode(blendMode);
5470 return (SDL_BlendOperation)(((Uint32)blendMode >> 16) & 0xF);
5471}
5472
5473bool SDL_SetRenderVSync(SDL_Renderer *renderer, int vsync)
5474{
5475 CHECK_RENDERER_MAGIC(renderer, false);
5476
5477 renderer->wanted_vsync = vsync ? true : false;
5478
5479 // for the software renderer, forward the call to the WindowTexture renderer
5480#ifdef SDL_VIDEO_RENDER_SW
5481 if (renderer->software) {
5482 if (!renderer->window) {
5483 if (!vsync) {
5484 return true;
5485 } else {
5486 return SDL_Unsupported();
5487 }
5488 }
5489 if (SDL_SetWindowTextureVSync(NULL, renderer->window, vsync)) {
5490 renderer->simulate_vsync = false;
5491 return true;
5492 }
5493 }
5494#endif
5495
5496 if (!renderer->SetVSync) {
5497 switch (vsync) {
5498 case 0:
5499 renderer->simulate_vsync = false;
5500 break;
5501 case 1:
5502 renderer->simulate_vsync = true;
5503 break;
5504 default:
5505 return SDL_Unsupported();
5506 }
5507 } else if (!renderer->SetVSync(renderer, vsync)) {
5508 if (vsync == 1) {
5509 renderer->simulate_vsync = true;
5510 } else {
5511 return false;
5512 }
5513 }
5514 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_VSYNC_NUMBER, vsync);
5515 return true;
5516}
5517
5518bool SDL_GetRenderVSync(SDL_Renderer *renderer, int *vsync)
5519{
5520 if (vsync) {
5521 *vsync = 0;
5522 }
5523
5524 CHECK_RENDERER_MAGIC(renderer, false);
5525
5526 if (vsync) {
5527 *vsync = (int)SDL_GetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_VSYNC_NUMBER, 0);
5528 }
5529 return true;
5530}
5531
5532
5533#define SDL_DEBUG_FONT_GLYPHS_PER_ROW 14
5534
5535static bool CreateDebugTextAtlas(SDL_Renderer *renderer)
5536{
5537 SDL_assert(renderer->debug_char_texture_atlas == NULL); // don't double-create it!
5538
5539 const int charWidth = SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
5540 const int charHeight = SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
5541
5542 // actually make each glyph two pixels taller/wider, to prevent scaling artifacts.
5543 const int rows = (SDL_DEBUG_FONT_NUM_GLYPHS / SDL_DEBUG_FONT_GLYPHS_PER_ROW) + 1;
5544 SDL_Surface *atlas = SDL_CreateSurface((charWidth + 2) * SDL_DEBUG_FONT_GLYPHS_PER_ROW, rows * (charHeight + 2), SDL_PIXELFORMAT_RGBA8888);
5545 if (!atlas) {
5546 return false;
5547 }
5548
5549 const int pitch = atlas->pitch;
5550 SDL_memset(atlas->pixels, '\0', atlas->h * atlas->pitch);
5551
5552 int column = 0;
5553 int row = 0;
5554 for (int glyph = 0; glyph < SDL_DEBUG_FONT_NUM_GLYPHS; glyph++) {
5555 // find top-left of this glyph in destination surface. The +2's account for glyph padding.
5556 Uint8 *linepos = (((Uint8 *)atlas->pixels) + ((row * (charHeight + 2) + 1) * pitch)) + ((column * (charWidth + 2) + 1) * sizeof (Uint32));
5557 const Uint8 *charpos = SDL_RenderDebugTextFontData + (glyph * 8);
5558
5559 // Draw the glyph to the surface...
5560 for (int iy = 0; iy < charHeight; iy++) {
5561 Uint32 *curpos = (Uint32 *)linepos;
5562 for (int ix = 0; ix < charWidth; ix++) {
5563 if ((*charpos) & (1 << ix)) {
5564 *curpos = 0xffffffff;
5565 } else {
5566 *curpos = 0;
5567 }
5568 ++curpos;
5569 }
5570 linepos += pitch;
5571 ++charpos;
5572 }
5573
5574 // move to next position (and if too far, start the next row).
5575 column++;
5576 if (column >= SDL_DEBUG_FONT_GLYPHS_PER_ROW) {
5577 row++;
5578 column = 0;
5579 }
5580 }
5581
5582 SDL_assert((row < rows) || ((row == rows) && (column == 0))); // make sure we didn't overflow the surface.
5583
5584 // Convert temp surface into texture
5585 SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, atlas);
5586 if (texture) {
5587 SDL_SetTextureScaleMode(texture, SDL_SCALEMODE_NEAREST);
5588 renderer->debug_char_texture_atlas = texture;
5589 }
5590 SDL_DestroySurface(atlas);
5591
5592 return texture != NULL;
5593}
5594
5595static bool DrawDebugCharacter(SDL_Renderer *renderer, float x, float y, Uint32 c)
5596{
5597 SDL_assert(renderer->debug_char_texture_atlas != NULL); // should have been created by now!
5598
5599 const int charWidth = SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
5600 const int charHeight = SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
5601
5602 // Character index in cache
5603 Uint32 ci = c;
5604 if ((ci <= 32) || ((ci >= 127) && (ci <= 160))) {
5605 return true; // these are just completely blank chars, don't bother doing anything.
5606 } else if (ci >= SDL_DEBUG_FONT_NUM_GLYPHS) {
5607 ci = SDL_DEBUG_FONT_NUM_GLYPHS - 1; // use our "not a valid/supported character" glyph.
5608 } else if (ci < 127) {
5609 ci -= 33; // adjust for the 33 blank glyphs at the start
5610 } else {
5611 ci -= 67; // adjust for the 33 blank glyphs at the start AND the 34 gap in the middle.
5612 }
5613
5614 const float src_x = (float) (((ci % SDL_DEBUG_FONT_GLYPHS_PER_ROW) * (charWidth + 2)) + 1);
5615 const float src_y = (float) (((ci / SDL_DEBUG_FONT_GLYPHS_PER_ROW) * (charHeight + 2)) + 1);
5616
5617 // Draw texture onto destination
5618 const SDL_FRect srect = { src_x, src_y, (float) charWidth, (float) charHeight };
5619 const SDL_FRect drect = { x, y, (float) charWidth, (float) charHeight };
5620 return SDL_RenderTexture(renderer, renderer->debug_char_texture_atlas, &srect, &drect);
5621}
5622
5623bool SDL_RenderDebugText(SDL_Renderer *renderer, float x, float y, const char *s)
5624{
5625 CHECK_RENDERER_MAGIC(renderer, false);
5626
5627 // Allocate a texture atlas for this renderer if needed.
5628 if (!renderer->debug_char_texture_atlas) {
5629 if (!CreateDebugTextAtlas(renderer)) {
5630 return false;
5631 }
5632 }
5633
5634 bool result = true;
5635
5636 Uint8 r, g, b, a;
5637 result &= SDL_GetRenderDrawColor(renderer, &r, &g, &b, &a);
5638 result &= SDL_SetTextureColorMod(renderer->debug_char_texture_atlas, r, g, b);
5639 result &= SDL_SetTextureAlphaMod(renderer->debug_char_texture_atlas, a);
5640
5641 float curx = x;
5642 Uint32 ch;
5643
5644 while (result && ((ch = SDL_StepUTF8(&s, NULL)) != 0)) {
5645 result &= DrawDebugCharacter(renderer, curx, y, ch);
5646 curx += SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE;
5647 }
5648
5649 return result;
5650}
5651
5652bool SDL_RenderDebugTextFormat(SDL_Renderer *renderer, float x, float y, SDL_PRINTF_FORMAT_STRING const char *fmt, ...)
5653{
5654 va_list ap;
5655 va_start(ap, fmt);
5656
5657 // fast path to avoid unnecessary allocation and copy. If you're going through the dynapi, there's a good chance
5658 // you _always_ hit this path, since it probably had to process varargs before calling into the jumptable.
5659 if (SDL_strcmp(fmt, "%s") == 0) {
5660 const char *str = va_arg(ap, const char *);
5661 va_end(ap);
5662 return SDL_RenderDebugText(renderer, x, y, str);
5663 }
5664
5665 char *str = NULL;
5666 const int rc = SDL_vasprintf(&str, fmt, ap);
5667 va_end(ap);
5668
5669 if (rc == -1) {
5670 return false;
5671 }
5672
5673 const bool retval = SDL_RenderDebugText(renderer, x, y, str);
5674 SDL_free(str);
5675 return retval;
5676}
diff --git a/SDL-3.2.8/src/render/SDL_render_debug_font.h b/SDL-3.2.8/src/render/SDL_render_debug_font.h
new file mode 100644
index 0000000..ca296e8
--- /dev/null
+++ b/SDL-3.2.8/src/render/SDL_render_debug_font.h
@@ -0,0 +1,2331 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_render_debug_font_h_
23#define SDL_render_debug_font_h_
24
25/* ---- 8x8 font definition ---- */
26
27/*
28; Summary: font8_8.asm
29; 8x8 monochrome bitmap fonts for rendering
30;
31; Author:
32; Marcel Sondaar
33; International Business Machines (public domain VGA fonts)
34;
35; License:
36; Public Domain
37;
38*/
39
40#define SDL_DEBUG_FONT_NUM_GLYPHS 190
41
42static const Uint8 SDL_RenderDebugTextFontData[] = {
43 // there's a gap at the start.
44
45 /*
46 * 33 0x21 '!'
47 */
48 0x18, /* 00011000 */
49 0x3c, /* 00111100 */
50 0x3c, /* 00111100 */
51 0x18, /* 00011000 */
52 0x18, /* 00011000 */
53 0x00, /* 00000000 */
54 0x18, /* 00011000 */
55 0x00, /* 00000000 */
56
57 /*
58 * 34 0x22 '"'
59 */
60 0x36, /* 01101100 */
61 0x36, /* 01101100 */
62 0x00, /* 00000000 */
63 0x00, /* 00000000 */
64 0x00, /* 00000000 */
65 0x00, /* 00000000 */
66 0x00, /* 00000000 */
67 0x00, /* 00000000 */
68
69 /*
70 * 35 0x23 '#'
71 */
72 0x36, /* 01101100 */
73 0x36, /* 01101100 */
74 0x7f, /* 11111110 */
75 0x36, /* 01101100 */
76 0x7f, /* 11111110 */
77 0x36, /* 01101100 */
78 0x36, /* 01101100 */
79 0x00, /* 00000000 */
80
81 /*
82 * 36 0x24 '$'
83 */
84 0x0c, /* 00110000 */
85 0x3e, /* 01111100 */
86 0x03, /* 11000000 */
87 0x1e, /* 01111000 */
88 0x30, /* 00001100 */
89 0x1f, /* 11111000 */
90 0x0c, /* 00110000 */
91 0x00, /* 00000000 */
92
93 /*
94 * 37 0x25 '%'
95 */
96 0x00, /* 00000000 */
97 0x63, /* 11000110 */
98 0x33, /* 11001100 */
99 0x18, /* 00011000 */
100 0x0c, /* 00110000 */
101 0x66, /* 01100110 */
102 0x63, /* 11000110 */
103 0x00, /* 00000000 */
104
105 /*
106 * 38 0x26 '&'
107 */
108 0x1c, /* 00111000 */
109 0x36, /* 01101100 */
110 0x1c, /* 00111000 */
111 0x6e, /* 01110110 */
112 0x3b, /* 11011100 */
113 0x33, /* 11001100 */
114 0x6e, /* 01110110 */
115 0x00, /* 00000000 */
116
117 /*
118 * 39 0x27 '''
119 */
120 0x06, /* 01100000 */
121 0x06, /* 01100000 */
122 0x03, /* 11000000 */
123 0x00, /* 00000000 */
124 0x00, /* 00000000 */
125 0x00, /* 00000000 */
126 0x00, /* 00000000 */
127 0x00, /* 00000000 */
128
129 /*
130 * 40 0x28 '('
131 */
132 0x18, /* 00011000 */
133 0x0c, /* 00110000 */
134 0x06, /* 01100000 */
135 0x06, /* 01100000 */
136 0x06, /* 01100000 */
137 0x0c, /* 00110000 */
138 0x18, /* 00011000 */
139 0x00, /* 00000000 */
140
141 /*
142 * 41 0x29 ')'
143 */
144 0x06, /* 01100000 */
145 0x0c, /* 00110000 */
146 0x18, /* 00011000 */
147 0x18, /* 00011000 */
148 0x18, /* 00011000 */
149 0x0c, /* 00110000 */
150 0x06, /* 01100000 */
151 0x00, /* 00000000 */
152
153 /*
154 * 42 0x2a '*'
155 */
156 0x00, /* 00000000 */
157 0x66, /* 01100110 */
158 0x3c, /* 00111100 */
159 0xff, /* 11111111 */
160 0x3c, /* 00111100 */
161 0x66, /* 01100110 */
162 0x00, /* 00000000 */
163 0x00, /* 00000000 */
164
165 /*
166 * 43 0x2b '+'
167 */
168 0x00, /* 00000000 */
169 0x0c, /* 00110000 */
170 0x0c, /* 00110000 */
171 0x3f, /* 11111100 */
172 0x0c, /* 00110000 */
173 0x0c, /* 00110000 */
174 0x00, /* 00000000 */
175 0x00, /* 00000000 */
176
177 /*
178 * 44 0x2c ','
179 */
180 0x00, /* 00000000 */
181 0x00, /* 00000000 */
182 0x00, /* 00000000 */
183 0x00, /* 00000000 */
184 0x00, /* 00000000 */
185 0x0c, /* 00110000 */
186 0x0c, /* 00110000 */
187 0x06, /* 01100000 */
188
189 /*
190 * 45 0x2d '-'
191 */
192 0x00, /* 00000000 */
193 0x00, /* 00000000 */
194 0x00, /* 00000000 */
195 0x3f, /* 11111100 */
196 0x00, /* 00000000 */
197 0x00, /* 00000000 */
198 0x00, /* 00000000 */
199 0x00, /* 00000000 */
200
201 /*
202 * 46 0x2e '.'
203 */
204 0x00, /* 00000000 */
205 0x00, /* 00000000 */
206 0x00, /* 00000000 */
207 0x00, /* 00000000 */
208 0x00, /* 00000000 */
209 0x0c, /* 00110000 */
210 0x0c, /* 00110000 */
211 0x00, /* 00000000 */
212
213 /*
214 * 47 0x2f '/'
215 */
216 0x60, /* 00000110 */
217 0x30, /* 00001100 */
218 0x18, /* 00011000 */
219 0x0c, /* 00110000 */
220 0x06, /* 01100000 */
221 0x03, /* 11000000 */
222 0x01, /* 10000000 */
223 0x00, /* 00000000 */
224
225 /*
226 * 48 0x30 '0'
227 */
228 0x3e, /* 01111100 */
229 0x63, /* 11000110 */
230 0x73, /* 11001110 */
231 0x7b, /* 11011110 */
232 0x6f, /* 11110110 */
233 0x67, /* 11100110 */
234 0x3e, /* 01111100 */
235 0x00, /* 00000000 */
236
237 /*
238 * 49 0x31 '1'
239 */
240 0x0c, /* 00110000 */
241 0x0e, /* 01110000 */
242 0x0c, /* 00110000 */
243 0x0c, /* 00110000 */
244 0x0c, /* 00110000 */
245 0x0c, /* 00110000 */
246 0x3f, /* 11111100 */
247 0x00, /* 00000000 */
248
249 /*
250 * 50 0x32 '2'
251 */
252 0x1e, /* 01111000 */
253 0x33, /* 11001100 */
254 0x30, /* 00001100 */
255 0x1c, /* 00111000 */
256 0x06, /* 01100000 */
257 0x33, /* 11001100 */
258 0x3f, /* 11111100 */
259 0x00, /* 00000000 */
260
261 /*
262 * 51 0x33 '3'
263 */
264 0x1e, /* 01111000 */
265 0x33, /* 11001100 */
266 0x30, /* 00001100 */
267 0x1c, /* 00111000 */
268 0x30, /* 00001100 */
269 0x33, /* 11001100 */
270 0x1e, /* 01111000 */
271 0x00, /* 00000000 */
272
273 /*
274 * 52 0x34 '4'
275 */
276 0x38, /* 00011100 */
277 0x3c, /* 00111100 */
278 0x36, /* 01101100 */
279 0x33, /* 11001100 */
280 0x7f, /* 11111110 */
281 0x30, /* 00001100 */
282 0x78, /* 00011110 */
283 0x00, /* 00000000 */
284
285 /*
286 * 53 0x35 '5'
287 */
288 0x3f, /* 11111100 */
289 0x03, /* 11000000 */
290 0x1f, /* 11111000 */
291 0x30, /* 00001100 */
292 0x30, /* 00001100 */
293 0x33, /* 11001100 */
294 0x1e, /* 01111000 */
295 0x00, /* 00000000 */
296
297 /*
298 * 54 0x36 '6'
299 */
300 0x1c, /* 00111000 */
301 0x06, /* 01100000 */
302 0x03, /* 11000000 */
303 0x1f, /* 11111000 */
304 0x33, /* 11001100 */
305 0x33, /* 11001100 */
306 0x1e, /* 01111000 */
307 0x00, /* 00000000 */
308
309 /*
310 * 55 0x37 '7'
311 */
312 0x3f, /* 11111100 */
313 0x33, /* 11001100 */
314 0x30, /* 00001100 */
315 0x18, /* 00011000 */
316 0x0c, /* 00110000 */
317 0x0c, /* 00110000 */
318 0x0c, /* 00110000 */
319 0x00, /* 00000000 */
320
321 /*
322 * 56 0x38 '8'
323 */
324 0x1e, /* 01111000 */
325 0x33, /* 11001100 */
326 0x33, /* 11001100 */
327 0x1e, /* 01111000 */
328 0x33, /* 11001100 */
329 0x33, /* 11001100 */
330 0x1e, /* 01111000 */
331 0x00, /* 00000000 */
332
333 /*
334 * 57 0x39 '9'
335 */
336 0x1e, /* 01111000 */
337 0x33, /* 11001100 */
338 0x33, /* 11001100 */
339 0x3e, /* 01111100 */
340 0x30, /* 00001100 */
341 0x18, /* 00011000 */
342 0x0e, /* 01110000 */
343 0x00, /* 00000000 */
344
345 /*
346 * 58 0x3a ':'
347 */
348 0x00, /* 00000000 */
349 0x0c, /* 00110000 */
350 0x0c, /* 00110000 */
351 0x00, /* 00000000 */
352 0x00, /* 00000000 */
353 0x0c, /* 00110000 */
354 0x0c, /* 00110000 */
355 0x00, /* 00000000 */
356
357 /*
358 * 59 0x3b ';'
359 */
360 0x00, /* 00000000 */
361 0x0c, /* 00110000 */
362 0x0c, /* 00110000 */
363 0x00, /* 00000000 */
364 0x00, /* 00000000 */
365 0x0c, /* 00110000 */
366 0x0c, /* 00110000 */
367 0x06, /* 01100000 */
368
369 /*
370 * 60 0x3c '<'
371 */
372 0x18, /* 00011000 */
373 0x0c, /* 00110000 */
374 0x06, /* 01100000 */
375 0x03, /* 11000000 */
376 0x06, /* 01100000 */
377 0x0c, /* 00110000 */
378 0x18, /* 00011000 */
379 0x00, /* 00000000 */
380
381 /*
382 * 61 0x3d '='
383 */
384 0x00, /* 00000000 */
385 0x00, /* 00000000 */
386 0x3f, /* 11111100 */
387 0x00, /* 00000000 */
388 0x00, /* 00000000 */
389 0x3f, /* 11111100 */
390 0x00, /* 00000000 */
391 0x00, /* 00000000 */
392
393 /*
394 * 62 0x3e '>'
395 */
396 0x06, /* 01100000 */
397 0x0c, /* 00110000 */
398 0x18, /* 00011000 */
399 0x30, /* 00001100 */
400 0x18, /* 00011000 */
401 0x0c, /* 00110000 */
402 0x06, /* 01100000 */
403 0x00, /* 00000000 */
404
405 /*
406 * 63 0x3f '?'
407 */
408 0x1e, /* 01111000 */
409 0x33, /* 11001100 */
410 0x30, /* 00001100 */
411 0x18, /* 00011000 */
412 0x0c, /* 00110000 */
413 0x00, /* 00000000 */
414 0x0c, /* 00110000 */
415 0x00, /* 00000000 */
416
417 /*
418 * 64 0x40 '@'
419 */
420 0x3e, /* 01111100 */
421 0x63, /* 11000110 */
422 0x7b, /* 11011110 */
423 0x7b, /* 11011110 */
424 0x7b, /* 11011110 */
425 0x03, /* 11000000 */
426 0x1e, /* 01111000 */
427 0x00, /* 00000000 */
428
429 /*
430 * 65 0x41 'A'
431 */
432 0x0c, /* 00110000 */
433 0x1e, /* 01111000 */
434 0x33, /* 11001100 */
435 0x33, /* 11001100 */
436 0x3f, /* 11111100 */
437 0x33, /* 11001100 */
438 0x33, /* 11001100 */
439 0x00, /* 00000000 */
440
441 /*
442 * 66 0x42 'B'
443 */
444 0x3f, /* 11111100 */
445 0x66, /* 01100110 */
446 0x66, /* 01100110 */
447 0x3e, /* 01111100 */
448 0x66, /* 01100110 */
449 0x66, /* 01100110 */
450 0x3f, /* 11111100 */
451 0x00, /* 00000000 */
452
453 /*
454 * 67 0x43 'C'
455 */
456 0x3c, /* 00111100 */
457 0x66, /* 01100110 */
458 0x03, /* 11000000 */
459 0x03, /* 11000000 */
460 0x03, /* 11000000 */
461 0x66, /* 01100110 */
462 0x3c, /* 00111100 */
463 0x00, /* 00000000 */
464
465 /*
466 * 68 0x44 'D'
467 */
468 0x1f, /* 11111000 */
469 0x36, /* 01101100 */
470 0x66, /* 01100110 */
471 0x66, /* 01100110 */
472 0x66, /* 01100110 */
473 0x36, /* 01101100 */
474 0x1f, /* 11111000 */
475 0x00, /* 00000000 */
476
477 /*
478 * 69 0x45 'E'
479 */
480 0x7f, /* 11111110 */
481 0x46, /* 01100010 */
482 0x16, /* 01101000 */
483 0x1e, /* 01111000 */
484 0x16, /* 01101000 */
485 0x46, /* 01100010 */
486 0x7f, /* 11111110 */
487 0x00, /* 00000000 */
488
489 /*
490 * 70 0x46 'F'
491 */
492 0x7f, /* 11111110 */
493 0x46, /* 01100010 */
494 0x16, /* 01101000 */
495 0x1e, /* 01111000 */
496 0x16, /* 01101000 */
497 0x06, /* 01100000 */
498 0x0f, /* 11110000 */
499 0x00, /* 00000000 */
500
501 /*
502 * 71 0x47 'G'
503 */
504 0x3c, /* 00111100 */
505 0x66, /* 01100110 */
506 0x03, /* 11000000 */
507 0x03, /* 11000000 */
508 0x73, /* 11001110 */
509 0x66, /* 01100110 */
510 0x7c, /* 00111110 */
511 0x00, /* 00000000 */
512
513 /*
514 * 72 0x48 'H'
515 */
516 0x33, /* 11001100 */
517 0x33, /* 11001100 */
518 0x33, /* 11001100 */
519 0x3f, /* 11111100 */
520 0x33, /* 11001100 */
521 0x33, /* 11001100 */
522 0x33, /* 11001100 */
523 0x00, /* 00000000 */
524
525 /*
526 * 73 0x49 'I'
527 */
528 0x1e, /* 01111000 */
529 0x0c, /* 00110000 */
530 0x0c, /* 00110000 */
531 0x0c, /* 00110000 */
532 0x0c, /* 00110000 */
533 0x0c, /* 00110000 */
534 0x1e, /* 01111000 */
535 0x00, /* 00000000 */
536
537 /*
538 * 74 0x4a 'J'
539 */
540 0x78, /* 00011110 */
541 0x30, /* 00001100 */
542 0x30, /* 00001100 */
543 0x30, /* 00001100 */
544 0x33, /* 11001100 */
545 0x33, /* 11001100 */
546 0x1e, /* 01111000 */
547 0x00, /* 00000000 */
548
549 /*
550 * 75 0x4b 'K'
551 */
552 0x67, /* 11100110 */
553 0x66, /* 01100110 */
554 0x36, /* 01101100 */
555 0x1e, /* 01111000 */
556 0x36, /* 01101100 */
557 0x66, /* 01100110 */
558 0x67, /* 11100110 */
559 0x00, /* 00000000 */
560
561 /*
562 * 76 0x4c 'L'
563 */
564 0x0f, /* 11110000 */
565 0x06, /* 01100000 */
566 0x06, /* 01100000 */
567 0x06, /* 01100000 */
568 0x46, /* 01100010 */
569 0x66, /* 01100110 */
570 0x7f, /* 11111110 */
571 0x00, /* 00000000 */
572
573 /*
574 * 77 0x4d 'M'
575 */
576 0x63, /* 11000110 */
577 0x77, /* 11101110 */
578 0x7f, /* 11111110 */
579 0x7f, /* 11111110 */
580 0x6b, /* 11010110 */
581 0x63, /* 11000110 */
582 0x63, /* 11000110 */
583 0x00, /* 00000000 */
584
585 /*
586 * 78 0x4e 'N'
587 */
588 0x63, /* 11000110 */
589 0x67, /* 11100110 */
590 0x6f, /* 11110110 */
591 0x7b, /* 11011110 */
592 0x73, /* 11001110 */
593 0x63, /* 11000110 */
594 0x63, /* 11000110 */
595 0x00, /* 00000000 */
596
597 /*
598 * 79 0x4f 'O'
599 */
600 0x1c, /* 00111000 */
601 0x36, /* 01101100 */
602 0x63, /* 11000110 */
603 0x63, /* 11000110 */
604 0x63, /* 11000110 */
605 0x36, /* 01101100 */
606 0x1c, /* 00111000 */
607 0x00, /* 00000000 */
608
609 /*
610 * 80 0x50 'P'
611 */
612 0x3f, /* 11111100 */
613 0x66, /* 01100110 */
614 0x66, /* 01100110 */
615 0x3e, /* 01111100 */
616 0x06, /* 01100000 */
617 0x06, /* 01100000 */
618 0x0f, /* 11110000 */
619 0x00, /* 00000000 */
620
621 /*
622 * 81 0x51 'Q'
623 */
624 0x1e, /* 01111000 */
625 0x33, /* 11001100 */
626 0x33, /* 11001100 */
627 0x33, /* 11001100 */
628 0x3b, /* 11011100 */
629 0x1e, /* 01111000 */
630 0x38, /* 00011100 */
631 0x00, /* 00000000 */
632
633 /*
634 * 82 0x52 'R'
635 */
636 0x3f, /* 11111100 */
637 0x66, /* 01100110 */
638 0x66, /* 01100110 */
639 0x3e, /* 01111100 */
640 0x36, /* 01101100 */
641 0x66, /* 01100110 */
642 0x67, /* 11100110 */
643 0x00, /* 00000000 */
644
645 /*
646 * 83 0x53 'S'
647 */
648 0x1e, /* 01111000 */
649 0x33, /* 11001100 */
650 0x07, /* 11100000 */
651 0x0e, /* 01110000 */
652 0x38, /* 00011100 */
653 0x33, /* 11001100 */
654 0x1e, /* 01111000 */
655 0x00, /* 00000000 */
656
657 /*
658 * 84 0x54 'T'
659 */
660 0x3f, /* 11111100 */
661 0x2d, /* 10110100 */
662 0x0c, /* 00110000 */
663 0x0c, /* 00110000 */
664 0x0c, /* 00110000 */
665 0x0c, /* 00110000 */
666 0x1e, /* 01111000 */
667 0x00, /* 00000000 */
668
669 /*
670 * 85 0x55 'U'
671 */
672 0x33, /* 11001100 */
673 0x33, /* 11001100 */
674 0x33, /* 11001100 */
675 0x33, /* 11001100 */
676 0x33, /* 11001100 */
677 0x33, /* 11001100 */
678 0x3f, /* 11111100 */
679 0x00, /* 00000000 */
680
681 /*
682 * 86 0x56 'V'
683 */
684 0x33, /* 11001100 */
685 0x33, /* 11001100 */
686 0x33, /* 11001100 */
687 0x33, /* 11001100 */
688 0x33, /* 11001100 */
689 0x1e, /* 01111000 */
690 0x0c, /* 00110000 */
691 0x00, /* 00000000 */
692
693 /*
694 * 87 0x57 'W'
695 */
696 0x63, /* 11000110 */
697 0x63, /* 11000110 */
698 0x63, /* 11000110 */
699 0x6b, /* 11010110 */
700 0x7f, /* 11111110 */
701 0x77, /* 11101110 */
702 0x63, /* 11000110 */
703 0x00, /* 00000000 */
704
705 /*
706 * 88 0x58 'X'
707 */
708 0x63, /* 11000110 */
709 0x63, /* 11000110 */
710 0x36, /* 01101100 */
711 0x1c, /* 00111000 */
712 0x1c, /* 00111000 */
713 0x36, /* 01101100 */
714 0x63, /* 11000110 */
715 0x00, /* 00000000 */
716
717 /*
718 * 89 0x59 'Y'
719 */
720 0x33, /* 11001100 */
721 0x33, /* 11001100 */
722 0x33, /* 11001100 */
723 0x1e, /* 01111000 */
724 0x0c, /* 00110000 */
725 0x0c, /* 00110000 */
726 0x1e, /* 01111000 */
727 0x00, /* 00000000 */
728
729 /*
730 * 90 0x5a 'Z'
731 */
732 0x7f, /* 11111110 */
733 0x63, /* 11000110 */
734 0x31, /* 10001100 */
735 0x18, /* 00011000 */
736 0x4c, /* 00110010 */
737 0x66, /* 01100110 */
738 0x7f, /* 11111110 */
739 0x00, /* 00000000 */
740
741 /*
742 * 91 0x5b '['
743 */
744 0x1e, /* 01111000 */
745 0x06, /* 01100000 */
746 0x06, /* 01100000 */
747 0x06, /* 01100000 */
748 0x06, /* 01100000 */
749 0x06, /* 01100000 */
750 0x1e, /* 01111000 */
751 0x00, /* 00000000 */
752
753 /*
754 * 92 0x5c '\'
755 */
756 0x03, /* 11000000 */
757 0x06, /* 01100000 */
758 0x0c, /* 00110000 */
759 0x18, /* 00011000 */
760 0x30, /* 00001100 */
761 0x60, /* 00000110 */
762 0x40, /* 00000010 */
763 0x00, /* 00000000 */
764
765 /*
766 * 93 0x5d ']'
767 */
768 0x1e, /* 01111000 */
769 0x18, /* 00011000 */
770 0x18, /* 00011000 */
771 0x18, /* 00011000 */
772 0x18, /* 00011000 */
773 0x18, /* 00011000 */
774 0x1e, /* 01111000 */
775 0x00, /* 00000000 */
776
777 /*
778 * 94 0x5e '^'
779 */
780 0x08, /* 00010000 */
781 0x1c, /* 00111000 */
782 0x36, /* 01101100 */
783 0x63, /* 11000110 */
784 0x00, /* 00000000 */
785 0x00, /* 00000000 */
786 0x00, /* 00000000 */
787 0x00, /* 00000000 */
788
789 /*
790 * 95 0x5f '_'
791 */
792 0x00, /* 00000000 */
793 0x00, /* 00000000 */
794 0x00, /* 00000000 */
795 0x00, /* 00000000 */
796 0x00, /* 00000000 */
797 0x00, /* 00000000 */
798 0x00, /* 00000000 */
799 0xff, /* 11111111 */
800
801 /*
802 * 96 0x60 '`'
803 */
804 0x0c, /* 00110000 */
805 0x0c, /* 00110000 */
806 0x18, /* 00011000 */
807 0x00, /* 00000000 */
808 0x00, /* 00000000 */
809 0x00, /* 00000000 */
810 0x00, /* 00000000 */
811 0x00, /* 00000000 */
812
813 /*
814 * 97 0x61 'a'
815 */
816 0x00, /* 00000000 */
817 0x00, /* 00000000 */
818 0x1e, /* 01111000 */
819 0x30, /* 00001100 */
820 0x3e, /* 01111100 */
821 0x33, /* 11001100 */
822 0x6e, /* 01110110 */
823 0x00, /* 00000000 */
824
825 /*
826 * 98 0x62 'b'
827 */
828 0x07, /* 11100000 */
829 0x06, /* 01100000 */
830 0x06, /* 01100000 */
831 0x3e, /* 01111100 */
832 0x66, /* 01100110 */
833 0x66, /* 01100110 */
834 0x3b, /* 11011100 */
835 0x00, /* 00000000 */
836
837 /*
838 * 99 0x63 'c'
839 */
840 0x00, /* 00000000 */
841 0x00, /* 00000000 */
842 0x1e, /* 01111000 */
843 0x33, /* 11001100 */
844 0x03, /* 11000000 */
845 0x33, /* 11001100 */
846 0x1e, /* 01111000 */
847 0x00, /* 00000000 */
848
849 /*
850 * 100 0x64 'd'
851 */
852 0x38, /* 00011100 */
853 0x30, /* 00001100 */
854 0x30, /* 00001100 */
855 0x3e, /* 01111100 */
856 0x33, /* 11001100 */
857 0x33, /* 11001100 */
858 0x6e, /* 01110110 */
859 0x00, /* 00000000 */
860
861 /*
862 * 101 0x65 'e'
863 */
864 0x00, /* 00000000 */
865 0x00, /* 00000000 */
866 0x1e, /* 01111000 */
867 0x33, /* 11001100 */
868 0x3f, /* 11111100 */
869 0x03, /* 11000000 */
870 0x1e, /* 01111000 */
871 0x00, /* 00000000 */
872
873 /*
874 * 102 0x66 'f'
875 */
876 0x1c, /* 00111000 */
877 0x36, /* 01101100 */
878 0x06, /* 01100000 */
879 0x0f, /* 11110000 */
880 0x06, /* 01100000 */
881 0x06, /* 01100000 */
882 0x0f, /* 11110000 */
883 0x00, /* 00000000 */
884
885 /*
886 * 103 0x67 'g'
887 */
888 0x00, /* 00000000 */
889 0x00, /* 00000000 */
890 0x6e, /* 01110110 */
891 0x33, /* 11001100 */
892 0x33, /* 11001100 */
893 0x3e, /* 01111100 */
894 0x30, /* 00001100 */
895 0x1f, /* 11111000 */
896
897 /*
898 * 104 0x68 'h'
899 */
900 0x07, /* 11100000 */
901 0x06, /* 01100000 */
902 0x36, /* 01101100 */
903 0x6e, /* 01110110 */
904 0x66, /* 01100110 */
905 0x66, /* 01100110 */
906 0x67, /* 11100110 */
907 0x00, /* 00000000 */
908
909 /*
910 * 105 0x69 'i'
911 */
912 0x0c, /* 00110000 */
913 0x00, /* 00000000 */
914 0x0e, /* 01110000 */
915 0x0c, /* 00110000 */
916 0x0c, /* 00110000 */
917 0x0c, /* 00110000 */
918 0x1e, /* 01111000 */
919 0x00, /* 00000000 */
920
921 /*
922 * 106 0x6a 'j'
923 */
924 0x30, /* 00001100 */
925 0x00, /* 00000000 */
926 0x30, /* 00001100 */
927 0x30, /* 00001100 */
928 0x30, /* 00001100 */
929 0x33, /* 11001100 */
930 0x33, /* 11001100 */
931 0x1e, /* 01111000 */
932
933 /*
934 * 107 0x6b 'k'
935 */
936 0x07, /* 11100000 */
937 0x06, /* 01100000 */
938 0x66, /* 01100110 */
939 0x36, /* 01101100 */
940 0x1e, /* 01111000 */
941 0x36, /* 01101100 */
942 0x67, /* 11100110 */
943 0x00, /* 00000000 */
944
945 /*
946 * 108 0x6c 'l'
947 */
948 0x0e, /* 01110000 */
949 0x0c, /* 00110000 */
950 0x0c, /* 00110000 */
951 0x0c, /* 00110000 */
952 0x0c, /* 00110000 */
953 0x0c, /* 00110000 */
954 0x1e, /* 01111000 */
955 0x00, /* 00000000 */
956
957 /*
958 * 109 0x6d 'm'
959 */
960 0x00, /* 00000000 */
961 0x00, /* 00000000 */
962 0x33, /* 11001100 */
963 0x7f, /* 11111110 */
964 0x7f, /* 11111110 */
965 0x6b, /* 11010110 */
966 0x63, /* 11000110 */
967 0x00, /* 00000000 */
968
969 /*
970 * 110 0x6e 'n'
971 */
972 0x00, /* 00000000 */
973 0x00, /* 00000000 */
974 0x1f, /* 11111000 */
975 0x33, /* 11001100 */
976 0x33, /* 11001100 */
977 0x33, /* 11001100 */
978 0x33, /* 11001100 */
979 0x00, /* 00000000 */
980
981 /*
982 * 111 0x6f 'o'
983 */
984 0x00, /* 00000000 */
985 0x00, /* 00000000 */
986 0x1e, /* 01111000 */
987 0x33, /* 11001100 */
988 0x33, /* 11001100 */
989 0x33, /* 11001100 */
990 0x1e, /* 01111000 */
991 0x00, /* 00000000 */
992
993 /*
994 * 112 0x70 'p'
995 */
996 0x00, /* 00000000 */
997 0x00, /* 00000000 */
998 0x3b, /* 11011100 */
999 0x66, /* 01100110 */
1000 0x66, /* 01100110 */
1001 0x3e, /* 01111100 */
1002 0x06, /* 01100000 */
1003 0x0f, /* 11110000 */
1004
1005 /*
1006 * 113 0x71 'q'
1007 */
1008 0x00, /* 00000000 */
1009 0x00, /* 00000000 */
1010 0x6e, /* 01110110 */
1011 0x33, /* 11001100 */
1012 0x33, /* 11001100 */
1013 0x3e, /* 01111100 */
1014 0x30, /* 00001100 */
1015 0x78, /* 00011110 */
1016
1017 /*
1018 * 114 0x72 'r'
1019 */
1020 0x00, /* 00000000 */
1021 0x00, /* 00000000 */
1022 0x3b, /* 11011100 */
1023 0x6e, /* 01110110 */
1024 0x66, /* 01100110 */
1025 0x06, /* 01100000 */
1026 0x0f, /* 11110000 */
1027 0x00, /* 00000000 */
1028
1029 /*
1030 * 115 0x73 's'
1031 */
1032 0x00, /* 00000000 */
1033 0x00, /* 00000000 */
1034 0x3e, /* 01111100 */
1035 0x03, /* 11000000 */
1036 0x1e, /* 01111000 */
1037 0x30, /* 00001100 */
1038 0x1f, /* 11111000 */
1039 0x00, /* 00000000 */
1040
1041 /*
1042 * 116 0x74 't'
1043 */
1044 0x08, /* 00010000 */
1045 0x0c, /* 00110000 */
1046 0x3e, /* 01111100 */
1047 0x0c, /* 00110000 */
1048 0x0c, /* 00110000 */
1049 0x2c, /* 00110100 */
1050 0x18, /* 00011000 */
1051 0x00, /* 00000000 */
1052
1053 /*
1054 * 117 0x75 'u'
1055 */
1056 0x00, /* 00000000 */
1057 0x00, /* 00000000 */
1058 0x33, /* 11001100 */
1059 0x33, /* 11001100 */
1060 0x33, /* 11001100 */
1061 0x33, /* 11001100 */
1062 0x6e, /* 01110110 */
1063 0x00, /* 00000000 */
1064
1065 /*
1066 * 118 0x76 'v'
1067 */
1068 0x00, /* 00000000 */
1069 0x00, /* 00000000 */
1070 0x33, /* 11001100 */
1071 0x33, /* 11001100 */
1072 0x33, /* 11001100 */
1073 0x1e, /* 01111000 */
1074 0x0c, /* 00110000 */
1075 0x00, /* 00000000 */
1076
1077 /*
1078 * 119 0x77 'w'
1079 */
1080 0x00, /* 00000000 */
1081 0x00, /* 00000000 */
1082 0x63, /* 11000110 */
1083 0x6b, /* 11010110 */
1084 0x7f, /* 11111110 */
1085 0x7f, /* 11111110 */
1086 0x36, /* 01101100 */
1087 0x00, /* 00000000 */
1088
1089 /*
1090 * 120 0x78 'x'
1091 */
1092 0x00, /* 00000000 */
1093 0x00, /* 00000000 */
1094 0x63, /* 11000110 */
1095 0x36, /* 01101100 */
1096 0x1c, /* 00111000 */
1097 0x36, /* 01101100 */
1098 0x63, /* 11000110 */
1099 0x00, /* 00000000 */
1100
1101 /*
1102 * 121 0x79 'y'
1103 */
1104 0x00, /* 00000000 */
1105 0x00, /* 00000000 */
1106 0x33, /* 11001100 */
1107 0x33, /* 11001100 */
1108 0x33, /* 11001100 */
1109 0x3e, /* 01111100 */
1110 0x30, /* 00001100 */
1111 0x1f, /* 11111000 */
1112
1113 /*
1114 * 122 0x7a 'z'
1115 */
1116 0x00, /* 00000000 */
1117 0x00, /* 00000000 */
1118 0x3f, /* 11111100 */
1119 0x19, /* 10011000 */
1120 0x0c, /* 00110000 */
1121 0x26, /* 01100100 */
1122 0x3f, /* 11111100 */
1123 0x00, /* 00000000 */
1124
1125 /*
1126 * 123 0x7b '{'
1127 */
1128 0x38, /* 00011100 */
1129 0x0c, /* 00110000 */
1130 0x0c, /* 00110000 */
1131 0x07, /* 11100000 */
1132 0x0c, /* 00110000 */
1133 0x0c, /* 00110000 */
1134 0x38, /* 00011100 */
1135 0x00, /* 00000000 */
1136
1137 /*
1138 * 124 0x7c '|'
1139 */
1140 0x18, /* 00011000 */
1141 0x18, /* 00011000 */
1142 0x18, /* 00011000 */
1143 0x00, /* 00000000 */
1144 0x18, /* 00011000 */
1145 0x18, /* 00011000 */
1146 0x18, /* 00011000 */
1147 0x00, /* 00000000 */
1148
1149 /*
1150 * 125 0x7d '}'
1151 */
1152 0x07, /* 11100000 */
1153 0x0c, /* 00110000 */
1154 0x0c, /* 00110000 */
1155 0x38, /* 00011100 */
1156 0x0c, /* 00110000 */
1157 0x0c, /* 00110000 */
1158 0x07, /* 11100000 */
1159 0x00, /* 00000000 */
1160
1161 /*
1162 * 126 0x7e '~'
1163 */
1164 0x6e, /* 01110110 */
1165 0x3b, /* 11011100 */
1166 0x00, /* 00000000 */
1167 0x00, /* 00000000 */
1168 0x00, /* 00000000 */
1169 0x00, /* 00000000 */
1170 0x00, /* 00000000 */
1171 0x00, /* 00000000 */
1172
1173 // there's a gap here.
1174
1175 /*
1176 * 161 0xa1 '¡'
1177 */
1178 0x18, /* 00011000 */
1179 0x18, /* 00011000 */
1180 0x00, /* 00000000 */
1181 0x18, /* 00011000 */
1182 0x18, /* 00011000 */
1183 0x18, /* 00011000 */
1184 0x18, /* 00011000 */
1185 0x00, /* 00000000 */
1186
1187 /*
1188 * 162 0xa2 '¢'
1189 */
1190 0x18, /* 00011000 */
1191 0x18, /* 00011000 */
1192 0x7e, /* 01111110 */
1193 0x03, /* 11000000 */
1194 0x03, /* 11000000 */
1195 0x7e, /* 01111110 */
1196 0x18, /* 00011000 */
1197 0x18, /* 00011000 */
1198
1199 /*
1200 * 163 0xa3 '£'
1201 */
1202 0x1c, /* 00111000 */
1203 0x36, /* 01101100 */
1204 0x26, /* 01100100 */
1205 0x0f, /* 11110000 */
1206 0x06, /* 01100000 */
1207 0x67, /* 11100110 */
1208 0x3f, /* 11111100 */
1209 0x00, /* 00000000 */
1210
1211 /*
1212 * 164 0xa4 '¤'
1213 */
1214 0x00, /* 00000000 */
1215 0x00, /* 00000000 */
1216 0x63, /* 11000110 */
1217 0x3e, /* 01111100 */
1218 0x36, /* 01101100 */
1219 0x3e, /* 01111100 */
1220 0x63, /* 11000110 */
1221 0x00, /* 00000000 */
1222
1223 /*
1224 * 165 0xa5 'Â¥'
1225 */
1226 0x33, /* 11001100 */
1227 0x33, /* 11001100 */
1228 0x1e, /* 01111000 */
1229 0x3f, /* 11111100 */
1230 0x0c, /* 00110000 */
1231 0x3f, /* 11111100 */
1232 0x0c, /* 00110000 */
1233 0x0c, /* 00110000 */
1234
1235 /*
1236 * 166 0xa6 '¦'
1237 */
1238 0x18, /* 00011000 */
1239 0x18, /* 00011000 */
1240 0x18, /* 00011000 */
1241 0x00, /* 00000000 */
1242 0x18, /* 00011000 */
1243 0x18, /* 00011000 */
1244 0x18, /* 00011000 */
1245 0x00, /* 00000000 */
1246
1247 /*
1248 * 167 0xa7 '§'
1249 */
1250 0x7c, /* 00111110 */
1251 0xc6, /* 01100011 */
1252 0x1c, /* 00111000 */
1253 0x36, /* 01101100 */
1254 0x36, /* 01101100 */
1255 0x1c, /* 00111000 */
1256 0x33, /* 11001100 */
1257 0x1e, /* 01111000 */
1258
1259 /*
1260 * 168 0xa8 '¨'
1261 */
1262 0x33, /* 11001100 */
1263 0x00, /* 00000000 */
1264 0x00, /* 00000000 */
1265 0x00, /* 00000000 */
1266 0x00, /* 00000000 */
1267 0x00, /* 00000000 */
1268 0x00, /* 00000000 */
1269 0x00, /* 00000000 */
1270
1271 /*
1272 * 169 0xa9 '©'
1273 */
1274 0x3c, /* 00111100 */
1275 0x42, /* 01000010 */
1276 0x99, /* 10011001 */
1277 0x85, /* 10100001 */
1278 0x85, /* 10100001 */
1279 0x99, /* 10011001 */
1280 0x42, /* 01000010 */
1281 0x3c, /* 00111100 */
1282
1283 /*
1284 * 170 0xaa 'ª'
1285 */
1286 0x3c, /* 00111100 */
1287 0x36, /* 01101100 */
1288 0x36, /* 01101100 */
1289 0x7c, /* 00111110 */
1290 0x00, /* 00000000 */
1291 0x00, /* 00000000 */
1292 0x00, /* 00000000 */
1293 0x00, /* 00000000 */
1294
1295 /*
1296 * 171 0xab '«'
1297 */
1298 0x00, /* 00000000 */
1299 0xcc, /* 00110011 */
1300 0x66, /* 01100110 */
1301 0x33, /* 11001100 */
1302 0x66, /* 01100110 */
1303 0xcc, /* 00110011 */
1304 0x00, /* 00000000 */
1305 0x00, /* 00000000 */
1306
1307 /*
1308 * 172 0xac '¬'
1309 */
1310 0x00, /* 00000000 */
1311 0x00, /* 00000000 */
1312 0x00, /* 00000000 */
1313 0x3f, /* 11111100 */
1314 0x30, /* 00001100 */
1315 0x30, /* 00001100 */
1316 0x00, /* 00000000 */
1317 0x00, /* 00000000 */
1318
1319 /*
1320 * 173 0xad '­'
1321 */
1322 0x00, /* 00000000 */
1323 0x00, /* 00000000 */
1324 0x00, /* 00000000 */
1325 0x00, /* 00000000 */
1326 0x00, /* 00000000 */
1327 0x00, /* 00000000 */
1328 0x00, /* 00000000 */
1329 0x00, /* 00000000 */
1330
1331 /*
1332 * 174 0xae '®'
1333 */
1334 0x3c, /* 00111100 */
1335 0x42, /* 01000010 */
1336 0x9d, /* 10111001 */
1337 0xa5, /* 10100101 */
1338 0x9d, /* 10111001 */
1339 0xa5, /* 10100101 */
1340 0x42, /* 01000010 */
1341 0x3c, /* 00111100 */
1342
1343 /*
1344 * 175 0xaf '¯'
1345 */
1346 0x7e, /* 01111110 */
1347 0x00, /* 00000000 */
1348 0x00, /* 00000000 */
1349 0x00, /* 00000000 */
1350 0x00, /* 00000000 */
1351 0x00, /* 00000000 */
1352 0x00, /* 00000000 */
1353 0x00, /* 00000000 */
1354
1355 /*
1356 * 176 0xb0 '°'
1357 */
1358 0x1c, /* 00111000 */
1359 0x36, /* 01101100 */
1360 0x36, /* 01101100 */
1361 0x1c, /* 00111000 */
1362 0x00, /* 00000000 */
1363 0x00, /* 00000000 */
1364 0x00, /* 00000000 */
1365 0x00, /* 00000000 */
1366
1367 /*
1368 * 177 0xb1 '±'
1369 */
1370 0x18, /* 00011000 */
1371 0x18, /* 00011000 */
1372 0x7e, /* 01111110 */
1373 0x18, /* 00011000 */
1374 0x18, /* 00011000 */
1375 0x00, /* 00000000 */
1376 0x7e, /* 01111110 */
1377 0x00, /* 00000000 */
1378
1379 /*
1380 * 178 0xb2 '²'
1381 */
1382 0x1c, /* 00111000 */
1383 0x30, /* 00001100 */
1384 0x18, /* 00011000 */
1385 0x0c, /* 00110000 */
1386 0x3c, /* 00111100 */
1387 0x00, /* 00000000 */
1388 0x00, /* 00000000 */
1389 0x00, /* 00000000 */
1390
1391 /*
1392 * 179 0xb3 '³'
1393 */
1394 0x1c, /* 00111000 */
1395 0x30, /* 00001100 */
1396 0x18, /* 00011000 */
1397 0x30, /* 00001100 */
1398 0x1c, /* 00111000 */
1399 0x00, /* 00000000 */
1400 0x00, /* 00000000 */
1401 0x00, /* 00000000 */
1402
1403 /*
1404 * 180 0xb4 '´'
1405 */
1406 0x18, /* 00011000 */
1407 0x0c, /* 00110000 */
1408 0x00, /* 00000000 */
1409 0x00, /* 00000000 */
1410 0x00, /* 00000000 */
1411 0x00, /* 00000000 */
1412 0x00, /* 00000000 */
1413 0x00, /* 00000000 */
1414
1415 /*
1416 * 181 0xb5 'µ'
1417 */
1418 0x00, /* 00000000 */
1419 0x00, /* 00000000 */
1420 0x66, /* 01100110 */
1421 0x66, /* 01100110 */
1422 0x66, /* 01100110 */
1423 0x3e, /* 01111100 */
1424 0x06, /* 01100000 */
1425 0x03, /* 11000000 */
1426
1427 /*
1428 * 182 0xb6 '¶'
1429 */
1430 0xfe, /* 01111111 */
1431 0xdb, /* 11011011 */
1432 0xdb, /* 11011011 */
1433 0xde, /* 01111011 */
1434 0xd8, /* 00011011 */
1435 0xd8, /* 00011011 */
1436 0xd8, /* 00011011 */
1437 0x00, /* 00000000 */
1438
1439 /*
1440 * 183 0xb7 '·'
1441 */
1442 0x00, /* 00000000 */
1443 0x00, /* 00000000 */
1444 0x00, /* 00000000 */
1445 0x18, /* 00011000 */
1446 0x18, /* 00011000 */
1447 0x00, /* 00000000 */
1448 0x00, /* 00000000 */
1449 0x00, /* 00000000 */
1450
1451 /*
1452 * 184 0xb8 '¸'
1453 */
1454 0x00, /* 00000000 */
1455 0x00, /* 00000000 */
1456 0x00, /* 00000000 */
1457 0x00, /* 00000000 */
1458 0x00, /* 00000000 */
1459 0x18, /* 00011000 */
1460 0x30, /* 00001100 */
1461 0x1e, /* 01111000 */
1462
1463 /*
1464 * 185 0xb9 '¹'
1465 */
1466 0x08, /* 00010000 */
1467 0x0c, /* 00110000 */
1468 0x08, /* 00010000 */
1469 0x1c, /* 00111000 */
1470 0x00, /* 00000000 */
1471 0x00, /* 00000000 */
1472 0x00, /* 00000000 */
1473 0x00, /* 00000000 */
1474
1475 /*
1476 * 186 0xba 'º'
1477 */
1478 0x1c, /* 00111000 */
1479 0x36, /* 01101100 */
1480 0x36, /* 01101100 */
1481 0x1c, /* 00111000 */
1482 0x00, /* 00000000 */
1483 0x00, /* 00000000 */
1484 0x00, /* 00000000 */
1485 0x00, /* 00000000 */
1486
1487 /*
1488 * 187 0xbb '»'
1489 */
1490 0x00, /* 00000000 */
1491 0x33, /* 11001100 */
1492 0x66, /* 01100110 */
1493 0xcc, /* 00110011 */
1494 0x66, /* 01100110 */
1495 0x33, /* 11001100 */
1496 0x00, /* 00000000 */
1497 0x00, /* 00000000 */
1498
1499 /*
1500 * 188 0xbc '¼'
1501 */
1502 0xc3, /* 11000011 */
1503 0x63, /* 11000110 */
1504 0x33, /* 11001100 */
1505 0xbd, /* 10111101 */
1506 0xec, /* 00110111 */
1507 0xf6, /* 01101111 */
1508 0xf3, /* 11001111 */
1509 0x03, /* 11000000 */
1510
1511 /*
1512 * 189 0xbd '½'
1513 */
1514 0xc3, /* 11000011 */
1515 0x63, /* 11000110 */
1516 0x33, /* 11001100 */
1517 0x7b, /* 11011110 */
1518 0xcc, /* 00110011 */
1519 0x66, /* 01100110 */
1520 0x33, /* 11001100 */
1521 0xf0, /* 00001111 */
1522
1523 /*
1524 * 190 0xbe '¾'
1525 */
1526 0x03, /* 11000000 */
1527 0xc4, /* 00100011 */
1528 0x63, /* 11000110 */
1529 0xb4, /* 00101101 */
1530 0xdb, /* 11011011 */
1531 0xac, /* 00110101 */
1532 0xe6, /* 01100111 */
1533 0x80, /* 00000001 */
1534
1535 /*
1536 * 191 0xbf '¿'
1537 */
1538 0x0c, /* 00110000 */
1539 0x00, /* 00000000 */
1540 0x0c, /* 00110000 */
1541 0x06, /* 01100000 */
1542 0x03, /* 11000000 */
1543 0x33, /* 11001100 */
1544 0x1e, /* 01111000 */
1545 0x00, /* 00000000 */
1546
1547 /*
1548 * 192 0xc0 'À'
1549 */
1550 0x07, /* 11100000 */
1551 0x00, /* 00000000 */
1552 0x1c, /* 00111000 */
1553 0x36, /* 01101100 */
1554 0x63, /* 11000110 */
1555 0x7f, /* 11111110 */
1556 0x63, /* 11000110 */
1557 0x00, /* 00000000 */
1558
1559 /*
1560 * 193 0xc1 'Á'
1561 */
1562 0x70, /* 00001110 */
1563 0x00, /* 00000000 */
1564 0x1c, /* 00111000 */
1565 0x36, /* 01101100 */
1566 0x63, /* 11000110 */
1567 0x7f, /* 11111110 */
1568 0x63, /* 11000110 */
1569 0x00, /* 00000000 */
1570
1571 /*
1572 * 194 0xc2 'Â'
1573 */
1574 0x1c, /* 00111000 */
1575 0x36, /* 01101100 */
1576 0x00, /* 00000000 */
1577 0x3e, /* 01111100 */
1578 0x63, /* 11000110 */
1579 0x7f, /* 11111110 */
1580 0x63, /* 11000110 */
1581 0x00, /* 00000000 */
1582
1583 /*
1584 * 195 0xc3 'Ã'
1585 */
1586 0x6e, /* 01110110 */
1587 0x3b, /* 11011100 */
1588 0x00, /* 00000000 */
1589 0x3e, /* 01111100 */
1590 0x63, /* 11000110 */
1591 0x7f, /* 11111110 */
1592 0x63, /* 11000110 */
1593 0x00, /* 00000000 */
1594
1595 /*
1596 * 196 0xc4 'Ä'
1597 */
1598 0x63, /* 11000110 */
1599 0x1c, /* 00111000 */
1600 0x36, /* 01101100 */
1601 0x63, /* 11000110 */
1602 0x7f, /* 11111110 */
1603 0x63, /* 11000110 */
1604 0x63, /* 11000110 */
1605 0x00, /* 00000000 */
1606
1607 /*
1608 * 197 0xc5 'Å'
1609 */
1610 0x0c, /* 00110000 */
1611 0x0c, /* 00110000 */
1612 0x00, /* 00000000 */
1613 0x1e, /* 01111000 */
1614 0x33, /* 11001100 */
1615 0x3f, /* 11111100 */
1616 0x33, /* 11001100 */
1617 0x00, /* 00000000 */
1618
1619 /*
1620 * 198 0xc6 'Æ'
1621 */
1622 0x7c, /* 00111110 */
1623 0x36, /* 01101100 */
1624 0x33, /* 11001100 */
1625 0x7f, /* 11111110 */
1626 0x33, /* 11001100 */
1627 0x33, /* 11001100 */
1628 0x73, /* 11001110 */
1629 0x00, /* 00000000 */
1630
1631 /*
1632 * 199 0xc7 'Ç'
1633 */
1634 0x1e, /* 01111000 */
1635 0x33, /* 11001100 */
1636 0x03, /* 11000000 */
1637 0x33, /* 11001100 */
1638 0x1e, /* 01111000 */
1639 0x18, /* 00011000 */
1640 0x30, /* 00001100 */
1641 0x1e, /* 01111000 */
1642
1643 /*
1644 * 200 0xc8 'È'
1645 */
1646 0x07, /* 11100000 */
1647 0x00, /* 00000000 */
1648 0x3f, /* 11111100 */
1649 0x06, /* 01100000 */
1650 0x1e, /* 01111000 */
1651 0x06, /* 01100000 */
1652 0x3f, /* 11111100 */
1653 0x00, /* 00000000 */
1654
1655 /*
1656 * 201 0xc9 'É'
1657 */
1658 0x38, /* 00011100 */
1659 0x00, /* 00000000 */
1660 0x3f, /* 11111100 */
1661 0x06, /* 01100000 */
1662 0x1e, /* 01111000 */
1663 0x06, /* 01100000 */
1664 0x3f, /* 11111100 */
1665 0x00, /* 00000000 */
1666
1667 /*
1668 * 202 0xca 'Ê'
1669 */
1670 0x0c, /* 00110000 */
1671 0x12, /* 01001000 */
1672 0x3f, /* 11111100 */
1673 0x06, /* 01100000 */
1674 0x1e, /* 01111000 */
1675 0x06, /* 01100000 */
1676 0x3f, /* 11111100 */
1677 0x00, /* 00000000 */
1678
1679 /*
1680 * 203 0xcb 'Ë'
1681 */
1682 0x36, /* 01101100 */
1683 0x00, /* 00000000 */
1684 0x3f, /* 11111100 */
1685 0x06, /* 01100000 */
1686 0x1e, /* 01111000 */
1687 0x06, /* 01100000 */
1688 0x3f, /* 11111100 */
1689 0x00, /* 00000000 */
1690
1691 /*
1692 * 204 0xcc 'Ì'
1693 */
1694 0x07, /* 11100000 */
1695 0x00, /* 00000000 */
1696 0x1e, /* 01111000 */
1697 0x0c, /* 00110000 */
1698 0x0c, /* 00110000 */
1699 0x0c, /* 00110000 */
1700 0x1e, /* 01111000 */
1701 0x00, /* 00000000 */
1702
1703 /*
1704 * 205 0xcd 'Í'
1705 */
1706 0x38, /* 00011100 */
1707 0x00, /* 00000000 */
1708 0x1e, /* 01111000 */
1709 0x0c, /* 00110000 */
1710 0x0c, /* 00110000 */
1711 0x0c, /* 00110000 */
1712 0x1e, /* 01111000 */
1713 0x00, /* 00000000 */
1714
1715 /*
1716 * 206 0xce 'Î'
1717 */
1718 0x0c, /* 00110000 */
1719 0x12, /* 01001000 */
1720 0x00, /* 00000000 */
1721 0x1e, /* 01111000 */
1722 0x0c, /* 00110000 */
1723 0x0c, /* 00110000 */
1724 0x1e, /* 01111000 */
1725 0x00, /* 00000000 */
1726
1727 /*
1728 * 207 0xcf 'Ï'
1729 */
1730 0x33, /* 11001100 */
1731 0x00, /* 00000000 */
1732 0x1e, /* 01111000 */
1733 0x0c, /* 00110000 */
1734 0x0c, /* 00110000 */
1735 0x0c, /* 00110000 */
1736 0x1e, /* 01111000 */
1737 0x00, /* 00000000 */
1738
1739 /*
1740 * 208 0xd0 'Ð'
1741 */
1742 0x3f, /* 11111100 */
1743 0x66, /* 01100110 */
1744 0x6f, /* 11110110 */
1745 0x6f, /* 11110110 */
1746 0x66, /* 01100110 */
1747 0x66, /* 01100110 */
1748 0x3f, /* 11111100 */
1749 0x00, /* 00000000 */
1750
1751 /*
1752 * 209 0xd1 'Ñ'
1753 */
1754 0x3f, /* 11111100 */
1755 0x00, /* 00000000 */
1756 0x33, /* 11001100 */
1757 0x37, /* 11101100 */
1758 0x3f, /* 11111100 */
1759 0x3b, /* 11011100 */
1760 0x33, /* 11001100 */
1761 0x00, /* 00000000 */
1762
1763 /*
1764 * 210 0xd2 'Ò'
1765 */
1766 0x0e, /* 01110000 */
1767 0x00, /* 00000000 */
1768 0x18, /* 00011000 */
1769 0x3c, /* 00111100 */
1770 0x66, /* 01100110 */
1771 0x3c, /* 00111100 */
1772 0x18, /* 00011000 */
1773 0x00, /* 00000000 */
1774
1775 /*
1776 * 211 0xd3 'Ó'
1777 */
1778 0x70, /* 00001110 */
1779 0x00, /* 00000000 */
1780 0x18, /* 00011000 */
1781 0x3c, /* 00111100 */
1782 0x66, /* 01100110 */
1783 0x3c, /* 00111100 */
1784 0x18, /* 00011000 */
1785 0x00, /* 00000000 */
1786
1787 /*
1788 * 212 0xd4 'Ô'
1789 */
1790 0x3c, /* 00111100 */
1791 0x66, /* 01100110 */
1792 0x18, /* 00011000 */
1793 0x3c, /* 00111100 */
1794 0x66, /* 01100110 */
1795 0x3c, /* 00111100 */
1796 0x18, /* 00011000 */
1797 0x00, /* 00000000 */
1798
1799 /*
1800 * 213 0xd5 'Õ'
1801 */
1802 0x6e, /* 01110110 */
1803 0x3b, /* 11011100 */
1804 0x00, /* 00000000 */
1805 0x3e, /* 01111100 */
1806 0x63, /* 11000110 */
1807 0x63, /* 11000110 */
1808 0x3e, /* 01111100 */
1809 0x00, /* 00000000 */
1810
1811 /*
1812 * 214 0xd6 'Ö'
1813 */
1814 0xc3, /* 11000011 */
1815 0x18, /* 00011000 */
1816 0x3c, /* 00111100 */
1817 0x66, /* 01100110 */
1818 0x66, /* 01100110 */
1819 0x3c, /* 00111100 */
1820 0x18, /* 00011000 */
1821 0x00, /* 00000000 */
1822
1823 /*
1824 * 215 0xd7 '×'
1825 */
1826 0x00, /* 00000000 */
1827 0x36, /* 01101100 */
1828 0x1c, /* 00111000 */
1829 0x08, /* 00010000 */
1830 0x1c, /* 00111000 */
1831 0x36, /* 01101100 */
1832 0x00, /* 00000000 */
1833 0x00, /* 00000000 */
1834
1835 /*
1836 * 216 0xd8 'Ø'
1837 */
1838 0x5c, /* 00111010 */
1839 0x36, /* 01101100 */
1840 0x73, /* 11001110 */
1841 0x7b, /* 11011110 */
1842 0x6f, /* 11110110 */
1843 0x36, /* 01101100 */
1844 0x1d, /* 10111000 */
1845 0x00, /* 00000000 */
1846
1847 /*
1848 * 217 0xd9 'Ù'
1849 */
1850 0x0e, /* 01110000 */
1851 0x00, /* 00000000 */
1852 0x66, /* 01100110 */
1853 0x66, /* 01100110 */
1854 0x66, /* 01100110 */
1855 0x66, /* 01100110 */
1856 0x3c, /* 00111100 */
1857 0x00, /* 00000000 */
1858
1859 /*
1860 * 218 0xda 'Ú'
1861 */
1862 0x70, /* 00001110 */
1863 0x00, /* 00000000 */
1864 0x66, /* 01100110 */
1865 0x66, /* 01100110 */
1866 0x66, /* 01100110 */
1867 0x66, /* 01100110 */
1868 0x3c, /* 00111100 */
1869 0x00, /* 00000000 */
1870
1871 /*
1872 * 219 0xdb 'Û'
1873 */
1874 0x3c, /* 00111100 */
1875 0x66, /* 01100110 */
1876 0x00, /* 00000000 */
1877 0x66, /* 01100110 */
1878 0x66, /* 01100110 */
1879 0x66, /* 01100110 */
1880 0x3c, /* 00111100 */
1881 0x00, /* 00000000 */
1882
1883 /*
1884 * 220 0xdc 'Ü'
1885 */
1886 0x33, /* 11001100 */
1887 0x00, /* 00000000 */
1888 0x33, /* 11001100 */
1889 0x33, /* 11001100 */
1890 0x33, /* 11001100 */
1891 0x33, /* 11001100 */
1892 0x1e, /* 01111000 */
1893 0x00, /* 00000000 */
1894
1895 /*
1896 * 221 0xdd 'Ý'
1897 */
1898 0x70, /* 00001110 */
1899 0x00, /* 00000000 */
1900 0x66, /* 01100110 */
1901 0x66, /* 01100110 */
1902 0x3c, /* 00111100 */
1903 0x18, /* 00011000 */
1904 0x18, /* 00011000 */
1905 0x00, /* 00000000 */
1906
1907 /*
1908 * 222 0xde 'Þ'
1909 */
1910 0x0f, /* 11110000 */
1911 0x06, /* 01100000 */
1912 0x3e, /* 01111100 */
1913 0x66, /* 01100110 */
1914 0x66, /* 01100110 */
1915 0x3e, /* 01111100 */
1916 0x06, /* 01100000 */
1917 0x0f, /* 11110000 */
1918
1919 /*
1920 * 223 0xdf 'ß'
1921 */
1922 0x00, /* 00000000 */
1923 0x1e, /* 01111000 */
1924 0x33, /* 11001100 */
1925 0x1f, /* 11111000 */
1926 0x33, /* 11001100 */
1927 0x1f, /* 11111000 */
1928 0x03, /* 11000000 */
1929 0x03, /* 11000000 */
1930
1931 /*
1932 * 224 0xe0 'à'
1933 */
1934 0x07, /* 11100000 */
1935 0x00, /* 00000000 */
1936 0x1e, /* 01111000 */
1937 0x30, /* 00001100 */
1938 0x3e, /* 01111100 */
1939 0x33, /* 11001100 */
1940 0x7e, /* 01111110 */
1941 0x00, /* 00000000 */
1942
1943 /*
1944 * 225 0xe1 'á'
1945 */
1946 0x38, /* 00011100 */
1947 0x00, /* 00000000 */
1948 0x1e, /* 01111000 */
1949 0x30, /* 00001100 */
1950 0x3e, /* 01111100 */
1951 0x33, /* 11001100 */
1952 0x7e, /* 01111110 */
1953 0x00, /* 00000000 */
1954
1955 /*
1956 * 226 0xe2 'â'
1957 */
1958 0x7e, /* 01111110 */
1959 0xc3, /* 11000011 */
1960 0x3c, /* 00111100 */
1961 0x60, /* 00000110 */
1962 0x7c, /* 00111110 */
1963 0x66, /* 01100110 */
1964 0xfc, /* 00111111 */
1965 0x00, /* 00000000 */
1966
1967 /*
1968 * 227 0xe3 'ã'
1969 */
1970 0x6e, /* 01110110 */
1971 0x3b, /* 11011100 */
1972 0x1e, /* 01111000 */
1973 0x30, /* 00001100 */
1974 0x3e, /* 01111100 */
1975 0x33, /* 11001100 */
1976 0x7e, /* 01111110 */
1977 0x00, /* 00000000 */
1978
1979 /*
1980 * 228 0xe4 'ä'
1981 */
1982 0x33, /* 11001100 */
1983 0x00, /* 00000000 */
1984 0x1e, /* 01111000 */
1985 0x30, /* 00001100 */
1986 0x3e, /* 01111100 */
1987 0x33, /* 11001100 */
1988 0x7e, /* 01111110 */
1989 0x00, /* 00000000 */
1990
1991 /*
1992 * 229 0xe5 'Ã¥'
1993 */
1994 0x0c, /* 00110000 */
1995 0x0c, /* 00110000 */
1996 0x1e, /* 01111000 */
1997 0x30, /* 00001100 */
1998 0x3e, /* 01111100 */
1999 0x33, /* 11001100 */
2000 0x7e, /* 01111110 */
2001 0x00, /* 00000000 */
2002
2003 /*
2004 * 230 0xe6 'æ'
2005 */
2006 0x00, /* 00000000 */
2007 0x00, /* 00000000 */
2008 0xfe, /* 01111111 */
2009 0x30, /* 00001100 */
2010 0xfe, /* 01111111 */
2011 0x33, /* 11001100 */
2012 0xfe, /* 01111111 */
2013 0x00, /* 00000000 */
2014
2015 /*
2016 * 231 0xe7 'ç'
2017 */
2018 0x00, /* 00000000 */
2019 0x00, /* 00000000 */
2020 0x1e, /* 01111000 */
2021 0x03, /* 11000000 */
2022 0x03, /* 11000000 */
2023 0x1e, /* 01111000 */
2024 0x30, /* 00001100 */
2025 0x1c, /* 00111000 */
2026
2027 /*
2028 * 232 0xe8 'è'
2029 */
2030 0x07, /* 11100000 */
2031 0x00, /* 00000000 */
2032 0x1e, /* 01111000 */
2033 0x33, /* 11001100 */
2034 0x3f, /* 11111100 */
2035 0x03, /* 11000000 */
2036 0x1e, /* 01111000 */
2037 0x00, /* 00000000 */
2038
2039 /*
2040 * 233 0xe9 'é'
2041 */
2042 0x38, /* 00011100 */
2043 0x00, /* 00000000 */
2044 0x1e, /* 01111000 */
2045 0x33, /* 11001100 */
2046 0x3f, /* 11111100 */
2047 0x03, /* 11000000 */
2048 0x1e, /* 01111000 */
2049 0x00, /* 00000000 */
2050
2051 /*
2052 * 234 0xea 'ê'
2053 */
2054 0x7e, /* 01111110 */
2055 0xc3, /* 11000011 */
2056 0x3c, /* 00111100 */
2057 0x66, /* 01100110 */
2058 0x7e, /* 01111110 */
2059 0x06, /* 01100000 */
2060 0x3c, /* 00111100 */
2061 0x00, /* 00000000 */
2062
2063 /*
2064 * 235 0xeb 'ë'
2065 */
2066 0x33, /* 11001100 */
2067 0x00, /* 00000000 */
2068 0x1e, /* 01111000 */
2069 0x33, /* 11001100 */
2070 0x3f, /* 11111100 */
2071 0x03, /* 11000000 */
2072 0x1e, /* 01111000 */
2073 0x00, /* 00000000 */
2074
2075 /*
2076 * 236 0xec 'ì'
2077 */
2078 0x07, /* 11100000 */
2079 0x00, /* 00000000 */
2080 0x0e, /* 01110000 */
2081 0x0c, /* 00110000 */
2082 0x0c, /* 00110000 */
2083 0x0c, /* 00110000 */
2084 0x1e, /* 01111000 */
2085 0x00, /* 00000000 */
2086
2087 /*
2088 * 237 0xed 'í'
2089 */
2090 0x1c, /* 00111000 */
2091 0x00, /* 00000000 */
2092 0x0e, /* 01110000 */
2093 0x0c, /* 00110000 */
2094 0x0c, /* 00110000 */
2095 0x0c, /* 00110000 */
2096 0x1e, /* 01111000 */
2097 0x00, /* 00000000 */
2098
2099 /*
2100 * 238 0xee 'î'
2101 */
2102 0x3e, /* 01111100 */
2103 0x63, /* 11000110 */
2104 0x1c, /* 00111000 */
2105 0x18, /* 00011000 */
2106 0x18, /* 00011000 */
2107 0x18, /* 00011000 */
2108 0x3c, /* 00111100 */
2109 0x00, /* 00000000 */
2110
2111 /*
2112 * 239 0xef 'ï'
2113 */
2114 0x33, /* 11001100 */
2115 0x00, /* 00000000 */
2116 0x0e, /* 01110000 */
2117 0x0c, /* 00110000 */
2118 0x0c, /* 00110000 */
2119 0x0c, /* 00110000 */
2120 0x1e, /* 01111000 */
2121 0x00, /* 00000000 */
2122
2123 /*
2124 * 240 0xf0 'ð'
2125 */
2126 0x1b, /* 11011000 */
2127 0x0e, /* 01110000 */
2128 0x1b, /* 11011000 */
2129 0x30, /* 00001100 */
2130 0x3e, /* 01111100 */
2131 0x33, /* 11001100 */
2132 0x1e, /* 01111000 */
2133 0x00, /* 00000000 */
2134
2135 /*
2136 * 241 0xf1 'ñ'
2137 */
2138 0x00, /* 00000000 */
2139 0x1f, /* 11111000 */
2140 0x00, /* 00000000 */
2141 0x1f, /* 11111000 */
2142 0x33, /* 11001100 */
2143 0x33, /* 11001100 */
2144 0x33, /* 11001100 */
2145 0x00, /* 00000000 */
2146
2147 /*
2148 * 242 0xf2 'ò'
2149 */
2150 0x00, /* 00000000 */
2151 0x07, /* 11100000 */
2152 0x00, /* 00000000 */
2153 0x1e, /* 01111000 */
2154 0x33, /* 11001100 */
2155 0x33, /* 11001100 */
2156 0x1e, /* 01111000 */
2157 0x00, /* 00000000 */
2158
2159 /*
2160 * 243 0xf3 'ó'
2161 */
2162 0x00, /* 00000000 */
2163 0x38, /* 00011100 */
2164 0x00, /* 00000000 */
2165 0x1e, /* 01111000 */
2166 0x33, /* 11001100 */
2167 0x33, /* 11001100 */
2168 0x1e, /* 01111000 */
2169 0x00, /* 00000000 */
2170
2171 /*
2172 * 244 0xf4 'ô'
2173 */
2174 0x1e, /* 01111000 */
2175 0x33, /* 11001100 */
2176 0x00, /* 00000000 */
2177 0x1e, /* 01111000 */
2178 0x33, /* 11001100 */
2179 0x33, /* 11001100 */
2180 0x1e, /* 01111000 */
2181 0x00, /* 00000000 */
2182
2183 /*
2184 * 245 0xf5 'õ'
2185 */
2186 0x6e, /* 01110110 */
2187 0x3b, /* 11011100 */
2188 0x00, /* 00000000 */
2189 0x1e, /* 01111000 */
2190 0x33, /* 11001100 */
2191 0x33, /* 11001100 */
2192 0x1e, /* 01111000 */
2193 0x00, /* 00000000 */
2194
2195 /*
2196 * 246 0xf6 'ö'
2197 */
2198 0x00, /* 00000000 */
2199 0x33, /* 11001100 */
2200 0x00, /* 00000000 */
2201 0x1e, /* 01111000 */
2202 0x33, /* 11001100 */
2203 0x33, /* 11001100 */
2204 0x1e, /* 01111000 */
2205 0x00, /* 00000000 */
2206
2207 /*
2208 * 247 0xf7 '÷'
2209 */
2210 0x18, /* 00011000 */
2211 0x18, /* 00011000 */
2212 0x00, /* 00000000 */
2213 0x7e, /* 01111110 */
2214 0x00, /* 00000000 */
2215 0x18, /* 00011000 */
2216 0x18, /* 00011000 */
2217 0x00, /* 00000000 */
2218
2219 /*
2220 * 248 0xf8 'ø'
2221 */
2222 0x00, /* 00000000 */
2223 0x60, /* 00000110 */
2224 0x3c, /* 00111100 */
2225 0x76, /* 01101110 */
2226 0x7e, /* 01111110 */
2227 0x6e, /* 01110110 */
2228 0x3c, /* 00111100 */
2229 0x06, /* 01100000 */
2230
2231 /*
2232 * 249 0xf9 'ù'
2233 */
2234 0x00, /* 00000000 */
2235 0x07, /* 11100000 */
2236 0x00, /* 00000000 */
2237 0x33, /* 11001100 */
2238 0x33, /* 11001100 */
2239 0x33, /* 11001100 */
2240 0x7e, /* 01111110 */
2241 0x00, /* 00000000 */
2242
2243 /*
2244 * 250 0xfa 'ú'
2245 */
2246 0x00, /* 00000000 */
2247 0x38, /* 00011100 */
2248 0x00, /* 00000000 */
2249 0x33, /* 11001100 */
2250 0x33, /* 11001100 */
2251 0x33, /* 11001100 */
2252 0x7e, /* 01111110 */
2253 0x00, /* 00000000 */
2254
2255 /*
2256 * 251 0xfb 'û'
2257 */
2258 0x1e, /* 01111000 */
2259 0x33, /* 11001100 */
2260 0x00, /* 00000000 */
2261 0x33, /* 11001100 */
2262 0x33, /* 11001100 */
2263 0x33, /* 11001100 */
2264 0x7e, /* 01111110 */
2265 0x00, /* 00000000 */
2266
2267 /*
2268 * 252 0xfc 'ü'
2269 */
2270 0x00, /* 00000000 */
2271 0x33, /* 11001100 */
2272 0x00, /* 00000000 */
2273 0x33, /* 11001100 */
2274 0x33, /* 11001100 */
2275 0x33, /* 11001100 */
2276 0x7e, /* 01111110 */
2277 0x00, /* 00000000 */
2278
2279 /*
2280 * 253 0xfd 'ý'
2281 */
2282 0x00, /* 00000000 */
2283 0x38, /* 00011100 */
2284 0x00, /* 00000000 */
2285 0x33, /* 11001100 */
2286 0x33, /* 11001100 */
2287 0x3e, /* 01111100 */
2288 0x30, /* 00001100 */
2289 0x1f, /* 11111000 */
2290
2291 /*
2292 * 254 0xfe 'þ'
2293 */
2294 0x00, /* 00000000 */
2295 0x00, /* 00000000 */
2296 0x06, /* 01100000 */
2297 0x3e, /* 01111100 */
2298 0x66, /* 01100110 */
2299 0x3e, /* 01111100 */
2300 0x06, /* 01100000 */
2301 0x00, /* 00000000 */
2302
2303 /*
2304 * 255 0xff 'ÿ'
2305 */
2306 0x00, /* 00000000 */
2307 0x33, /* 11001100 */
2308 0x00, /* 00000000 */
2309 0x33, /* 11001100 */
2310 0x33, /* 11001100 */
2311 0x3e, /* 01111100 */
2312 0x30, /* 00001100 */
2313 0x1f, /* 11111000 */
2314
2315 /*
2316 * 256 0x100 - missing character
2317 */
2318 0x55, /* 01010101 */
2319 0xAA, /* 10101010 */
2320 0x55, /* 01010101 */
2321 0xAA, /* 10101010 */
2322 0x55, /* 01010101 */
2323 0xAA, /* 10101010 */
2324 0x55, /* 01010101 */
2325 0xAA, /* 10101010 */
2326};
2327
2328SDL_COMPILE_TIME_ASSERT(SDL_RenderDebugTextFontDataSize, SDL_arraysize(SDL_RenderDebugTextFontData) == SDL_DEBUG_FONT_NUM_GLYPHS * 8);
2329
2330#endif
2331
diff --git a/SDL-3.2.8/src/render/SDL_render_unsupported.c b/SDL-3.2.8/src/render/SDL_render_unsupported.c
new file mode 100644
index 0000000..5369fb4
--- /dev/null
+++ b/SDL-3.2.8/src/render/SDL_render_unsupported.c
@@ -0,0 +1,22 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
diff --git a/SDL-3.2.8/src/render/SDL_sysrender.h b/SDL-3.2.8/src/render/SDL_sysrender.h
new file mode 100644
index 0000000..9d39dfd
--- /dev/null
+++ b/SDL-3.2.8/src/render/SDL_sysrender.h
@@ -0,0 +1,372 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifndef SDL_sysrender_h_
24#define SDL_sysrender_h_
25
26#include "../video/SDL_surface_c.h"
27
28#include "SDL_yuv_sw_c.h"
29
30// Set up for C function definitions, even when using C++
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35typedef enum SDL_TextureAddressMode
36{
37 SDL_TEXTURE_ADDRESS_AUTO,
38 SDL_TEXTURE_ADDRESS_CLAMP,
39 SDL_TEXTURE_ADDRESS_WRAP,
40} SDL_TextureAddressMode;
41
42/**
43 * A rectangle, with the origin at the upper left (double precision).
44 */
45typedef struct SDL_DRect
46{
47 double x;
48 double y;
49 double w;
50 double h;
51} SDL_DRect;
52
53// The SDL 2D rendering system
54
55typedef struct SDL_RenderDriver SDL_RenderDriver;
56
57// Rendering view state
58typedef struct SDL_RenderViewState
59{
60 int pixel_w;
61 int pixel_h;
62 SDL_Rect viewport;
63 SDL_Rect pixel_viewport;
64 SDL_Rect clip_rect;
65 SDL_Rect pixel_clip_rect;
66 bool clipping_enabled;
67 SDL_FPoint scale;
68
69 // Support for logical output coordinates
70 SDL_RendererLogicalPresentation logical_presentation_mode;
71 int logical_w, logical_h;
72 SDL_FRect logical_src_rect;
73 SDL_FRect logical_dst_rect;
74 SDL_FPoint logical_scale;
75 SDL_FPoint logical_offset;
76
77 SDL_FPoint current_scale; // this is just `scale * logical_scale`, precalculated, since we use it a lot.
78} SDL_RenderViewState;
79
80// Define the SDL texture structure
81struct SDL_Texture
82{
83 // Public API definition
84 SDL_PixelFormat format; /**< The format of the texture, read-only */
85 int w; /**< The width of the texture, read-only. */
86 int h; /**< The height of the texture, read-only. */
87
88 int refcount; /**< Application reference count, used when freeing texture */
89
90 // Private API definition
91 SDL_Colorspace colorspace; // The colorspace of the texture
92 float SDR_white_point; // The SDR white point for this content
93 float HDR_headroom; // The HDR headroom needed by this content
94 SDL_TextureAccess access; // The texture access mode
95 SDL_BlendMode blendMode; // The texture blend mode
96 SDL_ScaleMode scaleMode; // The texture scale mode
97 SDL_FColor color; // Texture modulation values
98 SDL_RenderViewState view; // Target texture view state
99
100 SDL_Renderer *renderer;
101
102 // Support for formats not supported directly by the renderer
103 SDL_Texture *native;
104 SDL_SW_YUVTexture *yuv;
105 void *pixels;
106 int pitch;
107 SDL_Rect locked_rect;
108 SDL_Surface *locked_surface; // Locked region exposed as a SDL surface
109
110 Uint32 last_command_generation; // last command queue generation this texture was in.
111
112 SDL_PropertiesID props;
113
114 void *internal; // Driver specific texture representation
115
116 SDL_Texture *prev;
117 SDL_Texture *next;
118};
119
120typedef enum
121{
122 SDL_RENDERCMD_NO_OP,
123 SDL_RENDERCMD_SETVIEWPORT,
124 SDL_RENDERCMD_SETCLIPRECT,
125 SDL_RENDERCMD_SETDRAWCOLOR,
126 SDL_RENDERCMD_CLEAR,
127 SDL_RENDERCMD_DRAW_POINTS,
128 SDL_RENDERCMD_DRAW_LINES,
129 SDL_RENDERCMD_FILL_RECTS,
130 SDL_RENDERCMD_COPY,
131 SDL_RENDERCMD_COPY_EX,
132 SDL_RENDERCMD_GEOMETRY
133} SDL_RenderCommandType;
134
135typedef struct SDL_RenderCommand
136{
137 SDL_RenderCommandType command;
138 union
139 {
140 struct
141 {
142 size_t first;
143 SDL_Rect rect;
144 } viewport;
145 struct
146 {
147 bool enabled;
148 SDL_Rect rect;
149 } cliprect;
150 struct
151 {
152 size_t first;
153 size_t count;
154 float color_scale;
155 SDL_FColor color;
156 SDL_BlendMode blend;
157 SDL_Texture *texture;
158 SDL_TextureAddressMode texture_address_mode;
159 } draw;
160 struct
161 {
162 size_t first;
163 float color_scale;
164 SDL_FColor color;
165 } color;
166 } data;
167 struct SDL_RenderCommand *next;
168} SDL_RenderCommand;
169
170typedef struct SDL_VertexSolid
171{
172 SDL_FPoint position;
173 SDL_FColor color;
174} SDL_VertexSolid;
175
176typedef enum
177{
178 SDL_RENDERLINEMETHOD_POINTS,
179 SDL_RENDERLINEMETHOD_LINES,
180 SDL_RENDERLINEMETHOD_GEOMETRY,
181} SDL_RenderLineMethod;
182
183// Define the SDL renderer structure
184struct SDL_Renderer
185{
186 void (*WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event);
187 bool (*GetOutputSize)(SDL_Renderer *renderer, int *w, int *h);
188 bool (*SupportsBlendMode)(SDL_Renderer *renderer, SDL_BlendMode blendMode);
189 bool (*CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props);
190 bool (*QueueSetViewport)(SDL_Renderer *renderer, SDL_RenderCommand *cmd);
191 bool (*QueueSetDrawColor)(SDL_Renderer *renderer, SDL_RenderCommand *cmd);
192 bool (*QueueDrawPoints)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points,
193 int count);
194 bool (*QueueDrawLines)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points,
195 int count);
196 bool (*QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects,
197 int count);
198 bool (*QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
199 const SDL_FRect *srcrect, const SDL_FRect *dstrect);
200 bool (*QueueCopyEx)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
201 const SDL_FRect *srcquad, const SDL_FRect *dstrect,
202 const double angle, const SDL_FPoint *center, const SDL_FlipMode flip, float scale_x, float scale_y);
203 bool (*QueueGeometry)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
204 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
205 int num_vertices, const void *indices, int num_indices, int size_indices,
206 float scale_x, float scale_y);
207
208 void (*InvalidateCachedState)(SDL_Renderer *renderer);
209 bool (*RunCommandQueue)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize);
210 bool (*UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture,
211 const SDL_Rect *rect, const void *pixels,
212 int pitch);
213#ifdef SDL_HAVE_YUV
214 bool (*UpdateTextureYUV)(SDL_Renderer *renderer, SDL_Texture *texture,
215 const SDL_Rect *rect,
216 const Uint8 *Yplane, int Ypitch,
217 const Uint8 *Uplane, int Upitch,
218 const Uint8 *Vplane, int Vpitch);
219 bool (*UpdateTextureNV)(SDL_Renderer *renderer, SDL_Texture *texture,
220 const SDL_Rect *rect,
221 const Uint8 *Yplane, int Ypitch,
222 const Uint8 *UVplane, int UVpitch);
223#endif
224 bool (*LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture,
225 const SDL_Rect *rect, void **pixels, int *pitch);
226 void (*UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture);
227 void (*SetTextureScaleMode)(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode);
228 bool (*SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture);
229 SDL_Surface *(*RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect);
230 bool (*RenderPresent)(SDL_Renderer *renderer);
231 void (*DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture);
232
233 void (*DestroyRenderer)(SDL_Renderer *renderer);
234
235 bool (*SetVSync)(SDL_Renderer *renderer, int vsync);
236
237 void *(*GetMetalLayer)(SDL_Renderer *renderer);
238 void *(*GetMetalCommandEncoder)(SDL_Renderer *renderer);
239
240 bool (*AddVulkanRenderSemaphores)(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore);
241
242 // The current renderer info
243 const char *name;
244 SDL_PixelFormat *texture_formats;
245 int num_texture_formats;
246 bool software;
247
248 // The window associated with the renderer
249 SDL_Window *window;
250 bool hidden;
251
252 // Whether we should simulate vsync
253 bool wanted_vsync;
254 bool simulate_vsync;
255 Uint64 simulate_vsync_interval_ns;
256 Uint64 last_present;
257
258 SDL_RenderViewState *view;
259 SDL_RenderViewState main_view;
260
261 // The window pixel to point coordinate scale
262 SDL_FPoint dpi_scale;
263
264 // The method of drawing lines
265 SDL_RenderLineMethod line_method;
266
267 // The list of textures
268 SDL_Texture *textures;
269 SDL_Texture *target;
270 SDL_Mutex *target_mutex;
271
272 SDL_Colorspace output_colorspace;
273 float SDR_white_point;
274 float HDR_headroom;
275
276 float desired_color_scale;
277 float color_scale;
278 SDL_FColor color; /**< Color for drawing operations values */
279 SDL_BlendMode blendMode; /**< The drawing blend mode */
280 SDL_TextureAddressMode texture_address_mode;
281
282 SDL_RenderCommand *render_commands;
283 SDL_RenderCommand *render_commands_tail;
284 SDL_RenderCommand *render_commands_pool;
285 Uint32 render_command_generation;
286 SDL_FColor last_queued_color;
287 float last_queued_color_scale;
288 SDL_Rect last_queued_viewport;
289 SDL_Rect last_queued_cliprect;
290 bool last_queued_cliprect_enabled;
291 bool color_queued;
292 bool viewport_queued;
293 bool cliprect_queued;
294
295 void *vertex_data;
296 size_t vertex_data_used;
297 size_t vertex_data_allocation;
298
299 // Shaped window support
300 bool transparent_window;
301 SDL_Surface *shape_surface;
302 SDL_Texture *shape_texture;
303
304 SDL_PropertiesID props;
305
306 SDL_Texture *debug_char_texture_atlas;
307
308 bool destroyed; // already destroyed by SDL_DestroyWindow; just free this struct in SDL_DestroyRenderer.
309
310 void *internal;
311
312 SDL_Renderer *next;
313};
314
315// Define the SDL render driver structure
316struct SDL_RenderDriver
317{
318 bool (*CreateRenderer)(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID props);
319
320 const char *name;
321};
322
323// Not all of these are available in a given build. Use #ifdefs, etc.
324extern SDL_RenderDriver D3D_RenderDriver;
325extern SDL_RenderDriver D3D11_RenderDriver;
326extern SDL_RenderDriver D3D12_RenderDriver;
327extern SDL_RenderDriver GL_RenderDriver;
328extern SDL_RenderDriver GLES2_RenderDriver;
329extern SDL_RenderDriver METAL_RenderDriver;
330extern SDL_RenderDriver VULKAN_RenderDriver;
331extern SDL_RenderDriver PS2_RenderDriver;
332extern SDL_RenderDriver PSP_RenderDriver;
333extern SDL_RenderDriver SW_RenderDriver;
334extern SDL_RenderDriver VITA_GXM_RenderDriver;
335extern SDL_RenderDriver GPU_RenderDriver;
336
337// Clean up any renderers at shutdown
338extern void SDL_QuitRender(void);
339
340// Add a supported texture format to a renderer
341extern bool SDL_AddSupportedTextureFormat(SDL_Renderer *renderer, SDL_PixelFormat format);
342
343// Setup colorspace conversion
344extern void SDL_SetupRendererColorspace(SDL_Renderer *renderer, SDL_PropertiesID props);
345
346// Colorspace conversion functions
347extern bool SDL_RenderingLinearSpace(SDL_Renderer *renderer);
348extern void SDL_ConvertToLinear(SDL_FColor *color);
349extern void SDL_ConvertFromLinear(SDL_FColor *color);
350
351// Blend mode functions
352extern SDL_BlendFactor SDL_GetBlendModeSrcColorFactor(SDL_BlendMode blendMode);
353extern SDL_BlendFactor SDL_GetBlendModeDstColorFactor(SDL_BlendMode blendMode);
354extern SDL_BlendOperation SDL_GetBlendModeColorOperation(SDL_BlendMode blendMode);
355extern SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor(SDL_BlendMode blendMode);
356extern SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor(SDL_BlendMode blendMode);
357extern SDL_BlendOperation SDL_GetBlendModeAlphaOperation(SDL_BlendMode blendMode);
358
359/* drivers call this during their Queue*() methods to make space in a array that are used
360 for a vertex buffer during RunCommandQueue(). Pointers returned here are only valid until
361 the next call, because it might be in an array that gets realloc()'d. */
362extern void *SDL_AllocateRenderVertices(SDL_Renderer *renderer, size_t numbytes, size_t alignment, size_t *offset);
363
364// Let the video subsystem destroy a renderer without making its pointer invalid.
365extern void SDL_DestroyRendererWithoutFreeing(SDL_Renderer *renderer);
366
367// Ends C function definitions when using C++
368#ifdef __cplusplus
369}
370#endif
371
372#endif // SDL_sysrender_h_
diff --git a/SDL-3.2.8/src/render/SDL_yuv_sw.c b/SDL-3.2.8/src/render/SDL_yuv_sw.c
new file mode 100644
index 0000000..abe9e16
--- /dev/null
+++ b/SDL-3.2.8/src/render/SDL_yuv_sw.c
@@ -0,0 +1,404 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23// This is the software implementation of the YUV texture support
24
25#ifdef SDL_HAVE_YUV
26
27#include "SDL_yuv_sw_c.h"
28#include "../video/SDL_surface_c.h"
29#include "../video/SDL_yuv_c.h"
30
31SDL_SW_YUVTexture *SDL_SW_CreateYUVTexture(SDL_PixelFormat format, SDL_Colorspace colorspace, int w, int h)
32{
33 SDL_SW_YUVTexture *swdata;
34
35 switch (format) {
36 case SDL_PIXELFORMAT_YV12:
37 case SDL_PIXELFORMAT_IYUV:
38 case SDL_PIXELFORMAT_YUY2:
39 case SDL_PIXELFORMAT_UYVY:
40 case SDL_PIXELFORMAT_YVYU:
41 case SDL_PIXELFORMAT_NV12:
42 case SDL_PIXELFORMAT_NV21:
43 break;
44 default:
45 SDL_SetError("Unsupported YUV format");
46 return NULL;
47 }
48
49 swdata = (SDL_SW_YUVTexture *)SDL_calloc(1, sizeof(*swdata));
50 if (!swdata) {
51 return NULL;
52 }
53
54 swdata->format = format;
55 swdata->colorspace = colorspace;
56 swdata->target_format = SDL_PIXELFORMAT_UNKNOWN;
57 swdata->w = w;
58 swdata->h = h;
59 {
60 size_t dst_size;
61 if (!SDL_CalculateYUVSize(format, w, h, &dst_size, NULL)) {
62 SDL_SW_DestroyYUVTexture(swdata);
63 return NULL;
64 }
65 swdata->pixels = (Uint8 *)SDL_aligned_alloc(SDL_GetSIMDAlignment(), dst_size);
66 if (!swdata->pixels) {
67 SDL_SW_DestroyYUVTexture(swdata);
68 return NULL;
69 }
70 }
71
72 // Find the pitch and offset values for the texture
73 switch (format) {
74 case SDL_PIXELFORMAT_YV12:
75 case SDL_PIXELFORMAT_IYUV:
76 swdata->pitches[0] = w;
77 swdata->pitches[1] = (swdata->pitches[0] + 1) / 2;
78 swdata->pitches[2] = (swdata->pitches[0] + 1) / 2;
79 swdata->planes[0] = swdata->pixels;
80 swdata->planes[1] = swdata->planes[0] + swdata->pitches[0] * h;
81 swdata->planes[2] = swdata->planes[1] + swdata->pitches[1] * ((h + 1) / 2);
82 break;
83 case SDL_PIXELFORMAT_YUY2:
84 case SDL_PIXELFORMAT_UYVY:
85 case SDL_PIXELFORMAT_YVYU:
86 swdata->pitches[0] = ((w + 1) / 2) * 4;
87 swdata->planes[0] = swdata->pixels;
88 break;
89
90 case SDL_PIXELFORMAT_NV12:
91 case SDL_PIXELFORMAT_NV21:
92 swdata->pitches[0] = w;
93 swdata->pitches[1] = 2 * ((swdata->pitches[0] + 1) / 2);
94 swdata->planes[0] = swdata->pixels;
95 swdata->planes[1] = swdata->planes[0] + swdata->pitches[0] * h;
96 break;
97
98 default:
99 SDL_assert(!"We should never get here (caught above)");
100 break;
101 }
102
103 // We're all done..
104 return swdata;
105}
106
107bool SDL_SW_QueryYUVTexturePixels(SDL_SW_YUVTexture *swdata, void **pixels,
108 int *pitch)
109{
110 *pixels = swdata->planes[0];
111 *pitch = swdata->pitches[0];
112 return true;
113}
114
115bool SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect,
116 const void *pixels, int pitch)
117{
118 switch (swdata->format) {
119 case SDL_PIXELFORMAT_YV12:
120 case SDL_PIXELFORMAT_IYUV:
121 if (rect->x == 0 && rect->y == 0 &&
122 rect->w == swdata->w && rect->h == swdata->h) {
123 SDL_memcpy(swdata->pixels, pixels,
124 (size_t)(swdata->h * swdata->w) + 2 * ((swdata->h + 1) / 2) * ((swdata->w + 1) / 2));
125 } else {
126 Uint8 *src, *dst;
127 int row;
128 size_t length;
129
130 // Copy the Y plane
131 src = (Uint8 *)pixels;
132 dst = swdata->pixels + rect->y * swdata->w + rect->x;
133 length = rect->w;
134 for (row = 0; row < rect->h; ++row) {
135 SDL_memcpy(dst, src, length);
136 src += pitch;
137 dst += swdata->w;
138 }
139
140 // Copy the next plane
141 src = (Uint8 *)pixels + rect->h * pitch;
142 dst = swdata->pixels + swdata->h * swdata->w;
143 dst += rect->y / 2 * ((swdata->w + 1) / 2) + rect->x / 2;
144 length = (rect->w + 1) / 2;
145 for (row = 0; row < (rect->h + 1) / 2; ++row) {
146 SDL_memcpy(dst, src, length);
147 src += (pitch + 1) / 2;
148 dst += (swdata->w + 1) / 2;
149 }
150
151 // Copy the next plane
152 src = (Uint8 *)pixels + rect->h * pitch + ((rect->h + 1) / 2) * ((pitch + 1) / 2);
153 dst = swdata->pixels + swdata->h * swdata->w +
154 ((swdata->h + 1) / 2) * ((swdata->w + 1) / 2);
155 dst += rect->y / 2 * ((swdata->w + 1) / 2) + rect->x / 2;
156 length = (rect->w + 1) / 2;
157 for (row = 0; row < (rect->h + 1) / 2; ++row) {
158 SDL_memcpy(dst, src, length);
159 src += (pitch + 1) / 2;
160 dst += (swdata->w + 1) / 2;
161 }
162 }
163 break;
164 case SDL_PIXELFORMAT_YUY2:
165 case SDL_PIXELFORMAT_UYVY:
166 case SDL_PIXELFORMAT_YVYU:
167 {
168 Uint8 *src, *dst;
169 int row;
170 size_t length;
171
172 src = (Uint8 *)pixels;
173 dst =
174 swdata->planes[0] + rect->y * swdata->pitches[0] +
175 rect->x * 2;
176 length = 4 * (((size_t)rect->w + 1) / 2);
177 for (row = 0; row < rect->h; ++row) {
178 SDL_memcpy(dst, src, length);
179 src += pitch;
180 dst += swdata->pitches[0];
181 }
182 } break;
183 case SDL_PIXELFORMAT_NV12:
184 case SDL_PIXELFORMAT_NV21:
185 {
186 if (rect->x == 0 && rect->y == 0 && rect->w == swdata->w && rect->h == swdata->h) {
187 SDL_memcpy(swdata->pixels, pixels,
188 (size_t)(swdata->h * swdata->w) + 2 * ((swdata->h + 1) / 2) * ((swdata->w + 1) / 2));
189 } else {
190
191 Uint8 *src, *dst;
192 int row;
193 size_t length;
194
195 // Copy the Y plane
196 src = (Uint8 *)pixels;
197 dst = swdata->pixels + rect->y * swdata->w + rect->x;
198 length = rect->w;
199 for (row = 0; row < rect->h; ++row) {
200 SDL_memcpy(dst, src, length);
201 src += pitch;
202 dst += swdata->w;
203 }
204
205 // Copy the next plane
206 src = (Uint8 *)pixels + rect->h * pitch;
207 dst = swdata->pixels + swdata->h * swdata->w;
208 dst += 2 * ((rect->y + 1) / 2) * ((swdata->w + 1) / 2) + 2 * (rect->x / 2);
209 length = 2 * (((size_t)rect->w + 1) / 2);
210 for (row = 0; row < (rect->h + 1) / 2; ++row) {
211 SDL_memcpy(dst, src, length);
212 src += 2 * ((pitch + 1) / 2);
213 dst += 2 * ((swdata->w + 1) / 2);
214 }
215 }
216 } break;
217 default:
218 return SDL_SetError("Unsupported YUV format");
219 }
220 return true;
221}
222
223bool SDL_SW_UpdateYUVTexturePlanar(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect,
224 const Uint8 *Yplane, int Ypitch,
225 const Uint8 *Uplane, int Upitch,
226 const Uint8 *Vplane, int Vpitch)
227{
228 const Uint8 *src;
229 Uint8 *dst;
230 int row;
231 size_t length;
232
233 // Copy the Y plane
234 src = Yplane;
235 dst = swdata->pixels + rect->y * swdata->w + rect->x;
236 length = rect->w;
237 for (row = 0; row < rect->h; ++row) {
238 SDL_memcpy(dst, src, length);
239 src += Ypitch;
240 dst += swdata->w;
241 }
242
243 // Copy the U plane
244 src = Uplane;
245 if (swdata->format == SDL_PIXELFORMAT_IYUV) {
246 dst = swdata->pixels + swdata->h * swdata->w;
247 } else {
248 dst = swdata->pixels + swdata->h * swdata->w +
249 ((swdata->h + 1) / 2) * ((swdata->w + 1) / 2);
250 }
251 dst += rect->y / 2 * ((swdata->w + 1) / 2) + rect->x / 2;
252 length = (rect->w + 1) / 2;
253 for (row = 0; row < (rect->h + 1) / 2; ++row) {
254 SDL_memcpy(dst, src, length);
255 src += Upitch;
256 dst += (swdata->w + 1) / 2;
257 }
258
259 // Copy the V plane
260 src = Vplane;
261 if (swdata->format == SDL_PIXELFORMAT_YV12) {
262 dst = swdata->pixels + swdata->h * swdata->w;
263 } else {
264 dst = swdata->pixels + swdata->h * swdata->w +
265 ((swdata->h + 1) / 2) * ((swdata->w + 1) / 2);
266 }
267 dst += rect->y / 2 * ((swdata->w + 1) / 2) + rect->x / 2;
268 length = (rect->w + 1) / 2;
269 for (row = 0; row < (rect->h + 1) / 2; ++row) {
270 SDL_memcpy(dst, src, length);
271 src += Vpitch;
272 dst += (swdata->w + 1) / 2;
273 }
274 return true;
275}
276
277bool SDL_SW_UpdateNVTexturePlanar(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect,
278 const Uint8 *Yplane, int Ypitch,
279 const Uint8 *UVplane, int UVpitch)
280{
281 const Uint8 *src;
282 Uint8 *dst;
283 int row;
284 size_t length;
285
286 // Copy the Y plane
287 src = Yplane;
288 dst = swdata->pixels + rect->y * swdata->w + rect->x;
289 length = rect->w;
290 for (row = 0; row < rect->h; ++row) {
291 SDL_memcpy(dst, src, length);
292 src += Ypitch;
293 dst += swdata->w;
294 }
295
296 // Copy the UV or VU plane
297 src = UVplane;
298 dst = swdata->pixels + swdata->h * swdata->w;
299 dst += rect->y * ((swdata->w + 1) / 2) + rect->x;
300 length = (rect->w + 1) / 2;
301 length *= 2;
302 for (row = 0; row < (rect->h + 1) / 2; ++row) {
303 SDL_memcpy(dst, src, length);
304 src += UVpitch;
305 dst += 2 * ((swdata->w + 1) / 2);
306 }
307
308 return true;
309}
310
311bool SDL_SW_LockYUVTexture(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect,
312 void **pixels, int *pitch)
313{
314 switch (swdata->format) {
315 case SDL_PIXELFORMAT_YV12:
316 case SDL_PIXELFORMAT_IYUV:
317 case SDL_PIXELFORMAT_NV12:
318 case SDL_PIXELFORMAT_NV21:
319 if (rect && (rect->x != 0 || rect->y != 0 || rect->w != swdata->w || rect->h != swdata->h)) {
320 return SDL_SetError("YV12, IYUV, NV12, NV21 textures only support full surface locks");
321 }
322 break;
323 default:
324 return SDL_SetError("Unsupported YUV format");
325 }
326
327 if (rect) {
328 *pixels = swdata->planes[0] + rect->y * swdata->pitches[0] + rect->x * 2;
329 } else {
330 *pixels = swdata->planes[0];
331 }
332 *pitch = swdata->pitches[0];
333 return true;
334}
335
336void SDL_SW_UnlockYUVTexture(SDL_SW_YUVTexture *swdata)
337{
338}
339
340bool SDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture *swdata, const SDL_Rect *srcrect, SDL_PixelFormat target_format, int w, int h, void *pixels, int pitch)
341{
342 int stretch;
343
344 // Make sure we're set up to display in the desired format
345 if (target_format != swdata->target_format && swdata->display) {
346 SDL_DestroySurface(swdata->display);
347 swdata->display = NULL;
348 }
349
350 stretch = 0;
351 if (srcrect->x || srcrect->y || srcrect->w < swdata->w || srcrect->h < swdata->h) {
352 /* The source rectangle has been clipped.
353 Using a scratch surface is easier than adding clipped
354 source support to all the blitters, plus that would
355 slow them down in the general unclipped case.
356 */
357 stretch = 1;
358 } else if ((srcrect->w != w) || (srcrect->h != h)) {
359 stretch = 1;
360 }
361 if (stretch) {
362 if (swdata->display) {
363 swdata->display->w = w;
364 swdata->display->h = h;
365 swdata->display->pixels = pixels;
366 swdata->display->pitch = pitch;
367 } else {
368 swdata->display = SDL_CreateSurfaceFrom(w, h, target_format, pixels, pitch);
369 if (!swdata->display) {
370 return false;
371 }
372 swdata->target_format = target_format;
373 }
374 if (!swdata->stretch) {
375 swdata->stretch = SDL_CreateSurface(swdata->w, swdata->h, target_format);
376 if (!swdata->stretch) {
377 return false;
378 }
379 }
380 pixels = swdata->stretch->pixels;
381 pitch = swdata->stretch->pitch;
382 }
383 if (!SDL_ConvertPixelsAndColorspace(swdata->w, swdata->h, swdata->format, swdata->colorspace, 0, swdata->planes[0], swdata->pitches[0], target_format, SDL_COLORSPACE_SRGB, 0, pixels, pitch)) {
384 return false;
385 }
386 if (stretch) {
387 SDL_Rect rect = *srcrect;
388 return SDL_StretchSurface(swdata->stretch, &rect, swdata->display, NULL, SDL_SCALEMODE_NEAREST);
389 } else {
390 return true;
391 }
392}
393
394void SDL_SW_DestroyYUVTexture(SDL_SW_YUVTexture *swdata)
395{
396 if (swdata) {
397 SDL_aligned_free(swdata->pixels);
398 SDL_DestroySurface(swdata->stretch);
399 SDL_DestroySurface(swdata->display);
400 SDL_free(swdata);
401 }
402}
403
404#endif // SDL_HAVE_YUV
diff --git a/SDL-3.2.8/src/render/SDL_yuv_sw_c.h b/SDL-3.2.8/src/render/SDL_yuv_sw_c.h
new file mode 100644
index 0000000..807c44c
--- /dev/null
+++ b/SDL-3.2.8/src/render/SDL_yuv_sw_c.h
@@ -0,0 +1,63 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_yuv_sw_c_h_
23#define SDL_yuv_sw_c_h_
24
25#include "SDL_internal.h"
26
27// This is the software implementation of the YUV texture support
28
29struct SDL_SW_YUVTexture
30{
31 SDL_PixelFormat format;
32 SDL_Colorspace colorspace;
33 SDL_PixelFormat target_format;
34 int w, h;
35 Uint8 *pixels;
36
37 // These are just so we don't have to allocate them separately
38 int pitches[3];
39 Uint8 *planes[3];
40
41 // This is a temporary surface in case we have to stretch copy
42 SDL_Surface *stretch;
43 SDL_Surface *display;
44};
45
46typedef struct SDL_SW_YUVTexture SDL_SW_YUVTexture;
47
48extern SDL_SW_YUVTexture *SDL_SW_CreateYUVTexture(SDL_PixelFormat format, SDL_Colorspace colorspace, int w, int h);
49extern bool SDL_SW_QueryYUVTexturePixels(SDL_SW_YUVTexture *swdata, void **pixels, int *pitch);
50extern bool SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect, const void *pixels, int pitch);
51extern bool SDL_SW_UpdateYUVTexturePlanar(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect,
52 const Uint8 *Yplane, int Ypitch,
53 const Uint8 *Uplane, int Upitch,
54 const Uint8 *Vplane, int Vpitch);
55extern bool SDL_SW_UpdateNVTexturePlanar(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect,
56 const Uint8 *Yplane, int Ypitch,
57 const Uint8 *UVplane, int UVpitch);
58extern bool SDL_SW_LockYUVTexture(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect, void **pixels, int *pitch);
59extern void SDL_SW_UnlockYUVTexture(SDL_SW_YUVTexture *swdata);
60extern bool SDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture *swdata, const SDL_Rect *srcrect, SDL_PixelFormat target_format, int w, int h, void *pixels, int pitch);
61extern void SDL_SW_DestroyYUVTexture(SDL_SW_YUVTexture *swdata);
62
63#endif // SDL_yuv_sw_c_h_
diff --git a/SDL-3.2.8/src/render/direct3d/D3D9_PixelShader_YUV.h b/SDL-3.2.8/src/render/direct3d/D3D9_PixelShader_YUV.h
new file mode 100644
index 0000000..e6d9130
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d/D3D9_PixelShader_YUV.h
@@ -0,0 +1,164 @@
1#if 0
2//
3// Generated by Microsoft (R) HLSL Shader Compiler 10.1
4//
5// Parameters:
6//
7// float4 Bcoeff;
8// float4 Gcoeff;
9// float4 Rcoeff;
10// float4 Yoffset;
11// Texture2D theSampler+theTextureU;
12// Texture2D theSampler+theTextureV;
13// Texture2D theSampler+theTextureY;
14//
15//
16// Registers:
17//
18// Name Reg Size
19// ---------------------- ----- ----
20// Yoffset c0 1
21// Rcoeff c1 1
22// Gcoeff c2 1
23// Bcoeff c3 1
24// theSampler+theTextureY s0 1
25// theSampler+theTextureU s1 1
26// theSampler+theTextureV s2 1
27//
28
29 ps_2_0
30 def c4, 1, 0, 0, 0
31 dcl t0.xy
32 dcl v0
33 dcl_2d s0
34 dcl_2d s1
35 dcl_2d s2
36 texld r0, t0, s0
37 texld r1, t0, s1
38 texld r2, t0, s2
39 mov r0.y, r1.x
40 mov r0.z, r2.x
41 add r0.xyz, r0, c0
42 dp3 r1.x, r0, c1
43 dp3 r1.y, r0, c2
44 dp3 r1.z, r0, c3
45 mov r1.w, c4.x
46 mul r0, r1, v0
47 mov oC0, r0
48
49// approximately 12 instruction slots used (3 texture, 9 arithmetic)
50#endif
51
52const BYTE g_ps20_main[] =
53{
54 0, 2, 255, 255, 254, 255,
55 97, 0, 67, 84, 65, 66,
56 28, 0, 0, 0, 87, 1,
57 0, 0, 0, 2, 255, 255,
58 7, 0, 0, 0, 28, 0,
59 0, 0, 0, 1, 0, 0,
60 80, 1, 0, 0, 168, 0,
61 0, 0, 2, 0, 3, 0,
62 1, 0, 0, 0, 176, 0,
63 0, 0, 0, 0, 0, 0,
64 192, 0, 0, 0, 2, 0,
65 2, 0, 1, 0, 0, 0,
66 176, 0, 0, 0, 0, 0,
67 0, 0, 199, 0, 0, 0,
68 2, 0, 1, 0, 1, 0,
69 0, 0, 176, 0, 0, 0,
70 0, 0, 0, 0, 206, 0,
71 0, 0, 2, 0, 0, 0,
72 1, 0, 0, 0, 176, 0,
73 0, 0, 0, 0, 0, 0,
74 214, 0, 0, 0, 3, 0,
75 1, 0, 1, 0, 0, 0,
76 240, 0, 0, 0, 0, 0,
77 0, 0, 0, 1, 0, 0,
78 3, 0, 2, 0, 1, 0,
79 0, 0, 24, 1, 0, 0,
80 0, 0, 0, 0, 40, 1,
81 0, 0, 3, 0, 0, 0,
82 1, 0, 0, 0, 64, 1,
83 0, 0, 0, 0, 0, 0,
84 66, 99, 111, 101, 102, 102,
85 0, 171, 1, 0, 3, 0,
86 1, 0, 4, 0, 1, 0,
87 0, 0, 0, 0, 0, 0,
88 71, 99, 111, 101, 102, 102,
89 0, 82, 99, 111, 101, 102,
90 102, 0, 89, 111, 102, 102,
91 115, 101, 116, 0, 116, 104,
92 101, 83, 97, 109, 112, 108,
93 101, 114, 43, 116, 104, 101,
94 84, 101, 120, 116, 117, 114,
95 101, 85, 0, 171, 171, 171,
96 4, 0, 7, 0, 1, 0,
97 4, 0, 1, 0, 0, 0,
98 0, 0, 0, 0, 116, 104,
99 101, 83, 97, 109, 112, 108,
100 101, 114, 43, 116, 104, 101,
101 84, 101, 120, 116, 117, 114,
102 101, 86, 0, 171, 4, 0,
103 7, 0, 1, 0, 4, 0,
104 1, 0, 0, 0, 0, 0,
105 0, 0, 116, 104, 101, 83,
106 97, 109, 112, 108, 101, 114,
107 43, 116, 104, 101, 84, 101,
108 120, 116, 117, 114, 101, 89,
109 0, 171, 4, 0, 7, 0,
110 1, 0, 4, 0, 1, 0,
111 0, 0, 0, 0, 0, 0,
112 112, 115, 95, 50, 95, 48,
113 0, 77, 105, 99, 114, 111,
114 115, 111, 102, 116, 32, 40,
115 82, 41, 32, 72, 76, 83,
116 76, 32, 83, 104, 97, 100,
117 101, 114, 32, 67, 111, 109,
118 112, 105, 108, 101, 114, 32,
119 49, 48, 46, 49, 0, 171,
120 81, 0, 0, 5, 4, 0,
121 15, 160, 0, 0, 128, 63,
122 0, 0, 0, 0, 0, 0,
123 0, 0, 0, 0, 0, 0,
124 31, 0, 0, 2, 0, 0,
125 0, 128, 0, 0, 3, 176,
126 31, 0, 0, 2, 0, 0,
127 0, 128, 0, 0, 15, 144,
128 31, 0, 0, 2, 0, 0,
129 0, 144, 0, 8, 15, 160,
130 31, 0, 0, 2, 0, 0,
131 0, 144, 1, 8, 15, 160,
132 31, 0, 0, 2, 0, 0,
133 0, 144, 2, 8, 15, 160,
134 66, 0, 0, 3, 0, 0,
135 15, 128, 0, 0, 228, 176,
136 0, 8, 228, 160, 66, 0,
137 0, 3, 1, 0, 15, 128,
138 0, 0, 228, 176, 1, 8,
139 228, 160, 66, 0, 0, 3,
140 2, 0, 15, 128, 0, 0,
141 228, 176, 2, 8, 228, 160,
142 1, 0, 0, 2, 0, 0,
143 2, 128, 1, 0, 0, 128,
144 1, 0, 0, 2, 0, 0,
145 4, 128, 2, 0, 0, 128,
146 2, 0, 0, 3, 0, 0,
147 7, 128, 0, 0, 228, 128,
148 0, 0, 228, 160, 8, 0,
149 0, 3, 1, 0, 1, 128,
150 0, 0, 228, 128, 1, 0,
151 228, 160, 8, 0, 0, 3,
152 1, 0, 2, 128, 0, 0,
153 228, 128, 2, 0, 228, 160,
154 8, 0, 0, 3, 1, 0,
155 4, 128, 0, 0, 228, 128,
156 3, 0, 228, 160, 1, 0,
157 0, 2, 1, 0, 8, 128,
158 4, 0, 0, 160, 5, 0,
159 0, 3, 0, 0, 15, 128,
160 1, 0, 228, 128, 0, 0,
161 228, 144, 1, 0, 0, 2,
162 0, 8, 15, 128, 0, 0,
163 228, 128, 255, 255, 0, 0
164};
diff --git a/SDL-3.2.8/src/render/direct3d/D3D9_PixelShader_YUV.hlsl b/SDL-3.2.8/src/render/direct3d/D3D9_PixelShader_YUV.hlsl
new file mode 100644
index 0000000..8804848
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d/D3D9_PixelShader_YUV.hlsl
@@ -0,0 +1,47 @@
1
2Texture2D theTextureY : register(t0);
3Texture2D theTextureU : register(t1);
4Texture2D theTextureV : register(t2);
5
6SamplerState theSampler = sampler_state
7{
8 addressU = Clamp;
9 addressV = Clamp;
10 mipfilter = NONE;
11 minfilter = LINEAR;
12 magfilter = LINEAR;
13};
14
15struct PixelShaderInput
16{
17 float4 pos : SV_POSITION;
18 float2 tex : TEXCOORD0;
19 float4 color : COLOR0;
20};
21
22cbuffer Constants : register(b0)
23{
24 float4 Yoffset;
25 float4 Rcoeff;
26 float4 Gcoeff;
27 float4 Bcoeff;
28};
29
30
31float4 main(PixelShaderInput input) : SV_TARGET
32{
33 float4 Output;
34
35 float3 yuv;
36 yuv.x = theTextureY.Sample(theSampler, input.tex).r;
37 yuv.y = theTextureU.Sample(theSampler, input.tex).r;
38 yuv.z = theTextureV.Sample(theSampler, input.tex).r;
39
40 yuv += Yoffset.xyz;
41 Output.r = dot(yuv, Rcoeff.xyz);
42 Output.g = dot(yuv, Gcoeff.xyz);
43 Output.b = dot(yuv, Bcoeff.xyz);
44 Output.a = 1.0f;
45
46 return Output * input.color;
47}
diff --git a/SDL-3.2.8/src/render/direct3d/SDL_render_d3d.c b/SDL-3.2.8/src/render/direct3d/SDL_render_d3d.c
new file mode 100644
index 0000000..ccb5b3c
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d/SDL_render_d3d.c
@@ -0,0 +1,1778 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_D3D
24
25#include "../../core/windows/SDL_windows.h"
26
27#include "../SDL_sysrender.h"
28#include "../SDL_d3dmath.h"
29#include "../../video/windows/SDL_windowsvideo.h"
30#include "../../video/SDL_pixels_c.h"
31
32#define D3D_DEBUG_INFO
33#include <d3d9.h>
34
35#include "SDL_shaders_d3d.h"
36
37typedef struct
38{
39 SDL_Rect viewport;
40 bool viewport_dirty;
41 SDL_Texture *texture;
42 SDL_BlendMode blend;
43 bool cliprect_enabled;
44 bool cliprect_enabled_dirty;
45 SDL_Rect cliprect;
46 bool cliprect_dirty;
47 D3D9_Shader shader;
48 const float *shader_params;
49} D3D_DrawStateCache;
50
51// Direct3D renderer implementation
52
53typedef struct
54{
55 void *d3dDLL;
56 IDirect3D9 *d3d;
57 IDirect3DDevice9 *device;
58 UINT adapter;
59 D3DPRESENT_PARAMETERS pparams;
60 bool updateSize;
61 bool beginScene;
62 bool enableSeparateAlphaBlend;
63 D3DTEXTUREFILTERTYPE scaleMode[3];
64 SDL_TextureAddressMode addressMode[3];
65 IDirect3DSurface9 *defaultRenderTarget;
66 IDirect3DSurface9 *currentRenderTarget;
67 void *d3dxDLL;
68#ifdef SDL_HAVE_YUV
69 LPDIRECT3DPIXELSHADER9 shaders[NUM_SHADERS];
70#endif
71 LPDIRECT3DVERTEXBUFFER9 vertexBuffers[8];
72 size_t vertexBufferSize[8];
73 int currentVertexBuffer;
74 bool reportedVboProblem;
75 D3D_DrawStateCache drawstate;
76} D3D_RenderData;
77
78typedef struct
79{
80 bool dirty;
81 int w, h;
82 DWORD usage;
83 Uint32 format;
84 D3DFORMAT d3dfmt;
85 IDirect3DTexture9 *texture;
86 IDirect3DTexture9 *staging;
87} D3D_TextureRep;
88
89typedef struct
90{
91 D3D_TextureRep texture;
92 D3DTEXTUREFILTERTYPE scaleMode;
93 D3D9_Shader shader;
94 const float *shader_params;
95
96#ifdef SDL_HAVE_YUV
97 // YV12 texture support
98 bool yuv;
99 D3D_TextureRep utexture;
100 D3D_TextureRep vtexture;
101 Uint8 *pixels;
102 int pitch;
103 SDL_Rect locked_rect;
104#endif
105} D3D_TextureData;
106
107typedef struct
108{
109 float x, y, z;
110 DWORD color;
111 float u, v;
112} Vertex;
113
114static bool D3D_SetError(const char *prefix, HRESULT result)
115{
116 const char *error;
117
118 switch (result) {
119 case D3DERR_WRONGTEXTUREFORMAT:
120 error = "WRONGTEXTUREFORMAT";
121 break;
122 case D3DERR_UNSUPPORTEDCOLOROPERATION:
123 error = "UNSUPPORTEDCOLOROPERATION";
124 break;
125 case D3DERR_UNSUPPORTEDCOLORARG:
126 error = "UNSUPPORTEDCOLORARG";
127 break;
128 case D3DERR_UNSUPPORTEDALPHAOPERATION:
129 error = "UNSUPPORTEDALPHAOPERATION";
130 break;
131 case D3DERR_UNSUPPORTEDALPHAARG:
132 error = "UNSUPPORTEDALPHAARG";
133 break;
134 case D3DERR_TOOMANYOPERATIONS:
135 error = "TOOMANYOPERATIONS";
136 break;
137 case D3DERR_CONFLICTINGTEXTUREFILTER:
138 error = "CONFLICTINGTEXTUREFILTER";
139 break;
140 case D3DERR_UNSUPPORTEDFACTORVALUE:
141 error = "UNSUPPORTEDFACTORVALUE";
142 break;
143 case D3DERR_CONFLICTINGRENDERSTATE:
144 error = "CONFLICTINGRENDERSTATE";
145 break;
146 case D3DERR_UNSUPPORTEDTEXTUREFILTER:
147 error = "UNSUPPORTEDTEXTUREFILTER";
148 break;
149 case D3DERR_CONFLICTINGTEXTUREPALETTE:
150 error = "CONFLICTINGTEXTUREPALETTE";
151 break;
152 case D3DERR_DRIVERINTERNALERROR:
153 error = "DRIVERINTERNALERROR";
154 break;
155 case D3DERR_NOTFOUND:
156 error = "NOTFOUND";
157 break;
158 case D3DERR_MOREDATA:
159 error = "MOREDATA";
160 break;
161 case D3DERR_DEVICELOST:
162 error = "DEVICELOST";
163 break;
164 case D3DERR_DEVICENOTRESET:
165 error = "DEVICENOTRESET";
166 break;
167 case D3DERR_NOTAVAILABLE:
168 error = "NOTAVAILABLE";
169 break;
170 case D3DERR_OUTOFVIDEOMEMORY:
171 error = "OUTOFVIDEOMEMORY";
172 break;
173 case D3DERR_INVALIDDEVICE:
174 error = "INVALIDDEVICE";
175 break;
176 case D3DERR_INVALIDCALL:
177 error = "INVALIDCALL";
178 break;
179 case D3DERR_DRIVERINVALIDCALL:
180 error = "DRIVERINVALIDCALL";
181 break;
182 case D3DERR_WASSTILLDRAWING:
183 error = "WASSTILLDRAWING";
184 break;
185 default:
186 error = "UNKNOWN";
187 break;
188 }
189 return SDL_SetError("%s: %s", prefix, error);
190}
191
192static D3DFORMAT PixelFormatToD3DFMT(Uint32 format)
193{
194 switch (format) {
195 case SDL_PIXELFORMAT_RGB565:
196 return D3DFMT_R5G6B5;
197 case SDL_PIXELFORMAT_XRGB8888:
198 return D3DFMT_X8R8G8B8;
199 case SDL_PIXELFORMAT_ARGB8888:
200 return D3DFMT_A8R8G8B8;
201 case SDL_PIXELFORMAT_YV12:
202 case SDL_PIXELFORMAT_IYUV:
203 case SDL_PIXELFORMAT_NV12:
204 case SDL_PIXELFORMAT_NV21:
205 return D3DFMT_L8;
206 default:
207 return D3DFMT_UNKNOWN;
208 }
209}
210
211static SDL_PixelFormat D3DFMTToPixelFormat(D3DFORMAT format)
212{
213 switch (format) {
214 case D3DFMT_R5G6B5:
215 return SDL_PIXELFORMAT_RGB565;
216 case D3DFMT_X8R8G8B8:
217 return SDL_PIXELFORMAT_XRGB8888;
218 case D3DFMT_A8R8G8B8:
219 return SDL_PIXELFORMAT_ARGB8888;
220 default:
221 return SDL_PIXELFORMAT_UNKNOWN;
222 }
223}
224
225static void D3D_InitRenderState(D3D_RenderData *data)
226{
227 D3DMATRIX matrix;
228
229 IDirect3DDevice9 *device = data->device;
230 IDirect3DDevice9_SetPixelShader(device, NULL);
231 IDirect3DDevice9_SetTexture(device, 0, NULL);
232 IDirect3DDevice9_SetTexture(device, 1, NULL);
233 IDirect3DDevice9_SetTexture(device, 2, NULL);
234 IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
235 IDirect3DDevice9_SetVertexShader(device, NULL);
236 IDirect3DDevice9_SetRenderState(device, D3DRS_ZENABLE, D3DZB_FALSE);
237 IDirect3DDevice9_SetRenderState(device, D3DRS_CULLMODE, D3DCULL_NONE);
238 IDirect3DDevice9_SetRenderState(device, D3DRS_LIGHTING, FALSE);
239
240 // Enable color modulation by diffuse color
241 IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP,
242 D3DTOP_MODULATE);
243 IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1,
244 D3DTA_TEXTURE);
245 IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG2,
246 D3DTA_DIFFUSE);
247
248 // Enable alpha modulation by diffuse alpha
249 IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAOP,
250 D3DTOP_MODULATE);
251 IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAARG1,
252 D3DTA_TEXTURE);
253 IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAARG2,
254 D3DTA_DIFFUSE);
255
256 // Enable separate alpha blend function, if possible
257 if (data->enableSeparateAlphaBlend) {
258 IDirect3DDevice9_SetRenderState(device, D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
259 }
260
261 // Disable second texture stage, since we're done
262 IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_COLOROP,
263 D3DTOP_DISABLE);
264 IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_ALPHAOP,
265 D3DTOP_DISABLE);
266
267 // Set an identity world and view matrix
268 SDL_zero(matrix);
269 matrix.m[0][0] = 1.0f;
270 matrix.m[1][1] = 1.0f;
271 matrix.m[2][2] = 1.0f;
272 matrix.m[3][3] = 1.0f;
273 IDirect3DDevice9_SetTransform(device, D3DTS_WORLD, &matrix);
274 IDirect3DDevice9_SetTransform(device, D3DTS_VIEW, &matrix);
275
276 // Reset our current scale mode
277 SDL_memset(data->scaleMode, 0xFF, sizeof(data->scaleMode));
278
279 // Reset our current address mode
280 SDL_zeroa(data->addressMode);
281
282 // Start the render with beginScene
283 data->beginScene = true;
284}
285
286static bool D3D_Reset(SDL_Renderer *renderer);
287
288static bool D3D_ActivateRenderer(SDL_Renderer *renderer)
289{
290 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
291 HRESULT result;
292
293 if (data->updateSize) {
294 SDL_Window *window = renderer->window;
295 int w, h;
296 const SDL_DisplayMode *fullscreen_mode = NULL;
297
298 SDL_GetWindowSizeInPixels(window, &w, &h);
299 data->pparams.BackBufferWidth = w;
300 data->pparams.BackBufferHeight = h;
301 if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) {
302 fullscreen_mode = SDL_GetWindowFullscreenMode(window);
303 }
304 if (fullscreen_mode) {
305 data->pparams.Windowed = FALSE;
306 data->pparams.BackBufferFormat = PixelFormatToD3DFMT(fullscreen_mode->format);
307 data->pparams.FullScreen_RefreshRateInHz = (UINT)SDL_ceilf(fullscreen_mode->refresh_rate);
308 } else {
309 data->pparams.Windowed = TRUE;
310 data->pparams.BackBufferFormat = D3DFMT_UNKNOWN;
311 data->pparams.FullScreen_RefreshRateInHz = 0;
312 }
313 if (!D3D_Reset(renderer)) {
314 return false;
315 }
316
317 data->updateSize = false;
318 }
319 if (data->beginScene) {
320 result = IDirect3DDevice9_BeginScene(data->device);
321 if (result == D3DERR_DEVICELOST) {
322 if (!D3D_Reset(renderer)) {
323 return false;
324 }
325 result = IDirect3DDevice9_BeginScene(data->device);
326 }
327 if (FAILED(result)) {
328 return D3D_SetError("BeginScene()", result);
329 }
330 data->beginScene = false;
331 }
332 return true;
333}
334
335static void D3D_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
336{
337 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
338
339 if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
340 data->updateSize = true;
341 }
342}
343
344static D3DBLEND GetBlendFunc(SDL_BlendFactor factor)
345{
346 switch (factor) {
347 case SDL_BLENDFACTOR_ZERO:
348 return D3DBLEND_ZERO;
349 case SDL_BLENDFACTOR_ONE:
350 return D3DBLEND_ONE;
351 case SDL_BLENDFACTOR_SRC_COLOR:
352 return D3DBLEND_SRCCOLOR;
353 case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
354 return D3DBLEND_INVSRCCOLOR;
355 case SDL_BLENDFACTOR_SRC_ALPHA:
356 return D3DBLEND_SRCALPHA;
357 case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
358 return D3DBLEND_INVSRCALPHA;
359 case SDL_BLENDFACTOR_DST_COLOR:
360 return D3DBLEND_DESTCOLOR;
361 case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
362 return D3DBLEND_INVDESTCOLOR;
363 case SDL_BLENDFACTOR_DST_ALPHA:
364 return D3DBLEND_DESTALPHA;
365 case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
366 return D3DBLEND_INVDESTALPHA;
367 default:
368 break;
369 }
370 return (D3DBLEND)0;
371}
372
373static D3DBLENDOP GetBlendEquation(SDL_BlendOperation operation)
374{
375 switch (operation) {
376 case SDL_BLENDOPERATION_ADD:
377 return D3DBLENDOP_ADD;
378 case SDL_BLENDOPERATION_SUBTRACT:
379 return D3DBLENDOP_SUBTRACT;
380 case SDL_BLENDOPERATION_REV_SUBTRACT:
381 return D3DBLENDOP_REVSUBTRACT;
382 case SDL_BLENDOPERATION_MINIMUM:
383 return D3DBLENDOP_MIN;
384 case SDL_BLENDOPERATION_MAXIMUM:
385 return D3DBLENDOP_MAX;
386 default:
387 break;
388 }
389 return (D3DBLENDOP)0;
390}
391
392static bool D3D_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
393{
394 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
395 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
396 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
397 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
398 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
399 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
400 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
401
402 if (!GetBlendFunc(srcColorFactor) || !GetBlendFunc(srcAlphaFactor) ||
403 !GetBlendEquation(colorOperation) ||
404 !GetBlendFunc(dstColorFactor) || !GetBlendFunc(dstAlphaFactor) ||
405 !GetBlendEquation(alphaOperation)) {
406 return false;
407 }
408
409 if (!data->enableSeparateAlphaBlend) {
410 if ((srcColorFactor != srcAlphaFactor) || (dstColorFactor != dstAlphaFactor) || (colorOperation != alphaOperation)) {
411 return false;
412 }
413 }
414 return true;
415}
416
417static bool D3D_CreateTextureRep(IDirect3DDevice9 *device, D3D_TextureRep *texture, DWORD usage, Uint32 format, D3DFORMAT d3dfmt, int w, int h)
418{
419 HRESULT result;
420
421 texture->dirty = false;
422 texture->w = w;
423 texture->h = h;
424 texture->usage = usage;
425 texture->format = format;
426 texture->d3dfmt = d3dfmt;
427
428 result = IDirect3DDevice9_CreateTexture(device, w, h, 1, usage,
429 PixelFormatToD3DFMT(format),
430 D3DPOOL_DEFAULT, &texture->texture, NULL);
431 if (FAILED(result)) {
432 return D3D_SetError("CreateTexture(D3DPOOL_DEFAULT)", result);
433 }
434 return true;
435}
436
437static bool D3D_CreateStagingTexture(IDirect3DDevice9 *device, D3D_TextureRep *texture)
438{
439 HRESULT result;
440
441 if (!texture->staging) {
442 result = IDirect3DDevice9_CreateTexture(device, texture->w, texture->h, 1, 0,
443 texture->d3dfmt, D3DPOOL_SYSTEMMEM, &texture->staging, NULL);
444 if (FAILED(result)) {
445 return D3D_SetError("CreateTexture(D3DPOOL_SYSTEMMEM)", result);
446 }
447 }
448 return true;
449}
450
451static bool D3D_RecreateTextureRep(IDirect3DDevice9 *device, D3D_TextureRep *texture)
452{
453 if (texture->texture) {
454 IDirect3DTexture9_Release(texture->texture);
455 texture->texture = NULL;
456 }
457 if (texture->staging) {
458 IDirect3DTexture9_AddDirtyRect(texture->staging, NULL);
459 texture->dirty = true;
460 }
461 return true;
462}
463
464static bool D3D_UpdateTextureRep(IDirect3DDevice9 *device, D3D_TextureRep *texture, int x, int y, int w, int h, const void *pixels, int pitch)
465{
466 RECT d3drect;
467 D3DLOCKED_RECT locked;
468 const Uint8 *src;
469 Uint8 *dst;
470 int row, length;
471 HRESULT result;
472
473 if (!D3D_CreateStagingTexture(device, texture)) {
474 return false;
475 }
476
477 d3drect.left = x;
478 d3drect.right = (LONG)x + w;
479 d3drect.top = y;
480 d3drect.bottom = (LONG)y + h;
481
482 result = IDirect3DTexture9_LockRect(texture->staging, 0, &locked, &d3drect, 0);
483 if (FAILED(result)) {
484 return D3D_SetError("LockRect()", result);
485 }
486
487 src = (const Uint8 *)pixels;
488 dst = (Uint8 *)locked.pBits;
489 length = w * SDL_BYTESPERPIXEL(texture->format);
490 if (length == pitch && length == locked.Pitch) {
491 SDL_memcpy(dst, src, (size_t)length * h);
492 } else {
493 if (length > pitch) {
494 length = pitch;
495 }
496 if (length > locked.Pitch) {
497 length = locked.Pitch;
498 }
499 for (row = 0; row < h; ++row) {
500 SDL_memcpy(dst, src, length);
501 src += pitch;
502 dst += locked.Pitch;
503 }
504 }
505 result = IDirect3DTexture9_UnlockRect(texture->staging, 0);
506 if (FAILED(result)) {
507 return D3D_SetError("UnlockRect()", result);
508 }
509 texture->dirty = true;
510
511 return true;
512}
513
514static void D3D_DestroyTextureRep(D3D_TextureRep *texture)
515{
516 if (texture->texture) {
517 IDirect3DTexture9_Release(texture->texture);
518 texture->texture = NULL;
519 }
520 if (texture->staging) {
521 IDirect3DTexture9_Release(texture->staging);
522 texture->staging = NULL;
523 }
524}
525
526static bool D3D_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
527{
528 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
529 D3D_TextureData *texturedata;
530 DWORD usage;
531
532 texturedata = (D3D_TextureData *)SDL_calloc(1, sizeof(*texturedata));
533 if (!texturedata) {
534 return false;
535 }
536 texturedata->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? D3DTEXF_POINT : D3DTEXF_LINEAR;
537
538 texture->internal = texturedata;
539
540 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
541 usage = D3DUSAGE_RENDERTARGET;
542 } else {
543 usage = 0;
544 }
545
546 if (!D3D_CreateTextureRep(data->device, &texturedata->texture, usage, texture->format, PixelFormatToD3DFMT(texture->format), texture->w, texture->h)) {
547 return false;
548 }
549#ifdef SDL_HAVE_YUV
550 if (texture->format == SDL_PIXELFORMAT_YV12 ||
551 texture->format == SDL_PIXELFORMAT_IYUV) {
552 texturedata->yuv = true;
553
554 if (!D3D_CreateTextureRep(data->device, &texturedata->utexture, usage, texture->format, PixelFormatToD3DFMT(texture->format), (texture->w + 1) / 2, (texture->h + 1) / 2)) {
555 return false;
556 }
557
558 if (!D3D_CreateTextureRep(data->device, &texturedata->vtexture, usage, texture->format, PixelFormatToD3DFMT(texture->format), (texture->w + 1) / 2, (texture->h + 1) / 2)) {
559 return false;
560 }
561
562 texturedata->shader = SHADER_YUV;
563 texturedata->shader_params = SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8);
564 if (texturedata->shader_params == NULL) {
565 return SDL_SetError("Unsupported YUV colorspace");
566 }
567 }
568#endif
569 return true;
570}
571
572static bool D3D_RecreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
573{
574 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
575 D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
576
577 if (!texturedata) {
578 return true;
579 }
580
581 if (!D3D_RecreateTextureRep(data->device, &texturedata->texture)) {
582 return false;
583 }
584#ifdef SDL_HAVE_YUV
585 if (texturedata->yuv) {
586 if (!D3D_RecreateTextureRep(data->device, &texturedata->utexture)) {
587 return false;
588 }
589
590 if (!D3D_RecreateTextureRep(data->device, &texturedata->vtexture)) {
591 return false;
592 }
593 }
594#endif
595 return true;
596}
597
598static bool D3D_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
599 const SDL_Rect *rect, const void *pixels, int pitch)
600{
601 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
602 D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
603
604 if (!texturedata) {
605 return SDL_SetError("Texture is not currently available");
606 }
607
608 if (!D3D_UpdateTextureRep(data->device, &texturedata->texture, rect->x, rect->y, rect->w, rect->h, pixels, pitch)) {
609 return false;
610 }
611#ifdef SDL_HAVE_YUV
612 if (texturedata->yuv) {
613 // Skip to the correct offset into the next texture
614 pixels = (const void *)((const Uint8 *)pixels + rect->h * pitch);
615
616 if (!D3D_UpdateTextureRep(data->device, texture->format == SDL_PIXELFORMAT_YV12 ? &texturedata->vtexture : &texturedata->utexture, rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, pixels, (pitch + 1) / 2)) {
617 return false;
618 }
619
620 // Skip to the correct offset into the next texture
621 pixels = (const void *)((const Uint8 *)pixels + ((rect->h + 1) / 2) * ((pitch + 1) / 2));
622 if (!D3D_UpdateTextureRep(data->device, texture->format == SDL_PIXELFORMAT_YV12 ? &texturedata->utexture : &texturedata->vtexture, rect->x / 2, (rect->y + 1) / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, pixels, (pitch + 1) / 2)) {
623 return false;
624 }
625 }
626#endif
627 return true;
628}
629
630#ifdef SDL_HAVE_YUV
631static bool D3D_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
632 const SDL_Rect *rect,
633 const Uint8 *Yplane, int Ypitch,
634 const Uint8 *Uplane, int Upitch,
635 const Uint8 *Vplane, int Vpitch)
636{
637 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
638 D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
639
640 if (!texturedata) {
641 return SDL_SetError("Texture is not currently available");
642 }
643
644 if (!D3D_UpdateTextureRep(data->device, &texturedata->texture, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch)) {
645 return false;
646 }
647 if (!D3D_UpdateTextureRep(data->device, &texturedata->utexture, rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, Uplane, Upitch)) {
648 return false;
649 }
650 if (!D3D_UpdateTextureRep(data->device, &texturedata->vtexture, rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, Vplane, Vpitch)) {
651 return false;
652 }
653 return true;
654}
655#endif
656
657static bool D3D_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
658 const SDL_Rect *rect, void **pixels, int *pitch)
659{
660 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
661 D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
662 IDirect3DDevice9 *device = data->device;
663
664 if (!texturedata) {
665 return SDL_SetError("Texture is not currently available");
666 }
667#ifdef SDL_HAVE_YUV
668 texturedata->locked_rect = *rect;
669
670 if (texturedata->yuv) {
671 // It's more efficient to upload directly...
672 if (!texturedata->pixels) {
673 texturedata->pitch = texture->w;
674 texturedata->pixels = (Uint8 *)SDL_malloc((texture->h * texturedata->pitch * 3) / 2);
675 if (!texturedata->pixels) {
676 return false;
677 }
678 }
679 *pixels =
680 (void *)(texturedata->pixels + rect->y * texturedata->pitch +
681 rect->x * SDL_BYTESPERPIXEL(texture->format));
682 *pitch = texturedata->pitch;
683 } else
684#endif
685 {
686 RECT d3drect;
687 D3DLOCKED_RECT locked;
688 HRESULT result;
689
690 if (!D3D_CreateStagingTexture(device, &texturedata->texture)) {
691 return false;
692 }
693
694 d3drect.left = rect->x;
695 d3drect.right = (LONG)rect->x + rect->w;
696 d3drect.top = rect->y;
697 d3drect.bottom = (LONG)rect->y + rect->h;
698
699 result = IDirect3DTexture9_LockRect(texturedata->texture.staging, 0, &locked, &d3drect, 0);
700 if (FAILED(result)) {
701 return D3D_SetError("LockRect()", result);
702 }
703 *pixels = locked.pBits;
704 *pitch = locked.Pitch;
705 }
706 return true;
707}
708
709static void D3D_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
710{
711 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
712 D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
713
714 if (!texturedata) {
715 return;
716 }
717#ifdef SDL_HAVE_YUV
718 if (texturedata->yuv) {
719 const SDL_Rect *rect = &texturedata->locked_rect;
720 void *pixels =
721 (void *)(texturedata->pixels + rect->y * texturedata->pitch +
722 rect->x * SDL_BYTESPERPIXEL(texture->format));
723 D3D_UpdateTexture(renderer, texture, rect, pixels, texturedata->pitch);
724 } else
725#endif
726 {
727 IDirect3DTexture9_UnlockRect(texturedata->texture.staging, 0);
728 texturedata->texture.dirty = true;
729 if (data->drawstate.texture == texture) {
730 data->drawstate.texture = NULL;
731 data->drawstate.shader = SHADER_NONE;
732 data->drawstate.shader_params = NULL;
733 IDirect3DDevice9_SetPixelShader(data->device, NULL);
734 IDirect3DDevice9_SetTexture(data->device, 0, NULL);
735 }
736 }
737}
738
739static void D3D_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
740{
741 D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
742
743 if (!texturedata) {
744 return;
745 }
746
747 texturedata->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? D3DTEXF_POINT : D3DTEXF_LINEAR;
748}
749
750static bool D3D_SetRenderTargetInternal(SDL_Renderer *renderer, SDL_Texture *texture)
751{
752 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
753 D3D_TextureData *texturedata;
754 D3D_TextureRep *texturerep;
755 HRESULT result;
756 IDirect3DDevice9 *device = data->device;
757
758 // Release the previous render target if it wasn't the default one
759 if (data->currentRenderTarget) {
760 IDirect3DSurface9_Release(data->currentRenderTarget);
761 data->currentRenderTarget = NULL;
762 }
763
764 if (!texture) {
765 IDirect3DDevice9_SetRenderTarget(data->device, 0, data->defaultRenderTarget);
766 return true;
767 }
768
769 texturedata = (D3D_TextureData *)texture->internal;
770 if (!texturedata) {
771 return SDL_SetError("Texture is not currently available");
772 }
773
774 // Make sure the render target is updated if it was locked and written to
775 texturerep = &texturedata->texture;
776 if (texturerep->dirty && texturerep->staging) {
777 if (!texturerep->texture) {
778 result = IDirect3DDevice9_CreateTexture(device, texturerep->w, texturerep->h, 1, texturerep->usage,
779 PixelFormatToD3DFMT(texturerep->format), D3DPOOL_DEFAULT, &texturerep->texture, NULL);
780 if (FAILED(result)) {
781 return D3D_SetError("CreateTexture(D3DPOOL_DEFAULT)", result);
782 }
783 }
784
785 result = IDirect3DDevice9_UpdateTexture(device, (IDirect3DBaseTexture9 *)texturerep->staging, (IDirect3DBaseTexture9 *)texturerep->texture);
786 if (FAILED(result)) {
787 return D3D_SetError("UpdateTexture()", result);
788 }
789 texturerep->dirty = false;
790 }
791
792 result = IDirect3DTexture9_GetSurfaceLevel(texturedata->texture.texture, 0, &data->currentRenderTarget);
793 if (FAILED(result)) {
794 return D3D_SetError("GetSurfaceLevel()", result);
795 }
796 result = IDirect3DDevice9_SetRenderTarget(data->device, 0, data->currentRenderTarget);
797 if (FAILED(result)) {
798 return D3D_SetError("SetRenderTarget()", result);
799 }
800
801 return true;
802}
803
804static bool D3D_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
805{
806 if (!D3D_ActivateRenderer(renderer)) {
807 return false;
808 }
809
810 return D3D_SetRenderTargetInternal(renderer, texture);
811}
812
813static bool D3D_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
814{
815 return true; // nothing to do in this backend.
816}
817
818static bool D3D_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
819{
820 const DWORD color = D3DCOLOR_COLORVALUE(cmd->data.draw.color.r * cmd->data.draw.color_scale,
821 cmd->data.draw.color.g * cmd->data.draw.color_scale,
822 cmd->data.draw.color.b * cmd->data.draw.color_scale,
823 cmd->data.draw.color.a);
824 const size_t vertslen = count * sizeof(Vertex);
825 Vertex *verts = (Vertex *)SDL_AllocateRenderVertices(renderer, vertslen, 0, &cmd->data.draw.first);
826 int i;
827
828 if (!verts) {
829 return false;
830 }
831
832 SDL_memset(verts, '\0', vertslen);
833 cmd->data.draw.count = count;
834
835 for (i = 0; i < count; i++, verts++, points++) {
836 verts->x = points->x;
837 verts->y = points->y;
838 verts->color = color;
839 }
840
841 return true;
842}
843
844static bool D3D_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
845 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
846 int num_vertices, const void *indices, int num_indices, int size_indices,
847 float scale_x, float scale_y)
848{
849 int i;
850 int count = indices ? num_indices : num_vertices;
851 Vertex *verts = (Vertex *)SDL_AllocateRenderVertices(renderer, count * sizeof(Vertex), 0, &cmd->data.draw.first);
852 const float color_scale = cmd->data.draw.color_scale;
853
854 if (!verts) {
855 return false;
856 }
857
858 cmd->data.draw.count = count;
859 size_indices = indices ? size_indices : 0;
860
861 for (i = 0; i < count; i++) {
862 int j;
863 float *xy_;
864 SDL_FColor *col_;
865 if (size_indices == 4) {
866 j = ((const Uint32 *)indices)[i];
867 } else if (size_indices == 2) {
868 j = ((const Uint16 *)indices)[i];
869 } else if (size_indices == 1) {
870 j = ((const Uint8 *)indices)[i];
871 } else {
872 j = i;
873 }
874
875 xy_ = (float *)((char *)xy + j * xy_stride);
876 col_ = (SDL_FColor *)((char *)color + j * color_stride);
877
878 verts->x = xy_[0] * scale_x - 0.5f;
879 verts->y = xy_[1] * scale_y - 0.5f;
880 verts->z = 0.0f;
881 verts->color = D3DCOLOR_COLORVALUE(col_->r * color_scale, col_->g * color_scale, col_->b * color_scale, col_->a);
882
883 if (texture) {
884 float *uv_ = (float *)((char *)uv + j * uv_stride);
885 verts->u = uv_[0];
886 verts->v = uv_[1];
887 } else {
888 verts->u = 0.0f;
889 verts->v = 0.0f;
890 }
891
892 verts += 1;
893 }
894 return true;
895}
896
897static bool UpdateDirtyTexture(IDirect3DDevice9 *device, D3D_TextureRep *texture)
898{
899 if (texture->dirty && texture->staging) {
900 HRESULT result;
901 if (!texture->texture) {
902 result = IDirect3DDevice9_CreateTexture(device, texture->w, texture->h, 1, texture->usage,
903 PixelFormatToD3DFMT(texture->format), D3DPOOL_DEFAULT, &texture->texture, NULL);
904 if (FAILED(result)) {
905 return D3D_SetError("CreateTexture(D3DPOOL_DEFAULT)", result);
906 }
907 }
908
909 result = IDirect3DDevice9_UpdateTexture(device, (IDirect3DBaseTexture9 *)texture->staging, (IDirect3DBaseTexture9 *)texture->texture);
910 if (FAILED(result)) {
911 return D3D_SetError("UpdateTexture()", result);
912 }
913 texture->dirty = false;
914 }
915 return true;
916}
917
918static bool BindTextureRep(IDirect3DDevice9 *device, D3D_TextureRep *texture, DWORD sampler)
919{
920 HRESULT result;
921 UpdateDirtyTexture(device, texture);
922 result = IDirect3DDevice9_SetTexture(device, sampler, (IDirect3DBaseTexture9 *)texture->texture);
923 if (FAILED(result)) {
924 return D3D_SetError("SetTexture()", result);
925 }
926 return true;
927}
928
929static void UpdateTextureScaleMode(D3D_RenderData *data, D3D_TextureData *texturedata, unsigned index)
930{
931 if (texturedata->scaleMode != data->scaleMode[index]) {
932 IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MINFILTER, texturedata->scaleMode);
933 IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_MAGFILTER, texturedata->scaleMode);
934 data->scaleMode[index] = texturedata->scaleMode;
935 }
936}
937
938static void UpdateTextureAddressMode(D3D_RenderData *data, SDL_TextureAddressMode addressMode, unsigned index)
939{
940 if (addressMode != data->addressMode[index]) {
941 switch (addressMode) {
942 case SDL_TEXTURE_ADDRESS_CLAMP:
943 IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
944 IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
945 break;
946 case SDL_TEXTURE_ADDRESS_WRAP:
947 IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
948 IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
949 break;
950 default:
951 break;
952 }
953 data->addressMode[index] = addressMode;
954 }
955}
956
957static bool SetupTextureState(D3D_RenderData *data, SDL_Texture *texture, SDL_TextureAddressMode addressMode, D3D9_Shader *shader, const float **shader_params)
958{
959 D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
960
961 if (!texturedata) {
962 return SDL_SetError("Texture is not currently available");
963 }
964
965 UpdateTextureScaleMode(data, texturedata, 0);
966 UpdateTextureAddressMode(data, addressMode, 0);
967
968 *shader = texturedata->shader;
969 *shader_params = texturedata->shader_params;
970
971 if (!BindTextureRep(data->device, &texturedata->texture, 0)) {
972 return false;
973 }
974#ifdef SDL_HAVE_YUV
975 if (texturedata->yuv) {
976 UpdateTextureScaleMode(data, texturedata, 1);
977 UpdateTextureScaleMode(data, texturedata, 2);
978 UpdateTextureAddressMode(data, addressMode, 1);
979 UpdateTextureAddressMode(data, addressMode, 2);
980
981 if (!BindTextureRep(data->device, &texturedata->utexture, 1)) {
982 return false;
983 }
984 if (!BindTextureRep(data->device, &texturedata->vtexture, 2)) {
985 return false;
986 }
987 }
988#endif
989 return true;
990}
991
992static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
993{
994 SDL_Texture *texture = cmd->data.draw.texture;
995 const SDL_BlendMode blend = cmd->data.draw.blend;
996
997 if (texture != data->drawstate.texture) {
998#ifdef SDL_HAVE_YUV
999 D3D_TextureData *oldtexturedata = data->drawstate.texture ? (D3D_TextureData *)data->drawstate.texture->internal : NULL;
1000 D3D_TextureData *newtexturedata = texture ? (D3D_TextureData *)texture->internal : NULL;
1001#endif
1002 D3D9_Shader shader = SHADER_NONE;
1003 const float *shader_params = NULL;
1004
1005 // disable any enabled textures we aren't going to use, let SetupTextureState() do the rest.
1006 if (!texture) {
1007 IDirect3DDevice9_SetTexture(data->device, 0, NULL);
1008 }
1009#ifdef SDL_HAVE_YUV
1010 if ((!newtexturedata || !newtexturedata->yuv) && (oldtexturedata && oldtexturedata->yuv)) {
1011 IDirect3DDevice9_SetTexture(data->device, 1, NULL);
1012 IDirect3DDevice9_SetTexture(data->device, 2, NULL);
1013 }
1014#endif
1015 if (texture && !SetupTextureState(data, texture, cmd->data.draw.texture_address_mode, &shader, &shader_params)) {
1016 return false;
1017 }
1018
1019#ifdef SDL_HAVE_YUV
1020 if (shader != data->drawstate.shader) {
1021 const HRESULT result = IDirect3DDevice9_SetPixelShader(data->device, data->shaders[shader]);
1022 if (FAILED(result)) {
1023 return D3D_SetError("IDirect3DDevice9_SetPixelShader()", result);
1024 }
1025 data->drawstate.shader = shader;
1026 }
1027
1028 if (shader_params != data->drawstate.shader_params) {
1029 if (shader_params) {
1030 const UINT shader_params_length = 4; // The YUV shader takes 4 float4 parameters
1031 const HRESULT result = IDirect3DDevice9_SetPixelShaderConstantF(data->device, 0, shader_params, shader_params_length);
1032 if (FAILED(result)) {
1033 return D3D_SetError("IDirect3DDevice9_SetPixelShaderConstantF()", result);
1034 }
1035 }
1036 data->drawstate.shader_params = shader_params;
1037 }
1038#endif // SDL_HAVE_YUV
1039
1040 data->drawstate.texture = texture;
1041 } else if (texture) {
1042 D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
1043 UpdateDirtyTexture(data->device, &texturedata->texture);
1044#ifdef SDL_HAVE_YUV
1045 if (texturedata->yuv) {
1046 UpdateDirtyTexture(data->device, &texturedata->utexture);
1047 UpdateDirtyTexture(data->device, &texturedata->vtexture);
1048 }
1049#endif
1050 }
1051
1052 if (blend != data->drawstate.blend) {
1053 if (blend == SDL_BLENDMODE_NONE) {
1054 IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, FALSE);
1055 } else {
1056 IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, TRUE);
1057 IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
1058 GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blend)));
1059 IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
1060 GetBlendFunc(SDL_GetBlendModeDstColorFactor(blend)));
1061 IDirect3DDevice9_SetRenderState(data->device, D3DRS_BLENDOP,
1062 GetBlendEquation(SDL_GetBlendModeColorOperation(blend)));
1063 if (data->enableSeparateAlphaBlend) {
1064 IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLENDALPHA,
1065 GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blend)));
1066 IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLENDALPHA,
1067 GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blend)));
1068 IDirect3DDevice9_SetRenderState(data->device, D3DRS_BLENDOPALPHA,
1069 GetBlendEquation(SDL_GetBlendModeAlphaOperation(blend)));
1070 }
1071 }
1072
1073 data->drawstate.blend = blend;
1074 }
1075
1076 if (data->drawstate.viewport_dirty) {
1077 const SDL_Rect *viewport = &data->drawstate.viewport;
1078 D3DVIEWPORT9 d3dviewport;
1079 d3dviewport.X = viewport->x;
1080 d3dviewport.Y = viewport->y;
1081 d3dviewport.Width = viewport->w;
1082 d3dviewport.Height = viewport->h;
1083 d3dviewport.MinZ = 0.0f;
1084 d3dviewport.MaxZ = 1.0f;
1085 IDirect3DDevice9_SetViewport(data->device, &d3dviewport);
1086
1087 // Set an orthographic projection matrix
1088 if (viewport->w && viewport->h) {
1089 D3DMATRIX d3dmatrix;
1090 SDL_zero(d3dmatrix);
1091 d3dmatrix.m[0][0] = 2.0f / viewport->w;
1092 d3dmatrix.m[1][1] = -2.0f / viewport->h;
1093 d3dmatrix.m[2][2] = 1.0f;
1094 d3dmatrix.m[3][0] = -1.0f;
1095 d3dmatrix.m[3][1] = 1.0f;
1096 d3dmatrix.m[3][3] = 1.0f;
1097 IDirect3DDevice9_SetTransform(data->device, D3DTS_PROJECTION, &d3dmatrix);
1098 }
1099
1100 data->drawstate.viewport_dirty = false;
1101 }
1102
1103 if (data->drawstate.cliprect_enabled_dirty) {
1104 IDirect3DDevice9_SetRenderState(data->device, D3DRS_SCISSORTESTENABLE, data->drawstate.cliprect_enabled ? TRUE : FALSE);
1105 data->drawstate.cliprect_enabled_dirty = false;
1106 }
1107
1108 if (data->drawstate.cliprect_dirty) {
1109 const SDL_Rect *viewport = &data->drawstate.viewport;
1110 const SDL_Rect *rect = &data->drawstate.cliprect;
1111 RECT d3drect;
1112 d3drect.left = (LONG)viewport->x + rect->x;
1113 d3drect.top = (LONG)viewport->y + rect->y;
1114 d3drect.right = (LONG)viewport->x + rect->x + rect->w;
1115 d3drect.bottom = (LONG)viewport->y + rect->y + rect->h;
1116 IDirect3DDevice9_SetScissorRect(data->device, &d3drect);
1117 data->drawstate.cliprect_dirty = false;
1118 }
1119
1120 return true;
1121}
1122
1123static void D3D_InvalidateCachedState(SDL_Renderer *renderer)
1124{
1125 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
1126 data->drawstate.viewport_dirty = true;
1127 data->drawstate.cliprect_enabled_dirty = true;
1128 data->drawstate.cliprect_dirty = true;
1129 data->drawstate.blend = SDL_BLENDMODE_INVALID;
1130 data->drawstate.texture = NULL;
1131 data->drawstate.shader = SHADER_NONE;
1132 data->drawstate.shader_params = NULL;
1133}
1134
1135static bool D3D_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
1136{
1137 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
1138 const int vboidx = data->currentVertexBuffer;
1139 IDirect3DVertexBuffer9 *vbo = NULL;
1140 const bool istarget = renderer->target != NULL;
1141
1142 if (!D3D_ActivateRenderer(renderer)) {
1143 return false;
1144 }
1145
1146 if (vertsize > 0) {
1147 // upload the new VBO data for this set of commands.
1148 vbo = data->vertexBuffers[vboidx];
1149 if (data->vertexBufferSize[vboidx] < vertsize) {
1150 const DWORD usage = D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY;
1151 const DWORD fvf = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;
1152 if (vbo) {
1153 IDirect3DVertexBuffer9_Release(vbo);
1154 }
1155
1156 if (FAILED(IDirect3DDevice9_CreateVertexBuffer(data->device, (UINT)vertsize, usage, fvf, D3DPOOL_DEFAULT, &vbo, NULL))) {
1157 vbo = NULL;
1158 }
1159 data->vertexBuffers[vboidx] = vbo;
1160 data->vertexBufferSize[vboidx] = vbo ? vertsize : 0;
1161 }
1162
1163 if (vbo) {
1164 void *ptr;
1165 if (FAILED(IDirect3DVertexBuffer9_Lock(vbo, 0, (UINT)vertsize, &ptr, D3DLOCK_DISCARD))) {
1166 vbo = NULL; // oh well, we'll do immediate mode drawing. :(
1167 } else {
1168 SDL_memcpy(ptr, vertices, vertsize);
1169 if (FAILED(IDirect3DVertexBuffer9_Unlock(vbo))) {
1170 vbo = NULL; // oh well, we'll do immediate mode drawing. :(
1171 }
1172 }
1173 }
1174
1175 // cycle through a few VBOs so D3D has some time with the data before we replace it.
1176 if (vbo) {
1177 data->currentVertexBuffer++;
1178 if (data->currentVertexBuffer >= SDL_arraysize(data->vertexBuffers)) {
1179 data->currentVertexBuffer = 0;
1180 }
1181 } else if (!data->reportedVboProblem) {
1182 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "SDL failed to get a vertex buffer for this Direct3D 9 rendering batch!");
1183 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Dropping back to a slower method.");
1184 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "This might be a brief hiccup, but if performance is bad, this is probably why.");
1185 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "This error will not be logged again for this renderer.");
1186 data->reportedVboProblem = true;
1187 }
1188 }
1189
1190 IDirect3DDevice9_SetStreamSource(data->device, 0, vbo, 0, sizeof(Vertex));
1191
1192 while (cmd) {
1193 switch (cmd->command) {
1194 case SDL_RENDERCMD_SETDRAWCOLOR:
1195 {
1196 /* currently this is sent with each vertex, but if we move to
1197 shaders, we can put this in a uniform here and reduce vertex
1198 buffer bandwidth */
1199 break;
1200 }
1201
1202 case SDL_RENDERCMD_SETVIEWPORT:
1203 {
1204 SDL_Rect *viewport = &data->drawstate.viewport;
1205 if (SDL_memcmp(viewport, &cmd->data.viewport.rect, sizeof(cmd->data.viewport.rect)) != 0) {
1206 SDL_copyp(viewport, &cmd->data.viewport.rect);
1207 data->drawstate.viewport_dirty = true;
1208 data->drawstate.cliprect_dirty = true;
1209 }
1210 break;
1211 }
1212
1213 case SDL_RENDERCMD_SETCLIPRECT:
1214 {
1215 const SDL_Rect *rect = &cmd->data.cliprect.rect;
1216 if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
1217 data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
1218 data->drawstate.cliprect_enabled_dirty = true;
1219 }
1220
1221 if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) {
1222 SDL_copyp(&data->drawstate.cliprect, rect);
1223 data->drawstate.cliprect_dirty = true;
1224 }
1225 break;
1226 }
1227
1228 case SDL_RENDERCMD_CLEAR:
1229 {
1230 const DWORD color = D3DCOLOR_COLORVALUE(cmd->data.color.color.r * cmd->data.color.color_scale,
1231 cmd->data.color.color.g * cmd->data.color.color_scale,
1232 cmd->data.color.color.b * cmd->data.color.color_scale,
1233 cmd->data.color.color.a);
1234 const SDL_Rect *viewport = &data->drawstate.viewport;
1235 const int backw = istarget ? renderer->target->w : data->pparams.BackBufferWidth;
1236 const int backh = istarget ? renderer->target->h : data->pparams.BackBufferHeight;
1237 const bool viewport_equal = ((viewport->x == 0) && (viewport->y == 0) && (viewport->w == backw) && (viewport->h == backh));
1238
1239 if (data->drawstate.cliprect_enabled || data->drawstate.cliprect_enabled_dirty) {
1240 IDirect3DDevice9_SetRenderState(data->device, D3DRS_SCISSORTESTENABLE, FALSE);
1241 data->drawstate.cliprect_enabled_dirty = data->drawstate.cliprect_enabled;
1242 }
1243
1244 // Don't reset the viewport if we don't have to!
1245 if (!data->drawstate.viewport_dirty && viewport_equal) {
1246 IDirect3DDevice9_Clear(data->device, 0, NULL, D3DCLEAR_TARGET, color, 0.0f, 0);
1247 } else {
1248 // Clear is defined to clear the entire render target
1249 D3DVIEWPORT9 wholeviewport = { 0, 0, 0, 0, 0.0f, 1.0f };
1250 wholeviewport.Width = backw;
1251 wholeviewport.Height = backh;
1252 IDirect3DDevice9_SetViewport(data->device, &wholeviewport);
1253 data->drawstate.viewport_dirty = true; // we still need to (re)set orthographic projection, so always mark it dirty.
1254 IDirect3DDevice9_Clear(data->device, 0, NULL, D3DCLEAR_TARGET, color, 0.0f, 0);
1255 }
1256
1257 break;
1258 }
1259
1260 case SDL_RENDERCMD_DRAW_POINTS:
1261 {
1262 const size_t count = cmd->data.draw.count;
1263 const size_t first = cmd->data.draw.first;
1264 SetDrawState(data, cmd);
1265 if (vbo) {
1266 IDirect3DDevice9_DrawPrimitive(data->device, D3DPT_POINTLIST, (UINT)(first / sizeof(Vertex)), (UINT)count);
1267 } else {
1268 const Vertex *verts = (Vertex *)(((Uint8 *)vertices) + first);
1269 IDirect3DDevice9_DrawPrimitiveUP(data->device, D3DPT_POINTLIST, (UINT)count, verts, sizeof(Vertex));
1270 }
1271 break;
1272 }
1273
1274 case SDL_RENDERCMD_DRAW_LINES:
1275 {
1276 const size_t count = cmd->data.draw.count;
1277 const size_t first = cmd->data.draw.first;
1278 const Vertex *verts = (Vertex *)(((Uint8 *)vertices) + first);
1279
1280 /* DirectX 9 has the same line rasterization semantics as GDI,
1281 so we need to close the endpoint of the line with a second draw call.
1282 NOLINTNEXTLINE(clang-analyzer-core.NullDereference): FIXME: Can verts truly not be NULL ? */
1283 const bool close_endpoint = ((count == 2) || (verts[0].x != verts[count - 1].x) || (verts[0].y != verts[count - 1].y));
1284
1285 SetDrawState(data, cmd);
1286
1287 if (vbo) {
1288 IDirect3DDevice9_DrawPrimitive(data->device, D3DPT_LINESTRIP, (UINT)(first / sizeof(Vertex)), (UINT)(count - 1));
1289 if (close_endpoint) {
1290 IDirect3DDevice9_DrawPrimitive(data->device, D3DPT_POINTLIST, (UINT)((first / sizeof(Vertex)) + (count - 1)), 1);
1291 }
1292 } else {
1293 IDirect3DDevice9_DrawPrimitiveUP(data->device, D3DPT_LINESTRIP, (UINT)(count - 1), verts, sizeof(Vertex));
1294 if (close_endpoint) {
1295 IDirect3DDevice9_DrawPrimitiveUP(data->device, D3DPT_POINTLIST, 1, &verts[count - 1], sizeof(Vertex));
1296 }
1297 }
1298 break;
1299 }
1300
1301 case SDL_RENDERCMD_FILL_RECTS: // unused
1302 break;
1303
1304 case SDL_RENDERCMD_COPY: // unused
1305 break;
1306
1307 case SDL_RENDERCMD_COPY_EX: // unused
1308 break;
1309
1310 case SDL_RENDERCMD_GEOMETRY:
1311 {
1312 const size_t count = cmd->data.draw.count;
1313 const size_t first = cmd->data.draw.first;
1314 SetDrawState(data, cmd);
1315 if (vbo) {
1316 IDirect3DDevice9_DrawPrimitive(data->device, D3DPT_TRIANGLELIST, (UINT)(first / sizeof(Vertex)), (UINT)count / 3);
1317 } else {
1318 const Vertex *verts = (Vertex *)(((Uint8 *)vertices) + first);
1319 IDirect3DDevice9_DrawPrimitiveUP(data->device, D3DPT_TRIANGLELIST, (UINT)count / 3, verts, sizeof(Vertex));
1320 }
1321 break;
1322 }
1323
1324 case SDL_RENDERCMD_NO_OP:
1325 break;
1326 }
1327
1328 cmd = cmd->next;
1329 }
1330
1331 return true;
1332}
1333
1334static SDL_Surface *D3D_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
1335{
1336 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
1337 D3DSURFACE_DESC desc;
1338 LPDIRECT3DSURFACE9 backBuffer;
1339 LPDIRECT3DSURFACE9 surface;
1340 RECT d3drect;
1341 D3DLOCKED_RECT locked;
1342 HRESULT result;
1343 SDL_Surface *output;
1344
1345 if (data->currentRenderTarget) {
1346 backBuffer = data->currentRenderTarget;
1347 } else {
1348 backBuffer = data->defaultRenderTarget;
1349 }
1350
1351 result = IDirect3DSurface9_GetDesc(backBuffer, &desc);
1352 if (FAILED(result)) {
1353 D3D_SetError("GetDesc()", result);
1354 return NULL;
1355 }
1356
1357 result = IDirect3DDevice9_CreateOffscreenPlainSurface(data->device, desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surface, NULL);
1358 if (FAILED(result)) {
1359 D3D_SetError("CreateOffscreenPlainSurface()", result);
1360 return NULL;
1361 }
1362
1363 result = IDirect3DDevice9_GetRenderTargetData(data->device, backBuffer, surface);
1364 if (FAILED(result)) {
1365 IDirect3DSurface9_Release(surface);
1366 D3D_SetError("GetRenderTargetData()", result);
1367 return NULL;
1368 }
1369
1370 d3drect.left = rect->x;
1371 d3drect.right = (LONG)rect->x + rect->w;
1372 d3drect.top = rect->y;
1373 d3drect.bottom = (LONG)rect->y + rect->h;
1374
1375 result = IDirect3DSurface9_LockRect(surface, &locked, &d3drect, D3DLOCK_READONLY);
1376 if (FAILED(result)) {
1377 IDirect3DSurface9_Release(surface);
1378 D3D_SetError("LockRect()", result);
1379 return NULL;
1380 }
1381
1382 output = SDL_DuplicatePixels(rect->w, rect->h, D3DFMTToPixelFormat(desc.Format), SDL_COLORSPACE_SRGB, locked.pBits, locked.Pitch);
1383
1384 IDirect3DSurface9_UnlockRect(surface);
1385
1386 IDirect3DSurface9_Release(surface);
1387
1388 return output;
1389}
1390
1391static bool D3D_RenderPresent(SDL_Renderer *renderer)
1392{
1393 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
1394 HRESULT result;
1395
1396 if (!data->beginScene) {
1397 IDirect3DDevice9_EndScene(data->device);
1398 data->beginScene = true;
1399 }
1400
1401 result = IDirect3DDevice9_TestCooperativeLevel(data->device);
1402 if (result == D3DERR_DEVICELOST) {
1403 // We'll reset later
1404 return false;
1405 }
1406 if (result == D3DERR_DEVICENOTRESET) {
1407 D3D_Reset(renderer);
1408 }
1409 result = IDirect3DDevice9_Present(data->device, NULL, NULL, NULL, NULL);
1410 if (FAILED(result)) {
1411 return D3D_SetError("Present()", result);
1412 }
1413 return true;
1414}
1415
1416static void D3D_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1417{
1418 D3D_RenderData *renderdata = (D3D_RenderData *)renderer->internal;
1419 D3D_TextureData *data = (D3D_TextureData *)texture->internal;
1420
1421 if (renderdata->drawstate.texture == texture) {
1422 renderdata->drawstate.texture = NULL;
1423 renderdata->drawstate.shader = SHADER_NONE;
1424 renderdata->drawstate.shader_params = NULL;
1425 IDirect3DDevice9_SetPixelShader(renderdata->device, NULL);
1426 IDirect3DDevice9_SetTexture(renderdata->device, 0, NULL);
1427#ifdef SDL_HAVE_YUV
1428 if (data->yuv) {
1429 IDirect3DDevice9_SetTexture(renderdata->device, 1, NULL);
1430 IDirect3DDevice9_SetTexture(renderdata->device, 2, NULL);
1431 }
1432#endif
1433 }
1434
1435 if (!data) {
1436 return;
1437 }
1438
1439 D3D_DestroyTextureRep(&data->texture);
1440#ifdef SDL_HAVE_YUV
1441 D3D_DestroyTextureRep(&data->utexture);
1442 D3D_DestroyTextureRep(&data->vtexture);
1443 SDL_free(data->pixels);
1444#endif
1445 SDL_free(data);
1446 texture->internal = NULL;
1447}
1448
1449static void D3D_DestroyRenderer(SDL_Renderer *renderer)
1450{
1451 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
1452
1453 if (data) {
1454 int i;
1455
1456 // Release the render target
1457 if (data->defaultRenderTarget) {
1458 IDirect3DSurface9_Release(data->defaultRenderTarget);
1459 data->defaultRenderTarget = NULL;
1460 }
1461 if (data->currentRenderTarget) {
1462 IDirect3DSurface9_Release(data->currentRenderTarget);
1463 data->currentRenderTarget = NULL;
1464 }
1465#ifdef SDL_HAVE_YUV
1466 for (i = 0; i < SDL_arraysize(data->shaders); ++i) {
1467 if (data->shaders[i]) {
1468 IDirect3DPixelShader9_Release(data->shaders[i]);
1469 data->shaders[i] = NULL;
1470 }
1471 }
1472#endif
1473 // Release all vertex buffers
1474 for (i = 0; i < SDL_arraysize(data->vertexBuffers); ++i) {
1475 if (data->vertexBuffers[i]) {
1476 IDirect3DVertexBuffer9_Release(data->vertexBuffers[i]);
1477 }
1478 data->vertexBuffers[i] = NULL;
1479 }
1480 if (data->device) {
1481 IDirect3DDevice9_Release(data->device);
1482 data->device = NULL;
1483 }
1484 if (data->d3d) {
1485 IDirect3D9_Release(data->d3d);
1486 SDL_UnloadObject(data->d3dDLL);
1487 }
1488 SDL_free(data);
1489 }
1490}
1491
1492static bool D3D_Reset(SDL_Renderer *renderer)
1493{
1494 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
1495 const Float4X4 d3dmatrix = MatrixIdentity();
1496 HRESULT result;
1497 SDL_Texture *texture;
1498 int i;
1499
1500 // Cancel any scene that we've started
1501 if (!data->beginScene) {
1502 IDirect3DDevice9_EndScene(data->device);
1503 data->beginScene = true;
1504 }
1505
1506 // Release the default render target before reset
1507 if (data->defaultRenderTarget) {
1508 IDirect3DSurface9_Release(data->defaultRenderTarget);
1509 data->defaultRenderTarget = NULL;
1510 }
1511 if (data->currentRenderTarget) {
1512 IDirect3DSurface9_Release(data->currentRenderTarget);
1513 data->currentRenderTarget = NULL;
1514 }
1515
1516 // Release application render targets
1517 for (texture = renderer->textures; texture; texture = texture->next) {
1518 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
1519 D3D_DestroyTexture(renderer, texture);
1520 } else {
1521 D3D_RecreateTexture(renderer, texture);
1522 }
1523 }
1524
1525 // Release all vertex buffers
1526 for (i = 0; i < SDL_arraysize(data->vertexBuffers); ++i) {
1527 if (data->vertexBuffers[i]) {
1528 IDirect3DVertexBuffer9_Release(data->vertexBuffers[i]);
1529 }
1530 data->vertexBuffers[i] = NULL;
1531 data->vertexBufferSize[i] = 0;
1532 }
1533
1534 result = IDirect3DDevice9_Reset(data->device, &data->pparams);
1535 if (FAILED(result)) {
1536 if (result == D3DERR_DEVICELOST) {
1537 // Don't worry about it, we'll reset later...
1538 return true;
1539 } else {
1540 return D3D_SetError("Reset()", result);
1541 }
1542 }
1543
1544 // Allocate application render targets
1545 for (texture = renderer->textures; texture; texture = texture->next) {
1546 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
1547 D3D_CreateTexture(renderer, texture, 0);
1548 }
1549 }
1550
1551 IDirect3DDevice9_GetRenderTarget(data->device, 0, &data->defaultRenderTarget);
1552 D3D_InitRenderState(data);
1553 D3D_SetRenderTargetInternal(renderer, renderer->target);
1554
1555 D3D_InvalidateCachedState(renderer);
1556
1557 IDirect3DDevice9_SetTransform(data->device, D3DTS_VIEW, (D3DMATRIX *)&d3dmatrix);
1558
1559 // Let the application know that render targets were reset
1560 {
1561 SDL_Event event;
1562 SDL_zero(event);
1563 event.type = SDL_EVENT_RENDER_TARGETS_RESET;
1564 event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer));
1565 SDL_PushEvent(&event);
1566 }
1567
1568 return true;
1569}
1570
1571static bool D3D_SetVSync(SDL_Renderer *renderer, const int vsync)
1572{
1573 D3D_RenderData *data = (D3D_RenderData *)renderer->internal;
1574
1575 DWORD PresentationInterval;
1576 switch (vsync) {
1577 case 0:
1578 PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
1579 break;
1580 case 1:
1581 PresentationInterval = D3DPRESENT_INTERVAL_ONE;
1582 break;
1583 case 2:
1584 PresentationInterval = D3DPRESENT_INTERVAL_TWO;
1585 break;
1586 case 3:
1587 PresentationInterval = D3DPRESENT_INTERVAL_THREE;
1588 break;
1589 case 4:
1590 PresentationInterval = D3DPRESENT_INTERVAL_FOUR;
1591 break;
1592 default:
1593 return SDL_Unsupported();
1594 }
1595
1596 D3DCAPS9 caps;
1597 HRESULT result = IDirect3D9_GetDeviceCaps(data->d3d, data->adapter, D3DDEVTYPE_HAL, &caps);
1598 if (FAILED(result)) {
1599 return D3D_SetError("GetDeviceCaps()", result);
1600 }
1601 if (!(caps.PresentationIntervals & PresentationInterval)) {
1602 return SDL_Unsupported();
1603 }
1604 data->pparams.PresentationInterval = PresentationInterval;
1605
1606 if (!D3D_Reset(renderer)) {
1607 // D3D_Reset will call SDL_SetError()
1608 return false;
1609 }
1610 return true;
1611}
1612
1613static bool D3D_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
1614{
1615 D3D_RenderData *data;
1616 HRESULT result;
1617 HWND hwnd;
1618 D3DPRESENT_PARAMETERS pparams;
1619 IDirect3DSwapChain9 *chain;
1620 D3DCAPS9 caps;
1621 DWORD device_flags;
1622 int w, h;
1623 SDL_DisplayID displayID;
1624 const SDL_DisplayMode *fullscreen_mode = NULL;
1625
1626 hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
1627 if (!hwnd) {
1628 return SDL_SetError("Couldn't get window handle");
1629 }
1630
1631 SDL_SetupRendererColorspace(renderer, create_props);
1632
1633 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
1634 return SDL_SetError("Unsupported output colorspace");
1635 }
1636
1637 data = (D3D_RenderData *)SDL_calloc(1, sizeof(*data));
1638 if (!data) {
1639 return false;
1640 }
1641
1642 if (!D3D_LoadDLL(&data->d3dDLL, &data->d3d)) {
1643 SDL_free(data);
1644 return SDL_SetError("Unable to create Direct3D interface");
1645 }
1646
1647 renderer->WindowEvent = D3D_WindowEvent;
1648 renderer->SupportsBlendMode = D3D_SupportsBlendMode;
1649 renderer->CreateTexture = D3D_CreateTexture;
1650 renderer->UpdateTexture = D3D_UpdateTexture;
1651#ifdef SDL_HAVE_YUV
1652 renderer->UpdateTextureYUV = D3D_UpdateTextureYUV;
1653#endif
1654 renderer->LockTexture = D3D_LockTexture;
1655 renderer->UnlockTexture = D3D_UnlockTexture;
1656 renderer->SetTextureScaleMode = D3D_SetTextureScaleMode;
1657 renderer->SetRenderTarget = D3D_SetRenderTarget;
1658 renderer->QueueSetViewport = D3D_QueueNoOp;
1659 renderer->QueueSetDrawColor = D3D_QueueNoOp;
1660 renderer->QueueDrawPoints = D3D_QueueDrawPoints;
1661 renderer->QueueDrawLines = D3D_QueueDrawPoints; // lines and points queue vertices the same way.
1662 renderer->QueueGeometry = D3D_QueueGeometry;
1663 renderer->InvalidateCachedState = D3D_InvalidateCachedState;
1664 renderer->RunCommandQueue = D3D_RunCommandQueue;
1665 renderer->RenderReadPixels = D3D_RenderReadPixels;
1666 renderer->RenderPresent = D3D_RenderPresent;
1667 renderer->DestroyTexture = D3D_DestroyTexture;
1668 renderer->DestroyRenderer = D3D_DestroyRenderer;
1669 renderer->SetVSync = D3D_SetVSync;
1670 renderer->internal = data;
1671 D3D_InvalidateCachedState(renderer);
1672
1673 renderer->name = D3D_RenderDriver.name;
1674 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
1675
1676 SDL_GetWindowSizeInPixels(window, &w, &h);
1677 if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) {
1678 fullscreen_mode = SDL_GetWindowFullscreenMode(window);
1679 }
1680
1681 SDL_zero(pparams);
1682 pparams.hDeviceWindow = hwnd;
1683 pparams.BackBufferWidth = w;
1684 pparams.BackBufferHeight = h;
1685 pparams.BackBufferCount = 1;
1686 pparams.SwapEffect = D3DSWAPEFFECT_DISCARD;
1687
1688 if (fullscreen_mode) {
1689 pparams.Windowed = FALSE;
1690 pparams.BackBufferFormat = PixelFormatToD3DFMT(fullscreen_mode->format);
1691 pparams.FullScreen_RefreshRateInHz = (UINT)SDL_ceilf(fullscreen_mode->refresh_rate);
1692 } else {
1693 pparams.Windowed = TRUE;
1694 pparams.BackBufferFormat = D3DFMT_UNKNOWN;
1695 pparams.FullScreen_RefreshRateInHz = 0;
1696 }
1697 pparams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
1698
1699 // Get the adapter for the display that the window is on
1700 displayID = SDL_GetDisplayForWindow(window);
1701 data->adapter = SDL_GetDirect3D9AdapterIndex(displayID);
1702
1703 result = IDirect3D9_GetDeviceCaps(data->d3d, data->adapter, D3DDEVTYPE_HAL, &caps);
1704 if (FAILED(result)) {
1705 return D3D_SetError("GetDeviceCaps()", result);
1706 }
1707
1708 device_flags = D3DCREATE_FPU_PRESERVE;
1709 if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
1710 device_flags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
1711 } else {
1712 device_flags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
1713 }
1714
1715 if (SDL_GetHintBoolean(SDL_HINT_RENDER_DIRECT3D_THREADSAFE, false)) {
1716 device_flags |= D3DCREATE_MULTITHREADED;
1717 }
1718
1719 result = IDirect3D9_CreateDevice(data->d3d, data->adapter,
1720 D3DDEVTYPE_HAL,
1721 pparams.hDeviceWindow,
1722 device_flags,
1723 &pparams, &data->device);
1724 if (FAILED(result)) {
1725 return D3D_SetError("CreateDevice()", result);
1726 }
1727
1728 // Get presentation parameters to fill info
1729 result = IDirect3DDevice9_GetSwapChain(data->device, 0, &chain);
1730 if (FAILED(result)) {
1731 return D3D_SetError("GetSwapChain()", result);
1732 }
1733 result = IDirect3DSwapChain9_GetPresentParameters(chain, &pparams);
1734 if (FAILED(result)) {
1735 IDirect3DSwapChain9_Release(chain);
1736 return D3D_SetError("GetPresentParameters()", result);
1737 }
1738 IDirect3DSwapChain9_Release(chain);
1739 data->pparams = pparams;
1740
1741 IDirect3DDevice9_GetDeviceCaps(data->device, &caps);
1742 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, SDL_min(caps.MaxTextureWidth, caps.MaxTextureHeight));
1743
1744 if (caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND) {
1745 data->enableSeparateAlphaBlend = true;
1746 }
1747
1748 // Store the default render target
1749 IDirect3DDevice9_GetRenderTarget(data->device, 0, &data->defaultRenderTarget);
1750 data->currentRenderTarget = NULL;
1751
1752 // Set up parameters for rendering
1753 D3D_InitRenderState(data);
1754#ifdef SDL_HAVE_YUV
1755 if (caps.MaxSimultaneousTextures >= 3) {
1756 int i;
1757 for (i = SHADER_NONE + 1; i < SDL_arraysize(data->shaders); ++i) {
1758 result = D3D9_CreatePixelShader(data->device, (D3D9_Shader)i, &data->shaders[i]);
1759 if (FAILED(result)) {
1760 D3D_SetError("CreatePixelShader()", result);
1761 }
1762 }
1763 if (data->shaders[SHADER_YUV]) {
1764 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
1765 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
1766 }
1767 }
1768#endif
1769
1770 SDL_SetPointerProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_D3D9_DEVICE_POINTER, data->device);
1771
1772 return true;
1773}
1774
1775SDL_RenderDriver D3D_RenderDriver = {
1776 D3D_CreateRenderer, "direct3d"
1777};
1778#endif // SDL_VIDEO_RENDER_D3D
diff --git a/SDL-3.2.8/src/render/direct3d/SDL_shaders_d3d.c b/SDL-3.2.8/src/render/direct3d/SDL_shaders_d3d.c
new file mode 100644
index 0000000..9b1b4b5
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d/SDL_shaders_d3d.c
@@ -0,0 +1,48 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_D3D
24
25#include "../../core/windows/SDL_windows.h"
26
27#include <d3d9.h>
28
29#include "SDL_shaders_d3d.h"
30
31// The shaders here were compiled with compile_shaders.bat
32
33#define g_ps20_main D3D9_PixelShader_YUV
34#include "D3D9_PixelShader_YUV.h"
35#undef g_ps20_main
36
37static const BYTE *D3D9_shaders[] = {
38 NULL,
39 D3D9_PixelShader_YUV
40};
41SDL_COMPILE_TIME_ASSERT(D3D9_shaders, SDL_arraysize(D3D9_shaders) == NUM_SHADERS);
42
43HRESULT D3D9_CreatePixelShader(IDirect3DDevice9 *d3dDevice, D3D9_Shader shader, IDirect3DPixelShader9 **pixelShader)
44{
45 return IDirect3DDevice9_CreatePixelShader(d3dDevice, (const DWORD *)D3D9_shaders[shader], pixelShader);
46}
47
48#endif // SDL_VIDEO_RENDER_D3D
diff --git a/SDL-3.2.8/src/render/direct3d/SDL_shaders_d3d.h b/SDL-3.2.8/src/render/direct3d/SDL_shaders_d3d.h
new file mode 100644
index 0000000..90ef7a9
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d/SDL_shaders_d3d.h
@@ -0,0 +1,32 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23// D3D9 shader implementation
24
25typedef enum
26{
27 SHADER_NONE,
28 SHADER_YUV,
29 NUM_SHADERS
30} D3D9_Shader;
31
32extern HRESULT D3D9_CreatePixelShader(IDirect3DDevice9 *d3dDevice, D3D9_Shader shader, IDirect3DPixelShader9 **pixelShader);
diff --git a/SDL-3.2.8/src/render/direct3d/compile_shaders.bat b/SDL-3.2.8/src/render/direct3d/compile_shaders.bat
new file mode 100644
index 0000000..81d513e
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d/compile_shaders.bat
@@ -0,0 +1 @@
fxc /T ps_2_0 /Fh D3D9_PixelShader_YUV.h D3D9_PixelShader_YUV.hlsl
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Advanced.h b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Advanced.h
new file mode 100644
index 0000000..a1297c9
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Advanced.h
@@ -0,0 +1,1060 @@
1#if 0
2//
3// Generated by Microsoft (R) HLSL Shader Compiler 10.1
4//
5//
6// Buffer Definitions:
7//
8// cbuffer Constants
9// {
10//
11// float scRGB_output; // Offset: 0 Size: 4
12// float texture_type; // Offset: 4 Size: 4
13// float input_type; // Offset: 8 Size: 4
14// float color_scale; // Offset: 12 Size: 4
15// float tonemap_method; // Offset: 16 Size: 4
16// float tonemap_factor1; // Offset: 20 Size: 4
17// float tonemap_factor2; // Offset: 24 Size: 4
18// float sdr_white_point; // Offset: 28 Size: 4
19// float4 Yoffset; // Offset: 32 Size: 16
20// float4 Rcoeff; // Offset: 48 Size: 16
21// float4 Gcoeff; // Offset: 64 Size: 16
22// float4 Bcoeff; // Offset: 80 Size: 16
23//
24// }
25//
26//
27// Resource Bindings:
28//
29// Name Type Format Dim HLSL Bind Count
30// ------------------------------ ---------- ------- ----------- -------------- ------
31// sampler0 sampler NA NA s0 1
32// texture0 texture float4 2d t0 1
33// texture1 texture float4 2d t1 1
34// texture2 texture float4 2d t2 1
35// Constants cbuffer NA NA cb0 1
36//
37//
38//
39// Input signature:
40//
41// Name Index Mask Register SysValue Format Used
42// -------------------- ----- ------ -------- -------- ------- ------
43// SV_POSITION 0 xyzw 0 POS float
44// TEXCOORD 0 xy 1 NONE float xy
45// COLOR 0 xyzw 2 NONE float xyzw
46//
47//
48// Output signature:
49//
50// Name Index Mask Register SysValue Format Used
51// -------------------- ----- ------ -------- -------- ------- ------
52// SV_TARGET 0 xyzw 0 TARGET float xyzw
53//
54ps_5_0
55dcl_globalFlags refactoringAllowed
56dcl_constantbuffer CB0[6], immediateIndexed
57dcl_sampler s0, mode_default
58dcl_resource_texture2d (float,float,float,float) t0
59dcl_resource_texture2d (float,float,float,float) t1
60dcl_resource_texture2d (float,float,float,float) t2
61dcl_input_ps linear v1.xy
62dcl_input_ps linear v2.xyzw
63dcl_output o0.xyzw
64dcl_temps 7
65eq r0.xyzw, cb0[0].yzzz, l(0.000000, 3.000000, 2.000000, 1.000000)
66if_nz r0.x
67 mov r1.xyzw, l(1.000000,1.000000,1.000000,1.000000)
68else
69 eq r0.x, cb0[0].y, l(1.000000)
70 if_nz r0.x
71 sample_indexable(texture2d)(float,float,float,float) r1.xyzw, v1.xyxx, t0.xyzw, s0
72 else
73 eq r0.x, cb0[0].y, l(2.000000)
74 if_nz r0.x
75 sample_indexable(texture2d)(float,float,float,float) r2.x, v1.xyxx, t0.xyzw, s0
76 sample_indexable(texture2d)(float,float,float,float) r2.yz, v1.xyxx, t1.zxyw, s0
77 add r2.xyz, r2.xyzx, cb0[2].xyzx
78 dp3 r1.x, r2.xyzx, cb0[3].xyzx
79 dp3 r1.y, r2.xyzx, cb0[4].xyzx
80 dp3 r1.z, r2.xyzx, cb0[5].xyzx
81 else
82 eq r0.x, cb0[0].y, l(3.000000)
83 if_nz r0.x
84 sample_indexable(texture2d)(float,float,float,float) r2.x, v1.xyxx, t0.xyzw, s0
85 sample_indexable(texture2d)(float,float,float,float) r2.yz, v1.xyxx, t1.zyxw, s0
86 add r2.xyz, r2.xyzx, cb0[2].xyzx
87 dp3 r1.x, r2.xyzx, cb0[3].xyzx
88 dp3 r1.y, r2.xyzx, cb0[4].xyzx
89 dp3 r1.z, r2.xyzx, cb0[5].xyzx
90 else
91 eq r0.x, cb0[0].y, l(4.000000)
92 if_nz r0.x
93 sample_indexable(texture2d)(float,float,float,float) r2.x, v1.xyxx, t0.xyzw, s0
94 sample_indexable(texture2d)(float,float,float,float) r2.y, v1.xyxx, t1.yxzw, s0
95 sample_indexable(texture2d)(float,float,float,float) r2.z, v1.xyxx, t2.yzxw, s0
96 add r2.xyz, r2.xyzx, cb0[2].xyzx
97 dp3 r1.x, r2.xyzx, cb0[3].xyzx
98 dp3 r1.y, r2.xyzx, cb0[4].xyzx
99 dp3 r1.z, r2.xyzx, cb0[5].xyzx
100 else
101 mov r1.xyz, l(1.000000,0,0,0)
102 endif
103 endif
104 endif
105 mov r1.w, l(1.000000)
106 endif
107endif
108log r2.xyz, |r1.xyzx|
109mul r2.xyz, r2.xyzx, l(0.012683, 0.012683, 0.012683, 0.000000)
110exp r2.xyz, r2.xyzx
111add r3.xyz, r2.xyzx, l(-0.835938, -0.835938, -0.835938, 0.000000)
112max r3.xyz, r3.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000)
113mad r2.xyz, -r2.xyzx, l(18.687500, 18.687500, 18.687500, 0.000000), l(18.851562, 18.851562, 18.851562, 0.000000)
114div r2.xyz, r3.xyzx, r2.xyzx
115log r2.xyz, |r2.xyzx|
116mul r2.xyz, r2.xyzx, l(6.277395, 6.277395, 6.277395, 0.000000)
117exp r2.xyz, r2.xyzx
118mul r2.xyz, r2.xyzx, l(10000.000000, 10000.000000, 10000.000000, 0.000000)
119div r2.xyz, r2.xyzx, cb0[1].wwww
120movc r2.xyz, r0.yyyy, r2.xyzx, r1.xyzx
121ne r0.x, cb0[1].x, l(0.000000)
122mul r3.xyz, r2.xyzx, cb0[1].yyyy
123eq r4.xy, cb0[1].xxxx, l(1.000000, 2.000000, 0.000000, 0.000000)
124dp3 r5.x, l(0.627404, 0.329283, 0.043313, 0.000000), r2.xyzx
125dp3 r5.y, l(0.069097, 0.919541, 0.011362, 0.000000), r2.xyzx
126dp3 r5.z, l(0.016391, 0.088013, 0.895595, 0.000000), r2.xyzx
127movc r5.xyz, r0.zzzz, r5.xyzx, r2.xyzx
128max r2.w, r5.z, r5.y
129max r2.w, r2.w, r5.x
130lt r3.w, l(0.000000), r2.w
131mad r4.zw, cb0[1].yyyz, r2.wwww, l(0.000000, 0.000000, 1.000000, 1.000000)
132div r2.w, r4.z, r4.w
133mul r6.xyz, r2.wwww, r5.xyzx
134movc r5.xyz, r3.wwww, r6.xyzx, r5.xyzx
135dp3 r6.x, l(1.660496, -0.587656, -0.072840, 0.000000), r5.xyzx
136dp3 r6.y, l(-0.124547, 1.132895, -0.008348, 0.000000), r5.xyzx
137dp3 r6.z, l(-0.018154, -0.100597, 1.118751, 0.000000), r5.xyzx
138movc r5.xyz, r0.zzzz, r6.xyzx, r5.xyzx
139movc r4.yzw, r4.yyyy, r5.xxyz, r2.xxyz
140movc r3.xyz, r4.xxxx, r3.xyzx, r4.yzwy
141movc r2.xyz, r0.xxxx, r3.xyzx, r2.xyzx
142if_nz r0.w
143 ne r0.x, l(0.000000, 0.000000, 0.000000, 0.000000), cb0[0].x
144 if_nz r0.x
145 ge r3.xyz, l(0.040450, 0.040450, 0.040450, 0.000000), r2.xyzx
146 mul r4.xyz, r2.xyzx, l(0.077399, 0.077399, 0.077399, 0.000000)
147 add r5.xyz, r2.xyzx, l(0.055000, 0.055000, 0.055000, 0.000000)
148 mul r5.xyz, |r5.xyzx|, l(0.947867, 0.947867, 0.947867, 0.000000)
149 log r5.xyz, r5.xyzx
150 mul r5.xyz, r5.xyzx, l(2.400000, 2.400000, 2.400000, 0.000000)
151 exp r5.xyz, r5.xyzx
152 movc r2.xyz, r3.xyzx, r4.xyzx, r5.xyzx
153 endif
154 mul r1.xyz, r2.xyzx, cb0[0].wwww
155else
156 if_nz r0.z
157 mul r1.xyz, r2.xyzx, cb0[0].wwww
158 ne r0.x, l(0.000000, 0.000000, 0.000000, 0.000000), cb0[0].x
159 if_z r0.x
160 ge r0.xzw, l(0.003131, 0.000000, 0.003131, 0.003131), r1.xxyz
161 mul r3.xyz, r1.xyzx, l(12.920000, 12.920000, 12.920000, 0.000000)
162 log r4.xyz, |r1.xyzx|
163 mul r4.xyz, r4.xyzx, l(0.416667, 0.416667, 0.416667, 0.000000)
164 exp r4.xyz, r4.xyzx
165 mad r4.xyz, r4.xyzx, l(1.055000, 1.055000, 1.055000, 0.000000), l(-0.055000, -0.055000, -0.055000, 0.000000)
166 movc_sat r1.xyz, r0.xzwx, r3.xyzx, r4.xyzx
167 endif
168 else
169 if_nz r0.y
170 dp3 r0.x, l(1.660496, -0.587656, -0.072840, 0.000000), r2.xyzx
171 dp3 r0.y, l(-0.124547, 1.132895, -0.008348, 0.000000), r2.xyzx
172 dp3 r0.z, l(-0.018154, -0.100597, 1.118751, 0.000000), r2.xyzx
173 mul r1.xyz, r0.xyzx, cb0[0].wwww
174 ne r0.x, l(0.000000, 0.000000, 0.000000, 0.000000), cb0[0].x
175 if_z r0.x
176 ge r0.xyz, l(0.003131, 0.003131, 0.003131, 0.000000), r1.xyzx
177 mul r3.xyz, r1.xyzx, l(12.920000, 12.920000, 12.920000, 0.000000)
178 log r4.xyz, |r1.xyzx|
179 mul r4.xyz, r4.xyzx, l(0.416667, 0.416667, 0.416667, 0.000000)
180 exp r4.xyz, r4.xyzx
181 mad r4.xyz, r4.xyzx, l(1.055000, 1.055000, 1.055000, 0.000000), l(-0.055000, -0.055000, -0.055000, 0.000000)
182 movc_sat r1.xyz, r0.xyzx, r3.xyzx, r4.xyzx
183 endif
184 else
185 mul r1.xyz, r2.xyzx, cb0[0].wwww
186 endif
187 endif
188endif
189mul o0.xyzw, r1.xyzw, v2.xyzw
190ret
191// Approximately 126 instruction slots used
192#endif
193
194const BYTE g_main[] =
195{
196 68, 88, 66, 67, 154, 200,
197 28, 25, 30, 140, 0, 183,
198 251, 32, 6, 185, 210, 29,
199 251, 110, 1, 0, 0, 0,
200 64, 20, 0, 0, 5, 0,
201 0, 0, 52, 0, 0, 0,
202 80, 4, 0, 0, 196, 4,
203 0, 0, 248, 4, 0, 0,
204 164, 19, 0, 0, 82, 68,
205 69, 70, 20, 4, 0, 0,
206 1, 0, 0, 0, 12, 1,
207 0, 0, 5, 0, 0, 0,
208 60, 0, 0, 0, 0, 5,
209 255, 255, 0, 1, 0, 0,
210 233, 3, 0, 0, 82, 68,
211 49, 49, 60, 0, 0, 0,
212 24, 0, 0, 0, 32, 0,
213 0, 0, 40, 0, 0, 0,
214 36, 0, 0, 0, 12, 0,
215 0, 0, 0, 0, 0, 0,
216 220, 0, 0, 0, 3, 0,
217 0, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 0,
220 1, 0, 0, 0, 1, 0,
221 0, 0, 229, 0, 0, 0,
222 2, 0, 0, 0, 5, 0,
223 0, 0, 4, 0, 0, 0,
224 255, 255, 255, 255, 0, 0,
225 0, 0, 1, 0, 0, 0,
226 13, 0, 0, 0, 238, 0,
227 0, 0, 2, 0, 0, 0,
228 5, 0, 0, 0, 4, 0,
229 0, 0, 255, 255, 255, 255,
230 1, 0, 0, 0, 1, 0,
231 0, 0, 13, 0, 0, 0,
232 247, 0, 0, 0, 2, 0,
233 0, 0, 5, 0, 0, 0,
234 4, 0, 0, 0, 255, 255,
235 255, 255, 2, 0, 0, 0,
236 1, 0, 0, 0, 13, 0,
237 0, 0, 0, 1, 0, 0,
238 0, 0, 0, 0, 0, 0,
239 0, 0, 0, 0, 0, 0,
240 0, 0, 0, 0, 0, 0,
241 0, 0, 1, 0, 0, 0,
242 1, 0, 0, 0, 115, 97,
243 109, 112, 108, 101, 114, 48,
244 0, 116, 101, 120, 116, 117,
245 114, 101, 48, 0, 116, 101,
246 120, 116, 117, 114, 101, 49,
247 0, 116, 101, 120, 116, 117,
248 114, 101, 50, 0, 67, 111,
249 110, 115, 116, 97, 110, 116,
250 115, 0, 171, 171, 0, 1,
251 0, 0, 12, 0, 0, 0,
252 36, 1, 0, 0, 96, 0,
253 0, 0, 0, 0, 0, 0,
254 0, 0, 0, 0, 4, 3,
255 0, 0, 0, 0, 0, 0,
256 4, 0, 0, 0, 2, 0,
257 0, 0, 24, 3, 0, 0,
258 0, 0, 0, 0, 255, 255,
259 255, 255, 0, 0, 0, 0,
260 255, 255, 255, 255, 0, 0,
261 0, 0, 60, 3, 0, 0,
262 4, 0, 0, 0, 4, 0,
263 0, 0, 2, 0, 0, 0,
264 24, 3, 0, 0, 0, 0,
265 0, 0, 255, 255, 255, 255,
266 0, 0, 0, 0, 255, 255,
267 255, 255, 0, 0, 0, 0,
268 73, 3, 0, 0, 8, 0,
269 0, 0, 4, 0, 0, 0,
270 2, 0, 0, 0, 24, 3,
271 0, 0, 0, 0, 0, 0,
272 255, 255, 255, 255, 0, 0,
273 0, 0, 255, 255, 255, 255,
274 0, 0, 0, 0, 84, 3,
275 0, 0, 12, 0, 0, 0,
276 4, 0, 0, 0, 2, 0,
277 0, 0, 24, 3, 0, 0,
278 0, 0, 0, 0, 255, 255,
279 255, 255, 0, 0, 0, 0,
280 255, 255, 255, 255, 0, 0,
281 0, 0, 96, 3, 0, 0,
282 16, 0, 0, 0, 4, 0,
283 0, 0, 2, 0, 0, 0,
284 24, 3, 0, 0, 0, 0,
285 0, 0, 255, 255, 255, 255,
286 0, 0, 0, 0, 255, 255,
287 255, 255, 0, 0, 0, 0,
288 111, 3, 0, 0, 20, 0,
289 0, 0, 4, 0, 0, 0,
290 2, 0, 0, 0, 24, 3,
291 0, 0, 0, 0, 0, 0,
292 255, 255, 255, 255, 0, 0,
293 0, 0, 255, 255, 255, 255,
294 0, 0, 0, 0, 127, 3,
295 0, 0, 24, 0, 0, 0,
296 4, 0, 0, 0, 2, 0,
297 0, 0, 24, 3, 0, 0,
298 0, 0, 0, 0, 255, 255,
299 255, 255, 0, 0, 0, 0,
300 255, 255, 255, 255, 0, 0,
301 0, 0, 143, 3, 0, 0,
302 28, 0, 0, 0, 4, 0,
303 0, 0, 2, 0, 0, 0,
304 24, 3, 0, 0, 0, 0,
305 0, 0, 255, 255, 255, 255,
306 0, 0, 0, 0, 255, 255,
307 255, 255, 0, 0, 0, 0,
308 159, 3, 0, 0, 32, 0,
309 0, 0, 16, 0, 0, 0,
310 2, 0, 0, 0, 176, 3,
311 0, 0, 0, 0, 0, 0,
312 255, 255, 255, 255, 0, 0,
313 0, 0, 255, 255, 255, 255,
314 0, 0, 0, 0, 212, 3,
315 0, 0, 48, 0, 0, 0,
316 16, 0, 0, 0, 2, 0,
317 0, 0, 176, 3, 0, 0,
318 0, 0, 0, 0, 255, 255,
319 255, 255, 0, 0, 0, 0,
320 255, 255, 255, 255, 0, 0,
321 0, 0, 219, 3, 0, 0,
322 64, 0, 0, 0, 16, 0,
323 0, 0, 2, 0, 0, 0,
324 176, 3, 0, 0, 0, 0,
325 0, 0, 255, 255, 255, 255,
326 0, 0, 0, 0, 255, 255,
327 255, 255, 0, 0, 0, 0,
328 226, 3, 0, 0, 80, 0,
329 0, 0, 16, 0, 0, 0,
330 2, 0, 0, 0, 176, 3,
331 0, 0, 0, 0, 0, 0,
332 255, 255, 255, 255, 0, 0,
333 0, 0, 255, 255, 255, 255,
334 0, 0, 0, 0, 115, 99,
335 82, 71, 66, 95, 111, 117,
336 116, 112, 117, 116, 0, 102,
337 108, 111, 97, 116, 0, 171,
338 0, 0, 3, 0, 1, 0,
339 1, 0, 0, 0, 0, 0,
340 0, 0, 0, 0, 0, 0,
341 0, 0, 0, 0, 0, 0,
342 0, 0, 0, 0, 0, 0,
343 0, 0, 17, 3, 0, 0,
344 116, 101, 120, 116, 117, 114,
345 101, 95, 116, 121, 112, 101,
346 0, 105, 110, 112, 117, 116,
347 95, 116, 121, 112, 101, 0,
348 99, 111, 108, 111, 114, 95,
349 115, 99, 97, 108, 101, 0,
350 116, 111, 110, 101, 109, 97,
351 112, 95, 109, 101, 116, 104,
352 111, 100, 0, 116, 111, 110,
353 101, 109, 97, 112, 95, 102,
354 97, 99, 116, 111, 114, 49,
355 0, 116, 111, 110, 101, 109,
356 97, 112, 95, 102, 97, 99,
357 116, 111, 114, 50, 0, 115,
358 100, 114, 95, 119, 104, 105,
359 116, 101, 95, 112, 111, 105,
360 110, 116, 0, 89, 111, 102,
361 102, 115, 101, 116, 0, 102,
362 108, 111, 97, 116, 52, 0,
363 171, 171, 1, 0, 3, 0,
364 1, 0, 4, 0, 0, 0,
365 0, 0, 0, 0, 0, 0,
366 0, 0, 0, 0, 0, 0,
367 0, 0, 0, 0, 0, 0,
368 0, 0, 0, 0, 167, 3,
369 0, 0, 82, 99, 111, 101,
370 102, 102, 0, 71, 99, 111,
371 101, 102, 102, 0, 66, 99,
372 111, 101, 102, 102, 0, 77,
373 105, 99, 114, 111, 115, 111,
374 102, 116, 32, 40, 82, 41,
375 32, 72, 76, 83, 76, 32,
376 83, 104, 97, 100, 101, 114,
377 32, 67, 111, 109, 112, 105,
378 108, 101, 114, 32, 49, 48,
379 46, 49, 0, 171, 171, 171,
380 73, 83, 71, 78, 108, 0,
381 0, 0, 3, 0, 0, 0,
382 8, 0, 0, 0, 80, 0,
383 0, 0, 0, 0, 0, 0,
384 1, 0, 0, 0, 3, 0,
385 0, 0, 0, 0, 0, 0,
386 15, 0, 0, 0, 92, 0,
387 0, 0, 0, 0, 0, 0,
388 0, 0, 0, 0, 3, 0,
389 0, 0, 1, 0, 0, 0,
390 3, 3, 0, 0, 101, 0,
391 0, 0, 0, 0, 0, 0,
392 0, 0, 0, 0, 3, 0,
393 0, 0, 2, 0, 0, 0,
394 15, 15, 0, 0, 83, 86,
395 95, 80, 79, 83, 73, 84,
396 73, 79, 78, 0, 84, 69,
397 88, 67, 79, 79, 82, 68,
398 0, 67, 79, 76, 79, 82,
399 0, 171, 79, 83, 71, 78,
400 44, 0, 0, 0, 1, 0,
401 0, 0, 8, 0, 0, 0,
402 32, 0, 0, 0, 0, 0,
403 0, 0, 0, 0, 0, 0,
404 3, 0, 0, 0, 0, 0,
405 0, 0, 15, 0, 0, 0,
406 83, 86, 95, 84, 65, 82,
407 71, 69, 84, 0, 171, 171,
408 83, 72, 69, 88, 164, 14,
409 0, 0, 80, 0, 0, 0,
410 169, 3, 0, 0, 106, 8,
411 0, 1, 89, 0, 0, 4,
412 70, 142, 32, 0, 0, 0,
413 0, 0, 6, 0, 0, 0,
414 90, 0, 0, 3, 0, 96,
415 16, 0, 0, 0, 0, 0,
416 88, 24, 0, 4, 0, 112,
417 16, 0, 0, 0, 0, 0,
418 85, 85, 0, 0, 88, 24,
419 0, 4, 0, 112, 16, 0,
420 1, 0, 0, 0, 85, 85,
421 0, 0, 88, 24, 0, 4,
422 0, 112, 16, 0, 2, 0,
423 0, 0, 85, 85, 0, 0,
424 98, 16, 0, 3, 50, 16,
425 16, 0, 1, 0, 0, 0,
426 98, 16, 0, 3, 242, 16,
427 16, 0, 2, 0, 0, 0,
428 101, 0, 0, 3, 242, 32,
429 16, 0, 0, 0, 0, 0,
430 104, 0, 0, 2, 7, 0,
431 0, 0, 24, 0, 0, 11,
432 242, 0, 16, 0, 0, 0,
433 0, 0, 150, 138, 32, 0,
434 0, 0, 0, 0, 0, 0,
435 0, 0, 2, 64, 0, 0,
436 0, 0, 0, 0, 0, 0,
437 64, 64, 0, 0, 0, 64,
438 0, 0, 128, 63, 31, 0,
439 4, 3, 10, 0, 16, 0,
440 0, 0, 0, 0, 54, 0,
441 0, 8, 242, 0, 16, 0,
442 1, 0, 0, 0, 2, 64,
443 0, 0, 0, 0, 128, 63,
444 0, 0, 128, 63, 0, 0,
445 128, 63, 0, 0, 128, 63,
446 18, 0, 0, 1, 24, 0,
447 0, 8, 18, 0, 16, 0,
448 0, 0, 0, 0, 26, 128,
449 32, 0, 0, 0, 0, 0,
450 0, 0, 0, 0, 1, 64,
451 0, 0, 0, 0, 128, 63,
452 31, 0, 4, 3, 10, 0,
453 16, 0, 0, 0, 0, 0,
454 69, 0, 0, 139, 194, 0,
455 0, 128, 67, 85, 21, 0,
456 242, 0, 16, 0, 1, 0,
457 0, 0, 70, 16, 16, 0,
458 1, 0, 0, 0, 70, 126,
459 16, 0, 0, 0, 0, 0,
460 0, 96, 16, 0, 0, 0,
461 0, 0, 18, 0, 0, 1,
462 24, 0, 0, 8, 18, 0,
463 16, 0, 0, 0, 0, 0,
464 26, 128, 32, 0, 0, 0,
465 0, 0, 0, 0, 0, 0,
466 1, 64, 0, 0, 0, 0,
467 0, 64, 31, 0, 4, 3,
468 10, 0, 16, 0, 0, 0,
469 0, 0, 69, 0, 0, 139,
470 194, 0, 0, 128, 67, 85,
471 21, 0, 18, 0, 16, 0,
472 2, 0, 0, 0, 70, 16,
473 16, 0, 1, 0, 0, 0,
474 70, 126, 16, 0, 0, 0,
475 0, 0, 0, 96, 16, 0,
476 0, 0, 0, 0, 69, 0,
477 0, 139, 194, 0, 0, 128,
478 67, 85, 21, 0, 98, 0,
479 16, 0, 2, 0, 0, 0,
480 70, 16, 16, 0, 1, 0,
481 0, 0, 38, 125, 16, 0,
482 1, 0, 0, 0, 0, 96,
483 16, 0, 0, 0, 0, 0,
484 0, 0, 0, 8, 114, 0,
485 16, 0, 2, 0, 0, 0,
486 70, 2, 16, 0, 2, 0,
487 0, 0, 70, 130, 32, 0,
488 0, 0, 0, 0, 2, 0,
489 0, 0, 16, 0, 0, 8,
490 18, 0, 16, 0, 1, 0,
491 0, 0, 70, 2, 16, 0,
492 2, 0, 0, 0, 70, 130,
493 32, 0, 0, 0, 0, 0,
494 3, 0, 0, 0, 16, 0,
495 0, 8, 34, 0, 16, 0,
496 1, 0, 0, 0, 70, 2,
497 16, 0, 2, 0, 0, 0,
498 70, 130, 32, 0, 0, 0,
499 0, 0, 4, 0, 0, 0,
500 16, 0, 0, 8, 66, 0,
501 16, 0, 1, 0, 0, 0,
502 70, 2, 16, 0, 2, 0,
503 0, 0, 70, 130, 32, 0,
504 0, 0, 0, 0, 5, 0,
505 0, 0, 18, 0, 0, 1,
506 24, 0, 0, 8, 18, 0,
507 16, 0, 0, 0, 0, 0,
508 26, 128, 32, 0, 0, 0,
509 0, 0, 0, 0, 0, 0,
510 1, 64, 0, 0, 0, 0,
511 64, 64, 31, 0, 4, 3,
512 10, 0, 16, 0, 0, 0,
513 0, 0, 69, 0, 0, 139,
514 194, 0, 0, 128, 67, 85,
515 21, 0, 18, 0, 16, 0,
516 2, 0, 0, 0, 70, 16,
517 16, 0, 1, 0, 0, 0,
518 70, 126, 16, 0, 0, 0,
519 0, 0, 0, 96, 16, 0,
520 0, 0, 0, 0, 69, 0,
521 0, 139, 194, 0, 0, 128,
522 67, 85, 21, 0, 98, 0,
523 16, 0, 2, 0, 0, 0,
524 70, 16, 16, 0, 1, 0,
525 0, 0, 102, 124, 16, 0,
526 1, 0, 0, 0, 0, 96,
527 16, 0, 0, 0, 0, 0,
528 0, 0, 0, 8, 114, 0,
529 16, 0, 2, 0, 0, 0,
530 70, 2, 16, 0, 2, 0,
531 0, 0, 70, 130, 32, 0,
532 0, 0, 0, 0, 2, 0,
533 0, 0, 16, 0, 0, 8,
534 18, 0, 16, 0, 1, 0,
535 0, 0, 70, 2, 16, 0,
536 2, 0, 0, 0, 70, 130,
537 32, 0, 0, 0, 0, 0,
538 3, 0, 0, 0, 16, 0,
539 0, 8, 34, 0, 16, 0,
540 1, 0, 0, 0, 70, 2,
541 16, 0, 2, 0, 0, 0,
542 70, 130, 32, 0, 0, 0,
543 0, 0, 4, 0, 0, 0,
544 16, 0, 0, 8, 66, 0,
545 16, 0, 1, 0, 0, 0,
546 70, 2, 16, 0, 2, 0,
547 0, 0, 70, 130, 32, 0,
548 0, 0, 0, 0, 5, 0,
549 0, 0, 18, 0, 0, 1,
550 24, 0, 0, 8, 18, 0,
551 16, 0, 0, 0, 0, 0,
552 26, 128, 32, 0, 0, 0,
553 0, 0, 0, 0, 0, 0,
554 1, 64, 0, 0, 0, 0,
555 128, 64, 31, 0, 4, 3,
556 10, 0, 16, 0, 0, 0,
557 0, 0, 69, 0, 0, 139,
558 194, 0, 0, 128, 67, 85,
559 21, 0, 18, 0, 16, 0,
560 2, 0, 0, 0, 70, 16,
561 16, 0, 1, 0, 0, 0,
562 70, 126, 16, 0, 0, 0,
563 0, 0, 0, 96, 16, 0,
564 0, 0, 0, 0, 69, 0,
565 0, 139, 194, 0, 0, 128,
566 67, 85, 21, 0, 34, 0,
567 16, 0, 2, 0, 0, 0,
568 70, 16, 16, 0, 1, 0,
569 0, 0, 22, 126, 16, 0,
570 1, 0, 0, 0, 0, 96,
571 16, 0, 0, 0, 0, 0,
572 69, 0, 0, 139, 194, 0,
573 0, 128, 67, 85, 21, 0,
574 66, 0, 16, 0, 2, 0,
575 0, 0, 70, 16, 16, 0,
576 1, 0, 0, 0, 150, 124,
577 16, 0, 2, 0, 0, 0,
578 0, 96, 16, 0, 0, 0,
579 0, 0, 0, 0, 0, 8,
580 114, 0, 16, 0, 2, 0,
581 0, 0, 70, 2, 16, 0,
582 2, 0, 0, 0, 70, 130,
583 32, 0, 0, 0, 0, 0,
584 2, 0, 0, 0, 16, 0,
585 0, 8, 18, 0, 16, 0,
586 1, 0, 0, 0, 70, 2,
587 16, 0, 2, 0, 0, 0,
588 70, 130, 32, 0, 0, 0,
589 0, 0, 3, 0, 0, 0,
590 16, 0, 0, 8, 34, 0,
591 16, 0, 1, 0, 0, 0,
592 70, 2, 16, 0, 2, 0,
593 0, 0, 70, 130, 32, 0,
594 0, 0, 0, 0, 4, 0,
595 0, 0, 16, 0, 0, 8,
596 66, 0, 16, 0, 1, 0,
597 0, 0, 70, 2, 16, 0,
598 2, 0, 0, 0, 70, 130,
599 32, 0, 0, 0, 0, 0,
600 5, 0, 0, 0, 18, 0,
601 0, 1, 54, 0, 0, 8,
602 114, 0, 16, 0, 1, 0,
603 0, 0, 2, 64, 0, 0,
604 0, 0, 128, 63, 0, 0,
605 0, 0, 0, 0, 0, 0,
606 0, 0, 0, 0, 21, 0,
607 0, 1, 21, 0, 0, 1,
608 21, 0, 0, 1, 54, 0,
609 0, 5, 130, 0, 16, 0,
610 1, 0, 0, 0, 1, 64,
611 0, 0, 0, 0, 128, 63,
612 21, 0, 0, 1, 21, 0,
613 0, 1, 47, 0, 0, 6,
614 114, 0, 16, 0, 2, 0,
615 0, 0, 70, 2, 16, 128,
616 129, 0, 0, 0, 1, 0,
617 0, 0, 56, 0, 0, 10,
618 114, 0, 16, 0, 2, 0,
619 0, 0, 70, 2, 16, 0,
620 2, 0, 0, 0, 2, 64,
621 0, 0, 172, 205, 79, 60,
622 172, 205, 79, 60, 172, 205,
623 79, 60, 0, 0, 0, 0,
624 25, 0, 0, 5, 114, 0,
625 16, 0, 2, 0, 0, 0,
626 70, 2, 16, 0, 2, 0,
627 0, 0, 0, 0, 0, 10,
628 114, 0, 16, 0, 3, 0,
629 0, 0, 70, 2, 16, 0,
630 2, 0, 0, 0, 2, 64,
631 0, 0, 0, 0, 86, 191,
632 0, 0, 86, 191, 0, 0,
633 86, 191, 0, 0, 0, 0,
634 52, 0, 0, 10, 114, 0,
635 16, 0, 3, 0, 0, 0,
636 70, 2, 16, 0, 3, 0,
637 0, 0, 2, 64, 0, 0,
638 0, 0, 0, 0, 0, 0,
639 0, 0, 0, 0, 0, 0,
640 0, 0, 0, 0, 50, 0,
641 0, 16, 114, 0, 16, 0,
642 2, 0, 0, 0, 70, 2,
643 16, 128, 65, 0, 0, 0,
644 2, 0, 0, 0, 2, 64,
645 0, 0, 0, 128, 149, 65,
646 0, 128, 149, 65, 0, 128,
647 149, 65, 0, 0, 0, 0,
648 2, 64, 0, 0, 0, 208,
649 150, 65, 0, 208, 150, 65,
650 0, 208, 150, 65, 0, 0,
651 0, 0, 14, 0, 0, 7,
652 114, 0, 16, 0, 2, 0,
653 0, 0, 70, 2, 16, 0,
654 3, 0, 0, 0, 70, 2,
655 16, 0, 2, 0, 0, 0,
656 47, 0, 0, 6, 114, 0,
657 16, 0, 2, 0, 0, 0,
658 70, 2, 16, 128, 129, 0,
659 0, 0, 2, 0, 0, 0,
660 56, 0, 0, 10, 114, 0,
661 16, 0, 2, 0, 0, 0,
662 70, 2, 16, 0, 2, 0,
663 0, 0, 2, 64, 0, 0,
664 107, 224, 200, 64, 107, 224,
665 200, 64, 107, 224, 200, 64,
666 0, 0, 0, 0, 25, 0,
667 0, 5, 114, 0, 16, 0,
668 2, 0, 0, 0, 70, 2,
669 16, 0, 2, 0, 0, 0,
670 56, 0, 0, 10, 114, 0,
671 16, 0, 2, 0, 0, 0,
672 70, 2, 16, 0, 2, 0,
673 0, 0, 2, 64, 0, 0,
674 0, 64, 28, 70, 0, 64,
675 28, 70, 0, 64, 28, 70,
676 0, 0, 0, 0, 14, 0,
677 0, 8, 114, 0, 16, 0,
678 2, 0, 0, 0, 70, 2,
679 16, 0, 2, 0, 0, 0,
680 246, 143, 32, 0, 0, 0,
681 0, 0, 1, 0, 0, 0,
682 55, 0, 0, 9, 114, 0,
683 16, 0, 2, 0, 0, 0,
684 86, 5, 16, 0, 0, 0,
685 0, 0, 70, 2, 16, 0,
686 2, 0, 0, 0, 70, 2,
687 16, 0, 1, 0, 0, 0,
688 57, 0, 0, 8, 18, 0,
689 16, 0, 0, 0, 0, 0,
690 10, 128, 32, 0, 0, 0,
691 0, 0, 1, 0, 0, 0,
692 1, 64, 0, 0, 0, 0,
693 0, 0, 56, 0, 0, 8,
694 114, 0, 16, 0, 3, 0,
695 0, 0, 70, 2, 16, 0,
696 2, 0, 0, 0, 86, 133,
697 32, 0, 0, 0, 0, 0,
698 1, 0, 0, 0, 24, 0,
699 0, 11, 50, 0, 16, 0,
700 4, 0, 0, 0, 6, 128,
701 32, 0, 0, 0, 0, 0,
702 1, 0, 0, 0, 2, 64,
703 0, 0, 0, 0, 128, 63,
704 0, 0, 0, 64, 0, 0,
705 0, 0, 0, 0, 0, 0,
706 16, 0, 0, 10, 18, 0,
707 16, 0, 5, 0, 0, 0,
708 2, 64, 0, 0, 140, 157,
709 32, 63, 200, 151, 168, 62,
710 249, 104, 49, 61, 0, 0,
711 0, 0, 70, 2, 16, 0,
712 2, 0, 0, 0, 16, 0,
713 0, 10, 34, 0, 16, 0,
714 5, 0, 0, 0, 2, 64,
715 0, 0, 186, 130, 141, 61,
716 10, 103, 107, 63, 175, 39,
717 58, 60, 0, 0, 0, 0,
718 70, 2, 16, 0, 2, 0,
719 0, 0, 16, 0, 0, 10,
720 66, 0, 16, 0, 5, 0,
721 0, 0, 2, 64, 0, 0,
722 107, 70, 134, 60, 41, 64,
723 180, 61, 183, 69, 101, 63,
724 0, 0, 0, 0, 70, 2,
725 16, 0, 2, 0, 0, 0,
726 55, 0, 0, 9, 114, 0,
727 16, 0, 5, 0, 0, 0,
728 166, 10, 16, 0, 0, 0,
729 0, 0, 70, 2, 16, 0,
730 5, 0, 0, 0, 70, 2,
731 16, 0, 2, 0, 0, 0,
732 52, 0, 0, 7, 130, 0,
733 16, 0, 2, 0, 0, 0,
734 42, 0, 16, 0, 5, 0,
735 0, 0, 26, 0, 16, 0,
736 5, 0, 0, 0, 52, 0,
737 0, 7, 130, 0, 16, 0,
738 2, 0, 0, 0, 58, 0,
739 16, 0, 2, 0, 0, 0,
740 10, 0, 16, 0, 5, 0,
741 0, 0, 49, 0, 0, 7,
742 130, 0, 16, 0, 3, 0,
743 0, 0, 1, 64, 0, 0,
744 0, 0, 0, 0, 58, 0,
745 16, 0, 2, 0, 0, 0,
746 50, 0, 0, 13, 194, 0,
747 16, 0, 4, 0, 0, 0,
748 86, 137, 32, 0, 0, 0,
749 0, 0, 1, 0, 0, 0,
750 246, 15, 16, 0, 2, 0,
751 0, 0, 2, 64, 0, 0,
752 0, 0, 0, 0, 0, 0,
753 0, 0, 0, 0, 128, 63,
754 0, 0, 128, 63, 14, 0,
755 0, 7, 130, 0, 16, 0,
756 2, 0, 0, 0, 42, 0,
757 16, 0, 4, 0, 0, 0,
758 58, 0, 16, 0, 4, 0,
759 0, 0, 56, 0, 0, 7,
760 114, 0, 16, 0, 6, 0,
761 0, 0, 246, 15, 16, 0,
762 2, 0, 0, 0, 70, 2,
763 16, 0, 5, 0, 0, 0,
764 55, 0, 0, 9, 114, 0,
765 16, 0, 5, 0, 0, 0,
766 246, 15, 16, 0, 3, 0,
767 0, 0, 70, 2, 16, 0,
768 6, 0, 0, 0, 70, 2,
769 16, 0, 5, 0, 0, 0,
770 16, 0, 0, 10, 18, 0,
771 16, 0, 6, 0, 0, 0,
772 2, 64, 0, 0, 34, 139,
773 212, 63, 160, 112, 22, 191,
774 35, 45, 149, 189, 0, 0,
775 0, 0, 70, 2, 16, 0,
776 5, 0, 0, 0, 16, 0,
777 0, 10, 34, 0, 16, 0,
778 6, 0, 0, 0, 2, 64,
779 0, 0, 127, 18, 255, 189,
780 180, 2, 145, 63, 13, 198,
781 8, 188, 0, 0, 0, 0,
782 70, 2, 16, 0, 5, 0,
783 0, 0, 16, 0, 0, 10,
784 66, 0, 16, 0, 6, 0,
785 0, 0, 2, 64, 0, 0,
786 179, 183, 148, 188, 205, 5,
787 206, 189, 60, 51, 143, 63,
788 0, 0, 0, 0, 70, 2,
789 16, 0, 5, 0, 0, 0,
790 55, 0, 0, 9, 114, 0,
791 16, 0, 5, 0, 0, 0,
792 166, 10, 16, 0, 0, 0,
793 0, 0, 70, 2, 16, 0,
794 6, 0, 0, 0, 70, 2,
795 16, 0, 5, 0, 0, 0,
796 55, 0, 0, 9, 226, 0,
797 16, 0, 4, 0, 0, 0,
798 86, 5, 16, 0, 4, 0,
799 0, 0, 6, 9, 16, 0,
800 5, 0, 0, 0, 6, 9,
801 16, 0, 2, 0, 0, 0,
802 55, 0, 0, 9, 114, 0,
803 16, 0, 3, 0, 0, 0,
804 6, 0, 16, 0, 4, 0,
805 0, 0, 70, 2, 16, 0,
806 3, 0, 0, 0, 150, 7,
807 16, 0, 4, 0, 0, 0,
808 55, 0, 0, 9, 114, 0,
809 16, 0, 2, 0, 0, 0,
810 6, 0, 16, 0, 0, 0,
811 0, 0, 70, 2, 16, 0,
812 3, 0, 0, 0, 70, 2,
813 16, 0, 2, 0, 0, 0,
814 31, 0, 4, 3, 58, 0,
815 16, 0, 0, 0, 0, 0,
816 57, 0, 0, 11, 18, 0,
817 16, 0, 0, 0, 0, 0,
818 2, 64, 0, 0, 0, 0,
819 0, 0, 0, 0, 0, 0,
820 0, 0, 0, 0, 0, 0,
821 0, 0, 10, 128, 32, 0,
822 0, 0, 0, 0, 0, 0,
823 0, 0, 31, 0, 4, 3,
824 10, 0, 16, 0, 0, 0,
825 0, 0, 29, 0, 0, 10,
826 114, 0, 16, 0, 3, 0,
827 0, 0, 2, 64, 0, 0,
828 230, 174, 37, 61, 230, 174,
829 37, 61, 230, 174, 37, 61,
830 0, 0, 0, 0, 70, 2,
831 16, 0, 2, 0, 0, 0,
832 56, 0, 0, 10, 114, 0,
833 16, 0, 4, 0, 0, 0,
834 70, 2, 16, 0, 2, 0,
835 0, 0, 2, 64, 0, 0,
836 145, 131, 158, 61, 145, 131,
837 158, 61, 145, 131, 158, 61,
838 0, 0, 0, 0, 0, 0,
839 0, 10, 114, 0, 16, 0,
840 5, 0, 0, 0, 70, 2,
841 16, 0, 2, 0, 0, 0,
842 2, 64, 0, 0, 174, 71,
843 97, 61, 174, 71, 97, 61,
844 174, 71, 97, 61, 0, 0,
845 0, 0, 56, 0, 0, 11,
846 114, 0, 16, 0, 5, 0,
847 0, 0, 70, 2, 16, 128,
848 129, 0, 0, 0, 5, 0,
849 0, 0, 2, 64, 0, 0,
850 111, 167, 114, 63, 111, 167,
851 114, 63, 111, 167, 114, 63,
852 0, 0, 0, 0, 47, 0,
853 0, 5, 114, 0, 16, 0,
854 5, 0, 0, 0, 70, 2,
855 16, 0, 5, 0, 0, 0,
856 56, 0, 0, 10, 114, 0,
857 16, 0, 5, 0, 0, 0,
858 70, 2, 16, 0, 5, 0,
859 0, 0, 2, 64, 0, 0,
860 154, 153, 25, 64, 154, 153,
861 25, 64, 154, 153, 25, 64,
862 0, 0, 0, 0, 25, 0,
863 0, 5, 114, 0, 16, 0,
864 5, 0, 0, 0, 70, 2,
865 16, 0, 5, 0, 0, 0,
866 55, 0, 0, 9, 114, 0,
867 16, 0, 2, 0, 0, 0,
868 70, 2, 16, 0, 3, 0,
869 0, 0, 70, 2, 16, 0,
870 4, 0, 0, 0, 70, 2,
871 16, 0, 5, 0, 0, 0,
872 21, 0, 0, 1, 56, 0,
873 0, 8, 114, 0, 16, 0,
874 1, 0, 0, 0, 70, 2,
875 16, 0, 2, 0, 0, 0,
876 246, 143, 32, 0, 0, 0,
877 0, 0, 0, 0, 0, 0,
878 18, 0, 0, 1, 31, 0,
879 4, 3, 42, 0, 16, 0,
880 0, 0, 0, 0, 56, 0,
881 0, 8, 114, 0, 16, 0,
882 1, 0, 0, 0, 70, 2,
883 16, 0, 2, 0, 0, 0,
884 246, 143, 32, 0, 0, 0,
885 0, 0, 0, 0, 0, 0,
886 57, 0, 0, 11, 18, 0,
887 16, 0, 0, 0, 0, 0,
888 2, 64, 0, 0, 0, 0,
889 0, 0, 0, 0, 0, 0,
890 0, 0, 0, 0, 0, 0,
891 0, 0, 10, 128, 32, 0,
892 0, 0, 0, 0, 0, 0,
893 0, 0, 31, 0, 0, 3,
894 10, 0, 16, 0, 0, 0,
895 0, 0, 29, 0, 0, 10,
896 210, 0, 16, 0, 0, 0,
897 0, 0, 2, 64, 0, 0,
898 28, 46, 77, 59, 0, 0,
899 0, 0, 28, 46, 77, 59,
900 28, 46, 77, 59, 6, 9,
901 16, 0, 1, 0, 0, 0,
902 56, 0, 0, 10, 114, 0,
903 16, 0, 3, 0, 0, 0,
904 70, 2, 16, 0, 1, 0,
905 0, 0, 2, 64, 0, 0,
906 82, 184, 78, 65, 82, 184,
907 78, 65, 82, 184, 78, 65,
908 0, 0, 0, 0, 47, 0,
909 0, 6, 114, 0, 16, 0,
910 4, 0, 0, 0, 70, 2,
911 16, 128, 129, 0, 0, 0,
912 1, 0, 0, 0, 56, 0,
913 0, 10, 114, 0, 16, 0,
914 4, 0, 0, 0, 70, 2,
915 16, 0, 4, 0, 0, 0,
916 2, 64, 0, 0, 85, 85,
917 213, 62, 85, 85, 213, 62,
918 85, 85, 213, 62, 0, 0,
919 0, 0, 25, 0, 0, 5,
920 114, 0, 16, 0, 4, 0,
921 0, 0, 70, 2, 16, 0,
922 4, 0, 0, 0, 50, 0,
923 0, 15, 114, 0, 16, 0,
924 4, 0, 0, 0, 70, 2,
925 16, 0, 4, 0, 0, 0,
926 2, 64, 0, 0, 61, 10,
927 135, 63, 61, 10, 135, 63,
928 61, 10, 135, 63, 0, 0,
929 0, 0, 2, 64, 0, 0,
930 174, 71, 97, 189, 174, 71,
931 97, 189, 174, 71, 97, 189,
932 0, 0, 0, 0, 55, 32,
933 0, 9, 114, 0, 16, 0,
934 1, 0, 0, 0, 134, 3,
935 16, 0, 0, 0, 0, 0,
936 70, 2, 16, 0, 3, 0,
937 0, 0, 70, 2, 16, 0,
938 4, 0, 0, 0, 21, 0,
939 0, 1, 18, 0, 0, 1,
940 31, 0, 4, 3, 26, 0,
941 16, 0, 0, 0, 0, 0,
942 16, 0, 0, 10, 18, 0,
943 16, 0, 0, 0, 0, 0,
944 2, 64, 0, 0, 34, 139,
945 212, 63, 160, 112, 22, 191,
946 35, 45, 149, 189, 0, 0,
947 0, 0, 70, 2, 16, 0,
948 2, 0, 0, 0, 16, 0,
949 0, 10, 34, 0, 16, 0,
950 0, 0, 0, 0, 2, 64,
951 0, 0, 127, 18, 255, 189,
952 180, 2, 145, 63, 13, 198,
953 8, 188, 0, 0, 0, 0,
954 70, 2, 16, 0, 2, 0,
955 0, 0, 16, 0, 0, 10,
956 66, 0, 16, 0, 0, 0,
957 0, 0, 2, 64, 0, 0,
958 179, 183, 148, 188, 205, 5,
959 206, 189, 60, 51, 143, 63,
960 0, 0, 0, 0, 70, 2,
961 16, 0, 2, 0, 0, 0,
962 56, 0, 0, 8, 114, 0,
963 16, 0, 1, 0, 0, 0,
964 70, 2, 16, 0, 0, 0,
965 0, 0, 246, 143, 32, 0,
966 0, 0, 0, 0, 0, 0,
967 0, 0, 57, 0, 0, 11,
968 18, 0, 16, 0, 0, 0,
969 0, 0, 2, 64, 0, 0,
970 0, 0, 0, 0, 0, 0,
971 0, 0, 0, 0, 0, 0,
972 0, 0, 0, 0, 10, 128,
973 32, 0, 0, 0, 0, 0,
974 0, 0, 0, 0, 31, 0,
975 0, 3, 10, 0, 16, 0,
976 0, 0, 0, 0, 29, 0,
977 0, 10, 114, 0, 16, 0,
978 0, 0, 0, 0, 2, 64,
979 0, 0, 28, 46, 77, 59,
980 28, 46, 77, 59, 28, 46,
981 77, 59, 0, 0, 0, 0,
982 70, 2, 16, 0, 1, 0,
983 0, 0, 56, 0, 0, 10,
984 114, 0, 16, 0, 3, 0,
985 0, 0, 70, 2, 16, 0,
986 1, 0, 0, 0, 2, 64,
987 0, 0, 82, 184, 78, 65,
988 82, 184, 78, 65, 82, 184,
989 78, 65, 0, 0, 0, 0,
990 47, 0, 0, 6, 114, 0,
991 16, 0, 4, 0, 0, 0,
992 70, 2, 16, 128, 129, 0,
993 0, 0, 1, 0, 0, 0,
994 56, 0, 0, 10, 114, 0,
995 16, 0, 4, 0, 0, 0,
996 70, 2, 16, 0, 4, 0,
997 0, 0, 2, 64, 0, 0,
998 85, 85, 213, 62, 85, 85,
999 213, 62, 85, 85, 213, 62,
1000 0, 0, 0, 0, 25, 0,
1001 0, 5, 114, 0, 16, 0,
1002 4, 0, 0, 0, 70, 2,
1003 16, 0, 4, 0, 0, 0,
1004 50, 0, 0, 15, 114, 0,
1005 16, 0, 4, 0, 0, 0,
1006 70, 2, 16, 0, 4, 0,
1007 0, 0, 2, 64, 0, 0,
1008 61, 10, 135, 63, 61, 10,
1009 135, 63, 61, 10, 135, 63,
1010 0, 0, 0, 0, 2, 64,
1011 0, 0, 174, 71, 97, 189,
1012 174, 71, 97, 189, 174, 71,
1013 97, 189, 0, 0, 0, 0,
1014 55, 32, 0, 9, 114, 0,
1015 16, 0, 1, 0, 0, 0,
1016 70, 2, 16, 0, 0, 0,
1017 0, 0, 70, 2, 16, 0,
1018 3, 0, 0, 0, 70, 2,
1019 16, 0, 4, 0, 0, 0,
1020 21, 0, 0, 1, 18, 0,
1021 0, 1, 56, 0, 0, 8,
1022 114, 0, 16, 0, 1, 0,
1023 0, 0, 70, 2, 16, 0,
1024 2, 0, 0, 0, 246, 143,
1025 32, 0, 0, 0, 0, 0,
1026 0, 0, 0, 0, 21, 0,
1027 0, 1, 21, 0, 0, 1,
1028 21, 0, 0, 1, 56, 0,
1029 0, 7, 242, 32, 16, 0,
1030 0, 0, 0, 0, 70, 14,
1031 16, 0, 1, 0, 0, 0,
1032 70, 30, 16, 0, 2, 0,
1033 0, 0, 62, 0, 0, 1,
1034 83, 84, 65, 84, 148, 0,
1035 0, 0, 126, 0, 0, 0,
1036 7, 0, 0, 0, 0, 0,
1037 0, 0, 3, 0, 0, 0,
1038 71, 0, 0, 0, 0, 0,
1039 0, 0, 0, 0, 0, 0,
1040 9, 0, 0, 0, 11, 0,
1041 0, 0, 0, 0, 0, 0,
1042 0, 0, 0, 0, 0, 0,
1043 0, 0, 0, 0, 0, 0,
1044 0, 0, 0, 0, 8, 0,
1045 0, 0, 0, 0, 0, 0,
1046 0, 0, 0, 0, 0, 0,
1047 0, 0, 0, 0, 0, 0,
1048 3, 0, 0, 0, 10, 0,
1049 0, 0, 3, 0, 0, 0,
1050 0, 0, 0, 0, 0, 0,
1051 0, 0, 0, 0, 0, 0,
1052 0, 0, 0, 0, 0, 0,
1053 0, 0, 0, 0, 0, 0,
1054 0, 0, 0, 0, 0, 0,
1055 0, 0, 0, 0, 0, 0,
1056 0, 0, 0, 0, 0, 0,
1057 0, 0, 0, 0, 0, 0,
1058 0, 0, 0, 0, 0, 0,
1059 0, 0, 0, 0, 0, 0
1060};
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Advanced.hlsl b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Advanced.hlsl
new file mode 100644
index 0000000..aad7b77
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Advanced.hlsl
@@ -0,0 +1,7 @@
1
2#include "D3D11_PixelShader_Common.hlsli"
3
4float4 main(PixelShaderInput input) : SV_TARGET
5{
6 return AdvancedPixelShader(input);
7}
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Colors.h b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Colors.h
new file mode 100644
index 0000000..6658e4d
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Colors.h
@@ -0,0 +1,284 @@
1#if 0
2//
3// Generated by Microsoft (R) HLSL Shader Compiler 10.1
4//
5//
6// Buffer Definitions:
7//
8// cbuffer Constants
9// {
10//
11// float scRGB_output; // Offset: 0 Size: 4 [unused]
12// float texture_type; // Offset: 4 Size: 4 [unused]
13// float input_type; // Offset: 8 Size: 4 [unused]
14// float color_scale; // Offset: 12 Size: 4
15// float tonemap_method; // Offset: 16 Size: 4 [unused]
16// float tonemap_factor1; // Offset: 20 Size: 4 [unused]
17// float tonemap_factor2; // Offset: 24 Size: 4 [unused]
18// float sdr_white_point; // Offset: 28 Size: 4 [unused]
19// float4 Yoffset; // Offset: 32 Size: 16 [unused]
20// float4 Rcoeff; // Offset: 48 Size: 16 [unused]
21// float4 Gcoeff; // Offset: 64 Size: 16 [unused]
22// float4 Bcoeff; // Offset: 80 Size: 16 [unused]
23//
24// }
25//
26//
27// Resource Bindings:
28//
29// Name Type Format Dim HLSL Bind Count
30// ------------------------------ ---------- ------- ----------- -------------- ------
31// Constants cbuffer NA NA cb0 1
32//
33//
34//
35// Input signature:
36//
37// Name Index Mask Register SysValue Format Used
38// -------------------- ----- ------ -------- -------- ------- ------
39// SV_POSITION 0 xyzw 0 POS float
40// TEXCOORD 0 xy 1 NONE float
41// COLOR 0 xyzw 2 NONE float xyzw
42//
43//
44// Output signature:
45//
46// Name Index Mask Register SysValue Format Used
47// -------------------- ----- ------ -------- -------- ------- ------
48// SV_TARGET 0 xyzw 0 TARGET float xyzw
49//
50//
51// Constant buffer to DX9 shader constant mappings:
52//
53// Target Reg Buffer Start Reg # of Regs Data Conversion
54// ---------- ------- --------- --------- ----------------------
55// c0 cb0 0 1 ( FLT, FLT, FLT, FLT)
56//
57//
58// Level9 shader bytecode:
59//
60 ps_2_0
61 dcl t1
62 mul r0.xyz, t1, c0.w
63 mov r0.w, t1.w
64 mov oC0, r0
65
66// approximately 3 instruction slots used
67ps_4_0
68dcl_constantbuffer CB0[1], immediateIndexed
69dcl_input_ps linear v2.xyzw
70dcl_output o0.xyzw
71dcl_temps 1
72mov r0.x, cb0[0].w
73mov r0.w, l(1.000000)
74mul o0.xyzw, r0.xxxw, v2.xyzw
75ret
76// Approximately 4 instruction slots used
77#endif
78
79const BYTE g_main[] =
80{
81 68, 88, 66, 67, 78, 223,
82 23, 23, 93, 184, 255, 26,
83 153, 0, 220, 179, 25, 194,
84 30, 249, 1, 0, 0, 0,
85 192, 4, 0, 0, 6, 0,
86 0, 0, 56, 0, 0, 0,
87 172, 0, 0, 0, 56, 1,
88 0, 0, 180, 1, 0, 0,
89 24, 4, 0, 0, 140, 4,
90 0, 0, 65, 111, 110, 57,
91 108, 0, 0, 0, 108, 0,
92 0, 0, 0, 2, 255, 255,
93 60, 0, 0, 0, 48, 0,
94 0, 0, 1, 0, 36, 0,
95 0, 0, 48, 0, 0, 0,
96 48, 0, 0, 0, 36, 0,
97 0, 0, 48, 0, 0, 0,
98 0, 0, 1, 0, 0, 0,
99 0, 0, 0, 0, 0, 2,
100 255, 255, 31, 0, 0, 2,
101 0, 0, 0, 128, 1, 0,
102 15, 176, 5, 0, 0, 3,
103 0, 0, 7, 128, 1, 0,
104 228, 176, 0, 0, 255, 160,
105 1, 0, 0, 2, 0, 0,
106 8, 128, 1, 0, 255, 176,
107 1, 0, 0, 2, 0, 8,
108 15, 128, 0, 0, 228, 128,
109 255, 255, 0, 0, 83, 72,
110 68, 82, 132, 0, 0, 0,
111 64, 0, 0, 0, 33, 0,
112 0, 0, 89, 0, 0, 4,
113 70, 142, 32, 0, 0, 0,
114 0, 0, 1, 0, 0, 0,
115 98, 16, 0, 3, 242, 16,
116 16, 0, 2, 0, 0, 0,
117 101, 0, 0, 3, 242, 32,
118 16, 0, 0, 0, 0, 0,
119 104, 0, 0, 2, 1, 0,
120 0, 0, 54, 0, 0, 6,
121 18, 0, 16, 0, 0, 0,
122 0, 0, 58, 128, 32, 0,
123 0, 0, 0, 0, 0, 0,
124 0, 0, 54, 0, 0, 5,
125 130, 0, 16, 0, 0, 0,
126 0, 0, 1, 64, 0, 0,
127 0, 0, 128, 63, 56, 0,
128 0, 7, 242, 32, 16, 0,
129 0, 0, 0, 0, 6, 12,
130 16, 0, 0, 0, 0, 0,
131 70, 30, 16, 0, 2, 0,
132 0, 0, 62, 0, 0, 1,
133 83, 84, 65, 84, 116, 0,
134 0, 0, 4, 0, 0, 0,
135 1, 0, 0, 0, 0, 0,
136 0, 0, 2, 0, 0, 0,
137 1, 0, 0, 0, 0, 0,
138 0, 0, 0, 0, 0, 0,
139 1, 0, 0, 0, 0, 0,
140 0, 0, 0, 0, 0, 0,
141 0, 0, 0, 0, 0, 0,
142 0, 0, 0, 0, 0, 0,
143 0, 0, 0, 0, 0, 0,
144 0, 0, 0, 0, 0, 0,
145 0, 0, 0, 0, 0, 0,
146 0, 0, 0, 0, 0, 0,
147 2, 0, 0, 0, 0, 0,
148 0, 0, 0, 0, 0, 0,
149 0, 0, 0, 0, 0, 0,
150 0, 0, 0, 0, 0, 0,
151 0, 0, 0, 0, 0, 0,
152 0, 0, 0, 0, 0, 0,
153 0, 0, 0, 0, 82, 68,
154 69, 70, 92, 2, 0, 0,
155 1, 0, 0, 0, 72, 0,
156 0, 0, 1, 0, 0, 0,
157 28, 0, 0, 0, 0, 4,
158 255, 255, 0, 1, 0, 0,
159 49, 2, 0, 0, 60, 0,
160 0, 0, 0, 0, 0, 0,
161 0, 0, 0, 0, 0, 0,
162 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 1, 0,
164 0, 0, 1, 0, 0, 0,
165 67, 111, 110, 115, 116, 97,
166 110, 116, 115, 0, 171, 171,
167 60, 0, 0, 0, 12, 0,
168 0, 0, 96, 0, 0, 0,
169 96, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0,
171 128, 1, 0, 0, 0, 0,
172 0, 0, 4, 0, 0, 0,
173 0, 0, 0, 0, 144, 1,
174 0, 0, 0, 0, 0, 0,
175 160, 1, 0, 0, 4, 0,
176 0, 0, 4, 0, 0, 0,
177 0, 0, 0, 0, 144, 1,
178 0, 0, 0, 0, 0, 0,
179 173, 1, 0, 0, 8, 0,
180 0, 0, 4, 0, 0, 0,
181 0, 0, 0, 0, 144, 1,
182 0, 0, 0, 0, 0, 0,
183 184, 1, 0, 0, 12, 0,
184 0, 0, 4, 0, 0, 0,
185 2, 0, 0, 0, 144, 1,
186 0, 0, 0, 0, 0, 0,
187 196, 1, 0, 0, 16, 0,
188 0, 0, 4, 0, 0, 0,
189 0, 0, 0, 0, 144, 1,
190 0, 0, 0, 0, 0, 0,
191 211, 1, 0, 0, 20, 0,
192 0, 0, 4, 0, 0, 0,
193 0, 0, 0, 0, 144, 1,
194 0, 0, 0, 0, 0, 0,
195 227, 1, 0, 0, 24, 0,
196 0, 0, 4, 0, 0, 0,
197 0, 0, 0, 0, 144, 1,
198 0, 0, 0, 0, 0, 0,
199 243, 1, 0, 0, 28, 0,
200 0, 0, 4, 0, 0, 0,
201 0, 0, 0, 0, 144, 1,
202 0, 0, 0, 0, 0, 0,
203 3, 2, 0, 0, 32, 0,
204 0, 0, 16, 0, 0, 0,
205 0, 0, 0, 0, 12, 2,
206 0, 0, 0, 0, 0, 0,
207 28, 2, 0, 0, 48, 0,
208 0, 0, 16, 0, 0, 0,
209 0, 0, 0, 0, 12, 2,
210 0, 0, 0, 0, 0, 0,
211 35, 2, 0, 0, 64, 0,
212 0, 0, 16, 0, 0, 0,
213 0, 0, 0, 0, 12, 2,
214 0, 0, 0, 0, 0, 0,
215 42, 2, 0, 0, 80, 0,
216 0, 0, 16, 0, 0, 0,
217 0, 0, 0, 0, 12, 2,
218 0, 0, 0, 0, 0, 0,
219 115, 99, 82, 71, 66, 95,
220 111, 117, 116, 112, 117, 116,
221 0, 171, 171, 171, 0, 0,
222 3, 0, 1, 0, 1, 0,
223 0, 0, 0, 0, 0, 0,
224 0, 0, 116, 101, 120, 116,
225 117, 114, 101, 95, 116, 121,
226 112, 101, 0, 105, 110, 112,
227 117, 116, 95, 116, 121, 112,
228 101, 0, 99, 111, 108, 111,
229 114, 95, 115, 99, 97, 108,
230 101, 0, 116, 111, 110, 101,
231 109, 97, 112, 95, 109, 101,
232 116, 104, 111, 100, 0, 116,
233 111, 110, 101, 109, 97, 112,
234 95, 102, 97, 99, 116, 111,
235 114, 49, 0, 116, 111, 110,
236 101, 109, 97, 112, 95, 102,
237 97, 99, 116, 111, 114, 50,
238 0, 115, 100, 114, 95, 119,
239 104, 105, 116, 101, 95, 112,
240 111, 105, 110, 116, 0, 89,
241 111, 102, 102, 115, 101, 116,
242 0, 171, 1, 0, 3, 0,
243 1, 0, 4, 0, 0, 0,
244 0, 0, 0, 0, 0, 0,
245 82, 99, 111, 101, 102, 102,
246 0, 71, 99, 111, 101, 102,
247 102, 0, 66, 99, 111, 101,
248 102, 102, 0, 77, 105, 99,
249 114, 111, 115, 111, 102, 116,
250 32, 40, 82, 41, 32, 72,
251 76, 83, 76, 32, 83, 104,
252 97, 100, 101, 114, 32, 67,
253 111, 109, 112, 105, 108, 101,
254 114, 32, 49, 48, 46, 49,
255 0, 171, 171, 171, 73, 83,
256 71, 78, 108, 0, 0, 0,
257 3, 0, 0, 0, 8, 0,
258 0, 0, 80, 0, 0, 0,
259 0, 0, 0, 0, 1, 0,
260 0, 0, 3, 0, 0, 0,
261 0, 0, 0, 0, 15, 0,
262 0, 0, 92, 0, 0, 0,
263 0, 0, 0, 0, 0, 0,
264 0, 0, 3, 0, 0, 0,
265 1, 0, 0, 0, 3, 0,
266 0, 0, 101, 0, 0, 0,
267 0, 0, 0, 0, 0, 0,
268 0, 0, 3, 0, 0, 0,
269 2, 0, 0, 0, 15, 15,
270 0, 0, 83, 86, 95, 80,
271 79, 83, 73, 84, 73, 79,
272 78, 0, 84, 69, 88, 67,
273 79, 79, 82, 68, 0, 67,
274 79, 76, 79, 82, 0, 171,
275 79, 83, 71, 78, 44, 0,
276 0, 0, 1, 0, 0, 0,
277 8, 0, 0, 0, 32, 0,
278 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 3, 0,
280 0, 0, 0, 0, 0, 0,
281 15, 0, 0, 0, 83, 86,
282 95, 84, 65, 82, 71, 69,
283 84, 0, 171, 171
284};
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Colors.hlsl b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Colors.hlsl
new file mode 100644
index 0000000..5757491
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Colors.hlsl
@@ -0,0 +1,7 @@
1
2#include "D3D11_PixelShader_Common.hlsli"
3
4float4 main(PixelShaderInput input) : SV_TARGET
5{
6 return GetOutputColor(1.0) * input.color;
7}
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Common.hlsli b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Common.hlsli
new file mode 100644
index 0000000..b940c0c
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Common.hlsli
@@ -0,0 +1,235 @@
1
2Texture2D texture0 : register(t0);
3Texture2D texture1 : register(t1);
4Texture2D texture2 : register(t2);
5SamplerState sampler0 : register(s0);
6
7struct PixelShaderInput
8{
9 float4 pos : SV_POSITION;
10 float2 tex : TEXCOORD0;
11 float4 color : COLOR0;
12};
13
14// These should mirror the definitions in SDL_render_d3d11.c
15static const float TONEMAP_NONE = 0;
16static const float TONEMAP_LINEAR = 1;
17static const float TONEMAP_CHROME = 2;
18
19static const float TEXTURETYPE_NONE = 0;
20static const float TEXTURETYPE_RGB = 1;
21static const float TEXTURETYPE_NV12 = 2;
22static const float TEXTURETYPE_NV21 = 3;
23static const float TEXTURETYPE_YUV = 4;
24
25static const float INPUTTYPE_UNSPECIFIED = 0;
26static const float INPUTTYPE_SRGB = 1;
27static const float INPUTTYPE_SCRGB = 2;
28static const float INPUTTYPE_HDR10 = 3;
29
30cbuffer Constants : register(b0)
31{
32 float scRGB_output;
33 float texture_type;
34 float input_type;
35 float color_scale;
36
37 float tonemap_method;
38 float tonemap_factor1;
39 float tonemap_factor2;
40 float sdr_white_point;
41
42 float4 Yoffset;
43 float4 Rcoeff;
44 float4 Gcoeff;
45 float4 Bcoeff;
46};
47
48static const float3x3 mat709to2020 = {
49 { 0.627404, 0.329283, 0.043313 },
50 { 0.069097, 0.919541, 0.011362 },
51 { 0.016391, 0.088013, 0.895595 }
52};
53
54static const float3x3 mat2020to709 = {
55 { 1.660496, -0.587656, -0.072840 },
56 { -0.124547, 1.132895, -0.008348 },
57 { -0.018154, -0.100597, 1.118751 }
58};
59
60float sRGBtoLinear(float v)
61{
62 if (v <= 0.04045) {
63 v = (v / 12.92);
64 } else {
65 v = pow(abs(v + 0.055) / 1.055, 2.4);
66 }
67 return v;
68}
69
70float sRGBfromLinear(float v)
71{
72 if (v <= 0.0031308) {
73 v = (v * 12.92);
74 } else {
75 v = (pow(abs(v), 1.0 / 2.4) * 1.055 - 0.055);
76 }
77 return v;
78}
79
80float3 PQtoLinear(float3 v)
81{
82 const float c1 = 0.8359375;
83 const float c2 = 18.8515625;
84 const float c3 = 18.6875;
85 const float oo_m1 = 1.0 / 0.1593017578125;
86 const float oo_m2 = 1.0 / 78.84375;
87
88 float3 num = max(pow(abs(v), oo_m2) - c1, 0.0);
89 float3 den = c2 - c3 * pow(abs(v), oo_m2);
90 return (10000.0 * pow(abs(num / den), oo_m1) / sdr_white_point);
91}
92
93float3 ApplyTonemap(float3 v)
94{
95 if (tonemap_method == TONEMAP_LINEAR) {
96 v *= tonemap_factor1;
97 } else if (tonemap_method == TONEMAP_CHROME) {
98 if (input_type == INPUTTYPE_SCRGB) {
99 // Convert to BT.2020 colorspace for tone mapping
100 v = mul(mat709to2020, v);
101 }
102
103 float vmax = max(v.r, max(v.g, v.b));
104 if (vmax > 0.0) {
105 float scale = (1.0 + tonemap_factor1 * vmax) / (1.0 + tonemap_factor2 * vmax);
106 v *= scale;
107 }
108
109 if (input_type == INPUTTYPE_SCRGB) {
110 // Convert to BT.709 colorspace after tone mapping
111 v = mul(mat2020to709, v);
112 }
113 }
114 return v;
115}
116
117float4 GetInputColor(PixelShaderInput input)
118{
119 float4 rgba;
120
121 if (texture_type == TEXTURETYPE_NONE) {
122 rgba = 1.0;
123 } else if (texture_type == TEXTURETYPE_RGB) {
124 rgba = texture0.Sample(sampler0, input.tex);
125 } else if (texture_type == TEXTURETYPE_NV12) {
126 float3 yuv;
127 yuv.x = texture0.Sample(sampler0, input.tex).r;
128 yuv.yz = texture1.Sample(sampler0, input.tex).rg;
129
130 yuv += Yoffset.xyz;
131 rgba.r = dot(yuv, Rcoeff.xyz);
132 rgba.g = dot(yuv, Gcoeff.xyz);
133 rgba.b = dot(yuv, Bcoeff.xyz);
134 rgba.a = 1.0;
135 } else if (texture_type == TEXTURETYPE_NV21) {
136 float3 yuv;
137 yuv.x = texture0.Sample(sampler0, input.tex).r;
138 yuv.yz = texture1.Sample(sampler0, input.tex).gr;
139
140 yuv += Yoffset.xyz;
141 rgba.r = dot(yuv, Rcoeff.xyz);
142 rgba.g = dot(yuv, Gcoeff.xyz);
143 rgba.b = dot(yuv, Bcoeff.xyz);
144 rgba.a = 1.0;
145 } else if (texture_type == TEXTURETYPE_YUV) {
146 float3 yuv;
147 yuv.x = texture0.Sample(sampler0, input.tex).r;
148 yuv.y = texture1.Sample(sampler0, input.tex).r;
149 yuv.z = texture2.Sample(sampler0, input.tex).r;
150
151 yuv += Yoffset.xyz;
152 rgba.r = dot(yuv, Rcoeff.xyz);
153 rgba.g = dot(yuv, Gcoeff.xyz);
154 rgba.b = dot(yuv, Bcoeff.xyz);
155 rgba.a = 1.0;
156 } else {
157 // Error!
158 rgba.r = 1.0;
159 rgba.g = 0.0;
160 rgba.b = 0.0;
161 rgba.a = 1.0;
162 }
163 return rgba;
164}
165
166float4 GetOutputColor(float4 rgba)
167{
168 float4 output;
169
170 output.rgb = rgba.rgb * color_scale;
171 output.a = rgba.a;
172
173 return output;
174}
175
176float3 GetOutputColorFromSRGB(float3 rgb)
177{
178 float3 output;
179
180 if (scRGB_output) {
181 rgb.r = sRGBtoLinear(rgb.r);
182 rgb.g = sRGBtoLinear(rgb.g);
183 rgb.b = sRGBtoLinear(rgb.b);
184 }
185
186 output.rgb = rgb * color_scale;
187
188 return output;
189}
190
191float3 GetOutputColorFromLinear(float3 rgb)
192{
193 float3 output;
194
195 output.rgb = rgb * color_scale;
196
197 if (!scRGB_output) {
198 output.r = sRGBfromLinear(output.r);
199 output.g = sRGBfromLinear(output.g);
200 output.b = sRGBfromLinear(output.b);
201 output.rgb = saturate(output.rgb);
202 }
203
204 return output;
205}
206
207float4 AdvancedPixelShader(PixelShaderInput input)
208{
209 float4 rgba = GetInputColor(input);
210 float4 output;
211
212 if (input_type == INPUTTYPE_HDR10) {
213 rgba.rgb = PQtoLinear(rgba.rgb);
214 }
215
216 if (tonemap_method != TONEMAP_NONE) {
217 rgba.rgb = ApplyTonemap(rgba.rgb);
218 }
219
220 if (input_type == INPUTTYPE_SRGB) {
221 output.rgb = GetOutputColorFromSRGB(rgba.rgb);
222 output.a = rgba.a;
223 } else if (input_type == INPUTTYPE_SCRGB) {
224 output.rgb = GetOutputColorFromLinear(rgba.rgb);
225 output.a = rgba.a;
226 } else if (input_type == INPUTTYPE_HDR10) {
227 rgba.rgb = mul(mat2020to709, rgba.rgb);
228 output.rgb = GetOutputColorFromLinear(rgba.rgb);
229 output.a = rgba.a;
230 } else {
231 output = GetOutputColor(rgba);
232 }
233
234 return output * input.color;
235}
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Textures.h b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Textures.h
new file mode 100644
index 0000000..996cac6
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Textures.h
@@ -0,0 +1,332 @@
1#if 0
2//
3// Generated by Microsoft (R) HLSL Shader Compiler 10.1
4//
5//
6// Buffer Definitions:
7//
8// cbuffer Constants
9// {
10//
11// float scRGB_output; // Offset: 0 Size: 4 [unused]
12// float texture_type; // Offset: 4 Size: 4 [unused]
13// float input_type; // Offset: 8 Size: 4 [unused]
14// float color_scale; // Offset: 12 Size: 4
15// float tonemap_method; // Offset: 16 Size: 4 [unused]
16// float tonemap_factor1; // Offset: 20 Size: 4 [unused]
17// float tonemap_factor2; // Offset: 24 Size: 4 [unused]
18// float sdr_white_point; // Offset: 28 Size: 4 [unused]
19// float4 Yoffset; // Offset: 32 Size: 16 [unused]
20// float4 Rcoeff; // Offset: 48 Size: 16 [unused]
21// float4 Gcoeff; // Offset: 64 Size: 16 [unused]
22// float4 Bcoeff; // Offset: 80 Size: 16 [unused]
23//
24// }
25//
26//
27// Resource Bindings:
28//
29// Name Type Format Dim HLSL Bind Count
30// ------------------------------ ---------- ------- ----------- -------------- ------
31// theSampler sampler NA NA s0 1
32// theTexture texture float4 2d t0 1
33// Constants cbuffer NA NA cb0 1
34//
35//
36//
37// Input signature:
38//
39// Name Index Mask Register SysValue Format Used
40// -------------------- ----- ------ -------- -------- ------- ------
41// SV_POSITION 0 xyzw 0 POS float
42// TEXCOORD 0 xy 1 NONE float xy
43// COLOR 0 xyzw 2 NONE float xyzw
44//
45//
46// Output signature:
47//
48// Name Index Mask Register SysValue Format Used
49// -------------------- ----- ------ -------- -------- ------- ------
50// SV_TARGET 0 xyzw 0 TARGET float xyzw
51//
52//
53// Constant buffer to DX9 shader constant mappings:
54//
55// Target Reg Buffer Start Reg # of Regs Data Conversion
56// ---------- ------- --------- --------- ----------------------
57// c0 cb0 0 1 ( FLT, FLT, FLT, FLT)
58//
59//
60// Sampler/Resource to DX9 shader sampler mappings:
61//
62// Target Sampler Source Sampler Source Resource
63// -------------- --------------- ----------------
64// s0 s0 t0
65//
66//
67// Level9 shader bytecode:
68//
69 ps_2_0
70 dcl t0.xy
71 dcl t1
72 dcl_2d s0
73 texld r0, t0, s0
74 mul r0.xyz, r0, c0.w
75 mul r0, r0, t1
76 mov oC0, r0
77
78// approximately 4 instruction slots used (1 texture, 3 arithmetic)
79ps_4_0
80dcl_constantbuffer CB0[1], immediateIndexed
81dcl_sampler s0, mode_default
82dcl_resource_texture2d (float,float,float,float) t0
83dcl_input_ps linear v1.xy
84dcl_input_ps linear v2.xyzw
85dcl_output o0.xyzw
86dcl_temps 1
87sample r0.xyzw, v1.xyxx, t0.xyzw, s0
88mul r0.xyz, r0.xyzx, cb0[0].wwww
89mul o0.xyzw, r0.xyzw, v2.xyzw
90ret
91// Approximately 4 instruction slots used
92#endif
93
94const BYTE g_main[] =
95{
96 68, 88, 66, 67, 8, 152,
97 224, 210, 182, 254, 37, 89,
98 68, 213, 13, 174, 95, 42,
99 2, 11, 1, 0, 0, 0,
100 132, 5, 0, 0, 6, 0,
101 0, 0, 56, 0, 0, 0,
102 220, 0, 0, 0, 168, 1,
103 0, 0, 36, 2, 0, 0,
104 220, 4, 0, 0, 80, 5,
105 0, 0, 65, 111, 110, 57,
106 156, 0, 0, 0, 156, 0,
107 0, 0, 0, 2, 255, 255,
108 104, 0, 0, 0, 52, 0,
109 0, 0, 1, 0, 40, 0,
110 0, 0, 52, 0, 0, 0,
111 52, 0, 1, 0, 36, 0,
112 0, 0, 52, 0, 0, 0,
113 0, 0, 0, 0, 0, 0,
114 1, 0, 0, 0, 0, 0,
115 0, 0, 0, 2, 255, 255,
116 31, 0, 0, 2, 0, 0,
117 0, 128, 0, 0, 3, 176,
118 31, 0, 0, 2, 0, 0,
119 0, 128, 1, 0, 15, 176,
120 31, 0, 0, 2, 0, 0,
121 0, 144, 0, 8, 15, 160,
122 66, 0, 0, 3, 0, 0,
123 15, 128, 0, 0, 228, 176,
124 0, 8, 228, 160, 5, 0,
125 0, 3, 0, 0, 7, 128,
126 0, 0, 228, 128, 0, 0,
127 255, 160, 5, 0, 0, 3,
128 0, 0, 15, 128, 0, 0,
129 228, 128, 1, 0, 228, 176,
130 1, 0, 0, 2, 0, 8,
131 15, 128, 0, 0, 228, 128,
132 255, 255, 0, 0, 83, 72,
133 68, 82, 196, 0, 0, 0,
134 64, 0, 0, 0, 49, 0,
135 0, 0, 89, 0, 0, 4,
136 70, 142, 32, 0, 0, 0,
137 0, 0, 1, 0, 0, 0,
138 90, 0, 0, 3, 0, 96,
139 16, 0, 0, 0, 0, 0,
140 88, 24, 0, 4, 0, 112,
141 16, 0, 0, 0, 0, 0,
142 85, 85, 0, 0, 98, 16,
143 0, 3, 50, 16, 16, 0,
144 1, 0, 0, 0, 98, 16,
145 0, 3, 242, 16, 16, 0,
146 2, 0, 0, 0, 101, 0,
147 0, 3, 242, 32, 16, 0,
148 0, 0, 0, 0, 104, 0,
149 0, 2, 1, 0, 0, 0,
150 69, 0, 0, 9, 242, 0,
151 16, 0, 0, 0, 0, 0,
152 70, 16, 16, 0, 1, 0,
153 0, 0, 70, 126, 16, 0,
154 0, 0, 0, 0, 0, 96,
155 16, 0, 0, 0, 0, 0,
156 56, 0, 0, 8, 114, 0,
157 16, 0, 0, 0, 0, 0,
158 70, 2, 16, 0, 0, 0,
159 0, 0, 246, 143, 32, 0,
160 0, 0, 0, 0, 0, 0,
161 0, 0, 56, 0, 0, 7,
162 242, 32, 16, 0, 0, 0,
163 0, 0, 70, 14, 16, 0,
164 0, 0, 0, 0, 70, 30,
165 16, 0, 2, 0, 0, 0,
166 62, 0, 0, 1, 83, 84,
167 65, 84, 116, 0, 0, 0,
168 4, 0, 0, 0, 1, 0,
169 0, 0, 0, 0, 0, 0,
170 3, 0, 0, 0, 2, 0,
171 0, 0, 0, 0, 0, 0,
172 0, 0, 0, 0, 1, 0,
173 0, 0, 0, 0, 0, 0,
174 0, 0, 0, 0, 0, 0,
175 0, 0, 0, 0, 0, 0,
176 0, 0, 0, 0, 0, 0,
177 0, 0, 1, 0, 0, 0,
178 0, 0, 0, 0, 0, 0,
179 0, 0, 0, 0, 0, 0,
180 0, 0, 0, 0, 0, 0,
181 0, 0, 0, 0, 0, 0,
182 0, 0, 0, 0, 0, 0,
183 0, 0, 0, 0, 0, 0,
184 0, 0, 0, 0, 0, 0,
185 0, 0, 0, 0, 0, 0,
186 0, 0, 0, 0, 0, 0,
187 0, 0, 82, 68, 69, 70,
188 176, 2, 0, 0, 1, 0,
189 0, 0, 156, 0, 0, 0,
190 3, 0, 0, 0, 28, 0,
191 0, 0, 0, 4, 255, 255,
192 0, 1, 0, 0, 133, 2,
193 0, 0, 124, 0, 0, 0,
194 3, 0, 0, 0, 0, 0,
195 0, 0, 0, 0, 0, 0,
196 0, 0, 0, 0, 0, 0,
197 0, 0, 1, 0, 0, 0,
198 1, 0, 0, 0, 135, 0,
199 0, 0, 2, 0, 0, 0,
200 5, 0, 0, 0, 4, 0,
201 0, 0, 255, 255, 255, 255,
202 0, 0, 0, 0, 1, 0,
203 0, 0, 13, 0, 0, 0,
204 146, 0, 0, 0, 0, 0,
205 0, 0, 0, 0, 0, 0,
206 0, 0, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0,
208 1, 0, 0, 0, 1, 0,
209 0, 0, 116, 104, 101, 83,
210 97, 109, 112, 108, 101, 114,
211 0, 116, 104, 101, 84, 101,
212 120, 116, 117, 114, 101, 0,
213 67, 111, 110, 115, 116, 97,
214 110, 116, 115, 0, 146, 0,
215 0, 0, 12, 0, 0, 0,
216 180, 0, 0, 0, 96, 0,
217 0, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 212, 1,
219 0, 0, 0, 0, 0, 0,
220 4, 0, 0, 0, 0, 0,
221 0, 0, 228, 1, 0, 0,
222 0, 0, 0, 0, 244, 1,
223 0, 0, 4, 0, 0, 0,
224 4, 0, 0, 0, 0, 0,
225 0, 0, 228, 1, 0, 0,
226 0, 0, 0, 0, 1, 2,
227 0, 0, 8, 0, 0, 0,
228 4, 0, 0, 0, 0, 0,
229 0, 0, 228, 1, 0, 0,
230 0, 0, 0, 0, 12, 2,
231 0, 0, 12, 0, 0, 0,
232 4, 0, 0, 0, 2, 0,
233 0, 0, 228, 1, 0, 0,
234 0, 0, 0, 0, 24, 2,
235 0, 0, 16, 0, 0, 0,
236 4, 0, 0, 0, 0, 0,
237 0, 0, 228, 1, 0, 0,
238 0, 0, 0, 0, 39, 2,
239 0, 0, 20, 0, 0, 0,
240 4, 0, 0, 0, 0, 0,
241 0, 0, 228, 1, 0, 0,
242 0, 0, 0, 0, 55, 2,
243 0, 0, 24, 0, 0, 0,
244 4, 0, 0, 0, 0, 0,
245 0, 0, 228, 1, 0, 0,
246 0, 0, 0, 0, 71, 2,
247 0, 0, 28, 0, 0, 0,
248 4, 0, 0, 0, 0, 0,
249 0, 0, 228, 1, 0, 0,
250 0, 0, 0, 0, 87, 2,
251 0, 0, 32, 0, 0, 0,
252 16, 0, 0, 0, 0, 0,
253 0, 0, 96, 2, 0, 0,
254 0, 0, 0, 0, 112, 2,
255 0, 0, 48, 0, 0, 0,
256 16, 0, 0, 0, 0, 0,
257 0, 0, 96, 2, 0, 0,
258 0, 0, 0, 0, 119, 2,
259 0, 0, 64, 0, 0, 0,
260 16, 0, 0, 0, 0, 0,
261 0, 0, 96, 2, 0, 0,
262 0, 0, 0, 0, 126, 2,
263 0, 0, 80, 0, 0, 0,
264 16, 0, 0, 0, 0, 0,
265 0, 0, 96, 2, 0, 0,
266 0, 0, 0, 0, 115, 99,
267 82, 71, 66, 95, 111, 117,
268 116, 112, 117, 116, 0, 171,
269 171, 171, 0, 0, 3, 0,
270 1, 0, 1, 0, 0, 0,
271 0, 0, 0, 0, 0, 0,
272 116, 101, 120, 116, 117, 114,
273 101, 95, 116, 121, 112, 101,
274 0, 105, 110, 112, 117, 116,
275 95, 116, 121, 112, 101, 0,
276 99, 111, 108, 111, 114, 95,
277 115, 99, 97, 108, 101, 0,
278 116, 111, 110, 101, 109, 97,
279 112, 95, 109, 101, 116, 104,
280 111, 100, 0, 116, 111, 110,
281 101, 109, 97, 112, 95, 102,
282 97, 99, 116, 111, 114, 49,
283 0, 116, 111, 110, 101, 109,
284 97, 112, 95, 102, 97, 99,
285 116, 111, 114, 50, 0, 115,
286 100, 114, 95, 119, 104, 105,
287 116, 101, 95, 112, 111, 105,
288 110, 116, 0, 89, 111, 102,
289 102, 115, 101, 116, 0, 171,
290 1, 0, 3, 0, 1, 0,
291 4, 0, 0, 0, 0, 0,
292 0, 0, 0, 0, 82, 99,
293 111, 101, 102, 102, 0, 71,
294 99, 111, 101, 102, 102, 0,
295 66, 99, 111, 101, 102, 102,
296 0, 77, 105, 99, 114, 111,
297 115, 111, 102, 116, 32, 40,
298 82, 41, 32, 72, 76, 83,
299 76, 32, 83, 104, 97, 100,
300 101, 114, 32, 67, 111, 109,
301 112, 105, 108, 101, 114, 32,
302 49, 48, 46, 49, 0, 171,
303 171, 171, 73, 83, 71, 78,
304 108, 0, 0, 0, 3, 0,
305 0, 0, 8, 0, 0, 0,
306 80, 0, 0, 0, 0, 0,
307 0, 0, 1, 0, 0, 0,
308 3, 0, 0, 0, 0, 0,
309 0, 0, 15, 0, 0, 0,
310 92, 0, 0, 0, 0, 0,
311 0, 0, 0, 0, 0, 0,
312 3, 0, 0, 0, 1, 0,
313 0, 0, 3, 3, 0, 0,
314 101, 0, 0, 0, 0, 0,
315 0, 0, 0, 0, 0, 0,
316 3, 0, 0, 0, 2, 0,
317 0, 0, 15, 15, 0, 0,
318 83, 86, 95, 80, 79, 83,
319 73, 84, 73, 79, 78, 0,
320 84, 69, 88, 67, 79, 79,
321 82, 68, 0, 67, 79, 76,
322 79, 82, 0, 171, 79, 83,
323 71, 78, 44, 0, 0, 0,
324 1, 0, 0, 0, 8, 0,
325 0, 0, 32, 0, 0, 0,
326 0, 0, 0, 0, 0, 0,
327 0, 0, 3, 0, 0, 0,
328 0, 0, 0, 0, 15, 0,
329 0, 0, 83, 86, 95, 84,
330 65, 82, 71, 69, 84, 0,
331 171, 171
332};
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Textures.hlsl b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Textures.hlsl
new file mode 100644
index 0000000..f2ecf18
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_PixelShader_Textures.hlsl
@@ -0,0 +1,9 @@
1Texture2D theTexture : register(t0);
2SamplerState theSampler : register(s0);
3
4#include "D3D11_PixelShader_Common.hlsli"
5
6float4 main(PixelShaderInput input) : SV_TARGET
7{
8 return GetOutputColor(theTexture.Sample(theSampler, input.tex)) * input.color;
9}
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_VertexShader.h b/SDL-3.2.8/src/render/direct3d11/D3D11_VertexShader.h
new file mode 100644
index 0000000..97beaa3
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_VertexShader.h
@@ -0,0 +1,339 @@
1#if 0
2//
3// Generated by Microsoft (R) HLSL Shader Compiler 10.1
4//
5//
6// Buffer Definitions:
7//
8// cbuffer VertexShaderConstants
9// {
10//
11// row_major float4x4 model; // Offset: 0 Size: 64
12// row_major float4x4 projectionAndView;// Offset: 64 Size: 64
13//
14// }
15//
16//
17// Resource Bindings:
18//
19// Name Type Format Dim HLSL Bind Count
20// ------------------------------ ---------- ------- ----------- -------------- ------
21// VertexShaderConstants cbuffer NA NA cb0 1
22//
23//
24//
25// Input signature:
26//
27// Name Index Mask Register SysValue Format Used
28// -------------------- ----- ------ -------- -------- ------- ------
29// POSITION 0 xyz 0 NONE float xyz
30// TEXCOORD 0 xy 1 NONE float xy
31// COLOR 0 xyzw 2 NONE float xyzw
32//
33//
34// Output signature:
35//
36// Name Index Mask Register SysValue Format Used
37// -------------------- ----- ------ -------- -------- ------- ------
38// SV_POSITION 0 xyzw 0 POS float xyzw
39// TEXCOORD 0 xy 1 NONE float xy
40// COLOR 0 xyzw 2 NONE float xyzw
41//
42//
43// Constant buffer to DX9 shader constant mappings:
44//
45// Target Reg Buffer Start Reg # of Regs Data Conversion
46// ---------- ------- --------- --------- ----------------------
47// c1 cb0 0 8 ( FLT, FLT, FLT, FLT)
48//
49//
50// Runtime generated constant mappings:
51//
52// Target Reg Constant Description
53// ---------- --------------------------------------------------
54// c0 Vertex Shader position offset
55//
56//
57// Level9 shader bytecode:
58//
59 vs_2_0
60 dcl_texcoord v0
61 dcl_texcoord1 v1
62 dcl_texcoord2 v2
63 mul r0, v0.y, c2
64 mad r0, v0.x, c1, r0
65 mad r0, v0.z, c3, r0
66 add r0, r0, c4
67 mul r1, r0.y, c6
68 mad r1, r0.x, c5, r1
69 mad r1, r0.z, c7, r1
70 mad r0, r0.w, c8, r1
71 mad oPos.xy, r0.w, c0, r0
72 mov oPos.zw, r0
73 mov oT0.xy, v1
74 mov oT1, v2
75
76// approximately 12 instruction slots used
77vs_4_0
78dcl_constantbuffer CB0[8], immediateIndexed
79dcl_input v0.xyz
80dcl_input v1.xy
81dcl_input v2.xyzw
82dcl_output_siv o0.xyzw, position
83dcl_output o1.xy
84dcl_output o2.xyzw
85dcl_temps 2
86mul r0.xyzw, v0.yyyy, cb0[1].xyzw
87mad r0.xyzw, v0.xxxx, cb0[0].xyzw, r0.xyzw
88mad r0.xyzw, v0.zzzz, cb0[2].xyzw, r0.xyzw
89add r0.xyzw, r0.xyzw, cb0[3].xyzw
90mul r1.xyzw, r0.yyyy, cb0[5].xyzw
91mad r1.xyzw, r0.xxxx, cb0[4].xyzw, r1.xyzw
92mad r1.xyzw, r0.zzzz, cb0[6].xyzw, r1.xyzw
93mad o0.xyzw, r0.wwww, cb0[7].xyzw, r1.xyzw
94mov o1.xy, v1.xyxx
95mov o2.xyzw, v2.xyzw
96ret
97// Approximately 11 instruction slots used
98#endif
99
100const BYTE g_main[] =
101{
102 68, 88, 66, 67, 152, 172,
103 81, 45, 198, 200, 12, 38,
104 143, 4, 178, 228, 158, 175,
105 169, 64, 1, 0, 0, 0,
106 140, 5, 0, 0, 6, 0,
107 0, 0, 56, 0, 0, 0,
108 108, 1, 0, 0, 52, 3,
109 0, 0, 176, 3, 0, 0,
110 168, 4, 0, 0, 24, 5,
111 0, 0, 65, 111, 110, 57,
112 44, 1, 0, 0, 44, 1,
113 0, 0, 0, 2, 254, 255,
114 248, 0, 0, 0, 52, 0,
115 0, 0, 1, 0, 36, 0,
116 0, 0, 48, 0, 0, 0,
117 48, 0, 0, 0, 36, 0,
118 1, 0, 48, 0, 0, 0,
119 0, 0, 8, 0, 1, 0,
120 0, 0, 0, 0, 0, 0,
121 0, 0, 0, 2, 254, 255,
122 31, 0, 0, 2, 5, 0,
123 0, 128, 0, 0, 15, 144,
124 31, 0, 0, 2, 5, 0,
125 1, 128, 1, 0, 15, 144,
126 31, 0, 0, 2, 5, 0,
127 2, 128, 2, 0, 15, 144,
128 5, 0, 0, 3, 0, 0,
129 15, 128, 0, 0, 85, 144,
130 2, 0, 228, 160, 4, 0,
131 0, 4, 0, 0, 15, 128,
132 0, 0, 0, 144, 1, 0,
133 228, 160, 0, 0, 228, 128,
134 4, 0, 0, 4, 0, 0,
135 15, 128, 0, 0, 170, 144,
136 3, 0, 228, 160, 0, 0,
137 228, 128, 2, 0, 0, 3,
138 0, 0, 15, 128, 0, 0,
139 228, 128, 4, 0, 228, 160,
140 5, 0, 0, 3, 1, 0,
141 15, 128, 0, 0, 85, 128,
142 6, 0, 228, 160, 4, 0,
143 0, 4, 1, 0, 15, 128,
144 0, 0, 0, 128, 5, 0,
145 228, 160, 1, 0, 228, 128,
146 4, 0, 0, 4, 1, 0,
147 15, 128, 0, 0, 170, 128,
148 7, 0, 228, 160, 1, 0,
149 228, 128, 4, 0, 0, 4,
150 0, 0, 15, 128, 0, 0,
151 255, 128, 8, 0, 228, 160,
152 1, 0, 228, 128, 4, 0,
153 0, 4, 0, 0, 3, 192,
154 0, 0, 255, 128, 0, 0,
155 228, 160, 0, 0, 228, 128,
156 1, 0, 0, 2, 0, 0,
157 12, 192, 0, 0, 228, 128,
158 1, 0, 0, 2, 0, 0,
159 3, 224, 1, 0, 228, 144,
160 1, 0, 0, 2, 1, 0,
161 15, 224, 2, 0, 228, 144,
162 255, 255, 0, 0, 83, 72,
163 68, 82, 192, 1, 0, 0,
164 64, 0, 1, 0, 112, 0,
165 0, 0, 89, 0, 0, 4,
166 70, 142, 32, 0, 0, 0,
167 0, 0, 8, 0, 0, 0,
168 95, 0, 0, 3, 114, 16,
169 16, 0, 0, 0, 0, 0,
170 95, 0, 0, 3, 50, 16,
171 16, 0, 1, 0, 0, 0,
172 95, 0, 0, 3, 242, 16,
173 16, 0, 2, 0, 0, 0,
174 103, 0, 0, 4, 242, 32,
175 16, 0, 0, 0, 0, 0,
176 1, 0, 0, 0, 101, 0,
177 0, 3, 50, 32, 16, 0,
178 1, 0, 0, 0, 101, 0,
179 0, 3, 242, 32, 16, 0,
180 2, 0, 0, 0, 104, 0,
181 0, 2, 2, 0, 0, 0,
182 56, 0, 0, 8, 242, 0,
183 16, 0, 0, 0, 0, 0,
184 86, 21, 16, 0, 0, 0,
185 0, 0, 70, 142, 32, 0,
186 0, 0, 0, 0, 1, 0,
187 0, 0, 50, 0, 0, 10,
188 242, 0, 16, 0, 0, 0,
189 0, 0, 6, 16, 16, 0,
190 0, 0, 0, 0, 70, 142,
191 32, 0, 0, 0, 0, 0,
192 0, 0, 0, 0, 70, 14,
193 16, 0, 0, 0, 0, 0,
194 50, 0, 0, 10, 242, 0,
195 16, 0, 0, 0, 0, 0,
196 166, 26, 16, 0, 0, 0,
197 0, 0, 70, 142, 32, 0,
198 0, 0, 0, 0, 2, 0,
199 0, 0, 70, 14, 16, 0,
200 0, 0, 0, 0, 0, 0,
201 0, 8, 242, 0, 16, 0,
202 0, 0, 0, 0, 70, 14,
203 16, 0, 0, 0, 0, 0,
204 70, 142, 32, 0, 0, 0,
205 0, 0, 3, 0, 0, 0,
206 56, 0, 0, 8, 242, 0,
207 16, 0, 1, 0, 0, 0,
208 86, 5, 16, 0, 0, 0,
209 0, 0, 70, 142, 32, 0,
210 0, 0, 0, 0, 5, 0,
211 0, 0, 50, 0, 0, 10,
212 242, 0, 16, 0, 1, 0,
213 0, 0, 6, 0, 16, 0,
214 0, 0, 0, 0, 70, 142,
215 32, 0, 0, 0, 0, 0,
216 4, 0, 0, 0, 70, 14,
217 16, 0, 1, 0, 0, 0,
218 50, 0, 0, 10, 242, 0,
219 16, 0, 1, 0, 0, 0,
220 166, 10, 16, 0, 0, 0,
221 0, 0, 70, 142, 32, 0,
222 0, 0, 0, 0, 6, 0,
223 0, 0, 70, 14, 16, 0,
224 1, 0, 0, 0, 50, 0,
225 0, 10, 242, 32, 16, 0,
226 0, 0, 0, 0, 246, 15,
227 16, 0, 0, 0, 0, 0,
228 70, 142, 32, 0, 0, 0,
229 0, 0, 7, 0, 0, 0,
230 70, 14, 16, 0, 1, 0,
231 0, 0, 54, 0, 0, 5,
232 50, 32, 16, 0, 1, 0,
233 0, 0, 70, 16, 16, 0,
234 1, 0, 0, 0, 54, 0,
235 0, 5, 242, 32, 16, 0,
236 2, 0, 0, 0, 70, 30,
237 16, 0, 2, 0, 0, 0,
238 62, 0, 0, 1, 83, 84,
239 65, 84, 116, 0, 0, 0,
240 11, 0, 0, 0, 2, 0,
241 0, 0, 0, 0, 0, 0,
242 6, 0, 0, 0, 8, 0,
243 0, 0, 0, 0, 0, 0,
244 0, 0, 0, 0, 1, 0,
245 0, 0, 0, 0, 0, 0,
246 0, 0, 0, 0, 0, 0,
247 0, 0, 0, 0, 0, 0,
248 0, 0, 0, 0, 0, 0,
249 0, 0, 0, 0, 0, 0,
250 0, 0, 0, 0, 0, 0,
251 0, 0, 0, 0, 0, 0,
252 0, 0, 0, 0, 2, 0,
253 0, 0, 0, 0, 0, 0,
254 0, 0, 0, 0, 0, 0,
255 0, 0, 0, 0, 0, 0,
256 0, 0, 0, 0, 0, 0,
257 0, 0, 0, 0, 0, 0,
258 0, 0, 0, 0, 0, 0,
259 0, 0, 82, 68, 69, 70,
260 240, 0, 0, 0, 1, 0,
261 0, 0, 84, 0, 0, 0,
262 1, 0, 0, 0, 28, 0,
263 0, 0, 0, 4, 254, 255,
264 0, 1, 0, 0, 198, 0,
265 0, 0, 60, 0, 0, 0,
266 0, 0, 0, 0, 0, 0,
267 0, 0, 0, 0, 0, 0,
268 0, 0, 0, 0, 0, 0,
269 0, 0, 1, 0, 0, 0,
270 1, 0, 0, 0, 86, 101,
271 114, 116, 101, 120, 83, 104,
272 97, 100, 101, 114, 67, 111,
273 110, 115, 116, 97, 110, 116,
274 115, 0, 171, 171, 60, 0,
275 0, 0, 2, 0, 0, 0,
276 108, 0, 0, 0, 128, 0,
277 0, 0, 0, 0, 0, 0,
278 0, 0, 0, 0, 156, 0,
279 0, 0, 0, 0, 0, 0,
280 64, 0, 0, 0, 2, 0,
281 0, 0, 164, 0, 0, 0,
282 0, 0, 0, 0, 180, 0,
283 0, 0, 64, 0, 0, 0,
284 64, 0, 0, 0, 2, 0,
285 0, 0, 164, 0, 0, 0,
286 0, 0, 0, 0, 109, 111,
287 100, 101, 108, 0, 171, 171,
288 2, 0, 3, 0, 4, 0,
289 4, 0, 0, 0, 0, 0,
290 0, 0, 0, 0, 112, 114,
291 111, 106, 101, 99, 116, 105,
292 111, 110, 65, 110, 100, 86,
293 105, 101, 119, 0, 77, 105,
294 99, 114, 111, 115, 111, 102,
295 116, 32, 40, 82, 41, 32,
296 72, 76, 83, 76, 32, 83,
297 104, 97, 100, 101, 114, 32,
298 67, 111, 109, 112, 105, 108,
299 101, 114, 32, 49, 48, 46,
300 49, 0, 171, 171, 73, 83,
301 71, 78, 104, 0, 0, 0,
302 3, 0, 0, 0, 8, 0,
303 0, 0, 80, 0, 0, 0,
304 0, 0, 0, 0, 0, 0,
305 0, 0, 3, 0, 0, 0,
306 0, 0, 0, 0, 7, 7,
307 0, 0, 89, 0, 0, 0,
308 0, 0, 0, 0, 0, 0,
309 0, 0, 3, 0, 0, 0,
310 1, 0, 0, 0, 3, 3,
311 0, 0, 98, 0, 0, 0,
312 0, 0, 0, 0, 0, 0,
313 0, 0, 3, 0, 0, 0,
314 2, 0, 0, 0, 15, 15,
315 0, 0, 80, 79, 83, 73,
316 84, 73, 79, 78, 0, 84,
317 69, 88, 67, 79, 79, 82,
318 68, 0, 67, 79, 76, 79,
319 82, 0, 79, 83, 71, 78,
320 108, 0, 0, 0, 3, 0,
321 0, 0, 8, 0, 0, 0,
322 80, 0, 0, 0, 0, 0,
323 0, 0, 1, 0, 0, 0,
324 3, 0, 0, 0, 0, 0,
325 0, 0, 15, 0, 0, 0,
326 92, 0, 0, 0, 0, 0,
327 0, 0, 0, 0, 0, 0,
328 3, 0, 0, 0, 1, 0,
329 0, 0, 3, 12, 0, 0,
330 101, 0, 0, 0, 0, 0,
331 0, 0, 0, 0, 0, 0,
332 3, 0, 0, 0, 2, 0,
333 0, 0, 15, 0, 0, 0,
334 83, 86, 95, 80, 79, 83,
335 73, 84, 73, 79, 78, 0,
336 84, 69, 88, 67, 79, 79,
337 82, 68, 0, 67, 79, 76,
338 79, 82, 0, 171
339};
diff --git a/SDL-3.2.8/src/render/direct3d11/D3D11_VertexShader.hlsl b/SDL-3.2.8/src/render/direct3d11/D3D11_VertexShader.hlsl
new file mode 100644
index 0000000..63e5172
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/D3D11_VertexShader.hlsl
@@ -0,0 +1,38 @@
1#pragma pack_matrix( row_major )
2
3cbuffer VertexShaderConstants : register(b0)
4{
5 matrix model;
6 matrix projectionAndView;
7};
8
9struct VertexShaderInput
10{
11 float3 pos : POSITION;
12 float2 tex : TEXCOORD0;
13 float4 color : COLOR0;
14};
15
16struct VertexShaderOutput
17{
18 float4 pos : SV_POSITION;
19 float2 tex : TEXCOORD0;
20 float4 color : COLOR0;
21};
22
23VertexShaderOutput main(VertexShaderInput input)
24{
25 VertexShaderOutput output;
26 float4 pos = float4(input.pos, 1.0f);
27
28 // Transform the vertex position into projected space.
29 pos = mul(pos, model);
30 pos = mul(pos, projectionAndView);
31 output.pos = pos;
32
33 // Pass through texture coordinates and color values without transformation
34 output.tex = input.tex;
35 output.color = input.color;
36
37 return output;
38}
diff --git a/SDL-3.2.8/src/render/direct3d11/SDL_render_d3d11.c b/SDL-3.2.8/src/render/direct3d11/SDL_render_d3d11.c
new file mode 100644
index 0000000..dc1a722
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/SDL_render_d3d11.c
@@ -0,0 +1,2767 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_D3D11
24
25#define COBJMACROS
26#include "../../core/windows/SDL_windows.h"
27#include "../../video/windows/SDL_windowswindow.h"
28#include "../SDL_sysrender.h"
29#include "../SDL_d3dmath.h"
30#include "../../video/SDL_pixels_c.h"
31
32#include <d3d11_1.h>
33#include <dxgi1_4.h>
34#include <dxgidebug.h>
35
36#include "SDL_shaders_d3d11.h"
37
38#if defined(_MSC_VER) && !defined(__clang__)
39#define SDL_COMPOSE_ERROR(str) __FUNCTION__ ", " str
40#else
41#define SDL_COMPOSE_ERROR(str) SDL_STRINGIFY_ARG(__FUNCTION__) ", " str
42#endif
43
44#define SAFE_RELEASE(X) \
45 if ((X)) { \
46 IUnknown_Release(SDL_static_cast(IUnknown *, X)); \
47 X = NULL; \
48 }
49
50/* !!! FIXME: vertex buffer bandwidth could be lower; only use UV coords when
51 !!! FIXME: textures are needed. */
52
53// Sampler types
54typedef enum
55{
56 D3D11_SAMPLER_NEAREST_CLAMP,
57 D3D11_SAMPLER_NEAREST_WRAP,
58 D3D11_SAMPLER_LINEAR_CLAMP,
59 D3D11_SAMPLER_LINEAR_WRAP,
60 D3D11_SAMPLER_COUNT
61} D3D11_Sampler;
62
63// Vertex shader, common values
64typedef struct
65{
66 Float4X4 model;
67 Float4X4 projectionAndView;
68} D3D11_VertexShaderConstants;
69
70// These should mirror the definitions in D3D11_PixelShader_Common.hlsli
71//static const float TONEMAP_NONE = 0;
72//static const float TONEMAP_LINEAR = 1;
73static const float TONEMAP_CHROME = 2;
74
75//static const float TEXTURETYPE_NONE = 0;
76static const float TEXTURETYPE_RGB = 1;
77static const float TEXTURETYPE_NV12 = 2;
78static const float TEXTURETYPE_NV21 = 3;
79static const float TEXTURETYPE_YUV = 4;
80
81static const float INPUTTYPE_UNSPECIFIED = 0;
82static const float INPUTTYPE_SRGB = 1;
83static const float INPUTTYPE_SCRGB = 2;
84static const float INPUTTYPE_HDR10 = 3;
85
86typedef struct
87{
88 float scRGB_output;
89 float texture_type;
90 float input_type;
91 float color_scale;
92
93 float tonemap_method;
94 float tonemap_factor1;
95 float tonemap_factor2;
96 float sdr_white_point;
97
98 float YCbCr_matrix[16];
99} D3D11_PixelShaderConstants;
100
101typedef struct
102{
103 ID3D11Buffer *constants;
104 D3D11_PixelShaderConstants shader_constants;
105} D3D11_PixelShaderState;
106
107// Per-vertex data
108typedef struct
109{
110 Float2 pos;
111 Float2 tex;
112 SDL_FColor color;
113} D3D11_VertexPositionColor;
114
115// Per-texture data
116typedef struct
117{
118 int w, h;
119 ID3D11Texture2D *mainTexture;
120 ID3D11ShaderResourceView *mainTextureResourceView;
121 ID3D11RenderTargetView *mainTextureRenderTargetView;
122 ID3D11Texture2D *stagingTexture;
123 int lockedTexturePositionX;
124 int lockedTexturePositionY;
125 D3D11_FILTER scaleMode;
126 D3D11_Shader shader;
127 const float *YCbCr_matrix;
128#ifdef SDL_HAVE_YUV
129 // YV12 texture support
130 bool yuv;
131 ID3D11Texture2D *mainTextureU;
132 ID3D11ShaderResourceView *mainTextureResourceViewU;
133 ID3D11Texture2D *mainTextureV;
134 ID3D11ShaderResourceView *mainTextureResourceViewV;
135
136 // NV12 texture support
137 bool nv12;
138 ID3D11ShaderResourceView *mainTextureResourceViewNV;
139
140 Uint8 *pixels;
141 int pitch;
142 SDL_Rect locked_rect;
143#endif
144} D3D11_TextureData;
145
146// Blend mode data
147typedef struct
148{
149 SDL_BlendMode blendMode;
150 ID3D11BlendState *blendState;
151} D3D11_BlendMode;
152
153// Private renderer data
154typedef struct
155{
156 SDL_SharedObject *hDXGIMod;
157 SDL_SharedObject *hD3D11Mod;
158 IDXGIFactory2 *dxgiFactory;
159 IDXGIAdapter *dxgiAdapter;
160 IDXGIDebug *dxgiDebug;
161 ID3D11Device1 *d3dDevice;
162 ID3D11DeviceContext1 *d3dContext;
163 IDXGISwapChain1 *swapChain;
164 DXGI_SWAP_EFFECT swapEffect;
165 UINT syncInterval;
166 UINT presentFlags;
167 ID3D11RenderTargetView *mainRenderTargetView;
168 ID3D11RenderTargetView *currentOffscreenRenderTargetView;
169 ID3D11InputLayout *inputLayout;
170 ID3D11Buffer *vertexBuffers[8];
171 size_t vertexBufferSizes[8];
172 ID3D11VertexShader *vertexShader;
173 ID3D11PixelShader *pixelShaders[NUM_SHADERS];
174 int blendModesCount;
175 D3D11_BlendMode *blendModes;
176 ID3D11SamplerState *samplers[D3D11_SAMPLER_COUNT];
177 D3D_FEATURE_LEVEL featureLevel;
178 bool pixelSizeChanged;
179
180 // Rasterizers
181 ID3D11RasterizerState *mainRasterizer;
182 ID3D11RasterizerState *clippedRasterizer;
183
184 // Vertex buffer constants
185 D3D11_VertexShaderConstants vertexShaderConstantsData;
186 ID3D11Buffer *vertexShaderConstants;
187
188 // Cached renderer properties
189 DXGI_MODE_ROTATION rotation;
190 ID3D11RenderTargetView *currentRenderTargetView;
191 ID3D11RasterizerState *currentRasterizerState;
192 ID3D11BlendState *currentBlendState;
193 D3D11_Shader currentShader;
194 D3D11_PixelShaderState currentShaderState[NUM_SHADERS];
195 ID3D11ShaderResourceView *currentShaderResource;
196 ID3D11SamplerState *currentSampler;
197 bool cliprectDirty;
198 bool currentCliprectEnabled;
199 SDL_Rect currentCliprect;
200 SDL_Rect currentViewport;
201 int currentViewportRotation;
202 bool viewportDirty;
203 Float4X4 identity;
204 int currentVertexBuffer;
205} D3D11_RenderData;
206
207// Define D3D GUIDs here so we don't have to include uuid.lib.
208
209#ifdef HAVE_GCC_DIAGNOSTIC_PRAGMA
210#pragma GCC diagnostic push
211#pragma GCC diagnostic ignored "-Wunused-const-variable"
212#endif
213
214static const GUID SDL_IID_IDXGIFactory2 = { 0x50c83a1c, 0xe072, 0x4c48, { 0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0 } };
215static const GUID SDL_IID_IDXGIDevice1 = { 0x77db970f, 0x6276, 0x48ba, { 0xba, 0x28, 0x07, 0x01, 0x43, 0xb4, 0x39, 0x2c } };
216static const GUID SDL_IID_ID3D11Texture2D = { 0x6f15aaf2, 0xd208, 0x4e89, { 0x9a, 0xb4, 0x48, 0x95, 0x35, 0xd3, 0x4f, 0x9c } };
217static const GUID SDL_IID_ID3D11Device1 = { 0xa04bfb29, 0x08ef, 0x43d6, { 0xa4, 0x9c, 0xa9, 0xbd, 0xbd, 0xcb, 0xe6, 0x86 } };
218static const GUID SDL_IID_ID3D11DeviceContext1 = { 0xbb2c6faa, 0xb5fb, 0x4082, { 0x8e, 0x6b, 0x38, 0x8b, 0x8c, 0xfa, 0x90, 0xe1 } };
219static const GUID SDL_IID_IDXGISwapChain2 = { 0x94d99bdb, 0xf1f8, 0x4ab0, { 0xb2, 0x36, 0x7d, 0xa0, 0x17, 0x0e, 0xda, 0xb1 } };
220static const GUID SDL_IID_IDXGIDebug1 = { 0xc5a05f0c, 0x16f2, 0x4adf, { 0x9f, 0x4d, 0xa8, 0xc4, 0xd5, 0x8a, 0xc5, 0x50 } };
221static const GUID SDL_IID_IDXGIInfoQueue = { 0xD67441C7, 0x672A, 0x476f, { 0x9E, 0x82, 0xCD, 0x55, 0xB4, 0x49, 0x49, 0xCE } };
222static const GUID SDL_DXGI_DEBUG_ALL = { 0xe48ae283, 0xda80, 0x490b, { 0x87, 0xe6, 0x43, 0xe9, 0xa9, 0xcf, 0xda, 0x8 } };
223
224#ifdef HAVE_GCC_DIAGNOSTIC_PRAGMA
225#pragma GCC diagnostic pop
226#endif
227
228SDL_PixelFormat D3D11_DXGIFormatToSDLPixelFormat(DXGI_FORMAT dxgiFormat)
229{
230 switch (dxgiFormat) {
231 case DXGI_FORMAT_B8G8R8A8_UNORM:
232 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
233 return SDL_PIXELFORMAT_ARGB8888;
234 case DXGI_FORMAT_R8G8B8A8_UNORM:
235 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
236 return SDL_PIXELFORMAT_ABGR8888;
237 case DXGI_FORMAT_B8G8R8X8_UNORM:
238 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
239 return SDL_PIXELFORMAT_XRGB8888;
240 case DXGI_FORMAT_R10G10B10A2_UNORM:
241 return SDL_PIXELFORMAT_ABGR2101010;
242 case DXGI_FORMAT_R16G16B16A16_FLOAT:
243 return SDL_PIXELFORMAT_RGBA64_FLOAT;
244 default:
245 return SDL_PIXELFORMAT_UNKNOWN;
246 }
247}
248
249static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 output_colorspace)
250{
251 switch (format) {
252 case SDL_PIXELFORMAT_RGBA64_FLOAT:
253 return DXGI_FORMAT_R16G16B16A16_FLOAT;
254 case SDL_PIXELFORMAT_ABGR2101010:
255 return DXGI_FORMAT_R10G10B10A2_UNORM;
256 case SDL_PIXELFORMAT_ARGB8888:
257 if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
258 return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
259 }
260 return DXGI_FORMAT_B8G8R8A8_UNORM;
261 case SDL_PIXELFORMAT_ABGR8888:
262 if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
263 return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
264 }
265 return DXGI_FORMAT_R8G8B8A8_UNORM;
266 case SDL_PIXELFORMAT_XRGB8888:
267 if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
268 return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
269 }
270 return DXGI_FORMAT_B8G8R8X8_UNORM;
271 case SDL_PIXELFORMAT_YV12:
272 case SDL_PIXELFORMAT_IYUV:
273 return DXGI_FORMAT_R8_UNORM;
274 case SDL_PIXELFORMAT_NV12:
275 case SDL_PIXELFORMAT_NV21:
276 return DXGI_FORMAT_NV12;
277 case SDL_PIXELFORMAT_P010:
278 return DXGI_FORMAT_P010;
279 default:
280 return DXGI_FORMAT_UNKNOWN;
281 }
282}
283
284static DXGI_FORMAT SDLPixelFormatToDXGIMainResourceViewFormat(Uint32 format, Uint32 colorspace)
285{
286 switch (format) {
287 case SDL_PIXELFORMAT_RGBA64_FLOAT:
288 return DXGI_FORMAT_R16G16B16A16_FLOAT;
289 case SDL_PIXELFORMAT_ABGR2101010:
290 return DXGI_FORMAT_R10G10B10A2_UNORM;
291 case SDL_PIXELFORMAT_ARGB8888:
292 if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
293 return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
294 }
295 return DXGI_FORMAT_B8G8R8A8_UNORM;
296 case SDL_PIXELFORMAT_ABGR8888:
297 if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
298 return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
299 }
300 return DXGI_FORMAT_R8G8B8A8_UNORM;
301 case SDL_PIXELFORMAT_XRGB8888:
302 if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
303 return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
304 }
305 return DXGI_FORMAT_B8G8R8X8_UNORM;
306 case SDL_PIXELFORMAT_YV12:
307 case SDL_PIXELFORMAT_IYUV:
308 case SDL_PIXELFORMAT_NV12: // For the Y texture
309 case SDL_PIXELFORMAT_NV21: // For the Y texture
310 return DXGI_FORMAT_R8_UNORM;
311 case SDL_PIXELFORMAT_P010: // For the Y texture
312 return DXGI_FORMAT_R16_UNORM;
313 default:
314 return DXGI_FORMAT_UNKNOWN;
315 }
316}
317
318static void D3D11_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture);
319
320static void D3D11_ReleaseAll(SDL_Renderer *renderer)
321{
322 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
323
324 // Release all textures
325 for (SDL_Texture *texture = renderer->textures; texture; texture = texture->next) {
326 D3D11_DestroyTexture(renderer, texture);
327 }
328
329 // Release/reset everything else
330 if (data) {
331 int i;
332
333 // Make sure the swap chain is fully released
334 if (data->d3dContext) {
335 ID3D11DeviceContext_ClearState(data->d3dContext);
336 ID3D11DeviceContext_Flush(data->d3dContext);
337 }
338
339 SAFE_RELEASE(data->vertexShaderConstants);
340 SAFE_RELEASE(data->clippedRasterizer);
341 SAFE_RELEASE(data->mainRasterizer);
342 for (i = 0; i < SDL_arraysize(data->samplers); ++i) {
343 SAFE_RELEASE(data->samplers[i]);
344 }
345
346 if (data->blendModesCount > 0) {
347 for (i = 0; i < data->blendModesCount; ++i) {
348 SAFE_RELEASE(data->blendModes[i].blendState);
349 }
350 SDL_free(data->blendModes);
351 data->blendModes = NULL;
352 data->blendModesCount = 0;
353 }
354 for (i = 0; i < SDL_arraysize(data->pixelShaders); ++i) {
355 SAFE_RELEASE(data->pixelShaders[i]);
356 }
357 for (i = 0; i < SDL_arraysize(data->currentShaderState); ++i) {
358 SAFE_RELEASE(data->currentShaderState[i].constants);
359 }
360 SAFE_RELEASE(data->vertexShader);
361 for (i = 0; i < SDL_arraysize(data->vertexBuffers); ++i) {
362 SAFE_RELEASE(data->vertexBuffers[i]);
363 }
364 SAFE_RELEASE(data->inputLayout);
365 SAFE_RELEASE(data->mainRenderTargetView);
366 SAFE_RELEASE(data->swapChain);
367
368 SAFE_RELEASE(data->d3dContext);
369 SAFE_RELEASE(data->d3dDevice);
370 SAFE_RELEASE(data->dxgiAdapter);
371 SAFE_RELEASE(data->dxgiFactory);
372
373 data->swapEffect = (DXGI_SWAP_EFFECT)0;
374 data->rotation = DXGI_MODE_ROTATION_UNSPECIFIED;
375 data->currentOffscreenRenderTargetView = NULL;
376 data->currentRenderTargetView = NULL;
377 data->currentRasterizerState = NULL;
378 data->currentBlendState = NULL;
379 data->currentShader = SHADER_NONE;
380 SDL_zero(data->currentShaderState);
381 data->currentShaderResource = NULL;
382 data->currentSampler = NULL;
383
384 // Check for any leaks if in debug mode
385 if (data->dxgiDebug) {
386 DXGI_DEBUG_RLO_FLAGS rloFlags = (DXGI_DEBUG_RLO_FLAGS)(DXGI_DEBUG_RLO_DETAIL | DXGI_DEBUG_RLO_IGNORE_INTERNAL);
387 IDXGIDebug_ReportLiveObjects(data->dxgiDebug, SDL_DXGI_DEBUG_ALL, rloFlags);
388 SAFE_RELEASE(data->dxgiDebug);
389 }
390
391 /* Unload the D3D libraries. This should be done last, in order
392 * to prevent IUnknown::Release() calls from crashing.
393 */
394 if (data->hD3D11Mod) {
395 SDL_UnloadObject(data->hD3D11Mod);
396 data->hD3D11Mod = NULL;
397 }
398 if (data->hDXGIMod) {
399 SDL_UnloadObject(data->hDXGIMod);
400 data->hDXGIMod = NULL;
401 }
402 }
403}
404
405static void D3D11_DestroyRenderer(SDL_Renderer *renderer)
406{
407 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
408 if (data) {
409 D3D11_ReleaseAll(renderer);
410 SDL_free(data);
411 }
412}
413
414static D3D11_BLEND GetBlendFunc(SDL_BlendFactor factor)
415{
416 switch (factor) {
417 case SDL_BLENDFACTOR_ZERO:
418 return D3D11_BLEND_ZERO;
419 case SDL_BLENDFACTOR_ONE:
420 return D3D11_BLEND_ONE;
421 case SDL_BLENDFACTOR_SRC_COLOR:
422 return D3D11_BLEND_SRC_COLOR;
423 case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
424 return D3D11_BLEND_INV_SRC_COLOR;
425 case SDL_BLENDFACTOR_SRC_ALPHA:
426 return D3D11_BLEND_SRC_ALPHA;
427 case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
428 return D3D11_BLEND_INV_SRC_ALPHA;
429 case SDL_BLENDFACTOR_DST_COLOR:
430 return D3D11_BLEND_DEST_COLOR;
431 case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
432 return D3D11_BLEND_INV_DEST_COLOR;
433 case SDL_BLENDFACTOR_DST_ALPHA:
434 return D3D11_BLEND_DEST_ALPHA;
435 case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
436 return D3D11_BLEND_INV_DEST_ALPHA;
437 default:
438 return (D3D11_BLEND)0;
439 }
440}
441
442static D3D11_BLEND_OP GetBlendEquation(SDL_BlendOperation operation)
443{
444 switch (operation) {
445 case SDL_BLENDOPERATION_ADD:
446 return D3D11_BLEND_OP_ADD;
447 case SDL_BLENDOPERATION_SUBTRACT:
448 return D3D11_BLEND_OP_SUBTRACT;
449 case SDL_BLENDOPERATION_REV_SUBTRACT:
450 return D3D11_BLEND_OP_REV_SUBTRACT;
451 case SDL_BLENDOPERATION_MINIMUM:
452 return D3D11_BLEND_OP_MIN;
453 case SDL_BLENDOPERATION_MAXIMUM:
454 return D3D11_BLEND_OP_MAX;
455 default:
456 return (D3D11_BLEND_OP)0;
457 }
458}
459
460static ID3D11BlendState *D3D11_CreateBlendState(SDL_Renderer *renderer, SDL_BlendMode blendMode)
461{
462 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
463 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
464 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
465 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
466 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
467 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
468 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
469 ID3D11BlendState *blendState = NULL;
470 D3D11_BlendMode *blendModes;
471 HRESULT result = S_OK;
472
473 D3D11_BLEND_DESC blendDesc;
474 SDL_zero(blendDesc);
475 blendDesc.AlphaToCoverageEnable = FALSE;
476 blendDesc.IndependentBlendEnable = FALSE;
477 blendDesc.RenderTarget[0].BlendEnable = TRUE;
478 blendDesc.RenderTarget[0].SrcBlend = GetBlendFunc(srcColorFactor);
479 blendDesc.RenderTarget[0].DestBlend = GetBlendFunc(dstColorFactor);
480 blendDesc.RenderTarget[0].BlendOp = GetBlendEquation(colorOperation);
481 blendDesc.RenderTarget[0].SrcBlendAlpha = GetBlendFunc(srcAlphaFactor);
482 blendDesc.RenderTarget[0].DestBlendAlpha = GetBlendFunc(dstAlphaFactor);
483 blendDesc.RenderTarget[0].BlendOpAlpha = GetBlendEquation(alphaOperation);
484 blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
485 result = ID3D11Device_CreateBlendState(data->d3dDevice, &blendDesc, &blendState);
486 if (FAILED(result)) {
487 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateBlendState"), result);
488 return NULL;
489 }
490
491 blendModes = (D3D11_BlendMode *)SDL_realloc(data->blendModes, (data->blendModesCount + 1) * sizeof(*blendModes));
492 if (!blendModes) {
493 SAFE_RELEASE(blendState);
494 return NULL;
495 }
496 blendModes[data->blendModesCount].blendMode = blendMode;
497 blendModes[data->blendModesCount].blendState = blendState;
498 data->blendModes = blendModes;
499 ++data->blendModesCount;
500
501 return blendState;
502}
503
504// Create resources that depend on the device.
505static HRESULT D3D11_CreateDeviceResources(SDL_Renderer *renderer)
506{
507 typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory);
508 typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY2)(UINT flags, REFIID riid, void **ppFactory);
509 PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc = NULL;
510 PFN_CREATE_DXGI_FACTORY2 CreateDXGIFactory2Func = NULL;
511 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
512 PFN_D3D11_CREATE_DEVICE D3D11CreateDeviceFunc;
513 ID3D11Device *d3dDevice = NULL;
514 ID3D11DeviceContext *d3dContext = NULL;
515 IDXGIDevice1 *dxgiDevice = NULL;
516 HRESULT result = S_OK;
517 UINT creationFlags = 0;
518 bool createDebug;
519
520 /* This array defines the set of DirectX hardware feature levels this app will support.
521 * Note the ordering should be preserved.
522 * Don't forget to declare your application's minimum required feature level in its
523 * description. All applications are assumed to support 9.1 unless otherwise stated.
524 */
525 D3D_FEATURE_LEVEL featureLevels[] = {
526 D3D_FEATURE_LEVEL_11_1,
527 D3D_FEATURE_LEVEL_11_0,
528 D3D_FEATURE_LEVEL_10_1,
529 D3D_FEATURE_LEVEL_10_0,
530 D3D_FEATURE_LEVEL_9_3,
531 D3D_FEATURE_LEVEL_9_2,
532 D3D_FEATURE_LEVEL_9_1
533 };
534
535 D3D11_BUFFER_DESC constantBufferDesc;
536 D3D11_SAMPLER_DESC samplerDesc;
537 D3D11_RASTERIZER_DESC rasterDesc;
538
539 // See if we need debug interfaces
540 createDebug = SDL_GetHintBoolean(SDL_HINT_RENDER_DIRECT3D11_DEBUG, false);
541
542 data->hDXGIMod = SDL_LoadObject("dxgi.dll");
543 if (!data->hDXGIMod) {
544 result = E_FAIL;
545 goto done;
546 }
547
548 CreateDXGIFactory2Func = (PFN_CREATE_DXGI_FACTORY2)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2");
549 if (!CreateDXGIFactory2Func) {
550 CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory");
551 if (!CreateDXGIFactoryFunc) {
552 result = E_FAIL;
553 goto done;
554 }
555 }
556
557 data->hD3D11Mod = SDL_LoadObject("d3d11.dll");
558 if (!data->hD3D11Mod) {
559 result = E_FAIL;
560 goto done;
561 }
562
563 D3D11CreateDeviceFunc = (PFN_D3D11_CREATE_DEVICE)SDL_LoadFunction(data->hD3D11Mod, "D3D11CreateDevice");
564 if (!D3D11CreateDeviceFunc) {
565 result = E_FAIL;
566 goto done;
567 }
568
569 if (createDebug) {
570#ifdef __IDXGIInfoQueue_INTERFACE_DEFINED__
571 IDXGIInfoQueue *dxgiInfoQueue = NULL;
572 PFN_CREATE_DXGI_FACTORY2 DXGIGetDebugInterfaceFunc;
573
574 // If the debug hint is set, also create the DXGI factory in debug mode
575 DXGIGetDebugInterfaceFunc = (PFN_CREATE_DXGI_FACTORY2)SDL_LoadFunction(data->hDXGIMod, "DXGIGetDebugInterface1");
576 if (!DXGIGetDebugInterfaceFunc) {
577 result = E_FAIL;
578 goto done;
579 }
580
581 result = DXGIGetDebugInterfaceFunc(0, &SDL_IID_IDXGIDebug1, (void **)&data->dxgiDebug);
582 if (FAILED(result)) {
583 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result);
584 goto done;
585 }
586
587 result = DXGIGetDebugInterfaceFunc(0, &SDL_IID_IDXGIInfoQueue, (void **)&dxgiInfoQueue);
588 if (FAILED(result)) {
589 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result);
590 goto done;
591 }
592
593 IDXGIInfoQueue_SetBreakOnSeverity(dxgiInfoQueue, SDL_DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR, TRUE);
594 IDXGIInfoQueue_SetBreakOnSeverity(dxgiInfoQueue, SDL_DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION, TRUE);
595 SAFE_RELEASE(dxgiInfoQueue);
596#endif // __IDXGIInfoQueue_INTERFACE_DEFINED__
597 creationFlags = DXGI_CREATE_FACTORY_DEBUG;
598 }
599
600 if (CreateDXGIFactory2Func) {
601 result = CreateDXGIFactory2Func(creationFlags, &SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory);
602 } else {
603 result = CreateDXGIFactoryFunc(&SDL_IID_IDXGIFactory2, (void **)&data->dxgiFactory);
604 }
605 if (FAILED(result)) {
606 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateDXGIFactory"), result);
607 goto done;
608 }
609
610 // FIXME: Should we use the default adapter?
611 result = IDXGIFactory2_EnumAdapters(data->dxgiFactory, 0, &data->dxgiAdapter);
612 if (FAILED(result)) {
613 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("D3D11CreateDevice"), result);
614 goto done;
615 }
616
617 /* This flag adds support for surfaces with a different color channel ordering
618 * than the API default. It is required for compatibility with Direct2D.
619 */
620 creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
621
622 // Make sure Direct3D's debugging feature gets used, if the app requests it.
623 if (createDebug) {
624 creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
625 }
626
627 // Create a single-threaded device unless the app requests otherwise.
628 if (!SDL_GetHintBoolean(SDL_HINT_RENDER_DIRECT3D_THREADSAFE, false)) {
629 creationFlags |= D3D11_CREATE_DEVICE_SINGLETHREADED;
630 }
631
632 // Create the Direct3D 11 API device object and a corresponding context.
633 result = D3D11CreateDeviceFunc(
634 data->dxgiAdapter,
635 D3D_DRIVER_TYPE_UNKNOWN,
636 NULL,
637 creationFlags, // Set set debug and Direct2D compatibility flags.
638 featureLevels, // List of feature levels this app can support.
639 SDL_arraysize(featureLevels),
640 D3D11_SDK_VERSION, // Always set this to D3D11_SDK_VERSION for Windows Store apps.
641 &d3dDevice, // Returns the Direct3D device created.
642 &data->featureLevel, // Returns feature level of device created.
643 &d3dContext // Returns the device immediate context.
644 );
645 if (FAILED(result)) {
646 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("D3D11CreateDevice"), result);
647 goto done;
648 }
649
650 result = ID3D11Device_QueryInterface(d3dDevice, &SDL_IID_ID3D11Device1, (void **)&data->d3dDevice);
651 if (FAILED(result)) {
652 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device to ID3D11Device1"), result);
653 goto done;
654 }
655
656 result = ID3D11DeviceContext_QueryInterface(d3dContext, &SDL_IID_ID3D11DeviceContext1, (void **)&data->d3dContext);
657 if (FAILED(result)) {
658 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11DeviceContext to ID3D11DeviceContext1"), result);
659 goto done;
660 }
661
662 result = ID3D11Device_QueryInterface(d3dDevice, &SDL_IID_IDXGIDevice1, (void **)&dxgiDevice);
663 if (FAILED(result)) {
664 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device to IDXGIDevice1"), result);
665 goto done;
666 }
667
668 /* Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and
669 * ensures that the application will only render after each VSync, minimizing power consumption.
670 */
671 result = IDXGIDevice1_SetMaximumFrameLatency(dxgiDevice, 1);
672 if (FAILED(result)) {
673 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGIDevice1::SetMaximumFrameLatency"), result);
674 goto done;
675 }
676
677 /* Make note of the maximum texture size
678 * Max texture sizes are documented on MSDN, at:
679 * http://msdn.microsoft.com/en-us/library/windows/apps/ff476876.aspx
680 */
681 switch (data->featureLevel) {
682 case D3D_FEATURE_LEVEL_11_1:
683 case D3D_FEATURE_LEVEL_11_0:
684 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384);
685 break;
686
687 case D3D_FEATURE_LEVEL_10_1:
688 case D3D_FEATURE_LEVEL_10_0:
689 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 8192);
690 break;
691
692 case D3D_FEATURE_LEVEL_9_3:
693 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 4096);
694 break;
695
696 case D3D_FEATURE_LEVEL_9_2:
697 case D3D_FEATURE_LEVEL_9_1:
698 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 2048);
699 break;
700
701 default:
702 SDL_SetError("%s, Unexpected feature level: %d", __FUNCTION__, data->featureLevel);
703 result = E_FAIL;
704 goto done;
705 }
706
707 if (!D3D11_CreateVertexShader(data->d3dDevice, &data->vertexShader, &data->inputLayout)) {
708 goto done;
709 }
710
711 // Setup space to hold vertex shader constants:
712 SDL_zero(constantBufferDesc);
713 constantBufferDesc.ByteWidth = sizeof(D3D11_VertexShaderConstants);
714 constantBufferDesc.Usage = D3D11_USAGE_DEFAULT;
715 constantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
716 result = ID3D11Device_CreateBuffer(data->d3dDevice,
717 &constantBufferDesc,
718 NULL,
719 &data->vertexShaderConstants);
720 if (FAILED(result)) {
721 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateBuffer [vertex shader constants]"), result);
722 goto done;
723 }
724
725 // Create samplers to use when drawing textures:
726 static struct
727 {
728 D3D11_FILTER filter;
729 D3D11_TEXTURE_ADDRESS_MODE address;
730 } samplerParams[] = {
731 { D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP },
732 { D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_WRAP },
733 { D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_CLAMP },
734 { D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_WRAP },
735 };
736 SDL_COMPILE_TIME_ASSERT(samplerParams_SIZE, SDL_arraysize(samplerParams) == D3D11_SAMPLER_COUNT);
737 SDL_zero(samplerDesc);
738 samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
739 samplerDesc.MipLODBias = 0.0f;
740 samplerDesc.MaxAnisotropy = 1;
741 samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
742 samplerDesc.MinLOD = 0.0f;
743 samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
744 for (int i = 0; i < SDL_arraysize(samplerParams); ++i) {
745 samplerDesc.Filter = samplerParams[i].filter;
746 samplerDesc.AddressU = samplerParams[i].address;
747 samplerDesc.AddressV = samplerParams[i].address;
748 result = ID3D11Device_CreateSamplerState(data->d3dDevice,
749 &samplerDesc,
750 &data->samplers[i]);
751 if (FAILED(result)) {
752 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateSamplerState [nearest-pixel filter]"), result);
753 goto done;
754 }
755 }
756
757 // Setup Direct3D rasterizer states
758 SDL_zero(rasterDesc);
759 rasterDesc.AntialiasedLineEnable = FALSE;
760 rasterDesc.CullMode = D3D11_CULL_NONE;
761 rasterDesc.DepthBias = 0;
762 rasterDesc.DepthBiasClamp = 0.0f;
763 rasterDesc.DepthClipEnable = TRUE;
764 rasterDesc.FillMode = D3D11_FILL_SOLID;
765 rasterDesc.FrontCounterClockwise = FALSE;
766 rasterDesc.MultisampleEnable = FALSE;
767 rasterDesc.ScissorEnable = FALSE;
768 rasterDesc.SlopeScaledDepthBias = 0.0f;
769 result = ID3D11Device_CreateRasterizerState(data->d3dDevice, &rasterDesc, &data->mainRasterizer);
770 if (FAILED(result)) {
771 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateRasterizerState [main rasterizer]"), result);
772 goto done;
773 }
774
775 rasterDesc.ScissorEnable = TRUE;
776 result = ID3D11Device_CreateRasterizerState(data->d3dDevice, &rasterDesc, &data->clippedRasterizer);
777 if (FAILED(result)) {
778 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateRasterizerState [clipped rasterizer]"), result);
779 goto done;
780 }
781
782 // Create blending states:
783 if (!D3D11_CreateBlendState(renderer, SDL_BLENDMODE_BLEND)) {
784 // D3D11_CreateBlendState will set the SDL error, if it fails
785 goto done;
786 }
787
788 // Setup render state that doesn't change
789 ID3D11DeviceContext_IASetInputLayout(data->d3dContext, data->inputLayout);
790 ID3D11DeviceContext_VSSetShader(data->d3dContext, data->vertexShader, NULL, 0);
791 ID3D11DeviceContext_VSSetConstantBuffers(data->d3dContext, 0, 1, &data->vertexShaderConstants);
792
793 SDL_SetPointerProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_D3D11_DEVICE_POINTER, data->d3dDevice);
794
795done:
796 SAFE_RELEASE(d3dDevice);
797 SAFE_RELEASE(d3dContext);
798 SAFE_RELEASE(dxgiDevice);
799 return result;
800}
801
802static DXGI_MODE_ROTATION D3D11_GetCurrentRotation(void)
803{
804 // FIXME
805 return DXGI_MODE_ROTATION_IDENTITY;
806}
807
808static BOOL D3D11_IsDisplayRotated90Degrees(DXGI_MODE_ROTATION rotation)
809{
810 switch (rotation) {
811 case DXGI_MODE_ROTATION_ROTATE90:
812 case DXGI_MODE_ROTATION_ROTATE270:
813 return TRUE;
814 default:
815 return FALSE;
816 }
817}
818
819static int D3D11_GetRotationForCurrentRenderTarget(SDL_Renderer *renderer)
820{
821 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
822 if (data->currentOffscreenRenderTargetView) {
823 return DXGI_MODE_ROTATION_IDENTITY;
824 } else {
825 return data->rotation;
826 }
827}
828
829static bool D3D11_GetViewportAlignedD3DRect(SDL_Renderer *renderer, const SDL_Rect *sdlRect, D3D11_RECT *outRect, BOOL includeViewportOffset)
830{
831 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
832 const int rotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
833 const SDL_Rect *viewport = &data->currentViewport;
834
835 switch (rotation) {
836 case DXGI_MODE_ROTATION_IDENTITY:
837 outRect->left = sdlRect->x;
838 outRect->right = (LONG)sdlRect->x + sdlRect->w;
839 outRect->top = sdlRect->y;
840 outRect->bottom = (LONG)sdlRect->y + sdlRect->h;
841 if (includeViewportOffset) {
842 outRect->left += viewport->x;
843 outRect->right += viewport->x;
844 outRect->top += viewport->y;
845 outRect->bottom += viewport->y;
846 }
847 break;
848 case DXGI_MODE_ROTATION_ROTATE270:
849 outRect->left = sdlRect->y;
850 outRect->right = (LONG)sdlRect->y + sdlRect->h;
851 outRect->top = viewport->w - sdlRect->x - sdlRect->w;
852 outRect->bottom = viewport->w - sdlRect->x;
853 break;
854 case DXGI_MODE_ROTATION_ROTATE180:
855 outRect->left = viewport->w - sdlRect->x - sdlRect->w;
856 outRect->right = viewport->w - sdlRect->x;
857 outRect->top = viewport->h - sdlRect->y - sdlRect->h;
858 outRect->bottom = viewport->h - sdlRect->y;
859 break;
860 case DXGI_MODE_ROTATION_ROTATE90:
861 outRect->left = viewport->h - sdlRect->y - sdlRect->h;
862 outRect->right = viewport->h - sdlRect->y;
863 outRect->top = sdlRect->x;
864 outRect->bottom = (LONG)sdlRect->x + sdlRect->h;
865 break;
866 default:
867 return SDL_SetError("The physical display is in an unknown or unsupported rotation");
868 }
869 return true;
870}
871
872static HRESULT D3D11_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
873{
874 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
875 IUnknown *coreWindow = NULL;
876 IDXGISwapChain3 *swapChain3 = NULL;
877 HRESULT result = S_OK;
878
879 // Create a swap chain using the same adapter as the existing Direct3D device.
880 DXGI_SWAP_CHAIN_DESC1 swapChainDesc;
881 SDL_zero(swapChainDesc);
882 swapChainDesc.Width = w;
883 swapChainDesc.Height = h;
884 switch (renderer->output_colorspace) {
885 case SDL_COLORSPACE_SRGB_LINEAR:
886 swapChainDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
887 break;
888 case SDL_COLORSPACE_HDR10:
889 swapChainDesc.Format = DXGI_FORMAT_R10G10B10A2_UNORM;
890 break;
891 default:
892 swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format.
893 break;
894 }
895 swapChainDesc.Stereo = FALSE;
896 swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling.
897 swapChainDesc.SampleDesc.Quality = 0;
898 swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
899 swapChainDesc.BufferCount = 2; // Use double-buffering to minimize latency.
900 if (WIN_IsWindows8OrGreater()) {
901 swapChainDesc.Scaling = DXGI_SCALING_NONE;
902 } else {
903 swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
904 }
905 if (SDL_GetWindowFlags(renderer->window) & SDL_WINDOW_TRANSPARENT) {
906 swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
907 swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
908 } else {
909 swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect.
910 }
911 swapChainDesc.Flags = 0;
912
913 if (coreWindow) {
914 result = IDXGIFactory2_CreateSwapChainForCoreWindow(data->dxgiFactory,
915 (IUnknown *)data->d3dDevice,
916 coreWindow,
917 &swapChainDesc,
918 NULL, // Allow on all displays.
919 &data->swapChain);
920 if (FAILED(result)) {
921 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGIFactory2::CreateSwapChainForCoreWindow"), result);
922 goto done;
923 }
924 } else {
925#if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK)
926 HWND hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(renderer->window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
927 if (!hwnd) {
928 SDL_SetError("Couldn't get window handle");
929 result = E_FAIL;
930 goto done;
931 }
932
933 result = IDXGIFactory2_CreateSwapChainForHwnd(data->dxgiFactory,
934 (IUnknown *)data->d3dDevice,
935 hwnd,
936 &swapChainDesc,
937 NULL,
938 NULL, // Allow on all displays.
939 &data->swapChain);
940 if (FAILED(result)) {
941 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGIFactory2::CreateSwapChainForHwnd"), result);
942 goto done;
943 }
944
945 IDXGIFactory_MakeWindowAssociation(data->dxgiFactory, hwnd, DXGI_MWA_NO_WINDOW_CHANGES);
946#else
947 SDL_SetError(__FUNCTION__ ", Unable to find something to attach a swap chain to");
948 goto done;
949#endif // defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) / else
950 }
951 data->swapEffect = swapChainDesc.SwapEffect;
952
953 if (SUCCEEDED(IDXGISwapChain1_QueryInterface(data->swapChain, &SDL_IID_IDXGISwapChain2, (void **)&swapChain3))) {
954 UINT colorspace_support = 0;
955 DXGI_COLOR_SPACE_TYPE colorspace;
956 switch (renderer->output_colorspace) {
957 case SDL_COLORSPACE_SRGB_LINEAR:
958 colorspace = DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709;
959 break;
960 case SDL_COLORSPACE_HDR10:
961 colorspace = DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
962 break;
963 default:
964 // sRGB
965 colorspace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
966 break;
967 }
968 if (SUCCEEDED(IDXGISwapChain3_CheckColorSpaceSupport(swapChain3, colorspace, &colorspace_support)) &&
969 (colorspace_support & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT)) {
970 result = IDXGISwapChain3_SetColorSpace1(swapChain3, colorspace);
971 if (FAILED(result)) {
972 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain3::SetColorSpace1"), result);
973 goto done;
974 }
975 } else if (colorspace != DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709) {
976 // Not the default, we're not going to be able to present in this colorspace
977 SDL_SetError("Unsupported output colorspace");
978 result = DXGI_ERROR_UNSUPPORTED;
979 }
980 }
981
982 SDL_SetPointerProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER, data->swapChain);
983
984done:
985 SAFE_RELEASE(swapChain3);
986 SAFE_RELEASE(coreWindow);
987 return result;
988}
989
990static void D3D11_ReleaseMainRenderTargetView(SDL_Renderer *renderer)
991{
992 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
993 ID3D11DeviceContext_OMSetRenderTargets(data->d3dContext, 0, NULL, NULL);
994 SAFE_RELEASE(data->mainRenderTargetView);
995}
996
997// Initialize all resources that change when the window's size changes.
998static HRESULT D3D11_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
999{
1000 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
1001 ID3D11Texture2D *backBuffer = NULL;
1002 HRESULT result = S_OK;
1003 int w, h;
1004
1005 // Release the previous render target view
1006 D3D11_ReleaseMainRenderTargetView(renderer);
1007
1008 /* The width and height of the swap chain must be based on the display's
1009 * non-rotated size.
1010 */
1011 SDL_GetWindowSizeInPixels(renderer->window, &w, &h);
1012 data->rotation = D3D11_GetCurrentRotation();
1013 // SDL_Log("%s: windowSize={%d,%d}, orientation=%d", __FUNCTION__, w, h, (int)data->rotation);
1014 if (D3D11_IsDisplayRotated90Degrees(data->rotation)) {
1015 int tmp = w;
1016 w = h;
1017 h = tmp;
1018 }
1019
1020 if (data->swapChain) {
1021 // If the swap chain already exists, resize it.
1022 result = IDXGISwapChain_ResizeBuffers(data->swapChain,
1023 0,
1024 w, h,
1025 DXGI_FORMAT_UNKNOWN,
1026 0);
1027 if (FAILED(result)) {
1028 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain::ResizeBuffers"), result);
1029 goto done;
1030 }
1031 } else {
1032 result = D3D11_CreateSwapChain(renderer, w, h);
1033 if (FAILED(result) || !data->swapChain) {
1034 goto done;
1035 }
1036 }
1037
1038 // Set the proper rotation for the swap chain.
1039 if (WIN_IsWindows8OrGreater()) {
1040 if (data->swapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) {
1041 result = IDXGISwapChain1_SetRotation(data->swapChain, data->rotation);
1042 if (FAILED(result)) {
1043 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain1::SetRotation"), result);
1044 goto done;
1045 }
1046 }
1047 }
1048
1049 result = IDXGISwapChain_GetBuffer(data->swapChain,
1050 0,
1051 &SDL_IID_ID3D11Texture2D,
1052 (void **)&backBuffer);
1053 if (FAILED(result)) {
1054 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain::GetBuffer [back-buffer]"), result);
1055 goto done;
1056 }
1057
1058 // Create a render target view of the swap chain back buffer.
1059 result = ID3D11Device_CreateRenderTargetView(data->d3dDevice,
1060 (ID3D11Resource *)backBuffer,
1061 NULL,
1062 &data->mainRenderTargetView);
1063 if (FAILED(result)) {
1064 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device::CreateRenderTargetView"), result);
1065 goto done;
1066 }
1067
1068 /* Set the swap chain target immediately, so that a target is always set
1069 * even before we get to SetDrawState. Without this it's possible to hit
1070 * null references in places like ReadPixels!
1071 */
1072 ID3D11DeviceContext_OMSetRenderTargets(data->d3dContext,
1073 1,
1074 &data->mainRenderTargetView,
1075 NULL);
1076
1077 data->viewportDirty = true;
1078
1079done:
1080 SAFE_RELEASE(backBuffer);
1081 return result;
1082}
1083
1084static bool D3D11_HandleDeviceLost(SDL_Renderer *renderer)
1085{
1086 bool recovered = false;
1087
1088 D3D11_ReleaseAll(renderer);
1089
1090 if (SUCCEEDED(D3D11_CreateDeviceResources(renderer)) &&
1091 SUCCEEDED(D3D11_CreateWindowSizeDependentResources(renderer))) {
1092 recovered = true;
1093 } else {
1094 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Renderer couldn't recover from device lost: %s", SDL_GetError());
1095 D3D11_ReleaseAll(renderer);
1096 }
1097
1098 // Let the application know that the device has been reset or lost
1099 SDL_Event event;
1100 SDL_zero(event);
1101 event.type = recovered ? SDL_EVENT_RENDER_DEVICE_RESET : SDL_EVENT_RENDER_DEVICE_LOST;
1102 event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer));
1103 SDL_PushEvent(&event);
1104
1105 return recovered;
1106}
1107
1108// This method is called when the window's size changes.
1109static HRESULT D3D11_UpdateForWindowSizeChange(SDL_Renderer *renderer)
1110{
1111 return D3D11_CreateWindowSizeDependentResources(renderer);
1112}
1113
1114static void D3D11_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
1115{
1116 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
1117
1118 if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
1119 data->pixelSizeChanged = true;
1120 }
1121}
1122
1123static bool D3D11_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
1124{
1125 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
1126 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
1127 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
1128 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
1129 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
1130 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
1131
1132 if (!GetBlendFunc(srcColorFactor) || !GetBlendFunc(srcAlphaFactor) ||
1133 !GetBlendEquation(colorOperation) ||
1134 !GetBlendFunc(dstColorFactor) || !GetBlendFunc(dstAlphaFactor) ||
1135 !GetBlendEquation(alphaOperation)) {
1136 return false;
1137 }
1138 return true;
1139}
1140
1141static bool GetTextureProperty(SDL_PropertiesID props, const char *name, ID3D11Texture2D **texture)
1142{
1143 IUnknown *unknown = SDL_GetPointerProperty(props, name, NULL);
1144 if (unknown) {
1145 HRESULT result = IUnknown_QueryInterface(unknown, &SDL_IID_ID3D11Texture2D, (void **)texture);
1146 if (FAILED(result)) {
1147 return WIN_SetErrorFromHRESULT(name, result);
1148 }
1149 }
1150 return true;
1151}
1152
1153static bool D3D11_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
1154{
1155 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
1156 D3D11_TextureData *textureData;
1157 HRESULT result;
1158 DXGI_FORMAT textureFormat = SDLPixelFormatToDXGITextureFormat(texture->format, renderer->output_colorspace);
1159 D3D11_TEXTURE2D_DESC textureDesc;
1160 D3D11_SHADER_RESOURCE_VIEW_DESC resourceViewDesc;
1161
1162 if (!rendererData->d3dDevice) {
1163 return SDL_SetError("Device lost and couldn't be recovered");
1164 }
1165
1166 if (textureFormat == DXGI_FORMAT_UNKNOWN) {
1167 return SDL_SetError("%s, An unsupported SDL pixel format (0x%x) was specified",
1168 __FUNCTION__, texture->format);
1169 }
1170
1171 textureData = (D3D11_TextureData *)SDL_calloc(1, sizeof(*textureData));
1172 if (!textureData) {
1173 return false;
1174 }
1175 textureData->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? D3D11_FILTER_MIN_MAG_MIP_POINT : D3D11_FILTER_MIN_MAG_MIP_LINEAR;
1176
1177 texture->internal = textureData;
1178
1179 SDL_zero(textureDesc);
1180 textureDesc.Width = texture->w;
1181 textureDesc.Height = texture->h;
1182 textureDesc.MipLevels = 1;
1183 textureDesc.ArraySize = 1;
1184 textureDesc.Format = textureFormat;
1185 textureDesc.SampleDesc.Count = 1;
1186 textureDesc.SampleDesc.Quality = 0;
1187 textureDesc.MiscFlags = 0;
1188
1189 // NV12 textures must have even width and height
1190 if (texture->format == SDL_PIXELFORMAT_NV12 ||
1191 texture->format == SDL_PIXELFORMAT_NV21 ||
1192 texture->format == SDL_PIXELFORMAT_P010) {
1193 textureDesc.Width = (textureDesc.Width + 1) & ~1;
1194 textureDesc.Height = (textureDesc.Height + 1) & ~1;
1195 }
1196 textureData->w = (int)textureDesc.Width;
1197 textureData->h = (int)textureDesc.Height;
1198 if (SDL_COLORSPACETRANSFER(texture->colorspace) == SDL_TRANSFER_CHARACTERISTICS_SRGB) {
1199 textureData->shader = SHADER_RGB;
1200 } else {
1201 textureData->shader = SHADER_ADVANCED;
1202 }
1203
1204 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
1205 textureDesc.Usage = D3D11_USAGE_DYNAMIC;
1206 textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
1207 } else {
1208 textureDesc.Usage = D3D11_USAGE_DEFAULT;
1209 textureDesc.CPUAccessFlags = 0;
1210 }
1211
1212 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
1213 textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
1214 } else {
1215 textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
1216 }
1217
1218 if (!GetTextureProperty(create_props, SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER, &textureData->mainTexture)) {
1219 return false;
1220 }
1221 if (!textureData->mainTexture) {
1222 result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
1223 &textureDesc,
1224 NULL,
1225 &textureData->mainTexture);
1226 if (FAILED(result)) {
1227 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateTexture2D"), result);
1228 }
1229 }
1230 SDL_SetPointerProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER, textureData->mainTexture);
1231#ifdef SDL_HAVE_YUV
1232 if (texture->format == SDL_PIXELFORMAT_YV12 ||
1233 texture->format == SDL_PIXELFORMAT_IYUV) {
1234 textureData->yuv = true;
1235
1236 textureDesc.Width = (textureDesc.Width + 1) / 2;
1237 textureDesc.Height = (textureDesc.Height + 1) / 2;
1238
1239 if (!GetTextureProperty(create_props, SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER, &textureData->mainTextureU)) {
1240 return false;
1241 }
1242 if (!textureData->mainTextureU) {
1243 result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
1244 &textureDesc,
1245 NULL,
1246 &textureData->mainTextureU);
1247 if (FAILED(result)) {
1248 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateTexture2D"), result);
1249 }
1250 }
1251 SDL_SetPointerProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER, textureData->mainTextureU);
1252
1253 if (!GetTextureProperty(create_props, SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER, &textureData->mainTextureV)) {
1254 return false;
1255 }
1256 if (!textureData->mainTextureV) {
1257 result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
1258 &textureDesc,
1259 NULL,
1260 &textureData->mainTextureV);
1261 if (FAILED(result)) {
1262 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateTexture2D"), result);
1263 }
1264 }
1265 SDL_SetPointerProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER, textureData->mainTextureV);
1266
1267 textureData->YCbCr_matrix = SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8);
1268 if (!textureData->YCbCr_matrix) {
1269 return SDL_SetError("Unsupported YUV colorspace");
1270 }
1271 }
1272 if (texture->format == SDL_PIXELFORMAT_NV12 ||
1273 texture->format == SDL_PIXELFORMAT_NV21 ||
1274 texture->format == SDL_PIXELFORMAT_P010) {
1275 int bits_per_pixel;
1276
1277 textureData->nv12 = true;
1278
1279 switch (texture->format) {
1280 case SDL_PIXELFORMAT_P010:
1281 bits_per_pixel = 10;
1282 break;
1283 default:
1284 bits_per_pixel = 8;
1285 break;
1286 }
1287 textureData->YCbCr_matrix = SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, bits_per_pixel);
1288 if (!textureData->YCbCr_matrix) {
1289 return SDL_SetError("Unsupported YUV colorspace");
1290 }
1291 }
1292#endif // SDL_HAVE_YUV
1293 SDL_zero(resourceViewDesc);
1294 resourceViewDesc.Format = SDLPixelFormatToDXGIMainResourceViewFormat(texture->format, renderer->output_colorspace);
1295 resourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
1296 resourceViewDesc.Texture2D.MostDetailedMip = 0;
1297 resourceViewDesc.Texture2D.MipLevels = textureDesc.MipLevels;
1298 result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
1299 (ID3D11Resource *)textureData->mainTexture,
1300 &resourceViewDesc,
1301 &textureData->mainTextureResourceView);
1302 if (FAILED(result)) {
1303 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateShaderResourceView"), result);
1304 }
1305#ifdef SDL_HAVE_YUV
1306 if (textureData->yuv) {
1307 result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
1308 (ID3D11Resource *)textureData->mainTextureU,
1309 &resourceViewDesc,
1310 &textureData->mainTextureResourceViewU);
1311 if (FAILED(result)) {
1312 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateShaderResourceView"), result);
1313 }
1314 result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
1315 (ID3D11Resource *)textureData->mainTextureV,
1316 &resourceViewDesc,
1317 &textureData->mainTextureResourceViewV);
1318 if (FAILED(result)) {
1319 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateShaderResourceView"), result);
1320 }
1321 }
1322
1323 if (textureData->nv12) {
1324 D3D11_SHADER_RESOURCE_VIEW_DESC nvResourceViewDesc = resourceViewDesc;
1325
1326 if (texture->format == SDL_PIXELFORMAT_NV12 || texture->format == SDL_PIXELFORMAT_NV21) {
1327 nvResourceViewDesc.Format = DXGI_FORMAT_R8G8_UNORM;
1328 } else if (texture->format == SDL_PIXELFORMAT_P010) {
1329 nvResourceViewDesc.Format = DXGI_FORMAT_R16G16_UNORM;
1330 }
1331
1332 result = ID3D11Device_CreateShaderResourceView(rendererData->d3dDevice,
1333 (ID3D11Resource *)textureData->mainTexture,
1334 &nvResourceViewDesc,
1335 &textureData->mainTextureResourceViewNV);
1336 if (FAILED(result)) {
1337 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateShaderResourceView"), result);
1338 }
1339 }
1340#endif // SDL_HAVE_YUV
1341
1342 if (texture->access & SDL_TEXTUREACCESS_TARGET) {
1343 D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
1344 SDL_zero(renderTargetViewDesc);
1345 renderTargetViewDesc.Format = textureDesc.Format;
1346 renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
1347 renderTargetViewDesc.Texture2D.MipSlice = 0;
1348
1349 result = ID3D11Device_CreateRenderTargetView(rendererData->d3dDevice,
1350 (ID3D11Resource *)textureData->mainTexture,
1351 &renderTargetViewDesc,
1352 &textureData->mainTextureRenderTargetView);
1353 if (FAILED(result)) {
1354 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateRenderTargetView"), result);
1355 }
1356 }
1357
1358 return true;
1359}
1360
1361static void D3D11_DestroyTexture(SDL_Renderer *renderer,
1362 SDL_Texture *texture)
1363{
1364 D3D11_TextureData *data = (D3D11_TextureData *)texture->internal;
1365
1366 if (!data) {
1367 return;
1368 }
1369
1370 SAFE_RELEASE(data->mainTexture);
1371 SAFE_RELEASE(data->mainTextureResourceView);
1372 SAFE_RELEASE(data->mainTextureRenderTargetView);
1373 SAFE_RELEASE(data->stagingTexture);
1374#ifdef SDL_HAVE_YUV
1375 SAFE_RELEASE(data->mainTextureU);
1376 SAFE_RELEASE(data->mainTextureResourceViewU);
1377 SAFE_RELEASE(data->mainTextureV);
1378 SAFE_RELEASE(data->mainTextureResourceViewV);
1379 SAFE_RELEASE(data->mainTextureResourceViewNV);
1380 SDL_free(data->pixels);
1381#endif
1382 SDL_free(data);
1383 texture->internal = NULL;
1384}
1385
1386static bool D3D11_UpdateTextureInternal(D3D11_RenderData *rendererData, ID3D11Texture2D *texture, int bpp, int x, int y, int w, int h, const void *pixels, int pitch)
1387{
1388 ID3D11Texture2D *stagingTexture;
1389 const Uint8 *src;
1390 Uint8 *dst;
1391 int row;
1392 UINT length;
1393 HRESULT result;
1394 D3D11_TEXTURE2D_DESC stagingTextureDesc;
1395 D3D11_MAPPED_SUBRESOURCE textureMemory;
1396
1397 // Create a 'staging' texture, which will be used to write to a portion of the main texture.
1398 ID3D11Texture2D_GetDesc(texture, &stagingTextureDesc);
1399 stagingTextureDesc.Width = w;
1400 stagingTextureDesc.Height = h;
1401 stagingTextureDesc.BindFlags = 0;
1402 stagingTextureDesc.MiscFlags = 0;
1403 stagingTextureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
1404 stagingTextureDesc.Usage = D3D11_USAGE_STAGING;
1405 if (stagingTextureDesc.Format == DXGI_FORMAT_NV12 ||
1406 stagingTextureDesc.Format == DXGI_FORMAT_P010) {
1407 stagingTextureDesc.Width = (stagingTextureDesc.Width + 1) & ~1;
1408 stagingTextureDesc.Height = (stagingTextureDesc.Height + 1) & ~1;
1409 }
1410 result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
1411 &stagingTextureDesc,
1412 NULL,
1413 &stagingTexture);
1414 if (FAILED(result)) {
1415 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateTexture2D [create staging texture]"), result);
1416 }
1417
1418 // Get a write-only pointer to data in the staging texture:
1419 result = ID3D11DeviceContext_Map(rendererData->d3dContext,
1420 (ID3D11Resource *)stagingTexture,
1421 0,
1422 D3D11_MAP_WRITE,
1423 0,
1424 &textureMemory);
1425 if (FAILED(result)) {
1426 SAFE_RELEASE(stagingTexture);
1427 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11DeviceContext1::Map [map staging texture]"), result);
1428 }
1429
1430 src = (const Uint8 *)pixels;
1431 dst = (Uint8 *)textureMemory.pData;
1432 length = w * bpp;
1433 if (length == (UINT)pitch && length == textureMemory.RowPitch) {
1434 SDL_memcpy(dst, src, (size_t)length * h);
1435 } else {
1436 if (length > (UINT)pitch) {
1437 length = pitch;
1438 }
1439 if (length > textureMemory.RowPitch) {
1440 length = textureMemory.RowPitch;
1441 }
1442 for (row = 0; row < h; ++row) {
1443 SDL_memcpy(dst, src, length);
1444 src += pitch;
1445 dst += textureMemory.RowPitch;
1446 }
1447 }
1448
1449 if (stagingTextureDesc.Format == DXGI_FORMAT_NV12 ||
1450 stagingTextureDesc.Format == DXGI_FORMAT_P010) {
1451 // Copy the UV plane as well
1452 h = (h + 1) / 2;
1453 if (stagingTextureDesc.Format == DXGI_FORMAT_P010) {
1454 length = (length + 3) & ~3;
1455 pitch = (pitch + 3) & ~3;
1456 } else {
1457 length = (length + 1) & ~1;
1458 pitch = (pitch + 1) & ~1;
1459 }
1460 dst = (Uint8 *)textureMemory.pData + stagingTextureDesc.Height * textureMemory.RowPitch;
1461 for (row = 0; row < h; ++row) {
1462 SDL_memcpy(dst, src, length);
1463 src += pitch;
1464 dst += textureMemory.RowPitch;
1465 }
1466 }
1467
1468 // Commit the pixel buffer's changes back to the staging texture:
1469 ID3D11DeviceContext_Unmap(rendererData->d3dContext,
1470 (ID3D11Resource *)stagingTexture,
1471 0);
1472
1473 // Copy the staging texture's contents back to the texture:
1474 ID3D11DeviceContext_CopySubresourceRegion(rendererData->d3dContext,
1475 (ID3D11Resource *)texture,
1476 0,
1477 x,
1478 y,
1479 0,
1480 (ID3D11Resource *)stagingTexture,
1481 0,
1482 NULL);
1483
1484 SAFE_RELEASE(stagingTexture);
1485
1486 return true;
1487}
1488
1489#ifdef SDL_HAVE_YUV
1490static bool D3D11_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
1491 const SDL_Rect *rect,
1492 const Uint8 *Yplane, int Ypitch,
1493 const Uint8 *UVplane, int UVpitch);
1494
1495static bool D3D11_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
1496 const SDL_Rect *rect,
1497 const Uint8 *Yplane, int Ypitch,
1498 const Uint8 *Uplane, int Upitch,
1499 const Uint8 *Vplane, int Vpitch);
1500#endif
1501
1502static bool D3D11_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
1503 const SDL_Rect *rect, const void *srcPixels,
1504 int srcPitch)
1505{
1506 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
1507 D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
1508
1509 if (!textureData) {
1510 return SDL_SetError("Texture is not currently available");
1511 }
1512
1513#ifdef SDL_HAVE_YUV
1514 if (textureData->nv12) {
1515 const Uint8 *Yplane = (const Uint8 *)srcPixels;
1516 const Uint8 *UVplane = Yplane + rect->h * srcPitch;
1517
1518 return D3D11_UpdateTextureNV(renderer, texture, rect, Yplane, srcPitch, UVplane, srcPitch);
1519
1520 } else if (textureData->yuv) {
1521 int Ypitch = srcPitch;
1522 int UVpitch = ((Ypitch + 1) / 2);
1523 const Uint8 *Yplane = (const Uint8 *)srcPixels;
1524 const Uint8 *Uplane = Yplane + rect->h * Ypitch;
1525 const Uint8 *Vplane = Uplane + ((rect->h + 1) / 2) * UVpitch;
1526
1527 if (texture->format == SDL_PIXELFORMAT_YV12) {
1528 return D3D11_UpdateTextureYUV(renderer, texture, rect, Yplane, Ypitch, Vplane, UVpitch, Uplane, UVpitch);
1529 } else {
1530 return D3D11_UpdateTextureYUV(renderer, texture, rect, Yplane, Ypitch, Uplane, UVpitch, Vplane, UVpitch);
1531 }
1532 }
1533#endif
1534
1535 if (!D3D11_UpdateTextureInternal(rendererData, textureData->mainTexture, SDL_BYTESPERPIXEL(texture->format), rect->x, rect->y, rect->w, rect->h, srcPixels, srcPitch)) {
1536 return false;
1537 }
1538 return true;
1539}
1540
1541#ifdef SDL_HAVE_YUV
1542static bool D3D11_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
1543 const SDL_Rect *rect,
1544 const Uint8 *Yplane, int Ypitch,
1545 const Uint8 *Uplane, int Upitch,
1546 const Uint8 *Vplane, int Vpitch)
1547{
1548 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
1549 D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
1550
1551 if (!textureData) {
1552 return SDL_SetError("Texture is not currently available");
1553 }
1554
1555 if (!D3D11_UpdateTextureInternal(rendererData, textureData->mainTexture, SDL_BYTESPERPIXEL(texture->format), rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch)) {
1556 return false;
1557 }
1558 if (!D3D11_UpdateTextureInternal(rendererData, textureData->mainTextureU, SDL_BYTESPERPIXEL(texture->format), rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, Uplane, Upitch)) {
1559 return false;
1560 }
1561 if (!D3D11_UpdateTextureInternal(rendererData, textureData->mainTextureV, SDL_BYTESPERPIXEL(texture->format), rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, Vplane, Vpitch)) {
1562 return false;
1563 }
1564 return true;
1565}
1566
1567static bool D3D11_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
1568 const SDL_Rect *rect,
1569 const Uint8 *Yplane, int Ypitch,
1570 const Uint8 *UVplane, int UVpitch)
1571{
1572 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
1573 D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
1574 ID3D11Texture2D *stagingTexture;
1575 const Uint8 *src;
1576 Uint8 *dst;
1577 int w, h, row;
1578 UINT length;
1579 HRESULT result;
1580 D3D11_TEXTURE2D_DESC stagingTextureDesc;
1581 D3D11_MAPPED_SUBRESOURCE textureMemory;
1582
1583 if (!textureData) {
1584 return SDL_SetError("Texture is not currently available");
1585 }
1586
1587 w = rect->w;
1588 h = rect->h;
1589
1590 // Create a 'staging' texture, which will be used to write to a portion of the main texture.
1591 ID3D11Texture2D_GetDesc(textureData->mainTexture, &stagingTextureDesc);
1592 stagingTextureDesc.Width = w;
1593 stagingTextureDesc.Height = h;
1594 stagingTextureDesc.BindFlags = 0;
1595 stagingTextureDesc.MiscFlags = 0;
1596 stagingTextureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
1597 stagingTextureDesc.Usage = D3D11_USAGE_STAGING;
1598 if (stagingTextureDesc.Format == DXGI_FORMAT_NV12 ||
1599 stagingTextureDesc.Format == DXGI_FORMAT_P010) {
1600 stagingTextureDesc.Width = (stagingTextureDesc.Width + 1) & ~1;
1601 stagingTextureDesc.Height = (stagingTextureDesc.Height + 1) & ~1;
1602 }
1603 result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
1604 &stagingTextureDesc,
1605 NULL,
1606 &stagingTexture);
1607 if (FAILED(result)) {
1608 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateTexture2D [create staging texture]"), result);
1609 }
1610
1611 // Get a write-only pointer to data in the staging texture:
1612 result = ID3D11DeviceContext_Map(rendererData->d3dContext,
1613 (ID3D11Resource *)stagingTexture,
1614 0,
1615 D3D11_MAP_WRITE,
1616 0,
1617 &textureMemory);
1618 if (FAILED(result)) {
1619 SAFE_RELEASE(stagingTexture);
1620 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11DeviceContext1::Map [map staging texture]"), result);
1621 }
1622
1623 src = Yplane;
1624 dst = (Uint8 *)textureMemory.pData;
1625 length = w;
1626 if (length == (UINT)Ypitch && length == textureMemory.RowPitch) {
1627 SDL_memcpy(dst, src, (size_t)length * h);
1628 } else {
1629 if (length > (UINT)Ypitch) {
1630 length = Ypitch;
1631 }
1632 if (length > textureMemory.RowPitch) {
1633 length = textureMemory.RowPitch;
1634 }
1635 for (row = 0; row < h; ++row) {
1636 SDL_memcpy(dst, src, length);
1637 src += Ypitch;
1638 dst += textureMemory.RowPitch;
1639 }
1640 }
1641
1642 src = UVplane;
1643 length = w;
1644 h = (h + 1) / 2;
1645 if (stagingTextureDesc.Format == DXGI_FORMAT_P010) {
1646 length = (length + 3) & ~3;
1647 UVpitch = (UVpitch + 3) & ~3;
1648 } else {
1649 length = (length + 1) & ~1;
1650 UVpitch = (UVpitch + 1) & ~1;
1651 }
1652 dst = (Uint8 *)textureMemory.pData + stagingTextureDesc.Height * textureMemory.RowPitch;
1653 for (row = 0; row < h; ++row) {
1654 SDL_memcpy(dst, src, length);
1655 src += UVpitch;
1656 dst += textureMemory.RowPitch;
1657 }
1658
1659 // Commit the pixel buffer's changes back to the staging texture:
1660 ID3D11DeviceContext_Unmap(rendererData->d3dContext,
1661 (ID3D11Resource *)stagingTexture,
1662 0);
1663
1664 // Copy the staging texture's contents back to the texture:
1665 ID3D11DeviceContext_CopySubresourceRegion(rendererData->d3dContext,
1666 (ID3D11Resource *)textureData->mainTexture,
1667 0,
1668 rect->x,
1669 rect->y,
1670 0,
1671 (ID3D11Resource *)stagingTexture,
1672 0,
1673 NULL);
1674
1675 SAFE_RELEASE(stagingTexture);
1676
1677 return true;
1678}
1679#endif
1680
1681static bool D3D11_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
1682 const SDL_Rect *rect, void **pixels, int *pitch)
1683{
1684 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
1685 D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
1686 HRESULT result = S_OK;
1687 D3D11_TEXTURE2D_DESC stagingTextureDesc;
1688 D3D11_MAPPED_SUBRESOURCE textureMemory;
1689
1690 if (!textureData) {
1691 return SDL_SetError("Texture is not currently available");
1692 }
1693#ifdef SDL_HAVE_YUV
1694 if (textureData->yuv || textureData->nv12) {
1695 // It's more efficient to upload directly...
1696 if (!textureData->pixels) {
1697 textureData->pitch = texture->w;
1698 textureData->pixels = (Uint8 *)SDL_malloc((texture->h * textureData->pitch * 3) / 2);
1699 if (!textureData->pixels) {
1700 return false;
1701 }
1702 }
1703 textureData->locked_rect = *rect;
1704 *pixels =
1705 (void *)(textureData->pixels + rect->y * textureData->pitch +
1706 rect->x * SDL_BYTESPERPIXEL(texture->format));
1707 *pitch = textureData->pitch;
1708 return true;
1709 }
1710#endif
1711 if (textureData->stagingTexture) {
1712 return SDL_SetError("texture is already locked");
1713 }
1714
1715 /* Create a 'staging' texture, which will be used to write to a portion
1716 * of the main texture. This is necessary, as Direct3D 11.1 does not
1717 * have the ability to write a CPU-bound pixel buffer to a rectangular
1718 * subrect of a texture. Direct3D 11.1 can, however, write a pixel
1719 * buffer to an entire texture, hence the use of a staging texture.
1720 */
1721 ID3D11Texture2D_GetDesc(textureData->mainTexture, &stagingTextureDesc);
1722 stagingTextureDesc.Width = rect->w;
1723 stagingTextureDesc.Height = rect->h;
1724 stagingTextureDesc.BindFlags = 0;
1725 stagingTextureDesc.MiscFlags = 0;
1726 stagingTextureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
1727 stagingTextureDesc.Usage = D3D11_USAGE_STAGING;
1728 result = ID3D11Device_CreateTexture2D(rendererData->d3dDevice,
1729 &stagingTextureDesc,
1730 NULL,
1731 &textureData->stagingTexture);
1732 if (FAILED(result)) {
1733 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateTexture2D [create staging texture]"), result);
1734 }
1735
1736 // Get a write-only pointer to data in the staging texture:
1737 result = ID3D11DeviceContext_Map(rendererData->d3dContext,
1738 (ID3D11Resource *)textureData->stagingTexture,
1739 0,
1740 D3D11_MAP_WRITE,
1741 0,
1742 &textureMemory);
1743 if (FAILED(result)) {
1744 SAFE_RELEASE(textureData->stagingTexture);
1745 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11DeviceContext1::Map [map staging texture]"), result);
1746 }
1747
1748 /* Make note of where the staging texture will be written to
1749 * (on a call to SDL_UnlockTexture):
1750 */
1751 textureData->lockedTexturePositionX = rect->x;
1752 textureData->lockedTexturePositionY = rect->y;
1753
1754 /* Make sure the caller has information on the texture's pixel buffer,
1755 * then return:
1756 */
1757 *pixels = textureMemory.pData;
1758 *pitch = textureMemory.RowPitch;
1759 return true;
1760}
1761
1762static void D3D11_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1763{
1764 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
1765 D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
1766
1767 if (!textureData) {
1768 return;
1769 }
1770#ifdef SDL_HAVE_YUV
1771 if (textureData->yuv || textureData->nv12) {
1772 const SDL_Rect *rect = &textureData->locked_rect;
1773 void *pixels =
1774 (void *)(textureData->pixels + rect->y * textureData->pitch +
1775 rect->x * SDL_BYTESPERPIXEL(texture->format));
1776 D3D11_UpdateTexture(renderer, texture, rect, pixels, textureData->pitch);
1777 return;
1778 }
1779#endif
1780 // Commit the pixel buffer's changes back to the staging texture:
1781 ID3D11DeviceContext_Unmap(rendererData->d3dContext,
1782 (ID3D11Resource *)textureData->stagingTexture,
1783 0);
1784
1785 // Copy the staging texture's contents back to the main texture:
1786 ID3D11DeviceContext_CopySubresourceRegion(rendererData->d3dContext,
1787 (ID3D11Resource *)textureData->mainTexture,
1788 0,
1789 textureData->lockedTexturePositionX,
1790 textureData->lockedTexturePositionY,
1791 0,
1792 (ID3D11Resource *)textureData->stagingTexture,
1793 0,
1794 NULL);
1795
1796 SAFE_RELEASE(textureData->stagingTexture);
1797}
1798
1799static void D3D11_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
1800{
1801 D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
1802
1803 if (!textureData) {
1804 return;
1805 }
1806
1807 textureData->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? D3D11_FILTER_MIN_MAG_MIP_POINT : D3D11_FILTER_MIN_MAG_MIP_LINEAR;
1808}
1809
1810static bool D3D11_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
1811{
1812 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
1813 D3D11_TextureData *textureData = NULL;
1814
1815 if (!texture) {
1816 rendererData->currentOffscreenRenderTargetView = NULL;
1817 return true;
1818 }
1819
1820 textureData = (D3D11_TextureData *)texture->internal;
1821
1822 if (!textureData->mainTextureRenderTargetView) {
1823 return SDL_SetError("specified texture is not a render target");
1824 }
1825
1826 rendererData->currentOffscreenRenderTargetView = textureData->mainTextureRenderTargetView;
1827
1828 return true;
1829}
1830
1831static bool D3D11_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
1832{
1833 return true; // nothing to do in this backend.
1834}
1835
1836static bool D3D11_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
1837{
1838 D3D11_VertexPositionColor *verts = (D3D11_VertexPositionColor *)SDL_AllocateRenderVertices(renderer, count * sizeof(D3D11_VertexPositionColor), 0, &cmd->data.draw.first);
1839 int i;
1840 SDL_FColor color = cmd->data.draw.color;
1841 bool convert_color = SDL_RenderingLinearSpace(renderer);
1842
1843 if (!verts) {
1844 return false;
1845 }
1846
1847 cmd->data.draw.count = count;
1848
1849 if (convert_color) {
1850 SDL_ConvertToLinear(&color);
1851 }
1852
1853 for (i = 0; i < count; i++) {
1854 verts->pos.x = points[i].x + 0.5f;
1855 verts->pos.y = points[i].y + 0.5f;
1856 verts->tex.x = 0.0f;
1857 verts->tex.y = 0.0f;
1858 verts->color = color;
1859 verts++;
1860 }
1861
1862 return true;
1863}
1864
1865static bool D3D11_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
1866 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
1867 int num_vertices, const void *indices, int num_indices, int size_indices,
1868 float scale_x, float scale_y)
1869{
1870 int i;
1871 int count = indices ? num_indices : num_vertices;
1872 D3D11_VertexPositionColor *verts = (D3D11_VertexPositionColor *)SDL_AllocateRenderVertices(renderer, count * sizeof(D3D11_VertexPositionColor), 0, &cmd->data.draw.first);
1873 bool convert_color = SDL_RenderingLinearSpace(renderer);
1874 D3D11_TextureData *textureData = texture ? (D3D11_TextureData *)texture->internal : NULL;
1875 float u_scale = textureData ? (float)texture->w / textureData->w : 0.0f;
1876 float v_scale = textureData ? (float)texture->h / textureData->h : 0.0f;
1877
1878 if (!verts) {
1879 return false;
1880 }
1881
1882 cmd->data.draw.count = count;
1883 size_indices = indices ? size_indices : 0;
1884
1885 for (i = 0; i < count; i++) {
1886 int j;
1887 float *xy_;
1888 if (size_indices == 4) {
1889 j = ((const Uint32 *)indices)[i];
1890 } else if (size_indices == 2) {
1891 j = ((const Uint16 *)indices)[i];
1892 } else if (size_indices == 1) {
1893 j = ((const Uint8 *)indices)[i];
1894 } else {
1895 j = i;
1896 }
1897
1898 xy_ = (float *)((char *)xy + j * xy_stride);
1899
1900 verts->pos.x = xy_[0] * scale_x;
1901 verts->pos.y = xy_[1] * scale_y;
1902 verts->color = *(SDL_FColor *)((char *)color + j * color_stride);
1903 if (convert_color) {
1904 SDL_ConvertToLinear(&verts->color);
1905 }
1906
1907 if (texture) {
1908 float *uv_ = (float *)((char *)uv + j * uv_stride);
1909 verts->tex.x = uv_[0] * u_scale;
1910 verts->tex.y = uv_[1] * v_scale;
1911 } else {
1912 verts->tex.x = 0.0f;
1913 verts->tex.y = 0.0f;
1914 }
1915
1916 verts += 1;
1917 }
1918 return true;
1919}
1920
1921static bool D3D11_UpdateVertexBuffer(SDL_Renderer *renderer,
1922 const void *vertexData, size_t dataSizeInBytes)
1923{
1924 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
1925 HRESULT result = S_OK;
1926 const int vbidx = rendererData->currentVertexBuffer;
1927 const UINT stride = sizeof(D3D11_VertexPositionColor);
1928 const UINT offset = 0;
1929
1930 if (dataSizeInBytes == 0) {
1931 return true; // nothing to do.
1932 }
1933
1934 if (rendererData->vertexBuffers[vbidx] && rendererData->vertexBufferSizes[vbidx] >= dataSizeInBytes) {
1935 D3D11_MAPPED_SUBRESOURCE mappedResource;
1936 result = ID3D11DeviceContext_Map(rendererData->d3dContext,
1937 (ID3D11Resource *)rendererData->vertexBuffers[vbidx],
1938 0,
1939 D3D11_MAP_WRITE_DISCARD,
1940 0,
1941 &mappedResource);
1942 if (FAILED(result)) {
1943 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11DeviceContext1::Map [vertex buffer]"), result);
1944 }
1945 SDL_memcpy(mappedResource.pData, vertexData, dataSizeInBytes);
1946 ID3D11DeviceContext_Unmap(rendererData->d3dContext, (ID3D11Resource *)rendererData->vertexBuffers[vbidx], 0);
1947 } else {
1948 D3D11_BUFFER_DESC vertexBufferDesc;
1949 D3D11_SUBRESOURCE_DATA vertexBufferData;
1950
1951 SAFE_RELEASE(rendererData->vertexBuffers[vbidx]);
1952
1953 SDL_zero(vertexBufferDesc);
1954 vertexBufferDesc.ByteWidth = (UINT)dataSizeInBytes;
1955 vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
1956 vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
1957 vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
1958
1959 SDL_zero(vertexBufferData);
1960 vertexBufferData.pSysMem = vertexData;
1961 vertexBufferData.SysMemPitch = 0;
1962 vertexBufferData.SysMemSlicePitch = 0;
1963
1964 result = ID3D11Device_CreateBuffer(rendererData->d3dDevice,
1965 &vertexBufferDesc,
1966 &vertexBufferData,
1967 &rendererData->vertexBuffers[vbidx]);
1968 if (FAILED(result)) {
1969 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateBuffer [vertex buffer]"), result);
1970 }
1971
1972 rendererData->vertexBufferSizes[vbidx] = dataSizeInBytes;
1973 }
1974
1975 ID3D11DeviceContext_IASetVertexBuffers(rendererData->d3dContext,
1976 0,
1977 1,
1978 &rendererData->vertexBuffers[vbidx],
1979 &stride,
1980 &offset);
1981
1982 rendererData->currentVertexBuffer++;
1983 if (rendererData->currentVertexBuffer >= SDL_arraysize(rendererData->vertexBuffers)) {
1984 rendererData->currentVertexBuffer = 0;
1985 }
1986
1987 return true;
1988}
1989
1990static bool D3D11_UpdateViewport(SDL_Renderer *renderer)
1991{
1992 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
1993 const SDL_Rect *viewport = &data->currentViewport;
1994 Float4X4 projection;
1995 Float4X4 view;
1996 SDL_FRect orientationAlignedViewport;
1997 BOOL swapDimensions;
1998 D3D11_VIEWPORT d3dviewport;
1999 const int rotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
2000
2001 if (viewport->w == 0 || viewport->h == 0) {
2002 /* If the viewport is empty, assume that it is because
2003 * SDL_CreateRenderer is calling it, and will call it again later
2004 * with a non-empty viewport.
2005 */
2006 // SDL_Log("%s, no viewport was set!", __FUNCTION__);
2007 return false;
2008 }
2009
2010 /* Make sure the SDL viewport gets rotated to that of the physical display's rotation.
2011 * Keep in mind here that the Y-axis will be been inverted (from Direct3D's
2012 * default coordinate system) so rotations will be done in the opposite
2013 * direction of the DXGI_MODE_ROTATION enumeration.
2014 */
2015 switch (rotation) {
2016 case DXGI_MODE_ROTATION_IDENTITY:
2017 projection = MatrixIdentity();
2018 break;
2019 case DXGI_MODE_ROTATION_ROTATE270:
2020 projection = MatrixRotationZ(SDL_PI_F * 0.5f);
2021 break;
2022 case DXGI_MODE_ROTATION_ROTATE180:
2023 projection = MatrixRotationZ(SDL_PI_F);
2024 break;
2025 case DXGI_MODE_ROTATION_ROTATE90:
2026 projection = MatrixRotationZ(-SDL_PI_F * 0.5f);
2027 break;
2028 default:
2029 return SDL_SetError("An unknown DisplayOrientation is being used");
2030 }
2031
2032 // Update the view matrix
2033 SDL_zero(view);
2034 view.m[0][0] = 2.0f / viewport->w;
2035 view.m[1][1] = -2.0f / viewport->h;
2036 view.m[2][2] = 1.0f;
2037 view.m[3][0] = -1.0f;
2038 view.m[3][1] = 1.0f;
2039 view.m[3][3] = 1.0f;
2040
2041 /* Combine the projection + view matrix together now, as both only get
2042 * set here (as of this writing, on Dec 26, 2013). When done, store it
2043 * for eventual transfer to the GPU.
2044 */
2045 data->vertexShaderConstantsData.projectionAndView = MatrixMultiply(
2046 view,
2047 projection);
2048
2049 /* Update the Direct3D viewport, which seems to be aligned to the
2050 * swap buffer's coordinate space, which is always in either
2051 * a landscape mode, for all Windows 8/RT devices, or a portrait mode,
2052 * for Windows Phone devices.
2053 */
2054 swapDimensions = D3D11_IsDisplayRotated90Degrees(rotation);
2055 if (swapDimensions) {
2056 orientationAlignedViewport.x = (float)viewport->y;
2057 orientationAlignedViewport.y = (float)viewport->x;
2058 orientationAlignedViewport.w = (float)viewport->h;
2059 orientationAlignedViewport.h = (float)viewport->w;
2060 } else {
2061 orientationAlignedViewport.x = (float)viewport->x;
2062 orientationAlignedViewport.y = (float)viewport->y;
2063 orientationAlignedViewport.w = (float)viewport->w;
2064 orientationAlignedViewport.h = (float)viewport->h;
2065 }
2066
2067 d3dviewport.TopLeftX = orientationAlignedViewport.x;
2068 d3dviewport.TopLeftY = orientationAlignedViewport.y;
2069 d3dviewport.Width = orientationAlignedViewport.w;
2070 d3dviewport.Height = orientationAlignedViewport.h;
2071 d3dviewport.MinDepth = 0.0f;
2072 d3dviewport.MaxDepth = 1.0f;
2073 // SDL_Log("%s: D3D viewport = {%f,%f,%f,%f}", __FUNCTION__, d3dviewport.TopLeftX, d3dviewport.TopLeftY, d3dviewport.Width, d3dviewport.Height);
2074 ID3D11DeviceContext_RSSetViewports(data->d3dContext, 1, &d3dviewport);
2075
2076 data->viewportDirty = false;
2077
2078 return true;
2079}
2080
2081static ID3D11RenderTargetView *D3D11_GetCurrentRenderTargetView(SDL_Renderer *renderer)
2082{
2083 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
2084 if (data->currentOffscreenRenderTargetView) {
2085 return data->currentOffscreenRenderTargetView;
2086 } else {
2087 return data->mainRenderTargetView;
2088 }
2089}
2090
2091static void D3D11_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const SDL_Texture *texture, D3D11_PixelShaderConstants *constants)
2092{
2093 float output_headroom;
2094
2095 SDL_zerop(constants);
2096
2097 constants->scRGB_output = (float)SDL_RenderingLinearSpace(renderer);
2098 constants->color_scale = cmd->data.draw.color_scale;
2099
2100 if (texture) {
2101 D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
2102
2103 switch (texture->format) {
2104 case SDL_PIXELFORMAT_YV12:
2105 case SDL_PIXELFORMAT_IYUV:
2106 constants->texture_type = TEXTURETYPE_YUV;
2107 constants->input_type = INPUTTYPE_SRGB;
2108 break;
2109 case SDL_PIXELFORMAT_NV12:
2110 constants->texture_type = TEXTURETYPE_NV12;
2111 constants->input_type = INPUTTYPE_SRGB;
2112 break;
2113 case SDL_PIXELFORMAT_NV21:
2114 constants->texture_type = TEXTURETYPE_NV21;
2115 constants->input_type = INPUTTYPE_SRGB;
2116 break;
2117 case SDL_PIXELFORMAT_P010:
2118 constants->texture_type = TEXTURETYPE_NV12;
2119 constants->input_type = INPUTTYPE_HDR10;
2120 break;
2121 default:
2122 constants->texture_type = TEXTURETYPE_RGB;
2123 if (texture->colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
2124 constants->input_type = INPUTTYPE_SCRGB;
2125 } else if (texture->colorspace == SDL_COLORSPACE_HDR10) {
2126 constants->input_type = INPUTTYPE_HDR10;
2127 } else {
2128 // The sampler will convert from sRGB to linear on load if working in linear colorspace
2129 constants->input_type = INPUTTYPE_UNSPECIFIED;
2130 }
2131 break;
2132 }
2133
2134 constants->sdr_white_point = texture->SDR_white_point;
2135
2136 if (renderer->target) {
2137 output_headroom = renderer->target->HDR_headroom;
2138 } else {
2139 output_headroom = renderer->HDR_headroom;
2140 }
2141
2142 if (texture->HDR_headroom > output_headroom) {
2143 constants->tonemap_method = TONEMAP_CHROME;
2144 constants->tonemap_factor1 = (output_headroom / (texture->HDR_headroom * texture->HDR_headroom));
2145 constants->tonemap_factor2 = (1.0f / output_headroom);
2146 }
2147
2148 if (textureData->YCbCr_matrix) {
2149 SDL_memcpy(constants->YCbCr_matrix, textureData->YCbCr_matrix, sizeof(constants->YCbCr_matrix));
2150 }
2151 }
2152}
2153
2154static bool D3D11_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd,
2155 D3D11_Shader shader, const D3D11_PixelShaderConstants *shader_constants,
2156 const int numShaderResources, ID3D11ShaderResourceView **shaderResources,
2157 ID3D11SamplerState *sampler, const Float4X4 *matrix)
2158
2159{
2160 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
2161 const Float4X4 *newmatrix = matrix ? matrix : &rendererData->identity;
2162 ID3D11RasterizerState *rasterizerState;
2163 ID3D11RenderTargetView *renderTargetView = D3D11_GetCurrentRenderTargetView(renderer);
2164 ID3D11ShaderResourceView *shaderResource;
2165 const SDL_BlendMode blendMode = cmd->data.draw.blend;
2166 ID3D11BlendState *blendState = NULL;
2167 bool updateSubresource = false;
2168 D3D11_PixelShaderState *shader_state = &rendererData->currentShaderState[shader];
2169 D3D11_PixelShaderConstants solid_constants;
2170
2171 if (numShaderResources > 0) {
2172 shaderResource = shaderResources[0];
2173 } else {
2174 shaderResource = NULL;
2175 }
2176
2177 // Make sure the render target isn't bound to a shader
2178 if (shaderResource != rendererData->currentShaderResource) {
2179 ID3D11ShaderResourceView *pNullResource = NULL;
2180 ID3D11DeviceContext_PSSetShaderResources(rendererData->d3dContext, 0, 1, &pNullResource);
2181 rendererData->currentShaderResource = NULL;
2182 }
2183
2184 if (renderTargetView != rendererData->currentRenderTargetView) {
2185 ID3D11DeviceContext_OMSetRenderTargets(rendererData->d3dContext,
2186 1,
2187 &renderTargetView,
2188 NULL);
2189 rendererData->currentRenderTargetView = renderTargetView;
2190 }
2191
2192 if (rendererData->viewportDirty) {
2193 if (D3D11_UpdateViewport(renderer)) {
2194 // vertexShaderConstantsData.projectionAndView has changed
2195 updateSubresource = true;
2196 }
2197 }
2198
2199 if (rendererData->cliprectDirty) {
2200 if (!rendererData->currentCliprectEnabled) {
2201 ID3D11DeviceContext_RSSetScissorRects(rendererData->d3dContext, 0, NULL);
2202 } else {
2203 D3D11_RECT scissorRect;
2204 if (!D3D11_GetViewportAlignedD3DRect(renderer, &rendererData->currentCliprect, &scissorRect, TRUE)) {
2205 // D3D11_GetViewportAlignedD3DRect will have set the SDL error
2206 return false;
2207 }
2208 ID3D11DeviceContext_RSSetScissorRects(rendererData->d3dContext, 1, &scissorRect);
2209 }
2210 rendererData->cliprectDirty = false;
2211 }
2212
2213 if (!rendererData->currentCliprectEnabled) {
2214 rasterizerState = rendererData->mainRasterizer;
2215 } else {
2216 rasterizerState = rendererData->clippedRasterizer;
2217 }
2218 if (rasterizerState != rendererData->currentRasterizerState) {
2219 ID3D11DeviceContext_RSSetState(rendererData->d3dContext, rasterizerState);
2220 rendererData->currentRasterizerState = rasterizerState;
2221 }
2222
2223 if (blendMode != SDL_BLENDMODE_NONE) {
2224 int i;
2225 for (i = 0; i < rendererData->blendModesCount; ++i) {
2226 if (blendMode == rendererData->blendModes[i].blendMode) {
2227 blendState = rendererData->blendModes[i].blendState;
2228 break;
2229 }
2230 }
2231 if (!blendState) {
2232 blendState = D3D11_CreateBlendState(renderer, blendMode);
2233 if (!blendState) {
2234 return false;
2235 }
2236 }
2237 }
2238 if (blendState != rendererData->currentBlendState) {
2239 ID3D11DeviceContext_OMSetBlendState(rendererData->d3dContext, blendState, 0, 0xFFFFFFFF);
2240 rendererData->currentBlendState = blendState;
2241 }
2242
2243 if (!shader_constants) {
2244 D3D11_SetupShaderConstants(renderer, cmd, NULL, &solid_constants);
2245 shader_constants = &solid_constants;
2246 }
2247
2248 if (!shader_state->constants ||
2249 SDL_memcmp(shader_constants, &shader_state->shader_constants, sizeof(*shader_constants)) != 0) {
2250 SAFE_RELEASE(shader_state->constants);
2251
2252 D3D11_BUFFER_DESC desc;
2253 SDL_zero(desc);
2254 desc.Usage = D3D11_USAGE_DEFAULT;
2255 desc.ByteWidth = sizeof(*shader_constants);
2256 desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
2257
2258 D3D11_SUBRESOURCE_DATA data;
2259 SDL_zero(data);
2260 data.pSysMem = shader_constants;
2261
2262 HRESULT result = ID3D11Device_CreateBuffer(rendererData->d3dDevice, &desc, &data, &shader_state->constants);
2263 if (FAILED(result)) {
2264 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device::CreateBuffer [create shader constants]"), result);
2265 return false;
2266 }
2267 SDL_memcpy(&shader_state->shader_constants, shader_constants, sizeof(*shader_constants));
2268
2269 // Force the shader parameters to be re-set
2270 rendererData->currentShader = SHADER_NONE;
2271 }
2272 if (shader != rendererData->currentShader) {
2273 if (!rendererData->pixelShaders[shader]) {
2274 if (!D3D11_CreatePixelShader(rendererData->d3dDevice, shader, &rendererData->pixelShaders[shader])) {
2275 return false;
2276 }
2277 }
2278 ID3D11DeviceContext_PSSetShader(rendererData->d3dContext, rendererData->pixelShaders[shader], NULL, 0);
2279 if (shader_state->constants) {
2280 ID3D11DeviceContext_PSSetConstantBuffers(rendererData->d3dContext, 0, 1, &shader_state->constants);
2281 }
2282 rendererData->currentShader = shader;
2283 }
2284 if (shaderResource != rendererData->currentShaderResource) {
2285 ID3D11DeviceContext_PSSetShaderResources(rendererData->d3dContext, 0, numShaderResources, shaderResources);
2286 rendererData->currentShaderResource = shaderResource;
2287 }
2288 if (sampler != rendererData->currentSampler) {
2289 ID3D11DeviceContext_PSSetSamplers(rendererData->d3dContext, 0, 1, &sampler);
2290 rendererData->currentSampler = sampler;
2291 }
2292
2293 if (updateSubresource == true || SDL_memcmp(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix)) != 0) {
2294 SDL_copyp(&rendererData->vertexShaderConstantsData.model, newmatrix);
2295 ID3D11DeviceContext_UpdateSubresource(rendererData->d3dContext,
2296 (ID3D11Resource *)rendererData->vertexShaderConstants,
2297 0,
2298 NULL,
2299 &rendererData->vertexShaderConstantsData,
2300 0,
2301 0);
2302 }
2303
2304 return true;
2305}
2306
2307static bool D3D11_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const Float4X4 *matrix)
2308{
2309 SDL_Texture *texture = cmd->data.draw.texture;
2310 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
2311 D3D11_TextureData *textureData = (D3D11_TextureData *)texture->internal;
2312 ID3D11SamplerState *textureSampler;
2313 D3D11_PixelShaderConstants constants;
2314
2315 if (!textureData) {
2316 return SDL_SetError("Texture is not currently available");
2317 }
2318
2319 D3D11_SetupShaderConstants(renderer, cmd, texture, &constants);
2320
2321 switch (textureData->scaleMode) {
2322 case D3D11_FILTER_MIN_MAG_MIP_POINT:
2323 switch (cmd->data.draw.texture_address_mode) {
2324 case SDL_TEXTURE_ADDRESS_CLAMP:
2325 textureSampler = rendererData->samplers[D3D11_SAMPLER_NEAREST_CLAMP];
2326 break;
2327 case SDL_TEXTURE_ADDRESS_WRAP:
2328 textureSampler = rendererData->samplers[D3D11_SAMPLER_NEAREST_WRAP];
2329 break;
2330 default:
2331 return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
2332 }
2333 break;
2334 case D3D11_FILTER_MIN_MAG_MIP_LINEAR:
2335 switch (cmd->data.draw.texture_address_mode) {
2336 case SDL_TEXTURE_ADDRESS_CLAMP:
2337 textureSampler = rendererData->samplers[D3D11_SAMPLER_LINEAR_CLAMP];
2338 break;
2339 case SDL_TEXTURE_ADDRESS_WRAP:
2340 textureSampler = rendererData->samplers[D3D11_SAMPLER_LINEAR_WRAP];
2341 break;
2342 default:
2343 return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
2344 }
2345 break;
2346 default:
2347 return SDL_SetError("Unknown scale mode: %d", textureData->scaleMode);
2348 }
2349#ifdef SDL_HAVE_YUV
2350 if (textureData->yuv) {
2351 ID3D11ShaderResourceView *shaderResources[3];
2352
2353 shaderResources[0] = textureData->mainTextureResourceView;
2354 shaderResources[1] = textureData->mainTextureResourceViewU;
2355 shaderResources[2] = textureData->mainTextureResourceViewV;
2356
2357 return D3D11_SetDrawState(renderer, cmd, textureData->shader, &constants,
2358 SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
2359
2360 } else if (textureData->nv12) {
2361 ID3D11ShaderResourceView *shaderResources[2];
2362
2363 shaderResources[0] = textureData->mainTextureResourceView;
2364 shaderResources[1] = textureData->mainTextureResourceViewNV;
2365
2366 return D3D11_SetDrawState(renderer, cmd, textureData->shader, &constants,
2367 SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
2368 }
2369#endif // SDL_HAVE_YUV
2370 return D3D11_SetDrawState(renderer, cmd, textureData->shader, &constants,
2371 1, &textureData->mainTextureResourceView, textureSampler, matrix);
2372}
2373
2374static void D3D11_DrawPrimitives(SDL_Renderer *renderer, D3D11_PRIMITIVE_TOPOLOGY primitiveTopology, const size_t vertexStart, const size_t vertexCount)
2375{
2376 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
2377 ID3D11DeviceContext_IASetPrimitiveTopology(rendererData->d3dContext, primitiveTopology);
2378 ID3D11DeviceContext_Draw(rendererData->d3dContext, (UINT)vertexCount, (UINT)vertexStart);
2379}
2380
2381static void D3D11_InvalidateCachedState(SDL_Renderer *renderer)
2382{
2383 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
2384 data->currentRenderTargetView = NULL;
2385 data->currentRasterizerState = NULL;
2386 data->currentBlendState = NULL;
2387 data->currentShader = SHADER_NONE;
2388 data->currentShaderResource = NULL;
2389 data->currentSampler = NULL;
2390 data->cliprectDirty = true;
2391 data->viewportDirty = true;
2392}
2393
2394static bool D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
2395{
2396 D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->internal;
2397 const int viewportRotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
2398
2399 if (!rendererData->d3dDevice) {
2400 return SDL_SetError("Device lost and couldn't be recovered");
2401 }
2402
2403 if (rendererData->pixelSizeChanged) {
2404 D3D11_UpdateForWindowSizeChange(renderer);
2405 rendererData->pixelSizeChanged = false;
2406 }
2407
2408 if (rendererData->currentViewportRotation != viewportRotation) {
2409 rendererData->currentViewportRotation = viewportRotation;
2410 rendererData->viewportDirty = true;
2411 }
2412
2413 if (!D3D11_UpdateVertexBuffer(renderer, vertices, vertsize)) {
2414 return false;
2415 }
2416
2417 while (cmd) {
2418 switch (cmd->command) {
2419 case SDL_RENDERCMD_SETDRAWCOLOR:
2420 {
2421 break; // this isn't currently used in this render backend.
2422 }
2423
2424 case SDL_RENDERCMD_SETVIEWPORT:
2425 {
2426 SDL_Rect *viewport = &rendererData->currentViewport;
2427 if (SDL_memcmp(viewport, &cmd->data.viewport.rect, sizeof(cmd->data.viewport.rect)) != 0) {
2428 SDL_copyp(viewport, &cmd->data.viewport.rect);
2429 rendererData->viewportDirty = true;
2430 rendererData->cliprectDirty = true;
2431 }
2432 break;
2433 }
2434
2435 case SDL_RENDERCMD_SETCLIPRECT:
2436 {
2437 const SDL_Rect *rect = &cmd->data.cliprect.rect;
2438 if (rendererData->currentCliprectEnabled != cmd->data.cliprect.enabled) {
2439 rendererData->currentCliprectEnabled = cmd->data.cliprect.enabled;
2440 rendererData->cliprectDirty = true;
2441 }
2442 if (SDL_memcmp(&rendererData->currentCliprect, rect, sizeof(*rect)) != 0) {
2443 SDL_copyp(&rendererData->currentCliprect, rect);
2444 rendererData->cliprectDirty = true;
2445 }
2446 break;
2447 }
2448
2449 case SDL_RENDERCMD_CLEAR:
2450 {
2451 bool convert_color = SDL_RenderingLinearSpace(renderer);
2452 SDL_FColor color = cmd->data.color.color;
2453 if (convert_color) {
2454 SDL_ConvertToLinear(&color);
2455 }
2456 color.r *= cmd->data.color.color_scale;
2457 color.g *= cmd->data.color.color_scale;
2458 color.b *= cmd->data.color.color_scale;
2459 ID3D11DeviceContext_ClearRenderTargetView(rendererData->d3dContext, D3D11_GetCurrentRenderTargetView(renderer), &color.r);
2460 break;
2461 }
2462
2463 case SDL_RENDERCMD_DRAW_POINTS:
2464 {
2465 const size_t count = cmd->data.draw.count;
2466 const size_t first = cmd->data.draw.first;
2467 const size_t start = first / sizeof(D3D11_VertexPositionColor);
2468 D3D11_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, 0, NULL, NULL, NULL);
2469 D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, start, count);
2470 break;
2471 }
2472
2473 case SDL_RENDERCMD_DRAW_LINES:
2474 {
2475 const size_t count = cmd->data.draw.count;
2476 const size_t first = cmd->data.draw.first;
2477 const size_t start = first / sizeof(D3D11_VertexPositionColor);
2478 const D3D11_VertexPositionColor *verts = (D3D11_VertexPositionColor *)(((Uint8 *)vertices) + first);
2479 D3D11_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, 0, NULL, NULL, NULL);
2480 D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP, start, count);
2481 if (verts[0].pos.x != verts[count - 1].pos.x || verts[0].pos.y != verts[count - 1].pos.y) {
2482 D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST, start + (count - 1), 1);
2483 }
2484 break;
2485 }
2486
2487 case SDL_RENDERCMD_FILL_RECTS: // unused
2488 break;
2489
2490 case SDL_RENDERCMD_COPY: // unused
2491 break;
2492
2493 case SDL_RENDERCMD_COPY_EX: // unused
2494 break;
2495
2496 case SDL_RENDERCMD_GEOMETRY:
2497 {
2498 SDL_Texture *texture = cmd->data.draw.texture;
2499 const size_t count = cmd->data.draw.count;
2500 const size_t first = cmd->data.draw.first;
2501 const size_t start = first / sizeof(D3D11_VertexPositionColor);
2502
2503 if (texture) {
2504 D3D11_SetCopyState(renderer, cmd, NULL);
2505 } else {
2506 D3D11_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, 0, NULL, NULL, NULL);
2507 }
2508
2509 D3D11_DrawPrimitives(renderer, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, start, count);
2510 break;
2511 }
2512
2513 case SDL_RENDERCMD_NO_OP:
2514 break;
2515 }
2516
2517 cmd = cmd->next;
2518 }
2519
2520 return true;
2521}
2522
2523static SDL_Surface *D3D11_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
2524{
2525 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
2526 ID3D11RenderTargetView *renderTargetView = NULL;
2527 ID3D11Texture2D *backBuffer = NULL;
2528 ID3D11Texture2D *stagingTexture = NULL;
2529 HRESULT result;
2530 D3D11_TEXTURE2D_DESC stagingTextureDesc;
2531 D3D11_RECT srcRect = { 0, 0, 0, 0 };
2532 D3D11_BOX srcBox;
2533 D3D11_MAPPED_SUBRESOURCE textureMemory;
2534 SDL_Surface *output = NULL;
2535
2536 renderTargetView = D3D11_GetCurrentRenderTargetView(renderer);
2537 if (!renderTargetView) {
2538 SDL_SetError("%s, ID3D11DeviceContext::OMGetRenderTargets failed", __FUNCTION__);
2539 goto done;
2540 }
2541
2542 ID3D11View_GetResource(renderTargetView, (ID3D11Resource **)&backBuffer);
2543 if (!backBuffer) {
2544 SDL_SetError("%s, ID3D11View::GetResource failed", __FUNCTION__);
2545 goto done;
2546 }
2547
2548 // Create a staging texture to copy the screen's data to:
2549 ID3D11Texture2D_GetDesc(backBuffer, &stagingTextureDesc);
2550 stagingTextureDesc.Width = rect->w;
2551 stagingTextureDesc.Height = rect->h;
2552 stagingTextureDesc.BindFlags = 0;
2553 stagingTextureDesc.MiscFlags = 0;
2554 stagingTextureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
2555 stagingTextureDesc.Usage = D3D11_USAGE_STAGING;
2556 result = ID3D11Device_CreateTexture2D(data->d3dDevice,
2557 &stagingTextureDesc,
2558 NULL,
2559 &stagingTexture);
2560 if (FAILED(result)) {
2561 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateTexture2D [create staging texture]"), result);
2562 goto done;
2563 }
2564
2565 // Copy the desired portion of the back buffer to the staging texture:
2566 if (!D3D11_GetViewportAlignedD3DRect(renderer, rect, &srcRect, FALSE)) {
2567 // D3D11_GetViewportAlignedD3DRect will have set the SDL error
2568 goto done;
2569 }
2570
2571 srcBox.left = srcRect.left;
2572 srcBox.right = srcRect.right;
2573 srcBox.top = srcRect.top;
2574 srcBox.bottom = srcRect.bottom;
2575 srcBox.front = 0;
2576 srcBox.back = 1;
2577 ID3D11DeviceContext_CopySubresourceRegion(data->d3dContext,
2578 (ID3D11Resource *)stagingTexture,
2579 0,
2580 0, 0, 0,
2581 (ID3D11Resource *)backBuffer,
2582 0,
2583 &srcBox);
2584
2585 // Map the staging texture's data to CPU-accessible memory:
2586 result = ID3D11DeviceContext_Map(data->d3dContext,
2587 (ID3D11Resource *)stagingTexture,
2588 0,
2589 D3D11_MAP_READ,
2590 0,
2591 &textureMemory);
2592 if (FAILED(result)) {
2593 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11DeviceContext1::Map [map staging texture]"), result);
2594 goto done;
2595 }
2596
2597 output = SDL_DuplicatePixels(
2598 rect->w, rect->h,
2599 D3D11_DXGIFormatToSDLPixelFormat(stagingTextureDesc.Format),
2600 renderer->target ? renderer->target->colorspace : renderer->output_colorspace,
2601 textureMemory.pData,
2602 textureMemory.RowPitch);
2603
2604 // Unmap the texture:
2605 ID3D11DeviceContext_Unmap(data->d3dContext,
2606 (ID3D11Resource *)stagingTexture,
2607 0);
2608
2609done:
2610 SAFE_RELEASE(backBuffer);
2611 SAFE_RELEASE(stagingTexture);
2612 return output;
2613}
2614
2615static bool D3D11_RenderPresent(SDL_Renderer *renderer)
2616{
2617 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
2618 HRESULT result;
2619 DXGI_PRESENT_PARAMETERS parameters;
2620
2621 if (!data->d3dDevice) {
2622 return SDL_SetError("Device lost and couldn't be recovered");
2623 }
2624
2625 SDL_zero(parameters);
2626
2627 /* The application may optionally specify "dirty" or "scroll"
2628 * rects to improve efficiency in certain scenarios.
2629 */
2630 result = IDXGISwapChain1_Present1(data->swapChain, data->syncInterval, data->presentFlags, &parameters);
2631
2632 /* Discard the contents of the render target.
2633 * This is a valid operation only when the existing contents will be entirely
2634 * overwritten. If dirty or scroll rects are used, this call should be removed.
2635 */
2636 ID3D11DeviceContext1_DiscardView(data->d3dContext, (ID3D11View *)data->mainRenderTargetView);
2637
2638 // When the present flips, it unbinds the current view, so bind it again on the next draw call
2639 data->currentRenderTargetView = NULL;
2640
2641 if (FAILED(result) && result != DXGI_ERROR_WAS_STILL_DRAWING) {
2642 /* If the device was removed either by a disconnect or a driver upgrade, we
2643 * must recreate all device resources.
2644 */
2645 if (result == DXGI_ERROR_DEVICE_REMOVED) {
2646 if (D3D11_HandleDeviceLost(renderer)) {
2647 SDL_SetError("Present failed, device lost");
2648 } else {
2649 // Recovering from device lost failed, error is already set
2650 }
2651 } else if (result == DXGI_ERROR_INVALID_CALL) {
2652 // We probably went through a fullscreen <-> windowed transition
2653 D3D11_CreateWindowSizeDependentResources(renderer);
2654 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain::Present"), result);
2655 } else {
2656 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain::Present"), result);
2657 }
2658 return false;
2659 }
2660 return true;
2661}
2662
2663static bool D3D11_SetVSync(SDL_Renderer *renderer, const int vsync)
2664{
2665 D3D11_RenderData *data = (D3D11_RenderData *)renderer->internal;
2666
2667 if (vsync < 0) {
2668 return SDL_Unsupported();
2669 }
2670
2671 if (vsync > 0) {
2672 data->syncInterval = vsync;
2673 data->presentFlags = 0;
2674 } else {
2675 data->syncInterval = 0;
2676 data->presentFlags = DXGI_PRESENT_DO_NOT_WAIT;
2677 }
2678 return true;
2679}
2680
2681static bool D3D11_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
2682{
2683 D3D11_RenderData *data;
2684
2685 HWND hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
2686 if (!hwnd) {
2687 return SDL_SetError("Couldn't get window handle");
2688 }
2689
2690 SDL_SetupRendererColorspace(renderer, create_props);
2691
2692 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB &&
2693 renderer->output_colorspace != SDL_COLORSPACE_SRGB_LINEAR
2694 /*&& renderer->output_colorspace != SDL_COLORSPACE_HDR10*/) {
2695 return SDL_SetError("Unsupported output colorspace");
2696 }
2697
2698 data = (D3D11_RenderData *)SDL_calloc(1, sizeof(*data));
2699 if (!data) {
2700 return false;
2701 }
2702
2703 data->identity = MatrixIdentity();
2704
2705 renderer->WindowEvent = D3D11_WindowEvent;
2706 renderer->SupportsBlendMode = D3D11_SupportsBlendMode;
2707 renderer->CreateTexture = D3D11_CreateTexture;
2708 renderer->UpdateTexture = D3D11_UpdateTexture;
2709#ifdef SDL_HAVE_YUV
2710 renderer->UpdateTextureYUV = D3D11_UpdateTextureYUV;
2711 renderer->UpdateTextureNV = D3D11_UpdateTextureNV;
2712#endif
2713 renderer->LockTexture = D3D11_LockTexture;
2714 renderer->UnlockTexture = D3D11_UnlockTexture;
2715 renderer->SetTextureScaleMode = D3D11_SetTextureScaleMode;
2716 renderer->SetRenderTarget = D3D11_SetRenderTarget;
2717 renderer->QueueSetViewport = D3D11_QueueNoOp;
2718 renderer->QueueSetDrawColor = D3D11_QueueNoOp;
2719 renderer->QueueDrawPoints = D3D11_QueueDrawPoints;
2720 renderer->QueueDrawLines = D3D11_QueueDrawPoints; // lines and points queue vertices the same way.
2721 renderer->QueueGeometry = D3D11_QueueGeometry;
2722 renderer->InvalidateCachedState = D3D11_InvalidateCachedState;
2723 renderer->RunCommandQueue = D3D11_RunCommandQueue;
2724 renderer->RenderReadPixels = D3D11_RenderReadPixels;
2725 renderer->RenderPresent = D3D11_RenderPresent;
2726 renderer->DestroyTexture = D3D11_DestroyTexture;
2727 renderer->DestroyRenderer = D3D11_DestroyRenderer;
2728 renderer->SetVSync = D3D11_SetVSync;
2729 renderer->internal = data;
2730 D3D11_InvalidateCachedState(renderer);
2731
2732 renderer->name = D3D11_RenderDriver.name;
2733 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
2734 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
2735 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
2736 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
2737 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
2738 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
2739 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
2740 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
2741 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
2742 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010);
2743
2744 data->syncInterval = 0;
2745 data->presentFlags = DXGI_PRESENT_DO_NOT_WAIT;
2746
2747 /* HACK: make sure the SDL_Renderer references the SDL_Window data now, in
2748 * order to give init functions access to the underlying window handle:
2749 */
2750 renderer->window = window;
2751
2752 // Initialize Direct3D resources
2753 if (FAILED(D3D11_CreateDeviceResources(renderer))) {
2754 return false;
2755 }
2756 if (FAILED(D3D11_CreateWindowSizeDependentResources(renderer))) {
2757 return false;
2758 }
2759
2760 return true;
2761}
2762
2763SDL_RenderDriver D3D11_RenderDriver = {
2764 D3D11_CreateRenderer, "direct3d11"
2765};
2766
2767#endif // SDL_VIDEO_RENDER_D3D11
diff --git a/SDL-3.2.8/src/render/direct3d11/SDL_shaders_d3d11.c b/SDL-3.2.8/src/render/direct3d11/SDL_shaders_d3d11.c
new file mode 100644
index 0000000..18965e2
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/SDL_shaders_d3d11.c
@@ -0,0 +1,116 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_D3D11
24
25#define COBJMACROS
26#include "../../core/windows/SDL_windows.h"
27#include <d3d11_1.h>
28
29#include "SDL_shaders_d3d11.h"
30
31#define SDL_COMPOSE_ERROR(str) SDL_STRINGIFY_ARG(__FUNCTION__) ", " str
32
33#if SDL_WINAPI_FAMILY_PHONE
34#error Need to build shaders with level_9_3
35#endif
36
37// The shaders here were compiled with compile_shaders.bat
38
39#define g_main D3D11_PixelShader_Colors
40#include "D3D11_PixelShader_Colors.h"
41#undef g_main
42
43#define g_main D3D11_PixelShader_Textures
44#include "D3D11_PixelShader_Textures.h"
45#undef g_main
46
47#define g_main D3D11_PixelShader_Advanced
48#include "D3D11_PixelShader_Advanced.h"
49#undef g_main
50
51#define g_main D3D11_VertexShader
52#include "D3D11_VertexShader.h"
53#undef g_main
54
55
56static struct
57{
58 const void *shader_data;
59 SIZE_T shader_size;
60} D3D11_shaders[] = {
61 { NULL, 0 },
62 { D3D11_PixelShader_Colors, sizeof(D3D11_PixelShader_Colors) },
63 { D3D11_PixelShader_Textures, sizeof(D3D11_PixelShader_Textures) },
64 { D3D11_PixelShader_Advanced, sizeof(D3D11_PixelShader_Advanced) },
65};
66SDL_COMPILE_TIME_ASSERT(D3D11_shaders, SDL_arraysize(D3D11_shaders) == NUM_SHADERS);
67
68bool D3D11_CreateVertexShader(ID3D11Device1 *d3dDevice, ID3D11VertexShader **vertexShader, ID3D11InputLayout **inputLayout)
69{
70 // Declare how the input layout for SDL's vertex shader will be setup:
71 const D3D11_INPUT_ELEMENT_DESC vertexDesc[] = {
72 { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
73 { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 },
74 { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 },
75 };
76 HRESULT result;
77
78 // Load in SDL's one and only vertex shader:
79 result = ID3D11Device_CreateVertexShader(d3dDevice,
80 D3D11_VertexShader,
81 sizeof(D3D11_VertexShader),
82 NULL,
83 vertexShader);
84 if (FAILED(result)) {
85 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateVertexShader"), result);
86 }
87
88 // Create an input layout for SDL's vertex shader:
89 result = ID3D11Device_CreateInputLayout(d3dDevice,
90 vertexDesc,
91 ARRAYSIZE(vertexDesc),
92 D3D11_VertexShader,
93 sizeof(D3D11_VertexShader),
94 inputLayout);
95 if (FAILED(result)) {
96 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreateInputLayout"), result);
97 }
98 return true;
99}
100
101bool D3D11_CreatePixelShader(ID3D11Device1 *d3dDevice, D3D11_Shader shader, ID3D11PixelShader **pixelShader)
102{
103 HRESULT result;
104
105 result = ID3D11Device_CreatePixelShader(d3dDevice,
106 D3D11_shaders[shader].shader_data,
107 D3D11_shaders[shader].shader_size,
108 NULL,
109 pixelShader);
110 if (FAILED(result)) {
111 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D11Device1::CreatePixelShader"), result);
112 }
113 return true;
114}
115
116#endif // SDL_VIDEO_RENDER_D3D11
diff --git a/SDL-3.2.8/src/render/direct3d11/SDL_shaders_d3d11.h b/SDL-3.2.8/src/render/direct3d11/SDL_shaders_d3d11.h
new file mode 100644
index 0000000..2279fb0
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/SDL_shaders_d3d11.h
@@ -0,0 +1,35 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23// D3D11 shader implementation
24
25typedef enum
26{
27 SHADER_NONE,
28 SHADER_SOLID,
29 SHADER_RGB,
30 SHADER_ADVANCED,
31 NUM_SHADERS
32} D3D11_Shader;
33
34extern bool D3D11_CreateVertexShader(ID3D11Device1 *d3dDevice, ID3D11VertexShader **vertexShader, ID3D11InputLayout **inputLayout);
35extern bool D3D11_CreatePixelShader(ID3D11Device1 *d3dDevice, D3D11_Shader shader, ID3D11PixelShader **pixelShader);
diff --git a/SDL-3.2.8/src/render/direct3d11/compile_shaders.bat b/SDL-3.2.8/src/render/direct3d11/compile_shaders.bat
new file mode 100644
index 0000000..51d2a34
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d11/compile_shaders.bat
@@ -0,0 +1,4 @@
1fxc /T ps_4_0_level_9_1 /Fh D3D11_PixelShader_Colors.h D3D11_PixelShader_Colors.hlsl
2fxc /T ps_4_0_level_9_1 /Fh D3D11_PixelShader_Textures.h D3D11_PixelShader_Textures.hlsl
3fxc /T ps_5_0 /Fh D3D11_PixelShader_Advanced.h D3D11_PixelShader_Advanced.hlsl
4fxc /T vs_4_0_level_9_1 /Fh D3D11_VertexShader.h D3D11_VertexShader.hlsl
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Advanced.h b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Advanced.h
new file mode 100644
index 0000000..b8f40fe
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Advanced.h
@@ -0,0 +1,1389 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; SV_Position 0 xyzw 0 POS float
8; TEXCOORD 0 xy 1 NONE float xy
9; COLOR 0 xyzw 2 NONE float xyzw
10;
11;
12; Output signature:
13;
14; Name Index Mask Register SysValue Format Used
15; -------------------- ----- ------ -------- -------- ------- ------
16; SV_Target 0 xyzw 0 TARGET float xyzw
17;
18; shader hash: f6874446eaee41c102142c02d5bb3ab7
19;
20; Pipeline Runtime Information:
21;
22; Pixel Shader
23; DepthOutput=0
24; SampleFrequency=0
25;
26;
27; Input signature:
28;
29; Name Index InterpMode DynIdx
30; -------------------- ----- ---------------------- ------
31; SV_Position 0 noperspective
32; TEXCOORD 0 linear
33; COLOR 0 linear
34;
35; Output signature:
36;
37; Name Index InterpMode DynIdx
38; -------------------- ----- ---------------------- ------
39; SV_Target 0
40;
41; Buffer Definitions:
42;
43; cbuffer Constants
44; {
45;
46; struct Constants
47; {
48;
49; float scRGB_output; ; Offset: 0
50; float texture_type; ; Offset: 4
51; float input_type; ; Offset: 8
52; float color_scale; ; Offset: 12
53; float tonemap_method; ; Offset: 16
54; float tonemap_factor1; ; Offset: 20
55; float tonemap_factor2; ; Offset: 24
56; float sdr_white_point; ; Offset: 28
57; float4 Yoffset; ; Offset: 32
58; float4 Rcoeff; ; Offset: 48
59; float4 Gcoeff; ; Offset: 64
60; float4 Bcoeff; ; Offset: 80
61;
62; } Constants; ; Offset: 0 Size: 96
63;
64; }
65;
66;
67; Resource Bindings:
68;
69; Name Type Format Dim ID HLSL Bind Count
70; ------------------------------ ---------- ------- ----------- ------- -------------- ------
71; Constants cbuffer NA NA CB0 cb1 1
72; sampler0 sampler NA NA S0 s0 1
73; texture0 texture f32 2d T0 t0 1
74; texture1 texture f32 2d T1 t1 1
75; texture2 texture f32 2d T2 t2 1
76;
77;
78; ViewId state:
79;
80; Number of inputs: 12, outputs: 4
81; Outputs dependent on ViewId: { }
82; Inputs contributing to computation of Outputs:
83; output 0 depends on inputs: { 4, 5, 8 }
84; output 1 depends on inputs: { 4, 5, 9 }
85; output 2 depends on inputs: { 4, 5, 10 }
86; output 3 depends on inputs: { 4, 5, 11 }
87;
88target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
89target triple = "dxil-ms-dx"
90
91%dx.types.Handle = type { i8* }
92%dx.types.CBufRet.f32 = type { float, float, float, float }
93%dx.types.ResRet.f32 = type { float, float, float, float, i32 }
94%"class.Texture2D<vector<float, 4> >" = type { <4 x float>, %"class.Texture2D<vector<float, 4> >::mips_type" }
95%"class.Texture2D<vector<float, 4> >::mips_type" = type { i32 }
96%Constants = type { float, float, float, float, float, float, float, float, <4 x float>, <4 x float>, <4 x float>, <4 x float> }
97%struct.SamplerState = type { i32 }
98
99define void @main() {
100 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 2, i32 2, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
101 %2 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 1, i32 1, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
102 %3 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
103 %4 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 3, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
104 %5 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 1, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
105 %6 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
106 %7 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
107 %8 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
108 %9 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
109 %10 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
110 %11 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
111 %12 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 0) ; CBufferLoadLegacy(handle,regIndex)
112 %13 = extractvalue %dx.types.CBufRet.f32 %12, 1
113 %14 = fcmp fast oeq float %13, 0.000000e+00
114 br i1 %14, label %114, label %15
115
116; <label>:15 ; preds = %0
117 %16 = fcmp fast oeq float %13, 1.000000e+00
118 br i1 %16, label %17, label %23
119
120; <label>:17 ; preds = %15
121 %18 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %3, %dx.types.Handle %4, float %10, float %11, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
122 %19 = extractvalue %dx.types.ResRet.f32 %18, 0
123 %20 = extractvalue %dx.types.ResRet.f32 %18, 1
124 %21 = extractvalue %dx.types.ResRet.f32 %18, 2
125 %22 = extractvalue %dx.types.ResRet.f32 %18, 3
126 br label %114
127
128; <label>:23 ; preds = %15
129 %24 = fcmp fast oeq float %13, 2.000000e+00
130 br i1 %24, label %25, label %53
131
132; <label>:25 ; preds = %23
133 %26 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %3, %dx.types.Handle %4, float %10, float %11, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
134 %27 = extractvalue %dx.types.ResRet.f32 %26, 0
135 %28 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %2, %dx.types.Handle %4, float %10, float %11, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
136 %29 = extractvalue %dx.types.ResRet.f32 %28, 0
137 %30 = extractvalue %dx.types.ResRet.f32 %28, 1
138 %31 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 2) ; CBufferLoadLegacy(handle,regIndex)
139 %32 = extractvalue %dx.types.CBufRet.f32 %31, 0
140 %33 = extractvalue %dx.types.CBufRet.f32 %31, 1
141 %34 = extractvalue %dx.types.CBufRet.f32 %31, 2
142 %35 = fadd fast float %32, %27
143 %36 = fadd fast float %33, %29
144 %37 = fadd fast float %34, %30
145 %38 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 3) ; CBufferLoadLegacy(handle,regIndex)
146 %39 = extractvalue %dx.types.CBufRet.f32 %38, 0
147 %40 = extractvalue %dx.types.CBufRet.f32 %38, 1
148 %41 = extractvalue %dx.types.CBufRet.f32 %38, 2
149 %42 = call float @dx.op.dot3.f32(i32 55, float %35, float %36, float %37, float %39, float %40, float %41) ; Dot3(ax,ay,az,bx,by,bz)
150 %43 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 4) ; CBufferLoadLegacy(handle,regIndex)
151 %44 = extractvalue %dx.types.CBufRet.f32 %43, 0
152 %45 = extractvalue %dx.types.CBufRet.f32 %43, 1
153 %46 = extractvalue %dx.types.CBufRet.f32 %43, 2
154 %47 = call float @dx.op.dot3.f32(i32 55, float %35, float %36, float %37, float %44, float %45, float %46) ; Dot3(ax,ay,az,bx,by,bz)
155 %48 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 5) ; CBufferLoadLegacy(handle,regIndex)
156 %49 = extractvalue %dx.types.CBufRet.f32 %48, 0
157 %50 = extractvalue %dx.types.CBufRet.f32 %48, 1
158 %51 = extractvalue %dx.types.CBufRet.f32 %48, 2
159 %52 = call float @dx.op.dot3.f32(i32 55, float %35, float %36, float %37, float %49, float %50, float %51) ; Dot3(ax,ay,az,bx,by,bz)
160 br label %114
161
162; <label>:53 ; preds = %23
163 %54 = fcmp fast oeq float %13, 3.000000e+00
164 br i1 %54, label %55, label %83
165
166; <label>:55 ; preds = %53
167 %56 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %3, %dx.types.Handle %4, float %10, float %11, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
168 %57 = extractvalue %dx.types.ResRet.f32 %56, 0
169 %58 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %2, %dx.types.Handle %4, float %10, float %11, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
170 %59 = extractvalue %dx.types.ResRet.f32 %58, 0
171 %60 = extractvalue %dx.types.ResRet.f32 %58, 1
172 %61 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 2) ; CBufferLoadLegacy(handle,regIndex)
173 %62 = extractvalue %dx.types.CBufRet.f32 %61, 0
174 %63 = extractvalue %dx.types.CBufRet.f32 %61, 1
175 %64 = extractvalue %dx.types.CBufRet.f32 %61, 2
176 %65 = fadd fast float %62, %57
177 %66 = fadd fast float %63, %60
178 %67 = fadd fast float %64, %59
179 %68 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 3) ; CBufferLoadLegacy(handle,regIndex)
180 %69 = extractvalue %dx.types.CBufRet.f32 %68, 0
181 %70 = extractvalue %dx.types.CBufRet.f32 %68, 1
182 %71 = extractvalue %dx.types.CBufRet.f32 %68, 2
183 %72 = call float @dx.op.dot3.f32(i32 55, float %65, float %66, float %67, float %69, float %70, float %71) ; Dot3(ax,ay,az,bx,by,bz)
184 %73 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 4) ; CBufferLoadLegacy(handle,regIndex)
185 %74 = extractvalue %dx.types.CBufRet.f32 %73, 0
186 %75 = extractvalue %dx.types.CBufRet.f32 %73, 1
187 %76 = extractvalue %dx.types.CBufRet.f32 %73, 2
188 %77 = call float @dx.op.dot3.f32(i32 55, float %65, float %66, float %67, float %74, float %75, float %76) ; Dot3(ax,ay,az,bx,by,bz)
189 %78 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 5) ; CBufferLoadLegacy(handle,regIndex)
190 %79 = extractvalue %dx.types.CBufRet.f32 %78, 0
191 %80 = extractvalue %dx.types.CBufRet.f32 %78, 1
192 %81 = extractvalue %dx.types.CBufRet.f32 %78, 2
193 %82 = call float @dx.op.dot3.f32(i32 55, float %65, float %66, float %67, float %79, float %80, float %81) ; Dot3(ax,ay,az,bx,by,bz)
194 br label %114
195
196; <label>:83 ; preds = %53
197 %84 = fcmp fast oeq float %13, 4.000000e+00
198 br i1 %84, label %85, label %114
199
200; <label>:85 ; preds = %83
201 %86 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %3, %dx.types.Handle %4, float %10, float %11, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
202 %87 = extractvalue %dx.types.ResRet.f32 %86, 0
203 %88 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %2, %dx.types.Handle %4, float %10, float %11, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
204 %89 = extractvalue %dx.types.ResRet.f32 %88, 0
205 %90 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %1, %dx.types.Handle %4, float %10, float %11, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
206 %91 = extractvalue %dx.types.ResRet.f32 %90, 0
207 %92 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 2) ; CBufferLoadLegacy(handle,regIndex)
208 %93 = extractvalue %dx.types.CBufRet.f32 %92, 0
209 %94 = extractvalue %dx.types.CBufRet.f32 %92, 1
210 %95 = extractvalue %dx.types.CBufRet.f32 %92, 2
211 %96 = fadd fast float %93, %87
212 %97 = fadd fast float %94, %89
213 %98 = fadd fast float %95, %91
214 %99 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 3) ; CBufferLoadLegacy(handle,regIndex)
215 %100 = extractvalue %dx.types.CBufRet.f32 %99, 0
216 %101 = extractvalue %dx.types.CBufRet.f32 %99, 1
217 %102 = extractvalue %dx.types.CBufRet.f32 %99, 2
218 %103 = call float @dx.op.dot3.f32(i32 55, float %96, float %97, float %98, float %100, float %101, float %102) ; Dot3(ax,ay,az,bx,by,bz)
219 %104 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 4) ; CBufferLoadLegacy(handle,regIndex)
220 %105 = extractvalue %dx.types.CBufRet.f32 %104, 0
221 %106 = extractvalue %dx.types.CBufRet.f32 %104, 1
222 %107 = extractvalue %dx.types.CBufRet.f32 %104, 2
223 %108 = call float @dx.op.dot3.f32(i32 55, float %96, float %97, float %98, float %105, float %106, float %107) ; Dot3(ax,ay,az,bx,by,bz)
224 %109 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 5) ; CBufferLoadLegacy(handle,regIndex)
225 %110 = extractvalue %dx.types.CBufRet.f32 %109, 0
226 %111 = extractvalue %dx.types.CBufRet.f32 %109, 1
227 %112 = extractvalue %dx.types.CBufRet.f32 %109, 2
228 %113 = call float @dx.op.dot3.f32(i32 55, float %96, float %97, float %98, float %110, float %111, float %112) ; Dot3(ax,ay,az,bx,by,bz)
229 br label %114
230
231; <label>:114 ; preds = %85, %83, %55, %25, %17, %0
232 %115 = phi float [ %19, %17 ], [ %42, %25 ], [ %72, %55 ], [ %103, %85 ], [ 1.000000e+00, %0 ], [ 1.000000e+00, %83 ]
233 %116 = phi float [ %20, %17 ], [ %47, %25 ], [ %77, %55 ], [ %108, %85 ], [ 1.000000e+00, %0 ], [ 0.000000e+00, %83 ]
234 %117 = phi float [ %21, %17 ], [ %52, %25 ], [ %82, %55 ], [ %113, %85 ], [ 1.000000e+00, %0 ], [ 0.000000e+00, %83 ]
235 %118 = phi float [ %22, %17 ], [ 1.000000e+00, %25 ], [ 1.000000e+00, %55 ], [ 1.000000e+00, %85 ], [ 1.000000e+00, %0 ], [ 1.000000e+00, %83 ]
236 %119 = extractvalue %dx.types.CBufRet.f32 %12, 2
237 %120 = fcmp fast oeq float %119, 3.000000e+00
238 br i1 %120, label %121, label %169
239
240; <label>:121 ; preds = %114
241 %122 = call float @dx.op.unary.f32(i32 6, float %115) ; FAbs(value)
242 %123 = call float @dx.op.unary.f32(i32 6, float %116) ; FAbs(value)
243 %124 = call float @dx.op.unary.f32(i32 6, float %117) ; FAbs(value)
244 %125 = call float @dx.op.unary.f32(i32 23, float %122) ; Log(value)
245 %126 = call float @dx.op.unary.f32(i32 23, float %123) ; Log(value)
246 %127 = call float @dx.op.unary.f32(i32 23, float %124) ; Log(value)
247 %128 = fmul fast float %125, 0x3F89F9B580000000
248 %129 = fmul fast float %126, 0x3F89F9B580000000
249 %130 = fmul fast float %127, 0x3F89F9B580000000
250 %131 = call float @dx.op.unary.f32(i32 21, float %128) ; Exp(value)
251 %132 = call float @dx.op.unary.f32(i32 21, float %129) ; Exp(value)
252 %133 = call float @dx.op.unary.f32(i32 21, float %130) ; Exp(value)
253 %134 = fadd fast float %131, -8.359375e-01
254 %135 = fadd fast float %132, -8.359375e-01
255 %136 = fadd fast float %133, -8.359375e-01
256 %137 = call float @dx.op.binary.f32(i32 35, float %134, float 0.000000e+00) ; FMax(a,b)
257 %138 = call float @dx.op.binary.f32(i32 35, float %135, float 0.000000e+00) ; FMax(a,b)
258 %139 = call float @dx.op.binary.f32(i32 35, float %136, float 0.000000e+00) ; FMax(a,b)
259 %140 = fmul fast float %131, 1.868750e+01
260 %141 = fmul fast float %132, 1.868750e+01
261 %142 = fmul fast float %133, 1.868750e+01
262 %143 = fsub fast float 0x4032DA0000000000, %140
263 %144 = fsub fast float 0x4032DA0000000000, %141
264 %145 = fsub fast float 0x4032DA0000000000, %142
265 %146 = fdiv fast float %137, %143
266 %147 = fdiv fast float %138, %144
267 %148 = fdiv fast float %139, %145
268 %149 = call float @dx.op.unary.f32(i32 6, float %146) ; FAbs(value)
269 %150 = call float @dx.op.unary.f32(i32 6, float %147) ; FAbs(value)
270 %151 = call float @dx.op.unary.f32(i32 6, float %148) ; FAbs(value)
271 %152 = call float @dx.op.unary.f32(i32 23, float %149) ; Log(value)
272 %153 = call float @dx.op.unary.f32(i32 23, float %150) ; Log(value)
273 %154 = call float @dx.op.unary.f32(i32 23, float %151) ; Log(value)
274 %155 = fmul fast float %152, 0x40191C0D60000000
275 %156 = fmul fast float %153, 0x40191C0D60000000
276 %157 = fmul fast float %154, 0x40191C0D60000000
277 %158 = call float @dx.op.unary.f32(i32 21, float %155) ; Exp(value)
278 %159 = call float @dx.op.unary.f32(i32 21, float %156) ; Exp(value)
279 %160 = call float @dx.op.unary.f32(i32 21, float %157) ; Exp(value)
280 %161 = fmul fast float %158, 1.000000e+04
281 %162 = fmul fast float %159, 1.000000e+04
282 %163 = fmul fast float %160, 1.000000e+04
283 %164 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 1) ; CBufferLoadLegacy(handle,regIndex)
284 %165 = extractvalue %dx.types.CBufRet.f32 %164, 3
285 %166 = fdiv fast float %161, %165
286 %167 = fdiv fast float %162, %165
287 %168 = fdiv fast float %163, %165
288 br label %169
289
290; <label>:169 ; preds = %121, %114
291 %170 = phi float [ %166, %121 ], [ %115, %114 ]
292 %171 = phi float [ %167, %121 ], [ %116, %114 ]
293 %172 = phi float [ %168, %121 ], [ %117, %114 ]
294 %173 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %5, i32 1) ; CBufferLoadLegacy(handle,regIndex)
295 %174 = extractvalue %dx.types.CBufRet.f32 %173, 0
296 %175 = fcmp fast une float %174, 0.000000e+00
297 br i1 %175, label %176, label %229
298
299; <label>:176 ; preds = %169
300 %177 = fcmp fast oeq float %174, 1.000000e+00
301 br i1 %177, label %178, label %183
302
303; <label>:178 ; preds = %176
304 %179 = extractvalue %dx.types.CBufRet.f32 %173, 1
305 %180 = fmul fast float %179, %170
306 %181 = fmul fast float %179, %171
307 %182 = fmul fast float %179, %172
308 br label %229
309
310; <label>:183 ; preds = %176
311 %184 = fcmp fast oeq float %174, 2.000000e+00
312 br i1 %184, label %185, label %229
313
314; <label>:185 ; preds = %183
315 %186 = fcmp fast oeq float %119, 2.000000e+00
316 br i1 %186, label %187, label %197
317
318; <label>:187 ; preds = %185
319 %188 = fmul fast float %170, 0x3FE413B180000000
320 %189 = call float @dx.op.tertiary.f32(i32 46, float 0x3FD512F900000000, float %171, float %188) ; FMad(a,b,c)
321 %190 = call float @dx.op.tertiary.f32(i32 46, float 0x3FA62D1F20000000, float %172, float %189) ; FMad(a,b,c)
322 %191 = fmul fast float %170, 0x3FB1B05740000000
323 %192 = call float @dx.op.tertiary.f32(i32 46, float 0x3FED6CE140000000, float %171, float %191) ; FMad(a,b,c)
324 %193 = call float @dx.op.tertiary.f32(i32 46, float 0x3F8744F5E0000000, float %172, float %192) ; FMad(a,b,c)
325 %194 = fmul fast float %170, 0x3F90C8CD60000000
326 %195 = call float @dx.op.tertiary.f32(i32 46, float 0x3FB6880520000000, float %171, float %194) ; FMad(a,b,c)
327 %196 = call float @dx.op.tertiary.f32(i32 46, float 0x3FECA8B6E0000000, float %172, float %195) ; FMad(a,b,c)
328 br label %197
329
330; <label>:197 ; preds = %187, %185
331 %198 = phi float [ %190, %187 ], [ %170, %185 ]
332 %199 = phi float [ %193, %187 ], [ %171, %185 ]
333 %200 = phi float [ %196, %187 ], [ %172, %185 ]
334 %201 = call float @dx.op.binary.f32(i32 35, float %199, float %200) ; FMax(a,b)
335 %202 = call float @dx.op.binary.f32(i32 35, float %198, float %201) ; FMax(a,b)
336 %203 = fcmp fast ogt float %202, 0.000000e+00
337 br i1 %203, label %204, label %215
338
339; <label>:204 ; preds = %197
340 %205 = extractvalue %dx.types.CBufRet.f32 %173, 1
341 %206 = fmul fast float %205, %202
342 %207 = fadd fast float %206, 1.000000e+00
343 %208 = extractvalue %dx.types.CBufRet.f32 %173, 2
344 %209 = fmul fast float %208, %202
345 %210 = fadd fast float %209, 1.000000e+00
346 %211 = fdiv fast float %207, %210
347 %212 = fmul fast float %211, %198
348 %213 = fmul fast float %211, %199
349 %214 = fmul fast float %211, %200
350 br label %215
351
352; <label>:215 ; preds = %204, %197
353 %216 = phi float [ %212, %204 ], [ %198, %197 ]
354 %217 = phi float [ %213, %204 ], [ %199, %197 ]
355 %218 = phi float [ %214, %204 ], [ %200, %197 ]
356 br i1 %186, label %219, label %229
357
358; <label>:219 ; preds = %215
359 %220 = fmul fast float %216, 0x3FFA916440000000
360 %221 = call float @dx.op.tertiary.f32(i32 46, float 0xBFE2CE1400000000, float %217, float %220) ; FMad(a,b,c)
361 %222 = call float @dx.op.tertiary.f32(i32 46, float 0xBFB2A5A460000000, float %218, float %221) ; FMad(a,b,c)
362 %223 = fmul fast float %216, 0xBFBFE24FE0000000
363 %224 = call float @dx.op.tertiary.f32(i32 46, float 0x3FF2205680000000, float %217, float %223) ; FMad(a,b,c)
364 %225 = call float @dx.op.tertiary.f32(i32 46, float 0xBF8118C1A0000000, float %218, float %224) ; FMad(a,b,c)
365 %226 = fmul fast float %216, 0xBF9296F660000000
366 %227 = call float @dx.op.tertiary.f32(i32 46, float 0xBFB9C0B9A0000000, float %217, float %226) ; FMad(a,b,c)
367 %228 = call float @dx.op.tertiary.f32(i32 46, float 0x3FF1E66780000000, float %218, float %227) ; FMad(a,b,c)
368 br label %229
369
370; <label>:229 ; preds = %219, %215, %183, %178, %169
371 %230 = phi float [ %170, %169 ], [ %180, %178 ], [ %222, %219 ], [ %216, %215 ], [ %170, %183 ]
372 %231 = phi float [ %171, %169 ], [ %181, %178 ], [ %225, %219 ], [ %217, %215 ], [ %171, %183 ]
373 %232 = phi float [ %172, %169 ], [ %182, %178 ], [ %228, %219 ], [ %218, %215 ], [ %172, %183 ]
374 %233 = fcmp fast oeq float %119, 1.000000e+00
375 br i1 %233, label %234, label %280
376
377; <label>:234 ; preds = %229
378 %235 = extractvalue %dx.types.CBufRet.f32 %12, 0
379 %236 = fcmp fast une float %235, 0.000000e+00
380 br i1 %236, label %237, label %272
381
382; <label>:237 ; preds = %234
383 %238 = fcmp fast ugt float %230, 0x3FA4B5DCC0000000
384 br i1 %238, label %241, label %239
385
386; <label>:239 ; preds = %237
387 %240 = fmul fast float %230, 0x3FB3D07220000000
388 br label %248
389
390; <label>:241 ; preds = %237
391 %242 = fadd fast float %230, 0x3FAC28F5C0000000
392 %243 = call float @dx.op.unary.f32(i32 6, float %242) ; FAbs(value)
393 %244 = fmul fast float %243, 0x3FEE54EDE0000000
394 %245 = call float @dx.op.unary.f32(i32 23, float %244) ; Log(value)
395 %246 = fmul fast float %245, 0x4003333340000000
396 %247 = call float @dx.op.unary.f32(i32 21, float %246) ; Exp(value)
397 br label %248
398
399; <label>:248 ; preds = %241, %239
400 %249 = phi float [ %240, %239 ], [ %247, %241 ]
401 %250 = fcmp fast ugt float %231, 0x3FA4B5DCC0000000
402 br i1 %250, label %253, label %251
403
404; <label>:251 ; preds = %248
405 %252 = fmul fast float %231, 0x3FB3D07220000000
406 br label %260
407
408; <label>:253 ; preds = %248
409 %254 = fadd fast float %231, 0x3FAC28F5C0000000
410 %255 = call float @dx.op.unary.f32(i32 6, float %254) ; FAbs(value)
411 %256 = fmul fast float %255, 0x3FEE54EDE0000000
412 %257 = call float @dx.op.unary.f32(i32 23, float %256) ; Log(value)
413 %258 = fmul fast float %257, 0x4003333340000000
414 %259 = call float @dx.op.unary.f32(i32 21, float %258) ; Exp(value)
415 br label %260
416
417; <label>:260 ; preds = %253, %251
418 %261 = phi float [ %252, %251 ], [ %259, %253 ]
419 %262 = fcmp fast ugt float %232, 0x3FA4B5DCC0000000
420 br i1 %262, label %265, label %263
421
422; <label>:263 ; preds = %260
423 %264 = fmul fast float %232, 0x3FB3D07220000000
424 br label %272
425
426; <label>:265 ; preds = %260
427 %266 = fadd fast float %232, 0x3FAC28F5C0000000
428 %267 = call float @dx.op.unary.f32(i32 6, float %266) ; FAbs(value)
429 %268 = fmul fast float %267, 0x3FEE54EDE0000000
430 %269 = call float @dx.op.unary.f32(i32 23, float %268) ; Log(value)
431 %270 = fmul fast float %269, 0x4003333340000000
432 %271 = call float @dx.op.unary.f32(i32 21, float %270) ; Exp(value)
433 br label %272
434
435; <label>:272 ; preds = %265, %263, %234
436 %273 = phi float [ %230, %234 ], [ %249, %265 ], [ %249, %263 ]
437 %274 = phi float [ %231, %234 ], [ %261, %265 ], [ %261, %263 ]
438 %275 = phi float [ %232, %234 ], [ %271, %265 ], [ %264, %263 ]
439 %276 = extractvalue %dx.types.CBufRet.f32 %12, 3
440 %277 = fmul fast float %276, %273
441 %278 = fmul fast float %276, %274
442 %279 = fmul fast float %276, %275
443 br label %389
444
445; <label>:280 ; preds = %229
446 %281 = fcmp fast oeq float %119, 2.000000e+00
447 %282 = extractvalue %dx.types.CBufRet.f32 %12, 3
448 br i1 %281, label %283, label %329
449
450; <label>:283 ; preds = %280
451 %284 = fmul fast float %282, %230
452 %285 = fmul fast float %282, %231
453 %286 = fmul fast float %282, %232
454 %287 = extractvalue %dx.types.CBufRet.f32 %12, 0
455 %288 = fcmp fast une float %287, 0.000000e+00
456 br i1 %288, label %389, label %289
457
458; <label>:289 ; preds = %283
459 %290 = fcmp fast ugt float %284, 0x3F69A5C380000000
460 br i1 %290, label %293, label %291
461
462; <label>:291 ; preds = %289
463 %292 = fmul fast float %284, 0x4029D70A40000000
464 br label %300
465
466; <label>:293 ; preds = %289
467 %294 = call float @dx.op.unary.f32(i32 6, float %284) ; FAbs(value)
468 %295 = call float @dx.op.unary.f32(i32 23, float %294) ; Log(value)
469 %296 = fmul fast float %295, 0x3FDAAAAAA0000000
470 %297 = call float @dx.op.unary.f32(i32 21, float %296) ; Exp(value)
471 %298 = fmul fast float %297, 0x3FF0E147A0000000
472 %299 = fadd fast float %298, 0xBFAC28F5C0000000
473 br label %300
474
475; <label>:300 ; preds = %293, %291
476 %301 = phi float [ %292, %291 ], [ %299, %293 ]
477 %302 = fcmp fast ugt float %285, 0x3F69A5C380000000
478 br i1 %302, label %305, label %303
479
480; <label>:303 ; preds = %300
481 %304 = fmul fast float %285, 0x4029D70A40000000
482 br label %312
483
484; <label>:305 ; preds = %300
485 %306 = call float @dx.op.unary.f32(i32 6, float %285) ; FAbs(value)
486 %307 = call float @dx.op.unary.f32(i32 23, float %306) ; Log(value)
487 %308 = fmul fast float %307, 0x3FDAAAAAA0000000
488 %309 = call float @dx.op.unary.f32(i32 21, float %308) ; Exp(value)
489 %310 = fmul fast float %309, 0x3FF0E147A0000000
490 %311 = fadd fast float %310, 0xBFAC28F5C0000000
491 br label %312
492
493; <label>:312 ; preds = %305, %303
494 %313 = phi float [ %304, %303 ], [ %311, %305 ]
495 %314 = fcmp fast ugt float %286, 0x3F69A5C380000000
496 br i1 %314, label %317, label %315
497
498; <label>:315 ; preds = %312
499 %316 = fmul fast float %286, 0x4029D70A40000000
500 br label %324
501
502; <label>:317 ; preds = %312
503 %318 = call float @dx.op.unary.f32(i32 6, float %286) ; FAbs(value)
504 %319 = call float @dx.op.unary.f32(i32 23, float %318) ; Log(value)
505 %320 = fmul fast float %319, 0x3FDAAAAAA0000000
506 %321 = call float @dx.op.unary.f32(i32 21, float %320) ; Exp(value)
507 %322 = fmul fast float %321, 0x3FF0E147A0000000
508 %323 = fadd fast float %322, 0xBFAC28F5C0000000
509 br label %324
510
511; <label>:324 ; preds = %317, %315
512 %325 = phi float [ %316, %315 ], [ %323, %317 ]
513 %326 = call float @dx.op.unary.f32(i32 7, float %301) ; Saturate(value)
514 %327 = call float @dx.op.unary.f32(i32 7, float %313) ; Saturate(value)
515 %328 = call float @dx.op.unary.f32(i32 7, float %325) ; Saturate(value)
516 br label %389
517
518; <label>:329 ; preds = %280
519 br i1 %120, label %330, label %385
520
521; <label>:330 ; preds = %329
522 %331 = fmul fast float %230, 0x3FFA916440000000
523 %332 = call float @dx.op.tertiary.f32(i32 46, float 0xBFE2CE1400000000, float %231, float %331) ; FMad(a,b,c)
524 %333 = call float @dx.op.tertiary.f32(i32 46, float 0xBFB2A5A460000000, float %232, float %332) ; FMad(a,b,c)
525 %334 = fmul fast float %230, 0xBFBFE24FE0000000
526 %335 = call float @dx.op.tertiary.f32(i32 46, float 0x3FF2205680000000, float %231, float %334) ; FMad(a,b,c)
527 %336 = call float @dx.op.tertiary.f32(i32 46, float 0xBF8118C1A0000000, float %232, float %335) ; FMad(a,b,c)
528 %337 = fmul fast float %230, 0xBF9296F660000000
529 %338 = call float @dx.op.tertiary.f32(i32 46, float 0xBFB9C0B9A0000000, float %231, float %337) ; FMad(a,b,c)
530 %339 = call float @dx.op.tertiary.f32(i32 46, float 0x3FF1E66780000000, float %232, float %338) ; FMad(a,b,c)
531 %340 = fmul fast float %282, %333
532 %341 = fmul fast float %282, %336
533 %342 = fmul fast float %282, %339
534 %343 = extractvalue %dx.types.CBufRet.f32 %12, 0
535 %344 = fcmp fast une float %343, 0.000000e+00
536 br i1 %344, label %389, label %345
537
538; <label>:345 ; preds = %330
539 %346 = fcmp fast ugt float %340, 0x3F69A5C380000000
540 br i1 %346, label %349, label %347
541
542; <label>:347 ; preds = %345
543 %348 = fmul fast float %340, 0x4029D70A40000000
544 br label %356
545
546; <label>:349 ; preds = %345
547 %350 = call float @dx.op.unary.f32(i32 6, float %340) ; FAbs(value)
548 %351 = call float @dx.op.unary.f32(i32 23, float %350) ; Log(value)
549 %352 = fmul fast float %351, 0x3FDAAAAAA0000000
550 %353 = call float @dx.op.unary.f32(i32 21, float %352) ; Exp(value)
551 %354 = fmul fast float %353, 0x3FF0E147A0000000
552 %355 = fadd fast float %354, 0xBFAC28F5C0000000
553 br label %356
554
555; <label>:356 ; preds = %349, %347
556 %357 = phi float [ %348, %347 ], [ %355, %349 ]
557 %358 = fcmp fast ugt float %341, 0x3F69A5C380000000
558 br i1 %358, label %361, label %359
559
560; <label>:359 ; preds = %356
561 %360 = fmul fast float %341, 0x4029D70A40000000
562 br label %368
563
564; <label>:361 ; preds = %356
565 %362 = call float @dx.op.unary.f32(i32 6, float %341) ; FAbs(value)
566 %363 = call float @dx.op.unary.f32(i32 23, float %362) ; Log(value)
567 %364 = fmul fast float %363, 0x3FDAAAAAA0000000
568 %365 = call float @dx.op.unary.f32(i32 21, float %364) ; Exp(value)
569 %366 = fmul fast float %365, 0x3FF0E147A0000000
570 %367 = fadd fast float %366, 0xBFAC28F5C0000000
571 br label %368
572
573; <label>:368 ; preds = %361, %359
574 %369 = phi float [ %360, %359 ], [ %367, %361 ]
575 %370 = fcmp fast ugt float %342, 0x3F69A5C380000000
576 br i1 %370, label %373, label %371
577
578; <label>:371 ; preds = %368
579 %372 = fmul fast float %342, 0x4029D70A40000000
580 br label %380
581
582; <label>:373 ; preds = %368
583 %374 = call float @dx.op.unary.f32(i32 6, float %342) ; FAbs(value)
584 %375 = call float @dx.op.unary.f32(i32 23, float %374) ; Log(value)
585 %376 = fmul fast float %375, 0x3FDAAAAAA0000000
586 %377 = call float @dx.op.unary.f32(i32 21, float %376) ; Exp(value)
587 %378 = fmul fast float %377, 0x3FF0E147A0000000
588 %379 = fadd fast float %378, 0xBFAC28F5C0000000
589 br label %380
590
591; <label>:380 ; preds = %373, %371
592 %381 = phi float [ %372, %371 ], [ %379, %373 ]
593 %382 = call float @dx.op.unary.f32(i32 7, float %357) ; Saturate(value)
594 %383 = call float @dx.op.unary.f32(i32 7, float %369) ; Saturate(value)
595 %384 = call float @dx.op.unary.f32(i32 7, float %381) ; Saturate(value)
596 br label %389
597
598; <label>:385 ; preds = %329
599 %386 = fmul fast float %282, %230
600 %387 = fmul fast float %282, %231
601 %388 = fmul fast float %282, %232
602 br label %389
603
604; <label>:389 ; preds = %385, %380, %330, %324, %283, %272
605 %390 = phi float [ %277, %272 ], [ %386, %385 ], [ %284, %283 ], [ %326, %324 ], [ %340, %330 ], [ %382, %380 ]
606 %391 = phi float [ %278, %272 ], [ %387, %385 ], [ %285, %283 ], [ %327, %324 ], [ %341, %330 ], [ %383, %380 ]
607 %392 = phi float [ %279, %272 ], [ %388, %385 ], [ %286, %283 ], [ %328, %324 ], [ %342, %330 ], [ %384, %380 ]
608 %393 = fmul fast float %390, %6
609 %394 = fmul fast float %391, %7
610 %395 = fmul fast float %392, %8
611 %396 = fmul fast float %118, %9
612 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %393) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
613 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %394) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
614 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %395) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
615 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %396) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
616 ret void
617}
618
619; Function Attrs: nounwind readnone
620declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
621
622; Function Attrs: nounwind
623declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
624
625; Function Attrs: nounwind readonly
626declare %dx.types.ResRet.f32 @dx.op.sample.f32(i32, %dx.types.Handle, %dx.types.Handle, float, float, float, float, i32, i32, i32, float) #2
627
628; Function Attrs: nounwind readnone
629declare float @dx.op.dot3.f32(i32, float, float, float, float, float, float) #0
630
631; Function Attrs: nounwind readnone
632declare float @dx.op.unary.f32(i32, float) #0
633
634; Function Attrs: nounwind readnone
635declare float @dx.op.binary.f32(i32, float, float) #0
636
637; Function Attrs: nounwind readonly
638declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
639
640; Function Attrs: nounwind readnone
641declare float @dx.op.tertiary.f32(i32, float, float, float) #0
642
643; Function Attrs: nounwind readonly
644declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
645
646attributes #0 = { nounwind readnone }
647attributes #1 = { nounwind }
648attributes #2 = { nounwind readonly }
649
650!llvm.ident = !{!0}
651!dx.version = !{!1}
652!dx.valver = !{!2}
653!dx.shaderModel = !{!3}
654!dx.resources = !{!4}
655!dx.viewIdState = !{!14}
656!dx.entryPoints = !{!15}
657
658!0 = !{!"clang version 3.7 (tags/RELEASE_370/final)"}
659!1 = !{i32 1, i32 0}
660!2 = !{i32 1, i32 6}
661!3 = !{!"ps", i32 6, i32 0}
662!4 = !{!5, null, !10, !12}
663!5 = !{!6, !8, !9}
664!6 = !{i32 0, %"class.Texture2D<vector<float, 4> >"* undef, !"", i32 0, i32 0, i32 1, i32 2, i32 0, !7}
665!7 = !{i32 0, i32 9}
666!8 = !{i32 1, %"class.Texture2D<vector<float, 4> >"* undef, !"", i32 0, i32 1, i32 1, i32 2, i32 0, !7}
667!9 = !{i32 2, %"class.Texture2D<vector<float, 4> >"* undef, !"", i32 0, i32 2, i32 1, i32 2, i32 0, !7}
668!10 = !{!11}
669!11 = !{i32 0, %Constants* undef, !"", i32 0, i32 1, i32 1, i32 96, null}
670!12 = !{!13}
671!13 = !{i32 0, %struct.SamplerState* undef, !"", i32 0, i32 0, i32 1, i32 0, null}
672!14 = !{[14 x i32] [i32 12, i32 4, i32 0, i32 0, i32 0, i32 0, i32 15, i32 15, i32 0, i32 0, i32 1, i32 2, i32 4, i32 8]}
673!15 = !{void ()* @main, !"main", !16, !4, null}
674!16 = !{!17, !24, null}
675!17 = !{!18, !20, !22}
676!18 = !{i32 0, !"SV_Position", i8 9, i8 3, !19, i8 4, i32 1, i8 4, i32 0, i8 0, null}
677!19 = !{i32 0}
678!20 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !19, i8 2, i32 1, i8 2, i32 1, i8 0, !21}
679!21 = !{i32 3, i32 3}
680!22 = !{i32 2, !"COLOR", i8 9, i8 0, !19, i8 2, i32 1, i8 4, i32 2, i8 0, !23}
681!23 = !{i32 3, i32 15}
682!24 = !{!25}
683!25 = !{i32 0, !"SV_Target", i8 9, i8 16, !19, i8 0, i32 1, i8 4, i32 0, i8 0, !23}
684
685#endif
686
687const unsigned char g_main[] = {
688 0x44, 0x58, 0x42, 0x43, 0x78, 0xad, 0xb4, 0x13, 0x3d, 0x52, 0x26, 0xa9,
689 0x43, 0x6f, 0x29, 0xd4, 0x3d, 0xe5, 0x45, 0x27, 0x01, 0x00, 0x00, 0x00,
690 0xd9, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
691 0x50, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00,
692 0x61, 0x02, 0x00, 0x00, 0x61, 0x03, 0x00, 0x00, 0xd9, 0x0c, 0x00, 0x00,
693 0xf5, 0x0c, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
695 0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
696 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
697 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
698 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
699 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
700 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00,
702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
703 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
704 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00,
705 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c,
706 0x4f, 0x52, 0x00, 0x4f, 0x53, 0x47, 0x31, 0x32, 0x00, 0x00, 0x00, 0x01,
707 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28,
708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03,
709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
710 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
711 0x00, 0x50, 0x53, 0x56, 0x30, 0x44, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00,
712 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
714 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00,
715 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
716 0x00, 0x05, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
717 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
718 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
719 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
720 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
721 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
722 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
723 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
724 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
725 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
726 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
727 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43,
728 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730 0x00, 0x01, 0x00, 0x44, 0x03, 0x03, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00,
731 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, 0x03, 0x02, 0x00,
732 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44,
733 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
734 0x00, 0x01, 0x00, 0x44, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
735 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
736 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
737 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
738 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53,
739 0x30, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
740 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00,
741 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
742 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
743 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
744 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
745 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
746 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
747 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
748 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
749 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
750 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
751 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
752 0xff, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
753 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
754 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
755 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
756 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
757 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
758 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
759 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
760 0xff, 0x53, 0x54, 0x41, 0x54, 0x70, 0x09, 0x00, 0x00, 0x60, 0x00, 0x00,
761 0x00, 0x5c, 0x02, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00,
762 0x00, 0x10, 0x00, 0x00, 0x00, 0x58, 0x09, 0x00, 0x00, 0x42, 0x43, 0xc0,
763 0xde, 0x21, 0x0c, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20,
764 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
765 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
766 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45,
767 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
768 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88,
769 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x23, 0xc4,
770 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46,
771 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0,
772 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff,
773 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff,
774 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00,
775 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00,
776 0x00, 0x89, 0x20, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88,
777 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23,
778 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4,
779 0x4c, 0x10, 0x9c, 0xc1, 0x08, 0x40, 0x09, 0x00, 0x0a, 0x66, 0x00, 0xe6,
780 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x40, 0x10, 0x44, 0x41, 0x90,
781 0x51, 0x0c, 0x80, 0x20, 0x88, 0x62, 0x20, 0xe4, 0xa6, 0xe1, 0xf2, 0x27,
782 0xec, 0x21, 0x24, 0x7f, 0x25, 0xa4, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x51,
783 0x31, 0x0c, 0xc3, 0x40, 0x50, 0x71, 0xcf, 0x70, 0xf9, 0x13, 0xf6, 0x10,
784 0x92, 0x1f, 0x02, 0xcd, 0xb0, 0x10, 0x28, 0x58, 0x0a, 0xa3, 0x10, 0x0c,
785 0x33, 0x0c, 0xc3, 0x40, 0x10, 0xc4, 0x40, 0x4d, 0x41, 0x06, 0x62, 0x18,
786 0x86, 0x61, 0x18, 0xe8, 0x29, 0xc3, 0x40, 0x0c, 0x14, 0x15, 0x62, 0x20,
787 0x86, 0x81, 0xa6, 0xa3, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e,
788 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0x0c, 0xc3, 0x50,
789 0x88, 0x8a, 0x60, 0x08, 0xb2, 0x4a, 0x31, 0x10, 0xc3, 0x30, 0x10, 0x36,
790 0x47, 0x10, 0x14, 0x83, 0x21, 0x0a, 0x82, 0xd0, 0x68, 0x1b, 0x08, 0x18,
791 0x46, 0x20, 0x86, 0x99, 0xda, 0x60, 0x1c, 0xd8, 0x21, 0x1c, 0xe6, 0x61,
792 0x1e, 0xdc, 0x80, 0x16, 0xca, 0x01, 0x1f, 0xe8, 0xa1, 0x1e, 0xe4, 0xa1,
793 0x1c, 0xe4, 0x80, 0x14, 0xf8, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1,
794 0x1d, 0xe4, 0x81, 0x0f, 0xcc, 0x81, 0x1d, 0xde, 0x21, 0x1c, 0xe8, 0x81,
795 0x0d, 0xc0, 0x80, 0x0e, 0xfc, 0x00, 0x0c, 0xfc, 0x40, 0x0f, 0xf4, 0xa0,
796 0x1d, 0xd2, 0x01, 0x1e, 0xe6, 0xe1, 0x17, 0xe8, 0x21, 0x1f, 0xe0, 0xa1,
797 0x1c, 0x50, 0x40, 0xcc, 0x24, 0x06, 0xe3, 0xc0, 0x0e, 0xe1, 0x30, 0x0f,
798 0xf3, 0xe0, 0x06, 0xb4, 0x50, 0x0e, 0xf8, 0x40, 0x0f, 0xf5, 0x20, 0x0f,
799 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, 0xf6, 0x50, 0x0e, 0xe3, 0x40, 0x0f,
800 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, 0x40, 0x0f,
801 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60, 0xe0, 0x07, 0x48, 0xf0, 0x3e,
802 0x02, 0x2f, 0xe1, 0x9c, 0x46, 0x9a, 0x80, 0x66, 0x92, 0x10, 0x33, 0x0c,
803 0xc3, 0x30, 0x0c, 0xc3, 0xe0, 0x79, 0x9e, 0x47, 0xe2, 0x4d, 0xd2, 0x14,
804 0x51, 0xc2, 0xe4, 0xb3, 0x00, 0xf3, 0x2c, 0x44, 0xc4, 0x4e, 0xc0, 0x44,
805 0xa0, 0x80, 0x20, 0x32, 0x1d, 0x08, 0x00, 0x00, 0x00, 0x13, 0x14, 0x72,
806 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72,
807 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e,
808 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07,
809 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
810 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07,
811 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07,
812 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07,
813 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07,
814 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
815 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e,
816 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
817 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
818 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00,
819 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00,
820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c,
821 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00,
822 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x13, 0x01,
823 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x67,
824 0x02, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21,
825 0x8f, 0x05, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826 0x43, 0x1e, 0x0c, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
827 0x00, 0x86, 0x3c, 0x1b, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
828 0x00, 0x00, 0x64, 0x81, 0x00, 0x19, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
829 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
830 0x22, 0x4a, 0x60, 0x04, 0xa0, 0x18, 0x8a, 0xa0, 0x24, 0x0a, 0x38, 0xa0,
831 0x0c, 0xca, 0xa1, 0x10, 0x0a, 0xa2, 0x30, 0x0a, 0xa4, 0x50, 0x0a, 0xa6,
832 0x70, 0x0a, 0xa8, 0xc0, 0x0a, 0x30, 0xa0, 0x40, 0x03, 0xca, 0xa3, 0x6c,
833 0xca, 0x70, 0xa0, 0x44, 0x0d, 0xa8, 0x28, 0x89, 0x32, 0x28, 0x84, 0x11,
834 0x80, 0x22, 0x28, 0x10, 0xd2, 0x6a, 0x80, 0xc2, 0x19, 0x00, 0x12, 0x67,
835 0x00, 0x68, 0x9c, 0x01, 0xa0, 0x72, 0x06, 0x80, 0xcc, 0xb1, 0x1c, 0x86,
836 0x00, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00,
837 0x00, 0x79, 0x18, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c,
838 0x90, 0x46, 0x02, 0x13, 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03,
839 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01,
840 0x41, 0xa1, 0x0b, 0x3b, 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a,
841 0x2a, 0xfa, 0x9a, 0xb9, 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b,
842 0xd9, 0x10, 0x04, 0x13, 0x04, 0x42, 0x99, 0x20, 0x10, 0xcb, 0x06, 0x61,
843 0x20, 0x36, 0x08, 0x04, 0x41, 0x01, 0x6e, 0x6e, 0x82, 0x40, 0x30, 0x1b,
844 0x86, 0x03, 0x21, 0x26, 0x08, 0x61, 0x80, 0x06, 0x44, 0xe8, 0xca, 0xf0,
845 0xe8, 0xea, 0xe4, 0xca, 0x60, 0x26, 0x08, 0x44, 0x33, 0x41, 0x20, 0x9c,
846 0x0d, 0x02, 0xd1, 0x6c, 0x48, 0x08, 0x65, 0x21, 0x88, 0x81, 0x21, 0x1c,
847 0x22, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x31, 0x1b, 0x92, 0x41,
848 0x81, 0x88, 0x61, 0x60, 0x08, 0x87, 0x08, 0x5d, 0x19, 0x1e, 0x5d, 0x9d,
849 0x5c, 0x99, 0xcc, 0x86, 0x84, 0x51, 0x24, 0x82, 0x19, 0x18, 0xc2, 0xd9,
850 0x30, 0x3c, 0xd1, 0x34, 0x41, 0x18, 0x03, 0x35, 0x60, 0x32, 0xf4, 0xe6,
851 0x36, 0x47, 0x17, 0xe6, 0x46, 0x37, 0x37, 0x41, 0x20, 0x9e, 0x0d, 0x08,
852 0x51, 0x59, 0xc4, 0x30, 0x5c, 0xc0, 0x86, 0x00, 0x9b, 0x20, 0x94, 0xc1,
853 0x1a, 0x10, 0x99, 0x0b, 0x6b, 0x83, 0x63, 0x2b, 0x93, 0x83, 0xd9, 0x80,
854 0x10, 0xda, 0x46, 0x10, 0x03, 0x01, 0x6c, 0x08, 0xb8, 0x0d, 0x04, 0x05,
855 0x64, 0xdd, 0x04, 0x41, 0x0c, 0xd2, 0x80, 0xcc, 0xdc, 0x98, 0xd4, 0x91,
856 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0xdd, 0x04, 0x81, 0x80, 0x26,
857 0x08, 0x44, 0x34, 0x41, 0xd0, 0xce, 0x60, 0x03, 0x82, 0x80, 0x41, 0x18,
858 0x10, 0x62, 0xd0, 0x34, 0x63, 0x40, 0x86, 0xae, 0x0c, 0x8f, 0xae, 0x4e,
859 0xae, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0x6c, 0x82, 0x40, 0x48, 0x1b, 0x10,
860 0xa4, 0x0c, 0xc2, 0xc0, 0x0c, 0xc4, 0xa0, 0x69, 0xc6, 0x80, 0x4a, 0x9a,
861 0x1b, 0x5c, 0x1d, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x04, 0x81, 0x98,
862 0x36, 0x20, 0x08, 0x1a, 0x84, 0x41, 0x1a, 0x88, 0x41, 0xd3, 0x8c, 0x01,
863 0x97, 0xb1, 0x37, 0xb6, 0x37, 0xb9, 0xaf, 0xb9, 0xb1, 0x30, 0xb6, 0xb2,
864 0x09, 0x02, 0x41, 0x6d, 0x40, 0x90, 0x35, 0x08, 0x03, 0x36, 0x10, 0x83,
865 0xa6, 0x19, 0x03, 0x3a, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f,
866 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x13, 0x04, 0xa2, 0xda, 0x80, 0x20,
867 0x6e, 0x10, 0x06, 0x6f, 0x20, 0x06, 0x4d, 0x33, 0x06, 0x7c, 0xe8, 0xde,
868 0xdc, 0xca, 0xda, 0xc2, 0xe0, 0xbe, 0xcc, 0xc2, 0xc6, 0xe8, 0xde, 0xe4,
869 0x62, 0x26, 0x08, 0x84, 0xb5, 0x01, 0x41, 0xe2, 0x20, 0x0c, 0xe4, 0x40,
870 0x0c, 0x9a, 0x66, 0x0c, 0xf8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1,
871 0x7d, 0x99, 0x85, 0x8d, 0xd1, 0xbd, 0xc9, 0xc9, 0x4c, 0x10, 0x88, 0x6b,
872 0x03, 0x82, 0xd0, 0x41, 0x18, 0xd4, 0x81, 0x18, 0x34, 0xcd, 0x18, 0xf0,
873 0x99, 0x23, 0x93, 0xfb, 0xba, 0x43, 0x4b, 0xa3, 0x2b, 0xfb, 0x82, 0x7b,
874 0x4b, 0x73, 0xa3, 0x9b, 0x20, 0x10, 0xd8, 0x06, 0x04, 0xb9, 0x83, 0x30,
875 0xc0, 0x03, 0x31, 0x68, 0x9a, 0x31, 0xe0, 0x91, 0xf5, 0x66, 0x66, 0x36,
876 0x57, 0x46, 0x37, 0x41, 0x20, 0xb2, 0x0d, 0x08, 0xa2, 0x07, 0x61, 0xb0,
877 0x07, 0x62, 0xd0, 0x34, 0x63, 0x40, 0x43, 0x6a, 0xec, 0xad, 0xcc, 0xcc,
878 0x6c, 0x82, 0x40, 0x68, 0x1b, 0x10, 0xa4, 0x0f, 0xc2, 0xc0, 0x0f, 0xc4,
879 0xa0, 0x69, 0xc6, 0x80, 0xc6, 0xd1, 0xd8, 0x5b, 0x99, 0x99, 0xd9, 0x04,
880 0x81, 0xd8, 0x36, 0x20, 0x08, 0x28, 0x84, 0x41, 0x28, 0x88, 0x41, 0xd3,
881 0x8c, 0x01, 0x0d, 0xa1, 0xb1, 0xb7, 0x32, 0x33, 0xb3, 0x09, 0x02, 0xc1,
882 0x6d, 0x40, 0x90, 0x51, 0x08, 0x03, 0x52, 0x10, 0x83, 0xa6, 0x19, 0x83,
883 0x0d, 0xcd, 0x45, 0x06, 0x67, 0xa0, 0x06, 0x6d, 0x00, 0x07, 0x73, 0x60,
884 0x07, 0x79, 0xc0, 0x07, 0x7f, 0x20, 0x0a, 0xa5, 0xb0, 0x61, 0x20, 0x3e,
885 0x53, 0x98, 0x20, 0x08, 0xc0, 0x06, 0x60, 0xc3, 0x40, 0xa4, 0x42, 0x2a,
886 0x6c, 0x08, 0x54, 0x61, 0xc3, 0x30, 0xa0, 0xc2, 0x2a, 0x4c, 0x10, 0xcc,
887 0x80, 0x0d, 0x36, 0x04, 0xad, 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0xcb,
888 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x04,
889 0xa1, 0x08, 0x83, 0x09, 0x42, 0x21, 0x06, 0x1b, 0x02, 0x62, 0x82, 0x50,
890 0x8c, 0xc1, 0x04, 0xa1, 0x20, 0x83, 0x0d, 0x0b, 0x01, 0x0b, 0xb1, 0x20,
891 0x0b, 0xb3, 0x40, 0x0b, 0x03, 0x2d, 0x10, 0xb5, 0x00, 0x10, 0xa1, 0x2a,
892 0xc2, 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20, 0x14, 0x65, 0xb0, 0x41,
893 0x08, 0x83, 0x30, 0xd8, 0xb0, 0x0c, 0xb7, 0x10, 0x0b, 0xb5, 0x30, 0x0b,
894 0xb8, 0x30, 0xe0, 0xc2, 0x50, 0x0b, 0xb9, 0xc0, 0x62, 0xe8, 0x89, 0xe9,
895 0x49, 0x6a, 0x82, 0x40, 0x74, 0x1b, 0x84, 0x30, 0xe0, 0x85, 0x0d, 0x0b,
896 0xb3, 0x0b, 0xb1, 0x50, 0x0b, 0xb3, 0x80, 0x0b, 0x03, 0x2d, 0x30, 0xb5,
897 0xd0, 0x0b, 0x1b, 0x06, 0x5b, 0xd0, 0x05, 0x5f, 0x60, 0x32, 0x65, 0xf5,
898 0x45, 0x15, 0x26, 0x77, 0x56, 0x46, 0x37, 0x41, 0x28, 0xcc, 0x60, 0xc3,
899 0x42, 0x80, 0x43, 0x2c, 0x84, 0xc3, 0x2c, 0xd4, 0xc2, 0x40, 0x0b, 0x44,
900 0x2d, 0xf4, 0xc2, 0x86, 0x40, 0x1c, 0x36, 0x0c, 0xbf, 0x30, 0x0e, 0xc0,
901 0x86, 0x02, 0x15, 0x5e, 0x81, 0x1c, 0x3c, 0x80, 0x88, 0x98, 0x5c, 0x98,
902 0xdb, 0x18, 0x5a, 0xd9, 0xdc, 0x04, 0x81, 0xf0, 0x68, 0x98, 0xb1, 0xbd,
903 0x85, 0xd1, 0xcd, 0x4d, 0x10, 0x88, 0x8f, 0x45, 0x9a, 0xdb, 0x1c, 0xdd,
904 0xdc, 0x04, 0x81, 0x00, 0x03, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x6c, 0x64,
905 0x34, 0xe6, 0xd2, 0xce, 0xbe, 0xe6, 0xe8, 0x88, 0xd0, 0x95, 0xe1, 0x7d,
906 0xb9, 0xbd, 0xc9, 0xb5, 0x6d, 0x60, 0xcc, 0xe1, 0x1c, 0xd0, 0x21, 0x1d,
907 0xd4, 0x61, 0x1d, 0xd8, 0x01, 0x69, 0x07, 0x33, 0x70, 0x87, 0x34, 0xa8,
908 0xc2, 0xc6, 0x66, 0xd7, 0xe6, 0x92, 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25,
909 0x08, 0xaa, 0x90, 0xe1, 0xb9, 0xd8, 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9,
910 0x4d, 0x09, 0x88, 0x26, 0x64, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65,
911 0x72, 0x53, 0x82, 0xa2, 0x0e, 0x19, 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59,
912 0x99, 0x5c, 0xd3, 0x1b, 0x59, 0x19, 0xdb, 0x94, 0x00, 0x29, 0x43, 0x86,
913 0xe7, 0x22, 0x57, 0x36, 0xf7, 0x56, 0x27, 0x37, 0x56, 0x36, 0x37, 0x25,
914 0xe8, 0x2a, 0x91, 0xe1, 0xb9, 0xd0, 0xe5, 0xc1, 0x95, 0x05, 0xb9, 0xb9,
915 0xbd, 0xd1, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0xcd, 0x4d, 0x11, 0x4c, 0x61,
916 0x15, 0xea, 0x90, 0xe1, 0xb9, 0xd8, 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d,
917 0xd1, 0x85, 0xd1, 0x95, 0x4d, 0x09, 0x5a, 0xa1, 0x0e, 0x19, 0x9e, 0x4b,
918 0x99, 0x1b, 0x9d, 0x5c, 0x1e, 0xd4, 0x5b, 0x9a, 0x1b, 0xdd, 0xdc, 0x94,
919 0x80, 0x1c, 0xba, 0x90, 0xe1, 0xb9, 0x8c, 0xbd, 0xd5, 0xb9, 0xd1, 0x95,
920 0xc9, 0xcd, 0x4d, 0x09, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
921 0x00, 0x51, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
922 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
923 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
924 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
925 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
926 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
927 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
928 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
929 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
930 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
931 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
932 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
933 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
934 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
935 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
936 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
937 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
938 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
939 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
940 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
941 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
942 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
943 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28,
944 0x87, 0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e, 0xf8, 0xe0, 0x06, 0xe4,
945 0x20, 0x0e, 0xe7, 0xe0, 0x06, 0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1,
946 0x90, 0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x30, 0x83, 0x81, 0xc8, 0x01, 0x1f,
947 0xdc, 0x40, 0x1c, 0xe4, 0xa1, 0x1c, 0xc2, 0x61, 0x1d, 0xdc, 0x40, 0x1c,
948 0xe4, 0x01, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x26, 0x00, 0x00,
949 0x00, 0x66, 0x00, 0x0d, 0x97, 0xef, 0x3c, 0x7e, 0x80, 0x34, 0x40, 0x84,
950 0xf9, 0xc5, 0x6d, 0xdb, 0xc1, 0x36, 0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x40,
951 0x15, 0x05, 0x11, 0x95, 0x0e, 0x30, 0x94, 0x84, 0x01, 0x08, 0x98, 0x5f,
952 0xdc, 0xb6, 0x25, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x44, 0x04, 0x30,
953 0x11, 0x21, 0xd0, 0x0c, 0x0b, 0x61, 0x04, 0xce, 0x70, 0xf9, 0xce, 0xe3,
954 0x0f, 0xce, 0x74, 0xfb, 0xc5, 0x6d, 0x5b, 0xc0, 0x34, 0x5c, 0xbe, 0xf3,
955 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x0d,
956 0x40, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x01, 0xcc, 0xb3, 0x10, 0x7e, 0x71,
957 0xdb, 0x26, 0x50, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x34, 0x39, 0x11, 0x81,
958 0x52, 0xd3, 0x43, 0x4d, 0x7e, 0x71, 0xdb, 0x86, 0x20, 0x0d, 0x97, 0xef,
959 0x3c, 0xfe, 0x44, 0x44, 0x13, 0x02, 0x44, 0x98, 0x5f, 0xdc, 0xb6, 0x15,
960 0x3c, 0xc3, 0xe5, 0x3b, 0x8f, 0x4f, 0x35, 0x40, 0x84, 0xf9, 0xc5, 0x6d,
961 0x1b, 0x00, 0xc1, 0x00, 0x48, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
962 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
963 0x00, 0xf6, 0x87, 0x44, 0x46, 0xea, 0xee, 0x41, 0xc1, 0x02, 0x14, 0x2c,
964 0x02, 0xd5, 0xbb, 0x3a, 0xb7, 0x44, 0x58, 0x49, 0x4c, 0xdc, 0x13, 0x00,
965 0x00, 0x60, 0x00, 0x00, 0x00, 0xf7, 0x04, 0x00, 0x00, 0x44, 0x58, 0x49,
966 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xc4, 0x13, 0x00,
967 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xee, 0x04, 0x00,
968 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
969 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
970 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
971 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32,
972 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14,
973 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e,
974 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
975 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00,
976 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8,
977 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86,
978 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00,
979 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08,
980 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x57, 0x00, 0x00,
981 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4,
982 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c,
983 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xa0, 0xc1, 0x08, 0x40, 0x09, 0x00,
984 0x0a, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x40,
985 0x10, 0x44, 0x41, 0x90, 0x51, 0x0c, 0x80, 0x20, 0x88, 0x62, 0x20, 0xe4,
986 0xa6, 0xe1, 0xf2, 0x27, 0xec, 0x21, 0x24, 0x7f, 0x25, 0xa4, 0x95, 0x98,
987 0xfc, 0xe2, 0xb6, 0x51, 0x31, 0x0c, 0xc3, 0x40, 0x50, 0x71, 0xcf, 0x70,
988 0xf9, 0x13, 0xf6, 0x10, 0x92, 0x1f, 0x02, 0xcd, 0xb0, 0x10, 0x28, 0x58,
989 0x0a, 0xa3, 0x10, 0x0c, 0x33, 0x0c, 0xc3, 0x40, 0x10, 0xc4, 0x40, 0x4d,
990 0x41, 0x06, 0x62, 0x18, 0x86, 0x61, 0x18, 0xe8, 0x29, 0xc3, 0x40, 0x0c,
991 0x14, 0x15, 0x62, 0x20, 0x86, 0x81, 0xa6, 0xa3, 0x86, 0xcb, 0x9f, 0xb0,
992 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x11,
993 0x31, 0x0c, 0xc3, 0x50, 0x88, 0x8a, 0x60, 0x08, 0xb2, 0x4a, 0x31, 0x10,
994 0xc3, 0x30, 0x10, 0x36, 0x47, 0x10, 0x14, 0x83, 0x21, 0x0a, 0x82, 0xd0,
995 0x68, 0x1b, 0x08, 0x18, 0x46, 0x20, 0x86, 0x99, 0xda, 0x60, 0x1c, 0xd8,
996 0x21, 0x1c, 0xe6, 0x61, 0x1e, 0xdc, 0x80, 0x16, 0xca, 0x01, 0x1f, 0xe8,
997 0xa1, 0x1e, 0xe4, 0xa1, 0x1c, 0xe4, 0x80, 0x14, 0xf8, 0xc0, 0x1e, 0xca,
998 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x81, 0x0f, 0xcc, 0x81, 0x1d, 0xde,
999 0x21, 0x1c, 0xe8, 0x81, 0x0d, 0xc0, 0x80, 0x0e, 0xfc, 0x00, 0x0c, 0xfc,
1000 0x40, 0x0f, 0xf4, 0xa0, 0x1d, 0xd2, 0x01, 0x1e, 0xe6, 0xe1, 0x17, 0xe8,
1001 0x21, 0x1f, 0xe0, 0xa1, 0x1c, 0x50, 0x40, 0xcc, 0x24, 0x06, 0xe3, 0xc0,
1002 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xb4, 0x50, 0x0e, 0xf8, 0x40,
1003 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, 0xf6, 0x50,
1004 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec, 0xf0,
1005 0x0e, 0xe1, 0x40, 0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60, 0xe0,
1006 0x07, 0x48, 0xf0, 0x3e, 0x02, 0x2f, 0xe1, 0x9c, 0x46, 0x9a, 0x80, 0x66,
1007 0x92, 0x10, 0x33, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0xe0, 0x79, 0x9e, 0x47,
1008 0xe2, 0x4d, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x00, 0xf3, 0x2c, 0x44,
1009 0xc4, 0x4e, 0xc0, 0x44, 0xa0, 0x80, 0x20, 0x32, 0x1d, 0x88, 0x29, 0x00,
1010 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87,
1011 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0,
1012 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0,
1013 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20,
1014 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
1015 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30,
1016 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40,
1017 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0,
1018 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30,
1019 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1020 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30,
1021 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00,
1022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10,
1023 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10,
1024 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2,
1025 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
1026 0xe4, 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1027 0x60, 0xc8, 0x13, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0xc0, 0x90, 0x67, 0x02, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
1029 0x00, 0x00, 0x80, 0x21, 0x8f, 0x05, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x00,
1030 0x00, 0x00, 0x00, 0x00, 0x43, 0x1e, 0x0c, 0x08, 0x80, 0x00, 0x00, 0x00,
1031 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x1b, 0x10, 0x00, 0x03, 0x00,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x81, 0x00, 0x11, 0x00, 0x00,
1033 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
1034 0x47, 0xc6, 0x04, 0x43, 0x22, 0x4a, 0x60, 0x04, 0xa0, 0x18, 0x8a, 0xa0,
1035 0x24, 0x0a, 0x38, 0xa0, 0x0c, 0xca, 0x83, 0x8a, 0x92, 0x28, 0x83, 0x42,
1036 0x18, 0x01, 0x28, 0x82, 0x02, 0xa1, 0x70, 0x06, 0x80, 0xc6, 0x19, 0x00,
1037 0x2a, 0x67, 0x00, 0xc8, 0x1c, 0xcb, 0x61, 0x08, 0x00, 0x00, 0x80, 0xe7,
1038 0x01, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
1039 0x00, 0x71, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13,
1040 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b,
1041 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b,
1042 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9,
1043 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13,
1044 0x04, 0x42, 0x99, 0x20, 0x10, 0xcb, 0x06, 0x61, 0x20, 0x26, 0x08, 0x04,
1045 0xb3, 0x41, 0x18, 0x0c, 0x0a, 0x70, 0x73, 0x1b, 0x06, 0xc4, 0x20, 0x26,
1046 0x08, 0x61, 0x80, 0x11, 0x98, 0x20, 0x10, 0xcd, 0x04, 0x81, 0x70, 0x36,
1047 0x08, 0x44, 0xb3, 0x21, 0x21, 0x94, 0x85, 0x20, 0x06, 0x86, 0x70, 0x36,
1048 0x24, 0x83, 0xb2, 0x10, 0xc3, 0xc0, 0x10, 0xce, 0x86, 0x84, 0x51, 0x16,
1049 0x82, 0x19, 0x18, 0xc2, 0xd9, 0x30, 0x3c, 0x50, 0x34, 0x41, 0x18, 0x83,
1050 0x6c, 0x82, 0x40, 0x3c, 0x1b, 0x10, 0x62, 0x5a, 0x88, 0x61, 0xa0, 0x80,
1051 0x0d, 0x41, 0x35, 0x41, 0x28, 0x03, 0x6d, 0x03, 0x42, 0x5c, 0x0b, 0x41,
1052 0x0c, 0x04, 0xb0, 0x21, 0xc0, 0x36, 0x10, 0x12, 0x60, 0x65, 0x13, 0x04,
1053 0x33, 0xd8, 0x36, 0x04, 0xdb, 0x04, 0x41, 0x00, 0x48, 0xb4, 0x85, 0xa5,
1054 0xb9, 0x71, 0x99, 0xb2, 0xfa, 0x82, 0x7a, 0x9b, 0x4b, 0xa3, 0x4b, 0x7b,
1055 0x73, 0x9b, 0x20, 0x14, 0xd2, 0x04, 0xa1, 0x98, 0x36, 0x04, 0xc4, 0x04,
1056 0xa1, 0xa0, 0x26, 0x08, 0x45, 0xb5, 0x61, 0x21, 0x3e, 0x30, 0x08, 0x03,
1057 0x31, 0x18, 0x83, 0x61, 0x0c, 0x08, 0x32, 0x00, 0x88, 0x50, 0x15, 0x61,
1058 0x0d, 0x3d, 0x3d, 0x49, 0x11, 0x4d, 0x10, 0x0a, 0x6b, 0x82, 0x40, 0x40,
1059 0x1b, 0x04, 0x34, 0x40, 0x83, 0x0d, 0xcb, 0x60, 0x06, 0x60, 0x40, 0x06,
1060 0x62, 0x70, 0x06, 0xc3, 0x19, 0x0c, 0x64, 0x90, 0x06, 0x2c, 0x86, 0x9e,
1061 0x98, 0x9e, 0xa4, 0x26, 0x08, 0x44, 0xb4, 0x41, 0x40, 0x03, 0x36, 0xd8,
1062 0xb0, 0x30, 0x6b, 0x00, 0x06, 0x64, 0x20, 0x06, 0x67, 0x30, 0x8c, 0x01,
1063 0x43, 0x06, 0x6d, 0xb0, 0x61, 0x28, 0x03, 0x35, 0x70, 0x03, 0x26, 0x53,
1064 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x13, 0x84, 0xe2, 0xda,
1065 0xb0, 0x10, 0x70, 0x00, 0x06, 0x71, 0x20, 0x06, 0x64, 0x30, 0x8c, 0x01,
1066 0x41, 0x06, 0x6d, 0xb0, 0x21, 0x90, 0x83, 0x0d, 0xc3, 0x1b, 0xcc, 0x01,
1067 0xb0, 0xa1, 0xe8, 0x3c, 0x3a, 0xd0, 0x80, 0x2a, 0x6c, 0x6c, 0x76, 0x6d,
1068 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e,
1069 0x8b, 0x5d, 0x99, 0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42,
1070 0x86, 0xe7, 0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x30, 0xea,
1071 0x90, 0xe1, 0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91,
1072 0x95, 0xb1, 0x4d, 0x09, 0x90, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73,
1073 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x82, 0xac, 0x0e, 0x19, 0x9e,
1074 0x8b, 0x5d, 0x5a, 0xd9, 0x5d, 0x12, 0xd9, 0x14, 0x5d, 0x18, 0x5d, 0xd9,
1075 0x94, 0x60, 0xab, 0x43, 0x86, 0xe7, 0x52, 0xe6, 0x46, 0x27, 0x97, 0x07,
1076 0xf5, 0x96, 0xe6, 0x46, 0x37, 0x37, 0x25, 0xa0, 0x03, 0x00, 0x00, 0x00,
1077 0x00, 0x79, 0x18, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
1078 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
1079 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
1080 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
1081 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
1082 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
1083 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
1084 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
1085 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
1086 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
1087 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
1088 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
1089 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
1090 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
1091 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
1092 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
1093 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
1094 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
1095 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
1096 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
1097 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
1098 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
1099 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, 0x21, 0x07, 0x7c,
1100 0x70, 0x03, 0x7a, 0x28, 0x87, 0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e,
1101 0xf8, 0xe0, 0x06, 0xe4, 0x20, 0x0e, 0xe7, 0xe0, 0x06, 0xf6, 0x10, 0x0e,
1102 0xf2, 0xc0, 0x0e, 0xe1, 0x90, 0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x30, 0x83,
1103 0x81, 0xc8, 0x01, 0x1f, 0xdc, 0x40, 0x1c, 0xe4, 0xa1, 0x1c, 0xc2, 0x61,
1104 0x1d, 0xdc, 0x40, 0x1c, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
1105 0x00, 0x26, 0x00, 0x00, 0x00, 0x66, 0x00, 0x0d, 0x97, 0xef, 0x3c, 0x7e,
1106 0x80, 0x34, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0xdb, 0xc1, 0x36, 0x5c, 0xbe,
1107 0xf3, 0xf8, 0x42, 0x40, 0x15, 0x05, 0x11, 0x95, 0x0e, 0x30, 0x94, 0x84,
1108 0x01, 0x08, 0x98, 0x5f, 0xdc, 0xb6, 0x25, 0x48, 0xc3, 0xe5, 0x3b, 0x8f,
1109 0x2f, 0x44, 0x04, 0x30, 0x11, 0x21, 0xd0, 0x0c, 0x0b, 0x61, 0x04, 0xce,
1110 0x70, 0xf9, 0xce, 0xe3, 0x0f, 0xce, 0x74, 0xfb, 0xc5, 0x6d, 0x5b, 0xc0,
1111 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93,
1112 0x5f, 0xdc, 0xb6, 0x0d, 0x40, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x01, 0xcc,
1113 0xb3, 0x10, 0x7e, 0x71, 0xdb, 0x26, 0x50, 0x0d, 0x97, 0xef, 0x3c, 0xbe,
1114 0x34, 0x39, 0x11, 0x81, 0x52, 0xd3, 0x43, 0x4d, 0x7e, 0x71, 0xdb, 0x86,
1115 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xfe, 0x44, 0x44, 0x13, 0x02, 0x44, 0x98,
1116 0x5f, 0xdc, 0xb6, 0x15, 0x3c, 0xc3, 0xe5, 0x3b, 0x8f, 0x4f, 0x35, 0x40,
1117 0x84, 0xf9, 0xc5, 0x6d, 0x1b, 0x00, 0xc1, 0x00, 0x48, 0x03, 0x00, 0x00,
1118 0x00, 0x61, 0x20, 0x00, 0x00, 0x29, 0x03, 0x00, 0x00, 0x13, 0x04, 0x7b,
1119 0x10, 0x0b, 0x04, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0xa4, 0x8d, 0x00,
1120 0x50, 0x51, 0x02, 0x44, 0x94, 0x51, 0xc9, 0x95, 0x43, 0x29, 0x14, 0x5e,
1121 0xb9, 0x15, 0xc2, 0x0c, 0x40, 0xa9, 0x94, 0x4b, 0xd9, 0x15, 0x17, 0x0d,
1122 0x63, 0x04, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x8c, 0x11, 0x98, 0xf7, 0xba,
1123 0xca, 0xde, 0x18, 0x41, 0xcc, 0x83, 0x7d, 0xee, 0x8d, 0x11, 0xb8, 0x7d,
1124 0x2c, 0xda, 0xde, 0x18, 0xc1, 0xbb, 0xa7, 0xe5, 0xfd, 0x8d, 0x11, 0xe8,
1125 0xac, 0x39, 0x87, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x48, 0x82, 0xc1,
1126 0x18, 0x81, 0x98, 0x8b, 0x69, 0xff, 0x8d, 0x11, 0x80, 0x25, 0xcf, 0xc6,
1127 0xbf, 0x30, 0x46, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x18, 0xc1, 0x3f,
1128 0x93, 0xfe, 0xef, 0x0b, 0x63, 0x04, 0x74, 0x0d, 0x8a, 0xf9, 0x37, 0x46,
1129 0xd0, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x18, 0xc1, 0xdc, 0xb7, 0x69, 0xea,
1130 0x0b, 0x63, 0x04, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0x8c, 0x11, 0xf0, 0x39,
1131 0xeb, 0xe3, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0x0a, 0x06, 0x63, 0x04,
1132 0x2c, 0x7b, 0x86, 0xf2, 0x37, 0x46, 0x80, 0xfa, 0x65, 0xac, 0x7e, 0x63,
1133 0x04, 0xf9, 0xa9, 0x8b, 0xb3, 0x37, 0x46, 0xa0, 0xd7, 0xe0, 0x8e, 0x7b,
1134 0x63, 0x04, 0x2a, 0x9e, 0xdb, 0xf6, 0x37, 0x46, 0xf0, 0xf6, 0x29, 0x3d,
1135 0x7a, 0x63, 0x04, 0xeb, 0x1c, 0xb3, 0xa8, 0x37, 0x46, 0x90, 0x86, 0x30,
1136 0xba, 0x7b, 0x63, 0x04, 0x77, 0x1b, 0xab, 0xf6, 0x37, 0x46, 0xb0, 0x8e,
1137 0x78, 0xcc, 0x82, 0xc1, 0x18, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x63,
1138 0x04, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x11, 0x80, 0x20, 0xc8, 0xd6,
1139 0xbf, 0x30, 0x46, 0xc0, 0xb6, 0xf3, 0x4f, 0x7a, 0x63, 0x04, 0x20, 0x08,
1140 0x82, 0x20, 0x18, 0x8c, 0x11, 0xb8, 0x7d, 0x2c, 0xda, 0xbe, 0x30, 0x46,
1141 0xd0, 0xc7, 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37,
1142 0x46, 0x20, 0x8b, 0x6e, 0x4f, 0x83, 0xc1, 0x18, 0x01, 0x0f, 0xaf, 0x3a,
1143 0xdd, 0x8d, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x0c, 0x00,
1144 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0xb0, 0xa5, 0xc2, 0x1c, 0xf4,
1145 0x41, 0x29, 0x94, 0x82, 0x1d, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0xc1,
1146 0xa6, 0x0a, 0x74, 0xe0, 0x07, 0xa9, 0x90, 0x0a, 0x77, 0x30, 0x62, 0x90,
1147 0x00, 0x20, 0x08, 0x06, 0xdb, 0x2a, 0xd4, 0xc1, 0x1f, 0xa4, 0x42, 0x2a,
1148 0xe0, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x6c, 0xac, 0x60, 0x07,
1149 0xa2, 0xa0, 0x0a, 0xaa, 0x90, 0x07, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60,
1150 0xb0, 0xb5, 0xc2, 0x1d, 0x80, 0xc2, 0x2a, 0xb0, 0x82, 0x1e, 0x8c, 0x18,
1151 0x24, 0x00, 0x08, 0x82, 0x81, 0x61, 0x0b, 0x73, 0xa0, 0x0a, 0xac, 0x20,
1152 0x0a, 0x72, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6, 0x2d, 0xd0,
1153 0xc1, 0x2a, 0xb4, 0xc2, 0x1e, 0xcc, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20,
1154 0x18, 0x18, 0xb8, 0x50, 0x07, 0xac, 0xe0, 0x0a, 0xa3, 0x40, 0x07, 0x23,
1155 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0xe4, 0x82, 0x1d, 0xb4, 0xc2, 0x2b,
1156 0x9c, 0x42, 0x1d, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xa1, 0x0b,
1157 0x77, 0x10, 0x0b, 0xb0, 0x60, 0x0a, 0x76, 0x30, 0x62, 0x90, 0x00, 0x20,
1158 0x08, 0x06, 0xc6, 0x2e, 0xe0, 0x81, 0x2c, 0xc4, 0xc2, 0x1f, 0xdc, 0xc1,
1159 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x58, 0xb6, 0x50, 0x07, 0x87, 0x2c,
1160 0x8c, 0x26, 0x04, 0xc1, 0x70, 0x44, 0x00, 0x05, 0xdf, 0x2c, 0x43, 0x12,
1161 0x04, 0xc3, 0x11, 0x02, 0x14, 0x7c, 0xb3, 0x0c, 0xc2, 0x10, 0x8c, 0x18,
1162 0x3c, 0x00, 0x08, 0x82, 0x41, 0xe3, 0x0b, 0x7f, 0xd0, 0x30, 0x46, 0x01,
1163 0x41, 0xb6, 0x60, 0x0b, 0x7c, 0x00, 0x8d, 0x26, 0x04, 0xc0, 0x68, 0x82,
1164 0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0xcc, 0x12, 0x24, 0xc3,
1165 0x11, 0x48, 0x17, 0x7c, 0xb3, 0x0c, 0x44, 0x11, 0x8c, 0x18, 0x3c, 0x00,
1166 0x08, 0x82, 0x41, 0x43, 0x0e, 0xa5, 0x30, 0x49, 0xcc, 0x62, 0x59, 0xbc,
1167 0xc0, 0x0b, 0xa2, 0x60, 0x8d, 0x26, 0x04, 0xc0, 0x88, 0xc1, 0x03, 0x80,
1168 0x20, 0x18, 0x34, 0xe6, 0x70, 0x0a, 0x16, 0xe5, 0x34, 0x18, 0xe6, 0x0b,
1169 0xbe, 0x40, 0x0a, 0xd8, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x88,
1170 0xc1, 0x01, 0x80, 0x20, 0x18, 0x58, 0xe5, 0x40, 0x0a, 0xd6, 0x2f, 0x8c,
1171 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0x82, 0x0d, 0x08,
1172 0x7c, 0x6c, 0x38, 0xe0, 0x63, 0xc3, 0x01, 0x9f, 0x11, 0x83, 0x03, 0x00,
1173 0x41, 0x30, 0xb0, 0xd8, 0x61, 0x15, 0xba, 0x71, 0x18, 0x4d, 0x08, 0x80,
1174 0xd1, 0x04, 0x21, 0x18, 0x4d, 0x18, 0x84, 0x11, 0x83, 0x05, 0x00, 0x41,
1175 0x30, 0x78, 0xe6, 0x81, 0x16, 0x0e, 0xa3, 0x18, 0x84, 0x60, 0xc4, 0xe0,
1176 0x00, 0x40, 0x10, 0x0c, 0xac, 0x78, 0x80, 0x05, 0x31, 0xa0, 0x85, 0xd1,
1177 0x84, 0x00, 0x18, 0x4d, 0x10, 0x82, 0xd1, 0x84, 0x41, 0x18, 0x31, 0x58,
1178 0x00, 0x10, 0x04, 0x83, 0x07, 0x1f, 0x72, 0x81, 0x59, 0x94, 0x41, 0x08,
1179 0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1, 0xc0, 0xb2, 0x87, 0x5a, 0x38, 0x03,
1180 0x5e, 0x18, 0x4d, 0x08, 0x80, 0xd1, 0x04, 0x21, 0x18, 0x4d, 0x18, 0x84,
1181 0x11, 0x83, 0x05, 0x00, 0x41, 0x30, 0x78, 0xfa, 0xc1, 0x17, 0x22, 0xe8,
1182 0x19, 0x84, 0x60, 0x96, 0x20, 0x19, 0x8e, 0x20, 0x03, 0x59, 0x08, 0xbe,
1183 0x59, 0x06, 0xe3, 0x08, 0x46, 0x0c, 0x1e, 0x00, 0x04, 0xc1, 0xa0, 0x01,
1184 0x89, 0x70, 0x78, 0x03, 0x37, 0x40, 0x83, 0x33, 0x90, 0x03, 0x39, 0xc0,
1185 0x07, 0x7c, 0xf0, 0x05, 0x39, 0x18, 0x4d, 0x08, 0x80, 0x11, 0x83, 0x07,
1186 0x00, 0x41, 0x30, 0x68, 0x44, 0x62, 0x1c, 0xe4, 0x00, 0x0e, 0xd4, 0x20,
1187 0x0d, 0xe8, 0x80, 0x0e, 0xf4, 0x41, 0x1f, 0xc0, 0x81, 0x0e, 0x46, 0x13,
1188 0x02, 0x60, 0x34, 0x41, 0x08, 0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1, 0xc0,
1189 0x0a, 0x09, 0x70, 0x90, 0x83, 0x7d, 0x18, 0x4d, 0x08, 0x80, 0xd1, 0x04,
1190 0x21, 0x18, 0x4d, 0x18, 0x04, 0x1b, 0x10, 0xf8, 0xd8, 0x60, 0xc0, 0xc7,
1191 0x06, 0x04, 0x3e, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0x60, 0xa1, 0xc4,
1192 0x39, 0xe4, 0xc1, 0x3f, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
1193 0x26, 0x0c, 0xc2, 0x88, 0xc1, 0x02, 0x80, 0x20, 0x18, 0x3c, 0x2f, 0x01,
1194 0x0f, 0x87, 0x51, 0x0c, 0x42, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06,
1195 0x56, 0x4b, 0xb0, 0x83, 0x1f, 0xc0, 0xc3, 0x68, 0x42, 0x00, 0x8c, 0x26,
1196 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x18, 0x2c, 0x00, 0x08, 0x82, 0xc1,
1197 0x43, 0x13, 0xf5, 0xc0, 0x2c, 0xca, 0x20, 0x04, 0x23, 0x06, 0x07, 0x00,
1198 0x82, 0x60, 0x60, 0xc9, 0x44, 0x3c, 0x8c, 0x02, 0x3e, 0x8c, 0x26, 0x04,
1199 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x88, 0xc1, 0x02, 0x80,
1200 0x20, 0x18, 0x3c, 0x39, 0xa1, 0x0f, 0x11, 0xf4, 0x0c, 0x42, 0x30, 0x4b,
1201 0x90, 0x0c, 0x47, 0x80, 0x02, 0x39, 0x04, 0xdf, 0x2c, 0x03, 0x92, 0x04,
1202 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0xf0, 0x44, 0x3f, 0xac, 0x82,
1203 0x2a, 0x90, 0xc2, 0x28, 0xb8, 0x82, 0x2b, 0xd0, 0x04, 0x4d, 0xe8, 0x83,
1204 0x2b, 0x8c, 0x26, 0x04, 0xc0, 0x88, 0xc1, 0x03, 0x80, 0x20, 0x18, 0x34,
1205 0x3e, 0xf1, 0x0f, 0xae, 0xc0, 0x0a, 0xa6, 0x50, 0x0a, 0xb0, 0x00, 0x0b,
1206 0x36, 0x61, 0x13, 0xfc, 0x00, 0x0b, 0xa3, 0x09, 0x01, 0x30, 0x62, 0xf0,
1207 0x00, 0x20, 0x08, 0x06, 0x0d, 0x58, 0x84, 0x44, 0x2c, 0xb8, 0x02, 0x2a,
1208 0x9c, 0x82, 0x2c, 0xc8, 0x02, 0x4e, 0xe0, 0x84, 0x3f, 0xc8, 0xc2, 0x68,
1209 0x42, 0x00, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x81, 0xe5, 0x13, 0xfd,
1210 0xf0, 0x0a, 0x38, 0x31, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a,
1211 0x30, 0x08, 0x36, 0x24, 0xf0, 0xb1, 0x01, 0x81, 0x8f, 0x0d, 0x07, 0x7c,
1212 0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1, 0xc0, 0x2a, 0x0b, 0x92, 0xb0, 0x05,
1213 0x9e, 0x18, 0x4d, 0x08, 0x80, 0xd1, 0x04, 0x21, 0x18, 0x4d, 0x18, 0x84,
1214 0x11, 0x83, 0x05, 0x00, 0x41, 0x30, 0x78, 0xd8, 0xa2, 0x25, 0x0e, 0xa3,
1215 0x18, 0x84, 0x60, 0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0x2c, 0xb5, 0x48,
1216 0x89, 0x5d, 0x68, 0x89, 0xd1, 0x84, 0x00, 0x18, 0x4d, 0x10, 0x82, 0xd1,
1217 0x84, 0x41, 0x18, 0x31, 0x58, 0x00, 0x10, 0x04, 0x83, 0x27, 0x2e, 0x64,
1218 0x82, 0x59, 0x94, 0x41, 0x08, 0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1, 0xc0,
1219 0x7a, 0x0b, 0x97, 0x00, 0x87, 0x9a, 0x18, 0x4d, 0x08, 0x80, 0xd1, 0x04,
1220 0x21, 0x18, 0x4d, 0x18, 0x84, 0x11, 0x83, 0x05, 0x00, 0x41, 0x30, 0x78,
1221 0xec, 0xe2, 0x26, 0x22, 0xe8, 0x19, 0x84, 0x60, 0x96, 0x20, 0x19, 0xa8,
1222 0x19, 0xe4, 0x42, 0x40, 0x09, 0x02, 0x16, 0x0c, 0x0b, 0xb1, 0x0d, 0xc0,
1223 0x36, 0x8e, 0x81, 0x9a, 0x41, 0x2e, 0x04, 0x90, 0x20, 0x50, 0xc1, 0x70,
1224 0x10, 0xdc, 0x00, 0x74, 0xe3, 0x18, 0xa8, 0x19, 0xe4, 0x42, 0xc0, 0x07,
1225 0x02, 0x14, 0x0c, 0x03, 0xd1, 0x0d, 0x80, 0x37, 0x8e, 0x81, 0x9a, 0x41,
1226 0x2e, 0x04, 0xde, 0x20, 0x78, 0xc3, 0xe0, 0x0d, 0x84, 0x37, 0x00, 0xde,
1227 0x38, 0x46, 0x13, 0xc4, 0x41, 0x18, 0x8e, 0x08, 0x60, 0x22, 0xf8, 0x66,
1228 0x19, 0x94, 0x25, 0x18, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0x88, 0x2f,
1229 0xea, 0xc2, 0x18, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0xa8, 0x2f, 0xec,
1230 0xc2, 0x18, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0xc8, 0x2f, 0xee, 0xc2,
1231 0x18, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0xe8, 0x2f, 0x7a, 0x62, 0x18,
1232 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0x08, 0x34, 0x7c, 0x62, 0x18, 0x31,
1233 0x30, 0x00, 0x10, 0x04, 0x83, 0x28, 0x34, 0x7e, 0x62, 0xb0, 0xe1, 0x1f,
1234 0xe4, 0x63, 0x03, 0x48, 0xc8, 0xc7, 0x86, 0x90, 0x90, 0xcf, 0x88, 0x81,
1235 0x01, 0x80, 0x20, 0x18, 0x44, 0xa5, 0x41, 0x16, 0xc3, 0x88, 0x81, 0x01,
1236 0x80, 0x20, 0x18, 0x44, 0xa6, 0x51, 0x16, 0xc3, 0x88, 0x81, 0x01, 0x80,
1237 0x20, 0x18, 0x44, 0xa7, 0x61, 0x16, 0x83, 0x0d, 0x26, 0x01, 0x1f, 0x1b,
1238 0x4e, 0x02, 0x3e, 0x36, 0xa0, 0x04, 0x7c, 0x46, 0x0c, 0x0e, 0x00, 0x04,
1239 0xc1, 0x60, 0x52, 0x0d, 0xb9, 0x18, 0x42, 0x62, 0xc4, 0xe0, 0x00, 0x40,
1240 0x10, 0x0c, 0xa6, 0xd5, 0x98, 0x8b, 0x41, 0x24, 0x46, 0x0c, 0x0e, 0x00,
1241 0x04, 0xc1, 0x60, 0x62, 0x0d, 0xba, 0x18, 0x46, 0xc2, 0x92, 0x96, 0x90,
1242 0x8f, 0x25, 0x2e, 0x21, 0x1f, 0x4b, 0x5e, 0x42, 0x3e, 0x16, 0x13, 0x43,
1243 0x7c, 0x4c, 0x26, 0x86, 0xf8, 0xd8, 0x4c, 0x0c, 0xf1, 0xb1, 0x64, 0xa0,
1244 0x8f, 0x25, 0x03, 0x7d, 0x2c, 0x19, 0xe8, 0x33, 0x62, 0x60, 0x00, 0x20,
1245 0x08, 0x06, 0xd1, 0x6d, 0xc0, 0xc6, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08,
1246 0x06, 0x11, 0x6e, 0xc4, 0xc6, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06,
1247 0x51, 0x6e, 0xc8, 0xc6, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x91,
1248 0x6e, 0xe0, 0xc5, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xd1, 0x6e,
1249 0xe4, 0xc5, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x11, 0x6f, 0xe8,
1250 0xc5, 0x60, 0x83, 0x4f, 0xc8, 0xc7, 0x86, 0x9f, 0x90, 0x8f, 0x0d, 0x60,
1251 0x21, 0x9f, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x88, 0xc0, 0xe3, 0x2f,
1252 0x86, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x88, 0xc2, 0x03, 0x34, 0x86,
1253 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x88, 0xc4, 0x23, 0x34, 0x06, 0x1b,
1254 0xfc, 0x42, 0x3e, 0x36, 0xfc, 0x85, 0x7c, 0x6c, 0x00, 0x0d, 0xf9, 0x8c,
1255 0x18, 0x1c, 0x00, 0x08, 0x82, 0x81, 0x45, 0x1e, 0xa3, 0x51, 0x13, 0xe1,
1256 0x31, 0x9a, 0x10, 0x0c, 0x56, 0x04, 0xf4, 0xb1, 0x42, 0xa0, 0x8f, 0x15,
1257 0x03, 0x7d, 0x66, 0x09, 0x96, 0x81, 0x8a, 0xc1, 0x50, 0xd4, 0x21, 0x19,
1258 0xa8, 0x18, 0x0c, 0x45, 0x1d, 0x92, 0x81, 0x8a, 0xc1, 0x50, 0xd4, 0x21,
1259 0x19, 0x31, 0x38, 0x00, 0x10, 0x04, 0x03, 0x8b, 0x3d, 0x56, 0xa3, 0x27,
1260 0xd2, 0x63, 0x34, 0x21, 0x00, 0x86, 0x23, 0x02, 0xb3, 0x70, 0xbe, 0x59,
1261 0x06, 0xa6, 0x0a, 0x86, 0x23, 0x04, 0xb3, 0x08, 0xbe, 0x59, 0x86, 0xc6,
1262 0x09, 0x46, 0x13, 0x88, 0xc0, 0x02, 0x44, 0x3e, 0x26, 0x20, 0xf2, 0xb1,
1263 0x01, 0x91, 0xcf, 0x2c, 0x41, 0x35, 0x1c, 0x71, 0xc8, 0x45, 0xf0, 0xcd,
1264 0x32, 0x3c, 0x55, 0x30, 0x1c, 0xd1, 0x07, 0x73, 0x11, 0x7c, 0xb3, 0x0c,
1265 0x50, 0x14, 0x58, 0x23, 0x1a, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04,
1266 0x03, 0xcc, 0x3e, 0x6a, 0x43, 0x34, 0x9a, 0x60, 0xc4, 0x00, 0x01, 0x40,
1267 0x10, 0x0c, 0xb0, 0xfb, 0xb0, 0x0d, 0xd1, 0x68, 0x02, 0x83, 0x44, 0x43,
1268 0x3e, 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0x80, 0xe5, 0x07, 0x6e, 0x88,
1269 0x06, 0x14, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82, 0x01, 0xa6, 0x1f, 0xb9,
1270 0x21, 0x1a, 0x50, 0x60, 0x93, 0x68, 0xc8, 0x67, 0xc4, 0x00, 0x01, 0x40,
1271 0x10, 0x0c, 0x30, 0xfe, 0xd8, 0x0d, 0xd1, 0x98, 0x82, 0x11, 0x03, 0x04,
1272 0x00, 0x41, 0x30, 0xc0, 0xfa, 0x83, 0x37, 0x44, 0x63, 0x0a, 0x66, 0x09,
1273 0xa2, 0x81, 0x8a, 0xc1, 0x81, 0xd8, 0xe0, 0x19, 0xa8, 0x18, 0x14, 0x88,
1274 0x0d, 0x9e, 0x81, 0x8a, 0xc1, 0x80, 0xd8, 0xe0, 0x19, 0x31, 0x38, 0x00,
1275 0x10, 0x04, 0x83, 0x69, 0x44, 0xd6, 0x43, 0x08, 0x46, 0x0c, 0x0e, 0x00,
1276 0x04, 0xc1, 0x60, 0x22, 0x11, 0xf6, 0x20, 0x82, 0xe1, 0x88, 0x80, 0x2f,
1277 0x84, 0x6f, 0x96, 0x41, 0x9a, 0x82, 0xd1, 0x84, 0x2c, 0xb0, 0x60, 0x90,
1278 0x8f, 0x05, 0x7e, 0x01, 0x9f, 0xd1, 0x04, 0x4e, 0xb0, 0xc0, 0x90, 0x8f,
1279 0x05, 0xa1, 0x01, 0x1f, 0x23, 0x02, 0xfa, 0x58, 0xd0, 0xc8, 0xc7, 0x84,
1280 0x46, 0x3e, 0x36, 0x34, 0xf2, 0x99, 0x25, 0x98, 0x06, 0x2a, 0x06, 0x43,
1281 0x02, 0x83, 0x68, 0xa0, 0x62, 0x30, 0x24, 0x30, 0x88, 0x06, 0x2a, 0x06,
1282 0x43, 0x02, 0x83, 0x68, 0x96, 0x81, 0xaa, 0x3a, 0x1b, 0xd0, 0x43, 0x3e,
1283 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0x80, 0xc9, 0x48, 0x7c, 0xa0, 0xc7,
1284 0x10, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82, 0x01, 0x36, 0x23, 0xf2, 0x81,
1285 0x1e, 0x43, 0x60, 0x06, 0x7a, 0xc8, 0x67, 0xc4, 0x00, 0x01, 0x40, 0x10,
1286 0x0c, 0xb0, 0x1a, 0xa1, 0x0f, 0xf4, 0x30, 0x82, 0x11, 0x03, 0x04, 0x00,
1287 0x41, 0x30, 0xc0, 0x6c, 0xa4, 0x3e, 0xd0, 0xc3, 0x08, 0x2c, 0x41, 0x0f,
1288 0xf9, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82, 0x01, 0x86, 0x23, 0xf7, 0x81,
1289 0x1e, 0x49, 0x30, 0x62, 0x80, 0x00, 0x20, 0x08, 0x06, 0x58, 0x8e, 0xe0,
1290 0x07, 0x7a, 0x24, 0xc1, 0x2c, 0x41, 0x35, 0xd0, 0x32, 0x90, 0xc3, 0x42,
1291 0x0b, 0x8d, 0x43, 0x61, 0x13, 0x39, 0x38, 0x03, 0x2d, 0x03, 0x39, 0x2c,
1292 0xb4, 0xd0, 0x28, 0x14, 0x36, 0x91, 0x83, 0x33, 0xd0, 0x32, 0x90, 0xc3,
1293 0x42, 0x0b, 0x8d, 0x41, 0x61, 0x13, 0x39, 0x38, 0xc3, 0x11, 0xe6, 0x50,
1294 0x1b, 0xc1, 0x37, 0xcb, 0x60, 0x85, 0x41, 0x30, 0x9a, 0x90, 0x1a, 0xc0,
1295 0x70, 0x44, 0x80, 0x1b, 0xce, 0x37, 0xcb, 0x70, 0x81, 0x41, 0x30, 0x1c,
1296 0x61, 0xf4, 0x87, 0xf2, 0xcd, 0x32, 0x64, 0x58, 0x60, 0x47, 0x7f, 0xc8,
1297 0x67, 0x96, 0x40, 0x33, 0xa4, 0x3f, 0xe0, 0x33, 0x62, 0x60, 0x00, 0x20,
1298 0x08, 0x06, 0x91, 0x99, 0xfc, 0x48, 0x60, 0x81, 0x7f, 0xc8, 0x67, 0xc4,
1299 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x22, 0x34, 0x31, 0x91, 0xc0, 0x82, 0xff,
1300 0x90, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x44, 0x6a, 0x92, 0x22,
1301 0xc1, 0x2c, 0x81, 0x36, 0x50, 0x31, 0x38, 0x98, 0x90, 0x0d, 0x47, 0x38,
1302 0x26, 0xa2, 0x7c, 0xb3, 0x0c, 0xdc, 0x16, 0xd8, 0x63, 0x22, 0xf2, 0x99,
1303 0x25, 0xe8, 0x0c, 0x32, 0x11, 0xf8, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82,
1304 0x41, 0xf4, 0x26, 0x68, 0x12, 0x58, 0x70, 0x22, 0xf2, 0x19, 0x31, 0x30,
1305 0x00, 0x10, 0x04, 0x83, 0x28, 0x4e, 0x5e, 0x24, 0xb0, 0x00, 0x45, 0xe4,
1306 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0xd1, 0x9c, 0xc8, 0x48, 0x30,
1307 0x4b, 0xd0, 0x0d, 0x54, 0x0c, 0xce, 0x26, 0x70, 0xc3, 0x11, 0xd6, 0x8b,
1308 0x28, 0xdf, 0x2c, 0xc3, 0xe7, 0x05, 0x76, 0xbd, 0x88, 0x7c, 0x66, 0x09,
1309 0xc0, 0xc0, 0xb0, 0x17, 0x81, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18,
1310 0x44, 0x78, 0x12, 0x27, 0x81, 0x05, 0x30, 0x22, 0x9f, 0x11, 0x03, 0x03,
1311 0x00, 0x41, 0x30, 0x88, 0xf4, 0x04, 0x47, 0x02, 0x0b, 0x62, 0x44, 0x3e,
1312 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0x10, 0xf1, 0xc9, 0x8e, 0x04, 0xb3,
1313 0x04, 0x60, 0x30, 0xd0, 0x31, 0x80, 0x82, 0x45, 0x06, 0x1f, 0x19, 0x78,
1314 0x03, 0x1d, 0x03, 0x28, 0x58, 0xd4, 0x47, 0x79, 0x03, 0x1d, 0x03, 0x28,
1315 0x58, 0xc6, 0x27, 0x79, 0xa3, 0x09, 0xe8, 0x31, 0x58, 0x40, 0xc8, 0xc7,
1316 0x04, 0x42, 0x3e, 0x36, 0x10, 0xf2, 0x99, 0x25, 0xd0, 0x83, 0xe1, 0x08,
1317 0x95, 0x00, 0x91, 0xe0, 0x1b, 0x4d, 0x68, 0x8f, 0x61, 0x96, 0x41, 0x0c,
1318 0xda, 0x40, 0xb0, 0x20, 0x0d, 0xe4, 0x63, 0x42, 0x1a, 0xc8, 0xc7, 0x86,
1319 0x34, 0x90, 0xcf, 0x68, 0x42, 0x7c, 0x00, 0xc3, 0x11, 0x01, 0x88, 0x38,
1320 0xdf, 0x2c, 0x83, 0x1e, 0x8c, 0x41, 0x30, 0x1c, 0x51, 0x88, 0x88, 0xf2,
1321 0xcd, 0x32, 0x94, 0x01, 0x19, 0x04, 0x66, 0x90, 0x88, 0x7c, 0x66, 0x09,
1322 0xcc, 0x60, 0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0xa2, 0x56, 0x31, 0x95,
1323 0x63, 0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x22, 0x57, 0x61, 0x93, 0xc0,
1324 0x02, 0x14, 0x91, 0xcf, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x44, 0xb0,
1325 0xf2, 0x26, 0x81, 0x05, 0x2b, 0x22, 0x1f, 0x0b, 0x5a, 0x04, 0x3e, 0xb3,
1326 0x04, 0x66, 0x30, 0x50, 0x31, 0x38, 0x64, 0x20, 0x94, 0xc1, 0x70, 0x44,
1327 0xb3, 0x22, 0xca, 0x37, 0xcb, 0x80, 0x06, 0x67, 0x10, 0x98, 0xd3, 0x22,
1328 0xf2, 0x99, 0x25, 0x48, 0x83, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x88,
1329 0x6c, 0xe5, 0x55, 0x9e, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0x88, 0x6e,
1330 0xa5, 0x4e, 0x02, 0x0b, 0x62, 0x44, 0x3e, 0x23, 0x06, 0x06, 0x00, 0x82,
1331 0x60, 0x10, 0xe5, 0x0a, 0x9e, 0x04, 0x16, 0xd0, 0x88, 0x7c, 0x2c, 0xb0,
1332 0x11, 0xf8, 0xcc, 0x12, 0xa4, 0xc1, 0x40, 0xc5, 0xe0, 0x9c, 0x81, 0x80,
1333 0x06, 0xc3, 0x11, 0x15, 0x8d, 0x28, 0xdf, 0x2c, 0xc3, 0x1a, 0xa8, 0x41,
1334 0x60, 0x96, 0x8d, 0xc8, 0x67, 0x96, 0x80, 0x0d, 0x46, 0x0c, 0x0c, 0x00,
1335 0x04, 0xc1, 0x20, 0xfa, 0x15, 0x5c, 0xb9, 0x46, 0x0c, 0x0c, 0x00, 0x04,
1336 0xc1, 0x20, 0x02, 0x17, 0x3f, 0x09, 0x2c, 0xd0, 0x11, 0xf9, 0x8c, 0x18,
1337 0x18, 0x00, 0x08, 0x82, 0x41, 0x24, 0x2e, 0xa1, 0x12, 0x58, 0xd0, 0x23,
1338 0xf2, 0xb1, 0xe0, 0x47, 0xe0, 0x33, 0x4b, 0xc0, 0x06, 0x03, 0x15, 0x83,
1339 0xa3, 0x06, 0xc2, 0x1a, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x41, 0x64,
1340 0x2e, 0xab, 0x32, 0x8d, 0x18, 0x18, 0x00, 0x08, 0x82, 0x41, 0x74, 0x2e,
1341 0xac, 0xb2, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x41, 0x84, 0x2e, 0xad,
1342 0x32, 0xcc, 0x12, 0xe8, 0xc1, 0x2c, 0x83, 0x1b, 0xe4, 0x81, 0x5b, 0x18,
1343 0x2b, 0xf4, 0x89, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1, 0x00, 0x3b,
1344 0x17, 0x53, 0xe9, 0x13, 0x56, 0x08, 0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1,
1345 0x00, 0x43, 0x97, 0x53, 0xe9, 0x13, 0x56, 0x08, 0xec, 0x15, 0xfa, 0x44,
1346 0x3e, 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0x80, 0xa9, 0x4b, 0xaa, 0xf4,
1347 0xc9, 0x2b, 0x04, 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0x80, 0xad, 0x8b,
1348 0xaa, 0xf4, 0xc9, 0x2b, 0x04, 0x26, 0x0b, 0x7d, 0x22, 0x9f, 0x11, 0x03,
1349 0x04, 0x00, 0x41, 0x30, 0xc0, 0xda, 0x85, 0x55, 0xfa, 0x44, 0x16, 0x82,
1350 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0xc0, 0xdc, 0xa5, 0x55, 0xfa, 0x44,
1351 0x16, 0x02, 0x6b, 0x83, 0x43, 0x3e, 0xe6, 0x06, 0x85, 0x7c, 0xec, 0x0d,
1352 0x06, 0xf9, 0x8c, 0x26, 0xf4, 0x08, 0x30, 0x1c, 0x11, 0xb0, 0x89, 0xf3,
1353 0xcd, 0x32, 0xe8, 0xc1, 0x1b, 0x04, 0xc3, 0x11, 0x85, 0x9b, 0x28, 0xdf,
1354 0x2c, 0x43, 0x1c, 0xc0, 0x41, 0x60, 0x06, 0x9c, 0xc8, 0x67, 0x96, 0x40,
1355 0x0e, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0x20, 0xca, 0x17, 0x79, 0x39,
1356 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0x20, 0xd2, 0x17, 0x5c, 0x09, 0x2c,
1357 0xa0, 0x13, 0xf9, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x41, 0xc4, 0x2f,
1358 0xbb, 0x12, 0x58, 0x70, 0x27, 0xf2, 0xb1, 0x20, 0x4f, 0xe0, 0x33, 0x4b,
1359 0x20, 0x07, 0x03, 0x15, 0x83, 0x03, 0x07, 0x42, 0x1c, 0x0c, 0x47, 0x34,
1360 0x77, 0xa2, 0x7c, 0xb3, 0x0c, 0x74, 0x30, 0x07, 0x81, 0x39, 0x79, 0x22,
1361 0x9f, 0x59, 0x82, 0x3a, 0x18, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0x48,
1362 0x64, 0xf6, 0xe5, 0x19, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0x68, 0x64,
1363 0xc2, 0x25, 0xb0, 0xa0, 0x4f, 0xe4, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08,
1364 0x06, 0x51, 0xc9, 0x90, 0x4b, 0x60, 0x01, 0xa8, 0xc8, 0xc7, 0x02, 0x51,
1365 0x81, 0xcf, 0x2c, 0x41, 0x1d, 0x0c, 0x54, 0x0c, 0xce, 0x1c, 0x08, 0x74,
1366 0x30, 0x1c, 0x51, 0x81, 0x8a, 0xf2, 0xcd, 0x32, 0xdc, 0x81, 0x1d, 0x04,
1367 0x66, 0x89, 0x8a, 0x7c, 0x66, 0x09, 0xf0, 0x60, 0xc4, 0xc0, 0x00, 0x40,
1368 0x10, 0x0c, 0xa2, 0x95, 0x21, 0x99, 0x6b, 0xc4, 0xc0, 0x00, 0x40, 0x10,
1369 0x0c, 0x22, 0x96, 0x51, 0x97, 0xc0, 0x02, 0x53, 0x91, 0xcf, 0x88, 0x81,
1370 0x01, 0x80, 0x20, 0x18, 0x44, 0x2e, 0xd3, 0x2e, 0x81, 0x05, 0xa9, 0x22,
1371 0x1f, 0x0b, 0x56, 0x05, 0x3e, 0xb3, 0x04, 0x78, 0x30, 0x50, 0x31, 0x38,
1372 0x76, 0x20, 0xdc, 0xc1, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x44, 0x32,
1373 0x73, 0x2f, 0xd3, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x44, 0x33, 0x83,
1374 0x2f, 0xcb, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0x44, 0x34, 0x93, 0x2f,
1375 0xc3, 0x2c, 0x81, 0x1e, 0x18, 0x2c, 0xe0, 0x83, 0x7c, 0x2c, 0x16, 0xf0,
1376 0x41, 0x3e, 0x26, 0x0b, 0xf8, 0x20, 0x9f, 0x59, 0x02, 0x3d, 0x18, 0xa8,
1377 0x19, 0xdc, 0x02, 0x0c, 0x8c, 0x3c, 0x20, 0x0b, 0x31, 0x20, 0x07, 0x36,
1378 0x60, 0x05, 0x37, 0x60, 0xf0, 0x60, 0xa0, 0x66, 0x70, 0x0b, 0x30, 0x30,
1379 0xf2, 0x80, 0x2c, 0xc4, 0x80, 0x1c, 0xd8, 0x80, 0x15, 0xdc, 0x80, 0xc1,
1380 0x83, 0x81, 0x9a, 0xc1, 0x2d, 0xc0, 0xc0, 0xc8, 0x03, 0xb2, 0x10, 0x03,
1381 0x72, 0x60, 0x03, 0x56, 0x70, 0x03, 0x06, 0x0f, 0x6c, 0x48, 0x15, 0xf9,
1382 0xd8, 0x90, 0x2a, 0xf2, 0xb1, 0x21, 0x55, 0xe4, 0x63, 0xe5, 0x91, 0x2a,
1383 0xf2, 0x19, 0x31, 0x48, 0x00, 0x10, 0x04, 0x03, 0x44, 0x6c, 0x46, 0x26,
1384 0x67, 0x72, 0xe6, 0x65, 0x88, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40,
1385 0xc4, 0x66, 0x64, 0x72, 0x26, 0x67, 0x4e, 0x66, 0x18, 0x31, 0x48, 0x00,
1386 0x10, 0x04, 0x03, 0x44, 0x6c, 0x46, 0x26, 0x67, 0x72, 0xc6, 0x65, 0x84,
1387 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xc4, 0x66, 0x64, 0x72, 0x26,
1388 0x67, 0x62, 0x26, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00
1389};
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Advanced.hlsl b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Advanced.hlsl
new file mode 100644
index 0000000..1c869b8
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Advanced.hlsl
@@ -0,0 +1,8 @@
1
2#include "D3D12_PixelShader_Common.hlsli"
3
4[RootSignature(AdvancedRS)]
5float4 main(PixelShaderInput input) : SV_TARGET
6{
7 return AdvancedPixelShader(input);
8}
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Colors.h b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Colors.h
new file mode 100644
index 0000000..7b1a917
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Colors.h
@@ -0,0 +1,490 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; SV_Position 0 xyzw 0 POS float
8; TEXCOORD 0 xy 1 NONE float
9; COLOR 0 xyzw 2 NONE float xyzw
10;
11;
12; Output signature:
13;
14; Name Index Mask Register SysValue Format Used
15; -------------------- ----- ------ -------- -------- ------- ------
16; SV_Target 0 xyzw 0 TARGET float xyzw
17;
18; shader hash: cef595d746206d54840a8f4fa9597d19
19;
20; Pipeline Runtime Information:
21;
22; Pixel Shader
23; DepthOutput=0
24; SampleFrequency=0
25;
26;
27; Input signature:
28;
29; Name Index InterpMode DynIdx
30; -------------------- ----- ---------------------- ------
31; SV_Position 0 noperspective
32; TEXCOORD 0 linear
33; COLOR 0 linear
34;
35; Output signature:
36;
37; Name Index InterpMode DynIdx
38; -------------------- ----- ---------------------- ------
39; SV_Target 0
40;
41; Buffer Definitions:
42;
43; cbuffer Constants
44; {
45;
46; struct Constants
47; {
48;
49; float scRGB_output; ; Offset: 0
50; float texture_type; ; Offset: 4
51; float input_type; ; Offset: 8
52; float color_scale; ; Offset: 12
53; float tonemap_method; ; Offset: 16
54; float tonemap_factor1; ; Offset: 20
55; float tonemap_factor2; ; Offset: 24
56; float sdr_white_point; ; Offset: 28
57; float4 Yoffset; ; Offset: 32
58; float4 Rcoeff; ; Offset: 48
59; float4 Gcoeff; ; Offset: 64
60; float4 Bcoeff; ; Offset: 80
61;
62; } Constants; ; Offset: 0 Size: 96
63;
64; }
65;
66;
67; Resource Bindings:
68;
69; Name Type Format Dim ID HLSL Bind Count
70; ------------------------------ ---------- ------- ----------- ------- -------------- ------
71; Constants cbuffer NA NA CB0 cb1 1
72;
73;
74; ViewId state:
75;
76; Number of inputs: 12, outputs: 4
77; Outputs dependent on ViewId: { }
78; Inputs contributing to computation of Outputs:
79; output 0 depends on inputs: { 8 }
80; output 1 depends on inputs: { 9 }
81; output 2 depends on inputs: { 10 }
82; output 3 depends on inputs: { 11 }
83;
84target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
85target triple = "dxil-ms-dx"
86
87%dx.types.Handle = type { i8* }
88%dx.types.CBufRet.f32 = type { float, float, float, float }
89%Constants = type { float, float, float, float, float, float, float, float, <4 x float>, <4 x float>, <4 x float>, <4 x float> }
90
91define void @main() {
92 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 1, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
93 %2 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
94 %3 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
95 %4 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
96 %5 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
97 %6 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 0) ; CBufferLoadLegacy(handle,regIndex)
98 %7 = extractvalue %dx.types.CBufRet.f32 %6, 3
99 %8 = fmul fast float %7, %2
100 %9 = fmul fast float %7, %3
101 %10 = fmul fast float %7, %4
102 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %8) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
103 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %9) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
104 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %10) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
105 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %5) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
106 ret void
107}
108
109; Function Attrs: nounwind readnone
110declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
111
112; Function Attrs: nounwind
113declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
114
115; Function Attrs: nounwind readonly
116declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
117
118; Function Attrs: nounwind readonly
119declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
120
121attributes #0 = { nounwind readnone }
122attributes #1 = { nounwind }
123attributes #2 = { nounwind readonly }
124
125!llvm.ident = !{!0}
126!dx.version = !{!1}
127!dx.valver = !{!2}
128!dx.shaderModel = !{!3}
129!dx.resources = !{!4}
130!dx.viewIdState = !{!7}
131!dx.entryPoints = !{!8}
132
133!0 = !{!"clang version 3.7 (tags/RELEASE_370/final)"}
134!1 = !{i32 1, i32 0}
135!2 = !{i32 1, i32 6}
136!3 = !{!"ps", i32 6, i32 0}
137!4 = !{null, null, !5, null}
138!5 = !{!6}
139!6 = !{i32 0, %Constants* undef, !"", i32 0, i32 1, i32 1, i32 96, null}
140!7 = !{[14 x i32] [i32 12, i32 4, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 4, i32 8]}
141!8 = !{void ()* @main, !"main", !9, !4, null}
142!9 = !{!10, !16, null}
143!10 = !{!11, !13, !14}
144!11 = !{i32 0, !"SV_Position", i8 9, i8 3, !12, i8 4, i32 1, i8 4, i32 0, i8 0, null}
145!12 = !{i32 0}
146!13 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !12, i8 2, i32 1, i8 2, i32 1, i8 0, null}
147!14 = !{i32 2, !"COLOR", i8 9, i8 0, !12, i8 2, i32 1, i8 4, i32 2, i8 0, !15}
148!15 = !{i32 3, i32 15}
149!16 = !{!17}
150!17 = !{i32 0, !"SV_Target", i8 9, i8 16, !12, i8 0, i32 1, i8 4, i32 0, i8 0, !15}
151
152#endif
153
154const unsigned char g_main[] = {
155 0x44, 0x58, 0x42, 0x43, 0xe0, 0x6a, 0x51, 0x4c, 0x14, 0x1a, 0x6a, 0x67,
156 0x04, 0x23, 0x10, 0x54, 0xf8, 0xe3, 0xa6, 0x1a, 0x01, 0x00, 0x00, 0x00,
157 0xb1, 0x0f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
158 0x50, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00,
159 0x01, 0x02, 0x00, 0x00, 0x51, 0x02, 0x00, 0x00, 0x85, 0x09, 0x00, 0x00,
160 0xa1, 0x09, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
162 0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
170 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00,
172 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c,
173 0x4f, 0x52, 0x00, 0x4f, 0x53, 0x47, 0x31, 0x32, 0x00, 0x00, 0x00, 0x01,
174 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03,
176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
178 0x00, 0x50, 0x53, 0x56, 0x30, 0xe4, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
181 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
184 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
185 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
186 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43,
187 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189 0x00, 0x01, 0x00, 0x44, 0x03, 0x03, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, 0x03, 0x02, 0x00,
191 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44,
192 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x01, 0x00, 0x44, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
197 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53,
198 0x30, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
199 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
200 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
201 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x00, 0x18, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x2c, 0x07, 0x00,
205 0x00, 0x60, 0x00, 0x00, 0x00, 0xcb, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49,
206 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x07, 0x00,
207 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xc2, 0x01, 0x00,
208 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
209 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
210 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
211 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32,
212 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14,
213 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e,
214 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
215 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00,
216 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8,
217 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86,
218 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00,
219 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08,
220 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00,
221 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4,
222 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a,
223 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x5c, 0x23, 0x00, 0x25, 0x00, 0x14,
224 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84,
225 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb,
226 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2,
227 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e,
228 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30,
229 0x42, 0x6d, 0x8e, 0x20, 0x28, 0x06, 0x23, 0x85, 0x90, 0x47, 0x70, 0x20,
230 0x60, 0x18, 0x81, 0x18, 0x2e, 0xe1, 0x9c, 0x46, 0x9a, 0x80, 0x66, 0x92,
231 0x10, 0x33, 0xc6, 0x18, 0x63, 0x8c, 0x31, 0xe7, 0x9c, 0x44, 0xd3, 0x81,
232 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87,
233 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0,
234 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0,
235 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20,
236 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
237 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30,
238 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40,
239 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0,
240 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30,
241 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
242 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30,
243 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10,
245 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10,
246 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2,
247 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
248 0xe4, 0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x20, 0x0b, 0x04, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
250 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
251 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x1c, 0x50, 0x06, 0xe5, 0x50,
252 0x12, 0x85, 0x50, 0x10, 0x85, 0x51, 0x20, 0x85, 0x52, 0x30, 0x85, 0x53,
253 0x40, 0x05, 0x56, 0x80, 0x01, 0x05, 0x1a, 0x50, 0x04, 0xe5, 0x41, 0xa5,
254 0x24, 0xca, 0xa0, 0x10, 0x46, 0x00, 0x8a, 0xa0, 0x40, 0xe8, 0xd5, 0x00,
255 0xd1, 0x19, 0x00, 0xaa, 0x33, 0x00, 0x64, 0xc7, 0x72, 0x18, 0x02, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x00, 0x79, 0x18, 0x00,
257 0x00, 0xc9, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13,
258 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b,
259 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b,
260 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9,
261 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13,
262 0x04, 0xa2, 0x98, 0x20, 0x10, 0xc6, 0x06, 0x61, 0x20, 0x36, 0x08, 0x04,
263 0x41, 0x01, 0x6e, 0x6e, 0x82, 0x40, 0x1c, 0x1b, 0x86, 0x03, 0x21, 0x26,
264 0x08, 0x55, 0x18, 0x30, 0x19, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3,
265 0x9b, 0x9b, 0x20, 0x10, 0xc8, 0x06, 0x84, 0x50, 0x16, 0x62, 0x18, 0x18,
266 0x60, 0x43, 0xd0, 0x6c, 0x20, 0x00, 0xc0, 0x01, 0x26, 0x08, 0x14, 0x18,
267 0x90, 0x99, 0x1b, 0x93, 0x3a, 0x12, 0xfa, 0x7a, 0xab, 0xa3, 0x83, 0xab,
268 0xa3, 0x9b, 0x20, 0x10, 0xc9, 0x04, 0x81, 0x50, 0x26, 0x08, 0xc4, 0xb2,
269 0xc1, 0x40, 0x22, 0x89, 0x98, 0x28, 0x32, 0x74, 0x65, 0x78, 0x74, 0x75,
270 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x13, 0x04, 0x82, 0xd9, 0x60,
271 0x20, 0x96, 0x74, 0x4d, 0x14, 0x95, 0x34, 0x37, 0xb8, 0x3a, 0xba, 0x2f,
272 0xba, 0x3c, 0xb8, 0xb2, 0x09, 0x02, 0xd1, 0x6c, 0x30, 0x90, 0x4c, 0xd2,
273 0x26, 0x8a, 0xcb, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0xd7, 0xdc, 0x58, 0x18,
274 0x5b, 0xd9, 0x04, 0x81, 0x70, 0x26, 0x08, 0xcf, 0xb7, 0x01, 0x41, 0x38,
275 0xa9, 0x9b, 0x28, 0xca, 0xa3, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16, 0x06,
276 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0x36, 0x41, 0x20, 0x9e, 0x0d,
277 0x06, 0x02, 0x06, 0x52, 0x18, 0x4c, 0x14, 0x1f, 0xba, 0x37, 0xb7, 0xb2,
278 0xb6, 0x30, 0xb8, 0x2f, 0xb3, 0xb0, 0x31, 0xba, 0x37, 0xb9, 0x98, 0x09,
279 0x02, 0x01, 0x6d, 0x30, 0x90, 0x31, 0x90, 0xc8, 0x60, 0xa2, 0xf8, 0xd0,
280 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0x99, 0x85, 0x8d, 0xd1, 0xbd,
281 0xc9, 0xc9, 0x4c, 0x10, 0x88, 0x68, 0x83, 0x81, 0x98, 0x81, 0x74, 0x06,
282 0x13, 0xc5, 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec,
283 0x0b, 0xee, 0x2d, 0xcd, 0x8d, 0x6e, 0x82, 0x40, 0x48, 0x1b, 0x0c, 0x24,
284 0x0d, 0x24, 0x35, 0x98, 0x28, 0x1e, 0x59, 0x6f, 0x66, 0x66, 0x73, 0x65,
285 0x74, 0x13, 0x04, 0x62, 0xda, 0x60, 0x20, 0x6c, 0x20, 0xb5, 0xc1, 0x44,
286 0xd1, 0x90, 0x1a, 0x7b, 0x2b, 0x33, 0x33, 0x9b, 0x20, 0x10, 0xd4, 0x06,
287 0x03, 0x79, 0x03, 0x09, 0x0e, 0x26, 0x8a, 0xc6, 0xd1, 0xd8, 0x5b, 0x99,
288 0x99, 0xd9, 0x04, 0x81, 0xa8, 0x36, 0x18, 0x88, 0x1c, 0x48, 0x73, 0x30,
289 0x51, 0x34, 0x84, 0xc6, 0xde, 0xca, 0xcc, 0xcc, 0x26, 0x08, 0x84, 0xb5,
290 0xc1, 0x40, 0xea, 0x40, 0xb2, 0x83, 0x89, 0xda, 0xd0, 0x30, 0x15, 0xb6,
291 0x7d, 0x62, 0x50, 0x06, 0x68, 0xb0, 0x06, 0x6e, 0x10, 0x07, 0x74, 0x70,
292 0x07, 0x1b, 0x06, 0x02, 0xc2, 0x83, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36,
293 0x0c, 0xc4, 0x1e, 0xec, 0xc1, 0x86, 0x80, 0x0f, 0x36, 0x0c, 0x83, 0x1e,
294 0xf4, 0xc1, 0x04, 0xc1, 0x12, 0x83, 0x0d, 0xc1, 0x1f, 0x90, 0x68, 0x0b,
295 0x4b, 0x73, 0xe3, 0x32, 0x65, 0xf5, 0x05, 0xf5, 0x36, 0x97, 0x46, 0x97,
296 0xf6, 0xe6, 0x36, 0x41, 0x28, 0xb2, 0x09, 0x42, 0xa1, 0x6d, 0x08, 0x88,
297 0x09, 0x42, 0xb1, 0x4d, 0x10, 0x0a, 0x6e, 0xc3, 0x42, 0x88, 0xc2, 0x28,
298 0x90, 0x42, 0x29, 0x98, 0xc2, 0x60, 0x0a, 0xc4, 0x29, 0x00, 0x44, 0xa8,
299 0x8a, 0xb0, 0x86, 0x9e, 0x9e, 0xa4, 0x88, 0x26, 0x08, 0x45, 0xb7, 0x61,
300 0x19, 0x52, 0x61, 0x14, 0x4e, 0xa1, 0x14, 0x54, 0x61, 0x50, 0x85, 0xe1,
301 0x14, 0x80, 0x09, 0x02, 0x71, 0xb1, 0x18, 0x7a, 0x62, 0x7a, 0x92, 0x9a,
302 0x20, 0x10, 0xd8, 0x06, 0x41, 0x72, 0x85, 0x0d, 0x0b, 0x2b, 0xb4, 0xc2,
303 0x28, 0x9c, 0x42, 0x29, 0xa8, 0xc2, 0x60, 0x0a, 0xac, 0x70, 0x0a, 0xaf,
304 0xb0, 0x61, 0x40, 0x85, 0x55, 0x80, 0x05, 0x26, 0x53, 0x56, 0x5f, 0x54,
305 0x61, 0x72, 0x67, 0x65, 0x74, 0x13, 0x84, 0xc2, 0xdb, 0xb0, 0x10, 0xb2,
306 0x30, 0x0a, 0xb3, 0x50, 0x0a, 0xa7, 0x30, 0x98, 0x02, 0x71, 0x0a, 0xaf,
307 0xb0, 0x21, 0xa0, 0x85, 0x0d, 0x43, 0x2c, 0xd4, 0x02, 0xb0, 0xa1, 0xd0,
308 0x83, 0x50, 0xb0, 0x85, 0x07, 0xa0, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x37,
309 0xc7, 0x22, 0xcd, 0x6d, 0x8e, 0x6e, 0x8e, 0xc6, 0x5c, 0xda, 0xd9, 0x17,
310 0x1b, 0x19, 0x8d, 0xb9, 0xb4, 0xb3, 0xaf, 0x39, 0xba, 0x0d, 0x08, 0x2e,
311 0x48, 0xb9, 0xe0, 0x0a, 0xba, 0x70, 0xed, 0xc2, 0x55, 0x85, 0x8d, 0xcd,
312 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10, 0x54, 0x21,
313 0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b, 0x12, 0x10,
314 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, 0xd8, 0xec, 0xca, 0xe4, 0xa6, 0x04,
315 0x45, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2, 0x32, 0xb9, 0xa6,
316 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c, 0xcf, 0x45, 0xae,
317 0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0xe0, 0x54, 0x22,
318 0xc3, 0x73, 0xa1, 0xcb, 0x83, 0x2b, 0x0b, 0x72, 0x73, 0x7b, 0xa3, 0x0b,
319 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x22, 0xe0, 0x41, 0x1f, 0xd4, 0x21,
320 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2, 0x0b, 0xa3,
321 0x2b, 0x9b, 0x12, 0xfc, 0x41, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a,
322 0xb9, 0x3c, 0xa8, 0xb7, 0x34, 0x37, 0xba, 0xb9, 0x29, 0x81, 0x2d, 0x74,
323 0x21, 0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, 0x2b, 0x93, 0x9b, 0x9b,
324 0x12, 0xec, 0x02, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00,
325 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
326 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
327 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
328 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
329 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
330 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
331 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
332 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
333 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
334 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
335 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
336 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
337 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
338 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
339 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
340 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
341 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
342 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
343 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
344 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
345 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
346 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
347 0xc4, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28, 0x87, 0x76, 0x80, 0x87,
348 0x19, 0xd1, 0x43, 0x0e, 0xf8, 0xe0, 0x06, 0xe4, 0x20, 0x0e, 0xe7, 0xe0,
349 0x06, 0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1, 0x90, 0x0f, 0xef, 0x50,
350 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x14, 0x00, 0x00,
351 0x00, 0x36, 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41,
352 0x44, 0xa5, 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d,
353 0x04, 0xd2, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08,
354 0x34, 0xc3, 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03,
355 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5,
356 0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f,
357 0xdc, 0xb6, 0x01, 0x10, 0x0c, 0x80, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0xce, 0xf5, 0x95, 0xd7, 0x46, 0x20, 0x6d, 0x54, 0x84, 0x0a, 0x8f,
360 0x4f, 0xa9, 0x59, 0x7d, 0x19, 0x44, 0x58, 0x49, 0x4c, 0x08, 0x06, 0x00,
361 0x00, 0x60, 0x00, 0x00, 0x00, 0x82, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49,
362 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x05, 0x00,
363 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x79, 0x01, 0x00,
364 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
365 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
366 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
367 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32,
368 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14,
369 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e,
370 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
371 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00,
372 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8,
373 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86,
374 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00,
375 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08,
376 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x21, 0x00, 0x00,
377 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4,
378 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a,
379 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x5c, 0x23, 0x00, 0x25, 0x00, 0x14,
380 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84,
381 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb,
382 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2,
383 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e,
384 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30,
385 0x42, 0x6d, 0x8e, 0x20, 0x28, 0x06, 0x23, 0x85, 0x90, 0x47, 0x70, 0x20,
386 0x60, 0x18, 0x81, 0x18, 0x2e, 0xe1, 0x9c, 0x46, 0x9a, 0x80, 0x66, 0x92,
387 0x10, 0x33, 0xc6, 0x18, 0x63, 0x8c, 0x31, 0xe7, 0x9c, 0x44, 0xd3, 0x81,
388 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87,
389 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0,
390 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0,
391 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20,
392 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
393 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30,
394 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40,
395 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0,
396 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30,
397 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
398 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30,
399 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10,
401 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10,
402 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2,
403 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
404 0xe4, 0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
406 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
407 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x1c, 0x50, 0x04, 0x65, 0x50,
408 0x1e, 0x54, 0x4a, 0xa2, 0x0c, 0x0a, 0x61, 0x04, 0xa0, 0x08, 0x0a, 0x84,
409 0xea, 0x0c, 0x00, 0xd9, 0xb1, 0x1c, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x08, 0x04, 0x02, 0x01, 0x79, 0x18, 0x00, 0x00, 0x5c, 0x00, 0x00,
411 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x35, 0x18, 0x63,
412 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03,
413 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b, 0x9b, 0x7b, 0x91, 0x2a,
414 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9, 0x81, 0x79, 0x31, 0x4b,
415 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xa2, 0x98, 0x20,
416 0x10, 0xc6, 0x06, 0x61, 0x20, 0x26, 0x08, 0xc4, 0xb1, 0x41, 0x18, 0x0c,
417 0x0a, 0x70, 0x73, 0x1b, 0x06, 0xc4, 0x20, 0x26, 0x08, 0x95, 0x44, 0x60,
418 0x82, 0x40, 0x20, 0x1b, 0x10, 0x42, 0x59, 0x88, 0x61, 0x60, 0x80, 0x0d,
419 0x41, 0xb3, 0x81, 0x00, 0x00, 0x07, 0x98, 0x20, 0x58, 0xd3, 0x86, 0x00,
420 0x9a, 0x20, 0x08, 0x00, 0x89, 0xb6, 0xb0, 0x34, 0x37, 0x2e, 0x53, 0x56,
421 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x13, 0x84, 0x82,
422 0x99, 0x20, 0x14, 0xcd, 0x86, 0x80, 0x98, 0x20, 0x14, 0xce, 0x04, 0xa1,
423 0x78, 0x36, 0x2c, 0x04, 0x55, 0x59, 0x17, 0x36, 0x60, 0x44, 0x06, 0x10,
424 0xa1, 0x2a, 0xc2, 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20, 0x14, 0xd0,
425 0x86, 0x65, 0xd8, 0xaa, 0xec, 0xe2, 0x06, 0x6e, 0xc8, 0x80, 0x09, 0x02,
426 0x91, 0xb0, 0x18, 0x7a, 0x62, 0x7a, 0x92, 0x9a, 0x20, 0x10, 0xca, 0x04,
427 0x81, 0x58, 0x36, 0x08, 0x60, 0x10, 0x06, 0x1b, 0x16, 0xef, 0xab, 0xb2,
428 0x8b, 0x1b, 0x30, 0x2f, 0x13, 0x83, 0x0d, 0x83, 0xd6, 0x8d, 0x01, 0x93,
429 0x29, 0xab, 0x2f, 0xaa, 0x30, 0xb9, 0xb3, 0x32, 0xba, 0x09, 0x42, 0x11,
430 0x6d, 0x58, 0x88, 0x32, 0xa8, 0xcc, 0xe0, 0xca, 0x06, 0x8c, 0xc8, 0xc4,
431 0x60, 0x43, 0x70, 0x06, 0x1b, 0x06, 0x32, 0x40, 0x03, 0x60, 0x43, 0x21,
432 0x4d, 0x69, 0xf0, 0x00, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8,
433 0xca, 0xdc, 0xe8, 0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17, 0xbb, 0x32,
434 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c, 0xcf, 0xc5,
435 0x2e, 0x8c, 0xcd, 0xae, 0x4c, 0x6e, 0x4a, 0x60, 0xd4, 0x21, 0xc3, 0x73,
436 0x99, 0x43, 0x0b, 0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b, 0x63, 0x9b,
437 0x12, 0x20, 0x65, 0xc8, 0xf0, 0x5c, 0xe4, 0xca, 0xe6, 0xde, 0xea, 0xe4,
438 0xc6, 0xca, 0xe6, 0xa6, 0x04, 0x4e, 0x1d, 0x32, 0x3c, 0x17, 0xbb, 0xb4,
439 0xb2, 0xbb, 0x24, 0xb2, 0x29, 0xba, 0x30, 0xba, 0xb2, 0x29, 0x01, 0x54,
440 0x87, 0x0c, 0xcf, 0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd,
441 0x8d, 0x6e, 0x6e, 0x4a, 0x90, 0x06, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
442 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
443 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
444 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
445 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
446 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
447 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
448 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
449 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
450 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
451 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
452 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
453 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
454 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
455 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
456 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
457 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
458 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
459 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
460 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
461 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
462 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
463 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
464 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28,
465 0x87, 0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e, 0xf8, 0xe0, 0x06, 0xe4,
466 0x20, 0x0e, 0xe7, 0xe0, 0x06, 0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1,
467 0x90, 0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
468 0x00, 0x14, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe,
469 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02,
470 0xe6, 0x17, 0xb7, 0x6d, 0x04, 0xd2, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11,
471 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe,
472 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6,
473 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4,
474 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x01, 0x10, 0x0c, 0x80, 0x34, 0x00,
475 0x00, 0x61, 0x20, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41,
476 0x2c, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x44, 0x0a, 0x61,
477 0x06, 0xa0, 0x14, 0x4a, 0xae, 0xec, 0xa8, 0x94, 0x00, 0xbd, 0x11, 0x00,
478 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x00, 0x5d, 0xc4, 0x52, 0x59,
479 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x1b, 0x32, 0x59, 0xcd,
480 0x31, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x06, 0x97, 0x50, 0x17, 0x81,
481 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xd1, 0x29, 0x15, 0xe6, 0x24,
482 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x78, 0x8b, 0x95, 0x49, 0xca,
483 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0x1d, 0x52, 0x68, 0xa3, 0x09,
484 0xc1, 0x60, 0x81, 0x21, 0x1f, 0x13, 0x0c, 0xf9, 0xd8, 0x60, 0xc8, 0x67,
485 0xc4, 0x20, 0x01, 0x40, 0x10, 0x0c, 0x90, 0x31, 0x78, 0xbe, 0xcf, 0x1a,
486 0x46, 0x0c, 0x12, 0x00, 0x04, 0xc1, 0x00, 0x19, 0x83, 0xe7, 0xfb, 0x18,
487 0x61, 0xc4, 0x20, 0x01, 0x40, 0x10, 0x0c, 0x90, 0x31, 0x78, 0xbe, 0xaf,
488 0x0a, 0x46, 0x0c, 0x12, 0x00, 0x04, 0xc1, 0x00, 0x19, 0x83, 0xe7, 0xfb,
489 0x30, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
490};
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Colors.hlsl b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Colors.hlsl
new file mode 100644
index 0000000..834d629
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Colors.hlsl
@@ -0,0 +1,8 @@
1
2#include "D3D12_PixelShader_Common.hlsli"
3
4[RootSignature(ColorRS)]
5float4 main(PixelShaderInput input) : SV_TARGET0
6{
7 return GetOutputColor(1.0) * input.color;
8}
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Common.hlsli b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Common.hlsli
new file mode 100644
index 0000000..ba32e0c
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Common.hlsli
@@ -0,0 +1,236 @@
1#include "D3D12_Shader_Common.hlsli"
2
3Texture2D texture0 : register(t0);
4Texture2D texture1 : register(t1);
5Texture2D texture2 : register(t2);
6SamplerState sampler0 : register(s0);
7
8struct PixelShaderInput
9{
10 float4 pos : SV_POSITION;
11 float2 tex : TEXCOORD0;
12 float4 color : COLOR0;
13};
14
15// These should mirror the definitions in SDL_render_d3d12.c
16static const float TONEMAP_NONE = 0;
17static const float TONEMAP_LINEAR = 1;
18static const float TONEMAP_CHROME = 2;
19
20static const float TEXTURETYPE_NONE = 0;
21static const float TEXTURETYPE_RGB = 1;
22static const float TEXTURETYPE_NV12 = 2;
23static const float TEXTURETYPE_NV21 = 3;
24static const float TEXTURETYPE_YUV = 4;
25
26static const float INPUTTYPE_UNSPECIFIED = 0;
27static const float INPUTTYPE_SRGB = 1;
28static const float INPUTTYPE_SCRGB = 2;
29static const float INPUTTYPE_HDR10 = 3;
30
31cbuffer Constants : register(b1)
32{
33 float scRGB_output;
34 float texture_type;
35 float input_type;
36 float color_scale;
37
38 float tonemap_method;
39 float tonemap_factor1;
40 float tonemap_factor2;
41 float sdr_white_point;
42
43 float4 Yoffset;
44 float4 Rcoeff;
45 float4 Gcoeff;
46 float4 Bcoeff;
47};
48
49static const float3x3 mat709to2020 = {
50 { 0.627404, 0.329283, 0.043313 },
51 { 0.069097, 0.919541, 0.011362 },
52 { 0.016391, 0.088013, 0.895595 }
53};
54
55static const float3x3 mat2020to709 = {
56 { 1.660496, -0.587656, -0.072840 },
57 { -0.124547, 1.132895, -0.008348 },
58 { -0.018154, -0.100597, 1.118751 }
59};
60
61float sRGBtoLinear(float v)
62{
63 if (v <= 0.04045) {
64 v = (v / 12.92);
65 } else {
66 v = pow(abs(v + 0.055) / 1.055, 2.4);
67 }
68 return v;
69}
70
71float sRGBfromLinear(float v)
72{
73 if (v <= 0.0031308) {
74 v = (v * 12.92);
75 } else {
76 v = (pow(abs(v), 1.0 / 2.4) * 1.055 - 0.055);
77 }
78 return v;
79}
80
81float3 PQtoLinear(float3 v)
82{
83 const float c1 = 0.8359375;
84 const float c2 = 18.8515625;
85 const float c3 = 18.6875;
86 const float oo_m1 = 1.0 / 0.1593017578125;
87 const float oo_m2 = 1.0 / 78.84375;
88
89 float3 num = max(pow(abs(v), oo_m2) - c1, 0.0);
90 float3 den = c2 - c3 * pow(abs(v), oo_m2);
91 return (10000.0 * pow(abs(num / den), oo_m1) / sdr_white_point);
92}
93
94float3 ApplyTonemap(float3 v)
95{
96 if (tonemap_method == TONEMAP_LINEAR) {
97 v *= tonemap_factor1;
98 } else if (tonemap_method == TONEMAP_CHROME) {
99 if (input_type == INPUTTYPE_SCRGB) {
100 // Convert to BT.2020 colorspace for tone mapping
101 v = mul(mat709to2020, v);
102 }
103
104 float vmax = max(v.r, max(v.g, v.b));
105 if (vmax > 0.0) {
106 float scale = (1.0 + tonemap_factor1 * vmax) / (1.0 + tonemap_factor2 * vmax);
107 v *= scale;
108 }
109
110 if (input_type == INPUTTYPE_SCRGB) {
111 // Convert to BT.709 colorspace after tone mapping
112 v = mul(mat2020to709, v);
113 }
114 }
115 return v;
116}
117
118float4 GetInputColor(PixelShaderInput input)
119{
120 float4 rgba;
121
122 if (texture_type == TEXTURETYPE_NONE) {
123 rgba = 1.0;
124 } else if (texture_type == TEXTURETYPE_RGB) {
125 rgba = texture0.Sample(sampler0, input.tex);
126 } else if (texture_type == TEXTURETYPE_NV12) {
127 float3 yuv;
128 yuv.x = texture0.Sample(sampler0, input.tex).r;
129 yuv.yz = texture1.Sample(sampler0, input.tex).rg;
130
131 yuv += Yoffset.xyz;
132 rgba.r = dot(yuv, Rcoeff.xyz);
133 rgba.g = dot(yuv, Gcoeff.xyz);
134 rgba.b = dot(yuv, Bcoeff.xyz);
135 rgba.a = 1.0;
136 } else if (texture_type == TEXTURETYPE_NV21) {
137 float3 yuv;
138 yuv.x = texture0.Sample(sampler0, input.tex).r;
139 yuv.yz = texture1.Sample(sampler0, input.tex).gr;
140
141 yuv += Yoffset.xyz;
142 rgba.r = dot(yuv, Rcoeff.xyz);
143 rgba.g = dot(yuv, Gcoeff.xyz);
144 rgba.b = dot(yuv, Bcoeff.xyz);
145 rgba.a = 1.0;
146 } else if (texture_type == TEXTURETYPE_YUV) {
147 float3 yuv;
148 yuv.x = texture0.Sample(sampler0, input.tex).r;
149 yuv.y = texture1.Sample(sampler0, input.tex).r;
150 yuv.z = texture2.Sample(sampler0, input.tex).r;
151
152 yuv += Yoffset.xyz;
153 rgba.r = dot(yuv, Rcoeff.xyz);
154 rgba.g = dot(yuv, Gcoeff.xyz);
155 rgba.b = dot(yuv, Bcoeff.xyz);
156 rgba.a = 1.0;
157 } else {
158 // Error!
159 rgba.r = 1.0;
160 rgba.g = 0.0;
161 rgba.b = 0.0;
162 rgba.a = 1.0;
163 }
164 return rgba;
165}
166
167float4 GetOutputColor(float4 rgba)
168{
169 float4 output;
170
171 output.rgb = rgba.rgb * color_scale;
172 output.a = rgba.a;
173
174 return output;
175}
176
177float3 GetOutputColorFromSRGB(float3 rgb)
178{
179 float3 output;
180
181 if (scRGB_output) {
182 rgb.r = sRGBtoLinear(rgb.r);
183 rgb.g = sRGBtoLinear(rgb.g);
184 rgb.b = sRGBtoLinear(rgb.b);
185 }
186
187 output.rgb = rgb * color_scale;
188
189 return output;
190}
191
192float3 GetOutputColorFromLinear(float3 rgb)
193{
194 float3 output;
195
196 output.rgb = rgb * color_scale;
197
198 if (!scRGB_output) {
199 output.r = sRGBfromLinear(output.r);
200 output.g = sRGBfromLinear(output.g);
201 output.b = sRGBfromLinear(output.b);
202 output.rgb = saturate(output.rgb);
203 }
204
205 return output;
206}
207
208float4 AdvancedPixelShader(PixelShaderInput input)
209{
210 float4 rgba = GetInputColor(input);
211 float4 output;
212
213 if (input_type == INPUTTYPE_HDR10) {
214 rgba.rgb = PQtoLinear(rgba.rgb);
215 }
216
217 if (tonemap_method != TONEMAP_NONE) {
218 rgba.rgb = ApplyTonemap(rgba.rgb);
219 }
220
221 if (input_type == INPUTTYPE_SRGB) {
222 output.rgb = GetOutputColorFromSRGB(rgba.rgb);
223 output.a = rgba.a;
224 } else if (input_type == INPUTTYPE_SCRGB) {
225 output.rgb = GetOutputColorFromLinear(rgba.rgb);
226 output.a = rgba.a;
227 } else if (input_type == INPUTTYPE_HDR10) {
228 rgba.rgb = mul(mat2020to709, rgba.rgb);
229 output.rgb = GetOutputColorFromLinear(rgba.rgb);
230 output.a = rgba.a;
231 } else {
232 output = GetOutputColor(rgba);
233 }
234
235 return output * input.color;
236}
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Textures.h b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Textures.h
new file mode 100644
index 0000000..4aa8ef0
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Textures.h
@@ -0,0 +1,586 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; SV_Position 0 xyzw 0 POS float
8; TEXCOORD 0 xy 1 NONE float xy
9; COLOR 0 xyzw 2 NONE float xyzw
10;
11;
12; Output signature:
13;
14; Name Index Mask Register SysValue Format Used
15; -------------------- ----- ------ -------- -------- ------- ------
16; SV_Target 0 xyzw 0 TARGET float xyzw
17;
18; shader hash: 7a58efcd6cfa5eef872e7cbc3b5f38b8
19;
20; Pipeline Runtime Information:
21;
22; Pixel Shader
23; DepthOutput=0
24; SampleFrequency=0
25;
26;
27; Input signature:
28;
29; Name Index InterpMode DynIdx
30; -------------------- ----- ---------------------- ------
31; SV_Position 0 noperspective
32; TEXCOORD 0 linear
33; COLOR 0 linear
34;
35; Output signature:
36;
37; Name Index InterpMode DynIdx
38; -------------------- ----- ---------------------- ------
39; SV_Target 0
40;
41; Buffer Definitions:
42;
43; cbuffer Constants
44; {
45;
46; struct Constants
47; {
48;
49; float scRGB_output; ; Offset: 0
50; float texture_type; ; Offset: 4
51; float input_type; ; Offset: 8
52; float color_scale; ; Offset: 12
53; float tonemap_method; ; Offset: 16
54; float tonemap_factor1; ; Offset: 20
55; float tonemap_factor2; ; Offset: 24
56; float sdr_white_point; ; Offset: 28
57; float4 Yoffset; ; Offset: 32
58; float4 Rcoeff; ; Offset: 48
59; float4 Gcoeff; ; Offset: 64
60; float4 Bcoeff; ; Offset: 80
61;
62; } Constants; ; Offset: 0 Size: 96
63;
64; }
65;
66;
67; Resource Bindings:
68;
69; Name Type Format Dim ID HLSL Bind Count
70; ------------------------------ ---------- ------- ----------- ------- -------------- ------
71; Constants cbuffer NA NA CB0 cb1 1
72; sampler0 sampler NA NA S0 s0 1
73; texture0 texture f32 2d T0 t0 1
74;
75;
76; ViewId state:
77;
78; Number of inputs: 12, outputs: 4
79; Outputs dependent on ViewId: { }
80; Inputs contributing to computation of Outputs:
81; output 0 depends on inputs: { 4, 5, 8 }
82; output 1 depends on inputs: { 4, 5, 9 }
83; output 2 depends on inputs: { 4, 5, 10 }
84; output 3 depends on inputs: { 4, 5, 11 }
85;
86target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
87target triple = "dxil-ms-dx"
88
89%dx.types.Handle = type { i8* }
90%dx.types.ResRet.f32 = type { float, float, float, float, i32 }
91%dx.types.CBufRet.f32 = type { float, float, float, float }
92%"class.Texture2D<vector<float, 4> >" = type { <4 x float>, %"class.Texture2D<vector<float, 4> >::mips_type" }
93%"class.Texture2D<vector<float, 4> >::mips_type" = type { i32 }
94%Constants = type { float, float, float, float, float, float, float, float, <4 x float>, <4 x float>, <4 x float>, <4 x float> }
95%struct.SamplerState = type { i32 }
96
97define void @main() {
98 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
99 %2 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 3, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
100 %3 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 1, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
101 %4 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
102 %5 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
103 %6 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
104 %7 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
105 %8 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
106 %9 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
107 %10 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %1, %dx.types.Handle %2, float %8, float %9, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
108 %11 = extractvalue %dx.types.ResRet.f32 %10, 0
109 %12 = extractvalue %dx.types.ResRet.f32 %10, 1
110 %13 = extractvalue %dx.types.ResRet.f32 %10, 2
111 %14 = extractvalue %dx.types.ResRet.f32 %10, 3
112 %15 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %3, i32 0) ; CBufferLoadLegacy(handle,regIndex)
113 %16 = extractvalue %dx.types.CBufRet.f32 %15, 3
114 %17 = fmul fast float %11, %4
115 %18 = fmul fast float %17, %16
116 %19 = fmul fast float %12, %5
117 %20 = fmul fast float %19, %16
118 %21 = fmul fast float %13, %6
119 %22 = fmul fast float %21, %16
120 %23 = fmul fast float %14, %7
121 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %18) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
122 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %20) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
123 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %22) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
124 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %23) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
125 ret void
126}
127
128; Function Attrs: nounwind readnone
129declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
130
131; Function Attrs: nounwind
132declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
133
134; Function Attrs: nounwind readonly
135declare %dx.types.ResRet.f32 @dx.op.sample.f32(i32, %dx.types.Handle, %dx.types.Handle, float, float, float, float, i32, i32, i32, float) #2
136
137; Function Attrs: nounwind readonly
138declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
139
140; Function Attrs: nounwind readonly
141declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
142
143attributes #0 = { nounwind readnone }
144attributes #1 = { nounwind }
145attributes #2 = { nounwind readonly }
146
147!llvm.ident = !{!0}
148!dx.version = !{!1}
149!dx.valver = !{!2}
150!dx.shaderModel = !{!3}
151!dx.resources = !{!4}
152!dx.viewIdState = !{!12}
153!dx.entryPoints = !{!13}
154
155!0 = !{!"clang version 3.7 (tags/RELEASE_370/final)"}
156!1 = !{i32 1, i32 0}
157!2 = !{i32 1, i32 6}
158!3 = !{!"ps", i32 6, i32 0}
159!4 = !{!5, null, !8, !10}
160!5 = !{!6}
161!6 = !{i32 0, %"class.Texture2D<vector<float, 4> >"* undef, !"", i32 0, i32 0, i32 1, i32 2, i32 0, !7}
162!7 = !{i32 0, i32 9}
163!8 = !{!9}
164!9 = !{i32 0, %Constants* undef, !"", i32 0, i32 1, i32 1, i32 96, null}
165!10 = !{!11}
166!11 = !{i32 0, %struct.SamplerState* undef, !"", i32 0, i32 0, i32 1, i32 0, null}
167!12 = !{[14 x i32] [i32 12, i32 4, i32 0, i32 0, i32 0, i32 0, i32 15, i32 15, i32 0, i32 0, i32 1, i32 2, i32 4, i32 8]}
168!13 = !{void ()* @main, !"main", !14, !4, null}
169!14 = !{!15, !22, null}
170!15 = !{!16, !18, !20}
171!16 = !{i32 0, !"SV_Position", i8 9, i8 3, !17, i8 4, i32 1, i8 4, i32 0, i8 0, null}
172!17 = !{i32 0}
173!18 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !17, i8 2, i32 1, i8 2, i32 1, i8 0, !19}
174!19 = !{i32 3, i32 3}
175!20 = !{i32 2, !"COLOR", i8 9, i8 0, !17, i8 2, i32 1, i8 4, i32 2, i8 0, !21}
176!21 = !{i32 3, i32 15}
177!22 = !{!23}
178!23 = !{i32 0, !"SV_Target", i8 9, i8 16, !17, i8 0, i32 1, i8 4, i32 0, i8 0, !21}
179
180#endif
181
182const unsigned char g_main[] = {
183 0x44, 0x58, 0x42, 0x43, 0xb2, 0xdd, 0x4e, 0x8d, 0x7f, 0x3c, 0x1f, 0x5e,
184 0x6f, 0x0e, 0x03, 0xe7, 0x8c, 0xce, 0x62, 0x95, 0x01, 0x00, 0x00, 0x00,
185 0xe1, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
186 0x50, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00,
187 0x31, 0x02, 0x00, 0x00, 0xd9, 0x02, 0x00, 0x00, 0x31, 0x0b, 0x00, 0x00,
188 0x4d, 0x0b, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
190 0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00,
197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
198 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
199 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00,
200 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c,
201 0x4f, 0x52, 0x00, 0x4f, 0x53, 0x47, 0x31, 0x32, 0x00, 0x00, 0x00, 0x01,
202 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28,
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
206 0x00, 0x50, 0x53, 0x56, 0x30, 0x14, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
209 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x01, 0x00, 0x00,
210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x00, 0x03, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
213 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
218 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43,
219 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221 0x00, 0x01, 0x00, 0x44, 0x03, 0x03, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00,
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, 0x03, 0x02, 0x00,
223 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44,
224 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x00, 0x01, 0x00, 0x44, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
229 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x52, 0x54, 0x53,
230 0x30, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
231 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00,
232 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
235 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
236 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
241 0xff, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
242 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x53, 0x54, 0x41,
244 0x54, 0x50, 0x08, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00,
245 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00,
246 0x00, 0x38, 0x08, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00,
247 0x00, 0x0b, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00,
248 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04,
249 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08,
250 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b,
251 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52,
252 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32,
253 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81,
254 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00,
255 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff,
256 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03,
257 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8,
258 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60,
259 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00,
260 0x00, 0x4e, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85,
261 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90,
262 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x7c, 0x23,
263 0x00, 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00,
264 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06,
265 0xa1, 0x9b, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0xfc, 0x95, 0x90, 0x56,
266 0x62, 0xf2, 0x8b, 0xdb, 0x46, 0xc5, 0x18, 0x63, 0x10, 0x2a, 0xf7, 0x0c,
267 0x97, 0x3f, 0x61, 0x0f, 0x21, 0xf9, 0x21, 0xd0, 0x0c, 0x0b, 0x81, 0x82,
268 0x55, 0x18, 0x45, 0x18, 0x1b, 0x63, 0x0c, 0x42, 0xc8, 0xa0, 0x76, 0xd4,
269 0x70, 0xf9, 0x13, 0xf6, 0x10, 0x92, 0xcf, 0x6d, 0x54, 0xb1, 0x12, 0x93,
270 0x5f, 0xdc, 0x36, 0x22, 0xc6, 0x18, 0xa3, 0x10, 0x8f, 0x30, 0x42, 0x70,
271 0x8e, 0x20, 0x28, 0x06, 0x23, 0x85, 0x10, 0x49, 0x73, 0x20, 0x60, 0x18,
272 0x81, 0x18, 0x66, 0x6a, 0x83, 0x71, 0x60, 0x87, 0x70, 0x98, 0x87, 0x79,
273 0x70, 0x03, 0x5a, 0x28, 0x07, 0x7c, 0xa0, 0x87, 0x7a, 0x90, 0x87, 0x72,
274 0x90, 0x03, 0x52, 0xe0, 0x03, 0x7b, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77,
275 0x90, 0x07, 0x3e, 0x30, 0x07, 0x76, 0x78, 0x87, 0x70, 0xa0, 0x07, 0x36,
276 0x00, 0x03, 0x3a, 0xf0, 0x03, 0x30, 0xf0, 0x03, 0x3d, 0xd0, 0x83, 0x76,
277 0x48, 0x07, 0x78, 0x98, 0x87, 0x5f, 0xa0, 0x87, 0x7c, 0x80, 0x87, 0x72,
278 0x40, 0x01, 0x99, 0x49, 0x0c, 0xc6, 0x81, 0x1d, 0xc2, 0x61, 0x1e, 0xe6,
279 0xc1, 0x0d, 0x68, 0xa1, 0x1c, 0xf0, 0x81, 0x1e, 0xea, 0x41, 0x1e, 0xca,
280 0x41, 0x0e, 0x48, 0x81, 0x0f, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde,
281 0x41, 0x1e, 0xf8, 0xc0, 0x1c, 0xd8, 0xe1, 0x1d, 0xc2, 0x81, 0x1e, 0xd8,
282 0x00, 0x0c, 0xe8, 0xc0, 0x0f, 0xc0, 0xc0, 0x0f, 0x90, 0x60, 0x2f, 0xe1,
283 0x4b, 0x38, 0xa7, 0x91, 0x26, 0xa0, 0x99, 0x24, 0xc4, 0x8c, 0x31, 0xc6,
284 0x18, 0x63, 0x58, 0x6b, 0x2d, 0xe9, 0x9b, 0xa4, 0x29, 0xa2, 0x84, 0xc9,
285 0x67, 0x01, 0xe6, 0x59, 0x88, 0x88, 0x9d, 0x80, 0x89, 0x40, 0x01, 0x21,
286 0x9e, 0x0e, 0x04, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60,
287 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf,
288 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a,
289 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71,
290 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73,
291 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72,
292 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
293 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6,
294 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73,
295 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74,
296 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71,
297 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43,
298 0x9e, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x33, 0x01, 0x01, 0x30, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x17, 0x00, 0x00,
305 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
306 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x45, 0x50,
307 0x12, 0x05, 0x1c, 0x50, 0x06, 0xe5, 0x50, 0x08, 0x05, 0x51, 0x18, 0x05,
308 0x52, 0x28, 0x05, 0x53, 0x38, 0x05, 0x54, 0x60, 0x05, 0x18, 0x50, 0xa0,
309 0x01, 0xe5, 0x41, 0xa5, 0x24, 0xca, 0xa0, 0x10, 0x46, 0x00, 0x8a, 0xa0,
310 0x40, 0x48, 0xd6, 0x00, 0xe5, 0x19, 0x00, 0xd2, 0x33, 0x00, 0xb4, 0x67,
311 0x00, 0xa8, 0xcf, 0x00, 0x90, 0x1f, 0xcb, 0x61, 0x08, 0x00, 0x00, 0x80,
312 0xe7, 0x01, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
313 0x00, 0xdc, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13,
314 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b,
315 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b,
316 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9,
317 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13,
318 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x20, 0x36, 0x08, 0x04,
319 0x41, 0x01, 0x6e, 0x6e, 0x82, 0x40, 0x20, 0x1b, 0x86, 0x03, 0x21, 0x26,
320 0x08, 0x59, 0x18, 0x10, 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0x83,
321 0x99, 0x20, 0x10, 0xc9, 0x04, 0x81, 0x50, 0x36, 0x08, 0x44, 0xb3, 0x21,
322 0x21, 0x94, 0x85, 0x20, 0x06, 0x86, 0x70, 0x36, 0x04, 0xcf, 0x04, 0x61,
323 0x1b, 0x03, 0x26, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73,
324 0x13, 0x04, 0x62, 0xd9, 0x80, 0x10, 0x91, 0x44, 0x0c, 0xc3, 0x04, 0x6c,
325 0x08, 0xa8, 0x09, 0x42, 0x47, 0x06, 0x44, 0xe6, 0xc2, 0xda, 0xe0, 0xd8,
326 0xca, 0xe4, 0x60, 0x36, 0x20, 0x84, 0x75, 0x11, 0xc4, 0x40, 0x00, 0x1b,
327 0x02, 0x6c, 0x03, 0x01, 0x01, 0x55, 0x36, 0x41, 0xd0, 0xc4, 0x80, 0xcc,
328 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0xdd,
329 0x04, 0x81, 0x60, 0x26, 0x08, 0x44, 0xb3, 0xc1, 0x40, 0xb8, 0x8e, 0xf0,
330 0x1a, 0x32, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79,
331 0x70, 0x65, 0x13, 0x04, 0xc2, 0xd9, 0x60, 0x20, 0x60, 0xd0, 0x85, 0x81,
332 0xd7, 0x50, 0x49, 0x73, 0x83, 0xab, 0xa3, 0xfb, 0xa2, 0xcb, 0x83, 0x2b,
333 0x9b, 0x20, 0x10, 0xcf, 0x06, 0x03, 0x19, 0x83, 0x8e, 0x0c, 0xbc, 0x86,
334 0xcb, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0xd7, 0xdc, 0x58, 0x18, 0x5b, 0xd9,
335 0x04, 0x81, 0x80, 0x26, 0x08, 0x12, 0x18, 0x6c, 0x40, 0x10, 0x33, 0xe8,
336 0xce, 0xc0, 0x6b, 0x1a, 0x34, 0xa0, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16,
337 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0x36, 0x41, 0x20, 0xa2,
338 0x0d, 0x06, 0xa2, 0x06, 0xdd, 0x1a, 0x78, 0x0d, 0x1f, 0xba, 0x37, 0xb7,
339 0xb2, 0xb6, 0x30, 0xb8, 0x2f, 0xb3, 0xb0, 0x31, 0xba, 0x37, 0xb9, 0x98,
340 0x09, 0x02, 0x21, 0x6d, 0x30, 0x90, 0x36, 0xe8, 0xdc, 0xc0, 0x6b, 0xf8,
341 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0x99, 0x85, 0x8d, 0xd1,
342 0xbd, 0xc9, 0xc9, 0x4c, 0x10, 0x88, 0x69, 0x83, 0x81, 0xc0, 0x41, 0x17,
343 0x07, 0x5e, 0xc3, 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae,
344 0xec, 0x0b, 0xee, 0x2d, 0xcd, 0x8d, 0x6e, 0x82, 0x40, 0x50, 0x1b, 0x0c,
345 0x64, 0x0e, 0x3a, 0x3a, 0xf0, 0x1a, 0x1e, 0x59, 0x6f, 0x66, 0x66, 0x73,
346 0x65, 0x74, 0x13, 0x04, 0xa2, 0xda, 0x60, 0x20, 0x76, 0xd0, 0xdd, 0x81,
347 0xd7, 0xd0, 0x90, 0x1a, 0x7b, 0x2b, 0x33, 0x33, 0x9b, 0x20, 0x10, 0xd6,
348 0x06, 0x03, 0xc9, 0x83, 0x4e, 0x0f, 0xbc, 0x86, 0xc6, 0xd1, 0xd8, 0x5b,
349 0x99, 0x99, 0xd9, 0x04, 0x81, 0xb8, 0x36, 0x18, 0x08, 0x1f, 0x74, 0x7d,
350 0xe0, 0x35, 0x34, 0x84, 0xc6, 0xde, 0xca, 0xcc, 0xcc, 0x26, 0x08, 0x04,
351 0xb6, 0xc1, 0x40, 0xfe, 0xa0, 0x03, 0x05, 0xaf, 0xd9, 0xd0, 0x4c, 0x9f,
352 0x18, 0x94, 0x41, 0x1a, 0xb0, 0xc1, 0x1b, 0xc8, 0x41, 0x1d, 0xe0, 0xc1,
353 0x1e, 0xf8, 0x41, 0x28, 0x6c, 0x18, 0x88, 0x4d, 0x14, 0x26, 0x08, 0x02,
354 0xb0, 0x01, 0xd8, 0x30, 0x10, 0xa5, 0x50, 0x0a, 0x1b, 0x02, 0x53, 0xd8,
355 0x30, 0x0c, 0xa4, 0x70, 0x0a, 0x13, 0x04, 0xaf, 0x0c, 0x36, 0x04, 0xa9,
356 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0xcb, 0x94, 0xd5, 0x17, 0xd4, 0xdb,
357 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x04, 0xa1, 0xd0, 0x26, 0x08, 0xc5,
358 0xb6, 0x21, 0x20, 0x26, 0x08, 0x05, 0x37, 0x41, 0x28, 0xba, 0x0d, 0x0b,
359 0xc1, 0x0a, 0xad, 0xe0, 0x0a, 0xaf, 0x00, 0x0b, 0x03, 0x2c, 0x10, 0xb1,
360 0x00, 0x10, 0xa1, 0x2a, 0xc2, 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20,
361 0x14, 0xde, 0x06, 0xa1, 0xeb, 0x36, 0x2c, 0xc3, 0x2c, 0xb4, 0x42, 0x2c,
362 0xbc, 0x02, 0x2d, 0x0c, 0xb4, 0x30, 0xc4, 0x42, 0x2d, 0xb0, 0x18, 0x7a,
363 0x62, 0x7a, 0x92, 0x9a, 0x20, 0x10, 0xd9, 0x06, 0xa1, 0xc3, 0x85, 0x0d,
364 0x0b, 0x73, 0x0b, 0xad, 0x10, 0x0b, 0xaf, 0x40, 0x0b, 0x03, 0x2c, 0x30,
365 0xb1, 0x90, 0x0b, 0x1b, 0x06, 0x59, 0xb0, 0x05, 0x5d, 0x60, 0x32, 0x65,
366 0xf5, 0x45, 0x15, 0x26, 0x77, 0x56, 0x46, 0x37, 0x41, 0x28, 0xbe, 0x0d,
367 0x0b, 0xc1, 0x0b, 0xad, 0xd0, 0x0b, 0xaf, 0x10, 0x0b, 0x03, 0x2c, 0x10,
368 0xb1, 0x90, 0x0b, 0x1b, 0x02, 0x5f, 0xd8, 0x30, 0xec, 0xc2, 0x2f, 0x00,
369 0x1b, 0x0a, 0x52, 0x58, 0x05, 0x70, 0xd0, 0x00, 0x1a, 0x66, 0x6c, 0x6f,
370 0x61, 0x74, 0x73, 0x2c, 0xd2, 0xdc, 0xe6, 0xe8, 0xe6, 0x68, 0xcc, 0xa5,
371 0x9d, 0x7d, 0xb1, 0x91, 0xd1, 0x98, 0x4b, 0x3b, 0xfb, 0x9a, 0xa3, 0x23,
372 0x42, 0x57, 0x86, 0xf7, 0xe5, 0xf6, 0x26, 0xd7, 0xb6, 0x41, 0x11, 0x07,
373 0x6f, 0x1c, 0xe8, 0x80, 0x1c, 0x90, 0x72, 0x08, 0x03, 0x73, 0x18, 0xaa,
374 0xb0, 0xb1, 0xd9, 0xb5, 0xb9, 0xa4, 0x91, 0x95, 0xb9, 0xd1, 0x4d, 0x09,
375 0x82, 0x2a, 0x64, 0x78, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
376 0x53, 0x02, 0xa2, 0x09, 0x19, 0x9e, 0x8b, 0x5d, 0x18, 0x9b, 0x5d, 0x99,
377 0xdc, 0x94, 0xa0, 0xa8, 0x43, 0x86, 0xe7, 0x32, 0x87, 0x16, 0x46, 0x56,
378 0x26, 0xd7, 0xf4, 0x46, 0x56, 0xc6, 0x36, 0x25, 0x40, 0xca, 0x90, 0xe1,
379 0xb9, 0xc8, 0x95, 0xcd, 0xbd, 0xd5, 0xc9, 0x8d, 0x95, 0xcd, 0x4d, 0x09,
380 0xb2, 0x4a, 0x64, 0x78, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x6e,
381 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x04, 0x51, 0x38,
382 0x85, 0x3a, 0x64, 0x78, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x49, 0x64, 0x53,
383 0x74, 0x61, 0x74, 0x65, 0x53, 0x82, 0x54, 0xa8, 0x43, 0x86, 0xe7, 0x52,
384 0xe6, 0x46, 0x27, 0x97, 0x07, 0xf5, 0x96, 0xe6, 0x46, 0x37, 0x37, 0x25,
385 0x00, 0x87, 0x2e, 0x64, 0x78, 0x2e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65,
386 0x72, 0x73, 0x53, 0x02, 0x73, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
387 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
388 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
389 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
390 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
391 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
392 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
393 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
394 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
395 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
396 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
397 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
398 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
399 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
400 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
401 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
402 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
403 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
404 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
405 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
406 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
407 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
408 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
409 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28,
410 0x87, 0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e, 0xf8, 0xe0, 0x06, 0xe4,
411 0x20, 0x0e, 0xe7, 0xe0, 0x06, 0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1,
412 0x90, 0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
413 0x00, 0x18, 0x00, 0x00, 0x00, 0x46, 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe,
414 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02,
415 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11,
416 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe,
417 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6,
418 0x0d, 0x40, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x01, 0xcc, 0xb3, 0x10, 0x7e,
419 0x71, 0xdb, 0x26, 0x50, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x34, 0x39, 0x11,
420 0x81, 0x52, 0xd3, 0x43, 0x4d, 0x7e, 0x71, 0xdb, 0x06, 0x40, 0x30, 0x00,
421 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53,
422 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x58, 0xef,
423 0xcd, 0x6c, 0xfa, 0x5e, 0xef, 0x87, 0x2e, 0x7c, 0xbc, 0x3b, 0x5f, 0x38,
424 0xb8, 0x44, 0x58, 0x49, 0x4c, 0x8c, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00,
425 0x00, 0xe3, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00,
426 0x00, 0x10, 0x00, 0x00, 0x00, 0x74, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0,
427 0xde, 0x21, 0x0c, 0x00, 0x00, 0xda, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20,
428 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
429 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
430 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
431 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
432 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88,
433 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4,
434 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46,
435 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0,
436 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff,
437 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff,
438 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00,
439 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00,
440 0x00, 0x89, 0x20, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
441 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
442 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
443 0x4c, 0x10, 0x7c, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08,
444 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18,
445 0x80, 0x10, 0x52, 0x06, 0xa1, 0x9b, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90,
446 0xfc, 0x95, 0x90, 0x56, 0x62, 0xf2, 0x8b, 0xdb, 0x46, 0xc5, 0x18, 0x63,
447 0x10, 0x2a, 0xf7, 0x0c, 0x97, 0x3f, 0x61, 0x0f, 0x21, 0xf9, 0x21, 0xd0,
448 0x0c, 0x0b, 0x81, 0x82, 0x55, 0x18, 0x45, 0x18, 0x1b, 0x63, 0x0c, 0x42,
449 0xc8, 0xa0, 0x76, 0xd4, 0x70, 0xf9, 0x13, 0xf6, 0x10, 0x92, 0xcf, 0x6d,
450 0x54, 0xb1, 0x12, 0x93, 0x5f, 0xdc, 0x36, 0x22, 0xc6, 0x18, 0xa3, 0x10,
451 0x8f, 0x30, 0x42, 0x70, 0x8e, 0x20, 0x28, 0x06, 0x23, 0x85, 0x10, 0x49,
452 0x73, 0x20, 0x60, 0x18, 0x81, 0x18, 0x66, 0x6a, 0x83, 0x71, 0x60, 0x87,
453 0x70, 0x98, 0x87, 0x79, 0x70, 0x03, 0x5a, 0x28, 0x07, 0x7c, 0xa0, 0x87,
454 0x7a, 0x90, 0x87, 0x72, 0x90, 0x03, 0x52, 0xe0, 0x03, 0x7b, 0x28, 0x87,
455 0x71, 0xa0, 0x87, 0x77, 0x90, 0x07, 0x3e, 0x30, 0x07, 0x76, 0x78, 0x87,
456 0x70, 0xa0, 0x07, 0x36, 0x00, 0x03, 0x3a, 0xf0, 0x03, 0x30, 0xf0, 0x03,
457 0x3d, 0xd0, 0x83, 0x76, 0x48, 0x07, 0x78, 0x98, 0x87, 0x5f, 0xa0, 0x87,
458 0x7c, 0x80, 0x87, 0x72, 0x40, 0x01, 0x99, 0x49, 0x0c, 0xc6, 0x81, 0x1d,
459 0xc2, 0x61, 0x1e, 0xe6, 0xc1, 0x0d, 0x68, 0xa1, 0x1c, 0xf0, 0x81, 0x1e,
460 0xea, 0x41, 0x1e, 0xca, 0x41, 0x0e, 0x48, 0x81, 0x0f, 0xec, 0xa1, 0x1c,
461 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xf8, 0xc0, 0x1c, 0xd8, 0xe1, 0x1d,
462 0xc2, 0x81, 0x1e, 0xd8, 0x00, 0x0c, 0xe8, 0xc0, 0x0f, 0xc0, 0xc0, 0x0f,
463 0x90, 0x60, 0x2f, 0xe1, 0x4b, 0x38, 0xa7, 0x91, 0x26, 0xa0, 0x99, 0x24,
464 0xc4, 0x8c, 0x31, 0xc6, 0x18, 0x63, 0x58, 0x6b, 0x2d, 0xe9, 0x9b, 0xa4,
465 0x29, 0xa2, 0x84, 0xc9, 0x67, 0x01, 0xe6, 0x59, 0x88, 0x88, 0x9d, 0x80,
466 0x89, 0x40, 0x01, 0x21, 0x9e, 0x0e, 0x04, 0x00, 0x00, 0x13, 0x14, 0x72,
467 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72,
468 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e,
469 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07,
470 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
471 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07,
472 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07,
473 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07,
474 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07,
475 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
476 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e,
477 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
478 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
479 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00,
480 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c,
482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00,
483 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x33, 0x01,
484 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08,
485 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c,
486 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02,
487 0x50, 0x0c, 0x45, 0x50, 0x12, 0x05, 0x1c, 0x50, 0x06, 0xe5, 0x41, 0xa5,
488 0x24, 0xca, 0xa0, 0x10, 0x46, 0x00, 0x8a, 0xa0, 0x40, 0x28, 0xcf, 0x00,
489 0xd0, 0x9e, 0x01, 0xa0, 0x3e, 0x03, 0x40, 0x7e, 0x2c, 0x87, 0x21, 0x00,
490 0x00, 0x00, 0x9e, 0x07, 0x00, 0x02, 0x81, 0x40, 0x00, 0x79, 0x18, 0x00,
491 0x00, 0x6a, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13,
492 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b,
493 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b,
494 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9,
495 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13,
496 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x20, 0x26, 0x08, 0x04,
497 0xb2, 0x41, 0x18, 0x0c, 0x0a, 0x70, 0x73, 0x1b, 0x06, 0xc4, 0x20, 0x26,
498 0x08, 0x19, 0x45, 0x60, 0x82, 0x40, 0x24, 0x13, 0x04, 0x42, 0xd9, 0x20,
499 0x10, 0xcd, 0x86, 0x84, 0x50, 0x16, 0x82, 0x18, 0x18, 0xc2, 0xd9, 0x10,
500 0x3c, 0x13, 0x84, 0xad, 0x9a, 0x20, 0x10, 0xcb, 0x06, 0x84, 0x88, 0x16,
501 0x62, 0x18, 0x24, 0x60, 0x43, 0x30, 0x4d, 0x10, 0x3a, 0x6b, 0x03, 0x42,
502 0x54, 0x0b, 0x41, 0x0c, 0x04, 0xb0, 0x21, 0xb0, 0x36, 0x10, 0x10, 0x40,
503 0x5d, 0x13, 0x04, 0xef, 0xda, 0x10, 0x64, 0x13, 0x04, 0x01, 0x20, 0xd1,
504 0x16, 0x96, 0xe6, 0xc6, 0x65, 0xca, 0xea, 0x0b, 0xea, 0x6d, 0x2e, 0x8d,
505 0x2e, 0xed, 0xcd, 0x6d, 0x82, 0x50, 0x38, 0x13, 0x84, 0xe2, 0xd9, 0x10,
506 0x10, 0x13, 0x84, 0x02, 0x9a, 0x20, 0x14, 0xd1, 0x86, 0x85, 0xe8, 0xbc,
507 0x0f, 0x0c, 0xc2, 0x60, 0x08, 0x03, 0x42, 0x0c, 0x00, 0x22, 0x54, 0x45,
508 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x13, 0x84, 0x42, 0x9a, 0x20, 0x10,
509 0xcc, 0x06, 0xc1, 0x0c, 0xcc, 0x60, 0xc3, 0x32, 0x90, 0x81, 0x27, 0x06,
510 0x60, 0x50, 0x06, 0x43, 0x19, 0x0c, 0x62, 0x70, 0x06, 0x2c, 0x86, 0x9e,
511 0x98, 0x9e, 0xa4, 0x26, 0x08, 0x44, 0xb3, 0x41, 0x30, 0x03, 0x35, 0xd8,
512 0xb0, 0x30, 0x69, 0xe0, 0x89, 0x01, 0x18, 0x94, 0xc1, 0x10, 0x06, 0x8c,
513 0x18, 0xac, 0xc1, 0x86, 0x61, 0x0c, 0xd0, 0x80, 0x0d, 0x98, 0x4c, 0x59,
514 0x7d, 0x51, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x4d, 0x10, 0x8a, 0x69, 0xc3,
515 0x42, 0xb8, 0x81, 0xf7, 0x06, 0x60, 0x20, 0x06, 0x43, 0x18, 0x10, 0x62,
516 0xb0, 0x06, 0x1b, 0x02, 0x38, 0xd8, 0x30, 0xb4, 0x41, 0x1c, 0x00, 0x1b,
517 0x8a, 0x8d, 0x93, 0x03, 0x0c, 0xa8, 0xc2, 0xc6, 0x66, 0xd7, 0xe6, 0x92,
518 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08, 0xaa, 0x90, 0xe1, 0xb9, 0xd8,
519 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d, 0x09, 0x88, 0x26, 0x64, 0x78,
520 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x02, 0xa3, 0x0e, 0x19,
521 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99, 0x5c, 0xd3, 0x1b, 0x59, 0x19,
522 0xdb, 0x94, 0x00, 0x29, 0x43, 0x86, 0xe7, 0x22, 0x57, 0x36, 0xf7, 0x56,
523 0x27, 0x37, 0x56, 0x36, 0x37, 0x25, 0xb8, 0xea, 0x90, 0xe1, 0xb9, 0xd8,
524 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1, 0x85, 0xd1, 0x95, 0x4d, 0x09,
525 0xb2, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f,
526 0x69, 0x6e, 0x74, 0x73, 0x53, 0x02, 0x39, 0x00, 0x00, 0x79, 0x18, 0x00,
527 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
528 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
529 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
530 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
531 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
532 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
533 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
534 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
535 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
536 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
537 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
538 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
539 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
540 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
541 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
542 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
543 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
544 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
545 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
546 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
547 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
548 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
549 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28,
550 0x87, 0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e, 0xf8, 0xe0, 0x06, 0xe4,
551 0x20, 0x0e, 0xe7, 0xe0, 0x06, 0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1,
552 0x90, 0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
553 0x00, 0x18, 0x00, 0x00, 0x00, 0x46, 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe,
554 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02,
555 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11,
556 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe,
557 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6,
558 0x0d, 0x40, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x01, 0xcc, 0xb3, 0x10, 0x7e,
559 0x71, 0xdb, 0x26, 0x50, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x34, 0x39, 0x11,
560 0x81, 0x52, 0xd3, 0x43, 0x4d, 0x7e, 0x71, 0xdb, 0x06, 0x40, 0x30, 0x00,
561 0xd2, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x46, 0x00, 0x00,
562 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
563 0x00, 0x24, 0x47, 0x00, 0x88, 0xcc, 0x00, 0x14, 0x42, 0x29, 0x94, 0x5c,
564 0xe1, 0x95, 0x1d, 0x95, 0x12, 0xa0, 0x31, 0x03, 0x00, 0x23, 0x06, 0x09,
565 0x00, 0x82, 0x60, 0x30, 0x71, 0x05, 0xa4, 0x69, 0xc9, 0x88, 0x41, 0x02,
566 0x80, 0x20, 0x18, 0x4c, 0x9d, 0x31, 0x6d, 0x9b, 0x32, 0x62, 0x90, 0x00,
567 0x20, 0x08, 0x06, 0x93, 0x77, 0x44, 0x5c, 0xb7, 0x8c, 0x18, 0x24, 0x00,
568 0x08, 0x82, 0x81, 0x31, 0x06, 0xca, 0xd6, 0x4d, 0xcb, 0x88, 0x41, 0x02,
569 0x80, 0x20, 0x18, 0x18, 0x64, 0xb0, 0x70, 0x9e, 0xc1, 0x8c, 0x18, 0x24,
570 0x00, 0x08, 0x82, 0x81, 0x51, 0x06, 0x4c, 0xf7, 0x51, 0xcd, 0x88, 0x41,
571 0x02, 0x80, 0x20, 0x18, 0x18, 0x66, 0xd0, 0x78, 0x60, 0x80, 0x39, 0x23,
572 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x9c, 0x81, 0x23, 0x06, 0x61, 0x70,
573 0x3d, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0xa0, 0xc1, 0x33, 0x06,
574 0x62, 0xa0, 0x40, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0x9c, 0x41,
575 0x93, 0x20, 0x42, 0xa0, 0x28, 0x63, 0x30, 0x06, 0x91, 0x32, 0x9a, 0x10,
576 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x30,
577 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0xd0, 0x1a, 0x44, 0x0c, 0x1a, 0x8c,
578 0x26, 0x04, 0x83, 0x19, 0x8d, 0x7c, 0x2c, 0x10, 0xe4, 0x63, 0x87, 0x23,
579 0x1f, 0x0b, 0x08, 0xf9, 0x18, 0xf2, 0xc8, 0xc7, 0x02, 0x43, 0x3e, 0x96,
580 0x40, 0xf2, 0x19, 0x31, 0x48, 0x00, 0x10, 0x04, 0x03, 0xc4, 0x0e, 0xba,
581 0x38, 0x88, 0x83, 0x33, 0x30, 0x46, 0x0c, 0x12, 0x00, 0x04, 0xc1, 0x00,
582 0xb1, 0x83, 0x2e, 0x0e, 0xe2, 0x20, 0x23, 0x46, 0x0c, 0x12, 0x00, 0x04,
583 0xc1, 0x00, 0xb1, 0x83, 0x2e, 0x0e, 0xe2, 0xc0, 0x0c, 0x84, 0x11, 0x83,
584 0x04, 0x00, 0x41, 0x30, 0x40, 0xec, 0xa0, 0x8b, 0x83, 0x38, 0x48, 0x83,
585 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
586};
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Textures.hlsl b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Textures.hlsl
new file mode 100644
index 0000000..f705742
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_PixelShader_Textures.hlsl
@@ -0,0 +1,8 @@
1
2#include "D3D12_PixelShader_Common.hlsli"
3
4[RootSignature(TextureRS)]
5float4 main(PixelShaderInput input) : SV_TARGET
6{
7 return GetOutputColor(texture0.Sample(sampler0, input.tex)) * input.color;
8}
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Advanced.h b/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Advanced.h
new file mode 100644
index 0000000..ac88cbb
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Advanced.h
@@ -0,0 +1,31 @@
1#if 0
2Disassembly failed
3#endif
4
5const unsigned char g_AdvancedRS[] = {
6 0x44, 0x58, 0x42, 0x43, 0x61, 0xd8, 0x65, 0x6e, 0x1d, 0x30, 0x64, 0x8a,
7 0x54, 0x75, 0xb7, 0x59, 0xea, 0x11, 0x73, 0xec, 0x01, 0x00, 0x00, 0x00,
8 0x24, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
9 0x52, 0x54, 0x53, 0x30, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
10 0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11 0xf8, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
12 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
13 0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14 0x05, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15 0x05, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16 0x05, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17 0x05, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
19 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
20 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00,
23 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
25 0x01, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
26 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
27 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
28 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
30 0xff, 0xff, 0xff, 0xff
31};
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Color.h b/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Color.h
new file mode 100644
index 0000000..e47eb5c
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Color.h
@@ -0,0 +1,16 @@
1#if 0
2Disassembly failed
3#endif
4
5const unsigned char g_ColorRS[] = {
6 0x44, 0x58, 0x42, 0x43, 0x1a, 0x67, 0x3b, 0x20, 0xac, 0xdc, 0xbb, 0xa0,
7 0x3c, 0x72, 0xa7, 0xdf, 0x14, 0xa5, 0x3a, 0x2e, 0x01, 0x00, 0x00, 0x00,
8 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
9 0x52, 0x54, 0x53, 0x30, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
10 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11 0x48, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
12 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
13 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
15 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00
16};
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Texture.h b/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Texture.h
new file mode 100644
index 0000000..2675b98
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_RootSig_Texture.h
@@ -0,0 +1,23 @@
1#if 0
2Disassembly failed
3#endif
4
5const unsigned char g_TextureRS[] = {
6 0x44, 0x58, 0x42, 0x43, 0xbc, 0x46, 0x63, 0x56, 0xe3, 0xea, 0x41, 0x4c,
7 0xf7, 0x90, 0x24, 0xc2, 0x14, 0x4d, 0x79, 0xdd, 0x01, 0x00, 0x00, 0x00,
8 0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
9 0x52, 0x54, 0x53, 0x30, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
10 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11 0xa0, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
12 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
13 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14 0x05, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15 0x05, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
18 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
19 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
21 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff
23};
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_Shader_Common.hlsli b/SDL-3.2.8/src/render/direct3d12/D3D12_Shader_Common.hlsli
new file mode 100644
index 0000000..4bf8074
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_Shader_Common.hlsli
@@ -0,0 +1,37 @@
1#pragma pack_matrix( row_major )
2
3cbuffer VertexShaderConstants : register(b0)
4{
5 matrix model;
6 matrix projectionAndView;
7};
8
9#define ColorRS \
10 "RootFlags ( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |" \
11 "DENY_DOMAIN_SHADER_ROOT_ACCESS |" \
12 "DENY_GEOMETRY_SHADER_ROOT_ACCESS |" \
13 "DENY_HULL_SHADER_ROOT_ACCESS )," \
14 "RootConstants(num32BitConstants=32, b0)," \
15 "RootConstants(num32BitConstants=24, b1)"\
16
17#define TextureRS \
18 "RootFlags ( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |" \
19 " DENY_DOMAIN_SHADER_ROOT_ACCESS |" \
20 " DENY_GEOMETRY_SHADER_ROOT_ACCESS |" \
21 " DENY_HULL_SHADER_ROOT_ACCESS )," \
22 "RootConstants(num32BitConstants=32, b0),"\
23 "RootConstants(num32BitConstants=24, b1),"\
24 "DescriptorTable ( SRV(t0), visibility = SHADER_VISIBILITY_PIXEL ),"\
25 "DescriptorTable ( Sampler(s0), visibility = SHADER_VISIBILITY_PIXEL )"
26
27#define AdvancedRS \
28 "RootFlags ( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |" \
29 " DENY_DOMAIN_SHADER_ROOT_ACCESS |" \
30 " DENY_GEOMETRY_SHADER_ROOT_ACCESS |" \
31 " DENY_HULL_SHADER_ROOT_ACCESS )," \
32 "RootConstants(num32BitConstants=32, b0),"\
33 "RootConstants(num32BitConstants=24, b1),"\
34 "DescriptorTable ( SRV(t0), visibility = SHADER_VISIBILITY_PIXEL ),"\
35 "DescriptorTable ( SRV(t1), visibility = SHADER_VISIBILITY_PIXEL ),"\
36 "DescriptorTable ( SRV(t2), visibility = SHADER_VISIBILITY_PIXEL ),"\
37 "DescriptorTable ( Sampler(s0), visibility = SHADER_VISIBILITY_PIXEL )"
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader.hlsl b/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader.hlsl
new file mode 100644
index 0000000..c7d2433
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader.hlsl
@@ -0,0 +1,45 @@
1#include "D3D12_Shader_Common.hlsli"
2
3struct VertexShaderInput
4{
5 float3 pos : POSITION;
6 float2 tex : TEXCOORD0;
7 float4 color : COLOR0;
8};
9
10struct VertexShaderOutput
11{
12 float4 pos : SV_POSITION;
13 float2 tex : TEXCOORD0;
14 float4 color : COLOR0;
15};
16
17[RootSignature(ColorRS)]
18VertexShaderOutput mainColor(VertexShaderInput input)
19{
20 VertexShaderOutput output;
21 float4 pos = float4(input.pos, 1.0f);
22
23 // Transform the vertex position into projected space.
24 pos = mul(pos, model);
25 pos = mul(pos, projectionAndView);
26 output.pos = pos;
27
28 // Pass through texture coordinates and color values without transformation
29 output.tex = input.tex;
30 output.color = input.color;
31
32 return output;
33}
34
35[RootSignature(TextureRS)]
36VertexShaderOutput mainTexture(VertexShaderInput input)
37{
38 return mainColor(input);
39}
40
41[RootSignature(AdvancedRS)]
42VertexShaderOutput mainAdvanced(VertexShaderInput input)
43{
44 return mainColor(input);
45}
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Advanced.h b/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Advanced.h
new file mode 100644
index 0000000..5c358d5
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Advanced.h
@@ -0,0 +1,653 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; POSITION 0 xyz 0 NONE float xyz
8; TEXCOORD 0 xy 1 NONE float xy
9; COLOR 0 xyzw 2 NONE float xyzw
10;
11;
12; Output signature:
13;
14; Name Index Mask Register SysValue Format Used
15; -------------------- ----- ------ -------- -------- ------- ------
16; SV_Position 0 xyzw 0 POS float xyzw
17; TEXCOORD 0 xy 1 NONE float xy
18; COLOR 0 xyzw 2 NONE float xyzw
19;
20; shader hash: c170d994513745a8e268b8d54da903ed
21;
22; Pipeline Runtime Information:
23;
24; Vertex Shader
25; OutputPositionPresent=1
26;
27;
28; Input signature:
29;
30; Name Index InterpMode DynIdx
31; -------------------- ----- ---------------------- ------
32; POSITION 0
33; TEXCOORD 0
34; COLOR 0
35;
36; Output signature:
37;
38; Name Index InterpMode DynIdx
39; -------------------- ----- ---------------------- ------
40; SV_Position 0 noperspective
41; TEXCOORD 0 linear
42; COLOR 0 linear
43;
44; Buffer Definitions:
45;
46; cbuffer VertexShaderConstants
47; {
48;
49; struct hostlayout.VertexShaderConstants
50; {
51;
52; row_major float4x4 model; ; Offset: 0
53; row_major float4x4 projectionAndView; ; Offset: 64
54;
55; } VertexShaderConstants; ; Offset: 0 Size: 128
56;
57; }
58;
59;
60; Resource Bindings:
61;
62; Name Type Format Dim ID HLSL Bind Count
63; ------------------------------ ---------- ------- ----------- ------- -------------- ------
64; VertexShaderConstants cbuffer NA NA CB0 cb0 1
65;
66;
67; ViewId state:
68;
69; Number of inputs: 12, outputs: 12
70; Outputs dependent on ViewId: { }
71; Inputs contributing to computation of Outputs:
72; output 0 depends on inputs: { 0, 1, 2 }
73; output 1 depends on inputs: { 0, 1, 2 }
74; output 2 depends on inputs: { 0, 1, 2 }
75; output 3 depends on inputs: { 0, 1, 2 }
76; output 4 depends on inputs: { 4 }
77; output 5 depends on inputs: { 5 }
78; output 8 depends on inputs: { 8 }
79; output 9 depends on inputs: { 9 }
80; output 10 depends on inputs: { 10 }
81; output 11 depends on inputs: { 11 }
82;
83target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
84target triple = "dxil-ms-dx"
85
86%dx.types.Handle = type { i8* }
87%dx.types.CBufRet.f32 = type { float, float, float, float }
88%hostlayout.VertexShaderConstants = type { [4 x <4 x float>], [4 x <4 x float>] }
89
90define void @mainAdvanced() {
91 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
92 %2 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
93 %3 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
94 %4 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
95 %5 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
96 %6 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
97 %7 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
98 %8 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
99 %9 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
100 %10 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
101 %11 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 0) ; CBufferLoadLegacy(handle,regIndex)
102 %12 = extractvalue %dx.types.CBufRet.f32 %11, 0
103 %13 = extractvalue %dx.types.CBufRet.f32 %11, 1
104 %14 = extractvalue %dx.types.CBufRet.f32 %11, 2
105 %15 = extractvalue %dx.types.CBufRet.f32 %11, 3
106 %16 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 1) ; CBufferLoadLegacy(handle,regIndex)
107 %17 = extractvalue %dx.types.CBufRet.f32 %16, 0
108 %18 = extractvalue %dx.types.CBufRet.f32 %16, 1
109 %19 = extractvalue %dx.types.CBufRet.f32 %16, 2
110 %20 = extractvalue %dx.types.CBufRet.f32 %16, 3
111 %21 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 2) ; CBufferLoadLegacy(handle,regIndex)
112 %22 = extractvalue %dx.types.CBufRet.f32 %21, 0
113 %23 = extractvalue %dx.types.CBufRet.f32 %21, 1
114 %24 = extractvalue %dx.types.CBufRet.f32 %21, 2
115 %25 = extractvalue %dx.types.CBufRet.f32 %21, 3
116 %26 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 3) ; CBufferLoadLegacy(handle,regIndex)
117 %27 = extractvalue %dx.types.CBufRet.f32 %26, 0
118 %28 = extractvalue %dx.types.CBufRet.f32 %26, 1
119 %29 = extractvalue %dx.types.CBufRet.f32 %26, 2
120 %30 = extractvalue %dx.types.CBufRet.f32 %26, 3
121 %31 = fmul fast float %12, %8
122 %32 = call float @dx.op.tertiary.f32(i32 46, float %9, float %17, float %31) ; FMad(a,b,c)
123 %33 = call float @dx.op.tertiary.f32(i32 46, float %10, float %22, float %32) ; FMad(a,b,c)
124 %34 = fadd fast float %33, %27
125 %35 = fmul fast float %13, %8
126 %36 = call float @dx.op.tertiary.f32(i32 46, float %9, float %18, float %35) ; FMad(a,b,c)
127 %37 = call float @dx.op.tertiary.f32(i32 46, float %10, float %23, float %36) ; FMad(a,b,c)
128 %38 = fadd fast float %37, %28
129 %39 = fmul fast float %14, %8
130 %40 = call float @dx.op.tertiary.f32(i32 46, float %9, float %19, float %39) ; FMad(a,b,c)
131 %41 = call float @dx.op.tertiary.f32(i32 46, float %10, float %24, float %40) ; FMad(a,b,c)
132 %42 = fadd fast float %41, %29
133 %43 = fmul fast float %15, %8
134 %44 = call float @dx.op.tertiary.f32(i32 46, float %9, float %20, float %43) ; FMad(a,b,c)
135 %45 = call float @dx.op.tertiary.f32(i32 46, float %10, float %25, float %44) ; FMad(a,b,c)
136 %46 = fadd fast float %45, %30
137 %47 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 4) ; CBufferLoadLegacy(handle,regIndex)
138 %48 = extractvalue %dx.types.CBufRet.f32 %47, 0
139 %49 = extractvalue %dx.types.CBufRet.f32 %47, 1
140 %50 = extractvalue %dx.types.CBufRet.f32 %47, 2
141 %51 = extractvalue %dx.types.CBufRet.f32 %47, 3
142 %52 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 5) ; CBufferLoadLegacy(handle,regIndex)
143 %53 = extractvalue %dx.types.CBufRet.f32 %52, 0
144 %54 = extractvalue %dx.types.CBufRet.f32 %52, 1
145 %55 = extractvalue %dx.types.CBufRet.f32 %52, 2
146 %56 = extractvalue %dx.types.CBufRet.f32 %52, 3
147 %57 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 6) ; CBufferLoadLegacy(handle,regIndex)
148 %58 = extractvalue %dx.types.CBufRet.f32 %57, 0
149 %59 = extractvalue %dx.types.CBufRet.f32 %57, 1
150 %60 = extractvalue %dx.types.CBufRet.f32 %57, 2
151 %61 = extractvalue %dx.types.CBufRet.f32 %57, 3
152 %62 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 7) ; CBufferLoadLegacy(handle,regIndex)
153 %63 = extractvalue %dx.types.CBufRet.f32 %62, 0
154 %64 = extractvalue %dx.types.CBufRet.f32 %62, 1
155 %65 = extractvalue %dx.types.CBufRet.f32 %62, 2
156 %66 = extractvalue %dx.types.CBufRet.f32 %62, 3
157 %67 = fmul fast float %48, %34
158 %68 = call float @dx.op.tertiary.f32(i32 46, float %38, float %53, float %67) ; FMad(a,b,c)
159 %69 = call float @dx.op.tertiary.f32(i32 46, float %42, float %58, float %68) ; FMad(a,b,c)
160 %70 = call float @dx.op.tertiary.f32(i32 46, float %46, float %63, float %69) ; FMad(a,b,c)
161 %71 = fmul fast float %49, %34
162 %72 = call float @dx.op.tertiary.f32(i32 46, float %38, float %54, float %71) ; FMad(a,b,c)
163 %73 = call float @dx.op.tertiary.f32(i32 46, float %42, float %59, float %72) ; FMad(a,b,c)
164 %74 = call float @dx.op.tertiary.f32(i32 46, float %46, float %64, float %73) ; FMad(a,b,c)
165 %75 = fmul fast float %50, %34
166 %76 = call float @dx.op.tertiary.f32(i32 46, float %38, float %55, float %75) ; FMad(a,b,c)
167 %77 = call float @dx.op.tertiary.f32(i32 46, float %42, float %60, float %76) ; FMad(a,b,c)
168 %78 = call float @dx.op.tertiary.f32(i32 46, float %46, float %65, float %77) ; FMad(a,b,c)
169 %79 = fmul fast float %51, %34
170 %80 = call float @dx.op.tertiary.f32(i32 46, float %38, float %56, float %79) ; FMad(a,b,c)
171 %81 = call float @dx.op.tertiary.f32(i32 46, float %42, float %61, float %80) ; FMad(a,b,c)
172 %82 = call float @dx.op.tertiary.f32(i32 46, float %46, float %66, float %81) ; FMad(a,b,c)
173 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %70) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
174 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %74) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
175 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %78) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
176 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %82) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
177 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 0, float %6) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
178 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 1, float %7) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
179 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 0, float %2) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
180 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 1, float %3) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
181 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 2, float %4) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
182 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 3, float %5) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
183 ret void
184}
185
186; Function Attrs: nounwind readnone
187declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
188
189; Function Attrs: nounwind
190declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
191
192; Function Attrs: nounwind readonly
193declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
194
195; Function Attrs: nounwind readnone
196declare float @dx.op.tertiary.f32(i32, float, float, float) #0
197
198; Function Attrs: nounwind readonly
199declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
200
201attributes #0 = { nounwind readnone }
202attributes #1 = { nounwind }
203attributes #2 = { nounwind readonly }
204
205!llvm.ident = !{!0}
206!dx.version = !{!1}
207!dx.valver = !{!2}
208!dx.shaderModel = !{!3}
209!dx.resources = !{!4}
210!dx.viewIdState = !{!7}
211!dx.entryPoints = !{!8}
212
213!0 = !{!"clang version 3.7 (tags/RELEASE_370/final)"}
214!1 = !{i32 1, i32 0}
215!2 = !{i32 1, i32 6}
216!3 = !{!"vs", i32 6, i32 0}
217!4 = !{null, null, !5, null}
218!5 = !{!6}
219!6 = !{i32 0, %hostlayout.VertexShaderConstants* undef, !"", i32 0, i32 0, i32 1, i32 128, null}
220!7 = !{[14 x i32] [i32 12, i32 12, i32 15, i32 15, i32 15, i32 0, i32 16, i32 32, i32 0, i32 0, i32 256, i32 512, i32 1024, i32 2048]}
221!8 = !{void ()* @mainAdvanced, !"mainAdvanced", !9, !4, null}
222!9 = !{!10, !18, null}
223!10 = !{!11, !14, !16}
224!11 = !{i32 0, !"POSITION", i8 9, i8 0, !12, i8 0, i32 1, i8 3, i32 0, i8 0, !13}
225!12 = !{i32 0}
226!13 = !{i32 3, i32 7}
227!14 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !12, i8 0, i32 1, i8 2, i32 1, i8 0, !15}
228!15 = !{i32 3, i32 3}
229!16 = !{i32 2, !"COLOR", i8 9, i8 0, !12, i8 0, i32 1, i8 4, i32 2, i8 0, !17}
230!17 = !{i32 3, i32 15}
231!18 = !{!19, !20, !21}
232!19 = !{i32 0, !"SV_Position", i8 9, i8 3, !12, i8 4, i32 1, i8 4, i32 0, i8 0, !17}
233!20 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !12, i8 2, i32 1, i8 2, i32 1, i8 0, !15}
234!21 = !{i32 2, !"COLOR", i8 9, i8 0, !12, i8 2, i32 1, i8 4, i32 2, i8 0, !17}
235
236#endif
237
238const unsigned char g_mainAdvanced[] = {
239 0x44, 0x58, 0x42, 0x43, 0xff, 0x5d, 0x02, 0x19, 0xed, 0x89, 0xe9, 0x33,
240 0xf6, 0x5b, 0x76, 0x8c, 0x9f, 0x8b, 0x4d, 0xf1, 0x01, 0x00, 0x00, 0x00,
241 0x63, 0x13, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
242 0x50, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00,
243 0x87, 0x02, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x3f, 0x0a, 0x00, 0x00,
244 0x5b, 0x0a, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
246 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
254 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58,
256 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00,
257 0x4f, 0x53, 0x47, 0x31, 0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
258 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
263 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74,
267 0x69, 0x6f, 0x6e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44,
268 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x50, 0x53, 0x56, 0x30, 0x1c,
269 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x03,
272 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18,
274 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49,
277 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
278 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43,
279 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x01,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x03,
282 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
283 0x01, 0x42, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x03, 0x03,
286 0x04, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
287 0x01, 0x42, 0x00, 0x03, 0x02, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,
288 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00, 0x0f,
289 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
292 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x52,
293 0x54, 0x53, 0x30, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06,
294 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
295 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
298 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
299 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
300 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
301 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
306 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01,
309 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
310 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xe0,
312 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
314 0xff, 0xff, 0xff, 0x53, 0x54, 0x41, 0x54, 0xb0, 0x06, 0x00, 0x00, 0x60,
315 0x00, 0x01, 0x00, 0xac, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00,
316 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x98, 0x06, 0x00, 0x00, 0x42,
317 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x00, 0x0b,
318 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07,
319 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92,
320 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80,
321 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38,
322 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43,
323 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91,
324 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04,
325 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b,
326 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84,
327 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff,
328 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03,
329 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00,
330 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x32,
331 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04,
332 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b,
333 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66, 0x00,
334 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42,
335 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f, 0xb0,
336 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x11,
337 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42, 0xf2,
338 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42, 0xad,
339 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4, 0x10,
340 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x03, 0x83,
341 0xc3, 0x91, 0xa6, 0x05, 0xc0, 0x1c, 0x6a, 0xf2, 0x5f, 0x22, 0x9a, 0x88,
342 0x8b, 0x3d, 0x80, 0x81, 0x88, 0x38, 0xa7, 0x91, 0x26, 0xa0, 0x99, 0x24,
343 0x24, 0x58, 0x4b, 0x37, 0x1d, 0x08, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87,
344 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87,
345 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00,
346 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
347 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0,
348 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30,
349 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20,
350 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
351 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
352 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60,
353 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0,
354 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40,
355 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00, 0x08, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, 0x30,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x14,
362 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c,
363 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c,
364 0x05, 0x28, 0x50, 0x04, 0x85, 0x50, 0x06, 0xe5, 0x50, 0x12, 0x05, 0x18,
365 0x50, 0x1e, 0x85, 0x51, 0xba, 0x01, 0x45, 0x41, 0xa5, 0x24, 0x46, 0x00,
366 0xca, 0xa0, 0x08, 0x0a, 0x81, 0x62, 0x0d, 0xd0, 0x9d, 0x01, 0x20, 0x3c,
367 0x03, 0x40, 0x79, 0x2c, 0x87, 0x61, 0x9e, 0xe7, 0x01, 0x20, 0x30, 0x00,
368 0x00, 0x10, 0x01, 0x21, 0x10, 0x0c, 0x40, 0x50, 0x00, 0x00, 0x00, 0x79,
369 0x18, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46,
370 0x02, 0x13, 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b,
371 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1,
372 0x0b, 0x3b, 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa,
373 0x9a, 0xb9, 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10,
374 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x20, 0x36,
375 0x08, 0x04, 0x41, 0xc1, 0x6e, 0x6e, 0x82, 0x40, 0x20, 0x1b, 0x86, 0x03,
376 0x21, 0x26, 0x08, 0xd8, 0xc6, 0xca, 0xaa, 0x4c, 0x8e, 0xae, 0x0c, 0x6f,
377 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, 0xcc,
378 0x8d, 0x6e, 0x6e, 0x82, 0x40, 0x24, 0x1b, 0x10, 0x42, 0x59, 0x08, 0x62,
379 0x60, 0x80, 0x0d, 0x41, 0xb3, 0x81, 0x00, 0x00, 0x07, 0x98, 0x20, 0x5c,
380 0x1a, 0x8b, 0xb6, 0x37, 0xb2, 0x32, 0xb6, 0x09, 0x02, 0xa1, 0x4c, 0x10,
381 0x88, 0x65, 0xc3, 0x30, 0x4d, 0xc3, 0x04, 0x81, 0x60, 0x26, 0x08, 0x44,
382 0x33, 0x41, 0x20, 0x9c, 0x09, 0x42, 0x94, 0x6d, 0x50, 0x90, 0x48, 0xa2,
383 0x2a, 0xc2, 0xba, 0x2e, 0x8c, 0x11, 0x9c, 0xdc, 0x9b, 0x5a, 0xd9, 0x18,
384 0x5d, 0xda, 0x9b, 0x5b, 0x90, 0x1b, 0x99, 0x55, 0x5a, 0xd9, 0xdd, 0x04,
385 0x81, 0x78, 0x36, 0x28, 0x88, 0x26, 0x51, 0xd5, 0x66, 0x5d, 0x17, 0xb6,
386 0x61, 0x60, 0x32, 0x6e, 0xc3, 0x40, 0x40, 0xdd, 0x04, 0x41, 0x00, 0x36,
387 0x00, 0x1b, 0x06, 0x02, 0x0c, 0xc0, 0x60, 0x43, 0x10, 0x06, 0x1b, 0x86,
388 0xe1, 0x13, 0x83, 0x09, 0x42, 0xc6, 0x6d, 0x08, 0xc8, 0x80, 0x4c, 0x5b,
389 0x58, 0x9a, 0x5b, 0x10, 0x99, 0x5d, 0x98, 0xdb, 0x58, 0x19, 0x19, 0x11,
390 0xa8, 0xa7, 0xa9, 0x24, 0xaa, 0xa4, 0x27, 0xa7, 0x09, 0x42, 0x41, 0x4d,
391 0x10, 0x8a, 0x6a, 0x43, 0x40, 0x4c, 0x10, 0x0a, 0x6b, 0x83, 0x50, 0x59,
392 0x1b, 0x16, 0xe2, 0x0c, 0xd0, 0x20, 0x0d, 0xd4, 0x20, 0x0d, 0x86, 0x35,
393 0x20, 0xd2, 0x80, 0x0d, 0x88, 0x50, 0x15, 0x61, 0x0d, 0x3d, 0x3d, 0x49,
394 0x11, 0x4d, 0x10, 0x8a, 0x6b, 0x83, 0x50, 0x55, 0x1b, 0x96, 0xc1, 0x0d,
395 0xd0, 0x20, 0x0d, 0xd4, 0x20, 0x0d, 0x86, 0x37, 0x18, 0xd2, 0x00, 0x0e,
396 0x58, 0x0c, 0x3d, 0x31, 0x3d, 0x49, 0x4d, 0x10, 0x0a, 0x6c, 0x82, 0x40,
397 0x40, 0x1b, 0x84, 0x8a, 0x0e, 0x36, 0x2c, 0x92, 0x1c, 0xa0, 0x41, 0x1a,
398 0xa8, 0x41, 0x1a, 0x0c, 0x73, 0x20, 0xa5, 0x41, 0x1d, 0x6c, 0x18, 0xda,
399 0x20, 0x0e, 0xec, 0x80, 0xcb, 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a,
400 0x5d, 0xda, 0x9b, 0xdb, 0x86, 0x85, 0xc0, 0x03, 0x34, 0x58, 0x03, 0x35,
401 0x98, 0x83, 0x61, 0x0e, 0x88, 0x34, 0xa8, 0x83, 0x0d, 0xcb, 0xe0, 0x06,
402 0x68, 0x90, 0x06, 0x6a, 0xf0, 0x06, 0xc3, 0x1b, 0x0c, 0x69, 0x00, 0x07,
403 0x1b, 0x16, 0x49, 0x0e, 0xd0, 0x20, 0x0d, 0xd4, 0xe0, 0x0d, 0x86, 0x39,
404 0x90, 0xd2, 0xa0, 0x0e, 0x36, 0x0c, 0x79, 0xa0, 0x07, 0x7b, 0xb0, 0x61,
405 0xb8, 0x03, 0x3e, 0x00, 0x36, 0x14, 0x9f, 0x19, 0xf4, 0xc1, 0x03, 0xd0,
406 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x11, 0x8b, 0x34,
407 0xb7, 0x39, 0xba, 0xb9, 0x09, 0x02, 0x21, 0xd1, 0x98, 0x4b, 0x3b, 0xfb,
408 0x62, 0x23, 0xa3, 0x31, 0x97, 0x76, 0xf6, 0x35, 0x47, 0x37, 0x41, 0x20,
409 0xa6, 0x0d, 0xc8, 0x1f, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x5c, 0xa4,
410 0x50, 0x0a, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca, 0xdc,
411 0xe8, 0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17, 0xbb, 0x32, 0xb9, 0xb9,
412 0xb4, 0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c, 0xcf, 0xc5, 0x2e, 0x8c,
413 0xcd, 0xae, 0x4c, 0x6e, 0x4a, 0x50, 0xd4, 0x21, 0xc3, 0x73, 0x99, 0x43,
414 0x0b, 0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b, 0x63, 0x9b, 0x12, 0x20,
415 0x65, 0xc8, 0xf0, 0x5c, 0xe4, 0xca, 0xe6, 0xde, 0xea, 0xe4, 0xc6, 0xca,
416 0xe6, 0xa6, 0x04, 0x4e, 0x25, 0x32, 0x3c, 0x17, 0xba, 0x3c, 0xb8, 0xb2,
417 0x20, 0x37, 0xb7, 0x37, 0xba, 0x30, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x29,
418 0x42, 0x27, 0x06, 0x75, 0xc8, 0xf0, 0x5c, 0xec, 0xd2, 0xca, 0xee, 0x92,
419 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04, 0x64, 0x50, 0x87, 0x0c,
420 0xcf, 0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e,
421 0x6e, 0x4a, 0xd0, 0x07, 0x5d, 0xc8, 0xf0, 0x5c, 0xc6, 0xde, 0xea, 0xdc,
422 0xe8, 0xca, 0xe4, 0xe6, 0xa6, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x79,
423 0x18, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4,
424 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c,
425 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00,
426 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2,
427 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38,
428 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d,
429 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87,
430 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87,
431 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30,
432 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde,
433 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b,
434 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c,
435 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07,
436 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87,
437 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87,
438 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87,
439 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0,
440 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc,
441 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4,
442 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39,
443 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38,
444 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b,
445 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03,
446 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87,
447 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x71,
448 0x20, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97, 0xef,
449 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25, 0x61,
450 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce, 0xe3,
451 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0, 0x34,
452 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f,
453 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44,
454 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3, 0xe5,
455 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7, 0x6d,
456 0x00, 0x0c, 0x03, 0x20, 0x8d, 0x36, 0x54, 0x40, 0x23, 0x10, 0x03, 0x00,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14,
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x70, 0xd9, 0x94, 0x51,
459 0x37, 0x45, 0xa8, 0xe2, 0x68, 0xb8, 0xd5, 0x4d, 0xa9, 0x03, 0xed, 0x44,
460 0x58, 0x49, 0x4c, 0x00, 0x09, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0x40,
461 0x02, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10,
462 0x00, 0x00, 0x00, 0xe8, 0x08, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21,
463 0x0c, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02,
464 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41,
465 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25,
466 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42,
467 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a,
468 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00,
469 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41,
470 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51,
471 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff,
472 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff,
473 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00,
474 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13,
475 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89,
476 0x20, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20,
477 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84,
478 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10,
479 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60,
480 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10,
481 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e,
482 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54,
483 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16,
484 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c, 0x31,
485 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e, 0x04,
486 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x03, 0x83, 0xc3, 0x91, 0xa6, 0x05,
487 0xc0, 0x1c, 0x6a, 0xf2, 0x5f, 0x22, 0x9a, 0x88, 0x8b, 0x3d, 0x80, 0x81,
488 0x88, 0x38, 0xa7, 0x91, 0x26, 0xa0, 0x99, 0x24, 0x24, 0x58, 0x4b, 0x37,
489 0x1d, 0x08, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36,
490 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e,
491 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07,
492 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07,
493 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07,
494 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
495 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
496 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07,
497 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07,
498 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07,
499 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07,
500 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00,
501 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c,
502 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
503 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
504 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
505 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
506 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00,
507 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32,
508 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6,
509 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x28, 0x50, 0x06,
510 0xe5, 0x50, 0x04, 0xe5, 0x41, 0xa5, 0x24, 0x46, 0x00, 0xca, 0xa0, 0x08,
511 0x0a, 0x81, 0xf0, 0x0c, 0x00, 0xe5, 0xb1, 0x1c, 0x86, 0x79, 0x9e, 0x07,
512 0x80, 0xc0, 0x00, 0x00, 0x40, 0x04, 0x84, 0x40, 0x30, 0x00, 0x41, 0x01,
513 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x1a,
514 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73,
515 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71,
516 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b, 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a,
517 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9, 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b,
518 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7,
519 0x06, 0x61, 0x20, 0x26, 0x08, 0x04, 0xb2, 0x41, 0x18, 0x0c, 0x0a, 0x76,
520 0x73, 0x1b, 0x06, 0xc4, 0x20, 0x26, 0x08, 0xd8, 0x44, 0x60, 0x82, 0x40,
521 0x24, 0x1b, 0x10, 0x42, 0x59, 0x08, 0x62, 0x60, 0x80, 0x0d, 0x41, 0xb3,
522 0x81, 0x00, 0x00, 0x07, 0x98, 0x20, 0x64, 0xd4, 0x86, 0x00, 0x9a, 0x20,
523 0x08, 0x00, 0x99, 0xb6, 0xb0, 0x34, 0xb7, 0x20, 0x32, 0xbb, 0x30, 0xb7,
524 0xb1, 0x32, 0x32, 0x22, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e,
525 0x13, 0x84, 0xc2, 0x99, 0x20, 0x14, 0xcf, 0x86, 0x80, 0x98, 0x20, 0x14,
526 0xd0, 0x04, 0x81, 0x50, 0x26, 0x08, 0xc4, 0xb2, 0x41, 0xc8, 0xb4, 0x0d,
527 0x0b, 0x41, 0x55, 0xd6, 0x65, 0x0d, 0x18, 0x61, 0x6d, 0x44, 0xa8, 0x8a,
528 0xb0, 0x86, 0x9e, 0x9e, 0xa4, 0x88, 0x26, 0x08, 0x45, 0xb4, 0x41, 0xc8,
529 0xb2, 0x0d, 0xcb, 0xd0, 0x55, 0xd6, 0x65, 0x0d, 0xde, 0x60, 0x7d, 0x13,
530 0x04, 0x82, 0x61, 0x31, 0xf4, 0xc4, 0xf4, 0x24, 0x35, 0x41, 0x28, 0xa4,
531 0x09, 0x02, 0xd1, 0x6c, 0x10, 0x32, 0x32, 0xd8, 0xb0, 0x84, 0x81, 0x18,
532 0x54, 0xd6, 0x65, 0x0d, 0x63, 0x10, 0x06, 0x56, 0x19, 0x6c, 0x18, 0x38,
533 0x30, 0x30, 0x03, 0x2e, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74,
534 0x69, 0x6f, 0x6e, 0x1b, 0x16, 0x02, 0x0d, 0x2a, 0xec, 0x1a, 0x83, 0x61,
535 0x0c, 0x08, 0xab, 0x0c, 0x36, 0x2c, 0x43, 0x57, 0x59, 0x97, 0x37, 0x78,
536 0x83, 0xf5, 0x6d, 0x58, 0xc2, 0x40, 0x0c, 0x2a, 0xeb, 0xf2, 0x86, 0x31,
537 0x08, 0x03, 0xab, 0x0c, 0x36, 0x0c, 0x69, 0xa0, 0x06, 0x6b, 0xb0, 0x61,
538 0x38, 0x03, 0x36, 0x00, 0x36, 0x14, 0xd2, 0xd4, 0x06, 0x0f, 0x50, 0x85,
539 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10,
540 0x54, 0x21, 0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b,
541 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, 0xd8, 0xec, 0xca, 0xe4,
542 0xa6, 0x04, 0x46, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2, 0x32,
543 0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c, 0xcf,
544 0x45, 0xae, 0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0xe0,
545 0xd4, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2,
546 0x0b, 0xa3, 0x2b, 0x9b, 0x12, 0x40, 0x75, 0xc8, 0xf0, 0x5c, 0xca, 0xdc,
547 0xe8, 0xe4, 0xf2, 0xa0, 0xde, 0xd2, 0xdc, 0xe8, 0xe6, 0xa6, 0x04, 0x6d,
548 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x33,
549 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43,
550 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98,
551 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33,
552 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05,
553 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43,
554 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08,
555 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78,
556 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1,
557 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33,
558 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e,
559 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03,
560 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60,
561 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80,
562 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8,
563 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18,
564 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee,
565 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c,
566 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c,
567 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43,
568 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3,
569 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83,
570 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21,
571 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08,
572 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x00,
573 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x36,
574 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5,
575 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2,
576 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3,
577 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62,
578 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f,
579 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6,
580 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11,
581 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x0c, 0x03, 0x20, 0x8d, 0x36, 0x54, 0x40,
582 0x23, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xcf,
583 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05,
584 0x00, 0x00, 0x00, 0x44, 0x8a, 0xab, 0x14, 0x0a, 0x61, 0x06, 0xa0, 0xec,
585 0x4a, 0x8e, 0x4a, 0x09, 0x50, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x23,
586 0x06, 0x09, 0x00, 0x82, 0x60, 0x20, 0x61, 0x03, 0x63, 0x59, 0xc1, 0x88,
587 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0xdd, 0x21, 0x5d, 0x8f, 0x31, 0x62,
588 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x87, 0x4c, 0x18, 0x71, 0x8c, 0x18,
589 0x24, 0x00, 0x08, 0x82, 0x81, 0xf1, 0x25, 0x54, 0xf6, 0x20, 0x23, 0x06,
590 0x09, 0x00, 0x82, 0x60, 0x60, 0x80, 0x81, 0x52, 0x69, 0x51, 0x32, 0x62,
591 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x18, 0x2c, 0xdc, 0x36, 0x29, 0x23,
592 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x88, 0x01, 0xd3, 0x71, 0xc8, 0x32,
593 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6, 0x18, 0x34, 0x5d, 0x57, 0x31,
594 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x90, 0x81, 0xe3, 0x79, 0x4a,
595 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x19, 0x3c, 0xdf, 0x57,
596 0x39, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0xd0, 0x90, 0x81, 0xa3, 0x80,
597 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c,
598 0x26, 0x10, 0xc3, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0x69, 0x30,
599 0x3d, 0x66, 0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30,
600 0x08, 0xa3, 0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x8d,
601 0x1b, 0x60, 0x54, 0x19, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
602 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82,
603 0x41, 0x33, 0x07, 0x5d, 0xc6, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20,
604 0x04, 0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0x36, 0x5d, 0xf2, 0x19,
605 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x07, 0x0f, 0xce, 0xe0, 0x7a, 0x82,
606 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0xf2, 0x00, 0x0d, 0xae, 0x25,
607 0xb0, 0xe0, 0x80, 0x8e, 0x59, 0x9b, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04,
608 0xc1, 0xe0, 0xe1, 0x83, 0x35, 0xd8, 0xa4, 0x60, 0xc4, 0x00, 0x01, 0x40,
609 0x10, 0x0c, 0x9e, 0x3e, 0x60, 0x83, 0xcd, 0x09, 0x2c, 0x50, 0xa0, 0x63,
610 0xd9, 0x27, 0x9f, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0x40, 0xe1,
611 0x0d, 0xbe, 0x2a, 0x18, 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x27, 0x14,
612 0xe0, 0xe0, 0x8b, 0x02, 0x0b, 0x1a, 0xe8, 0x18, 0x37, 0x06, 0xf2, 0x19,
613 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x87, 0x14, 0xe6, 0x60, 0x0c, 0xb0,
614 0x60, 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x9e, 0x52, 0xa0, 0x83, 0x31,
615 0xa0, 0x02, 0x0b, 0x20, 0xe8, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41,
616 0x83, 0x0a, 0x72, 0xe0, 0x06, 0x74, 0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09,
617 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x30, 0x62, 0x70, 0x00,
618 0x20, 0x08, 0x06, 0x4d, 0x2b, 0xdc, 0xc1, 0x1c, 0xe8, 0xc1, 0x68, 0x42,
619 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x26, 0x10, 0xc3,
620 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0xb2, 0xc0, 0x07, 0x78, 0xd0,
621 0x0a, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x30,
622 0x9a, 0x40, 0x0c, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0xd0, 0xdc, 0x42,
623 0x28, 0xf4, 0xc1, 0x2b, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
624 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0xd8, 0x14, 0x06, 0xf2, 0x19, 0x31,
625 0x40, 0x00, 0x10, 0x04, 0x83, 0x87, 0x17, 0x56, 0xc1, 0x7b, 0x82, 0x11,
626 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0x7a, 0x81, 0x15, 0xb6, 0x25, 0x18,
627 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0xc7, 0x17, 0x5a, 0x01, 0x3b, 0x02,
628 0xb3, 0xca, 0x40, 0x3e, 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0xf0, 0x80,
629 0xc3, 0x2b, 0x88, 0x81, 0x14, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82, 0xc1,
630 0x13, 0x0e, 0xb0, 0xf0, 0x39, 0xc1, 0x88, 0x01, 0x02, 0x80, 0x20, 0x18,
631 0x3c, 0xe2, 0x10, 0x0b, 0x9c, 0x12, 0x58, 0x96, 0x06, 0xf2, 0x19, 0x31,
632 0x40, 0x00, 0x10, 0x04, 0x83, 0x87, 0x1c, 0x66, 0xc1, 0x0c, 0xaa, 0x60,
633 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x9e, 0x72, 0xa0, 0x85, 0x31, 0x88,
634 0x82, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0xcc, 0xa1, 0x16, 0xc0,
635 0xa0, 0x09, 0x8c, 0x6b, 0x03, 0xf9, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82,
636 0xc1, 0x83, 0x0e, 0xb7, 0xa0, 0x06, 0x58, 0x30, 0x62, 0x80, 0x00, 0x20,
637 0x08, 0x06, 0x4f, 0x3a, 0xe0, 0xc2, 0x19, 0x50, 0xc1, 0x88, 0x01, 0x02,
638 0x80, 0x20, 0x18, 0x3c, 0xea, 0x90, 0x0b, 0x64, 0x00, 0x05, 0x23, 0x06,
639 0x09, 0x00, 0x82, 0x60, 0x80, 0xb4, 0x43, 0x2e, 0xa0, 0x03, 0x3a, 0x80,
640 0x43, 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x3b, 0xe4, 0x02,
641 0x3a, 0xa0, 0x03, 0x2d, 0x24, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80,
642 0xb4, 0x43, 0x2e, 0xa0, 0x03, 0x3a, 0xf8, 0x42, 0x31, 0x62, 0x90, 0x00,
643 0x20, 0x08, 0x06, 0x48, 0x3b, 0xe4, 0x02, 0x3a, 0xa0, 0xc3, 0x2f, 0x04,
644 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0xb4, 0x43, 0x2e, 0xa4, 0x03,
645 0x3a, 0x80, 0x43, 0x2b, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xd2,
646 0x0e, 0xb9, 0x90, 0x0e, 0xe8, 0x40, 0x0b, 0xac, 0x30, 0x62, 0x90, 0x00,
647 0x20, 0x08, 0x06, 0x48, 0x3b, 0xe4, 0xc2, 0x38, 0xa0, 0x03, 0x38, 0xc4,
648 0xc2, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xed, 0x90, 0x0b, 0xe3,
649 0x80, 0x0e, 0xb4, 0x00, 0x0b, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80,
650 0xb4, 0x43, 0x2e, 0x8c, 0x03, 0x3a, 0xf8, 0xc2, 0x2b, 0x8c, 0x18, 0x24,
651 0x00, 0x08, 0x82, 0x01, 0xd2, 0x0e, 0xb9, 0x30, 0x0e, 0xe8, 0xf0, 0x0b,
652 0xae, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00
653};
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Color.h b/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Color.h
new file mode 100644
index 0000000..36909c1
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Color.h
@@ -0,0 +1,637 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; POSITION 0 xyz 0 NONE float xyz
8; TEXCOORD 0 xy 1 NONE float xy
9; COLOR 0 xyzw 2 NONE float xyzw
10;
11;
12; Output signature:
13;
14; Name Index Mask Register SysValue Format Used
15; -------------------- ----- ------ -------- -------- ------- ------
16; SV_Position 0 xyzw 0 POS float xyzw
17; TEXCOORD 0 xy 1 NONE float xy
18; COLOR 0 xyzw 2 NONE float xyzw
19;
20; shader hash: 466968c79e75899fd3e9065346b2df1c
21;
22; Pipeline Runtime Information:
23;
24; Vertex Shader
25; OutputPositionPresent=1
26;
27;
28; Input signature:
29;
30; Name Index InterpMode DynIdx
31; -------------------- ----- ---------------------- ------
32; POSITION 0
33; TEXCOORD 0
34; COLOR 0
35;
36; Output signature:
37;
38; Name Index InterpMode DynIdx
39; -------------------- ----- ---------------------- ------
40; SV_Position 0 noperspective
41; TEXCOORD 0 linear
42; COLOR 0 linear
43;
44; Buffer Definitions:
45;
46; cbuffer VertexShaderConstants
47; {
48;
49; struct hostlayout.VertexShaderConstants
50; {
51;
52; row_major float4x4 model; ; Offset: 0
53; row_major float4x4 projectionAndView; ; Offset: 64
54;
55; } VertexShaderConstants; ; Offset: 0 Size: 128
56;
57; }
58;
59;
60; Resource Bindings:
61;
62; Name Type Format Dim ID HLSL Bind Count
63; ------------------------------ ---------- ------- ----------- ------- -------------- ------
64; VertexShaderConstants cbuffer NA NA CB0 cb0 1
65;
66;
67; ViewId state:
68;
69; Number of inputs: 12, outputs: 12
70; Outputs dependent on ViewId: { }
71; Inputs contributing to computation of Outputs:
72; output 0 depends on inputs: { 0, 1, 2 }
73; output 1 depends on inputs: { 0, 1, 2 }
74; output 2 depends on inputs: { 0, 1, 2 }
75; output 3 depends on inputs: { 0, 1, 2 }
76; output 4 depends on inputs: { 4 }
77; output 5 depends on inputs: { 5 }
78; output 8 depends on inputs: { 8 }
79; output 9 depends on inputs: { 9 }
80; output 10 depends on inputs: { 10 }
81; output 11 depends on inputs: { 11 }
82;
83target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
84target triple = "dxil-ms-dx"
85
86%dx.types.Handle = type { i8* }
87%dx.types.CBufRet.f32 = type { float, float, float, float }
88%hostlayout.VertexShaderConstants = type { [4 x <4 x float>], [4 x <4 x float>] }
89
90define void @mainColor() {
91 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
92 %2 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
93 %3 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
94 %4 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
95 %5 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
96 %6 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
97 %7 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
98 %8 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
99 %9 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
100 %10 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
101 %11 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 0) ; CBufferLoadLegacy(handle,regIndex)
102 %12 = extractvalue %dx.types.CBufRet.f32 %11, 0
103 %13 = extractvalue %dx.types.CBufRet.f32 %11, 1
104 %14 = extractvalue %dx.types.CBufRet.f32 %11, 2
105 %15 = extractvalue %dx.types.CBufRet.f32 %11, 3
106 %16 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 1) ; CBufferLoadLegacy(handle,regIndex)
107 %17 = extractvalue %dx.types.CBufRet.f32 %16, 0
108 %18 = extractvalue %dx.types.CBufRet.f32 %16, 1
109 %19 = extractvalue %dx.types.CBufRet.f32 %16, 2
110 %20 = extractvalue %dx.types.CBufRet.f32 %16, 3
111 %21 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 2) ; CBufferLoadLegacy(handle,regIndex)
112 %22 = extractvalue %dx.types.CBufRet.f32 %21, 0
113 %23 = extractvalue %dx.types.CBufRet.f32 %21, 1
114 %24 = extractvalue %dx.types.CBufRet.f32 %21, 2
115 %25 = extractvalue %dx.types.CBufRet.f32 %21, 3
116 %26 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 3) ; CBufferLoadLegacy(handle,regIndex)
117 %27 = extractvalue %dx.types.CBufRet.f32 %26, 0
118 %28 = extractvalue %dx.types.CBufRet.f32 %26, 1
119 %29 = extractvalue %dx.types.CBufRet.f32 %26, 2
120 %30 = extractvalue %dx.types.CBufRet.f32 %26, 3
121 %31 = fmul fast float %12, %8
122 %32 = call float @dx.op.tertiary.f32(i32 46, float %9, float %17, float %31) ; FMad(a,b,c)
123 %33 = call float @dx.op.tertiary.f32(i32 46, float %10, float %22, float %32) ; FMad(a,b,c)
124 %34 = fadd fast float %33, %27
125 %35 = fmul fast float %13, %8
126 %36 = call float @dx.op.tertiary.f32(i32 46, float %9, float %18, float %35) ; FMad(a,b,c)
127 %37 = call float @dx.op.tertiary.f32(i32 46, float %10, float %23, float %36) ; FMad(a,b,c)
128 %38 = fadd fast float %37, %28
129 %39 = fmul fast float %14, %8
130 %40 = call float @dx.op.tertiary.f32(i32 46, float %9, float %19, float %39) ; FMad(a,b,c)
131 %41 = call float @dx.op.tertiary.f32(i32 46, float %10, float %24, float %40) ; FMad(a,b,c)
132 %42 = fadd fast float %41, %29
133 %43 = fmul fast float %15, %8
134 %44 = call float @dx.op.tertiary.f32(i32 46, float %9, float %20, float %43) ; FMad(a,b,c)
135 %45 = call float @dx.op.tertiary.f32(i32 46, float %10, float %25, float %44) ; FMad(a,b,c)
136 %46 = fadd fast float %45, %30
137 %47 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 4) ; CBufferLoadLegacy(handle,regIndex)
138 %48 = extractvalue %dx.types.CBufRet.f32 %47, 0
139 %49 = extractvalue %dx.types.CBufRet.f32 %47, 1
140 %50 = extractvalue %dx.types.CBufRet.f32 %47, 2
141 %51 = extractvalue %dx.types.CBufRet.f32 %47, 3
142 %52 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 5) ; CBufferLoadLegacy(handle,regIndex)
143 %53 = extractvalue %dx.types.CBufRet.f32 %52, 0
144 %54 = extractvalue %dx.types.CBufRet.f32 %52, 1
145 %55 = extractvalue %dx.types.CBufRet.f32 %52, 2
146 %56 = extractvalue %dx.types.CBufRet.f32 %52, 3
147 %57 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 6) ; CBufferLoadLegacy(handle,regIndex)
148 %58 = extractvalue %dx.types.CBufRet.f32 %57, 0
149 %59 = extractvalue %dx.types.CBufRet.f32 %57, 1
150 %60 = extractvalue %dx.types.CBufRet.f32 %57, 2
151 %61 = extractvalue %dx.types.CBufRet.f32 %57, 3
152 %62 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 7) ; CBufferLoadLegacy(handle,regIndex)
153 %63 = extractvalue %dx.types.CBufRet.f32 %62, 0
154 %64 = extractvalue %dx.types.CBufRet.f32 %62, 1
155 %65 = extractvalue %dx.types.CBufRet.f32 %62, 2
156 %66 = extractvalue %dx.types.CBufRet.f32 %62, 3
157 %67 = fmul fast float %48, %34
158 %68 = call float @dx.op.tertiary.f32(i32 46, float %38, float %53, float %67) ; FMad(a,b,c)
159 %69 = call float @dx.op.tertiary.f32(i32 46, float %42, float %58, float %68) ; FMad(a,b,c)
160 %70 = call float @dx.op.tertiary.f32(i32 46, float %46, float %63, float %69) ; FMad(a,b,c)
161 %71 = fmul fast float %49, %34
162 %72 = call float @dx.op.tertiary.f32(i32 46, float %38, float %54, float %71) ; FMad(a,b,c)
163 %73 = call float @dx.op.tertiary.f32(i32 46, float %42, float %59, float %72) ; FMad(a,b,c)
164 %74 = call float @dx.op.tertiary.f32(i32 46, float %46, float %64, float %73) ; FMad(a,b,c)
165 %75 = fmul fast float %50, %34
166 %76 = call float @dx.op.tertiary.f32(i32 46, float %38, float %55, float %75) ; FMad(a,b,c)
167 %77 = call float @dx.op.tertiary.f32(i32 46, float %42, float %60, float %76) ; FMad(a,b,c)
168 %78 = call float @dx.op.tertiary.f32(i32 46, float %46, float %65, float %77) ; FMad(a,b,c)
169 %79 = fmul fast float %51, %34
170 %80 = call float @dx.op.tertiary.f32(i32 46, float %38, float %56, float %79) ; FMad(a,b,c)
171 %81 = call float @dx.op.tertiary.f32(i32 46, float %42, float %61, float %80) ; FMad(a,b,c)
172 %82 = call float @dx.op.tertiary.f32(i32 46, float %46, float %66, float %81) ; FMad(a,b,c)
173 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %70) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
174 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %74) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
175 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %78) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
176 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %82) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
177 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 0, float %6) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
178 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 1, float %7) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
179 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 0, float %2) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
180 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 1, float %3) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
181 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 2, float %4) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
182 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 3, float %5) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
183 ret void
184}
185
186; Function Attrs: nounwind readnone
187declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
188
189; Function Attrs: nounwind
190declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
191
192; Function Attrs: nounwind readonly
193declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
194
195; Function Attrs: nounwind readnone
196declare float @dx.op.tertiary.f32(i32, float, float, float) #0
197
198; Function Attrs: nounwind readonly
199declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
200
201attributes #0 = { nounwind readnone }
202attributes #1 = { nounwind }
203attributes #2 = { nounwind readonly }
204
205!llvm.ident = !{!0}
206!dx.version = !{!1}
207!dx.valver = !{!2}
208!dx.shaderModel = !{!3}
209!dx.resources = !{!4}
210!dx.viewIdState = !{!7}
211!dx.entryPoints = !{!8}
212
213!0 = !{!"clang version 3.7 (tags/RELEASE_370/final)"}
214!1 = !{i32 1, i32 0}
215!2 = !{i32 1, i32 6}
216!3 = !{!"vs", i32 6, i32 0}
217!4 = !{null, null, !5, null}
218!5 = !{!6}
219!6 = !{i32 0, %hostlayout.VertexShaderConstants* undef, !"", i32 0, i32 0, i32 1, i32 128, null}
220!7 = !{[14 x i32] [i32 12, i32 12, i32 15, i32 15, i32 15, i32 0, i32 16, i32 32, i32 0, i32 0, i32 256, i32 512, i32 1024, i32 2048]}
221!8 = !{void ()* @mainColor, !"mainColor", !9, !4, null}
222!9 = !{!10, !18, null}
223!10 = !{!11, !14, !16}
224!11 = !{i32 0, !"POSITION", i8 9, i8 0, !12, i8 0, i32 1, i8 3, i32 0, i8 0, !13}
225!12 = !{i32 0}
226!13 = !{i32 3, i32 7}
227!14 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !12, i8 0, i32 1, i8 2, i32 1, i8 0, !15}
228!15 = !{i32 3, i32 3}
229!16 = !{i32 2, !"COLOR", i8 9, i8 0, !12, i8 0, i32 1, i8 4, i32 2, i8 0, !17}
230!17 = !{i32 3, i32 15}
231!18 = !{!19, !20, !21}
232!19 = !{i32 0, !"SV_Position", i8 9, i8 3, !12, i8 4, i32 1, i8 4, i32 0, i8 0, !17}
233!20 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !12, i8 2, i32 1, i8 2, i32 1, i8 0, !15}
234!21 = !{i32 2, !"COLOR", i8 9, i8 0, !12, i8 2, i32 1, i8 4, i32 2, i8 0, !17}
235
236#endif
237
238const unsigned char g_mainColor[] = {
239 0x44, 0x58, 0x42, 0x43, 0x28, 0x20, 0xca, 0xe8, 0xab, 0xe5, 0x24, 0x7a,
240 0x5d, 0x2b, 0x6f, 0xa4, 0x2c, 0x10, 0xa8, 0xb6, 0x01, 0x00, 0x00, 0x00,
241 0xa3, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
242 0x50, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00,
243 0x87, 0x02, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, 0x87, 0x09, 0x00, 0x00,
244 0xa3, 0x09, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
246 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
254 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58,
256 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00,
257 0x4f, 0x53, 0x47, 0x31, 0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
258 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
263 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74,
267 0x69, 0x6f, 0x6e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44,
268 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x50, 0x53, 0x56, 0x30, 0x1c,
269 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x03,
272 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18,
274 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49,
277 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
278 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43,
279 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x01,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x03,
282 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
283 0x01, 0x42, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x03, 0x03,
286 0x04, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
287 0x01, 0x42, 0x00, 0x03, 0x02, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,
288 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00, 0x0f,
289 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
292 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x52,
293 0x54, 0x53, 0x30, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02,
294 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48,
295 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0xa8,
300 0x06, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0xaa, 0x01, 0x00, 0x00, 0x44,
301 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x90,
302 0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xa1,
303 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13,
304 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06,
305 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e,
306 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4,
307 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48,
308 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4,
309 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1,
310 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08,
311 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40,
312 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d,
313 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49,
314 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20,
315 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x26,
316 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93,
317 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12,
318 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00, 0x25,
319 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6,
320 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3,
321 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98,
322 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f,
323 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10,
324 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11, 0x04,
325 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10, 0x43,
326 0x12, 0xd4, 0x03, 0x83, 0xc3, 0x91, 0xa6, 0x05, 0xc0, 0x1c, 0x6a, 0xf2,
327 0x5f, 0x22, 0x9a, 0x88, 0x8b, 0x3d, 0x80, 0x81, 0x88, 0x38, 0xa7, 0x91,
328 0x26, 0xa0, 0x99, 0x24, 0x24, 0x58, 0x4b, 0x37, 0x1d, 0x08, 0x00, 0x13,
329 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68,
330 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a,
331 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
332 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
333 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71,
334 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72,
335 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a,
336 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73,
337 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72,
338 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d,
339 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72,
340 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00,
343 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40,
344 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x79,
345 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8,
346 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
347 0x16, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19,
348 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25,
349 0x30, 0x02, 0x50, 0x0c, 0x05, 0x28, 0x50, 0x04, 0x85, 0x50, 0x06, 0xe5,
350 0x50, 0x12, 0x05, 0x18, 0x50, 0x1e, 0x85, 0x51, 0xba, 0x01, 0x45, 0x41,
351 0xa5, 0x24, 0x46, 0x00, 0xca, 0xa0, 0x08, 0x0a, 0x81, 0x62, 0x0d, 0xd0,
352 0x9d, 0x01, 0x20, 0x3c, 0x03, 0x40, 0x79, 0x2c, 0x87, 0x61, 0x9e, 0xe7,
353 0x01, 0x20, 0x30, 0x00, 0x00, 0x10, 0x01, 0x21, 0x10, 0x0c, 0x40, 0x50,
354 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x1a,
355 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73,
356 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71,
357 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b, 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a,
358 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9, 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b,
359 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7,
360 0x06, 0x61, 0x20, 0x36, 0x08, 0x04, 0x41, 0xc1, 0x6e, 0x6e, 0x82, 0x40,
361 0x20, 0x1b, 0x86, 0x03, 0x21, 0x26, 0x08, 0xd8, 0xc6, 0xca, 0xaa, 0x4c,
362 0x8e, 0xae, 0x0c, 0x6f, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd,
363 0x6d, 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x6e, 0x82, 0x40, 0x24, 0x1b, 0x10,
364 0x42, 0x59, 0x08, 0x62, 0x60, 0x80, 0x0d, 0x41, 0xb3, 0x81, 0x00, 0x00,
365 0x07, 0x98, 0x20, 0x5c, 0x1a, 0x8b, 0xb6, 0x37, 0xb2, 0x32, 0xb6, 0x09,
366 0x02, 0xa1, 0x4c, 0x10, 0x88, 0x65, 0xc3, 0x30, 0x4d, 0xc3, 0x04, 0x81,
367 0x60, 0x26, 0x08, 0x44, 0x33, 0x41, 0x20, 0x9c, 0x09, 0x42, 0x94, 0x6d,
368 0x50, 0x90, 0x48, 0xa2, 0x2a, 0xc2, 0xba, 0x2e, 0x8c, 0x11, 0x9c, 0xdc,
369 0x9b, 0x5a, 0xd9, 0x18, 0x5d, 0xda, 0x9b, 0x5b, 0x90, 0x1b, 0x99, 0x55,
370 0x5a, 0xd9, 0xdd, 0x04, 0x81, 0x78, 0x36, 0x28, 0x88, 0x26, 0x51, 0xd5,
371 0x66, 0x5d, 0x17, 0xb6, 0x61, 0x60, 0x32, 0x6e, 0xc3, 0x40, 0x40, 0xdd,
372 0x04, 0x41, 0x00, 0x36, 0x00, 0x1b, 0x06, 0x02, 0x0c, 0xc0, 0x60, 0x43,
373 0x10, 0x06, 0x1b, 0x86, 0xe1, 0x13, 0x83, 0x09, 0x42, 0xc6, 0x6d, 0x08,
374 0xc8, 0x80, 0x49, 0x5b, 0x58, 0x9a, 0xdb, 0xd0, 0x1b, 0xdb, 0x9b, 0x1c,
375 0x11, 0xa8, 0xa7, 0xa9, 0x24, 0xaa, 0xa4, 0x27, 0xa7, 0x09, 0x42, 0x41,
376 0x4d, 0x10, 0x8a, 0x6a, 0x43, 0x40, 0x4c, 0x10, 0x0a, 0x6b, 0x83, 0x50,
377 0x59, 0x1b, 0x16, 0xe2, 0x0c, 0xd0, 0x20, 0x0d, 0xd4, 0x20, 0x0d, 0x86,
378 0x35, 0x20, 0xd2, 0x80, 0x0d, 0x88, 0x50, 0x15, 0x61, 0x0d, 0x3d, 0x3d,
379 0x49, 0x11, 0x4d, 0x10, 0x8a, 0x6b, 0x83, 0x50, 0x55, 0x1b, 0x96, 0xc1,
380 0x0d, 0xd0, 0x20, 0x0d, 0xd4, 0x20, 0x0d, 0x86, 0x37, 0x18, 0xd2, 0x00,
381 0x0e, 0x58, 0x0c, 0x3d, 0x31, 0x3d, 0x49, 0x4d, 0x10, 0x0a, 0x6c, 0x82,
382 0x40, 0x40, 0x1b, 0x84, 0x8a, 0x0e, 0x36, 0x2c, 0x92, 0x1c, 0xa0, 0x41,
383 0x1a, 0xa8, 0x41, 0x1a, 0x0c, 0x73, 0x20, 0xa5, 0x41, 0x1d, 0x6c, 0x18,
384 0xda, 0x20, 0x0e, 0xec, 0x80, 0xcb, 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c,
385 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x86, 0x85, 0xc0, 0x03, 0x34, 0x58, 0x03,
386 0x35, 0x98, 0x83, 0x61, 0x0e, 0x88, 0x34, 0xa8, 0x83, 0x0d, 0xcb, 0xe0,
387 0x06, 0x68, 0x90, 0x06, 0x6a, 0xf0, 0x06, 0xc3, 0x1b, 0x0c, 0x69, 0x00,
388 0x07, 0x1b, 0x16, 0x49, 0x0e, 0xd0, 0x20, 0x0d, 0xd4, 0xe0, 0x0d, 0x86,
389 0x39, 0x90, 0xd2, 0xa0, 0x0e, 0x36, 0x0c, 0x79, 0xa0, 0x07, 0x7b, 0xb0,
390 0x61, 0xb8, 0x03, 0x3e, 0x00, 0x36, 0x14, 0x9f, 0x19, 0xf4, 0xc1, 0x03,
391 0xd0, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x11, 0x8b,
392 0x34, 0xb7, 0x39, 0xba, 0xb9, 0x09, 0x02, 0x21, 0xd1, 0x98, 0x4b, 0x3b,
393 0xfb, 0x62, 0x23, 0xa3, 0x31, 0x97, 0x76, 0xf6, 0x35, 0x47, 0x37, 0x41,
394 0x20, 0xa6, 0x0d, 0xc8, 0x1f, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x5c,
395 0xa4, 0x50, 0x0a, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca,
396 0xdc, 0xe8, 0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17, 0xbb, 0x32, 0xb9,
397 0xb9, 0xb4, 0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c, 0xcf, 0xc5, 0x2e,
398 0x8c, 0xcd, 0xae, 0x4c, 0x6e, 0x4a, 0x50, 0xd4, 0x21, 0xc3, 0x73, 0x99,
399 0x43, 0x0b, 0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b, 0x63, 0x9b, 0x12,
400 0x20, 0x65, 0xc8, 0xf0, 0x5c, 0xe4, 0xca, 0xe6, 0xde, 0xea, 0xe4, 0xc6,
401 0xca, 0xe6, 0xa6, 0x04, 0x4e, 0x25, 0x32, 0x3c, 0x17, 0xba, 0x3c, 0xb8,
402 0xb2, 0x20, 0x37, 0xb7, 0x37, 0xba, 0x30, 0xba, 0xb4, 0x37, 0xb7, 0xb9,
403 0x29, 0x42, 0x27, 0x06, 0x75, 0xc8, 0xf0, 0x5c, 0xec, 0xd2, 0xca, 0xee,
404 0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8, 0xca, 0xa6, 0x04, 0x64, 0x50, 0x87,
405 0x0c, 0xcf, 0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d,
406 0x6e, 0x6e, 0x4a, 0xd0, 0x07, 0x5d, 0xc8, 0xf0, 0x5c, 0xc6, 0xde, 0xea,
407 0xdc, 0xe8, 0xca, 0xe4, 0xe6, 0xa6, 0x04, 0xa5, 0x00, 0x00, 0x00, 0x79,
408 0x18, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4,
409 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c,
410 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00,
411 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2,
412 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38,
413 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d,
414 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87,
415 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87,
416 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30,
417 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde,
418 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b,
419 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c,
420 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07,
421 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87,
422 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87,
423 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87,
424 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0,
425 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc,
426 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4,
427 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39,
428 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38,
429 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b,
430 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03,
431 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87,
432 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x71,
433 0x20, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97, 0xef,
434 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25, 0x61,
435 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce, 0xe3,
436 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0, 0x34,
437 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f,
438 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44,
439 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3, 0xe5,
440 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7, 0x6d,
441 0x00, 0x09, 0x03, 0x20, 0x0d, 0xe7, 0x2c, 0x4e, 0x04, 0x00, 0x00, 0x00,
442 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00,
443 0x00, 0x00, 0x00, 0x46, 0x69, 0x68, 0xc7, 0x9e, 0x75, 0x89, 0x9f, 0xd3,
444 0xe9, 0x06, 0x53, 0x46, 0xb2, 0xdf, 0x1c, 0x44, 0x58, 0x49, 0x4c, 0xf8,
445 0x08, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0x3e, 0x02, 0x00, 0x00, 0x44,
446 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xe0,
447 0x08, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x35,
448 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13,
449 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06,
450 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e,
451 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4,
452 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48,
453 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4,
454 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1,
455 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08,
456 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40,
457 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d,
458 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49,
459 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20,
460 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x26,
461 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93,
462 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12,
463 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00, 0x25,
464 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6,
465 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3,
466 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98,
467 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f,
468 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10,
469 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11, 0x04,
470 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10, 0x43,
471 0x12, 0xd4, 0x03, 0x83, 0xc3, 0x91, 0xa6, 0x05, 0xc0, 0x1c, 0x6a, 0xf2,
472 0x5f, 0x22, 0x9a, 0x88, 0x8b, 0x3d, 0x80, 0x81, 0x88, 0x38, 0xa7, 0x91,
473 0x26, 0xa0, 0x99, 0x24, 0x24, 0x58, 0x4b, 0x37, 0x1d, 0x08, 0x00, 0x13,
474 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68,
475 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a,
476 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
477 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
478 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71,
479 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72,
480 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a,
481 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73,
482 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72,
483 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d,
484 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72,
485 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01,
487 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00,
488 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40,
489 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x79,
490 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8,
491 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
492 0x16, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19,
493 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25,
494 0x30, 0x02, 0x50, 0x0c, 0x05, 0x28, 0x50, 0x06, 0xe5, 0x50, 0x04, 0xe5,
495 0x41, 0xa5, 0x24, 0x46, 0x00, 0xca, 0xa0, 0x08, 0x0a, 0x81, 0xf0, 0x0c,
496 0x00, 0xe5, 0xb1, 0x1c, 0x86, 0x79, 0x9e, 0x07, 0x80, 0xc0, 0x00, 0x00,
497 0x40, 0x04, 0x84, 0x40, 0x30, 0x00, 0x41, 0x01, 0x00, 0x00, 0x00, 0x79,
498 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46,
499 0x02, 0x13, 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b,
500 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1,
501 0x0b, 0x3b, 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa,
502 0x9a, 0xb9, 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10,
503 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x20, 0x26,
504 0x08, 0x04, 0xb2, 0x41, 0x18, 0x0c, 0x0a, 0x76, 0x73, 0x1b, 0x06, 0xc4,
505 0x20, 0x26, 0x08, 0xd8, 0x44, 0x60, 0x82, 0x40, 0x24, 0x1b, 0x10, 0x42,
506 0x59, 0x08, 0x62, 0x60, 0x80, 0x0d, 0x41, 0xb3, 0x81, 0x00, 0x00, 0x07,
507 0x98, 0x20, 0x64, 0xd4, 0x86, 0x00, 0x9a, 0x20, 0x08, 0x00, 0x93, 0xb6,
508 0xb0, 0x34, 0xb7, 0xa1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x50, 0x4f, 0x53,
509 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x13, 0x84, 0xc2, 0x99, 0x20, 0x14, 0xcf,
510 0x86, 0x80, 0x98, 0x20, 0x14, 0xd0, 0x04, 0x81, 0x50, 0x26, 0x08, 0xc4,
511 0xb2, 0x41, 0xc8, 0xb4, 0x0d, 0x0b, 0x41, 0x55, 0xd6, 0x65, 0x0d, 0x18,
512 0x61, 0x6d, 0x44, 0xa8, 0x8a, 0xb0, 0x86, 0x9e, 0x9e, 0xa4, 0x88, 0x26,
513 0x08, 0x45, 0xb4, 0x41, 0xc8, 0xb2, 0x0d, 0xcb, 0xd0, 0x55, 0xd6, 0x65,
514 0x0d, 0xde, 0x60, 0x7d, 0x13, 0x04, 0x82, 0x61, 0x31, 0xf4, 0xc4, 0xf4,
515 0x24, 0x35, 0x41, 0x28, 0xa4, 0x09, 0x02, 0xd1, 0x6c, 0x10, 0x32, 0x32,
516 0xd8, 0xb0, 0x84, 0x81, 0x18, 0x54, 0xd6, 0x65, 0x0d, 0x63, 0x10, 0x06,
517 0x56, 0x19, 0x6c, 0x18, 0x38, 0x30, 0x30, 0x03, 0x2e, 0x53, 0x56, 0x5f,
518 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1b, 0x16, 0x02, 0x0d,
519 0x2a, 0xec, 0x1a, 0x83, 0x61, 0x0c, 0x08, 0xab, 0x0c, 0x36, 0x2c, 0x43,
520 0x57, 0x59, 0x97, 0x37, 0x78, 0x83, 0xf5, 0x6d, 0x58, 0xc2, 0x40, 0x0c,
521 0x2a, 0xeb, 0xf2, 0x86, 0x31, 0x08, 0x03, 0xab, 0x0c, 0x36, 0x0c, 0x69,
522 0xa0, 0x06, 0x6b, 0xb0, 0x61, 0x38, 0x03, 0x36, 0x00, 0x36, 0x14, 0xd2,
523 0xd4, 0x06, 0x0f, 0x50, 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac,
524 0xcc, 0x8d, 0x6e, 0x4a, 0x10, 0x54, 0x21, 0xc3, 0x73, 0xb1, 0x2b, 0x93,
525 0x9b, 0x4b, 0x7b, 0x73, 0x9b, 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec,
526 0xc2, 0xd8, 0xec, 0xca, 0xe4, 0xa6, 0x04, 0x46, 0x1d, 0x32, 0x3c, 0x97,
527 0x39, 0xb4, 0x30, 0xb2, 0x32, 0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29,
528 0x01, 0x52, 0x86, 0x0c, 0xcf, 0x45, 0xae, 0x6c, 0xee, 0xad, 0x4e, 0x6e,
529 0xac, 0x6c, 0x6e, 0x4a, 0xe0, 0xd4, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b,
530 0xbb, 0x4b, 0x22, 0x9b, 0xa2, 0x0b, 0xa3, 0x2b, 0x9b, 0x12, 0x40, 0x75,
531 0xc8, 0xf0, 0x5c, 0xca, 0xdc, 0xe8, 0xe4, 0xf2, 0xa0, 0xde, 0xd2, 0xdc,
532 0xe8, 0xe6, 0xa6, 0x04, 0x6d, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x49,
533 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14,
534 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79,
535 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e,
536 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1,
537 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc,
538 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74,
539 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a,
540 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e,
541 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e,
542 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21,
543 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0,
544 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc,
545 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72,
546 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76,
547 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f,
548 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c,
549 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03,
550 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1,
551 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61,
552 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8,
553 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94,
554 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0,
555 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73,
556 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77,
557 0xa8, 0x07, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x19,
558 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x50,
559 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02, 0xe6, 0x17,
560 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01, 0x4c,
561 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe, 0xf3, 0xf8,
562 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x09, 0x54,
563 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50,
564 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f, 0x11,
565 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x09, 0x03, 0x20,
566 0x0d, 0xe7, 0x2c, 0x4e, 0x04, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xcf,
567 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05,
568 0x00, 0x00, 0x00, 0x44, 0x8a, 0xab, 0x14, 0x0a, 0x61, 0x06, 0xa0, 0xec,
569 0x4a, 0x8e, 0x4a, 0x09, 0x50, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x23,
570 0x06, 0x09, 0x00, 0x82, 0x60, 0x20, 0x61, 0x03, 0x63, 0x59, 0xc1, 0x88,
571 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0xdd, 0x21, 0x5d, 0x8f, 0x31, 0x62,
572 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x87, 0x4c, 0x18, 0x71, 0x8c, 0x18,
573 0x24, 0x00, 0x08, 0x82, 0x81, 0xf1, 0x25, 0x54, 0xf6, 0x20, 0x23, 0x06,
574 0x09, 0x00, 0x82, 0x60, 0x60, 0x80, 0x81, 0x52, 0x69, 0x51, 0x32, 0x62,
575 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x18, 0x2c, 0xdc, 0x36, 0x29, 0x23,
576 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x88, 0x01, 0xd3, 0x71, 0xc8, 0x32,
577 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6, 0x18, 0x34, 0x5d, 0x57, 0x31,
578 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x90, 0x81, 0xe3, 0x79, 0x4a,
579 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x19, 0x3c, 0xdf, 0x57,
580 0x39, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0xd0, 0x90, 0x81, 0xa3, 0x80,
581 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c,
582 0x26, 0x10, 0xc3, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0x69, 0x30,
583 0x3d, 0x66, 0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30,
584 0x08, 0xa3, 0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x8d,
585 0x1b, 0x60, 0x54, 0x19, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
586 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82,
587 0x41, 0x33, 0x07, 0x5d, 0xc6, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20,
588 0x04, 0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0x36, 0x5d, 0xf2, 0x19,
589 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x07, 0x0f, 0xce, 0xe0, 0x7a, 0x82,
590 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0xf2, 0x00, 0x0d, 0xae, 0x25,
591 0xb0, 0xe0, 0x80, 0x8e, 0x59, 0x9b, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04,
592 0xc1, 0xe0, 0xe1, 0x83, 0x35, 0xd8, 0xa4, 0x60, 0xc4, 0x00, 0x01, 0x40,
593 0x10, 0x0c, 0x9e, 0x3e, 0x60, 0x83, 0xcd, 0x09, 0x2c, 0x50, 0xa0, 0x63,
594 0xd9, 0x27, 0x9f, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0x40, 0xe1,
595 0x0d, 0xbe, 0x2a, 0x18, 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x27, 0x14,
596 0xe0, 0xe0, 0x8b, 0x02, 0x0b, 0x1a, 0xe8, 0x18, 0x37, 0x06, 0xf2, 0x19,
597 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x87, 0x14, 0xe6, 0x60, 0x0c, 0xb0,
598 0x60, 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x9e, 0x52, 0xa0, 0x83, 0x31,
599 0xa0, 0x02, 0x0b, 0x20, 0xe8, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41,
600 0x83, 0x0a, 0x72, 0xe0, 0x06, 0x74, 0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09,
601 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x30, 0x62, 0x70, 0x00,
602 0x20, 0x08, 0x06, 0x4d, 0x2b, 0xdc, 0xc1, 0x1c, 0xe8, 0xc1, 0x68, 0x42,
603 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x26, 0x10, 0xc3,
604 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0xb2, 0xc0, 0x07, 0x78, 0xd0,
605 0x0a, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x30,
606 0x9a, 0x40, 0x0c, 0x23, 0x06, 0x07, 0x00, 0x82, 0x60, 0xd0, 0xdc, 0x42,
607 0x28, 0xf4, 0xc1, 0x2b, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
608 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0xd8, 0x14, 0x06, 0xf2, 0x19, 0x31,
609 0x40, 0x00, 0x10, 0x04, 0x83, 0x87, 0x17, 0x56, 0xc1, 0x7b, 0x82, 0x11,
610 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0x7a, 0x81, 0x15, 0xb6, 0x25, 0x18,
611 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0xc7, 0x17, 0x5a, 0x01, 0x3b, 0x02,
612 0xb3, 0xca, 0x40, 0x3e, 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0xf0, 0x80,
613 0xc3, 0x2b, 0x88, 0x81, 0x14, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82, 0xc1,
614 0x13, 0x0e, 0xb0, 0xf0, 0x39, 0xc1, 0x88, 0x01, 0x02, 0x80, 0x20, 0x18,
615 0x3c, 0xe2, 0x10, 0x0b, 0x9c, 0x12, 0x58, 0x96, 0x06, 0xf2, 0x19, 0x31,
616 0x40, 0x00, 0x10, 0x04, 0x83, 0x87, 0x1c, 0x66, 0xc1, 0x0c, 0xaa, 0x60,
617 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x9e, 0x72, 0xa0, 0x85, 0x31, 0x88,
618 0x82, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0xcc, 0xa1, 0x16, 0xc0,
619 0xa0, 0x09, 0x8c, 0x6b, 0x03, 0xf9, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82,
620 0xc1, 0x83, 0x0e, 0xb7, 0xa0, 0x06, 0x58, 0x30, 0x62, 0x80, 0x00, 0x20,
621 0x08, 0x06, 0x4f, 0x3a, 0xe0, 0xc2, 0x19, 0x50, 0xc1, 0x88, 0x01, 0x02,
622 0x80, 0x20, 0x18, 0x3c, 0xea, 0x90, 0x0b, 0x64, 0x00, 0x05, 0x23, 0x06,
623 0x09, 0x00, 0x82, 0x60, 0x80, 0xb4, 0x43, 0x2e, 0xa0, 0x03, 0x3a, 0x80,
624 0x43, 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x3b, 0xe4, 0x02,
625 0x3a, 0xa0, 0x03, 0x2d, 0x24, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80,
626 0xb4, 0x43, 0x2e, 0xa0, 0x03, 0x3a, 0xf8, 0x42, 0x31, 0x62, 0x90, 0x00,
627 0x20, 0x08, 0x06, 0x48, 0x3b, 0xe4, 0x02, 0x3a, 0xa0, 0xc3, 0x2f, 0x04,
628 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0xb4, 0x43, 0x2e, 0xa4, 0x03,
629 0x3a, 0x80, 0x43, 0x2b, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xd2,
630 0x0e, 0xb9, 0x90, 0x0e, 0xe8, 0x40, 0x0b, 0xac, 0x30, 0x62, 0x90, 0x00,
631 0x20, 0x08, 0x06, 0x48, 0x3b, 0xe4, 0xc2, 0x38, 0xa0, 0x03, 0x38, 0xc4,
632 0xc2, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xed, 0x90, 0x0b, 0xe3,
633 0x80, 0x0e, 0xb4, 0x00, 0x0b, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80,
634 0xb4, 0x43, 0x2e, 0x8c, 0x03, 0x3a, 0xf8, 0xc2, 0x2b, 0x8c, 0x18, 0x24,
635 0x00, 0x08, 0x82, 0x01, 0xd2, 0x0e, 0xb9, 0x30, 0x0e, 0xe8, 0xf0, 0x0b,
636 0xae, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00
637};
diff --git a/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Texture.h b/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Texture.h
new file mode 100644
index 0000000..ac68e32
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/D3D12_VertexShader_Texture.h
@@ -0,0 +1,645 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; POSITION 0 xyz 0 NONE float xyz
8; TEXCOORD 0 xy 1 NONE float xy
9; COLOR 0 xyzw 2 NONE float xyzw
10;
11;
12; Output signature:
13;
14; Name Index Mask Register SysValue Format Used
15; -------------------- ----- ------ -------- -------- ------- ------
16; SV_Position 0 xyzw 0 POS float xyzw
17; TEXCOORD 0 xy 1 NONE float xy
18; COLOR 0 xyzw 2 NONE float xyzw
19;
20; shader hash: 6b5daf1892267550d482ef06f687d614
21;
22; Pipeline Runtime Information:
23;
24; Vertex Shader
25; OutputPositionPresent=1
26;
27;
28; Input signature:
29;
30; Name Index InterpMode DynIdx
31; -------------------- ----- ---------------------- ------
32; POSITION 0
33; TEXCOORD 0
34; COLOR 0
35;
36; Output signature:
37;
38; Name Index InterpMode DynIdx
39; -------------------- ----- ---------------------- ------
40; SV_Position 0 noperspective
41; TEXCOORD 0 linear
42; COLOR 0 linear
43;
44; Buffer Definitions:
45;
46; cbuffer VertexShaderConstants
47; {
48;
49; struct hostlayout.VertexShaderConstants
50; {
51;
52; row_major float4x4 model; ; Offset: 0
53; row_major float4x4 projectionAndView; ; Offset: 64
54;
55; } VertexShaderConstants; ; Offset: 0 Size: 128
56;
57; }
58;
59;
60; Resource Bindings:
61;
62; Name Type Format Dim ID HLSL Bind Count
63; ------------------------------ ---------- ------- ----------- ------- -------------- ------
64; VertexShaderConstants cbuffer NA NA CB0 cb0 1
65;
66;
67; ViewId state:
68;
69; Number of inputs: 12, outputs: 12
70; Outputs dependent on ViewId: { }
71; Inputs contributing to computation of Outputs:
72; output 0 depends on inputs: { 0, 1, 2 }
73; output 1 depends on inputs: { 0, 1, 2 }
74; output 2 depends on inputs: { 0, 1, 2 }
75; output 3 depends on inputs: { 0, 1, 2 }
76; output 4 depends on inputs: { 4 }
77; output 5 depends on inputs: { 5 }
78; output 8 depends on inputs: { 8 }
79; output 9 depends on inputs: { 9 }
80; output 10 depends on inputs: { 10 }
81; output 11 depends on inputs: { 11 }
82;
83target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
84target triple = "dxil-ms-dx"
85
86%dx.types.Handle = type { i8* }
87%dx.types.CBufRet.f32 = type { float, float, float, float }
88%hostlayout.VertexShaderConstants = type { [4 x <4 x float>], [4 x <4 x float>] }
89
90define void @mainTexture() {
91 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
92 %2 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
93 %3 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
94 %4 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
95 %5 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
96 %6 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
97 %7 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
98 %8 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
99 %9 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
100 %10 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
101 %11 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 0) ; CBufferLoadLegacy(handle,regIndex)
102 %12 = extractvalue %dx.types.CBufRet.f32 %11, 0
103 %13 = extractvalue %dx.types.CBufRet.f32 %11, 1
104 %14 = extractvalue %dx.types.CBufRet.f32 %11, 2
105 %15 = extractvalue %dx.types.CBufRet.f32 %11, 3
106 %16 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 1) ; CBufferLoadLegacy(handle,regIndex)
107 %17 = extractvalue %dx.types.CBufRet.f32 %16, 0
108 %18 = extractvalue %dx.types.CBufRet.f32 %16, 1
109 %19 = extractvalue %dx.types.CBufRet.f32 %16, 2
110 %20 = extractvalue %dx.types.CBufRet.f32 %16, 3
111 %21 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 2) ; CBufferLoadLegacy(handle,regIndex)
112 %22 = extractvalue %dx.types.CBufRet.f32 %21, 0
113 %23 = extractvalue %dx.types.CBufRet.f32 %21, 1
114 %24 = extractvalue %dx.types.CBufRet.f32 %21, 2
115 %25 = extractvalue %dx.types.CBufRet.f32 %21, 3
116 %26 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 3) ; CBufferLoadLegacy(handle,regIndex)
117 %27 = extractvalue %dx.types.CBufRet.f32 %26, 0
118 %28 = extractvalue %dx.types.CBufRet.f32 %26, 1
119 %29 = extractvalue %dx.types.CBufRet.f32 %26, 2
120 %30 = extractvalue %dx.types.CBufRet.f32 %26, 3
121 %31 = fmul fast float %12, %8
122 %32 = call float @dx.op.tertiary.f32(i32 46, float %9, float %17, float %31) ; FMad(a,b,c)
123 %33 = call float @dx.op.tertiary.f32(i32 46, float %10, float %22, float %32) ; FMad(a,b,c)
124 %34 = fadd fast float %33, %27
125 %35 = fmul fast float %13, %8
126 %36 = call float @dx.op.tertiary.f32(i32 46, float %9, float %18, float %35) ; FMad(a,b,c)
127 %37 = call float @dx.op.tertiary.f32(i32 46, float %10, float %23, float %36) ; FMad(a,b,c)
128 %38 = fadd fast float %37, %28
129 %39 = fmul fast float %14, %8
130 %40 = call float @dx.op.tertiary.f32(i32 46, float %9, float %19, float %39) ; FMad(a,b,c)
131 %41 = call float @dx.op.tertiary.f32(i32 46, float %10, float %24, float %40) ; FMad(a,b,c)
132 %42 = fadd fast float %41, %29
133 %43 = fmul fast float %15, %8
134 %44 = call float @dx.op.tertiary.f32(i32 46, float %9, float %20, float %43) ; FMad(a,b,c)
135 %45 = call float @dx.op.tertiary.f32(i32 46, float %10, float %25, float %44) ; FMad(a,b,c)
136 %46 = fadd fast float %45, %30
137 %47 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 4) ; CBufferLoadLegacy(handle,regIndex)
138 %48 = extractvalue %dx.types.CBufRet.f32 %47, 0
139 %49 = extractvalue %dx.types.CBufRet.f32 %47, 1
140 %50 = extractvalue %dx.types.CBufRet.f32 %47, 2
141 %51 = extractvalue %dx.types.CBufRet.f32 %47, 3
142 %52 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 5) ; CBufferLoadLegacy(handle,regIndex)
143 %53 = extractvalue %dx.types.CBufRet.f32 %52, 0
144 %54 = extractvalue %dx.types.CBufRet.f32 %52, 1
145 %55 = extractvalue %dx.types.CBufRet.f32 %52, 2
146 %56 = extractvalue %dx.types.CBufRet.f32 %52, 3
147 %57 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 6) ; CBufferLoadLegacy(handle,regIndex)
148 %58 = extractvalue %dx.types.CBufRet.f32 %57, 0
149 %59 = extractvalue %dx.types.CBufRet.f32 %57, 1
150 %60 = extractvalue %dx.types.CBufRet.f32 %57, 2
151 %61 = extractvalue %dx.types.CBufRet.f32 %57, 3
152 %62 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 7) ; CBufferLoadLegacy(handle,regIndex)
153 %63 = extractvalue %dx.types.CBufRet.f32 %62, 0
154 %64 = extractvalue %dx.types.CBufRet.f32 %62, 1
155 %65 = extractvalue %dx.types.CBufRet.f32 %62, 2
156 %66 = extractvalue %dx.types.CBufRet.f32 %62, 3
157 %67 = fmul fast float %48, %34
158 %68 = call float @dx.op.tertiary.f32(i32 46, float %38, float %53, float %67) ; FMad(a,b,c)
159 %69 = call float @dx.op.tertiary.f32(i32 46, float %42, float %58, float %68) ; FMad(a,b,c)
160 %70 = call float @dx.op.tertiary.f32(i32 46, float %46, float %63, float %69) ; FMad(a,b,c)
161 %71 = fmul fast float %49, %34
162 %72 = call float @dx.op.tertiary.f32(i32 46, float %38, float %54, float %71) ; FMad(a,b,c)
163 %73 = call float @dx.op.tertiary.f32(i32 46, float %42, float %59, float %72) ; FMad(a,b,c)
164 %74 = call float @dx.op.tertiary.f32(i32 46, float %46, float %64, float %73) ; FMad(a,b,c)
165 %75 = fmul fast float %50, %34
166 %76 = call float @dx.op.tertiary.f32(i32 46, float %38, float %55, float %75) ; FMad(a,b,c)
167 %77 = call float @dx.op.tertiary.f32(i32 46, float %42, float %60, float %76) ; FMad(a,b,c)
168 %78 = call float @dx.op.tertiary.f32(i32 46, float %46, float %65, float %77) ; FMad(a,b,c)
169 %79 = fmul fast float %51, %34
170 %80 = call float @dx.op.tertiary.f32(i32 46, float %38, float %56, float %79) ; FMad(a,b,c)
171 %81 = call float @dx.op.tertiary.f32(i32 46, float %42, float %61, float %80) ; FMad(a,b,c)
172 %82 = call float @dx.op.tertiary.f32(i32 46, float %46, float %66, float %81) ; FMad(a,b,c)
173 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %70) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
174 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %74) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
175 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %78) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
176 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %82) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
177 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 0, float %6) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
178 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 1, float %7) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
179 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 0, float %2) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
180 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 1, float %3) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
181 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 2, float %4) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
182 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 3, float %5) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
183 ret void
184}
185
186; Function Attrs: nounwind readnone
187declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
188
189; Function Attrs: nounwind
190declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
191
192; Function Attrs: nounwind readonly
193declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
194
195; Function Attrs: nounwind readnone
196declare float @dx.op.tertiary.f32(i32, float, float, float) #0
197
198; Function Attrs: nounwind readonly
199declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
200
201attributes #0 = { nounwind readnone }
202attributes #1 = { nounwind }
203attributes #2 = { nounwind readonly }
204
205!llvm.ident = !{!0}
206!dx.version = !{!1}
207!dx.valver = !{!2}
208!dx.shaderModel = !{!3}
209!dx.resources = !{!4}
210!dx.viewIdState = !{!7}
211!dx.entryPoints = !{!8}
212
213!0 = !{!"clang version 3.7 (tags/RELEASE_370/final)"}
214!1 = !{i32 1, i32 0}
215!2 = !{i32 1, i32 6}
216!3 = !{!"vs", i32 6, i32 0}
217!4 = !{null, null, !5, null}
218!5 = !{!6}
219!6 = !{i32 0, %hostlayout.VertexShaderConstants* undef, !"", i32 0, i32 0, i32 1, i32 128, null}
220!7 = !{[14 x i32] [i32 12, i32 12, i32 15, i32 15, i32 15, i32 0, i32 16, i32 32, i32 0, i32 0, i32 256, i32 512, i32 1024, i32 2048]}
221!8 = !{void ()* @mainTexture, !"mainTexture", !9, !4, null}
222!9 = !{!10, !18, null}
223!10 = !{!11, !14, !16}
224!11 = !{i32 0, !"POSITION", i8 9, i8 0, !12, i8 0, i32 1, i8 3, i32 0, i8 0, !13}
225!12 = !{i32 0}
226!13 = !{i32 3, i32 7}
227!14 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !12, i8 0, i32 1, i8 2, i32 1, i8 0, !15}
228!15 = !{i32 3, i32 3}
229!16 = !{i32 2, !"COLOR", i8 9, i8 0, !12, i8 0, i32 1, i8 4, i32 2, i8 0, !17}
230!17 = !{i32 3, i32 15}
231!18 = !{!19, !20, !21}
232!19 = !{i32 0, !"SV_Position", i8 9, i8 3, !12, i8 4, i32 1, i8 4, i32 0, i8 0, !17}
233!20 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !12, i8 2, i32 1, i8 2, i32 1, i8 0, !15}
234!21 = !{i32 2, !"COLOR", i8 9, i8 0, !12, i8 2, i32 1, i8 4, i32 2, i8 0, !17}
235
236#endif
237
238const unsigned char g_mainTexture[] = {
239 0x44, 0x58, 0x42, 0x43, 0xda, 0xc9, 0x75, 0xea, 0x0d, 0x18, 0xc7, 0xf5,
240 0xb4, 0x80, 0x10, 0xd9, 0xd7, 0x88, 0x5a, 0x23, 0x01, 0x00, 0x00, 0x00,
241 0xff, 0x12, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
242 0x50, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00,
243 0x87, 0x02, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0xdf, 0x09, 0x00, 0x00,
244 0xfb, 0x09, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31,
246 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
254 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58,
256 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00,
257 0x4f, 0x53, 0x47, 0x31, 0x83, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
258 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00,
259 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
260 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
263 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74,
267 0x69, 0x6f, 0x6e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44,
268 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x50, 0x53, 0x56, 0x30, 0x1c,
269 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x03,
272 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18,
274 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49,
277 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
278 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43,
279 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x01,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x03,
282 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
283 0x01, 0x42, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x03, 0x03,
286 0x04, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
287 0x01, 0x42, 0x00, 0x03, 0x02, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,
288 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00, 0x0f,
289 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
292 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x52,
293 0x54, 0x53, 0x30, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04,
294 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0,
295 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
296 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
298 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
299 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
304 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x03,
305 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x53,
307 0x54, 0x41, 0x54, 0xa8, 0x06, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0xaa,
308 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10,
309 0x00, 0x00, 0x00, 0x90, 0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21,
310 0x0c, 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02,
311 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41,
312 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25,
313 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42,
314 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a,
315 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00,
316 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41,
317 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51,
318 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff,
319 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff,
320 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00,
321 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13,
322 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89,
323 0x20, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20,
324 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84,
325 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10,
326 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60,
327 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10,
328 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e,
329 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54,
330 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16,
331 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c, 0x31,
332 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e, 0x04,
333 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x03, 0x83, 0xc3, 0x91, 0xa6, 0x05,
334 0xc0, 0x1c, 0x6a, 0xf2, 0x5f, 0x22, 0x9a, 0x88, 0x8b, 0x3d, 0x80, 0x81,
335 0x88, 0x38, 0xa7, 0x91, 0x26, 0xa0, 0x99, 0x24, 0x24, 0x58, 0x4b, 0x37,
336 0x1d, 0x08, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36,
337 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e,
338 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07,
339 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07,
340 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07,
341 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
342 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
343 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07,
344 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07,
345 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07,
346 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07,
347 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00,
348 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c,
349 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
350 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x32,
355 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6,
356 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x28, 0x50, 0x04,
357 0x85, 0x50, 0x06, 0xe5, 0x50, 0x12, 0x05, 0x18, 0x50, 0x1e, 0x85, 0x51,
358 0xba, 0x01, 0x45, 0x41, 0xa5, 0x24, 0x46, 0x00, 0xca, 0xa0, 0x08, 0x0a,
359 0x81, 0x62, 0x0d, 0xd0, 0x9d, 0x01, 0x20, 0x3c, 0x03, 0x40, 0x79, 0x2c,
360 0x87, 0x61, 0x9e, 0xe7, 0x01, 0x20, 0x30, 0x00, 0x00, 0x10, 0x01, 0x21,
361 0x10, 0x0c, 0x40, 0x50, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x9f,
362 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x35,
363 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b,
364 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b, 0x9b, 0x7b,
365 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9, 0x81, 0x79,
366 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xc2,
367 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x20, 0x36, 0x08, 0x04, 0x41, 0xc1,
368 0x6e, 0x6e, 0x82, 0x40, 0x20, 0x1b, 0x86, 0x03, 0x21, 0x26, 0x08, 0xd8,
369 0xc6, 0xca, 0xaa, 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x0a, 0x2d, 0x8c, 0xac,
370 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x6e, 0x82,
371 0x40, 0x24, 0x1b, 0x10, 0x42, 0x59, 0x08, 0x62, 0x60, 0x80, 0x0d, 0x41,
372 0xb3, 0x81, 0x00, 0x00, 0x07, 0x98, 0x20, 0x5c, 0x1a, 0x8b, 0xb6, 0x37,
373 0xb2, 0x32, 0xb6, 0x09, 0x02, 0xa1, 0x4c, 0x10, 0x88, 0x65, 0xc3, 0x30,
374 0x4d, 0xc3, 0x04, 0x81, 0x60, 0x26, 0x08, 0x44, 0x33, 0x41, 0x20, 0x9c,
375 0x09, 0x42, 0x94, 0x6d, 0x50, 0x90, 0x48, 0xa2, 0x2a, 0xc2, 0xba, 0x2e,
376 0x8c, 0x11, 0x9c, 0xdc, 0x9b, 0x5a, 0xd9, 0x18, 0x5d, 0xda, 0x9b, 0x5b,
377 0x90, 0x1b, 0x99, 0x55, 0x5a, 0xd9, 0xdd, 0x04, 0x81, 0x78, 0x36, 0x28,
378 0x88, 0x26, 0x51, 0xd5, 0x66, 0x5d, 0x17, 0xb6, 0x61, 0x60, 0x32, 0x6e,
379 0xc3, 0x40, 0x40, 0xdd, 0x04, 0x41, 0x00, 0x36, 0x00, 0x1b, 0x06, 0x02,
380 0x0c, 0xc0, 0x60, 0x43, 0x10, 0x06, 0x1b, 0x86, 0xe1, 0x13, 0x83, 0x09,
381 0x42, 0xc6, 0x6d, 0x08, 0xc8, 0x80, 0x4b, 0x5b, 0x58, 0x9a, 0x1b, 0x55,
382 0x19, 0x1e, 0x5d, 0x9d, 0x5c, 0x19, 0x11, 0xa8, 0xa7, 0xa9, 0x24, 0xaa,
383 0xa4, 0x27, 0xa7, 0x09, 0x42, 0x41, 0x4d, 0x10, 0x8a, 0x6a, 0x43, 0x40,
384 0x4c, 0x10, 0x0a, 0x6b, 0x83, 0x50, 0x59, 0x1b, 0x16, 0xe2, 0x0c, 0xd0,
385 0x20, 0x0d, 0xd4, 0x20, 0x0d, 0x86, 0x35, 0x20, 0xd2, 0x80, 0x0d, 0x88,
386 0x50, 0x15, 0x61, 0x0d, 0x3d, 0x3d, 0x49, 0x11, 0x4d, 0x10, 0x8a, 0x6b,
387 0x83, 0x50, 0x55, 0x1b, 0x96, 0xc1, 0x0d, 0xd0, 0x20, 0x0d, 0xd4, 0x20,
388 0x0d, 0x86, 0x37, 0x18, 0xd2, 0x00, 0x0e, 0x58, 0x0c, 0x3d, 0x31, 0x3d,
389 0x49, 0x4d, 0x10, 0x0a, 0x6c, 0x82, 0x40, 0x40, 0x1b, 0x84, 0x8a, 0x0e,
390 0x36, 0x2c, 0x92, 0x1c, 0xa0, 0x41, 0x1a, 0xa8, 0x41, 0x1a, 0x0c, 0x73,
391 0x20, 0xa5, 0x41, 0x1d, 0x6c, 0x18, 0xda, 0x20, 0x0e, 0xec, 0x80, 0xcb,
392 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x86,
393 0x85, 0xc0, 0x03, 0x34, 0x58, 0x03, 0x35, 0x98, 0x83, 0x61, 0x0e, 0x88,
394 0x34, 0xa8, 0x83, 0x0d, 0xcb, 0xe0, 0x06, 0x68, 0x90, 0x06, 0x6a, 0xf0,
395 0x06, 0xc3, 0x1b, 0x0c, 0x69, 0x00, 0x07, 0x1b, 0x16, 0x49, 0x0e, 0xd0,
396 0x20, 0x0d, 0xd4, 0xe0, 0x0d, 0x86, 0x39, 0x90, 0xd2, 0xa0, 0x0e, 0x36,
397 0x0c, 0x79, 0xa0, 0x07, 0x7b, 0xb0, 0x61, 0xb8, 0x03, 0x3e, 0x00, 0x36,
398 0x14, 0x9f, 0x19, 0xf4, 0xc1, 0x03, 0xd0, 0x30, 0x63, 0x7b, 0x0b, 0xa3,
399 0x9b, 0x9b, 0x20, 0x10, 0x11, 0x8b, 0x34, 0xb7, 0x39, 0xba, 0xb9, 0x09,
400 0x02, 0x21, 0xd1, 0x98, 0x4b, 0x3b, 0xfb, 0x62, 0x23, 0xa3, 0x31, 0x97,
401 0x76, 0xf6, 0x35, 0x47, 0x37, 0x41, 0x20, 0xa6, 0x0d, 0xc8, 0x1f, 0x80,
402 0x42, 0x28, 0x88, 0xc2, 0x28, 0x5c, 0xa4, 0x50, 0x0a, 0x55, 0xd8, 0xd8,
403 0xec, 0xda, 0x5c, 0xd2, 0xc8, 0xca, 0xdc, 0xe8, 0xa6, 0x04, 0x41, 0x15,
404 0x32, 0x3c, 0x17, 0xbb, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x29, 0x01,
405 0xd1, 0x84, 0x0c, 0xcf, 0xc5, 0x2e, 0x8c, 0xcd, 0xae, 0x4c, 0x6e, 0x4a,
406 0x50, 0xd4, 0x21, 0xc3, 0x73, 0x99, 0x43, 0x0b, 0x23, 0x2b, 0x93, 0x6b,
407 0x7a, 0x23, 0x2b, 0x63, 0x9b, 0x12, 0x20, 0x65, 0xc8, 0xf0, 0x5c, 0xe4,
408 0xca, 0xe6, 0xde, 0xea, 0xe4, 0xc6, 0xca, 0xe6, 0xa6, 0x04, 0x4e, 0x25,
409 0x32, 0x3c, 0x17, 0xba, 0x3c, 0xb8, 0xb2, 0x20, 0x37, 0xb7, 0x37, 0xba,
410 0x30, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x29, 0x42, 0x27, 0x06, 0x75, 0xc8,
411 0xf0, 0x5c, 0xec, 0xd2, 0xca, 0xee, 0x92, 0xc8, 0xa6, 0xe8, 0xc2, 0xe8,
412 0xca, 0xa6, 0x04, 0x64, 0x50, 0x87, 0x0c, 0xcf, 0xa5, 0xcc, 0x8d, 0x4e,
413 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e, 0x6e, 0x4a, 0xd0, 0x07, 0x5d,
414 0xc8, 0xf0, 0x5c, 0xc6, 0xde, 0xea, 0xdc, 0xe8, 0xca, 0xe4, 0xe6, 0xa6,
415 0x04, 0xa5, 0x00, 0x79, 0x18, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x33,
416 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43,
417 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98,
418 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33,
419 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05,
420 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43,
421 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08,
422 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78,
423 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1,
424 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33,
425 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e,
426 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03,
427 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60,
428 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80,
429 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8,
430 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18,
431 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee,
432 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c,
433 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c,
434 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43,
435 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3,
436 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83,
437 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21,
438 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08,
439 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x00,
440 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x36,
441 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5,
442 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2,
443 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3,
444 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62,
445 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f,
446 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6,
447 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11,
448 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x0b, 0x03, 0x20, 0x4d, 0x4b, 0x5c, 0x13,
449 0x15, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14,
450 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x5d, 0xaf, 0x18, 0x92,
451 0x26, 0x75, 0x50, 0xd4, 0x82, 0xef, 0x06, 0xf6, 0x87, 0xd6, 0x14, 0x44,
452 0x58, 0x49, 0x4c, 0xfc, 0x08, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0x3f,
453 0x02, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10,
454 0x00, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21,
455 0x0c, 0x00, 0x00, 0x36, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02,
456 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41,
457 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25,
458 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42,
459 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a,
460 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00,
461 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41,
462 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51,
463 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff,
464 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff,
465 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00,
466 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13,
467 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89,
468 0x20, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20,
469 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84,
470 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10,
471 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60,
472 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10,
473 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e,
474 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54,
475 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16,
476 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c, 0x31,
477 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e, 0x04,
478 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x03, 0x83, 0xc3, 0x91, 0xa6, 0x05,
479 0xc0, 0x1c, 0x6a, 0xf2, 0x5f, 0x22, 0x9a, 0x88, 0x8b, 0x3d, 0x80, 0x81,
480 0x88, 0x38, 0xa7, 0x91, 0x26, 0xa0, 0x99, 0x24, 0x24, 0x58, 0x4b, 0x37,
481 0x1d, 0x08, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36,
482 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e,
483 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07,
484 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07,
485 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07,
486 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
487 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
488 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07,
489 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07,
490 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07,
491 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07,
492 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00,
493 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c,
494 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
495 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
497 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
498 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00,
499 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32,
500 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6,
501 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x28, 0x50, 0x06,
502 0xe5, 0x50, 0x04, 0xe5, 0x41, 0xa5, 0x24, 0x46, 0x00, 0xca, 0xa0, 0x08,
503 0x0a, 0x81, 0xf0, 0x0c, 0x00, 0xe5, 0xb1, 0x1c, 0x86, 0x79, 0x9e, 0x07,
504 0x80, 0xc0, 0x00, 0x00, 0x40, 0x04, 0x84, 0x40, 0x30, 0x00, 0x41, 0x01,
505 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x1a,
506 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73,
507 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71,
508 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b, 0x9b, 0x7b, 0x91, 0x2a, 0x62, 0x2a,
509 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9, 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b,
510 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7,
511 0x06, 0x61, 0x20, 0x26, 0x08, 0x04, 0xb2, 0x41, 0x18, 0x0c, 0x0a, 0x76,
512 0x73, 0x1b, 0x06, 0xc4, 0x20, 0x26, 0x08, 0xd8, 0x44, 0x60, 0x82, 0x40,
513 0x24, 0x1b, 0x10, 0x42, 0x59, 0x08, 0x62, 0x60, 0x80, 0x0d, 0x41, 0xb3,
514 0x81, 0x00, 0x00, 0x07, 0x98, 0x20, 0x64, 0xd4, 0x86, 0x00, 0x9a, 0x20,
515 0x08, 0x00, 0x97, 0xb6, 0xb0, 0x34, 0x37, 0xaa, 0x32, 0x3c, 0xba, 0x3a,
516 0xb9, 0x32, 0x22, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x13,
517 0x84, 0xc2, 0x99, 0x20, 0x14, 0xcf, 0x86, 0x80, 0x98, 0x20, 0x14, 0xd0,
518 0x04, 0x81, 0x50, 0x26, 0x08, 0xc4, 0xb2, 0x41, 0xc8, 0xb4, 0x0d, 0x0b,
519 0x41, 0x55, 0xd6, 0x65, 0x0d, 0x18, 0x61, 0x6d, 0x44, 0xa8, 0x8a, 0xb0,
520 0x86, 0x9e, 0x9e, 0xa4, 0x88, 0x26, 0x08, 0x45, 0xb4, 0x41, 0xc8, 0xb2,
521 0x0d, 0xcb, 0xd0, 0x55, 0xd6, 0x65, 0x0d, 0xde, 0x60, 0x7d, 0x13, 0x04,
522 0x82, 0x61, 0x31, 0xf4, 0xc4, 0xf4, 0x24, 0x35, 0x41, 0x28, 0xa4, 0x09,
523 0x02, 0xd1, 0x6c, 0x10, 0x32, 0x32, 0xd8, 0xb0, 0x84, 0x81, 0x18, 0x54,
524 0xd6, 0x65, 0x0d, 0x63, 0x10, 0x06, 0x56, 0x19, 0x6c, 0x18, 0x38, 0x30,
525 0x30, 0x03, 0x2e, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69,
526 0x6f, 0x6e, 0x1b, 0x16, 0x02, 0x0d, 0x2a, 0xec, 0x1a, 0x83, 0x61, 0x0c,
527 0x08, 0xab, 0x0c, 0x36, 0x2c, 0x43, 0x57, 0x59, 0x97, 0x37, 0x78, 0x83,
528 0xf5, 0x6d, 0x58, 0xc2, 0x40, 0x0c, 0x2a, 0xeb, 0xf2, 0x86, 0x31, 0x08,
529 0x03, 0xab, 0x0c, 0x36, 0x0c, 0x69, 0xa0, 0x06, 0x6b, 0xb0, 0x61, 0x38,
530 0x03, 0x36, 0x00, 0x36, 0x14, 0xd2, 0xd4, 0x06, 0x0f, 0x50, 0x85, 0x8d,
531 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10, 0x54,
532 0x21, 0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b, 0x12,
533 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, 0xd8, 0xec, 0xca, 0xe4, 0xa6,
534 0x04, 0x46, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2, 0x32, 0xb9,
535 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c, 0xcf, 0x45,
536 0xae, 0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0xe0, 0xd4,
537 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2, 0x0b,
538 0xa3, 0x2b, 0x9b, 0x12, 0x40, 0x75, 0xc8, 0xf0, 0x5c, 0xca, 0xdc, 0xe8,
539 0xe4, 0xf2, 0xa0, 0xde, 0xd2, 0xdc, 0xe8, 0xe6, 0xa6, 0x04, 0x6d, 0x00,
540 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x33,
541 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43,
542 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98,
543 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33,
544 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05,
545 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43,
546 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08,
547 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78,
548 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1,
549 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33,
550 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e,
551 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03,
552 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60,
553 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80,
554 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8,
555 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18,
556 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee,
557 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c,
558 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c,
559 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43,
560 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3,
561 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83,
562 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21,
563 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08,
564 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x00,
565 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x36,
566 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5,
567 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2,
568 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3,
569 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62,
570 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f,
571 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6,
572 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11,
573 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x0b, 0x03, 0x20, 0x4d, 0x4b, 0x5c, 0x13,
574 0x15, 0x11, 0x00, 0x61, 0x20, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x13,
575 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x44,
576 0x8a, 0xab, 0x14, 0x0a, 0x61, 0x06, 0xa0, 0xec, 0x4a, 0x8e, 0x4a, 0x09,
577 0x50, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, 0x82,
578 0x60, 0x20, 0x61, 0x03, 0x63, 0x59, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20,
579 0x18, 0x18, 0xdd, 0x21, 0x5d, 0x8f, 0x31, 0x62, 0x90, 0x00, 0x20, 0x08,
580 0x06, 0x86, 0x87, 0x4c, 0x18, 0x71, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82,
581 0x81, 0xf1, 0x25, 0x54, 0xf6, 0x20, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60,
582 0x60, 0x80, 0x81, 0x52, 0x69, 0x51, 0x32, 0x62, 0x90, 0x00, 0x20, 0x08,
583 0x06, 0x46, 0x18, 0x2c, 0xdc, 0x36, 0x29, 0x23, 0x06, 0x09, 0x00, 0x82,
584 0x60, 0x60, 0x88, 0x01, 0xd3, 0x71, 0xc8, 0x32, 0x62, 0x90, 0x00, 0x20,
585 0x08, 0x06, 0xc6, 0x18, 0x34, 0x5d, 0x57, 0x31, 0x23, 0x06, 0x09, 0x00,
586 0x82, 0x60, 0x60, 0x90, 0x81, 0xe3, 0x79, 0x4a, 0x33, 0x62, 0x90, 0x00,
587 0x20, 0x08, 0x06, 0x46, 0x19, 0x3c, 0xdf, 0x57, 0x39, 0x23, 0x06, 0x07,
588 0x00, 0x82, 0x60, 0xd0, 0x90, 0x81, 0xa3, 0x80, 0xc1, 0x68, 0x42, 0x00,
589 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x26, 0x10, 0xc3, 0x88,
590 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0x69, 0x30, 0x3d, 0x66, 0x30, 0x9a,
591 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4,
592 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x8d, 0x1b, 0x60, 0x54, 0x19,
593 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x68,
594 0x02, 0x31, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x33, 0x07, 0x5d,
595 0xc6, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83,
596 0x30, 0x9a, 0x40, 0x0c, 0x36, 0x5d, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10,
597 0x04, 0x83, 0x07, 0x0f, 0xce, 0xe0, 0x7a, 0x82, 0x11, 0x03, 0x04, 0x00,
598 0x41, 0x30, 0x78, 0xf2, 0x00, 0x0d, 0xae, 0x25, 0xb0, 0xe0, 0x80, 0x8e,
599 0x59, 0x9b, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1, 0xe0, 0xe1, 0x83,
600 0x35, 0xd8, 0xa4, 0x60, 0xc4, 0x00, 0x01, 0x40, 0x10, 0x0c, 0x9e, 0x3e,
601 0x60, 0x83, 0xcd, 0x09, 0x2c, 0x50, 0xa0, 0x63, 0xd9, 0x27, 0x9f, 0x11,
602 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0x40, 0xe1, 0x0d, 0xbe, 0x2a, 0x18,
603 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x27, 0x14, 0xe0, 0xe0, 0x8b, 0x02,
604 0x0b, 0x1a, 0xe8, 0x18, 0x37, 0x06, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10,
605 0x04, 0x83, 0x87, 0x14, 0xe6, 0x60, 0x0c, 0xb0, 0x60, 0xc4, 0x00, 0x01,
606 0x40, 0x10, 0x0c, 0x9e, 0x52, 0xa0, 0x83, 0x31, 0xa0, 0x02, 0x0b, 0x20,
607 0xe8, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x83, 0x0a, 0x72, 0xe0,
608 0x06, 0x74, 0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30,
609 0x08, 0xa3, 0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x4d,
610 0x2b, 0xdc, 0xc1, 0x1c, 0xe8, 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08,
611 0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x26, 0x10, 0xc3, 0x88, 0xc1, 0x01, 0x80,
612 0x20, 0x18, 0x34, 0xb2, 0xc0, 0x07, 0x78, 0xd0, 0x0a, 0xa3, 0x09, 0x01,
613 0x30, 0x9a, 0x20, 0x04, 0xa3, 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0x23,
614 0x06, 0x07, 0x00, 0x82, 0x60, 0xd0, 0xdc, 0x42, 0x28, 0xf4, 0xc1, 0x2b,
615 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c, 0xc2, 0x68,
616 0x02, 0x31, 0xd8, 0x14, 0x06, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04,
617 0x83, 0x87, 0x17, 0x56, 0xc1, 0x7b, 0x82, 0x11, 0x03, 0x04, 0x00, 0x41,
618 0x30, 0x78, 0x7a, 0x81, 0x15, 0xb6, 0x25, 0x18, 0x31, 0x40, 0x00, 0x10,
619 0x04, 0x83, 0xc7, 0x17, 0x5a, 0x01, 0x3b, 0x02, 0xb3, 0xca, 0x40, 0x3e,
620 0x23, 0x06, 0x08, 0x00, 0x82, 0x60, 0xf0, 0x80, 0xc3, 0x2b, 0x88, 0x81,
621 0x14, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82, 0xc1, 0x13, 0x0e, 0xb0, 0xf0,
622 0x39, 0xc1, 0x88, 0x01, 0x02, 0x80, 0x20, 0x18, 0x3c, 0xe2, 0x10, 0x0b,
623 0x9c, 0x12, 0x58, 0x96, 0x06, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04,
624 0x83, 0x87, 0x1c, 0x66, 0xc1, 0x0c, 0xaa, 0x60, 0xc4, 0x00, 0x01, 0x40,
625 0x10, 0x0c, 0x9e, 0x72, 0xa0, 0x85, 0x31, 0x88, 0x82, 0x11, 0x03, 0x04,
626 0x00, 0x41, 0x30, 0x78, 0xcc, 0xa1, 0x16, 0xc0, 0xa0, 0x09, 0x8c, 0x6b,
627 0x03, 0xf9, 0x8c, 0x18, 0x20, 0x00, 0x08, 0x82, 0xc1, 0x83, 0x0e, 0xb7,
628 0xa0, 0x06, 0x58, 0x30, 0x62, 0x80, 0x00, 0x20, 0x08, 0x06, 0x4f, 0x3a,
629 0xe0, 0xc2, 0x19, 0x50, 0xc1, 0x88, 0x01, 0x02, 0x80, 0x20, 0x18, 0x3c,
630 0xea, 0x90, 0x0b, 0x64, 0x00, 0x05, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60,
631 0x80, 0xb4, 0x43, 0x2e, 0xa0, 0x03, 0x3a, 0x80, 0x43, 0x33, 0x62, 0x90,
632 0x00, 0x20, 0x08, 0x06, 0x48, 0x3b, 0xe4, 0x02, 0x3a, 0xa0, 0x03, 0x2d,
633 0x24, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0xb4, 0x43, 0x2e, 0xa0,
634 0x03, 0x3a, 0xf8, 0x42, 0x31, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48,
635 0x3b, 0xe4, 0x02, 0x3a, 0xa0, 0xc3, 0x2f, 0x04, 0x23, 0x06, 0x09, 0x00,
636 0x82, 0x60, 0x80, 0xb4, 0x43, 0x2e, 0xa4, 0x03, 0x3a, 0x80, 0x43, 0x2b,
637 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xd2, 0x0e, 0xb9, 0x90, 0x0e,
638 0xe8, 0x40, 0x0b, 0xac, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48,
639 0x3b, 0xe4, 0xc2, 0x38, 0xa0, 0x03, 0x38, 0xc4, 0xc2, 0x88, 0x41, 0x02,
640 0x80, 0x20, 0x18, 0x20, 0xed, 0x90, 0x0b, 0xe3, 0x80, 0x0e, 0xb4, 0x00,
641 0x0b, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0xb4, 0x43, 0x2e, 0x8c,
642 0x03, 0x3a, 0xf8, 0xc2, 0x2b, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01,
643 0xd2, 0x0e, 0xb9, 0x30, 0x0e, 0xe8, 0xf0, 0x0b, 0xae, 0x80, 0x00, 0x00,
644 0x00, 0x00, 0x00
645};
diff --git a/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12.c b/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12.c
new file mode 100644
index 0000000..06535f0
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12.c
@@ -0,0 +1,3309 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_D3D12
24
25#define SDL_D3D12_NUM_BUFFERS 2
26#define SDL_D3D12_NUM_VERTEX_BUFFERS 256
27#define SDL_D3D12_MAX_NUM_TEXTURES 16384
28#define SDL_D3D12_NUM_UPLOAD_BUFFERS 32
29
30#include "../../core/windows/SDL_windows.h"
31#include "../../video/windows/SDL_windowswindow.h"
32#include "../SDL_sysrender.h"
33#include "../SDL_d3dmath.h"
34#include "../../video/directx/SDL_d3d12.h"
35
36#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
37#include "SDL_render_d3d12_xbox.h"
38#endif
39
40#include "SDL_shaders_d3d12.h"
41
42#if defined(_MSC_VER) && !defined(__clang__)
43#define SDL_COMPOSE_ERROR(str) __FUNCTION__ ", " str
44#else
45#define SDL_COMPOSE_ERROR(str) SDL_STRINGIFY_ARG(__FUNCTION__) ", " str
46#endif
47
48// Set up for C function definitions, even when using C++
49#ifdef __cplusplus
50extern "C" {
51#endif
52
53// This must be included here as the function definitions in SDL_pixels.c/_c.h are C, not C++
54#include "../../video/SDL_pixels_c.h"
55
56/* !!! FIXME: vertex buffer bandwidth could be lower; only use UV coords when
57 !!! FIXME: textures are needed. */
58
59// Sampler types
60typedef enum
61{
62 D3D12_SAMPLER_NEAREST_CLAMP,
63 D3D12_SAMPLER_NEAREST_WRAP,
64 D3D12_SAMPLER_LINEAR_CLAMP,
65 D3D12_SAMPLER_LINEAR_WRAP,
66 D3D12_SAMPLER_COUNT
67} D3D12_Sampler;
68
69// Vertex shader, common values
70typedef struct
71{
72 Float4X4 model;
73 Float4X4 projectionAndView;
74} D3D12_VertexShaderConstants;
75
76// These should mirror the definitions in D3D12_PixelShader_Common.hlsli
77//static const float TONEMAP_NONE = 0;
78//static const float TONEMAP_LINEAR = 1;
79static const float TONEMAP_CHROME = 2;
80
81//static const float TEXTURETYPE_NONE = 0;
82static const float TEXTURETYPE_RGB = 1;
83static const float TEXTURETYPE_NV12 = 2;
84static const float TEXTURETYPE_NV21 = 3;
85static const float TEXTURETYPE_YUV = 4;
86
87static const float INPUTTYPE_UNSPECIFIED = 0;
88static const float INPUTTYPE_SRGB = 1;
89static const float INPUTTYPE_SCRGB = 2;
90static const float INPUTTYPE_HDR10 = 3;
91
92typedef struct
93{
94 float scRGB_output;
95 float texture_type;
96 float input_type;
97 float color_scale;
98
99 float tonemap_method;
100 float tonemap_factor1;
101 float tonemap_factor2;
102 float sdr_white_point;
103
104 float YCbCr_matrix[16];
105} D3D12_PixelShaderConstants;
106
107// Per-vertex data
108typedef struct
109{
110 Float2 pos;
111 Float2 tex;
112 SDL_FColor color;
113} D3D12_VertexPositionColor;
114
115// Per-texture data
116typedef struct
117{
118 int w, h;
119 ID3D12Resource *mainTexture;
120 D3D12_CPU_DESCRIPTOR_HANDLE mainTextureResourceView;
121 D3D12_RESOURCE_STATES mainResourceState;
122 SIZE_T mainSRVIndex;
123 D3D12_CPU_DESCRIPTOR_HANDLE mainTextureRenderTargetView;
124 DXGI_FORMAT mainTextureFormat;
125 ID3D12Resource *stagingBuffer;
126 D3D12_RESOURCE_STATES stagingResourceState;
127 D3D12_FILTER scaleMode;
128 D3D12_Shader shader;
129 const float *YCbCr_matrix;
130#ifdef SDL_HAVE_YUV
131 // YV12 texture support
132 bool yuv;
133 ID3D12Resource *mainTextureU;
134 D3D12_CPU_DESCRIPTOR_HANDLE mainTextureResourceViewU;
135 D3D12_RESOURCE_STATES mainResourceStateU;
136 SIZE_T mainSRVIndexU;
137 ID3D12Resource *mainTextureV;
138 D3D12_CPU_DESCRIPTOR_HANDLE mainTextureResourceViewV;
139 D3D12_RESOURCE_STATES mainResourceStateV;
140 SIZE_T mainSRVIndexV;
141
142 // NV12 texture support
143 bool nv12;
144 D3D12_CPU_DESCRIPTOR_HANDLE mainTextureResourceViewNV;
145 SIZE_T mainSRVIndexNV;
146
147 Uint8 *pixels;
148 int pitch;
149#endif
150 SDL_Rect lockedRect;
151} D3D12_TextureData;
152
153// Pipeline State Object data
154typedef struct
155{
156 D3D12_Shader shader;
157 D3D12_PixelShaderConstants shader_constants;
158 SDL_BlendMode blendMode;
159 D3D12_PRIMITIVE_TOPOLOGY_TYPE topology;
160 DXGI_FORMAT rtvFormat;
161 ID3D12PipelineState *pipelineState;
162} D3D12_PipelineState;
163
164// Vertex Buffer
165typedef struct
166{
167 ID3D12Resource *resource;
168 D3D12_VERTEX_BUFFER_VIEW view;
169 size_t size;
170} D3D12_VertexBuffer;
171
172// For SRV pool allocator
173typedef struct
174{
175 SIZE_T index;
176 void *next;
177} D3D12_SRVPoolNode;
178
179// Private renderer data
180typedef struct
181{
182 SDL_SharedObject *hDXGIMod;
183 SDL_SharedObject *hD3D12Mod;
184#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
185 UINT64 frameToken;
186#else
187 IDXGIFactory6 *dxgiFactory;
188 IDXGIAdapter4 *dxgiAdapter;
189 IDXGIDebug *dxgiDebug;
190 IDXGISwapChain4 *swapChain;
191#endif
192 ID3D12Device1 *d3dDevice;
193 ID3D12Debug *debugInterface;
194 ID3D12CommandQueue *commandQueue;
195 ID3D12GraphicsCommandList2 *commandList;
196 DXGI_SWAP_EFFECT swapEffect;
197 UINT swapFlags;
198 UINT syncInterval;
199 UINT presentFlags;
200 DXGI_FORMAT renderTargetFormat;
201 bool pixelSizeChanged;
202
203 // Descriptor heaps
204 ID3D12DescriptorHeap *rtvDescriptorHeap;
205 UINT rtvDescriptorSize;
206 ID3D12DescriptorHeap *textureRTVDescriptorHeap;
207 ID3D12DescriptorHeap *srvDescriptorHeap;
208 UINT srvDescriptorSize;
209 ID3D12DescriptorHeap *samplerDescriptorHeap;
210 UINT samplerDescriptorSize;
211
212 // Data needed per backbuffer
213 ID3D12CommandAllocator *commandAllocators[SDL_D3D12_NUM_BUFFERS];
214 ID3D12Resource *renderTargets[SDL_D3D12_NUM_BUFFERS];
215 UINT64 fenceValue;
216 int currentBackBufferIndex;
217
218 // Fences
219 ID3D12Fence *fence;
220 HANDLE fenceEvent;
221
222 // Root signature and pipeline state data
223 ID3D12RootSignature *rootSignatures[NUM_ROOTSIGS];
224 int pipelineStateCount;
225 D3D12_PipelineState *pipelineStates;
226 D3D12_PipelineState *currentPipelineState;
227
228 D3D12_VertexBuffer vertexBuffers[SDL_D3D12_NUM_VERTEX_BUFFERS];
229 D3D12_CPU_DESCRIPTOR_HANDLE samplers[D3D12_SAMPLER_COUNT];
230
231 // Data for staging/allocating textures
232 ID3D12Resource *uploadBuffers[SDL_D3D12_NUM_UPLOAD_BUFFERS];
233 int currentUploadBuffer;
234
235 // Pool allocator to handle reusing SRV heap indices
236 D3D12_SRVPoolNode *srvPoolHead;
237 D3D12_SRVPoolNode srvPoolNodes[SDL_D3D12_MAX_NUM_TEXTURES];
238
239 // Vertex buffer constants
240 D3D12_VertexShaderConstants vertexShaderConstantsData;
241
242 // Cached renderer properties
243 DXGI_MODE_ROTATION rotation;
244 D3D12_TextureData *textureRenderTarget;
245 D3D12_CPU_DESCRIPTOR_HANDLE currentRenderTargetView;
246 D3D12_CPU_DESCRIPTOR_HANDLE currentShaderResource;
247 D3D12_CPU_DESCRIPTOR_HANDLE currentSampler;
248 bool cliprectDirty;
249 bool currentCliprectEnabled;
250 SDL_Rect currentCliprect;
251 SDL_Rect currentViewport;
252 int currentViewportRotation;
253 bool viewportDirty;
254 Float4X4 identity;
255 int currentVertexBuffer;
256 bool issueBatch;
257} D3D12_RenderData;
258
259// Define D3D GUIDs here so we don't have to include uuid.lib.
260
261#ifdef HAVE_GCC_DIAGNOSTIC_PRAGMA
262#pragma GCC diagnostic push
263#pragma GCC diagnostic ignored "-Wunused-const-variable"
264#endif
265
266static const GUID SDL_IID_IDXGIFactory6 = { 0xc1b6694f, 0xff09, 0x44a9, { 0xb0, 0x3c, 0x77, 0x90, 0x0a, 0x0a, 0x1d, 0x17 } };
267static const GUID SDL_IID_IDXGIAdapter4 = { 0x3c8d99d1, 0x4fbf, 0x4181, { 0xa8, 0x2c, 0xaf, 0x66, 0xbf, 0x7b, 0xd2, 0x4e } };
268static const GUID SDL_IID_IDXGIDevice1 = { 0x77db970f, 0x6276, 0x48ba, { 0xba, 0x28, 0x07, 0x01, 0x43, 0xb4, 0x39, 0x2c } };
269static const GUID SDL_IID_ID3D12Device1 = { 0x77acce80, 0x638e, 0x4e65, { 0x88, 0x95, 0xc1, 0xf2, 0x33, 0x86, 0x86, 0x3e } };
270static const GUID SDL_IID_IDXGISwapChain4 = { 0x3D585D5A, 0xBD4A, 0x489E, { 0xB1, 0xF4, 0x3D, 0xBC, 0xB6, 0x45, 0x2F, 0xFB } };
271static const GUID SDL_IID_IDXGIDebug1 = { 0xc5a05f0c, 0x16f2, 0x4adf, { 0x9f, 0x4d, 0xa8, 0xc4, 0xd5, 0x8a, 0xc5, 0x50 } };
272static const GUID SDL_IID_IDXGIInfoQueue = { 0xD67441C7, 0x672A, 0x476f, { 0x9E, 0x82, 0xCD, 0x55, 0xB4, 0x49, 0x49, 0xCE } };
273static const GUID SDL_IID_ID3D12Debug = { 0x344488b7, 0x6846, 0x474b, { 0xb9, 0x89, 0xf0, 0x27, 0x44, 0x82, 0x45, 0xe0 } };
274static const GUID SDL_DXGI_DEBUG_ALL = { 0xe48ae283, 0xda80, 0x490b, { 0x87, 0xe6, 0x43, 0xe9, 0xa9, 0xcf, 0xda, 0x8 } };
275static const GUID SDL_IID_ID3D12CommandQueue = { 0x0ec870a6, 0x5d7e, 0x4c22, { 0x8c, 0xfc, 0x5b, 0xaa, 0xe0, 0x76, 0x16, 0xed } };
276static const GUID SDL_IID_ID3D12DescriptorHeap = { 0x8efb471d, 0x616c, 0x4f49, { 0x90, 0xf7, 0x12, 0x7b, 0xb7, 0x63, 0xfa, 0x51 } };
277static const GUID SDL_IID_ID3D12CommandAllocator = { 0x6102dee4, 0xaf59, 0x4b09, { 0xb9, 0x99, 0xb4, 0x4d, 0x73, 0xf0, 0x9b, 0x24 } };
278static const GUID SDL_IID_ID3D12GraphicsCommandList2 = { 0x38C3E585, 0xFF17, 0x412C, { 0x91, 0x50, 0x4F, 0xC6, 0xF9, 0xD7, 0x2A, 0x28 } };
279static const GUID SDL_IID_ID3D12Fence = { 0x0a753dcf, 0xc4d8, 0x4b91, { 0xad, 0xf6, 0xbe, 0x5a, 0x60, 0xd9, 0x5a, 0x76 } };
280static const GUID SDL_IID_ID3D12Resource = { 0x696442be, 0xa72e, 0x4059, { 0xbc, 0x79, 0x5b, 0x5c, 0x98, 0x04, 0x0f, 0xad } };
281static const GUID SDL_IID_ID3D12RootSignature = { 0xc54a6b66, 0x72df, 0x4ee8, { 0x8b, 0xe5, 0xa9, 0x46, 0xa1, 0x42, 0x92, 0x14 } };
282static const GUID SDL_IID_ID3D12PipelineState = { 0x765a30f3, 0xf624, 0x4c6f, { 0xa8, 0x28, 0xac, 0xe9, 0x48, 0x62, 0x24, 0x45 } };
283static const GUID SDL_IID_ID3D12Heap = { 0x6b3b2502, 0x6e51, 0x45b3, { 0x90, 0xee, 0x98, 0x84, 0x26, 0x5e, 0x8d, 0xf3 } };
284static const GUID SDL_IID_ID3D12InfoQueue = { 0x0742a90b, 0xc387, 0x483f, { 0xb9, 0x46, 0x30, 0xa7, 0xe4, 0xe6, 0x14, 0x58 } };
285
286#ifdef HAVE_GCC_DIAGNOSTIC_PRAGMA
287#pragma GCC diagnostic pop
288#endif
289
290static UINT D3D12_Align(UINT location, UINT alignment)
291{
292 return (location + (alignment - 1)) & ~(alignment - 1);
293}
294
295static SDL_PixelFormat D3D12_DXGIFormatToSDLPixelFormat(DXGI_FORMAT dxgiFormat)
296{
297 switch (dxgiFormat) {
298 case DXGI_FORMAT_B8G8R8A8_UNORM:
299 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
300 return SDL_PIXELFORMAT_ARGB8888;
301 case DXGI_FORMAT_R8G8B8A8_UNORM:
302 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
303 return SDL_PIXELFORMAT_ABGR8888;
304 case DXGI_FORMAT_B8G8R8X8_UNORM:
305 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
306 return SDL_PIXELFORMAT_XRGB8888;
307 case DXGI_FORMAT_R10G10B10A2_UNORM:
308 return SDL_PIXELFORMAT_ABGR2101010;
309 case DXGI_FORMAT_R16G16B16A16_FLOAT:
310 return SDL_PIXELFORMAT_RGBA64_FLOAT;
311 default:
312 return SDL_PIXELFORMAT_UNKNOWN;
313 }
314}
315
316static DXGI_FORMAT SDLPixelFormatToDXGITextureFormat(Uint32 format, Uint32 output_colorspace)
317{
318 switch (format) {
319 case SDL_PIXELFORMAT_RGBA64_FLOAT:
320 return DXGI_FORMAT_R16G16B16A16_FLOAT;
321 case SDL_PIXELFORMAT_ABGR2101010:
322 return DXGI_FORMAT_R10G10B10A2_UNORM;
323 case SDL_PIXELFORMAT_ARGB8888:
324 if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
325 return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
326 }
327 return DXGI_FORMAT_B8G8R8A8_UNORM;
328 case SDL_PIXELFORMAT_ABGR8888:
329 if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
330 return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
331 }
332 return DXGI_FORMAT_R8G8B8A8_UNORM;
333 case SDL_PIXELFORMAT_XRGB8888:
334 if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
335 return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
336 }
337 return DXGI_FORMAT_B8G8R8X8_UNORM;
338 case SDL_PIXELFORMAT_YV12:
339 case SDL_PIXELFORMAT_IYUV:
340 return DXGI_FORMAT_R8_UNORM;
341 case SDL_PIXELFORMAT_NV12:
342 case SDL_PIXELFORMAT_NV21:
343 return DXGI_FORMAT_NV12;
344 case SDL_PIXELFORMAT_P010:
345 return DXGI_FORMAT_P010;
346 default:
347 return DXGI_FORMAT_UNKNOWN;
348 }
349}
350
351static DXGI_FORMAT SDLPixelFormatToDXGIMainResourceViewFormat(Uint32 format, Uint32 colorspace)
352{
353 switch (format) {
354 case SDL_PIXELFORMAT_RGBA64_FLOAT:
355 return DXGI_FORMAT_R16G16B16A16_FLOAT;
356 case SDL_PIXELFORMAT_ABGR2101010:
357 return DXGI_FORMAT_R10G10B10A2_UNORM;
358 case SDL_PIXELFORMAT_ARGB8888:
359 if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
360 return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
361 }
362 return DXGI_FORMAT_B8G8R8A8_UNORM;
363 case SDL_PIXELFORMAT_ABGR8888:
364 if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
365 return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
366 }
367 return DXGI_FORMAT_R8G8B8A8_UNORM;
368 case SDL_PIXELFORMAT_XRGB8888:
369 if (colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
370 return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
371 }
372 return DXGI_FORMAT_B8G8R8X8_UNORM;
373 case SDL_PIXELFORMAT_YV12:
374 case SDL_PIXELFORMAT_IYUV:
375 case SDL_PIXELFORMAT_NV12: // For the Y texture
376 case SDL_PIXELFORMAT_NV21: // For the Y texture
377 return DXGI_FORMAT_R8_UNORM;
378 case SDL_PIXELFORMAT_P010: // For the Y texture
379 return DXGI_FORMAT_R16_UNORM;
380 default:
381 return DXGI_FORMAT_UNKNOWN;
382 }
383}
384
385static void D3D12_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture);
386
387static void D3D12_ReleaseAll(SDL_Renderer *renderer)
388{
389 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
390
391 SDL_PropertiesID props = SDL_GetRendererProperties(renderer);
392 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_D3D12_DEVICE_POINTER, NULL);
393 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER, NULL);
394
395 // Release all textures
396 for (SDL_Texture *texture = renderer->textures; texture; texture = texture->next) {
397 D3D12_DestroyTexture(renderer, texture);
398 }
399
400 // Release/reset everything else
401 if (data) {
402 int i;
403
404#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
405 D3D_SAFE_RELEASE(data->dxgiFactory);
406 D3D_SAFE_RELEASE(data->dxgiAdapter);
407 D3D_SAFE_RELEASE(data->swapChain);
408#endif
409 D3D_SAFE_RELEASE(data->d3dDevice);
410 D3D_SAFE_RELEASE(data->debugInterface);
411 D3D_SAFE_RELEASE(data->commandQueue);
412 D3D_SAFE_RELEASE(data->commandList);
413 D3D_SAFE_RELEASE(data->rtvDescriptorHeap);
414 D3D_SAFE_RELEASE(data->textureRTVDescriptorHeap);
415 D3D_SAFE_RELEASE(data->srvDescriptorHeap);
416 D3D_SAFE_RELEASE(data->samplerDescriptorHeap);
417 D3D_SAFE_RELEASE(data->fence);
418
419 for (i = 0; i < SDL_D3D12_NUM_BUFFERS; ++i) {
420 D3D_SAFE_RELEASE(data->commandAllocators[i]);
421 D3D_SAFE_RELEASE(data->renderTargets[i]);
422 }
423
424 if (data->pipelineStateCount > 0) {
425 for (i = 0; i < data->pipelineStateCount; ++i) {
426 D3D_SAFE_RELEASE(data->pipelineStates[i].pipelineState);
427 }
428 SDL_free(data->pipelineStates);
429 data->pipelineStates = NULL;
430 data->pipelineStateCount = 0;
431 }
432
433 for (i = 0; i < NUM_ROOTSIGS; ++i) {
434 D3D_SAFE_RELEASE(data->rootSignatures[i]);
435 }
436
437 for (i = 0; i < SDL_D3D12_NUM_VERTEX_BUFFERS; ++i) {
438 D3D_SAFE_RELEASE(data->vertexBuffers[i].resource);
439 data->vertexBuffers[i].size = 0;
440 }
441
442 data->swapEffect = (DXGI_SWAP_EFFECT)0;
443 data->swapFlags = 0;
444 data->currentRenderTargetView.ptr = 0;
445 data->currentSampler.ptr = 0;
446
447#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
448 // Check for any leaks if in debug mode
449 if (data->dxgiDebug) {
450 DXGI_DEBUG_RLO_FLAGS rloFlags = (DXGI_DEBUG_RLO_FLAGS)(DXGI_DEBUG_RLO_DETAIL | DXGI_DEBUG_RLO_IGNORE_INTERNAL);
451 IDXGIDebug_ReportLiveObjects(data->dxgiDebug, SDL_DXGI_DEBUG_ALL, rloFlags);
452 D3D_SAFE_RELEASE(data->dxgiDebug);
453 }
454#endif
455
456 /* Unload the D3D libraries. This should be done last, in order
457 * to prevent IUnknown::Release() calls from crashing.
458 */
459 if (data->hD3D12Mod) {
460 SDL_UnloadObject(data->hD3D12Mod);
461 data->hD3D12Mod = NULL;
462 }
463 if (data->hDXGIMod) {
464 SDL_UnloadObject(data->hDXGIMod);
465 data->hDXGIMod = NULL;
466 }
467 }
468}
469
470static D3D12_GPU_DESCRIPTOR_HANDLE D3D12_CPUtoGPUHandle(ID3D12DescriptorHeap *heap, D3D12_CPU_DESCRIPTOR_HANDLE CPUHandle)
471{
472 D3D12_CPU_DESCRIPTOR_HANDLE CPUHeapStart;
473 D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle;
474 SIZE_T offset;
475
476 // Calculate the correct offset into the heap
477 D3D_CALL_RET(heap, GetCPUDescriptorHandleForHeapStart, &CPUHeapStart);
478 offset = CPUHandle.ptr - CPUHeapStart.ptr;
479
480 D3D_CALL_RET(heap, GetGPUDescriptorHandleForHeapStart, &GPUHandle);
481 GPUHandle.ptr += offset;
482
483 return GPUHandle;
484}
485
486static void D3D12_WaitForGPU(D3D12_RenderData *data)
487{
488 if (data->commandQueue && data->fence && data->fenceEvent) {
489 ID3D12CommandQueue_Signal(data->commandQueue, data->fence, data->fenceValue);
490 if (ID3D12Fence_GetCompletedValue(data->fence) < data->fenceValue) {
491 ID3D12Fence_SetEventOnCompletion(data->fence,
492 data->fenceValue,
493 data->fenceEvent);
494 WaitForSingleObjectEx(data->fenceEvent, INFINITE, FALSE);
495 }
496
497 data->fenceValue++;
498 }
499}
500
501static D3D12_CPU_DESCRIPTOR_HANDLE D3D12_GetCurrentRenderTargetView(SDL_Renderer *renderer)
502{
503 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
504 D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor;
505
506 if (data->textureRenderTarget) {
507 return data->textureRenderTarget->mainTextureRenderTargetView;
508 }
509
510 SDL_zero(rtvDescriptor);
511 D3D_CALL_RET(data->rtvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &rtvDescriptor);
512 rtvDescriptor.ptr += data->currentBackBufferIndex * data->rtvDescriptorSize;
513 return rtvDescriptor;
514}
515
516static void D3D12_TransitionResource(D3D12_RenderData *data,
517 ID3D12Resource *resource,
518 D3D12_RESOURCE_STATES beforeState,
519 D3D12_RESOURCE_STATES afterState)
520{
521 D3D12_RESOURCE_BARRIER barrier;
522
523 if (beforeState != afterState) {
524 SDL_zero(barrier);
525 barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
526 barrier.Transition.pResource = resource;
527 barrier.Transition.StateBefore = beforeState;
528 barrier.Transition.StateAfter = afterState;
529 barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
530
531 ID3D12GraphicsCommandList2_ResourceBarrier(data->commandList, 1, &barrier);
532 }
533}
534
535static void D3D12_ResetCommandList(D3D12_RenderData *data)
536{
537 int i;
538 ID3D12DescriptorHeap *rootDescriptorHeaps[] = { data->srvDescriptorHeap, data->samplerDescriptorHeap };
539 ID3D12CommandAllocator *commandAllocator = data->commandAllocators[data->currentBackBufferIndex];
540
541 ID3D12CommandAllocator_Reset(commandAllocator);
542 ID3D12GraphicsCommandList2_Reset(data->commandList, commandAllocator, NULL);
543 data->currentPipelineState = NULL;
544 data->currentVertexBuffer = 0;
545 data->issueBatch = false;
546 data->cliprectDirty = true;
547 data->viewportDirty = true;
548 data->currentRenderTargetView.ptr = 0;
549 // FIXME should we also clear currentSampler.ptr and currentRenderTargetView.ptr ? (and use D3D12_InvalidateCachedState() instead)
550
551 // Release any upload buffers that were inflight
552 for (i = 0; i < data->currentUploadBuffer; ++i) {
553 D3D_SAFE_RELEASE(data->uploadBuffers[i]);
554 }
555 data->currentUploadBuffer = 0;
556
557 ID3D12GraphicsCommandList2_SetDescriptorHeaps(data->commandList, 2, rootDescriptorHeaps);
558}
559
560static HRESULT D3D12_IssueBatch(D3D12_RenderData *data)
561{
562 HRESULT result = S_OK;
563
564 // Issue the command list
565 result = ID3D12GraphicsCommandList2_Close(data->commandList);
566 if (FAILED(result)) {
567 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("D3D12_IssueBatch"), result);
568 return result;
569 }
570 ID3D12CommandQueue_ExecuteCommandLists(data->commandQueue, 1, (ID3D12CommandList *const *)&data->commandList);
571
572 D3D12_WaitForGPU(data);
573
574 D3D12_ResetCommandList(data);
575
576 return result;
577}
578
579static void D3D12_DestroyRenderer(SDL_Renderer *renderer)
580{
581 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
582 if (data) {
583 D3D12_WaitForGPU(data);
584 D3D12_ReleaseAll(renderer);
585 SDL_free(data);
586 }
587}
588
589static D3D12_BLEND GetBlendFunc(SDL_BlendFactor factor)
590{
591 switch (factor) {
592 case SDL_BLENDFACTOR_ZERO:
593 return D3D12_BLEND_ZERO;
594 case SDL_BLENDFACTOR_ONE:
595 return D3D12_BLEND_ONE;
596 case SDL_BLENDFACTOR_SRC_COLOR:
597 return D3D12_BLEND_SRC_COLOR;
598 case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
599 return D3D12_BLEND_INV_SRC_COLOR;
600 case SDL_BLENDFACTOR_SRC_ALPHA:
601 return D3D12_BLEND_SRC_ALPHA;
602 case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
603 return D3D12_BLEND_INV_SRC_ALPHA;
604 case SDL_BLENDFACTOR_DST_COLOR:
605 return D3D12_BLEND_DEST_COLOR;
606 case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
607 return D3D12_BLEND_INV_DEST_COLOR;
608 case SDL_BLENDFACTOR_DST_ALPHA:
609 return D3D12_BLEND_DEST_ALPHA;
610 case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
611 return D3D12_BLEND_INV_DEST_ALPHA;
612 default:
613 return (D3D12_BLEND)0;
614 }
615}
616
617static D3D12_BLEND_OP GetBlendEquation(SDL_BlendOperation operation)
618{
619 switch (operation) {
620 case SDL_BLENDOPERATION_ADD:
621 return D3D12_BLEND_OP_ADD;
622 case SDL_BLENDOPERATION_SUBTRACT:
623 return D3D12_BLEND_OP_SUBTRACT;
624 case SDL_BLENDOPERATION_REV_SUBTRACT:
625 return D3D12_BLEND_OP_REV_SUBTRACT;
626 case SDL_BLENDOPERATION_MINIMUM:
627 return D3D12_BLEND_OP_MIN;
628 case SDL_BLENDOPERATION_MAXIMUM:
629 return D3D12_BLEND_OP_MAX;
630 default:
631 return (D3D12_BLEND_OP)0;
632 }
633}
634
635static void D3D12_CreateBlendState(SDL_Renderer *renderer, SDL_BlendMode blendMode, D3D12_BLEND_DESC *outBlendDesc)
636{
637 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
638 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
639 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
640 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
641 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
642 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
643
644 SDL_zerop(outBlendDesc);
645 outBlendDesc->AlphaToCoverageEnable = FALSE;
646 outBlendDesc->IndependentBlendEnable = FALSE;
647 outBlendDesc->RenderTarget[0].BlendEnable = TRUE;
648 outBlendDesc->RenderTarget[0].SrcBlend = GetBlendFunc(srcColorFactor);
649 outBlendDesc->RenderTarget[0].DestBlend = GetBlendFunc(dstColorFactor);
650 outBlendDesc->RenderTarget[0].BlendOp = GetBlendEquation(colorOperation);
651 outBlendDesc->RenderTarget[0].SrcBlendAlpha = GetBlendFunc(srcAlphaFactor);
652 outBlendDesc->RenderTarget[0].DestBlendAlpha = GetBlendFunc(dstAlphaFactor);
653 outBlendDesc->RenderTarget[0].BlendOpAlpha = GetBlendEquation(alphaOperation);
654 outBlendDesc->RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
655}
656
657static D3D12_PipelineState *D3D12_CreatePipelineState(SDL_Renderer *renderer,
658 D3D12_Shader shader,
659 SDL_BlendMode blendMode,
660 D3D12_PRIMITIVE_TOPOLOGY_TYPE topology,
661 DXGI_FORMAT rtvFormat)
662{
663 const D3D12_INPUT_ELEMENT_DESC vertexDesc[] = {
664 { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
665 { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
666 { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
667 };
668 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
669 D3D12_GRAPHICS_PIPELINE_STATE_DESC pipelineDesc;
670 ID3D12PipelineState *pipelineState = NULL;
671 D3D12_PipelineState *pipelineStates;
672 HRESULT result = S_OK;
673
674 SDL_zero(pipelineDesc);
675 pipelineDesc.pRootSignature = data->rootSignatures[D3D12_GetRootSignatureType(shader)];
676 D3D12_GetVertexShader(shader, &pipelineDesc.VS);
677 D3D12_GetPixelShader(shader, &pipelineDesc.PS);
678 D3D12_CreateBlendState(renderer, blendMode, &pipelineDesc.BlendState);
679 pipelineDesc.SampleMask = 0xffffffff;
680
681 pipelineDesc.RasterizerState.AntialiasedLineEnable = FALSE;
682 pipelineDesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
683 pipelineDesc.RasterizerState.DepthBias = 0;
684 pipelineDesc.RasterizerState.DepthBiasClamp = 0.0f;
685 pipelineDesc.RasterizerState.DepthClipEnable = TRUE;
686 pipelineDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
687 pipelineDesc.RasterizerState.FrontCounterClockwise = FALSE;
688 pipelineDesc.RasterizerState.MultisampleEnable = FALSE;
689 pipelineDesc.RasterizerState.SlopeScaledDepthBias = 0.0f;
690
691 pipelineDesc.InputLayout.pInputElementDescs = vertexDesc;
692 pipelineDesc.InputLayout.NumElements = 3;
693
694 pipelineDesc.PrimitiveTopologyType = topology;
695
696 pipelineDesc.NumRenderTargets = 1;
697 pipelineDesc.RTVFormats[0] = rtvFormat;
698 pipelineDesc.SampleDesc.Count = 1;
699 pipelineDesc.SampleDesc.Quality = 0;
700
701 result = ID3D12Device1_CreateGraphicsPipelineState(data->d3dDevice,
702 &pipelineDesc,
703 D3D_GUID(SDL_IID_ID3D12PipelineState),
704 (void **)&pipelineState);
705 if (FAILED(result)) {
706 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateGraphicsPipelineState"), result);
707 return NULL;
708 }
709
710 pipelineStates = (D3D12_PipelineState *)SDL_realloc(data->pipelineStates, (data->pipelineStateCount + 1) * sizeof(*pipelineStates));
711 if (!pipelineStates) {
712 D3D_SAFE_RELEASE(pipelineState);
713 return NULL;
714 }
715
716 pipelineStates[data->pipelineStateCount].shader = shader;
717 pipelineStates[data->pipelineStateCount].blendMode = blendMode;
718 pipelineStates[data->pipelineStateCount].topology = topology;
719 pipelineStates[data->pipelineStateCount].rtvFormat = rtvFormat;
720 pipelineStates[data->pipelineStateCount].pipelineState = pipelineState;
721 data->pipelineStates = pipelineStates;
722 ++data->pipelineStateCount;
723
724 return &pipelineStates[data->pipelineStateCount - 1];
725}
726
727static HRESULT D3D12_CreateVertexBuffer(D3D12_RenderData *data, size_t vbidx, size_t size)
728{
729 D3D12_HEAP_PROPERTIES vbufferHeapProps;
730 D3D12_RESOURCE_DESC vbufferDesc;
731 HRESULT result;
732
733 D3D_SAFE_RELEASE(data->vertexBuffers[vbidx].resource);
734
735 SDL_zero(vbufferHeapProps);
736 vbufferHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
737 vbufferHeapProps.CreationNodeMask = 1;
738 vbufferHeapProps.VisibleNodeMask = 1;
739
740 SDL_zero(vbufferDesc);
741 vbufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
742 vbufferDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
743 vbufferDesc.Width = size;
744 vbufferDesc.Height = 1;
745 vbufferDesc.DepthOrArraySize = 1;
746 vbufferDesc.MipLevels = 1;
747 vbufferDesc.Format = DXGI_FORMAT_UNKNOWN;
748 vbufferDesc.SampleDesc.Count = 1;
749 vbufferDesc.SampleDesc.Quality = 0;
750 vbufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
751 vbufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
752
753 result = ID3D12Device1_CreateCommittedResource(data->d3dDevice,
754 &vbufferHeapProps,
755 D3D12_HEAP_FLAG_NONE,
756 &vbufferDesc,
757 D3D12_RESOURCE_STATE_GENERIC_READ,
758 NULL,
759 D3D_GUID(SDL_IID_ID3D12Resource),
760 (void **)&data->vertexBuffers[vbidx].resource);
761
762 if (FAILED(result)) {
763 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreatePlacedResource [vertex buffer]"), result);
764 return result;
765 }
766
767 data->vertexBuffers[vbidx].view.BufferLocation = ID3D12Resource_GetGPUVirtualAddress(data->vertexBuffers[vbidx].resource);
768 data->vertexBuffers[vbidx].view.StrideInBytes = sizeof(D3D12_VertexPositionColor);
769 data->vertexBuffers[vbidx].size = size;
770
771 return result;
772}
773
774// Create resources that depend on the device.
775static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
776{
777#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
778 typedef HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY)(UINT flags, REFIID riid, void **ppFactory);
779 PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc;
780 PFN_D3D12_CREATE_DEVICE D3D12CreateDeviceFunc;
781#endif
782 typedef HANDLE(WINAPI * PFN_CREATE_EVENT_EX)(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCWSTR lpName, DWORD dwFlags, DWORD dwDesiredAccess);
783 PFN_CREATE_EVENT_EX CreateEventExFunc;
784
785 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
786 ID3D12Device *d3dDevice = NULL;
787 HRESULT result = S_OK;
788 UINT creationFlags = 0;
789 int i;
790 bool createDebug;
791
792 D3D12_COMMAND_QUEUE_DESC queueDesc;
793 D3D12_DESCRIPTOR_HEAP_DESC descriptorHeapDesc;
794 D3D12_SAMPLER_DESC samplerDesc;
795 ID3D12DescriptorHeap *rootDescriptorHeaps[2];
796
797 // See if we need debug interfaces
798 createDebug = SDL_GetHintBoolean(SDL_HINT_RENDER_DIRECT3D11_DEBUG, false);
799
800#ifdef SDL_PLATFORM_GDK
801 CreateEventExFunc = CreateEventExW;
802#else
803 // CreateEventEx() arrived in Vista, so we need to load it with GetProcAddress for XP.
804 {
805 HMODULE kernel32 = GetModuleHandle(TEXT("kernel32.dll"));
806 CreateEventExFunc = NULL;
807 if (kernel32) {
808 CreateEventExFunc = (PFN_CREATE_EVENT_EX)GetProcAddress(kernel32, "CreateEventExW");
809 }
810 }
811#endif
812 if (!CreateEventExFunc) {
813 result = E_FAIL;
814 goto done;
815 }
816
817#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
818 data->hDXGIMod = SDL_LoadObject("dxgi.dll");
819 if (!data->hDXGIMod) {
820 result = E_FAIL;
821 goto done;
822 }
823
824 CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "CreateDXGIFactory2");
825 if (!CreateDXGIFactoryFunc) {
826 result = E_FAIL;
827 goto done;
828 }
829
830 data->hD3D12Mod = SDL_LoadObject("D3D12.dll");
831 if (!data->hD3D12Mod) {
832 result = E_FAIL;
833 goto done;
834 }
835
836 D3D12CreateDeviceFunc = (PFN_D3D12_CREATE_DEVICE)SDL_LoadFunction(data->hD3D12Mod, "D3D12CreateDevice");
837 if (!D3D12CreateDeviceFunc) {
838 result = E_FAIL;
839 goto done;
840 }
841
842 if (createDebug) {
843 PFN_D3D12_GET_DEBUG_INTERFACE D3D12GetDebugInterfaceFunc;
844
845 D3D12GetDebugInterfaceFunc = (PFN_D3D12_GET_DEBUG_INTERFACE)SDL_LoadFunction(data->hD3D12Mod, "D3D12GetDebugInterface");
846 if (!D3D12GetDebugInterfaceFunc) {
847 result = E_FAIL;
848 goto done;
849 }
850 if (SUCCEEDED(D3D12GetDebugInterfaceFunc(D3D_GUID(SDL_IID_ID3D12Debug), (void **)&data->debugInterface))) {
851 ID3D12Debug_EnableDebugLayer(data->debugInterface);
852 }
853 }
854#endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
855
856#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
857 result = D3D12_XBOX_CreateDevice(&d3dDevice, createDebug);
858 if (FAILED(result)) {
859 // SDL Error is set by D3D12_XBOX_CreateDevice
860 goto done;
861 }
862#else
863 if (createDebug) {
864#ifdef __IDXGIInfoQueue_INTERFACE_DEFINED__
865 IDXGIInfoQueue *dxgiInfoQueue = NULL;
866 PFN_CREATE_DXGI_FACTORY DXGIGetDebugInterfaceFunc;
867
868 // If the debug hint is set, also create the DXGI factory in debug mode
869 DXGIGetDebugInterfaceFunc = (PFN_CREATE_DXGI_FACTORY)SDL_LoadFunction(data->hDXGIMod, "DXGIGetDebugInterface1");
870 if (!DXGIGetDebugInterfaceFunc) {
871 result = E_FAIL;
872 goto done;
873 }
874
875 result = DXGIGetDebugInterfaceFunc(0, D3D_GUID(SDL_IID_IDXGIDebug1), (void **)&data->dxgiDebug);
876 if (FAILED(result)) {
877 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result);
878 goto done;
879 }
880
881 result = DXGIGetDebugInterfaceFunc(0, D3D_GUID(SDL_IID_IDXGIInfoQueue), (void **)&dxgiInfoQueue);
882 if (FAILED(result)) {
883 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("DXGIGetDebugInterface1"), result);
884 goto done;
885 }
886
887 IDXGIInfoQueue_SetBreakOnSeverity(dxgiInfoQueue, SDL_DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR, TRUE);
888 IDXGIInfoQueue_SetBreakOnSeverity(dxgiInfoQueue, SDL_DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION, TRUE);
889 D3D_SAFE_RELEASE(dxgiInfoQueue);
890#endif // __IDXGIInfoQueue_INTERFACE_DEFINED__
891 creationFlags = DXGI_CREATE_FACTORY_DEBUG;
892 }
893
894 result = CreateDXGIFactoryFunc(creationFlags, D3D_GUID(SDL_IID_IDXGIFactory6), (void **)&data->dxgiFactory);
895 if (FAILED(result)) {
896 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateDXGIFactory"), result);
897 goto done;
898 }
899
900 // Prefer a high performance adapter if there are multiple choices
901 result = IDXGIFactory6_EnumAdapterByGpuPreference(data->dxgiFactory,
902 0,
903 DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
904 D3D_GUID(SDL_IID_IDXGIAdapter4),
905 (void **)&data->dxgiAdapter);
906 if (FAILED(result)) {
907 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGIFactory6::EnumAdapterByGPUPreference"), result);
908 goto done;
909 }
910
911 result = D3D12CreateDeviceFunc((IUnknown *)data->dxgiAdapter,
912 D3D_FEATURE_LEVEL_11_0, // Request minimum feature level 11.0 for maximum compatibility
913 D3D_GUID(SDL_IID_ID3D12Device1),
914 (void **)&d3dDevice);
915 if (FAILED(result)) {
916 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("D3D12CreateDevice"), result);
917 goto done;
918 }
919
920 // Setup the info queue if in debug mode
921 if (createDebug) {
922 ID3D12InfoQueue *infoQueue = NULL;
923 D3D12_MESSAGE_SEVERITY severities[] = { D3D12_MESSAGE_SEVERITY_INFO };
924 D3D12_INFO_QUEUE_FILTER filter;
925
926 result = ID3D12Device1_QueryInterface(d3dDevice, D3D_GUID(SDL_IID_ID3D12InfoQueue), (void **)&infoQueue);
927 if (FAILED(result)) {
928 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device to ID3D12InfoQueue"), result);
929 goto done;
930 }
931
932 SDL_zero(filter);
933 filter.DenyList.NumSeverities = 1;
934 filter.DenyList.pSeverityList = severities;
935 ID3D12InfoQueue_PushStorageFilter(infoQueue, &filter);
936
937 ID3D12InfoQueue_SetBreakOnSeverity(infoQueue, D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
938 ID3D12InfoQueue_SetBreakOnSeverity(infoQueue, D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE);
939
940 D3D_SAFE_RELEASE(infoQueue);
941 }
942#endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
943
944 result = ID3D12Device_QueryInterface(d3dDevice, D3D_GUID(SDL_IID_ID3D12Device1), (void **)&data->d3dDevice);
945 if (FAILED(result)) {
946 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device to ID3D12Device1"), result);
947 goto done;
948 }
949
950 // Create a command queue
951 SDL_zero(queueDesc);
952 queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
953 queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
954
955 result = ID3D12Device1_CreateCommandQueue(data->d3dDevice,
956 &queueDesc,
957 D3D_GUID(SDL_IID_ID3D12CommandQueue),
958 (void **)&data->commandQueue);
959 if (FAILED(result)) {
960 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommandQueue"), result);
961 goto done;
962 }
963
964 // Create the descriptor heaps for the render target view, texture SRVs, and samplers
965 SDL_zero(descriptorHeapDesc);
966 descriptorHeapDesc.NumDescriptors = SDL_D3D12_NUM_BUFFERS;
967 descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
968 result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
969 &descriptorHeapDesc,
970 D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
971 (void **)&data->rtvDescriptorHeap);
972 if (FAILED(result)) {
973 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateDescriptorHeap [rtv]"), result);
974 goto done;
975 }
976 data->rtvDescriptorSize = ID3D12Device1_GetDescriptorHandleIncrementSize(d3dDevice, D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
977
978 descriptorHeapDesc.NumDescriptors = SDL_D3D12_MAX_NUM_TEXTURES;
979 result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
980 &descriptorHeapDesc,
981 D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
982 (void **)&data->textureRTVDescriptorHeap);
983 if (FAILED(result)) {
984 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateDescriptorHeap [texture rtv]"), result);
985 goto done;
986 }
987
988 SDL_zero(descriptorHeapDesc);
989 descriptorHeapDesc.NumDescriptors = SDL_D3D12_MAX_NUM_TEXTURES;
990 descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
991 descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
992 result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
993 &descriptorHeapDesc,
994 D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
995 (void **)&data->srvDescriptorHeap);
996 if (FAILED(result)) {
997 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateDescriptorHeap [srv]"), result);
998 goto done;
999 }
1000 rootDescriptorHeaps[0] = data->srvDescriptorHeap;
1001 data->srvDescriptorSize = ID3D12Device1_GetDescriptorHandleIncrementSize(d3dDevice, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
1002
1003 SDL_zero(descriptorHeapDesc);
1004 descriptorHeapDesc.NumDescriptors = 4;
1005 descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
1006 descriptorHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
1007 result = ID3D12Device1_CreateDescriptorHeap(data->d3dDevice,
1008 &descriptorHeapDesc,
1009 D3D_GUID(SDL_IID_ID3D12DescriptorHeap),
1010 (void **)&data->samplerDescriptorHeap);
1011 if (FAILED(result)) {
1012 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateDescriptorHeap [sampler]"), result);
1013 goto done;
1014 }
1015 rootDescriptorHeaps[1] = data->samplerDescriptorHeap;
1016 data->samplerDescriptorSize = ID3D12Device1_GetDescriptorHandleIncrementSize(d3dDevice, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
1017
1018 // Create a command allocator for each back buffer
1019 for (i = 0; i < SDL_D3D12_NUM_BUFFERS; ++i) {
1020 result = ID3D12Device1_CreateCommandAllocator(data->d3dDevice,
1021 D3D12_COMMAND_LIST_TYPE_DIRECT,
1022 D3D_GUID(SDL_IID_ID3D12CommandAllocator),
1023 (void **)&data->commandAllocators[i]);
1024 if (FAILED(result)) {
1025 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommandAllocator"), result);
1026 goto done;
1027 }
1028 }
1029
1030 // Create the command list
1031 result = ID3D12Device1_CreateCommandList(data->d3dDevice,
1032 0,
1033 D3D12_COMMAND_LIST_TYPE_DIRECT,
1034 data->commandAllocators[0],
1035 NULL,
1036 D3D_GUID(SDL_IID_ID3D12GraphicsCommandList2),
1037 (void **)&data->commandList);
1038 if (FAILED(result)) {
1039 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommandList"), result);
1040 goto done;
1041 }
1042
1043 // Set the descriptor heaps to the correct initial value
1044 ID3D12GraphicsCommandList2_SetDescriptorHeaps(data->commandList, 2, rootDescriptorHeaps);
1045
1046 // Create the fence and fence event
1047 result = ID3D12Device_CreateFence(data->d3dDevice,
1048 data->fenceValue,
1049 D3D12_FENCE_FLAG_NONE,
1050 D3D_GUID(SDL_IID_ID3D12Fence),
1051 (void **)&data->fence);
1052 if (FAILED(result)) {
1053 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateFence"), result);
1054 goto done;
1055 }
1056
1057 data->fenceValue++;
1058
1059 data->fenceEvent = CreateEventExFunc(NULL, NULL, 0, EVENT_MODIFY_STATE | SYNCHRONIZE);
1060 if (!data->fenceEvent) {
1061 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("CreateEventEx"), result);
1062 goto done;
1063 }
1064
1065 // Create all the root signatures
1066 for (i = 0; i < NUM_ROOTSIGS; ++i) {
1067 D3D12_SHADER_BYTECODE rootSigData;
1068 D3D12_GetRootSignatureData((D3D12_RootSignature)i, &rootSigData);
1069 result = ID3D12Device1_CreateRootSignature(data->d3dDevice,
1070 0,
1071 rootSigData.pShaderBytecode,
1072 rootSigData.BytecodeLength,
1073 D3D_GUID(SDL_IID_ID3D12RootSignature),
1074 (void **)&data->rootSignatures[i]);
1075 if (FAILED(result)) {
1076 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateRootSignature"), result);
1077 goto done;
1078 }
1079 }
1080
1081 {
1082 const SDL_BlendMode defaultBlendModes[] = {
1083 SDL_BLENDMODE_BLEND,
1084 };
1085 const DXGI_FORMAT defaultRTVFormats[] = {
1086 DXGI_FORMAT_B8G8R8A8_UNORM,
1087 };
1088 int j, k, l;
1089
1090 // Create a few default pipeline state objects, to verify that this renderer will work
1091 for (i = 0; i < NUM_SHADERS; ++i) {
1092 for (j = 0; j < SDL_arraysize(defaultBlendModes); ++j) {
1093 for (k = D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT; k < D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH; ++k) {
1094 for (l = 0; l < SDL_arraysize(defaultRTVFormats); ++l) {
1095 if (!D3D12_CreatePipelineState(renderer, (D3D12_Shader)i, defaultBlendModes[j], (D3D12_PRIMITIVE_TOPOLOGY_TYPE)k, defaultRTVFormats[l])) {
1096 // D3D12_CreatePipelineState will set the SDL error, if it fails
1097 result = E_FAIL;
1098 goto done;
1099 }
1100 }
1101 }
1102 }
1103 }
1104 }
1105
1106 // Create default vertex buffers
1107 for (i = 0; i < SDL_D3D12_NUM_VERTEX_BUFFERS; ++i) {
1108 D3D12_CreateVertexBuffer(data, i, D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT);
1109 }
1110
1111 // Create samplers to use when drawing textures:
1112 static struct
1113 {
1114 D3D12_FILTER filter;
1115 D3D12_TEXTURE_ADDRESS_MODE address;
1116 } samplerParams[] = {
1117 { D3D12_FILTER_MIN_MAG_MIP_POINT, D3D12_TEXTURE_ADDRESS_MODE_CLAMP },
1118 { D3D12_FILTER_MIN_MAG_MIP_POINT, D3D12_TEXTURE_ADDRESS_MODE_WRAP },
1119 { D3D12_FILTER_MIN_MAG_MIP_LINEAR, D3D12_TEXTURE_ADDRESS_MODE_CLAMP },
1120 { D3D12_FILTER_MIN_MAG_MIP_LINEAR, D3D12_TEXTURE_ADDRESS_MODE_WRAP },
1121 };
1122 SDL_COMPILE_TIME_ASSERT(samplerParams_SIZE, SDL_arraysize(samplerParams) == D3D12_SAMPLER_COUNT);
1123 SDL_zero(samplerDesc);
1124 samplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
1125 samplerDesc.MipLODBias = 0.0f;
1126 samplerDesc.MaxAnisotropy = 1;
1127 samplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS;
1128 samplerDesc.MinLOD = 0.0f;
1129 samplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
1130 D3D_CALL_RET(data->samplerDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &data->samplers[0]);
1131 for (i = 0; i < SDL_arraysize(samplerParams); ++i) {
1132 samplerDesc.Filter = samplerParams[i].filter;
1133 samplerDesc.AddressU = samplerParams[i].address;
1134 samplerDesc.AddressV = samplerParams[i].address;
1135 data->samplers[i].ptr = data->samplers[0].ptr + i * data->samplerDescriptorSize;
1136 ID3D12Device1_CreateSampler(data->d3dDevice, &samplerDesc, data->samplers[i]);
1137 }
1138
1139 // Initialize the pool allocator for SRVs
1140 for (i = 0; i < SDL_D3D12_MAX_NUM_TEXTURES; ++i) {
1141 data->srvPoolNodes[i].index = (SIZE_T)i;
1142 if (i != SDL_D3D12_MAX_NUM_TEXTURES - 1) {
1143 data->srvPoolNodes[i].next = &data->srvPoolNodes[i + 1];
1144 }
1145 }
1146 data->srvPoolHead = &data->srvPoolNodes[0];
1147
1148 SDL_PropertiesID props = SDL_GetRendererProperties(renderer);
1149 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_D3D12_DEVICE_POINTER, data->d3dDevice);
1150 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER, data->commandQueue);
1151
1152done:
1153 D3D_SAFE_RELEASE(d3dDevice);
1154 return result;
1155}
1156
1157static DXGI_MODE_ROTATION D3D12_GetCurrentRotation(void)
1158{
1159 // FIXME
1160 return DXGI_MODE_ROTATION_IDENTITY;
1161}
1162
1163static BOOL D3D12_IsDisplayRotated90Degrees(DXGI_MODE_ROTATION rotation)
1164{
1165 switch (rotation) {
1166 case DXGI_MODE_ROTATION_ROTATE90:
1167 case DXGI_MODE_ROTATION_ROTATE270:
1168 return TRUE;
1169 default:
1170 return FALSE;
1171 }
1172}
1173
1174static int D3D12_GetRotationForCurrentRenderTarget(SDL_Renderer *renderer)
1175{
1176 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
1177 if (data->textureRenderTarget) {
1178 return DXGI_MODE_ROTATION_IDENTITY;
1179 } else {
1180 return data->rotation;
1181 }
1182}
1183
1184static bool D3D12_GetViewportAlignedD3DRect(SDL_Renderer *renderer, const SDL_Rect *sdlRect, D3D12_RECT *outRect, BOOL includeViewportOffset)
1185{
1186 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
1187 const int rotation = D3D12_GetRotationForCurrentRenderTarget(renderer);
1188 const SDL_Rect *viewport = &data->currentViewport;
1189
1190 switch (rotation) {
1191 case DXGI_MODE_ROTATION_IDENTITY:
1192 outRect->left = sdlRect->x;
1193 outRect->right = (LONG)sdlRect->x + sdlRect->w;
1194 outRect->top = sdlRect->y;
1195 outRect->bottom = (LONG)sdlRect->y + sdlRect->h;
1196 if (includeViewportOffset) {
1197 outRect->left += viewport->x;
1198 outRect->right += viewport->x;
1199 outRect->top += viewport->y;
1200 outRect->bottom += viewport->y;
1201 }
1202 break;
1203 case DXGI_MODE_ROTATION_ROTATE270:
1204 outRect->left = sdlRect->y;
1205 outRect->right = (LONG)sdlRect->y + sdlRect->h;
1206 outRect->top = viewport->w - sdlRect->x - sdlRect->w;
1207 outRect->bottom = viewport->w - sdlRect->x;
1208 break;
1209 case DXGI_MODE_ROTATION_ROTATE180:
1210 outRect->left = viewport->w - sdlRect->x - sdlRect->w;
1211 outRect->right = viewport->w - sdlRect->x;
1212 outRect->top = viewport->h - sdlRect->y - sdlRect->h;
1213 outRect->bottom = viewport->h - sdlRect->y;
1214 break;
1215 case DXGI_MODE_ROTATION_ROTATE90:
1216 outRect->left = viewport->h - sdlRect->y - sdlRect->h;
1217 outRect->right = viewport->h - sdlRect->y;
1218 outRect->top = sdlRect->x;
1219 outRect->bottom = (LONG)sdlRect->x + sdlRect->h;
1220 break;
1221 default:
1222 return SDL_SetError("The physical display is in an unknown or unsupported rotation");
1223 }
1224 return true;
1225}
1226
1227#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
1228static HRESULT D3D12_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
1229{
1230 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
1231 IDXGISwapChain1 *swapChain = NULL;
1232 HRESULT result = S_OK;
1233
1234 // Create a swap chain using the same adapter as the existing Direct3D device.
1235 DXGI_SWAP_CHAIN_DESC1 swapChainDesc;
1236 SDL_zero(swapChainDesc);
1237 swapChainDesc.Width = w;
1238 swapChainDesc.Height = h;
1239 switch (renderer->output_colorspace) {
1240 case SDL_COLORSPACE_SRGB_LINEAR:
1241 swapChainDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
1242 data->renderTargetFormat = DXGI_FORMAT_R16G16B16A16_FLOAT;
1243 break;
1244 case SDL_COLORSPACE_HDR10:
1245 swapChainDesc.Format = DXGI_FORMAT_R10G10B10A2_UNORM;
1246 data->renderTargetFormat = DXGI_FORMAT_R10G10B10A2_UNORM;
1247 break;
1248 default:
1249 swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format.
1250 data->renderTargetFormat = DXGI_FORMAT_B8G8R8A8_UNORM;
1251 break;
1252 }
1253 swapChainDesc.Stereo = FALSE;
1254 swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling.
1255 swapChainDesc.SampleDesc.Quality = 0;
1256 swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
1257 swapChainDesc.BufferCount = 2; // Use double-buffering to minimize latency.
1258 if (WIN_IsWindows8OrGreater()) {
1259 swapChainDesc.Scaling = DXGI_SCALING_NONE;
1260 } else {
1261 swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
1262 }
1263 swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect.
1264 swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT | // To support SetMaximumFrameLatency
1265 DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; // To support presenting with allow tearing on
1266
1267 HWND hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(renderer->window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
1268 if (!hwnd) {
1269 SDL_SetError("Couldn't get window handle");
1270 result = E_FAIL;
1271 goto done;
1272 }
1273
1274 result = IDXGIFactory2_CreateSwapChainForHwnd(data->dxgiFactory,
1275 (IUnknown *)data->commandQueue,
1276 hwnd,
1277 &swapChainDesc,
1278 NULL,
1279 NULL, // Allow on all displays.
1280 &swapChain);
1281 if (FAILED(result)) {
1282 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGIFactory2::CreateSwapChainForHwnd"), result);
1283 goto done;
1284 }
1285
1286 IDXGIFactory6_MakeWindowAssociation(data->dxgiFactory, hwnd, DXGI_MWA_NO_WINDOW_CHANGES);
1287
1288 result = IDXGISwapChain1_QueryInterface(swapChain, D3D_GUID(SDL_IID_IDXGISwapChain4), (void **)&data->swapChain);
1289 if (FAILED(result)) {
1290 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain1::QueryInterface"), result);
1291 goto done;
1292 }
1293
1294 /* Ensure that the swapchain does not queue more than one frame at a time. This both reduces latency
1295 * and ensures that the application will only render after each VSync, minimizing power consumption.
1296 */
1297 result = IDXGISwapChain4_SetMaximumFrameLatency(data->swapChain, 1);
1298 if (FAILED(result)) {
1299 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain4::SetMaximumFrameLatency"), result);
1300 goto done;
1301 }
1302
1303 data->swapEffect = swapChainDesc.SwapEffect;
1304 data->swapFlags = swapChainDesc.Flags;
1305
1306 UINT colorspace_support = 0;
1307 DXGI_COLOR_SPACE_TYPE colorspace;
1308 switch (renderer->output_colorspace) {
1309 case SDL_COLORSPACE_SRGB_LINEAR:
1310 colorspace = DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709;
1311 break;
1312 case SDL_COLORSPACE_HDR10:
1313 colorspace = DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
1314 break;
1315 default:
1316 // sRGB
1317 colorspace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
1318 break;
1319 }
1320 if (SUCCEEDED(IDXGISwapChain3_CheckColorSpaceSupport(data->swapChain, colorspace, &colorspace_support)) &&
1321 (colorspace_support & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT)) {
1322 result = IDXGISwapChain3_SetColorSpace1(data->swapChain, colorspace);
1323 if (FAILED(result)) {
1324 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain3::SetColorSpace1"), result);
1325 goto done;
1326 }
1327 } else {
1328 // Not the default, we're not going to be able to present in this colorspace
1329 SDL_SetError("Unsupported output colorspace");
1330 result = DXGI_ERROR_UNSUPPORTED;
1331 }
1332
1333 SDL_SetPointerProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER, data->swapChain);
1334
1335done:
1336 D3D_SAFE_RELEASE(swapChain);
1337 return result;
1338}
1339#endif
1340
1341// Initialize all resources that change when the window's size changes.
1342static HRESULT D3D12_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
1343{
1344 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
1345 HRESULT result = S_OK;
1346 int i, w, h;
1347
1348 D3D12_RENDER_TARGET_VIEW_DESC rtvDesc;
1349 D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor;
1350
1351 // Release resources in the current command list
1352 D3D12_IssueBatch(data);
1353 ID3D12GraphicsCommandList2_OMSetRenderTargets(data->commandList, 0, NULL, FALSE, NULL);
1354
1355 // Release render targets
1356 for (i = 0; i < SDL_D3D12_NUM_BUFFERS; ++i) {
1357 D3D_SAFE_RELEASE(data->renderTargets[i]);
1358 }
1359
1360 /* The width and height of the swap chain must be based on the display's
1361 * non-rotated size.
1362 */
1363 SDL_GetWindowSizeInPixels(renderer->window, &w, &h);
1364 data->rotation = D3D12_GetCurrentRotation();
1365 if (D3D12_IsDisplayRotated90Degrees(data->rotation)) {
1366 int tmp = w;
1367 w = h;
1368 h = tmp;
1369 }
1370
1371#if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
1372 if (data->swapChain) {
1373 // If the swap chain already exists, resize it.
1374 result = IDXGISwapChain_ResizeBuffers(data->swapChain,
1375 0,
1376 w, h,
1377 DXGI_FORMAT_UNKNOWN,
1378 data->swapFlags);
1379 if (FAILED(result)) {
1380 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain::ResizeBuffers"), result);
1381 goto done;
1382 }
1383 } else {
1384 result = D3D12_CreateSwapChain(renderer, w, h);
1385 if (FAILED(result) || !data->swapChain) {
1386 goto done;
1387 }
1388 }
1389
1390 // Set the proper rotation for the swap chain.
1391 if (WIN_IsWindows8OrGreater()) {
1392 if (data->swapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) {
1393 result = IDXGISwapChain4_SetRotation(data->swapChain, data->rotation); // NOLINT(clang-analyzer-core.NullDereference)
1394 if (FAILED(result)) {
1395 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain4::SetRotation"), result);
1396 goto done;
1397 }
1398 }
1399 }
1400#endif // !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
1401
1402 // Get each back buffer render target and create render target views
1403 for (i = 0; i < SDL_D3D12_NUM_BUFFERS; ++i) {
1404#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
1405 result = D3D12_XBOX_CreateBackBufferTarget(data->d3dDevice, renderer->window->w, renderer->window->h, (void **)&data->renderTargets[i]);
1406 if (FAILED(result)) {
1407 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("D3D12_XBOX_CreateBackBufferTarget"), result);
1408 goto done;
1409 }
1410#else
1411 result = IDXGISwapChain4_GetBuffer(data->swapChain, // NOLINT(clang-analyzer-core.NullDereference)
1412 i,
1413 D3D_GUID(SDL_IID_ID3D12Resource),
1414 (void **)&data->renderTargets[i]);
1415 if (FAILED(result)) {
1416 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain4::GetBuffer"), result);
1417 goto done;
1418 }
1419#endif
1420
1421 SDL_zero(rtvDesc);
1422 rtvDesc.Format = data->renderTargetFormat;
1423 rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
1424
1425 SDL_zero(rtvDescriptor);
1426 D3D_CALL_RET(data->rtvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &rtvDescriptor);
1427 rtvDescriptor.ptr += i * data->rtvDescriptorSize;
1428 ID3D12Device1_CreateRenderTargetView(data->d3dDevice, data->renderTargets[i], &rtvDesc, rtvDescriptor);
1429 }
1430
1431 // Set back buffer index to current buffer
1432#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
1433 data->currentBackBufferIndex = 0;
1434#else
1435 data->currentBackBufferIndex = IDXGISwapChain4_GetCurrentBackBufferIndex(data->swapChain);
1436#endif
1437
1438 /* Set the swap chain target immediately, so that a target is always set
1439 * even before we get to SetDrawState. Without this it's possible to hit
1440 * null references in places like ReadPixels!
1441 */
1442 data->currentRenderTargetView = D3D12_GetCurrentRenderTargetView(renderer);
1443 ID3D12GraphicsCommandList2_OMSetRenderTargets(data->commandList, 1, &data->currentRenderTargetView, FALSE, NULL);
1444 D3D12_TransitionResource(data,
1445 data->renderTargets[data->currentBackBufferIndex],
1446 D3D12_RESOURCE_STATE_PRESENT,
1447 D3D12_RESOURCE_STATE_RENDER_TARGET);
1448
1449 data->viewportDirty = true;
1450
1451#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
1452 D3D12_XBOX_StartFrame(data->d3dDevice, &data->frameToken);
1453#endif
1454
1455done:
1456 return result;
1457}
1458
1459static bool D3D12_HandleDeviceLost(SDL_Renderer *renderer)
1460{
1461 bool recovered = false;
1462
1463 D3D12_ReleaseAll(renderer);
1464
1465 if (SUCCEEDED(D3D12_CreateDeviceResources(renderer)) &&
1466 SUCCEEDED(D3D12_CreateWindowSizeDependentResources(renderer))) {
1467 recovered = true;
1468 } else {
1469 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Renderer couldn't recover from device lost: %s", SDL_GetError());
1470 D3D12_ReleaseAll(renderer);
1471 }
1472
1473 // Let the application know that the device has been reset or lost
1474 SDL_Event event;
1475 SDL_zero(event);
1476 event.type = recovered ? SDL_EVENT_RENDER_DEVICE_RESET : SDL_EVENT_RENDER_DEVICE_LOST;
1477 event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer));
1478 SDL_PushEvent(&event);
1479
1480 return recovered;
1481}
1482
1483// This method is called when the window's size changes.
1484static HRESULT D3D12_UpdateForWindowSizeChange(SDL_Renderer *renderer)
1485{
1486 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
1487 // If the GPU has previous work, wait for it to be done first
1488 D3D12_WaitForGPU(data);
1489 return D3D12_CreateWindowSizeDependentResources(renderer);
1490}
1491
1492static void D3D12_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
1493{
1494 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
1495
1496 if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
1497 data->pixelSizeChanged = true;
1498 }
1499}
1500
1501static bool D3D12_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
1502{
1503 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
1504 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
1505 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
1506 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
1507 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
1508 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
1509
1510 if (!GetBlendFunc(srcColorFactor) || !GetBlendFunc(srcAlphaFactor) ||
1511 !GetBlendEquation(colorOperation) ||
1512 !GetBlendFunc(dstColorFactor) || !GetBlendFunc(dstAlphaFactor) ||
1513 !GetBlendEquation(alphaOperation)) {
1514 return false;
1515 }
1516 return true;
1517}
1518
1519static SIZE_T D3D12_GetAvailableSRVIndex(SDL_Renderer *renderer)
1520{
1521 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
1522 if (rendererData->srvPoolHead) {
1523 SIZE_T index = rendererData->srvPoolHead->index;
1524 rendererData->srvPoolHead = (D3D12_SRVPoolNode *)(rendererData->srvPoolHead->next);
1525 return index;
1526 } else {
1527 SDL_SetError("[d3d12] Cannot allocate more than %d textures!", SDL_D3D12_MAX_NUM_TEXTURES);
1528 return SDL_D3D12_MAX_NUM_TEXTURES + 1;
1529 }
1530}
1531
1532static void D3D12_FreeSRVIndex(SDL_Renderer *renderer, SIZE_T index)
1533{
1534 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
1535 rendererData->srvPoolNodes[index].next = rendererData->srvPoolHead;
1536 rendererData->srvPoolHead = &rendererData->srvPoolNodes[index];
1537}
1538
1539static bool GetTextureProperty(SDL_PropertiesID props, const char *name, ID3D12Resource **texture)
1540{
1541 IUnknown *unknown = (IUnknown*)SDL_GetPointerProperty(props, name, NULL);
1542 if (unknown) {
1543#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
1544 HRESULT result = unknown->QueryInterface(D3D_GUID(SDL_IID_ID3D12Resource), (void **)texture);
1545#else
1546 HRESULT result = IUnknown_QueryInterface(unknown, D3D_GUID(SDL_IID_ID3D12Resource), (void **)texture);
1547#endif
1548 if (FAILED(result)) {
1549 return WIN_SetErrorFromHRESULT(name, result);
1550 }
1551 }
1552 return true;
1553}
1554
1555static bool D3D12_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
1556{
1557 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
1558 D3D12_TextureData *textureData;
1559 HRESULT result;
1560 DXGI_FORMAT textureFormat = SDLPixelFormatToDXGITextureFormat(texture->format, renderer->output_colorspace);
1561 D3D12_RESOURCE_DESC textureDesc;
1562 D3D12_HEAP_PROPERTIES heapProps;
1563 D3D12_SHADER_RESOURCE_VIEW_DESC resourceViewDesc;
1564
1565 if (!rendererData->d3dDevice) {
1566 return SDL_SetError("Device lost and couldn't be recovered");
1567 }
1568
1569 if (textureFormat == DXGI_FORMAT_UNKNOWN) {
1570 return SDL_SetError("%s, An unsupported SDL pixel format (0x%x) was specified", __FUNCTION__, texture->format);
1571 }
1572
1573 textureData = (D3D12_TextureData *)SDL_calloc(1, sizeof(*textureData));
1574 if (!textureData) {
1575 return false;
1576 }
1577 textureData->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? D3D12_FILTER_MIN_MAG_MIP_POINT : D3D12_FILTER_MIN_MAG_MIP_LINEAR;
1578
1579 texture->internal = textureData;
1580 textureData->mainTextureFormat = textureFormat;
1581
1582 SDL_zero(textureDesc);
1583 textureDesc.Width = texture->w;
1584 textureDesc.Height = texture->h;
1585 textureDesc.MipLevels = 1;
1586 textureDesc.DepthOrArraySize = 1;
1587 textureDesc.Format = textureFormat;
1588 textureDesc.SampleDesc.Count = 1;
1589 textureDesc.SampleDesc.Quality = 0;
1590 textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
1591 textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
1592
1593 // NV12 textures must have even width and height
1594 if (texture->format == SDL_PIXELFORMAT_NV12 ||
1595 texture->format == SDL_PIXELFORMAT_NV21 ||
1596 texture->format == SDL_PIXELFORMAT_P010) {
1597 textureDesc.Width = (textureDesc.Width + 1) & ~1;
1598 textureDesc.Height = (textureDesc.Height + 1) & ~1;
1599 }
1600 textureData->w = (int)textureDesc.Width;
1601 textureData->h = (int)textureDesc.Height;
1602 if (SDL_COLORSPACETRANSFER(texture->colorspace) == SDL_TRANSFER_CHARACTERISTICS_SRGB) {
1603 textureData->shader = SHADER_RGB;
1604 } else {
1605 textureData->shader = SHADER_ADVANCED;
1606 }
1607
1608 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
1609 textureDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
1610 }
1611
1612 SDL_zero(heapProps);
1613 heapProps.Type = D3D12_HEAP_TYPE_DEFAULT;
1614 heapProps.CreationNodeMask = 1;
1615 heapProps.VisibleNodeMask = 1;
1616
1617 if (!GetTextureProperty(create_props, SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER, &textureData->mainTexture)) {
1618 return false;
1619 }
1620 if (!textureData->mainTexture) {
1621 result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
1622 &heapProps,
1623 D3D12_HEAP_FLAG_NONE,
1624 &textureDesc,
1625 D3D12_RESOURCE_STATE_COPY_DEST,
1626 NULL,
1627 D3D_GUID(SDL_IID_ID3D12Resource),
1628 (void **)&textureData->mainTexture);
1629 if (FAILED(result)) {
1630 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommittedResource [texture]"), result);
1631 }
1632 }
1633 textureData->mainResourceState = D3D12_RESOURCE_STATE_COPY_DEST;
1634 SDL_SetPointerProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER, textureData->mainTexture);
1635#ifdef SDL_HAVE_YUV
1636 if (texture->format == SDL_PIXELFORMAT_YV12 ||
1637 texture->format == SDL_PIXELFORMAT_IYUV) {
1638 textureData->yuv = true;
1639
1640 textureDesc.Width = (textureDesc.Width + 1) / 2;
1641 textureDesc.Height = (textureDesc.Height + 1) / 2;
1642
1643 if (!GetTextureProperty(create_props, SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER, &textureData->mainTextureU)) {
1644 return false;
1645 }
1646 if (!textureData->mainTextureU) {
1647 result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
1648 &heapProps,
1649 D3D12_HEAP_FLAG_NONE,
1650 &textureDesc,
1651 D3D12_RESOURCE_STATE_COPY_DEST,
1652 NULL,
1653 D3D_GUID(SDL_IID_ID3D12Resource),
1654 (void **)&textureData->mainTextureU);
1655 if (FAILED(result)) {
1656 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommittedResource [texture]"), result);
1657 }
1658 }
1659 textureData->mainResourceStateU = D3D12_RESOURCE_STATE_COPY_DEST;
1660 SDL_SetPointerProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER, textureData->mainTextureU);
1661
1662 if (!GetTextureProperty(create_props, SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER, &textureData->mainTextureV)) {
1663 return false;
1664 }
1665 if (!textureData->mainTextureV) {
1666 result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
1667 &heapProps,
1668 D3D12_HEAP_FLAG_NONE,
1669 &textureDesc,
1670 D3D12_RESOURCE_STATE_COPY_DEST,
1671 NULL,
1672 D3D_GUID(SDL_IID_ID3D12Resource),
1673 (void **)&textureData->mainTextureV);
1674 if (FAILED(result)) {
1675 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommittedResource [texture]"), result);
1676 }
1677 }
1678 textureData->mainResourceStateV = D3D12_RESOURCE_STATE_COPY_DEST;
1679 SDL_SetPointerProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER, textureData->mainTextureV);
1680
1681 textureData->YCbCr_matrix = SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8);
1682 if (!textureData->YCbCr_matrix) {
1683 return SDL_SetError("Unsupported YUV colorspace");
1684 }
1685 }
1686
1687 if (texture->format == SDL_PIXELFORMAT_NV12 ||
1688 texture->format == SDL_PIXELFORMAT_NV21 ||
1689 texture->format == SDL_PIXELFORMAT_P010) {
1690 int bits_per_pixel;
1691
1692 textureData->nv12 = true;
1693
1694 switch (texture->format) {
1695 case SDL_PIXELFORMAT_P010:
1696 bits_per_pixel = 10;
1697 break;
1698 default:
1699 bits_per_pixel = 8;
1700 break;
1701 }
1702 textureData->YCbCr_matrix = SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, bits_per_pixel);
1703 if (!textureData->YCbCr_matrix) {
1704 return SDL_SetError("Unsupported YUV colorspace");
1705 }
1706 }
1707#endif // SDL_HAVE_YUV
1708 SDL_zero(resourceViewDesc);
1709 resourceViewDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
1710 resourceViewDesc.Format = SDLPixelFormatToDXGIMainResourceViewFormat(texture->format, renderer->output_colorspace);
1711 resourceViewDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
1712 resourceViewDesc.Texture2D.MipLevels = textureDesc.MipLevels;
1713
1714 textureData->mainSRVIndex = D3D12_GetAvailableSRVIndex(renderer);
1715 D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceView);
1716 textureData->mainTextureResourceView.ptr += textureData->mainSRVIndex * rendererData->srvDescriptorSize;
1717
1718 ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
1719 textureData->mainTexture,
1720 &resourceViewDesc,
1721 textureData->mainTextureResourceView);
1722#ifdef SDL_HAVE_YUV
1723 if (textureData->yuv) {
1724 D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewU);
1725 textureData->mainSRVIndexU = D3D12_GetAvailableSRVIndex(renderer);
1726 textureData->mainTextureResourceViewU.ptr += textureData->mainSRVIndexU * rendererData->srvDescriptorSize;
1727 ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
1728 textureData->mainTextureU,
1729 &resourceViewDesc,
1730 textureData->mainTextureResourceViewU);
1731
1732 D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewV);
1733 textureData->mainSRVIndexV = D3D12_GetAvailableSRVIndex(renderer);
1734 textureData->mainTextureResourceViewV.ptr += textureData->mainSRVIndexV * rendererData->srvDescriptorSize;
1735 ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
1736 textureData->mainTextureV,
1737 &resourceViewDesc,
1738 textureData->mainTextureResourceViewV);
1739 }
1740
1741 if (textureData->nv12) {
1742 D3D12_SHADER_RESOURCE_VIEW_DESC nvResourceViewDesc = resourceViewDesc;
1743
1744 if (texture->format == SDL_PIXELFORMAT_NV12 || texture->format == SDL_PIXELFORMAT_NV21) {
1745 nvResourceViewDesc.Format = DXGI_FORMAT_R8G8_UNORM;
1746 } else if (texture->format == SDL_PIXELFORMAT_P010) {
1747 nvResourceViewDesc.Format = DXGI_FORMAT_R16G16_UNORM;
1748 }
1749 nvResourceViewDesc.Texture2D.PlaneSlice = 1;
1750
1751 D3D_CALL_RET(rendererData->srvDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureResourceViewNV);
1752 textureData->mainSRVIndexNV = D3D12_GetAvailableSRVIndex(renderer);
1753 textureData->mainTextureResourceViewNV.ptr += textureData->mainSRVIndexNV * rendererData->srvDescriptorSize;
1754 ID3D12Device1_CreateShaderResourceView(rendererData->d3dDevice,
1755 textureData->mainTexture,
1756 &nvResourceViewDesc,
1757 textureData->mainTextureResourceViewNV);
1758 }
1759#endif // SDL_HAVE_YUV
1760
1761 if (texture->access & SDL_TEXTUREACCESS_TARGET) {
1762 D3D12_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
1763 SDL_zero(renderTargetViewDesc);
1764 renderTargetViewDesc.Format = textureDesc.Format;
1765 renderTargetViewDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
1766 renderTargetViewDesc.Texture2D.MipSlice = 0;
1767
1768 D3D_CALL_RET(rendererData->textureRTVDescriptorHeap, GetCPUDescriptorHandleForHeapStart, &textureData->mainTextureRenderTargetView);
1769 textureData->mainTextureRenderTargetView.ptr += textureData->mainSRVIndex * rendererData->rtvDescriptorSize;
1770
1771 ID3D12Device1_CreateRenderTargetView(rendererData->d3dDevice,
1772 (ID3D12Resource *)textureData->mainTexture,
1773 &renderTargetViewDesc,
1774 textureData->mainTextureRenderTargetView);
1775 }
1776
1777 return true;
1778}
1779
1780static void D3D12_DestroyTexture(SDL_Renderer *renderer,
1781 SDL_Texture *texture)
1782{
1783 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
1784 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
1785
1786 if (!textureData) {
1787 return;
1788 }
1789
1790 /* Because SDL_DestroyTexture might be called while the data is in-flight, we need to issue the batch first
1791 Unfortunately, this means that deleting a lot of textures mid-frame will have poor performance. */
1792 D3D12_IssueBatch(rendererData);
1793
1794 D3D_SAFE_RELEASE(textureData->mainTexture);
1795 D3D_SAFE_RELEASE(textureData->stagingBuffer);
1796 D3D12_FreeSRVIndex(renderer, textureData->mainSRVIndex);
1797#ifdef SDL_HAVE_YUV
1798 D3D_SAFE_RELEASE(textureData->mainTextureU);
1799 D3D_SAFE_RELEASE(textureData->mainTextureV);
1800 if (textureData->yuv) {
1801 D3D12_FreeSRVIndex(renderer, textureData->mainSRVIndexU);
1802 D3D12_FreeSRVIndex(renderer, textureData->mainSRVIndexV);
1803 }
1804 if (textureData->nv12) {
1805 D3D12_FreeSRVIndex(renderer, textureData->mainSRVIndexNV);
1806 }
1807 SDL_free(textureData->pixels);
1808#endif
1809 SDL_free(textureData);
1810 texture->internal = NULL;
1811}
1812
1813static bool D3D12_UpdateTextureInternal(D3D12_RenderData *rendererData, ID3D12Resource *texture, int plane, int x, int y, int w, int h, const void *pixels, int pitch, D3D12_RESOURCE_STATES *resourceState)
1814{
1815 const Uint8 *src;
1816 Uint8 *dst;
1817 UINT length;
1818 HRESULT result;
1819 D3D12_RESOURCE_DESC textureDesc;
1820 D3D12_RESOURCE_DESC uploadDesc;
1821 D3D12_HEAP_PROPERTIES heapProps;
1822 D3D12_PLACED_SUBRESOURCE_FOOTPRINT placedTextureDesc;
1823 D3D12_TEXTURE_COPY_LOCATION srcLocation;
1824 D3D12_TEXTURE_COPY_LOCATION dstLocation;
1825 BYTE *textureMemory;
1826 ID3D12Resource *uploadBuffer;
1827 UINT row, NumRows, RowPitch;
1828 UINT64 RowLength;
1829
1830 // Create an upload buffer, which will be used to write to the main texture.
1831 SDL_zero(textureDesc);
1832 D3D_CALL_RET(texture, GetDesc, &textureDesc);
1833 textureDesc.Width = w;
1834 textureDesc.Height = h;
1835 if (textureDesc.Format == DXGI_FORMAT_NV12 ||
1836 textureDesc.Format == DXGI_FORMAT_P010) {
1837 textureDesc.Width = (textureDesc.Width + 1) & ~1;
1838 textureDesc.Height = (textureDesc.Height + 1) & ~1;
1839 }
1840
1841 SDL_zero(uploadDesc);
1842 uploadDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
1843 uploadDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
1844 uploadDesc.Height = 1;
1845 uploadDesc.DepthOrArraySize = 1;
1846 uploadDesc.MipLevels = 1;
1847 uploadDesc.Format = DXGI_FORMAT_UNKNOWN;
1848 uploadDesc.SampleDesc.Count = 1;
1849 uploadDesc.SampleDesc.Quality = 0;
1850 uploadDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
1851 uploadDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
1852
1853 // Figure out how much we need to allocate for the upload buffer
1854 ID3D12Device1_GetCopyableFootprints(rendererData->d3dDevice,
1855 &textureDesc,
1856 plane,
1857 1,
1858 0,
1859 &placedTextureDesc,
1860 &NumRows,
1861 &RowLength,
1862 &uploadDesc.Width);
1863 RowPitch = placedTextureDesc.Footprint.RowPitch;
1864
1865 SDL_zero(heapProps);
1866 heapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
1867 heapProps.CreationNodeMask = 1;
1868 heapProps.VisibleNodeMask = 1;
1869
1870 // Create the upload buffer
1871 result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
1872 &heapProps,
1873 D3D12_HEAP_FLAG_NONE,
1874 &uploadDesc,
1875 D3D12_RESOURCE_STATE_GENERIC_READ,
1876 NULL,
1877 D3D_GUID(SDL_IID_ID3D12Resource),
1878 (void **)&rendererData->uploadBuffers[rendererData->currentUploadBuffer]);
1879 if (FAILED(result)) {
1880 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommittedResource [create upload buffer]"), result);
1881 }
1882
1883 // Get a write-only pointer to data in the upload buffer:
1884 uploadBuffer = rendererData->uploadBuffers[rendererData->currentUploadBuffer];
1885 result = ID3D12Resource_Map(uploadBuffer,
1886 0,
1887 NULL,
1888 (void **)&textureMemory);
1889 if (FAILED(result)) {
1890 D3D_SAFE_RELEASE(rendererData->uploadBuffers[rendererData->currentUploadBuffer]);
1891 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Resource::Map [map staging texture]"), result);
1892 }
1893
1894 src = (const Uint8 *)pixels;
1895 dst = textureMemory;
1896 length = (UINT)RowLength;
1897 if (length == (UINT)pitch && length == RowPitch) {
1898 SDL_memcpy(dst, src, (size_t)length * NumRows);
1899 } else {
1900 if (length > (UINT)pitch) {
1901 length = pitch;
1902 }
1903 if (length > RowPitch) {
1904 length = RowPitch;
1905 }
1906 for (row = NumRows; row--; ) {
1907 SDL_memcpy(dst, src, length);
1908 src += pitch;
1909 dst += RowPitch;
1910 }
1911 }
1912
1913 // Commit the changes back to the upload buffer:
1914 ID3D12Resource_Unmap(uploadBuffer, 0, NULL);
1915
1916 // Make sure the destination is in the correct resource state
1917 D3D12_TransitionResource(rendererData, texture, *resourceState, D3D12_RESOURCE_STATE_COPY_DEST);
1918 *resourceState = D3D12_RESOURCE_STATE_COPY_DEST;
1919
1920 SDL_zero(dstLocation);
1921 dstLocation.pResource = texture;
1922 dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
1923 dstLocation.SubresourceIndex = plane;
1924
1925 SDL_zero(srcLocation);
1926 srcLocation.pResource = rendererData->uploadBuffers[rendererData->currentUploadBuffer];
1927 srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
1928 srcLocation.PlacedFootprint = placedTextureDesc;
1929
1930 ID3D12GraphicsCommandList2_CopyTextureRegion(rendererData->commandList,
1931 &dstLocation,
1932 x,
1933 y,
1934 0,
1935 &srcLocation,
1936 NULL);
1937
1938 // Transition the texture to be shader accessible
1939 D3D12_TransitionResource(rendererData, texture, *resourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
1940 *resourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
1941
1942 rendererData->currentUploadBuffer++;
1943 // If we've used up all the upload buffers, we need to issue the batch
1944 if (rendererData->currentUploadBuffer == SDL_D3D12_NUM_UPLOAD_BUFFERS) {
1945 D3D12_IssueBatch(rendererData);
1946 }
1947
1948 return true;
1949}
1950
1951static bool D3D12_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
1952 const SDL_Rect *rect, const void *srcPixels,
1953 int srcPitch)
1954{
1955 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
1956 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
1957
1958 if (!textureData) {
1959 return SDL_SetError("Texture is not currently available");
1960 }
1961
1962 if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTexture, 0, rect->x, rect->y, rect->w, rect->h, srcPixels, srcPitch, &textureData->mainResourceState)) {
1963 return false;
1964 }
1965#ifdef SDL_HAVE_YUV
1966 if (textureData->yuv) {
1967 // Skip to the correct offset into the next texture
1968 srcPixels = (const void *)((const Uint8 *)srcPixels + rect->h * srcPitch);
1969
1970 if (!D3D12_UpdateTextureInternal(rendererData, texture->format == SDL_PIXELFORMAT_YV12 ? textureData->mainTextureV : textureData->mainTextureU, 0, rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, srcPixels, (srcPitch + 1) / 2, texture->format == SDL_PIXELFORMAT_YV12 ? &textureData->mainResourceStateV : &textureData->mainResourceStateU)) {
1971 return false;
1972 }
1973
1974 // Skip to the correct offset into the next texture
1975 srcPixels = (const void *)((const Uint8 *)srcPixels + ((rect->h + 1) / 2) * ((srcPitch + 1) / 2));
1976 if (!D3D12_UpdateTextureInternal(rendererData, texture->format == SDL_PIXELFORMAT_YV12 ? textureData->mainTextureU : textureData->mainTextureV, 0, rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, srcPixels, (srcPitch + 1) / 2, texture->format == SDL_PIXELFORMAT_YV12 ? &textureData->mainResourceStateU : &textureData->mainResourceStateV)) {
1977 return false;
1978 }
1979 }
1980
1981 if (textureData->nv12) {
1982 // Skip to the correct offset into the next texture
1983 srcPixels = (const void *)((const Uint8 *)srcPixels + rect->h * srcPitch);
1984
1985 if (texture->format == SDL_PIXELFORMAT_P010) {
1986 srcPitch = (srcPitch + 3) & ~3;
1987 } else {
1988 srcPitch = (srcPitch + 1) & ~1;
1989 }
1990 if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTexture, 1, rect->x, rect->y, (rect->w + 1) & ~1, (rect->h + 1) & ~1, srcPixels, srcPitch, &textureData->mainResourceState)) {
1991 return false;
1992 }
1993 }
1994#endif // SDL_HAVE_YUV
1995 return true;
1996}
1997
1998#ifdef SDL_HAVE_YUV
1999static bool D3D12_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
2000 const SDL_Rect *rect,
2001 const Uint8 *Yplane, int Ypitch,
2002 const Uint8 *Uplane, int Upitch,
2003 const Uint8 *Vplane, int Vpitch)
2004{
2005 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2006 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
2007
2008 if (!textureData) {
2009 return SDL_SetError("Texture is not currently available");
2010 }
2011
2012 if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTexture, 0, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch, &textureData->mainResourceState)) {
2013 return false;
2014 }
2015 if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTextureU, 0, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Uplane, Upitch, &textureData->mainResourceStateU)) {
2016 return false;
2017 }
2018 if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTextureV, 0, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Vplane, Vpitch, &textureData->mainResourceStateV)) {
2019 return false;
2020 }
2021 return true;
2022}
2023
2024static bool D3D12_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
2025 const SDL_Rect *rect,
2026 const Uint8 *Yplane, int Ypitch,
2027 const Uint8 *UVplane, int UVpitch)
2028{
2029 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2030 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
2031
2032 if (!textureData) {
2033 return SDL_SetError("Texture is not currently available");
2034 }
2035
2036 if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTexture, 0, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch, &textureData->mainResourceState)) {
2037 return false;
2038 }
2039
2040 if (!D3D12_UpdateTextureInternal(rendererData, textureData->mainTexture, 1, rect->x, rect->y, rect->w, rect->h, UVplane, UVpitch, &textureData->mainResourceState)) {
2041 return false;
2042 }
2043 return true;
2044}
2045#endif
2046
2047static bool D3D12_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
2048 const SDL_Rect *rect, void **pixels, int *pitch)
2049{
2050 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2051 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
2052 HRESULT result = S_OK;
2053
2054 D3D12_RESOURCE_DESC textureDesc;
2055 D3D12_RESOURCE_DESC uploadDesc;
2056 D3D12_HEAP_PROPERTIES heapProps;
2057 D3D12_SUBRESOURCE_FOOTPRINT pitchedDesc;
2058 BYTE *textureMemory;
2059 int bpp;
2060
2061 if (!textureData) {
2062 return SDL_SetError("Texture is not currently available");
2063 }
2064#ifdef SDL_HAVE_YUV
2065 if (textureData->yuv || textureData->nv12) {
2066 // It's more efficient to upload directly...
2067 if (!textureData->pixels) {
2068 textureData->pitch = texture->w;
2069 textureData->pixels = (Uint8 *)SDL_malloc((texture->h * textureData->pitch * 3) / 2);
2070 if (!textureData->pixels) {
2071 return false;
2072 }
2073 }
2074 textureData->lockedRect = *rect;
2075 *pixels =
2076 (void *)(textureData->pixels + rect->y * textureData->pitch +
2077 rect->x * SDL_BYTESPERPIXEL(texture->format));
2078 *pitch = textureData->pitch;
2079 return true;
2080 }
2081#endif
2082 if (textureData->stagingBuffer) {
2083 return SDL_SetError("texture is already locked");
2084 }
2085
2086 // Create an upload buffer, which will be used to write to the main texture.
2087 SDL_zero(textureDesc);
2088 D3D_CALL_RET(textureData->mainTexture, GetDesc, &textureDesc);
2089 textureDesc.Width = rect->w;
2090 textureDesc.Height = rect->h;
2091
2092 SDL_zero(uploadDesc);
2093 uploadDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
2094 uploadDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
2095 uploadDesc.Height = 1;
2096 uploadDesc.DepthOrArraySize = 1;
2097 uploadDesc.MipLevels = 1;
2098 uploadDesc.Format = DXGI_FORMAT_UNKNOWN;
2099 uploadDesc.SampleDesc.Count = 1;
2100 uploadDesc.SampleDesc.Quality = 0;
2101 uploadDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
2102 uploadDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
2103
2104 // Figure out how much we need to allocate for the upload buffer
2105 ID3D12Device1_GetCopyableFootprints(rendererData->d3dDevice,
2106 &textureDesc,
2107 0,
2108 1,
2109 0,
2110 NULL,
2111 NULL,
2112 NULL,
2113 &uploadDesc.Width);
2114
2115 SDL_zero(heapProps);
2116 heapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
2117 heapProps.CreationNodeMask = 1;
2118 heapProps.VisibleNodeMask = 1;
2119
2120 // Create the upload buffer
2121 result = ID3D12Device1_CreateCommittedResource(rendererData->d3dDevice,
2122 &heapProps,
2123 D3D12_HEAP_FLAG_NONE,
2124 &uploadDesc,
2125 D3D12_RESOURCE_STATE_GENERIC_READ,
2126 NULL,
2127 D3D_GUID(SDL_IID_ID3D12Resource),
2128 (void **)&textureData->stagingBuffer);
2129 if (FAILED(result)) {
2130 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateCommittedResource [create upload buffer]"), result);
2131 }
2132
2133 // Get a write-only pointer to data in the upload buffer:
2134 result = ID3D12Resource_Map(textureData->stagingBuffer,
2135 0,
2136 NULL,
2137 (void **)&textureMemory);
2138 if (FAILED(result)) {
2139 D3D_SAFE_RELEASE(rendererData->uploadBuffers[rendererData->currentUploadBuffer]);
2140 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Resource::Map [map staging texture]"), result);
2141 }
2142
2143 SDL_zero(pitchedDesc);
2144 pitchedDesc.Format = textureDesc.Format;
2145 pitchedDesc.Width = rect->w;
2146 pitchedDesc.Height = rect->h;
2147 pitchedDesc.Depth = 1;
2148 if (pitchedDesc.Format == DXGI_FORMAT_R8_UNORM) {
2149 bpp = 1;
2150 } else {
2151 bpp = 4;
2152 }
2153 pitchedDesc.RowPitch = D3D12_Align(rect->w * bpp, D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
2154
2155 /* Make note of where the staging texture will be written to
2156 * (on a call to SDL_UnlockTexture):
2157 */
2158 textureData->lockedRect = *rect;
2159
2160 /* Make sure the caller has information on the texture's pixel buffer,
2161 * then return:
2162 */
2163 *pixels = textureMemory;
2164 *pitch = pitchedDesc.RowPitch;
2165 return true;
2166}
2167
2168static void D3D12_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
2169{
2170 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2171 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
2172
2173 D3D12_RESOURCE_DESC textureDesc;
2174 D3D12_SUBRESOURCE_FOOTPRINT pitchedDesc;
2175 D3D12_PLACED_SUBRESOURCE_FOOTPRINT placedTextureDesc;
2176 D3D12_TEXTURE_COPY_LOCATION srcLocation;
2177 D3D12_TEXTURE_COPY_LOCATION dstLocation;
2178 int bpp;
2179
2180 if (!textureData) {
2181 return;
2182 }
2183#ifdef SDL_HAVE_YUV
2184 if (textureData->yuv || textureData->nv12) {
2185 const SDL_Rect *rect = &textureData->lockedRect;
2186 void *pixels =
2187 (void *)(textureData->pixels + rect->y * textureData->pitch +
2188 rect->x * SDL_BYTESPERPIXEL(texture->format));
2189 D3D12_UpdateTexture(renderer, texture, rect, pixels, textureData->pitch);
2190 return;
2191 }
2192#endif
2193 // Commit the pixel buffer's changes back to the staging texture:
2194 ID3D12Resource_Unmap(textureData->stagingBuffer, 0, NULL);
2195
2196 SDL_zero(textureDesc);
2197 D3D_CALL_RET(textureData->mainTexture, GetDesc, &textureDesc);
2198 textureDesc.Width = textureData->lockedRect.w;
2199 textureDesc.Height = textureData->lockedRect.h;
2200
2201 SDL_zero(pitchedDesc);
2202 pitchedDesc.Format = textureDesc.Format;
2203 pitchedDesc.Width = (UINT)textureDesc.Width;
2204 pitchedDesc.Height = textureDesc.Height;
2205 pitchedDesc.Depth = 1;
2206 if (pitchedDesc.Format == DXGI_FORMAT_R8_UNORM) {
2207 bpp = 1;
2208 } else {
2209 bpp = 4;
2210 }
2211 pitchedDesc.RowPitch = D3D12_Align(textureData->lockedRect.w * bpp, D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
2212
2213 SDL_zero(placedTextureDesc);
2214 placedTextureDesc.Offset = 0;
2215 placedTextureDesc.Footprint = pitchedDesc;
2216
2217 D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_COPY_DEST);
2218 textureData->mainResourceState = D3D12_RESOURCE_STATE_COPY_DEST;
2219
2220 SDL_zero(dstLocation);
2221 dstLocation.pResource = textureData->mainTexture;
2222 dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
2223 dstLocation.SubresourceIndex = 0;
2224
2225 SDL_zero(srcLocation);
2226 srcLocation.pResource = textureData->stagingBuffer;
2227 srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
2228 srcLocation.PlacedFootprint = placedTextureDesc;
2229
2230 ID3D12GraphicsCommandList2_CopyTextureRegion(rendererData->commandList,
2231 &dstLocation,
2232 textureData->lockedRect.x,
2233 textureData->lockedRect.y,
2234 0,
2235 &srcLocation,
2236 NULL);
2237
2238 // Transition the texture to be shader accessible
2239 D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
2240 textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
2241
2242 // Execute the command list before releasing the staging buffer
2243 D3D12_IssueBatch(rendererData);
2244 D3D_SAFE_RELEASE(textureData->stagingBuffer);
2245}
2246
2247static void D3D12_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
2248{
2249 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
2250
2251 if (!textureData) {
2252 return;
2253 }
2254
2255 textureData->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? D3D12_FILTER_MIN_MAG_MIP_POINT : D3D12_FILTER_MIN_MAG_MIP_LINEAR;
2256}
2257
2258static bool D3D12_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
2259{
2260 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2261 D3D12_TextureData *textureData = NULL;
2262
2263 if (!texture) {
2264 if (rendererData->textureRenderTarget) {
2265 D3D12_TransitionResource(rendererData,
2266 rendererData->textureRenderTarget->mainTexture,
2267 rendererData->textureRenderTarget->mainResourceState,
2268 D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
2269 rendererData->textureRenderTarget->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
2270 }
2271 rendererData->textureRenderTarget = NULL;
2272 return true;
2273 }
2274
2275 textureData = (D3D12_TextureData *)texture->internal;
2276
2277 if (!textureData->mainTextureRenderTargetView.ptr) {
2278 return SDL_SetError("specified texture is not a render target");
2279 }
2280
2281 rendererData->textureRenderTarget = textureData;
2282 D3D12_TransitionResource(rendererData,
2283 rendererData->textureRenderTarget->mainTexture,
2284 rendererData->textureRenderTarget->mainResourceState,
2285 D3D12_RESOURCE_STATE_RENDER_TARGET);
2286 rendererData->textureRenderTarget->mainResourceState = D3D12_RESOURCE_STATE_RENDER_TARGET;
2287
2288 return true;
2289}
2290
2291static bool D3D12_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
2292{
2293 return true; // nothing to do in this backend.
2294}
2295
2296static bool D3D12_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
2297{
2298 D3D12_VertexPositionColor *verts = (D3D12_VertexPositionColor *)SDL_AllocateRenderVertices(renderer, count * sizeof(D3D12_VertexPositionColor), 0, &cmd->data.draw.first);
2299 int i;
2300 SDL_FColor color = cmd->data.draw.color;
2301 bool convert_color = SDL_RenderingLinearSpace(renderer);
2302
2303 if (!verts) {
2304 return false;
2305 }
2306
2307 cmd->data.draw.count = count;
2308
2309 if (convert_color) {
2310 SDL_ConvertToLinear(&color);
2311 }
2312
2313 for (i = 0; i < count; i++) {
2314 verts->pos.x = points[i].x + 0.5f;
2315 verts->pos.y = points[i].y + 0.5f;
2316 verts->tex.x = 0.0f;
2317 verts->tex.y = 0.0f;
2318 verts->color = color;
2319 verts++;
2320 }
2321
2322 return true;
2323}
2324
2325static bool D3D12_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
2326 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
2327 int num_vertices, const void *indices, int num_indices, int size_indices,
2328 float scale_x, float scale_y)
2329{
2330 int i;
2331 int count = indices ? num_indices : num_vertices;
2332 D3D12_VertexPositionColor *verts = (D3D12_VertexPositionColor *)SDL_AllocateRenderVertices(renderer, count * sizeof(D3D12_VertexPositionColor), 0, &cmd->data.draw.first);
2333 bool convert_color = SDL_RenderingLinearSpace(renderer);
2334 D3D12_TextureData *textureData = texture ? (D3D12_TextureData *)texture->internal : NULL;
2335 float u_scale = textureData ? (float)texture->w / textureData->w : 0.0f;
2336 float v_scale = textureData ? (float)texture->h / textureData->h : 0.0f;
2337
2338 if (!verts) {
2339 return false;
2340 }
2341
2342 cmd->data.draw.count = count;
2343 size_indices = indices ? size_indices : 0;
2344
2345 for (i = 0; i < count; i++) {
2346 int j;
2347 float *xy_;
2348 if (size_indices == 4) {
2349 j = ((const Uint32 *)indices)[i];
2350 } else if (size_indices == 2) {
2351 j = ((const Uint16 *)indices)[i];
2352 } else if (size_indices == 1) {
2353 j = ((const Uint8 *)indices)[i];
2354 } else {
2355 j = i;
2356 }
2357
2358 xy_ = (float *)((char *)xy + j * xy_stride);
2359
2360 verts->pos.x = xy_[0] * scale_x;
2361 verts->pos.y = xy_[1] * scale_y;
2362 verts->color = *(SDL_FColor *)((char *)color + j * color_stride);
2363 if (convert_color) {
2364 SDL_ConvertToLinear(&verts->color);
2365 }
2366
2367 if (texture) {
2368 float *uv_ = (float *)((char *)uv + j * uv_stride);
2369 verts->tex.x = uv_[0] * u_scale;
2370 verts->tex.y = uv_[1] * v_scale;
2371 } else {
2372 verts->tex.x = 0.0f;
2373 verts->tex.y = 0.0f;
2374 }
2375
2376 verts += 1;
2377 }
2378 return true;
2379}
2380
2381static bool D3D12_UpdateVertexBuffer(SDL_Renderer *renderer,
2382 const void *vertexData, size_t dataSizeInBytes)
2383{
2384 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2385 HRESULT result = S_OK;
2386 const int vbidx = rendererData->currentVertexBuffer;
2387 UINT8 *vertexBufferData = NULL;
2388 D3D12_RANGE range;
2389 ID3D12Resource *vertexBuffer;
2390
2391 range.Begin = 0;
2392 range.End = 0;
2393
2394 if (dataSizeInBytes == 0) {
2395 return true; // nothing to do.
2396 }
2397
2398 if (rendererData->issueBatch) {
2399 if (FAILED(D3D12_IssueBatch(rendererData))) {
2400 return SDL_SetError("Failed to issue intermediate batch");
2401 }
2402 }
2403
2404 // If the existing vertex buffer isn't big enough, we need to recreate a big enough one
2405 if (dataSizeInBytes > rendererData->vertexBuffers[vbidx].size) {
2406 D3D12_CreateVertexBuffer(rendererData, vbidx, dataSizeInBytes);
2407 }
2408
2409 vertexBuffer = rendererData->vertexBuffers[vbidx].resource;
2410 result = ID3D12Resource_Map(vertexBuffer, 0, &range, (void **)&vertexBufferData);
2411 if (FAILED(result)) {
2412 return WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Resource::Map [vertex buffer]"), result);
2413 }
2414 SDL_memcpy(vertexBufferData, vertexData, dataSizeInBytes);
2415 ID3D12Resource_Unmap(vertexBuffer, 0, NULL);
2416
2417 rendererData->vertexBuffers[vbidx].view.SizeInBytes = (UINT)dataSizeInBytes;
2418
2419 ID3D12GraphicsCommandList2_IASetVertexBuffers(rendererData->commandList, 0, 1, &rendererData->vertexBuffers[vbidx].view);
2420
2421 rendererData->currentVertexBuffer++;
2422 if (rendererData->currentVertexBuffer >= SDL_D3D12_NUM_VERTEX_BUFFERS) {
2423 rendererData->currentVertexBuffer = 0;
2424 rendererData->issueBatch = true;
2425 }
2426
2427 return true;
2428}
2429
2430static bool D3D12_UpdateViewport(SDL_Renderer *renderer)
2431{
2432 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
2433 const SDL_Rect *viewport = &data->currentViewport;
2434 Float4X4 projection;
2435 Float4X4 view;
2436 SDL_FRect orientationAlignedViewport;
2437 BOOL swapDimensions;
2438 D3D12_VIEWPORT d3dviewport;
2439 const int rotation = D3D12_GetRotationForCurrentRenderTarget(renderer);
2440
2441 if (viewport->w == 0 || viewport->h == 0) {
2442 /* If the viewport is empty, assume that it is because
2443 * SDL_CreateRenderer is calling it, and will call it again later
2444 * with a non-empty viewport.
2445 */
2446 // SDL_Log("%s, no viewport was set!", __FUNCTION__);
2447 return false;
2448 }
2449
2450 /* Make sure the SDL viewport gets rotated to that of the physical display's rotation.
2451 * Keep in mind here that the Y-axis will be been inverted (from Direct3D's
2452 * default coordinate system) so rotations will be done in the opposite
2453 * direction of the DXGI_MODE_ROTATION enumeration.
2454 */
2455 switch (rotation) {
2456 case DXGI_MODE_ROTATION_IDENTITY:
2457 projection = MatrixIdentity();
2458 break;
2459 case DXGI_MODE_ROTATION_ROTATE270:
2460 projection = MatrixRotationZ(SDL_PI_F * 0.5f);
2461 break;
2462 case DXGI_MODE_ROTATION_ROTATE180:
2463 projection = MatrixRotationZ(SDL_PI_F);
2464 break;
2465 case DXGI_MODE_ROTATION_ROTATE90:
2466 projection = MatrixRotationZ(-SDL_PI_F * 0.5f);
2467 break;
2468 default:
2469 return SDL_SetError("An unknown DisplayOrientation is being used");
2470 }
2471
2472 // Update the view matrix
2473 SDL_zero(view);
2474 view.m[0][0] = 2.0f / viewport->w;
2475 view.m[1][1] = -2.0f / viewport->h;
2476 view.m[2][2] = 1.0f;
2477 view.m[3][0] = -1.0f;
2478 view.m[3][1] = 1.0f;
2479 view.m[3][3] = 1.0f;
2480
2481 /* Combine the projection + view matrix together now, as both only get
2482 * set here (as of this writing, on Dec 26, 2013). When done, store it
2483 * for eventual transfer to the GPU.
2484 */
2485 data->vertexShaderConstantsData.projectionAndView = MatrixMultiply(
2486 view,
2487 projection);
2488
2489 /* Update the Direct3D viewport, which seems to be aligned to the
2490 * swap buffer's coordinate space, which is always in either
2491 * a landscape mode, for all Windows 8/RT devices, or a portrait mode,
2492 * for Windows Phone devices.
2493 */
2494 swapDimensions = D3D12_IsDisplayRotated90Degrees((DXGI_MODE_ROTATION)rotation);
2495 if (swapDimensions) {
2496 orientationAlignedViewport.x = (float)viewport->y;
2497 orientationAlignedViewport.y = (float)viewport->x;
2498 orientationAlignedViewport.w = (float)viewport->h;
2499 orientationAlignedViewport.h = (float)viewport->w;
2500 } else {
2501 orientationAlignedViewport.x = (float)viewport->x;
2502 orientationAlignedViewport.y = (float)viewport->y;
2503 orientationAlignedViewport.w = (float)viewport->w;
2504 orientationAlignedViewport.h = (float)viewport->h;
2505 }
2506
2507 d3dviewport.TopLeftX = orientationAlignedViewport.x;
2508 d3dviewport.TopLeftY = orientationAlignedViewport.y;
2509 d3dviewport.Width = orientationAlignedViewport.w;
2510 d3dviewport.Height = orientationAlignedViewport.h;
2511 d3dviewport.MinDepth = 0.0f;
2512 d3dviewport.MaxDepth = 1.0f;
2513 // SDL_Log("%s: D3D viewport = {%f,%f,%f,%f}", __FUNCTION__, d3dviewport.TopLeftX, d3dviewport.TopLeftY, d3dviewport.Width, d3dviewport.Height);
2514 ID3D12GraphicsCommandList_RSSetViewports(data->commandList, 1, &d3dviewport);
2515
2516 data->viewportDirty = false;
2517
2518 return true;
2519}
2520
2521static void D3D12_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const SDL_Texture *texture, D3D12_PixelShaderConstants *constants)
2522{
2523 float output_headroom;
2524
2525 SDL_zerop(constants);
2526
2527 constants->scRGB_output = (float)SDL_RenderingLinearSpace(renderer);
2528 constants->color_scale = cmd->data.draw.color_scale;
2529
2530 if (texture) {
2531 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
2532
2533 switch (texture->format) {
2534 case SDL_PIXELFORMAT_YV12:
2535 case SDL_PIXELFORMAT_IYUV:
2536 constants->texture_type = TEXTURETYPE_YUV;
2537 constants->input_type = INPUTTYPE_SRGB;
2538 break;
2539 case SDL_PIXELFORMAT_NV12:
2540 constants->texture_type = TEXTURETYPE_NV12;
2541 constants->input_type = INPUTTYPE_SRGB;
2542 break;
2543 case SDL_PIXELFORMAT_NV21:
2544 constants->texture_type = TEXTURETYPE_NV21;
2545 constants->input_type = INPUTTYPE_SRGB;
2546 break;
2547 case SDL_PIXELFORMAT_P010:
2548 constants->texture_type = TEXTURETYPE_NV12;
2549 constants->input_type = INPUTTYPE_HDR10;
2550 break;
2551 default:
2552 constants->texture_type = TEXTURETYPE_RGB;
2553 if (texture->colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
2554 constants->input_type = INPUTTYPE_SCRGB;
2555 } else if (texture->colorspace == SDL_COLORSPACE_HDR10) {
2556 constants->input_type = INPUTTYPE_HDR10;
2557 } else {
2558 // The sampler will convert from sRGB to linear on load if working in linear colorspace
2559 constants->input_type = INPUTTYPE_UNSPECIFIED;
2560 }
2561 break;
2562 }
2563
2564 constants->sdr_white_point = texture->SDR_white_point;
2565
2566 if (renderer->target) {
2567 output_headroom = renderer->target->HDR_headroom;
2568 } else {
2569 output_headroom = renderer->HDR_headroom;
2570 }
2571
2572 if (texture->HDR_headroom > output_headroom) {
2573 constants->tonemap_method = TONEMAP_CHROME;
2574 constants->tonemap_factor1 = (output_headroom / (texture->HDR_headroom * texture->HDR_headroom));
2575 constants->tonemap_factor2 = (1.0f / output_headroom);
2576 }
2577
2578 if (textureData->YCbCr_matrix) {
2579 SDL_memcpy(constants->YCbCr_matrix, textureData->YCbCr_matrix, sizeof(constants->YCbCr_matrix));
2580 }
2581 }
2582}
2583
2584static bool D3D12_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, D3D12_Shader shader, const D3D12_PixelShaderConstants *shader_constants,
2585 D3D12_PRIMITIVE_TOPOLOGY_TYPE topology,
2586 const int numShaderResources, D3D12_CPU_DESCRIPTOR_HANDLE *shaderResources,
2587 D3D12_CPU_DESCRIPTOR_HANDLE *sampler, const Float4X4 *matrix)
2588
2589{
2590 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2591 const Float4X4 *newmatrix = matrix ? matrix : &rendererData->identity;
2592 D3D12_CPU_DESCRIPTOR_HANDLE renderTargetView = D3D12_GetCurrentRenderTargetView(renderer);
2593 const SDL_BlendMode blendMode = cmd->data.draw.blend;
2594 bool updateSubresource = false;
2595 int i;
2596 D3D12_CPU_DESCRIPTOR_HANDLE firstShaderResource;
2597 DXGI_FORMAT rtvFormat = rendererData->renderTargetFormat;
2598 D3D12_PipelineState *currentPipelineState = rendererData->currentPipelineState;;
2599 D3D12_PixelShaderConstants solid_constants;
2600
2601 if (rendererData->textureRenderTarget) {
2602 rtvFormat = rendererData->textureRenderTarget->mainTextureFormat;
2603 }
2604
2605 // See if we need to change the pipeline state
2606 if (!currentPipelineState ||
2607 currentPipelineState->shader != shader ||
2608 currentPipelineState->blendMode != blendMode ||
2609 currentPipelineState->topology != topology ||
2610 currentPipelineState->rtvFormat != rtvFormat) {
2611
2612 /* Find the matching pipeline.
2613 NOTE: Although it may seem inefficient to linearly search through ~450 pipelines
2614 to find the correct one, in profiling this doesn't come up at all.
2615 It's unlikely that using a hash table would affect performance a measurable amount unless
2616 it's a degenerate case that's changing the pipeline state dozens of times per frame.
2617 */
2618 currentPipelineState = NULL;
2619 for (i = 0; i < rendererData->pipelineStateCount; ++i) {
2620 D3D12_PipelineState *candidatePiplineState = &rendererData->pipelineStates[i];
2621 if (candidatePiplineState->shader == shader &&
2622 candidatePiplineState->blendMode == blendMode &&
2623 candidatePiplineState->topology == topology &&
2624 candidatePiplineState->rtvFormat == rtvFormat) {
2625 currentPipelineState = candidatePiplineState;
2626 break;
2627 }
2628 }
2629
2630 // If we didn't find a match, create a new one -- it must mean the blend mode is non-standard
2631 if (!currentPipelineState) {
2632 currentPipelineState = D3D12_CreatePipelineState(renderer, shader, blendMode, topology, rtvFormat);
2633 }
2634
2635 if (!currentPipelineState) {
2636 // The error has been set inside D3D12_CreatePipelineState()
2637 return false;
2638 }
2639
2640 ID3D12GraphicsCommandList2_SetPipelineState(rendererData->commandList, currentPipelineState->pipelineState);
2641 ID3D12GraphicsCommandList2_SetGraphicsRootSignature(rendererData->commandList,
2642 rendererData->rootSignatures[D3D12_GetRootSignatureType(currentPipelineState->shader)]);
2643 // When we change these we will need to re-upload the constant buffer and reset any descriptors
2644 updateSubresource = true;
2645 rendererData->currentSampler.ptr = 0;
2646 rendererData->currentShaderResource.ptr = 0;
2647 rendererData->currentPipelineState = currentPipelineState;
2648 }
2649
2650 if (renderTargetView.ptr != rendererData->currentRenderTargetView.ptr) {
2651 ID3D12GraphicsCommandList2_OMSetRenderTargets(rendererData->commandList, 1, &renderTargetView, FALSE, NULL);
2652 rendererData->currentRenderTargetView = renderTargetView;
2653 }
2654
2655 if (rendererData->viewportDirty) {
2656 if (D3D12_UpdateViewport(renderer)) {
2657 // vertexShaderConstantsData.projectionAndView has changed
2658 updateSubresource = true;
2659 }
2660 }
2661
2662 if (rendererData->cliprectDirty) {
2663 D3D12_RECT scissorRect;
2664 if (!D3D12_GetViewportAlignedD3DRect(renderer, &rendererData->currentCliprect, &scissorRect, TRUE)) {
2665 // D3D12_GetViewportAlignedD3DRect will have set the SDL error
2666 return false;
2667 }
2668 ID3D12GraphicsCommandList2_RSSetScissorRects(rendererData->commandList, 1, &scissorRect);
2669 rendererData->cliprectDirty = false;
2670 }
2671
2672 if (numShaderResources > 0) {
2673 firstShaderResource = shaderResources[0];
2674 } else {
2675 firstShaderResource.ptr = 0;
2676 }
2677 if (firstShaderResource.ptr != rendererData->currentShaderResource.ptr) {
2678 for (i = 0; i < numShaderResources; ++i) {
2679 D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle = D3D12_CPUtoGPUHandle(rendererData->srvDescriptorHeap, shaderResources[i]);
2680 ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(rendererData->commandList, i + 2, GPUHandle);
2681 }
2682 rendererData->currentShaderResource.ptr = firstShaderResource.ptr;
2683 }
2684
2685 if (sampler && sampler->ptr != rendererData->currentSampler.ptr) {
2686 D3D12_GPU_DESCRIPTOR_HANDLE GPUHandle = D3D12_CPUtoGPUHandle(rendererData->samplerDescriptorHeap, *sampler);
2687 UINT tableIndex = 0;
2688
2689 // Figure out the correct sampler descriptor table index based on the type of shader
2690 switch (shader) {
2691 case SHADER_RGB:
2692 tableIndex = 3;
2693 break;
2694 case SHADER_ADVANCED:
2695 tableIndex = 5;
2696 break;
2697 default:
2698 return SDL_SetError("[direct3d12] Trying to set a sampler for a shader which doesn't have one");
2699 break;
2700 }
2701
2702 ID3D12GraphicsCommandList2_SetGraphicsRootDescriptorTable(rendererData->commandList, tableIndex, GPUHandle);
2703 rendererData->currentSampler = *sampler;
2704 }
2705
2706 if (updateSubresource == true || SDL_memcmp(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix)) != 0) {
2707 SDL_memcpy(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix));
2708 ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstants(rendererData->commandList,
2709 0,
2710 32,
2711 &rendererData->vertexShaderConstantsData,
2712 0);
2713 }
2714
2715 if (!shader_constants) {
2716 D3D12_SetupShaderConstants(renderer, cmd, NULL, &solid_constants);
2717 shader_constants = &solid_constants;
2718 }
2719
2720 if (updateSubresource == true ||
2721 SDL_memcmp(shader_constants, &currentPipelineState->shader_constants, sizeof(*shader_constants)) != 0) {
2722 ID3D12GraphicsCommandList2_SetGraphicsRoot32BitConstants(rendererData->commandList,
2723 1,
2724 sizeof(*shader_constants) / sizeof(float),
2725 shader_constants,
2726 0);
2727
2728 SDL_memcpy(&currentPipelineState->shader_constants, shader_constants, sizeof(*shader_constants));
2729 }
2730
2731 return true;
2732}
2733
2734static bool D3D12_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const Float4X4 *matrix)
2735{
2736 SDL_Texture *texture = cmd->data.draw.texture;
2737 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2738 D3D12_TextureData *textureData = (D3D12_TextureData *)texture->internal;
2739 D3D12_CPU_DESCRIPTOR_HANDLE *textureSampler;
2740 D3D12_PixelShaderConstants constants;
2741
2742 if (!textureData) {
2743 return SDL_SetError("Texture is not currently available");
2744 }
2745
2746 D3D12_SetupShaderConstants(renderer, cmd, texture, &constants);
2747
2748 switch (textureData->scaleMode) {
2749 case D3D12_FILTER_MIN_MAG_MIP_POINT:
2750 switch (cmd->data.draw.texture_address_mode) {
2751 case SDL_TEXTURE_ADDRESS_CLAMP:
2752 textureSampler = &rendererData->samplers[D3D12_SAMPLER_NEAREST_CLAMP];
2753 break;
2754 case SDL_TEXTURE_ADDRESS_WRAP:
2755 textureSampler = &rendererData->samplers[D3D12_SAMPLER_NEAREST_WRAP];
2756 break;
2757 default:
2758 return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
2759 }
2760 break;
2761 case D3D12_FILTER_MIN_MAG_MIP_LINEAR:
2762 switch (cmd->data.draw.texture_address_mode) {
2763 case SDL_TEXTURE_ADDRESS_CLAMP:
2764 textureSampler = &rendererData->samplers[D3D12_SAMPLER_LINEAR_CLAMP];
2765 break;
2766 case SDL_TEXTURE_ADDRESS_WRAP:
2767 textureSampler = &rendererData->samplers[D3D12_SAMPLER_LINEAR_WRAP];
2768 break;
2769 default:
2770 return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
2771 }
2772 break;
2773 default:
2774 return SDL_SetError("Unknown scale mode: %d", textureData->scaleMode);
2775 }
2776#ifdef SDL_HAVE_YUV
2777 if (textureData->yuv) {
2778 D3D12_CPU_DESCRIPTOR_HANDLE shaderResources[3];
2779
2780 shaderResources[0] = textureData->mainTextureResourceView;
2781 shaderResources[1] = textureData->mainTextureResourceViewU;
2782 shaderResources[2] = textureData->mainTextureResourceViewV;
2783
2784 // Make sure each texture is in the correct state to be accessed by the pixel shader.
2785 D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
2786 textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
2787 D3D12_TransitionResource(rendererData, textureData->mainTextureU, textureData->mainResourceStateU, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
2788 textureData->mainResourceStateU = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
2789 D3D12_TransitionResource(rendererData, textureData->mainTextureV, textureData->mainResourceStateV, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
2790 textureData->mainResourceStateV = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
2791
2792 return D3D12_SetDrawState(renderer, cmd, textureData->shader, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
2793 } else if (textureData->nv12) {
2794 D3D12_CPU_DESCRIPTOR_HANDLE shaderResources[2];
2795
2796 shaderResources[0] = textureData->mainTextureResourceView;
2797 shaderResources[1] = textureData->mainTextureResourceViewNV;
2798
2799 // Make sure each texture is in the correct state to be accessed by the pixel shader.
2800 D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
2801 textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
2802
2803 return D3D12_SetDrawState(renderer, cmd, textureData->shader, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, SDL_arraysize(shaderResources), shaderResources, textureSampler, matrix);
2804 }
2805#endif // SDL_HAVE_YUV
2806 D3D12_TransitionResource(rendererData, textureData->mainTexture, textureData->mainResourceState, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
2807 textureData->mainResourceState = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
2808 return D3D12_SetDrawState(renderer, cmd, textureData->shader, &constants, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 1, &textureData->mainTextureResourceView, textureSampler, matrix);
2809}
2810
2811static void D3D12_DrawPrimitives(SDL_Renderer *renderer, D3D12_PRIMITIVE_TOPOLOGY primitiveTopology, const size_t vertexStart, const size_t vertexCount)
2812{
2813 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2814 ID3D12GraphicsCommandList2_IASetPrimitiveTopology(rendererData->commandList, primitiveTopology);
2815 ID3D12GraphicsCommandList2_DrawInstanced(rendererData->commandList, (UINT)vertexCount, 1, (UINT)vertexStart, 0);
2816}
2817
2818static void D3D12_InvalidateCachedState(SDL_Renderer *renderer)
2819{
2820 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
2821 data->currentRenderTargetView.ptr = 0;
2822 data->currentShaderResource.ptr = 0;
2823 data->currentSampler.ptr = 0;
2824 data->cliprectDirty = true;
2825 data->viewportDirty = true;
2826}
2827
2828static bool D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
2829{
2830 D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->internal;
2831 const int viewportRotation = D3D12_GetRotationForCurrentRenderTarget(renderer);
2832
2833 if (!rendererData->d3dDevice) {
2834 return SDL_SetError("Device lost and couldn't be recovered");
2835 }
2836
2837 if (rendererData->pixelSizeChanged) {
2838 D3D12_UpdateForWindowSizeChange(renderer);
2839 rendererData->pixelSizeChanged = false;
2840 }
2841
2842 if (rendererData->currentViewportRotation != viewportRotation) {
2843 rendererData->currentViewportRotation = viewportRotation;
2844 rendererData->viewportDirty = true;
2845 }
2846
2847 if (!D3D12_UpdateVertexBuffer(renderer, vertices, vertsize)) {
2848 return false;
2849 }
2850
2851 while (cmd) {
2852 switch (cmd->command) {
2853 case SDL_RENDERCMD_SETDRAWCOLOR:
2854 {
2855 break; // this isn't currently used in this render backend.
2856 }
2857
2858 case SDL_RENDERCMD_SETVIEWPORT:
2859 {
2860 SDL_Rect *viewport = &rendererData->currentViewport;
2861 if (SDL_memcmp(viewport, &cmd->data.viewport.rect, sizeof(cmd->data.viewport.rect)) != 0) {
2862 SDL_copyp(viewport, &cmd->data.viewport.rect);
2863 rendererData->viewportDirty = true;
2864 rendererData->cliprectDirty = true;
2865 }
2866 break;
2867 }
2868
2869 case SDL_RENDERCMD_SETCLIPRECT:
2870 {
2871 const SDL_Rect *rect = &cmd->data.cliprect.rect;
2872 SDL_Rect viewport_cliprect;
2873 if (rendererData->currentCliprectEnabled != cmd->data.cliprect.enabled) {
2874 rendererData->currentCliprectEnabled = cmd->data.cliprect.enabled;
2875 rendererData->cliprectDirty = true;
2876 }
2877 if (!rendererData->currentCliprectEnabled) {
2878 /* If the clip rect is disabled, then the scissor rect should be the whole viewport,
2879 since direct3d12 doesn't allow disabling the scissor rectangle */
2880 viewport_cliprect.x = 0;
2881 viewport_cliprect.y = 0;
2882 viewport_cliprect.w = rendererData->currentViewport.w;
2883 viewport_cliprect.h = rendererData->currentViewport.h;
2884 rect = &viewport_cliprect;
2885 }
2886 if (SDL_memcmp(&rendererData->currentCliprect, rect, sizeof(*rect)) != 0) {
2887 SDL_copyp(&rendererData->currentCliprect, rect);
2888 rendererData->cliprectDirty = true;
2889 }
2890 break;
2891 }
2892
2893 case SDL_RENDERCMD_CLEAR:
2894 {
2895 D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor = D3D12_GetCurrentRenderTargetView(renderer);
2896 bool convert_color = SDL_RenderingLinearSpace(renderer);
2897 SDL_FColor color = cmd->data.color.color;
2898 if (convert_color) {
2899 SDL_ConvertToLinear(&color);
2900 }
2901 color.r *= cmd->data.color.color_scale;
2902 color.g *= cmd->data.color.color_scale;
2903 color.b *= cmd->data.color.color_scale;
2904 ID3D12GraphicsCommandList2_ClearRenderTargetView(rendererData->commandList, rtvDescriptor, &color.r, 0, NULL);
2905 break;
2906 }
2907
2908 case SDL_RENDERCMD_DRAW_POINTS:
2909 {
2910 const size_t count = cmd->data.draw.count;
2911 const size_t first = cmd->data.draw.first;
2912 const size_t start = first / sizeof(D3D12_VertexPositionColor);
2913 D3D12_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT, 0, NULL, NULL, NULL);
2914 D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_POINTLIST, start, count);
2915 break;
2916 }
2917
2918 case SDL_RENDERCMD_DRAW_LINES:
2919 {
2920 const size_t count = cmd->data.draw.count;
2921 const size_t first = cmd->data.draw.first;
2922 const size_t start = first / sizeof(D3D12_VertexPositionColor);
2923 const D3D12_VertexPositionColor *verts = (D3D12_VertexPositionColor *)(((Uint8 *)vertices) + first);
2924 D3D12_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE, 0, NULL, NULL, NULL);
2925 D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_LINESTRIP, start, count);
2926 if (verts[0].pos.x != verts[count - 1].pos.x || verts[0].pos.y != verts[count - 1].pos.y) {
2927 D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_POINTLIST, start + (count - 1), 1);
2928 }
2929 break;
2930 }
2931
2932 case SDL_RENDERCMD_FILL_RECTS: // unused
2933 break;
2934
2935 case SDL_RENDERCMD_COPY: // unused
2936 break;
2937
2938 case SDL_RENDERCMD_COPY_EX: // unused
2939 break;
2940
2941 case SDL_RENDERCMD_GEOMETRY:
2942 {
2943 SDL_Texture *texture = cmd->data.draw.texture;
2944 const size_t count = cmd->data.draw.count;
2945 const size_t first = cmd->data.draw.first;
2946 const size_t start = first / sizeof(D3D12_VertexPositionColor);
2947
2948 if (texture) {
2949 D3D12_SetCopyState(renderer, cmd, NULL);
2950 } else {
2951 D3D12_SetDrawState(renderer, cmd, SHADER_SOLID, NULL, D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, 0, NULL, NULL, NULL);
2952 }
2953
2954 D3D12_DrawPrimitives(renderer, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, start, count);
2955 break;
2956 }
2957
2958 case SDL_RENDERCMD_NO_OP:
2959 break;
2960 }
2961
2962 cmd = cmd->next;
2963 }
2964
2965 return true;
2966}
2967
2968static SDL_Surface *D3D12_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
2969{
2970 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
2971 ID3D12Resource *backBuffer = NULL;
2972 ID3D12Resource *readbackBuffer = NULL;
2973 HRESULT result;
2974 D3D12_RESOURCE_DESC textureDesc;
2975 D3D12_RESOURCE_DESC readbackDesc;
2976 D3D12_HEAP_PROPERTIES heapProps;
2977 D3D12_RECT srcRect = { 0, 0, 0, 0 };
2978 D3D12_BOX srcBox;
2979 D3D12_TEXTURE_COPY_LOCATION dstLocation;
2980 D3D12_TEXTURE_COPY_LOCATION srcLocation;
2981 D3D12_PLACED_SUBRESOURCE_FOOTPRINT placedTextureDesc;
2982 D3D12_SUBRESOURCE_FOOTPRINT pitchedDesc;
2983 BYTE *textureMemory;
2984 int bpp;
2985 SDL_Surface *output = NULL;
2986
2987 if (data->textureRenderTarget) {
2988 backBuffer = data->textureRenderTarget->mainTexture;
2989 } else {
2990 backBuffer = data->renderTargets[data->currentBackBufferIndex];
2991 }
2992
2993 // Create a staging texture to copy the screen's data to:
2994 SDL_zero(textureDesc);
2995 D3D_CALL_RET(backBuffer, GetDesc, &textureDesc);
2996 textureDesc.Width = rect->w;
2997 textureDesc.Height = rect->h;
2998
2999 SDL_zero(readbackDesc);
3000 readbackDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
3001 readbackDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
3002 readbackDesc.Height = 1;
3003 readbackDesc.DepthOrArraySize = 1;
3004 readbackDesc.MipLevels = 1;
3005 readbackDesc.Format = DXGI_FORMAT_UNKNOWN;
3006 readbackDesc.SampleDesc.Count = 1;
3007 readbackDesc.SampleDesc.Quality = 0;
3008 readbackDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
3009 readbackDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
3010
3011 // Figure out how much we need to allocate for the upload buffer
3012 ID3D12Device1_GetCopyableFootprints(data->d3dDevice,
3013 &textureDesc,
3014 0,
3015 1,
3016 0,
3017 NULL,
3018 NULL,
3019 NULL,
3020 &readbackDesc.Width);
3021
3022 SDL_zero(heapProps);
3023 heapProps.Type = D3D12_HEAP_TYPE_READBACK;
3024 heapProps.CreationNodeMask = 1;
3025 heapProps.VisibleNodeMask = 1;
3026
3027 result = ID3D12Device1_CreateCommittedResource(data->d3dDevice,
3028 &heapProps,
3029 D3D12_HEAP_FLAG_NONE,
3030 &readbackDesc,
3031 D3D12_RESOURCE_STATE_COPY_DEST,
3032 NULL,
3033 D3D_GUID(SDL_IID_ID3D12Resource),
3034 (void **)&readbackBuffer);
3035 if (FAILED(result)) {
3036 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Device::CreateTexture2D [create staging texture]"), result);
3037 goto done;
3038 }
3039
3040 // Transition the render target to be copyable from
3041 D3D12_TransitionResource(data, backBuffer, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
3042
3043 // Copy the desired portion of the back buffer to the staging texture:
3044 if (!D3D12_GetViewportAlignedD3DRect(renderer, rect, &srcRect, FALSE)) {
3045 // D3D12_GetViewportAlignedD3DRect will have set the SDL error
3046 goto done;
3047 }
3048 srcBox.left = srcRect.left;
3049 srcBox.right = srcRect.right;
3050 srcBox.top = srcRect.top;
3051 srcBox.bottom = srcRect.bottom;
3052 srcBox.front = 0;
3053 srcBox.back = 1;
3054
3055 // Issue the copy texture region
3056 SDL_zero(pitchedDesc);
3057 pitchedDesc.Format = textureDesc.Format;
3058 pitchedDesc.Width = (UINT)textureDesc.Width;
3059 pitchedDesc.Height = textureDesc.Height;
3060 pitchedDesc.Depth = 1;
3061 bpp = SDL_BYTESPERPIXEL(D3D12_DXGIFormatToSDLPixelFormat(pitchedDesc.Format));
3062 pitchedDesc.RowPitch = D3D12_Align(pitchedDesc.Width * bpp, D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
3063
3064 SDL_zero(placedTextureDesc);
3065 placedTextureDesc.Offset = 0;
3066 placedTextureDesc.Footprint = pitchedDesc;
3067
3068 SDL_zero(dstLocation);
3069 dstLocation.pResource = readbackBuffer;
3070 dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
3071 dstLocation.PlacedFootprint = placedTextureDesc;
3072
3073 SDL_zero(srcLocation);
3074 srcLocation.pResource = backBuffer;
3075 srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
3076 srcLocation.SubresourceIndex = 0;
3077
3078 ID3D12GraphicsCommandList2_CopyTextureRegion(data->commandList,
3079 &dstLocation,
3080 0, 0, 0,
3081 &srcLocation,
3082 &srcBox);
3083
3084 // We need to issue the command list for the copy to finish
3085 D3D12_IssueBatch(data);
3086
3087 // Transition the render target back to a render target
3088 D3D12_TransitionResource(data, backBuffer, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
3089
3090 // Map the staging texture's data to CPU-accessible memory:
3091 result = ID3D12Resource_Map(readbackBuffer,
3092 0,
3093 NULL,
3094 (void **)&textureMemory);
3095 if (FAILED(result)) {
3096 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("ID3D12Resource::Map [map staging texture]"), result);
3097 goto done;
3098 }
3099
3100 output = SDL_DuplicatePixels(
3101 rect->w, rect->h,
3102 D3D12_DXGIFormatToSDLPixelFormat(textureDesc.Format),
3103 renderer->target ? renderer->target->colorspace : renderer->output_colorspace,
3104 textureMemory,
3105 pitchedDesc.RowPitch);
3106
3107 // Unmap the texture:
3108 ID3D12Resource_Unmap(readbackBuffer, 0, NULL);
3109
3110done:
3111 D3D_SAFE_RELEASE(readbackBuffer);
3112 return output;
3113}
3114
3115static bool D3D12_RenderPresent(SDL_Renderer *renderer)
3116{
3117 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
3118 HRESULT result;
3119
3120 if (!data->d3dDevice) {
3121 return SDL_SetError("Device lost and couldn't be recovered");
3122 }
3123
3124 // Transition the render target to present state
3125 D3D12_TransitionResource(data,
3126 data->renderTargets[data->currentBackBufferIndex],
3127 D3D12_RESOURCE_STATE_RENDER_TARGET,
3128 D3D12_RESOURCE_STATE_PRESENT);
3129
3130 // Issue the command list
3131 result = ID3D12GraphicsCommandList2_Close(data->commandList);
3132 ID3D12CommandQueue_ExecuteCommandLists(data->commandQueue, 1, (ID3D12CommandList *const *)&data->commandList);
3133
3134#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
3135 result = D3D12_XBOX_PresentFrame(data->commandQueue, data->frameToken, data->renderTargets[data->currentBackBufferIndex]);
3136#else
3137 /* The application may optionally specify "dirty" or "scroll"
3138 * rects to improve efficiency in certain scenarios.
3139 */
3140 result = IDXGISwapChain_Present(data->swapChain, data->syncInterval, data->presentFlags);
3141#endif
3142
3143 if (FAILED(result) && result != DXGI_ERROR_WAS_STILL_DRAWING) {
3144 /* If the device was removed either by a disconnect or a driver upgrade, we
3145 * must recreate all device resources.
3146 */
3147 if (result == DXGI_ERROR_DEVICE_REMOVED) {
3148 if (D3D12_HandleDeviceLost(renderer)) {
3149 SDL_SetError("Present failed, device lost");
3150 } else {
3151 // Recovering from device lost failed, error is already set
3152 }
3153 } else if (result == DXGI_ERROR_INVALID_CALL) {
3154 // We probably went through a fullscreen <-> windowed transition
3155 D3D12_CreateWindowSizeDependentResources(renderer);
3156 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain::Present"), result);
3157 } else {
3158 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("IDXGISwapChain::Present"), result);
3159 }
3160 return false;
3161 } else {
3162 // Wait for the GPU and move to the next frame
3163 result = ID3D12CommandQueue_Signal(data->commandQueue, data->fence, data->fenceValue);
3164
3165 if (ID3D12Fence_GetCompletedValue(data->fence) < data->fenceValue) {
3166 result = ID3D12Fence_SetEventOnCompletion(data->fence,
3167 data->fenceValue,
3168 data->fenceEvent);
3169 WaitForSingleObjectEx(data->fenceEvent, INFINITE, FALSE);
3170 }
3171
3172 data->fenceValue++;
3173#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
3174 data->currentBackBufferIndex++;
3175 data->currentBackBufferIndex %= SDL_D3D12_NUM_BUFFERS;
3176#else
3177 data->currentBackBufferIndex = IDXGISwapChain4_GetCurrentBackBufferIndex(data->swapChain);
3178#endif
3179
3180 // Reset the command allocator and command list, and transition back to render target
3181 D3D12_ResetCommandList(data);
3182 D3D12_TransitionResource(data,
3183 data->renderTargets[data->currentBackBufferIndex],
3184 D3D12_RESOURCE_STATE_PRESENT,
3185 D3D12_RESOURCE_STATE_RENDER_TARGET);
3186
3187#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
3188 D3D12_XBOX_StartFrame(data->d3dDevice, &data->frameToken);
3189#endif
3190 return true;
3191 }
3192}
3193
3194static bool D3D12_SetVSync(SDL_Renderer *renderer, const int vsync)
3195{
3196 D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
3197
3198 if (vsync < 0) {
3199 return SDL_Unsupported();
3200 }
3201
3202 if (vsync > 0) {
3203 data->syncInterval = vsync;
3204 data->presentFlags = 0;
3205 } else {
3206 data->syncInterval = 0;
3207 data->presentFlags = DXGI_PRESENT_ALLOW_TEARING;
3208 }
3209 return true;
3210}
3211
3212bool D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
3213{
3214 D3D12_RenderData *data;
3215
3216 HWND hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
3217 if (!hwnd) {
3218 return SDL_SetError("Couldn't get window handle");
3219 }
3220
3221 if (SDL_GetWindowFlags(window) & SDL_WINDOW_TRANSPARENT) {
3222 // D3D12 removed the swap effect needed to support transparent windows, use D3D11 instead
3223 return SDL_SetError("The direct3d12 renderer doesn't work with transparent windows");
3224 }
3225
3226 SDL_SetupRendererColorspace(renderer, create_props);
3227
3228 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB &&
3229 renderer->output_colorspace != SDL_COLORSPACE_SRGB_LINEAR
3230 /*&& renderer->output_colorspace != SDL_COLORSPACE_HDR10*/) {
3231 return SDL_SetError("Unsupported output colorspace");
3232 }
3233
3234 data = (D3D12_RenderData *)SDL_calloc(1, sizeof(*data));
3235 if (!data) {
3236 return false;
3237 }
3238
3239 data->identity = MatrixIdentity();
3240
3241 renderer->WindowEvent = D3D12_WindowEvent;
3242 renderer->SupportsBlendMode = D3D12_SupportsBlendMode;
3243 renderer->CreateTexture = D3D12_CreateTexture;
3244 renderer->UpdateTexture = D3D12_UpdateTexture;
3245#ifdef SDL_HAVE_YUV
3246 renderer->UpdateTextureYUV = D3D12_UpdateTextureYUV;
3247 renderer->UpdateTextureNV = D3D12_UpdateTextureNV;
3248#endif
3249 renderer->LockTexture = D3D12_LockTexture;
3250 renderer->UnlockTexture = D3D12_UnlockTexture;
3251 renderer->SetTextureScaleMode = D3D12_SetTextureScaleMode;
3252 renderer->SetRenderTarget = D3D12_SetRenderTarget;
3253 renderer->QueueSetViewport = D3D12_QueueNoOp;
3254 renderer->QueueSetDrawColor = D3D12_QueueNoOp;
3255 renderer->QueueDrawPoints = D3D12_QueueDrawPoints;
3256 renderer->QueueDrawLines = D3D12_QueueDrawPoints; // lines and points queue vertices the same way.
3257 renderer->QueueGeometry = D3D12_QueueGeometry;
3258 renderer->InvalidateCachedState = D3D12_InvalidateCachedState;
3259 renderer->RunCommandQueue = D3D12_RunCommandQueue;
3260 renderer->RenderReadPixels = D3D12_RenderReadPixels;
3261 renderer->RenderPresent = D3D12_RenderPresent;
3262 renderer->DestroyTexture = D3D12_DestroyTexture;
3263 renderer->DestroyRenderer = D3D12_DestroyRenderer;
3264 renderer->SetVSync = D3D12_SetVSync;
3265 renderer->internal = data;
3266 D3D12_InvalidateCachedState(renderer);
3267
3268 renderer->name = D3D12_RenderDriver.name;
3269 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
3270 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
3271 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
3272 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
3273 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
3274 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
3275 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
3276 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
3277 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
3278 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010);
3279 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384);
3280
3281 data->syncInterval = 0;
3282 data->presentFlags = DXGI_PRESENT_ALLOW_TEARING;
3283
3284 /* HACK: make sure the SDL_Renderer references the SDL_Window data now, in
3285 * order to give init functions access to the underlying window handle:
3286 */
3287 renderer->window = window;
3288
3289 // Initialize Direct3D resources
3290 if (FAILED(D3D12_CreateDeviceResources(renderer))) {
3291 return false;
3292 }
3293 if (FAILED(D3D12_CreateWindowSizeDependentResources(renderer))) {
3294 return false;
3295 }
3296
3297 return true;
3298}
3299
3300SDL_RenderDriver D3D12_RenderDriver = {
3301 D3D12_CreateRenderer, "direct3d12"
3302};
3303
3304// Ends C function definitions when using C++
3305#ifdef __cplusplus
3306}
3307#endif
3308
3309#endif // SDL_VIDEO_RENDER_D3D12
diff --git a/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12_xbox.cpp b/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12_xbox.cpp
new file mode 100644
index 0000000..2ea3cf1
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12_xbox.cpp
@@ -0,0 +1,174 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#include "../../SDL_internal.h"
23#if defined(SDL_VIDEO_RENDER_D3D12) && (defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES))
24#include "SDL_render_d3d12_xbox.h"
25#include "../../core/windows/SDL_windows.h"
26#include <XGameRuntime.h>
27
28#if defined(_MSC_VER) && !defined(__clang__)
29#define SDL_COMPOSE_ERROR(str) __FUNCTION__ ", " str
30#else
31#define SDL_COMPOSE_ERROR(str) SDL_STRINGIFY_ARG(__FUNCTION__) ", " str
32#endif
33
34static const GUID SDL_IID_ID3D12Device1 = { 0x77acce80, 0x638e, 0x4e65, { 0x88, 0x95, 0xc1, 0xf2, 0x33, 0x86, 0x86, 0x3e } };
35static const GUID SDL_IID_ID3D12Resource = { 0x696442be, 0xa72e, 0x4059, { 0xbc, 0x79, 0x5b, 0x5c, 0x98, 0x04, 0x0f, 0xad } };
36static const GUID SDL_IID_IDXGIDevice1 = { 0x77db970f, 0x6276, 0x48ba, { 0xba, 0x28, 0x07, 0x01, 0x43, 0xb4, 0x39, 0x2c } };
37
38extern "C"
39HRESULT D3D12_XBOX_CreateDevice(ID3D12Device **device, bool createDebug)
40{
41 HRESULT result;
42 D3D12XBOX_CREATE_DEVICE_PARAMETERS params;
43 IDXGIDevice1 *dxgiDevice;
44 IDXGIAdapter *dxgiAdapter;
45 IDXGIOutput *dxgiOutput;
46 SDL_zero(params);
47
48 params.Version = D3D12_SDK_VERSION;
49 params.ProcessDebugFlags = createDebug ? D3D12_PROCESS_DEBUG_FLAG_DEBUG_LAYER_ENABLED : D3D12XBOX_PROCESS_DEBUG_FLAG_NONE;
50 params.GraphicsCommandQueueRingSizeBytes = D3D12XBOX_DEFAULT_SIZE_BYTES;
51 params.GraphicsScratchMemorySizeBytes = D3D12XBOX_DEFAULT_SIZE_BYTES;
52 params.ComputeScratchMemorySizeBytes = D3D12XBOX_DEFAULT_SIZE_BYTES;
53
54 result = D3D12XboxCreateDevice(NULL, &params, SDL_IID_ID3D12Device1, (void **) device);
55 if (FAILED(result)) {
56 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("[xbox] D3D12XboxCreateDevice"), result);
57 goto done;
58 }
59
60 result = (*device)->QueryInterface(SDL_IID_IDXGIDevice1, (void **) &dxgiDevice);
61 if (FAILED(result)) {
62 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("[xbox] ID3D12Device to IDXGIDevice1"), result);
63 goto done;
64 }
65
66 result = dxgiDevice->GetAdapter(&dxgiAdapter);
67 if (FAILED(result)) {
68 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("[xbox] dxgiDevice->GetAdapter"), result);
69 goto done;
70 }
71
72 result = dxgiAdapter->EnumOutputs(0, &dxgiOutput);
73 if (FAILED(result)) {
74 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("[xbox] dxgiAdapter->EnumOutputs"), result);
75 goto done;
76 }
77
78 // Set frame interval
79 result = (*device)->SetFrameIntervalX(dxgiOutput, D3D12XBOX_FRAME_INTERVAL_60_HZ, 1, D3D12XBOX_FRAME_INTERVAL_FLAG_NONE);
80 if (FAILED(result)) {
81 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("[xbox] SetFrameIntervalX"), result);
82 goto done;
83 }
84
85 result = (*device)->ScheduleFrameEventX(D3D12XBOX_FRAME_EVENT_ORIGIN, 0, NULL, D3D12XBOX_SCHEDULE_FRAME_EVENT_FLAG_NONE);
86 if (FAILED(result)) {
87 WIN_SetErrorFromHRESULT(SDL_COMPOSE_ERROR("[xbox] ScheduleFrameEventX"), result);
88 goto done;
89 }
90
91done:
92 return result;
93}
94
95extern "C"
96HRESULT D3D12_XBOX_CreateBackBufferTarget(ID3D12Device1 *device, int width, int height, void **resource)
97{
98
99 D3D12_HEAP_PROPERTIES heapProps;
100 D3D12_RESOURCE_DESC resourceDesc;
101
102 SDL_zero(heapProps);
103 heapProps.Type = D3D12_HEAP_TYPE_DEFAULT;
104 heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
105 heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
106 heapProps.CreationNodeMask = 1;
107 heapProps.VisibleNodeMask = 1;
108
109 SDL_zero(resourceDesc);
110 resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
111 resourceDesc.Alignment = 0;
112 resourceDesc.Width = width;
113 resourceDesc.Height = height;
114 resourceDesc.DepthOrArraySize = 1;
115 resourceDesc.MipLevels = 1;
116 resourceDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
117 resourceDesc.SampleDesc.Count = 1;
118 resourceDesc.SampleDesc.Quality = 0;
119 resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
120 resourceDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
121
122 return device->CreateCommittedResource(&heapProps,
123 D3D12_HEAP_FLAG_ALLOW_DISPLAY,
124 &resourceDesc,
125 D3D12_RESOURCE_STATE_PRESENT,
126 NULL,
127 SDL_IID_ID3D12Resource,
128 resource
129 );
130}
131
132extern "C"
133HRESULT D3D12_XBOX_StartFrame(ID3D12Device1 *device, UINT64 *outToken)
134{
135 *outToken = D3D12XBOX_FRAME_PIPELINE_TOKEN_NULL;
136 return device->WaitFrameEventX(D3D12XBOX_FRAME_EVENT_ORIGIN, INFINITE, NULL, D3D12XBOX_WAIT_FRAME_EVENT_FLAG_NONE, outToken);
137}
138
139extern "C"
140HRESULT D3D12_XBOX_PresentFrame(ID3D12CommandQueue *commandQueue, UINT64 token, ID3D12Resource *renderTarget)
141{
142 D3D12XBOX_PRESENT_PLANE_PARAMETERS planeParameters;
143 SDL_zero(planeParameters);
144 planeParameters.Token = token;
145 planeParameters.ResourceCount = 1;
146 planeParameters.ppResources = &renderTarget;
147 return commandQueue->PresentX(1, &planeParameters, NULL);
148}
149
150extern "C"
151void D3D12_XBOX_GetResolution(Uint32 *width, Uint32 *height)
152{
153 switch (XSystemGetDeviceType()) {
154 case XSystemDeviceType::XboxScarlettLockhart:
155 *width = 2560;
156 *height = 1440;
157 break;
158
159 case XSystemDeviceType::XboxOneX:
160 case XSystemDeviceType::XboxScarlettAnaconda:
161 case XSystemDeviceType::XboxOneXDevkit:
162 case XSystemDeviceType::XboxScarlettDevkit:
163 *width = 3840;
164 *height = 2160;
165 break;
166
167 default:
168 *width = 1920;
169 *height = 1080;
170 break;
171 }
172}
173
174#endif // SDL_VIDEO_RENDER_D3D12 && (SDL_PLATFORM_XBOXONE || SDL_PLATFORM_XBOXSERIES)
diff --git a/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12_xbox.h b/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12_xbox.h
new file mode 100644
index 0000000..947148e
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/SDL_render_d3d12_xbox.h
@@ -0,0 +1,44 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_render_d3d12_xbox_h_
23#define SDL_render_d3d12_xbox_h_
24
25#include "../../SDL_internal.h"
26#include "../../video/directx/SDL_d3d12.h"
27
28// Set up for C function definitions, even when using C++
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33extern HRESULT D3D12_XBOX_CreateDevice(ID3D12Device **device, bool createDebug);
34extern HRESULT D3D12_XBOX_CreateBackBufferTarget(ID3D12Device1 *device, int width, int height, void **resource);
35extern HRESULT D3D12_XBOX_StartFrame(ID3D12Device1 *device, UINT64 *outToken);
36extern HRESULT D3D12_XBOX_PresentFrame(ID3D12CommandQueue *commandQueue, UINT64 token, ID3D12Resource *renderTarget);
37extern void D3D12_XBOX_GetResolution(Uint32 *width, Uint32 *height);
38
39// Ends C function definitions when using C++
40#ifdef __cplusplus
41}
42#endif
43
44#endif
diff --git a/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12.c b/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12.c
new file mode 100644
index 0000000..8d06db0
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12.c
@@ -0,0 +1,125 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#if defined(SDL_VIDEO_RENDER_D3D12) && !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
24
25#include "../../core/windows/SDL_windows.h"
26#include "../../video/directx/SDL_d3d12.h"
27
28#include "SDL_shaders_d3d12.h"
29
30#define SDL_COMPOSE_ERROR(str) SDL_STRINGIFY_ARG(__FUNCTION__) ", " str
31
32// The shaders here were compiled with compile_shaders.bat
33
34#define g_main D3D12_PixelShader_Colors
35#include "D3D12_PixelShader_Colors.h"
36#undef g_main
37
38#define g_main D3D12_PixelShader_Textures
39#include "D3D12_PixelShader_Textures.h"
40#undef g_main
41
42#define g_main D3D12_PixelShader_Advanced
43#include "D3D12_PixelShader_Advanced.h"
44#undef g_main
45
46
47#define g_mainColor D3D12_VertexShader_Colors
48#include "D3D12_VertexShader_Color.h"
49#undef g_mainColor
50
51#define g_mainTexture D3D12_VertexShader_Textures
52#include "D3D12_VertexShader_Texture.h"
53#undef g_mainTexture
54
55#define g_mainAdvanced D3D12_VertexShader_Advanced
56#include "D3D12_VertexShader_Advanced.h"
57#undef g_mainAdvanced
58
59
60#define g_ColorRS D3D12_RootSig_Color
61#include "D3D12_RootSig_Color.h"
62#undef g_ColorRS
63
64#define g_TextureRS D3D12_RootSig_Texture
65#include "D3D12_RootSig_Texture.h"
66#undef g_TextureRS
67
68#define g_AdvancedRS D3D12_RootSig_Advanced
69#include "D3D12_RootSig_Advanced.h"
70#undef g_AdvancedRS
71
72
73static struct
74{
75 const void *ps_shader_data;
76 SIZE_T ps_shader_size;
77 const void *vs_shader_data;
78 SIZE_T vs_shader_size;
79 D3D12_RootSignature root_sig;
80} D3D12_shaders[NUM_SHADERS] = {
81 { D3D12_PixelShader_Colors, sizeof(D3D12_PixelShader_Colors),
82 D3D12_VertexShader_Colors, sizeof(D3D12_VertexShader_Colors),
83 ROOTSIG_COLOR },
84 { D3D12_PixelShader_Textures, sizeof(D3D12_PixelShader_Textures),
85 D3D12_VertexShader_Textures, sizeof(D3D12_VertexShader_Textures),
86 ROOTSIG_TEXTURE },
87 { D3D12_PixelShader_Advanced, sizeof(D3D12_PixelShader_Advanced),
88 D3D12_VertexShader_Advanced, sizeof(D3D12_VertexShader_Advanced),
89 ROOTSIG_ADVANCED },
90};
91
92static struct
93{
94 const void *rs_shader_data;
95 SIZE_T rs_shader_size;
96} D3D12_rootsigs[NUM_ROOTSIGS] = {
97 { D3D12_RootSig_Color, sizeof(D3D12_RootSig_Color) },
98 { D3D12_RootSig_Texture, sizeof(D3D12_RootSig_Texture) },
99 { D3D12_RootSig_Advanced, sizeof(D3D12_RootSig_Advanced) },
100};
101
102void D3D12_GetVertexShader(D3D12_Shader shader, D3D12_SHADER_BYTECODE *outBytecode)
103{
104 outBytecode->pShaderBytecode = D3D12_shaders[shader].vs_shader_data;
105 outBytecode->BytecodeLength = D3D12_shaders[shader].vs_shader_size;
106}
107
108void D3D12_GetPixelShader(D3D12_Shader shader, D3D12_SHADER_BYTECODE *outBytecode)
109{
110 outBytecode->pShaderBytecode = D3D12_shaders[shader].ps_shader_data;
111 outBytecode->BytecodeLength = D3D12_shaders[shader].ps_shader_size;
112}
113
114D3D12_RootSignature D3D12_GetRootSignatureType(D3D12_Shader shader)
115{
116 return D3D12_shaders[shader].root_sig;
117}
118
119void D3D12_GetRootSignatureData(D3D12_RootSignature rootSig, D3D12_SHADER_BYTECODE *outBytecode)
120{
121 outBytecode->pShaderBytecode = D3D12_rootsigs[rootSig].rs_shader_data;
122 outBytecode->BytecodeLength = D3D12_rootsigs[rootSig].rs_shader_size;
123}
124
125#endif // SDL_VIDEO_RENDER_D3D12 && !SDL_PLATFORM_XBOXONE && !SDL_PLATFORM_XBOXSERIES
diff --git a/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12.h b/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12.h
new file mode 100644
index 0000000..0250b97
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12.h
@@ -0,0 +1,54 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23// D3D12 shader implementation
24
25// Set up for C function definitions, even when using C++
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30typedef enum
31{
32 SHADER_SOLID,
33 SHADER_RGB,
34 SHADER_ADVANCED,
35 NUM_SHADERS
36} D3D12_Shader;
37
38typedef enum
39{
40 ROOTSIG_COLOR,
41 ROOTSIG_TEXTURE,
42 ROOTSIG_ADVANCED,
43 NUM_ROOTSIGS
44} D3D12_RootSignature;
45
46extern void D3D12_GetVertexShader(D3D12_Shader shader, D3D12_SHADER_BYTECODE *outBytecode);
47extern void D3D12_GetPixelShader(D3D12_Shader shader, D3D12_SHADER_BYTECODE *outBytecode);
48extern D3D12_RootSignature D3D12_GetRootSignatureType(D3D12_Shader shader);
49extern void D3D12_GetRootSignatureData(D3D12_RootSignature rootSig, D3D12_SHADER_BYTECODE *outBytecode);
50
51// Ends C function definitions when using C++
52#ifdef __cplusplus
53}
54#endif
diff --git a/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp b/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp
new file mode 100644
index 0000000..bc6146b
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12_xboxone.cpp
@@ -0,0 +1,132 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "../../SDL_internal.h"
22
23#if defined(SDL_VIDEO_RENDER_D3D12) && defined(SDL_PLATFORM_XBOXONE)
24
25#include <SDL3/SDL_stdinc.h>
26
27#include "../../core/windows/SDL_windows.h"
28#include "../../video/directx/SDL_d3d12.h"
29
30#include "SDL_shaders_d3d12.h"
31
32#define SDL_COMPOSE_ERROR(str) SDL_STRINGIFY_ARG(__FUNCTION__) ", " str
33
34// Shader blob headers are generated with a pre-build step using compile_shaders_xbox.bat
35
36#define g_main D3D12_PixelShader_Colors
37#include "D3D12_PixelShader_Colors_One.h"
38#undef g_main
39
40#define g_main D3D12_PixelShader_Textures
41#include "D3D12_PixelShader_Textures_One.h"
42#undef g_main
43
44#define g_main D3D12_PixelShader_Advanced
45#include "D3D12_PixelShader_Advanced_One.h"
46#undef g_main
47
48
49#define g_mainColor D3D12_VertexShader_Colors
50#include "D3D12_VertexShader_Color_One.h"
51#undef g_mainColor
52
53#define g_mainTexture D3D12_VertexShader_Textures
54#include "D3D12_VertexShader_Texture_One.h"
55#undef g_mainTexture
56
57#define g_mainAdvanced D3D12_VertexShader_Advanced
58#include "D3D12_VertexShader_Advanced_One.h"
59#undef g_mainAdvanced
60
61
62#define g_ColorRS D3D12_RootSig_Color
63#include "D3D12_RootSig_Color_One.h"
64#undef g_ColorRS
65
66#define g_TextureRS D3D12_RootSig_Texture
67#include "D3D12_RootSig_Texture_One.h"
68#undef g_TextureRS
69
70#define g_AdvancedRS D3D12_RootSig_Advanced
71#include "D3D12_RootSig_Advanced_One.h"
72#undef g_AdvancedRS
73
74
75static struct
76{
77 const void *ps_shader_data;
78 SIZE_T ps_shader_size;
79 const void *vs_shader_data;
80 SIZE_T vs_shader_size;
81 D3D12_RootSignature root_sig;
82} D3D12_shaders[NUM_SHADERS] = {
83 { D3D12_PixelShader_Colors, sizeof(D3D12_PixelShader_Colors),
84 D3D12_VertexShader_Colors, sizeof(D3D12_VertexShader_Colors),
85 ROOTSIG_COLOR },
86 { D3D12_PixelShader_Textures, sizeof(D3D12_PixelShader_Textures),
87 D3D12_VertexShader_Textures, sizeof(D3D12_VertexShader_Textures),
88 ROOTSIG_TEXTURE },
89 { D3D12_PixelShader_Advanced, sizeof(D3D12_PixelShader_Advanced),
90 D3D12_VertexShader_Advanced, sizeof(D3D12_VertexShader_Advanced),
91 ROOTSIG_ADVANCED },
92};
93
94static struct
95{
96 const void *rs_shader_data;
97 SIZE_T rs_shader_size;
98} D3D12_rootsigs[NUM_ROOTSIGS] = {
99 { D3D12_RootSig_Color, sizeof(D3D12_RootSig_Color) },
100 { D3D12_RootSig_Texture, sizeof(D3D12_RootSig_Texture) },
101 { D3D12_RootSig_Advanced, sizeof(D3D12_RootSig_Advanced) },
102};
103
104extern "C"
105void D3D12_GetVertexShader(D3D12_Shader shader, D3D12_SHADER_BYTECODE *outBytecode)
106{
107 outBytecode->pShaderBytecode = D3D12_shaders[shader].vs_shader_data;
108 outBytecode->BytecodeLength = D3D12_shaders[shader].vs_shader_size;
109}
110
111extern "C"
112void D3D12_GetPixelShader(D3D12_Shader shader, D3D12_SHADER_BYTECODE *outBytecode)
113{
114 outBytecode->pShaderBytecode = D3D12_shaders[shader].ps_shader_data;
115 outBytecode->BytecodeLength = D3D12_shaders[shader].ps_shader_size;
116}
117
118extern "C"
119D3D12_RootSignature D3D12_GetRootSignatureType(D3D12_Shader shader)
120{
121 return D3D12_shaders[shader].root_sig;
122}
123
124extern "C"
125void D3D12_GetRootSignatureData(D3D12_RootSignature rootSig, D3D12_SHADER_BYTECODE *outBytecode)
126{
127 outBytecode->pShaderBytecode = D3D12_rootsigs[rootSig].rs_shader_data;
128 outBytecode->BytecodeLength = D3D12_rootsigs[rootSig].rs_shader_size;
129}
130
131#endif // SDL_VIDEO_RENDER_D3D12 && SDL_PLATFORM_XBOXONE
132
diff --git a/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp b/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp
new file mode 100644
index 0000000..6c1c037
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/SDL_shaders_d3d12_xboxseries.cpp
@@ -0,0 +1,133 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "../../SDL_internal.h"
22
23#if defined(SDL_VIDEO_RENDER_D3D12) && defined(SDL_PLATFORM_XBOXSERIES)
24
25#include <SDL3/SDL_stdinc.h>
26
27#include "../../core/windows/SDL_windows.h"
28#include "../../video/directx/SDL_d3d12.h"
29
30#include "SDL_shaders_d3d12.h"
31
32#define SDL_COMPOSE_ERROR(str) SDL_STRINGIFY_ARG(__FUNCTION__) ", " str
33
34
35// Shader blob headers are generated with a pre-build step using compile_shaders_xbox.bat
36
37#define g_main D3D12_PixelShader_Colors
38#include "D3D12_PixelShader_Colors_Series.h"
39#undef g_main
40
41#define g_main D3D12_PixelShader_Textures
42#include "D3D12_PixelShader_Textures_Series.h"
43#undef g_main
44
45#define g_main D3D12_PixelShader_Advanced
46#include "D3D12_PixelShader_Advanced_Series.h"
47#undef g_main
48
49
50#define g_mainColor D3D12_VertexShader_Colors
51#include "D3D12_VertexShader_Color_Series.h"
52#undef g_mainColor
53
54#define g_mainTexture D3D12_VertexShader_Textures
55#include "D3D12_VertexShader_Texture_Series.h"
56#undef g_mainTexture
57
58#define g_mainAdvanced D3D12_VertexShader_Advanced
59#include "D3D12_VertexShader_Advanced_Series.h"
60#undef g_mainAdvanced
61
62
63#define g_ColorRS D3D12_RootSig_Color
64#include "D3D12_RootSig_Color_Series.h"
65#undef g_ColorRS
66
67#define g_TextureRS D3D12_RootSig_Texture
68#include "D3D12_RootSig_Texture_Series.h"
69#undef g_TextureRS
70
71#define g_AdvancedRS D3D12_RootSig_Advanced
72#include "D3D12_RootSig_Advanced_Series.h"
73#undef g_AdvancedRS
74
75
76static struct
77{
78 const void *ps_shader_data;
79 SIZE_T ps_shader_size;
80 const void *vs_shader_data;
81 SIZE_T vs_shader_size;
82 D3D12_RootSignature root_sig;
83} D3D12_shaders[NUM_SHADERS] = {
84 { D3D12_PixelShader_Colors, sizeof(D3D12_PixelShader_Colors),
85 D3D12_VertexShader_Colors, sizeof(D3D12_VertexShader_Colors),
86 ROOTSIG_COLOR },
87 { D3D12_PixelShader_Textures, sizeof(D3D12_PixelShader_Textures),
88 D3D12_VertexShader_Textures, sizeof(D3D12_VertexShader_Textures),
89 ROOTSIG_TEXTURE },
90 { D3D12_PixelShader_Advanced, sizeof(D3D12_PixelShader_Advanced),
91 D3D12_VertexShader_Advanced, sizeof(D3D12_VertexShader_Advanced),
92 ROOTSIG_ADVANCED },
93};
94
95static struct
96{
97 const void *rs_shader_data;
98 SIZE_T rs_shader_size;
99} D3D12_rootsigs[NUM_ROOTSIGS] = {
100 { D3D12_RootSig_Color, sizeof(D3D12_RootSig_Color) },
101 { D3D12_RootSig_Texture, sizeof(D3D12_RootSig_Texture) },
102 { D3D12_RootSig_Advanced, sizeof(D3D12_RootSig_Advanced) },
103};
104
105extern "C"
106void D3D12_GetVertexShader(D3D12_Shader shader, D3D12_SHADER_BYTECODE *outBytecode)
107{
108 outBytecode->pShaderBytecode = D3D12_shaders[shader].vs_shader_data;
109 outBytecode->BytecodeLength = D3D12_shaders[shader].vs_shader_size;
110}
111
112extern "C"
113void D3D12_GetPixelShader(D3D12_Shader shader, D3D12_SHADER_BYTECODE *outBytecode)
114{
115 outBytecode->pShaderBytecode = D3D12_shaders[shader].ps_shader_data;
116 outBytecode->BytecodeLength = D3D12_shaders[shader].ps_shader_size;
117}
118
119extern "C"
120D3D12_RootSignature D3D12_GetRootSignatureType(D3D12_Shader shader)
121{
122 return D3D12_shaders[shader].root_sig;
123}
124
125extern "C"
126void D3D12_GetRootSignatureData(D3D12_RootSignature rootSig, D3D12_SHADER_BYTECODE *outBytecode)
127{
128 outBytecode->pShaderBytecode = D3D12_rootsigs[rootSig].rs_shader_data;
129 outBytecode->BytecodeLength = D3D12_rootsigs[rootSig].rs_shader_size;
130}
131
132#endif // SDL_VIDEO_RENDER_D3D12 && SDL_PLATFORM_XBOXSERIES
133
diff --git a/SDL-3.2.8/src/render/direct3d12/compile_shaders.bat b/SDL-3.2.8/src/render/direct3d12/compile_shaders.bat
new file mode 100644
index 0000000..699fdf3
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/compile_shaders.bat
@@ -0,0 +1,21 @@
1rem This script runs for the Windows build, but also via the _xbox variant with these vars set.
2rem Make sure to default to building for Windows if they're not set.
3if %DXC%.==. set DXC=dxc
4if %SUFFIX%.==. set SUFFIX=.h
5
6echo Building with %DXC%
7echo Suffix %SUFFIX%
8
9cd "%~dp0"
10
11%DXC% -E main -T ps_6_0 -Fh D3D12_PixelShader_Colors%SUFFIX% D3D12_PixelShader_Colors.hlsl
12%DXC% -E main -T ps_6_0 -Fh D3D12_PixelShader_Textures%SUFFIX% D3D12_PixelShader_Textures.hlsl
13%DXC% -E main -T ps_6_0 -Fh D3D12_PixelShader_Advanced%SUFFIX% D3D12_PixelShader_Advanced.hlsl
14
15%DXC% -E mainColor -T vs_6_0 -Fh D3D12_VertexShader_Color%SUFFIX% D3D12_VertexShader.hlsl
16%DXC% -E mainTexture -T vs_6_0 -Fh D3D12_VertexShader_Texture%SUFFIX% D3D12_VertexShader.hlsl
17%DXC% -E mainAdvanced -T vs_6_0 -Fh D3D12_VertexShader_Advanced%SUFFIX% D3D12_VertexShader.hlsl
18
19%DXC% -E ColorRS -T rootsig_1_1 -rootsig-define ColorRS -Fh D3D12_RootSig_Color%SUFFIX% D3D12_VertexShader.hlsl
20%DXC% -E TextureRS -T rootsig_1_1 -rootsig-define TextureRS -Fh D3D12_RootSig_Texture%SUFFIX% D3D12_VertexShader.hlsl
21%DXC% -E AdvancedRS -T rootsig_1_1 -rootsig-define AdvancedRS -Fh D3D12_RootSig_Advanced%SUFFIX% D3D12_VertexShader.hlsl
diff --git a/SDL-3.2.8/src/render/direct3d12/compile_shaders_xbox.bat b/SDL-3.2.8/src/render/direct3d12/compile_shaders_xbox.bat
new file mode 100644
index 0000000..311b172
--- /dev/null
+++ b/SDL-3.2.8/src/render/direct3d12/compile_shaders_xbox.bat
@@ -0,0 +1,13 @@
1if %2.==one. goto setxboxone
2rem Xbox Series compile
3set DXC="%GameDKLatest%\GXDK\bin\Scarlett\DXC.exe"
4set SUFFIX=_Series.h
5goto startbuild
6
7:setxboxone
8set DXC="%GameDKLatest%\GXDK\bin\XboxOne\DXC.exe"
9set SUFFIX=_One.h
10
11:startbuild
12
13call "%~dp0\compile_shaders.bat"
diff --git a/SDL-3.2.8/src/render/gpu/SDL_gpu_util.h b/SDL-3.2.8/src/render/gpu/SDL_gpu_util.h
new file mode 100644
index 0000000..ca32ce0
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/SDL_gpu_util.h
@@ -0,0 +1,74 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_gpu_util_h_
23#define SDL_gpu_util_h_
24
25#define SDL_GPU_BLENDOP_INVALID ((SDL_GPUBlendOp)0x7fffffff)
26#define SDL_GPU_BLENDFACTOR_INVALID ((SDL_GPUBlendFactor)0x7fffffff)
27
28static SDL_INLINE SDL_GPUBlendFactor GPU_ConvertBlendFactor(SDL_BlendFactor factor)
29{
30 switch (factor) {
31 case SDL_BLENDFACTOR_ZERO:
32 return SDL_GPU_BLENDFACTOR_ZERO;
33 case SDL_BLENDFACTOR_ONE:
34 return SDL_GPU_BLENDFACTOR_ONE;
35 case SDL_BLENDFACTOR_SRC_COLOR:
36 return SDL_GPU_BLENDFACTOR_SRC_COLOR;
37 case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
38 return SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR;
39 case SDL_BLENDFACTOR_SRC_ALPHA:
40 return SDL_GPU_BLENDFACTOR_SRC_ALPHA;
41 case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
42 return SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA;
43 case SDL_BLENDFACTOR_DST_COLOR:
44 return SDL_GPU_BLENDFACTOR_DST_COLOR;
45 case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
46 return SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR;
47 case SDL_BLENDFACTOR_DST_ALPHA:
48 return SDL_GPU_BLENDFACTOR_DST_ALPHA;
49 case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
50 return SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA;
51 default:
52 return SDL_GPU_BLENDFACTOR_INVALID;
53 }
54}
55
56static SDL_INLINE SDL_GPUBlendOp GPU_ConvertBlendOperation(SDL_BlendOperation operation)
57{
58 switch (operation) {
59 case SDL_BLENDOPERATION_ADD:
60 return SDL_GPU_BLENDOP_ADD;
61 case SDL_BLENDOPERATION_SUBTRACT:
62 return SDL_GPU_BLENDOP_SUBTRACT;
63 case SDL_BLENDOPERATION_REV_SUBTRACT:
64 return SDL_GPU_BLENDOP_REVERSE_SUBTRACT;
65 case SDL_BLENDOPERATION_MINIMUM:
66 return SDL_GPU_BLENDOP_MIN;
67 case SDL_BLENDOPERATION_MAXIMUM:
68 return SDL_GPU_BLENDOP_MAX;
69 default:
70 return SDL_GPU_BLENDOP_INVALID;
71 }
72}
73
74#endif // SDL_gpu_util_h
diff --git a/SDL-3.2.8/src/render/gpu/SDL_pipeline_gpu.c b/SDL-3.2.8/src/render/gpu/SDL_pipeline_gpu.c
new file mode 100644
index 0000000..0783374
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/SDL_pipeline_gpu.c
@@ -0,0 +1,202 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_GPU
24
25#include "SDL_gpu_util.h"
26#include "SDL_pipeline_gpu.h"
27
28#include "../SDL_sysrender.h"
29
30struct GPU_PipelineCacheKeyStruct
31{
32 Uint64 blend_mode : 28;
33 Uint64 frag_shader : 4;
34 Uint64 vert_shader : 4;
35 Uint64 attachment_format : 6;
36 Uint64 primitive_type : 3;
37};
38
39typedef union GPU_PipelineCacheKeyConverter
40{
41 struct GPU_PipelineCacheKeyStruct as_struct;
42 Uint64 as_uint64;
43} GPU_PipelineCacheKeyConverter;
44
45SDL_COMPILE_TIME_ASSERT(GPU_PipelineCacheKeyConverter_Size, sizeof(GPU_PipelineCacheKeyConverter) <= sizeof(Uint64));
46
47static Uint32 SDLCALL HashPipelineCacheKey(void *userdata, const void *key)
48{
49 const GPU_PipelineParameters *params = (const GPU_PipelineParameters *) key;
50 GPU_PipelineCacheKeyConverter cvt;
51 cvt.as_uint64 = 0;
52 cvt.as_struct.blend_mode = params->blend_mode;
53 cvt.as_struct.frag_shader = params->frag_shader;
54 cvt.as_struct.vert_shader = params->vert_shader;
55 cvt.as_struct.attachment_format = params->attachment_format;
56 cvt.as_struct.primitive_type = params->primitive_type;
57
58 // 64-bit uint hash function stolen from taisei (which stole it from somewhere else)
59 Uint64 x = cvt.as_uint64;
60 x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
61 x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
62 x = x ^ (x >> 31);
63 return (Uint32)(x & 0xffffffff);
64}
65
66static bool SDLCALL MatchPipelineCacheKey(void *userdata, const void *a, const void *b)
67{
68 return (SDL_memcmp(a, b, sizeof (GPU_PipelineParameters)) == 0);
69}
70
71static void SDLCALL DestroyPipelineCacheHashItem(void *userdata, const void *key, const void *value)
72{
73 SDL_GPUGraphicsPipeline *pipeline = (SDL_GPUGraphicsPipeline *) value;
74 SDL_GPUDevice *device = (SDL_GPUDevice *) userdata;
75 SDL_ReleaseGPUGraphicsPipeline(device, pipeline);
76 SDL_free((GPU_PipelineParameters *) key);
77}
78
79bool GPU_InitPipelineCache(GPU_PipelineCache *cache, SDL_GPUDevice *device)
80{
81 cache->table = SDL_CreateHashTable(0, false, HashPipelineCacheKey, MatchPipelineCacheKey, DestroyPipelineCacheHashItem, device);
82 return (cache->table != NULL);
83}
84
85void GPU_DestroyPipelineCache(GPU_PipelineCache *cache)
86{
87 SDL_DestroyHashTable(cache->table);
88}
89
90static SDL_GPUGraphicsPipeline *MakePipeline(SDL_GPUDevice *device, GPU_Shaders *shaders, const GPU_PipelineParameters *params)
91{
92 SDL_GPUColorTargetDescription ad;
93 SDL_zero(ad);
94 ad.format = params->attachment_format;
95
96 SDL_BlendMode blend = params->blend_mode;
97 ad.blend_state.enable_blend = blend != 0;
98 ad.blend_state.color_write_mask = 0xF;
99 ad.blend_state.alpha_blend_op = GPU_ConvertBlendOperation(SDL_GetBlendModeAlphaOperation(blend));
100 ad.blend_state.dst_alpha_blendfactor = GPU_ConvertBlendFactor(SDL_GetBlendModeDstAlphaFactor(blend));
101 ad.blend_state.src_alpha_blendfactor = GPU_ConvertBlendFactor(SDL_GetBlendModeSrcAlphaFactor(blend));
102 ad.blend_state.color_blend_op = GPU_ConvertBlendOperation(SDL_GetBlendModeColorOperation(blend));
103 ad.blend_state.dst_color_blendfactor = GPU_ConvertBlendFactor(SDL_GetBlendModeDstColorFactor(blend));
104 ad.blend_state.src_color_blendfactor = GPU_ConvertBlendFactor(SDL_GetBlendModeSrcColorFactor(blend));
105
106 SDL_GPUGraphicsPipelineCreateInfo pci;
107 SDL_zero(pci);
108 pci.target_info.has_depth_stencil_target = false;
109 pci.target_info.num_color_targets = 1;
110 pci.target_info.color_target_descriptions = &ad;
111 pci.vertex_shader = GPU_GetVertexShader(shaders, params->vert_shader);
112 pci.fragment_shader = GPU_GetFragmentShader(shaders, params->frag_shader);
113 pci.multisample_state.sample_count = SDL_GPU_SAMPLECOUNT_1;
114 pci.multisample_state.enable_mask = false;
115 pci.primitive_type = params->primitive_type;
116
117 pci.rasterizer_state.cull_mode = SDL_GPU_CULLMODE_NONE;
118 pci.rasterizer_state.fill_mode = SDL_GPU_FILLMODE_FILL;
119 pci.rasterizer_state.front_face = SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE;
120
121 SDL_GPUVertexBufferDescription vertex_buffer_desc;
122 SDL_zero(vertex_buffer_desc);
123
124 Uint32 num_attribs = 0;
125 SDL_GPUVertexAttribute attribs[4];
126 SDL_zero(attribs);
127
128 bool have_attr_color = false;
129 bool have_attr_uv = false;
130
131 switch (params->vert_shader) {
132 case VERT_SHADER_TRI_TEXTURE:
133 have_attr_uv = true;
134 SDL_FALLTHROUGH;
135 case VERT_SHADER_TRI_COLOR:
136 have_attr_color = true;
137 SDL_FALLTHROUGH;
138 default:
139 break;
140 }
141
142 // Position
143 attribs[num_attribs].location = num_attribs;
144 attribs[num_attribs].format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2;
145 attribs[num_attribs].offset = vertex_buffer_desc.pitch;
146 vertex_buffer_desc.pitch += 2 * sizeof(float);
147 num_attribs++;
148
149 if (have_attr_color) {
150 // Color
151 attribs[num_attribs].location = num_attribs;
152 attribs[num_attribs].format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4;
153 attribs[num_attribs].offset = vertex_buffer_desc.pitch;
154 vertex_buffer_desc.pitch += 4 * sizeof(float);
155 num_attribs++;
156 }
157
158 if (have_attr_uv) {
159 // UVs
160 attribs[num_attribs].location = num_attribs;
161 attribs[num_attribs].format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2;
162 attribs[num_attribs].offset = vertex_buffer_desc.pitch;
163 vertex_buffer_desc.pitch += 2 * sizeof(float);
164 num_attribs++;
165 }
166
167 pci.vertex_input_state.num_vertex_attributes = num_attribs;
168 pci.vertex_input_state.vertex_attributes = attribs;
169 pci.vertex_input_state.num_vertex_buffers = 1;
170 pci.vertex_input_state.vertex_buffer_descriptions = &vertex_buffer_desc;
171
172 return SDL_CreateGPUGraphicsPipeline(device, &pci);
173}
174
175SDL_GPUGraphicsPipeline *GPU_GetPipeline(GPU_PipelineCache *cache, GPU_Shaders *shaders, SDL_GPUDevice *device, const GPU_PipelineParameters *params)
176{
177 SDL_GPUGraphicsPipeline *pipeline = NULL;
178 if (!SDL_FindInHashTable(cache->table, params, (const void **) &pipeline)) {
179 bool inserted = false;
180 // !!! FIXME: why don't we have an SDL_alloc_copy function/macro?
181 GPU_PipelineParameters *paramscpy = (GPU_PipelineParameters *) SDL_malloc(sizeof (*paramscpy));
182 if (paramscpy) {
183 SDL_copyp(paramscpy, params);
184 pipeline = MakePipeline(device, shaders, params);
185 if (pipeline) {
186 inserted = SDL_InsertIntoHashTable(cache->table, paramscpy, pipeline, false);
187 }
188 }
189
190 if (!inserted) {
191 SDL_free(paramscpy);
192 if (pipeline) {
193 SDL_ReleaseGPUGraphicsPipeline(device, pipeline);
194 pipeline = NULL;
195 }
196 }
197 }
198
199 return pipeline;
200}
201
202#endif // SDL_VIDEO_RENDER_GPU
diff --git a/SDL-3.2.8/src/render/gpu/SDL_pipeline_gpu.h b/SDL-3.2.8/src/render/gpu/SDL_pipeline_gpu.h
new file mode 100644
index 0000000..c3fc39b
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/SDL_pipeline_gpu.h
@@ -0,0 +1,47 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_pipeline_gpu_h_
23#define SDL_pipeline_gpu_h_
24
25#include "SDL_internal.h"
26
27#include "SDL_shaders_gpu.h"
28
29typedef struct GPU_PipelineParameters
30{
31 SDL_BlendMode blend_mode;
32 GPU_FragmentShaderID frag_shader;
33 GPU_VertexShaderID vert_shader;
34 SDL_GPUTextureFormat attachment_format;
35 SDL_GPUPrimitiveType primitive_type;
36} GPU_PipelineParameters;
37
38typedef struct GPU_PipelineCache
39{
40 SDL_HashTable *table;
41} GPU_PipelineCache;
42
43extern bool GPU_InitPipelineCache(GPU_PipelineCache *cache, SDL_GPUDevice *device);
44extern void GPU_DestroyPipelineCache(GPU_PipelineCache *cache);
45extern SDL_GPUGraphicsPipeline *GPU_GetPipeline(GPU_PipelineCache *cache, GPU_Shaders *shaders, SDL_GPUDevice *device, const GPU_PipelineParameters *params);
46
47#endif // SDL_pipeline_gpu_h_
diff --git a/SDL-3.2.8/src/render/gpu/SDL_render_gpu.c b/SDL-3.2.8/src/render/gpu/SDL_render_gpu.c
new file mode 100644
index 0000000..73c1dbe
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/SDL_render_gpu.c
@@ -0,0 +1,1276 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_GPU
24
25#include "../../video/SDL_pixels_c.h"
26#include "../SDL_d3dmath.h"
27#include "../SDL_sysrender.h"
28#include "SDL_gpu_util.h"
29#include "SDL_pipeline_gpu.h"
30#include "SDL_shaders_gpu.h"
31
32typedef struct GPU_ShaderUniformData
33{
34 Float4X4 mvp;
35 SDL_FColor color;
36 float texture_size[2];
37} GPU_ShaderUniformData;
38
39typedef struct GPU_RenderData
40{
41 SDL_GPUDevice *device;
42 GPU_Shaders shaders;
43 GPU_PipelineCache pipeline_cache;
44
45 struct
46 {
47 SDL_GPUTexture *texture;
48 SDL_GPUTextureFormat format;
49 Uint32 width;
50 Uint32 height;
51 } backbuffer;
52
53 struct
54 {
55 SDL_GPUSwapchainComposition composition;
56 SDL_GPUPresentMode present_mode;
57 } swapchain;
58
59 struct
60 {
61 SDL_GPUTransferBuffer *transfer_buf;
62 SDL_GPUBuffer *buffer;
63 Uint32 buffer_size;
64 } vertices;
65
66 struct
67 {
68 SDL_GPURenderPass *render_pass;
69 SDL_Texture *render_target;
70 SDL_GPUCommandBuffer *command_buffer;
71 SDL_GPUColorTargetInfo color_attachment;
72 SDL_GPUViewport viewport;
73 SDL_Rect scissor;
74 SDL_FColor draw_color;
75 bool scissor_enabled;
76 bool scissor_was_enabled;
77 GPU_ShaderUniformData shader_data;
78 } state;
79
80 SDL_GPUSampler *samplers[2][2];
81} GPU_RenderData;
82
83typedef struct GPU_TextureData
84{
85 SDL_GPUTexture *texture;
86 SDL_GPUTextureFormat format;
87 GPU_FragmentShaderID shader;
88 void *pixels;
89 int pitch;
90 SDL_Rect locked_rect;
91} GPU_TextureData;
92
93static bool GPU_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
94{
95 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
96 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
97 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
98 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
99 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
100 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
101
102 if (GPU_ConvertBlendFactor(srcColorFactor) == SDL_GPU_BLENDFACTOR_INVALID ||
103 GPU_ConvertBlendFactor(srcAlphaFactor) == SDL_GPU_BLENDFACTOR_INVALID ||
104 GPU_ConvertBlendOperation(colorOperation) == SDL_GPU_BLENDOP_INVALID ||
105 GPU_ConvertBlendFactor(dstColorFactor) == SDL_GPU_BLENDFACTOR_INVALID ||
106 GPU_ConvertBlendFactor(dstAlphaFactor) == SDL_GPU_BLENDFACTOR_INVALID ||
107 GPU_ConvertBlendOperation(alphaOperation) == SDL_GPU_BLENDOP_INVALID) {
108 return false;
109 }
110
111 return true;
112}
113
114static SDL_GPUTextureFormat PixFormatToTexFormat(SDL_PixelFormat pixel_format)
115{
116 switch (pixel_format) {
117 case SDL_PIXELFORMAT_BGRA32:
118 case SDL_PIXELFORMAT_BGRX32:
119 return SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM;
120 case SDL_PIXELFORMAT_RGBA32:
121 case SDL_PIXELFORMAT_RGBX32:
122 return SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM;
123
124 // YUV TODO
125 case SDL_PIXELFORMAT_YV12:
126 case SDL_PIXELFORMAT_IYUV:
127 case SDL_PIXELFORMAT_NV12:
128 case SDL_PIXELFORMAT_NV21:
129 case SDL_PIXELFORMAT_UYVY:
130 default:
131 return SDL_GPU_TEXTUREFORMAT_INVALID;
132 }
133}
134
135static SDL_PixelFormat TexFormatToPixFormat(SDL_GPUTextureFormat tex_format)
136{
137 switch (tex_format) {
138 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM:
139 return SDL_PIXELFORMAT_RGBA32;
140 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM:
141 return SDL_PIXELFORMAT_BGRA32;
142 case SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM:
143 return SDL_PIXELFORMAT_BGR565;
144 case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM:
145 return SDL_PIXELFORMAT_BGRA5551;
146 case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM:
147 return SDL_PIXELFORMAT_BGRA4444;
148 case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM:
149 return SDL_PIXELFORMAT_ABGR2101010;
150 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM:
151 return SDL_PIXELFORMAT_RGBA64;
152 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM:
153 return SDL_PIXELFORMAT_RGBA32;
154 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT:
155 return SDL_PIXELFORMAT_RGBA64_FLOAT;
156 case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT:
157 return SDL_PIXELFORMAT_RGBA128_FLOAT;
158 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
159 return SDL_PIXELFORMAT_RGBA32;
160 case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
161 return SDL_PIXELFORMAT_RGBA64;
162 case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
163 return SDL_PIXELFORMAT_RGBA32;
164 case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
165 return SDL_PIXELFORMAT_BGRA32;
166 default:
167 return SDL_PIXELFORMAT_UNKNOWN;
168 }
169}
170
171static bool GPU_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
172{
173 GPU_RenderData *renderdata = (GPU_RenderData *)renderer->internal;
174 GPU_TextureData *data;
175 SDL_GPUTextureFormat format;
176 SDL_GPUTextureUsageFlags usage = SDL_GPU_TEXTUREUSAGE_SAMPLER;
177
178 format = PixFormatToTexFormat(texture->format);
179
180 if (format == SDL_GPU_TEXTUREFORMAT_INVALID) {
181 return SDL_SetError("Texture format %s not supported by SDL_GPU",
182 SDL_GetPixelFormatName(texture->format));
183 }
184
185 data = (GPU_TextureData *)SDL_calloc(1, sizeof(*data));
186 if (!data) {
187 return false;
188 }
189
190 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
191 size_t size;
192 data->pitch = texture->w * SDL_BYTESPERPIXEL(texture->format);
193 size = (size_t)texture->h * data->pitch;
194 if (texture->format == SDL_PIXELFORMAT_YV12 ||
195 texture->format == SDL_PIXELFORMAT_IYUV) {
196 // Need to add size for the U and V planes
197 size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
198 }
199 if (texture->format == SDL_PIXELFORMAT_NV12 ||
200 texture->format == SDL_PIXELFORMAT_NV21) {
201 // Need to add size for the U/V plane
202 size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
203 }
204 data->pixels = SDL_calloc(1, size);
205 if (!data->pixels) {
206 SDL_free(data);
207 return false;
208 }
209
210 // TODO allocate a persistent transfer buffer
211 }
212
213 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
214 usage |= SDL_GPU_TEXTUREUSAGE_COLOR_TARGET;
215 }
216
217 texture->internal = data;
218 SDL_GPUTextureCreateInfo tci;
219 SDL_zero(tci);
220 tci.format = format;
221 tci.layer_count_or_depth = 1;
222 tci.num_levels = 1;
223 tci.usage = usage;
224 tci.width = texture->w;
225 tci.height = texture->h;
226 tci.sample_count = SDL_GPU_SAMPLECOUNT_1;
227
228 data->format = format;
229 data->texture = SDL_CreateGPUTexture(renderdata->device, &tci);
230
231 if (!data->texture) {
232 return false;
233 }
234
235 if (texture->format == SDL_PIXELFORMAT_RGBA32 || texture->format == SDL_PIXELFORMAT_BGRA32) {
236 data->shader = FRAG_SHADER_TEXTURE_RGBA;
237 } else {
238 data->shader = FRAG_SHADER_TEXTURE_RGB;
239 }
240
241 return true;
242}
243
244static bool GPU_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
245 const SDL_Rect *rect, const void *pixels, int pitch)
246{
247 GPU_RenderData *renderdata = (GPU_RenderData *)renderer->internal;
248 GPU_TextureData *data = (GPU_TextureData *)texture->internal;
249 const Uint32 texturebpp = SDL_BYTESPERPIXEL(texture->format);
250
251 size_t row_size, data_size;
252
253 if (!SDL_size_mul_check_overflow(rect->w, texturebpp, &row_size) ||
254 !SDL_size_mul_check_overflow(rect->h, row_size, &data_size)) {
255 return SDL_SetError("update size overflow");
256 }
257
258 SDL_GPUTransferBufferCreateInfo tbci;
259 SDL_zero(tbci);
260 tbci.size = (Uint32)data_size;
261 tbci.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD;
262
263 SDL_GPUTransferBuffer *tbuf = SDL_CreateGPUTransferBuffer(renderdata->device, &tbci);
264
265 if (tbuf == NULL) {
266 return false;
267 }
268
269 Uint8 *output = SDL_MapGPUTransferBuffer(renderdata->device, tbuf, false);
270
271 if ((size_t)pitch == row_size) {
272 SDL_memcpy(output, pixels, data_size);
273 } else {
274 // FIXME is negative pitch supposed to work?
275 // If not, maybe use SDL_GPUTextureTransferInfo::pixels_per_row instead of this
276 const Uint8 *input = pixels;
277
278 for (int i = 0; i < rect->h; ++i) {
279 SDL_memcpy(output, input, row_size);
280 output += row_size;
281 input += pitch;
282 }
283 }
284
285 SDL_UnmapGPUTransferBuffer(renderdata->device, tbuf);
286
287 SDL_GPUCommandBuffer *cbuf = renderdata->state.command_buffer;
288 SDL_GPUCopyPass *cpass = SDL_BeginGPUCopyPass(cbuf);
289
290 SDL_GPUTextureTransferInfo tex_src;
291 SDL_zero(tex_src);
292 tex_src.transfer_buffer = tbuf;
293 tex_src.rows_per_layer = rect->h;
294 tex_src.pixels_per_row = rect->w;
295
296 SDL_GPUTextureRegion tex_dst;
297 SDL_zero(tex_dst);
298 tex_dst.texture = data->texture;
299 tex_dst.x = rect->x;
300 tex_dst.y = rect->y;
301 tex_dst.w = rect->w;
302 tex_dst.h = rect->h;
303 tex_dst.d = 1;
304
305 SDL_UploadToGPUTexture(cpass, &tex_src, &tex_dst, false);
306 SDL_EndGPUCopyPass(cpass);
307 SDL_ReleaseGPUTransferBuffer(renderdata->device, tbuf);
308
309 return true;
310}
311
312static bool GPU_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
313 const SDL_Rect *rect, void **pixels, int *pitch)
314{
315 GPU_TextureData *data = (GPU_TextureData *)texture->internal;
316
317 data->locked_rect = *rect;
318 *pixels =
319 (void *)((Uint8 *)data->pixels + rect->y * data->pitch +
320 rect->x * SDL_BYTESPERPIXEL(texture->format));
321 *pitch = data->pitch;
322 return true;
323}
324
325static void GPU_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
326{
327 GPU_TextureData *data = (GPU_TextureData *)texture->internal;
328 const SDL_Rect *rect;
329 void *pixels;
330
331 rect = &data->locked_rect;
332 pixels =
333 (void *)((Uint8 *)data->pixels + rect->y * data->pitch +
334 rect->x * SDL_BYTESPERPIXEL(texture->format));
335 GPU_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
336}
337
338static void GPU_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scale_mode)
339{
340 // nothing to do in this backend.
341}
342
343static bool GPU_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
344{
345 GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
346
347 data->state.render_target = texture;
348
349 return true;
350}
351
352static bool GPU_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
353{
354 return true; // nothing to do in this backend.
355}
356
357static SDL_FColor GetDrawCmdColor(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
358{
359 SDL_FColor color = cmd->data.color.color;
360
361 if (SDL_RenderingLinearSpace(renderer)) {
362 SDL_ConvertToLinear(&color);
363 }
364
365 color.r *= cmd->data.color.color_scale;
366 color.g *= cmd->data.color.color_scale;
367 color.b *= cmd->data.color.color_scale;
368
369 return color;
370}
371
372static bool GPU_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
373{
374 float *verts = (float *)SDL_AllocateRenderVertices(renderer, count * 2 * sizeof(float), 0, &cmd->data.draw.first);
375
376 if (!verts) {
377 return false;
378 }
379
380 cmd->data.draw.count = count;
381 for (int i = 0; i < count; i++) {
382 *(verts++) = 0.5f + points[i].x;
383 *(verts++) = 0.5f + points[i].y;
384 }
385
386 return true;
387}
388
389static bool GPU_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
390 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
391 int num_vertices, const void *indices, int num_indices, int size_indices,
392 float scale_x, float scale_y)
393{
394 int i;
395 int count = indices ? num_indices : num_vertices;
396 float *verts;
397 size_t sz = 2 * sizeof(float) + 4 * sizeof(float) + (texture ? 2 : 0) * sizeof(float);
398 const float color_scale = cmd->data.draw.color_scale;
399 bool convert_color = SDL_RenderingLinearSpace(renderer);
400
401 verts = (float *)SDL_AllocateRenderVertices(renderer, count * sz, 0, &cmd->data.draw.first);
402 if (!verts) {
403 return false;
404 }
405
406 cmd->data.draw.count = count;
407 size_indices = indices ? size_indices : 0;
408
409 for (i = 0; i < count; i++) {
410 int j;
411 float *xy_;
412 SDL_FColor col_;
413 if (size_indices == 4) {
414 j = ((const Uint32 *)indices)[i];
415 } else if (size_indices == 2) {
416 j = ((const Uint16 *)indices)[i];
417 } else if (size_indices == 1) {
418 j = ((const Uint8 *)indices)[i];
419 } else {
420 j = i;
421 }
422
423 xy_ = (float *)((char *)xy + j * xy_stride);
424
425 *(verts++) = xy_[0] * scale_x;
426 *(verts++) = xy_[1] * scale_y;
427
428 col_ = *(SDL_FColor *)((char *)color + j * color_stride);
429 if (convert_color) {
430 SDL_ConvertToLinear(&col_);
431 }
432
433 // FIXME: The Vulkan backend doesn't multiply by color_scale. GL does. I'm not sure which one is wrong.
434 // ANSWER: The color scale should be applied in linear space when using the scRGB colorspace. This is done in shaders in the Vulkan backend.
435 *(verts++) = col_.r * color_scale;
436 *(verts++) = col_.g * color_scale;
437 *(verts++) = col_.b * color_scale;
438 *(verts++) = col_.a;
439
440 if (texture) {
441 float *uv_ = (float *)((char *)uv + j * uv_stride);
442 *(verts++) = uv_[0] * texture->w;
443 *(verts++) = uv_[1] * texture->h;
444 }
445 }
446 return true;
447}
448
449static void GPU_InvalidateCachedState(SDL_Renderer *renderer)
450{
451 GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
452
453 data->state.render_target = NULL;
454 data->state.scissor_enabled = false;
455}
456
457static SDL_GPURenderPass *RestartRenderPass(GPU_RenderData *data)
458{
459 if (data->state.render_pass) {
460 SDL_EndGPURenderPass(data->state.render_pass);
461 }
462
463 data->state.render_pass = SDL_BeginGPURenderPass(
464 data->state.command_buffer, &data->state.color_attachment, 1, NULL);
465
466 // *** FIXME ***
467 // This is busted. We should be able to know which load op to use.
468 // LOAD is incorrect behavior most of the time, unless we had to break a render pass.
469 // -cosmonaut
470 data->state.color_attachment.load_op = SDL_GPU_LOADOP_LOAD;
471 data->state.scissor_was_enabled = false;
472
473 return data->state.render_pass;
474}
475
476static void PushUniforms(GPU_RenderData *data, SDL_RenderCommand *cmd)
477{
478 GPU_ShaderUniformData uniforms;
479 SDL_zero(uniforms);
480 uniforms.mvp.m[0][0] = 2.0f / data->state.viewport.w;
481 uniforms.mvp.m[1][1] = -2.0f / data->state.viewport.h;
482 uniforms.mvp.m[2][2] = 1.0f;
483 uniforms.mvp.m[3][0] = -1.0f;
484 uniforms.mvp.m[3][1] = 1.0f;
485 uniforms.mvp.m[3][3] = 1.0f;
486
487 uniforms.color = data->state.draw_color;
488
489 if (cmd->data.draw.texture) {
490 uniforms.texture_size[0] = cmd->data.draw.texture->w;
491 uniforms.texture_size[1] = cmd->data.draw.texture->h;
492 }
493
494 SDL_PushGPUVertexUniformData(data->state.command_buffer, 0, &uniforms, sizeof(uniforms));
495}
496
497static SDL_GPUSampler **SamplerPointer(
498 GPU_RenderData *data, SDL_TextureAddressMode address_mode, SDL_ScaleMode scale_mode)
499{
500 return &data->samplers[scale_mode][address_mode - 1];
501}
502
503static void SetViewportAndScissor(GPU_RenderData *data)
504{
505 SDL_SetGPUViewport(data->state.render_pass, &data->state.viewport);
506
507 if (data->state.scissor_enabled) {
508 SDL_SetGPUScissor(data->state.render_pass, &data->state.scissor);
509 data->state.scissor_was_enabled = true;
510 } else if (data->state.scissor_was_enabled) {
511 SDL_Rect r;
512 r.x = (int)data->state.viewport.x;
513 r.y = (int)data->state.viewport.y;
514 r.w = (int)data->state.viewport.w;
515 r.h = (int)data->state.viewport.h;
516 SDL_SetGPUScissor(data->state.render_pass, &r);
517 data->state.scissor_was_enabled = false;
518 }
519}
520
521static void Draw(
522 GPU_RenderData *data, SDL_RenderCommand *cmd,
523 Uint32 num_verts,
524 Uint32 offset,
525 SDL_GPUPrimitiveType prim)
526{
527 if (!data->state.render_pass || data->state.color_attachment.load_op == SDL_GPU_LOADOP_CLEAR) {
528 RestartRenderPass(data);
529 }
530
531 GPU_VertexShaderID v_shader;
532 GPU_FragmentShaderID f_shader;
533 SDL_GPURenderPass *pass = data->state.render_pass;
534 GPU_TextureData *tdata = NULL;
535
536 if (cmd->data.draw.texture) {
537 tdata = (GPU_TextureData *)cmd->data.draw.texture->internal;
538 }
539
540 if (prim == SDL_GPU_PRIMITIVETYPE_TRIANGLELIST) {
541 if (cmd->data.draw.texture) {
542 v_shader = VERT_SHADER_TRI_TEXTURE;
543 f_shader = tdata->shader;
544 } else {
545 v_shader = VERT_SHADER_TRI_COLOR;
546 f_shader = FRAG_SHADER_COLOR;
547 }
548 } else {
549 v_shader = VERT_SHADER_LINEPOINT;
550 f_shader = FRAG_SHADER_COLOR;
551 }
552
553 GPU_PipelineParameters pipe_params;
554 SDL_zero(pipe_params);
555 pipe_params.blend_mode = cmd->data.draw.blend;
556 pipe_params.vert_shader = v_shader;
557 pipe_params.frag_shader = f_shader;
558 pipe_params.primitive_type = prim;
559
560 if (data->state.render_target) {
561 pipe_params.attachment_format = ((GPU_TextureData *)data->state.render_target->internal)->format;
562 } else {
563 pipe_params.attachment_format = data->backbuffer.format;
564 }
565
566 SDL_GPUGraphicsPipeline *pipe = GPU_GetPipeline(&data->pipeline_cache, &data->shaders, data->device, &pipe_params);
567
568 if (!pipe) {
569 return;
570 }
571
572 SetViewportAndScissor(data);
573 SDL_BindGPUGraphicsPipeline(data->state.render_pass, pipe);
574
575 if (tdata) {
576 SDL_GPUTextureSamplerBinding sampler_bind;
577 SDL_zero(sampler_bind);
578 sampler_bind.sampler = *SamplerPointer(data, cmd->data.draw.texture_address_mode, cmd->data.draw.texture->scaleMode);
579 sampler_bind.texture = tdata->texture;
580 SDL_BindGPUFragmentSamplers(pass, 0, &sampler_bind, 1);
581 }
582
583 SDL_GPUBufferBinding buffer_bind;
584 SDL_zero(buffer_bind);
585 buffer_bind.buffer = data->vertices.buffer;
586 buffer_bind.offset = offset;
587
588 SDL_BindGPUVertexBuffers(pass, 0, &buffer_bind, 1);
589 PushUniforms(data, cmd);
590 SDL_DrawGPUPrimitives(data->state.render_pass, num_verts, 1, 0, 0);
591}
592
593static void ReleaseVertexBuffer(GPU_RenderData *data)
594{
595 if (data->vertices.buffer) {
596 SDL_ReleaseGPUBuffer(data->device, data->vertices.buffer);
597 }
598
599 if (data->vertices.transfer_buf) {
600 SDL_ReleaseGPUTransferBuffer(data->device, data->vertices.transfer_buf);
601 }
602
603 data->vertices.buffer_size = 0;
604}
605
606static bool InitVertexBuffer(GPU_RenderData *data, Uint32 size)
607{
608 SDL_GPUBufferCreateInfo bci;
609 SDL_zero(bci);
610 bci.size = size;
611 bci.usage = SDL_GPU_BUFFERUSAGE_VERTEX;
612
613 data->vertices.buffer = SDL_CreateGPUBuffer(data->device, &bci);
614
615 if (!data->vertices.buffer) {
616 return false;
617 }
618
619 SDL_GPUTransferBufferCreateInfo tbci;
620 SDL_zero(tbci);
621 tbci.size = size;
622 tbci.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD;
623
624 data->vertices.transfer_buf = SDL_CreateGPUTransferBuffer(data->device, &tbci);
625
626 if (!data->vertices.transfer_buf) {
627 return false;
628 }
629
630 return true;
631}
632
633static bool UploadVertices(GPU_RenderData *data, void *vertices, size_t vertsize)
634{
635 if (vertsize == 0) {
636 return true;
637 }
638
639 if (vertsize > data->vertices.buffer_size) {
640 ReleaseVertexBuffer(data);
641 if (!InitVertexBuffer(data, (Uint32)vertsize)) {
642 return false;
643 }
644 }
645
646 void *staging_buf = SDL_MapGPUTransferBuffer(data->device, data->vertices.transfer_buf, true);
647 SDL_memcpy(staging_buf, vertices, vertsize);
648 SDL_UnmapGPUTransferBuffer(data->device, data->vertices.transfer_buf);
649
650 SDL_GPUCopyPass *pass = SDL_BeginGPUCopyPass(data->state.command_buffer);
651
652 if (!pass) {
653 return false;
654 }
655
656 SDL_GPUTransferBufferLocation src;
657 SDL_zero(src);
658 src.transfer_buffer = data->vertices.transfer_buf;
659
660 SDL_GPUBufferRegion dst;
661 SDL_zero(dst);
662 dst.buffer = data->vertices.buffer;
663 dst.size = (Uint32)vertsize;
664
665 SDL_UploadToGPUBuffer(pass, &src, &dst, true);
666 SDL_EndGPUCopyPass(pass);
667
668 return true;
669}
670
671// *** FIXME ***
672// We might be able to run these data uploads on a separate command buffer
673// which would allow us to avoid breaking render passes.
674// Honestly I'm a little skeptical of this entire approach,
675// we already have a command buffer structure
676// so it feels weird to be deferring the operations manually.
677// We could also fairly easily run the geometry transformations
678// on compute shaders instead of the CPU, which would be a HUGE performance win.
679// -cosmonaut
680static bool GPU_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
681{
682 GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
683
684 if (!UploadVertices(data, vertices, vertsize)) {
685 return false;
686 }
687
688 data->state.color_attachment.load_op = SDL_GPU_LOADOP_LOAD;
689
690 if (renderer->target) {
691 GPU_TextureData *tdata = renderer->target->internal;
692 data->state.color_attachment.texture = tdata->texture;
693 } else {
694 data->state.color_attachment.texture = data->backbuffer.texture;
695 }
696
697 if (!data->state.color_attachment.texture) {
698 return SDL_SetError("Render target texture is NULL");
699 }
700
701 while (cmd) {
702 switch (cmd->command) {
703 case SDL_RENDERCMD_SETDRAWCOLOR:
704 {
705 data->state.draw_color = GetDrawCmdColor(renderer, cmd);
706 break;
707 }
708
709 case SDL_RENDERCMD_SETVIEWPORT:
710 {
711 SDL_Rect *viewport = &cmd->data.viewport.rect;
712 data->state.viewport.x = viewport->x;
713 data->state.viewport.y = viewport->y;
714 data->state.viewport.w = viewport->w;
715 data->state.viewport.h = viewport->h;
716 break;
717 }
718
719 case SDL_RENDERCMD_SETCLIPRECT:
720 {
721 const SDL_Rect *rect = &cmd->data.cliprect.rect;
722 data->state.scissor.x = (int)data->state.viewport.x + rect->x;
723 data->state.scissor.y = (int)data->state.viewport.y + rect->y;
724 data->state.scissor.w = rect->w;
725 data->state.scissor.h = rect->h;
726 data->state.scissor_enabled = cmd->data.cliprect.enabled;
727 break;
728 }
729
730 case SDL_RENDERCMD_CLEAR:
731 {
732 data->state.color_attachment.clear_color = GetDrawCmdColor(renderer, cmd);
733 data->state.color_attachment.load_op = SDL_GPU_LOADOP_CLEAR;
734 break;
735 }
736
737 case SDL_RENDERCMD_FILL_RECTS: // unused
738 break;
739
740 case SDL_RENDERCMD_COPY: // unused
741 break;
742
743 case SDL_RENDERCMD_COPY_EX: // unused
744 break;
745
746 case SDL_RENDERCMD_DRAW_LINES:
747 {
748 Uint32 count = (Uint32)cmd->data.draw.count;
749 Uint32 offset = (Uint32)cmd->data.draw.first;
750
751 if (count > 2) {
752 // joined lines cannot be grouped
753 Draw(data, cmd, count, offset, SDL_GPU_PRIMITIVETYPE_LINESTRIP);
754 } else {
755 // let's group non joined lines
756 SDL_RenderCommand *finalcmd = cmd;
757 SDL_RenderCommand *nextcmd = cmd->next;
758 SDL_BlendMode thisblend = cmd->data.draw.blend;
759
760 while (nextcmd) {
761 const SDL_RenderCommandType nextcmdtype = nextcmd->command;
762 if (nextcmdtype != SDL_RENDERCMD_DRAW_LINES) {
763 break; // can't go any further on this draw call, different render command up next.
764 } else if (nextcmd->data.draw.count != 2) {
765 break; // can't go any further on this draw call, those are joined lines
766 } else if (nextcmd->data.draw.blend != thisblend) {
767 break; // can't go any further on this draw call, different blendmode copy up next.
768 } else {
769 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
770 count += (Uint32)nextcmd->data.draw.count;
771 }
772 nextcmd = nextcmd->next;
773 }
774
775 Draw(data, cmd, count, offset, SDL_GPU_PRIMITIVETYPE_LINELIST);
776 cmd = finalcmd; // skip any copy commands we just combined in here.
777 }
778 break;
779 }
780
781 case SDL_RENDERCMD_DRAW_POINTS:
782 case SDL_RENDERCMD_GEOMETRY:
783 {
784 /* as long as we have the same copy command in a row, with the
785 same texture, we can combine them all into a single draw call. */
786 SDL_Texture *thistexture = cmd->data.draw.texture;
787 SDL_BlendMode thisblend = cmd->data.draw.blend;
788 const SDL_RenderCommandType thiscmdtype = cmd->command;
789 SDL_RenderCommand *finalcmd = cmd;
790 SDL_RenderCommand *nextcmd = cmd->next;
791 Uint32 count = (Uint32)cmd->data.draw.count;
792 Uint32 offset = (Uint32)cmd->data.draw.first;
793
794 while (nextcmd) {
795 const SDL_RenderCommandType nextcmdtype = nextcmd->command;
796 if (nextcmdtype != thiscmdtype) {
797 break; // can't go any further on this draw call, different render command up next.
798 } else if (nextcmd->data.draw.texture != thistexture || nextcmd->data.draw.blend != thisblend) {
799 // FIXME should we check address mode too?
800 break; // can't go any further on this draw call, different texture/blendmode copy up next.
801 } else {
802 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
803 count += (Uint32)nextcmd->data.draw.count;
804 }
805 nextcmd = nextcmd->next;
806 }
807
808 SDL_GPUPrimitiveType prim = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; // SDL_RENDERCMD_GEOMETRY
809 if (thiscmdtype == SDL_RENDERCMD_DRAW_POINTS) {
810 prim = SDL_GPU_PRIMITIVETYPE_POINTLIST;
811 }
812
813 Draw(data, cmd, count, offset, prim);
814
815 cmd = finalcmd; // skip any copy commands we just combined in here.
816 break;
817 }
818
819 case SDL_RENDERCMD_NO_OP:
820 break;
821 }
822
823 cmd = cmd->next;
824 }
825
826 if (data->state.color_attachment.load_op == SDL_GPU_LOADOP_CLEAR) {
827 RestartRenderPass(data);
828 }
829
830 if (data->state.render_pass) {
831 SDL_EndGPURenderPass(data->state.render_pass);
832 data->state.render_pass = NULL;
833 }
834
835 return true;
836}
837
838static SDL_Surface *GPU_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
839{
840 GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
841 SDL_GPUTexture *gpu_tex;
842 SDL_PixelFormat pixfmt;
843
844 if (data->state.render_target) {
845 SDL_Texture *texture = data->state.render_target;
846 GPU_TextureData *texdata = texture->internal;
847 gpu_tex = texdata->texture;
848 pixfmt = texture->format;
849 } else {
850 gpu_tex = data->backbuffer.texture;
851 pixfmt = TexFormatToPixFormat(data->backbuffer.format);
852
853 if (pixfmt == SDL_PIXELFORMAT_UNKNOWN) {
854 SDL_SetError("Unsupported backbuffer format");
855 return NULL;
856 }
857 }
858
859 Uint32 bpp = SDL_BYTESPERPIXEL(pixfmt);
860 size_t row_size, image_size;
861
862 if (!SDL_size_mul_check_overflow(rect->w, bpp, &row_size) ||
863 !SDL_size_mul_check_overflow(rect->h, row_size, &image_size)) {
864 SDL_SetError("read size overflow");
865 return NULL;
866 }
867
868 SDL_Surface *surface = SDL_CreateSurface(rect->w, rect->h, pixfmt);
869
870 if (!surface) {
871 return NULL;
872 }
873
874 SDL_GPUTransferBufferCreateInfo tbci;
875 SDL_zero(tbci);
876 tbci.size = (Uint32)image_size;
877 tbci.usage = SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD;
878
879 SDL_GPUTransferBuffer *tbuf = SDL_CreateGPUTransferBuffer(data->device, &tbci);
880
881 if (!tbuf) {
882 return NULL;
883 }
884
885 SDL_GPUCopyPass *pass = SDL_BeginGPUCopyPass(data->state.command_buffer);
886
887 SDL_GPUTextureRegion src;
888 SDL_zero(src);
889 src.texture = gpu_tex;
890 src.x = rect->x;
891 src.y = rect->y;
892 src.w = rect->w;
893 src.h = rect->h;
894 src.d = 1;
895
896 SDL_GPUTextureTransferInfo dst;
897 SDL_zero(dst);
898 dst.transfer_buffer = tbuf;
899 dst.rows_per_layer = rect->h;
900 dst.pixels_per_row = rect->w;
901
902 SDL_DownloadFromGPUTexture(pass, &src, &dst);
903 SDL_EndGPUCopyPass(pass);
904
905 SDL_GPUFence *fence = SDL_SubmitGPUCommandBufferAndAcquireFence(data->state.command_buffer);
906 SDL_WaitForGPUFences(data->device, true, &fence, 1);
907 SDL_ReleaseGPUFence(data->device, fence);
908 data->state.command_buffer = SDL_AcquireGPUCommandBuffer(data->device);
909
910 void *mapped_tbuf = SDL_MapGPUTransferBuffer(data->device, tbuf, false);
911
912 if ((size_t)surface->pitch == row_size) {
913 SDL_memcpy(surface->pixels, mapped_tbuf, image_size);
914 } else {
915 Uint8 *input = mapped_tbuf;
916 Uint8 *output = surface->pixels;
917
918 for (int row = 0; row < rect->h; ++row) {
919 SDL_memcpy(output, input, row_size);
920 output += surface->pitch;
921 input += row_size;
922 }
923 }
924
925 SDL_UnmapGPUTransferBuffer(data->device, tbuf);
926 SDL_ReleaseGPUTransferBuffer(data->device, tbuf);
927
928 return surface;
929}
930
931static bool CreateBackbuffer(GPU_RenderData *data, Uint32 w, Uint32 h, SDL_GPUTextureFormat fmt)
932{
933 SDL_GPUTextureCreateInfo tci;
934 SDL_zero(tci);
935 tci.width = w;
936 tci.height = h;
937 tci.format = fmt;
938 tci.layer_count_or_depth = 1;
939 tci.num_levels = 1;
940 tci.sample_count = SDL_GPU_SAMPLECOUNT_1;
941 tci.usage = SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | SDL_GPU_TEXTUREUSAGE_SAMPLER;
942
943 data->backbuffer.texture = SDL_CreateGPUTexture(data->device, &tci);
944 data->backbuffer.width = w;
945 data->backbuffer.height = h;
946 data->backbuffer.format = fmt;
947
948 if (!data->backbuffer.texture) {
949 return false;
950 }
951
952 return true;
953}
954
955static bool GPU_RenderPresent(SDL_Renderer *renderer)
956{
957 GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
958
959 SDL_GPUTexture *swapchain;
960 Uint32 swapchain_texture_width, swapchain_texture_height;
961 bool result = SDL_WaitAndAcquireGPUSwapchainTexture(data->state.command_buffer, renderer->window, &swapchain, &swapchain_texture_width, &swapchain_texture_height);
962
963 if (!result) {
964 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Failed to acquire swapchain texture: %s", SDL_GetError());
965 }
966
967 if (swapchain != NULL) {
968 SDL_GPUBlitInfo blit_info;
969 SDL_zero(blit_info);
970
971 blit_info.source.texture = data->backbuffer.texture;
972 blit_info.source.w = data->backbuffer.width;
973 blit_info.source.h = data->backbuffer.height;
974 blit_info.destination.texture = swapchain;
975 blit_info.destination.w = swapchain_texture_width;
976 blit_info.destination.h = swapchain_texture_height;
977 blit_info.load_op = SDL_GPU_LOADOP_DONT_CARE;
978 blit_info.filter = SDL_GPU_FILTER_LINEAR;
979
980 SDL_BlitGPUTexture(data->state.command_buffer, &blit_info);
981
982 SDL_SubmitGPUCommandBuffer(data->state.command_buffer);
983
984 if (swapchain_texture_width != data->backbuffer.width || swapchain_texture_height != data->backbuffer.height) {
985 SDL_ReleaseGPUTexture(data->device, data->backbuffer.texture);
986 CreateBackbuffer(data, swapchain_texture_width, swapchain_texture_height, SDL_GetGPUSwapchainTextureFormat(data->device, renderer->window));
987 }
988 } else {
989 SDL_SubmitGPUCommandBuffer(data->state.command_buffer);
990 }
991
992 data->state.command_buffer = SDL_AcquireGPUCommandBuffer(data->device);
993
994 return true;
995}
996
997static void GPU_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
998{
999 GPU_RenderData *renderdata = (GPU_RenderData *)renderer->internal;
1000 GPU_TextureData *data = (GPU_TextureData *)texture->internal;
1001
1002 if (renderdata->state.render_target == texture) {
1003 renderdata->state.render_target = NULL;
1004 }
1005
1006 if (!data) {
1007 return;
1008 }
1009
1010 SDL_ReleaseGPUTexture(renderdata->device, data->texture);
1011 SDL_free(data->pixels);
1012 SDL_free(data);
1013 texture->internal = NULL;
1014}
1015
1016static void GPU_DestroyRenderer(SDL_Renderer *renderer)
1017{
1018 GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
1019
1020 if (!data) {
1021 return;
1022 }
1023
1024 if (data->state.command_buffer) {
1025 SDL_SubmitGPUCommandBuffer(data->state.command_buffer);
1026 data->state.command_buffer = NULL;
1027 }
1028
1029 for (Uint32 i = 0; i < sizeof(data->samplers) / sizeof(SDL_GPUSampler *); ++i) {
1030 SDL_ReleaseGPUSampler(data->device, ((SDL_GPUSampler **)data->samplers)[i]);
1031 }
1032
1033 if (data->backbuffer.texture) {
1034 SDL_ReleaseGPUTexture(data->device, data->backbuffer.texture);
1035 }
1036
1037 if (renderer->window) {
1038 SDL_ReleaseWindowFromGPUDevice(data->device, renderer->window);
1039 }
1040
1041 ReleaseVertexBuffer(data);
1042 GPU_DestroyPipelineCache(&data->pipeline_cache);
1043 GPU_ReleaseShaders(&data->shaders, data->device);
1044 SDL_DestroyGPUDevice(data->device);
1045
1046 SDL_free(data);
1047}
1048
1049static bool ChoosePresentMode(SDL_GPUDevice *device, SDL_Window *window, const int vsync, SDL_GPUPresentMode *out_mode)
1050{
1051 SDL_GPUPresentMode mode;
1052
1053 switch (vsync) {
1054 case 0:
1055 mode = SDL_GPU_PRESENTMODE_MAILBOX;
1056
1057 if (!SDL_WindowSupportsGPUPresentMode(device, window, mode)) {
1058 mode = SDL_GPU_PRESENTMODE_IMMEDIATE;
1059
1060 if (!SDL_WindowSupportsGPUPresentMode(device, window, mode)) {
1061 mode = SDL_GPU_PRESENTMODE_VSYNC;
1062 }
1063 }
1064
1065 // FIXME should we return an error if both mailbox and immediate fail?
1066 break;
1067
1068 case 1:
1069 mode = SDL_GPU_PRESENTMODE_VSYNC;
1070 break;
1071
1072 default:
1073 return SDL_Unsupported();
1074 }
1075
1076 *out_mode = mode;
1077 return true;
1078}
1079
1080static bool GPU_SetVSync(SDL_Renderer *renderer, const int vsync)
1081{
1082 GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
1083 SDL_GPUPresentMode mode = SDL_GPU_PRESENTMODE_VSYNC;
1084
1085 if (!ChoosePresentMode(data->device, renderer->window, vsync, &mode)) {
1086 return false;
1087 }
1088
1089 if (mode != data->swapchain.present_mode) {
1090 // XXX returns bool instead of SDL-style error code
1091 if (SDL_SetGPUSwapchainParameters(data->device, renderer->window, data->swapchain.composition, mode)) {
1092 data->swapchain.present_mode = mode;
1093 return true;
1094 } else {
1095 return false;
1096 }
1097 }
1098
1099 return true;
1100}
1101
1102static bool InitSamplers(GPU_RenderData *data)
1103{
1104 struct
1105 {
1106 struct
1107 {
1108 SDL_TextureAddressMode address_mode;
1109 SDL_ScaleMode scale_mode;
1110 } sdl;
1111 struct
1112 {
1113 SDL_GPUSamplerAddressMode address_mode;
1114 SDL_GPUFilter filter;
1115 SDL_GPUSamplerMipmapMode mipmap_mode;
1116 Uint32 anisotropy;
1117 } gpu;
1118 } configs[] = {
1119 {
1120 { SDL_TEXTURE_ADDRESS_CLAMP, SDL_SCALEMODE_NEAREST },
1121 { SDL_GPU_SAMPLERADDRESSMODE_REPEAT, SDL_GPU_FILTER_NEAREST, SDL_GPU_SAMPLERMIPMAPMODE_NEAREST, 0 },
1122 },
1123 {
1124 { SDL_TEXTURE_ADDRESS_CLAMP, SDL_SCALEMODE_LINEAR },
1125 { SDL_GPU_SAMPLERADDRESSMODE_REPEAT, SDL_GPU_FILTER_LINEAR, SDL_GPU_SAMPLERMIPMAPMODE_LINEAR, 0 },
1126 },
1127 {
1128 { SDL_TEXTURE_ADDRESS_WRAP, SDL_SCALEMODE_NEAREST },
1129 { SDL_GPU_SAMPLERADDRESSMODE_REPEAT, SDL_GPU_FILTER_NEAREST, SDL_GPU_SAMPLERMIPMAPMODE_NEAREST, 0 },
1130 },
1131 {
1132 { SDL_TEXTURE_ADDRESS_WRAP, SDL_SCALEMODE_LINEAR },
1133 { SDL_GPU_SAMPLERADDRESSMODE_REPEAT, SDL_GPU_FILTER_LINEAR, SDL_GPU_SAMPLERMIPMAPMODE_LINEAR, 0 },
1134 },
1135 };
1136
1137 for (Uint32 i = 0; i < SDL_arraysize(configs); ++i) {
1138 SDL_GPUSamplerCreateInfo sci;
1139 SDL_zero(sci);
1140 sci.max_anisotropy = configs[i].gpu.anisotropy;
1141 sci.enable_anisotropy = configs[i].gpu.anisotropy > 0;
1142 sci.address_mode_u = sci.address_mode_v = sci.address_mode_w = configs[i].gpu.address_mode;
1143 sci.min_filter = sci.mag_filter = configs[i].gpu.filter;
1144 sci.mipmap_mode = configs[i].gpu.mipmap_mode;
1145
1146 SDL_GPUSampler *sampler = SDL_CreateGPUSampler(data->device, &sci);
1147
1148 if (sampler == NULL) {
1149 return false;
1150 }
1151
1152 *SamplerPointer(data, configs[i].sdl.address_mode, configs[i].sdl.scale_mode) = sampler;
1153 }
1154
1155 return true;
1156}
1157
1158static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
1159{
1160 GPU_RenderData *data = NULL;
1161
1162 SDL_SetupRendererColorspace(renderer, create_props);
1163
1164 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
1165 // TODO
1166 return SDL_SetError("Unsupported output colorspace");
1167 }
1168
1169 data = (GPU_RenderData *)SDL_calloc(1, sizeof(*data));
1170 if (!data) {
1171 return false;
1172 }
1173
1174 renderer->SupportsBlendMode = GPU_SupportsBlendMode;
1175 renderer->CreateTexture = GPU_CreateTexture;
1176 renderer->UpdateTexture = GPU_UpdateTexture;
1177 renderer->LockTexture = GPU_LockTexture;
1178 renderer->UnlockTexture = GPU_UnlockTexture;
1179 renderer->SetTextureScaleMode = GPU_SetTextureScaleMode;
1180 renderer->SetRenderTarget = GPU_SetRenderTarget;
1181 renderer->QueueSetViewport = GPU_QueueNoOp;
1182 renderer->QueueSetDrawColor = GPU_QueueNoOp;
1183 renderer->QueueDrawPoints = GPU_QueueDrawPoints;
1184 renderer->QueueDrawLines = GPU_QueueDrawPoints; // lines and points queue vertices the same way.
1185 renderer->QueueGeometry = GPU_QueueGeometry;
1186 renderer->InvalidateCachedState = GPU_InvalidateCachedState;
1187 renderer->RunCommandQueue = GPU_RunCommandQueue;
1188 renderer->RenderReadPixels = GPU_RenderReadPixels;
1189 renderer->RenderPresent = GPU_RenderPresent;
1190 renderer->DestroyTexture = GPU_DestroyTexture;
1191 renderer->DestroyRenderer = GPU_DestroyRenderer;
1192 renderer->SetVSync = GPU_SetVSync;
1193 renderer->internal = data;
1194 renderer->window = window;
1195 renderer->name = GPU_RenderDriver.name;
1196
1197 bool debug = SDL_GetBooleanProperty(create_props, SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN, false);
1198 bool lowpower = SDL_GetBooleanProperty(create_props, SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN, false);
1199
1200 // Prefer environment variables/hints if they exist, otherwise defer to properties
1201 debug = SDL_GetHintBoolean(SDL_HINT_RENDER_GPU_DEBUG, debug);
1202 lowpower = SDL_GetHintBoolean(SDL_HINT_RENDER_GPU_LOW_POWER, lowpower);
1203
1204 SDL_SetBooleanProperty(create_props, SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN, debug);
1205 SDL_SetBooleanProperty(create_props, SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN, lowpower);
1206
1207 GPU_FillSupportedShaderFormats(create_props);
1208 data->device = SDL_CreateGPUDeviceWithProperties(create_props);
1209
1210 if (!data->device) {
1211 return false;
1212 }
1213
1214 if (!GPU_InitShaders(&data->shaders, data->device)) {
1215 return false;
1216 }
1217
1218 if (!GPU_InitPipelineCache(&data->pipeline_cache, data->device)) {
1219 return false;
1220 }
1221
1222 // XXX what's a good initial size?
1223 if (!InitVertexBuffer(data, 1 << 16)) {
1224 return false;
1225 }
1226
1227 if (!InitSamplers(data)) {
1228 return false;
1229 }
1230
1231 if (!SDL_ClaimWindowForGPUDevice(data->device, window)) {
1232 return false;
1233 }
1234
1235 data->swapchain.composition = SDL_GPU_SWAPCHAINCOMPOSITION_SDR;
1236 data->swapchain.present_mode = SDL_GPU_PRESENTMODE_VSYNC;
1237
1238 int vsync = (int)SDL_GetNumberProperty(create_props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 0);
1239 ChoosePresentMode(data->device, window, vsync, &data->swapchain.present_mode);
1240
1241 SDL_SetGPUSwapchainParameters(data->device, window, data->swapchain.composition, data->swapchain.present_mode);
1242
1243 SDL_SetGPUAllowedFramesInFlight(data->device, 1);
1244
1245 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32);
1246 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
1247 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
1248 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
1249
1250 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384);
1251
1252 data->state.draw_color.r = 1.0f;
1253 data->state.draw_color.g = 1.0f;
1254 data->state.draw_color.b = 1.0f;
1255 data->state.draw_color.a = 1.0f;
1256 data->state.viewport.min_depth = 0;
1257 data->state.viewport.max_depth = 1;
1258 data->state.command_buffer = SDL_AcquireGPUCommandBuffer(data->device);
1259
1260 int w, h;
1261 SDL_GetWindowSizeInPixels(window, &w, &h);
1262
1263 if (!CreateBackbuffer(data, w, h, SDL_GetGPUSwapchainTextureFormat(data->device, window))) {
1264 return false;
1265 }
1266
1267 SDL_SetPointerProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_GPU_DEVICE_POINTER, data->device);
1268
1269 return true;
1270}
1271
1272SDL_RenderDriver GPU_RenderDriver = {
1273 GPU_CreateRenderer, "gpu"
1274};
1275
1276#endif // SDL_VIDEO_RENDER_GPU
diff --git a/SDL-3.2.8/src/render/gpu/SDL_shaders_gpu.c b/SDL-3.2.8/src/render/gpu/SDL_shaders_gpu.c
new file mode 100644
index 0000000..a56fb0c
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/SDL_shaders_gpu.c
@@ -0,0 +1,232 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_GPU
24
25#include "SDL_shaders_gpu.h"
26
27// SDL_GPU shader implementation
28
29typedef struct GPU_ShaderModuleSource
30{
31 const unsigned char *code;
32 unsigned int code_len;
33 SDL_GPUShaderFormat format;
34} GPU_ShaderModuleSource;
35
36#if defined(SDL_GPU_VULKAN) && SDL_GPU_VULKAN
37#define IF_VULKAN(...) __VA_ARGS__
38#define HAVE_SPIRV_SHADERS 1
39#include "shaders/spir-v.h"
40#else
41#define IF_VULKAN(...)
42#define HAVE_SPIRV_SHADERS 0
43#endif
44
45#ifdef SDL_GPU_D3D12
46#define IF_D3D12(...) __VA_ARGS__
47#define HAVE_DXIL60_SHADERS 1
48#include "shaders/dxil60.h"
49#else
50#define IF_D3D12(...)
51#define HAVE_DXIL60_SHADERS 0
52#endif
53
54#ifdef SDL_GPU_METAL
55#define IF_METAL(...) __VA_ARGS__
56#define HAVE_METAL_SHADERS 1
57#include "shaders/metal.h"
58#else
59#define IF_METAL(...)
60#define HAVE_METAL_SHADERS 0
61#endif
62
63typedef struct GPU_ShaderSources
64{
65 IF_VULKAN(GPU_ShaderModuleSource spirv;)
66 IF_D3D12(GPU_ShaderModuleSource dxil60;)
67 IF_METAL(GPU_ShaderModuleSource msl;)
68 unsigned int num_samplers;
69 unsigned int num_uniform_buffers;
70} GPU_ShaderSources;
71
72#define SHADER_SPIRV(code) \
73 IF_VULKAN(.spirv = { code, sizeof(code), SDL_GPU_SHADERFORMAT_SPIRV }, )
74
75#define SHADER_DXIL60(code) \
76 IF_D3D12(.dxil60 = { code, sizeof(code), SDL_GPU_SHADERFORMAT_DXIL }, )
77
78#define SHADER_METAL(code) \
79 IF_METAL(.msl = { code, sizeof(code), SDL_GPU_SHADERFORMAT_MSL }, )
80
81// clang-format off
82static const GPU_ShaderSources vert_shader_sources[NUM_VERT_SHADERS] = {
83 [VERT_SHADER_LINEPOINT] = {
84 .num_samplers = 0,
85 .num_uniform_buffers = 1,
86 SHADER_SPIRV(linepoint_vert_spv)
87 SHADER_DXIL60(linepoint_vert_sm60_dxil)
88 SHADER_METAL(linepoint_vert_metal)
89 },
90 [VERT_SHADER_TRI_COLOR] = {
91 .num_samplers = 0,
92 .num_uniform_buffers = 1,
93 SHADER_SPIRV(tri_color_vert_spv)
94 SHADER_DXIL60(tri_color_vert_sm60_dxil)
95 SHADER_METAL(tri_color_vert_metal)
96 },
97 [VERT_SHADER_TRI_TEXTURE] = {
98 .num_samplers = 0,
99 .num_uniform_buffers = 1,
100 SHADER_SPIRV(tri_texture_vert_spv)
101 SHADER_DXIL60(tri_texture_vert_sm60_dxil)
102 SHADER_METAL(tri_texture_vert_metal)
103 },
104};
105
106static const GPU_ShaderSources frag_shader_sources[NUM_FRAG_SHADERS] = {
107 [FRAG_SHADER_COLOR] = {
108 .num_samplers = 0,
109 .num_uniform_buffers = 0,
110 SHADER_SPIRV(color_frag_spv)
111 SHADER_DXIL60(color_frag_sm60_dxil)
112 SHADER_METAL(color_frag_metal)
113 },
114 [FRAG_SHADER_TEXTURE_RGB] = {
115 .num_samplers = 1,
116 .num_uniform_buffers = 0,
117 SHADER_SPIRV(texture_rgb_frag_spv)
118 SHADER_DXIL60(texture_rgb_frag_sm60_dxil)
119 SHADER_METAL(texture_rgb_frag_metal)
120 },
121 [FRAG_SHADER_TEXTURE_RGBA] = {
122 .num_samplers = 1,
123 .num_uniform_buffers = 0,
124 SHADER_SPIRV(texture_rgba_frag_spv)
125 SHADER_DXIL60(texture_rgba_frag_sm60_dxil)
126 SHADER_METAL(texture_rgba_frag_metal)
127 },
128};
129// clang-format on
130
131static SDL_GPUShader *CompileShader(const GPU_ShaderSources *sources, SDL_GPUDevice *device, SDL_GPUShaderStage stage)
132{
133 const GPU_ShaderModuleSource *sms = NULL;
134 SDL_GPUShaderFormat formats = SDL_GetGPUShaderFormats(device);
135
136 if (formats == SDL_GPU_SHADERFORMAT_INVALID) {
137 // SDL_GetGPUShaderFormats already set the error
138 return NULL;
139#if HAVE_SPIRV_SHADERS
140 } else if (formats & SDL_GPU_SHADERFORMAT_SPIRV) {
141 sms = &sources->spirv;
142#endif // HAVE_SPIRV_SHADERS
143#if HAVE_DXIL60_SHADERS
144 } else if (formats & SDL_GPU_SHADERFORMAT_DXIL) {
145 sms = &sources->dxil60;
146#endif // HAVE_DXIL60_SHADERS
147#if HAVE_METAL_SHADERS
148 } else if (formats & SDL_GPU_SHADERFORMAT_MSL) {
149 sms = &sources->msl;
150#endif // HAVE_METAL_SHADERS
151 } else {
152 SDL_SetError("Unsupported GPU backend");
153 return NULL;
154 }
155
156 SDL_GPUShaderCreateInfo sci = { 0 };
157 sci.code = sms->code;
158 sci.code_size = sms->code_len;
159 sci.format = sms->format;
160 // FIXME not sure if this is correct
161 sci.entrypoint =
162#if HAVE_METAL_SHADERS
163 (sms == &sources->msl) ? "main0" :
164#endif // HAVE_METAL_SHADERS
165 "main";
166 sci.num_samplers = sources->num_samplers;
167 sci.num_uniform_buffers = sources->num_uniform_buffers;
168 sci.stage = stage;
169
170 return SDL_CreateGPUShader(device, &sci);
171}
172
173bool GPU_InitShaders(GPU_Shaders *shaders, SDL_GPUDevice *device)
174{
175 for (int i = 0; i < SDL_arraysize(vert_shader_sources); ++i) {
176 shaders->vert_shaders[i] = CompileShader(
177 &vert_shader_sources[i], device, SDL_GPU_SHADERSTAGE_VERTEX);
178 if (shaders->vert_shaders[i] == NULL) {
179 GPU_ReleaseShaders(shaders, device);
180 return false;
181 }
182 }
183
184 for (int i = 0; i < SDL_arraysize(frag_shader_sources); ++i) {
185 shaders->frag_shaders[i] = CompileShader(
186 &frag_shader_sources[i], device, SDL_GPU_SHADERSTAGE_FRAGMENT);
187 if (shaders->frag_shaders[i] == NULL) {
188 GPU_ReleaseShaders(shaders, device);
189 return false;
190 }
191 }
192
193 return true;
194}
195
196void GPU_ReleaseShaders(GPU_Shaders *shaders, SDL_GPUDevice *device)
197{
198 for (int i = 0; i < SDL_arraysize(shaders->vert_shaders); ++i) {
199 SDL_ReleaseGPUShader(device, shaders->vert_shaders[i]);
200 shaders->vert_shaders[i] = NULL;
201 }
202
203 for (int i = 0; i < SDL_arraysize(shaders->frag_shaders); ++i) {
204 SDL_ReleaseGPUShader(device, shaders->frag_shaders[i]);
205 shaders->frag_shaders[i] = NULL;
206 }
207}
208
209SDL_GPUShader *GPU_GetVertexShader(GPU_Shaders *shaders, GPU_VertexShaderID id)
210{
211 SDL_assert((unsigned int)id < SDL_arraysize(shaders->vert_shaders));
212 SDL_GPUShader *shader = shaders->vert_shaders[id];
213 SDL_assert(shader != NULL);
214 return shader;
215}
216
217SDL_GPUShader *GPU_GetFragmentShader(GPU_Shaders *shaders, GPU_FragmentShaderID id)
218{
219 SDL_assert((unsigned int)id < SDL_arraysize(shaders->frag_shaders));
220 SDL_GPUShader *shader = shaders->frag_shaders[id];
221 SDL_assert(shader != NULL);
222 return shader;
223}
224
225void GPU_FillSupportedShaderFormats(SDL_PropertiesID props)
226{
227 SDL_SetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN, HAVE_SPIRV_SHADERS);
228 SDL_SetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN, HAVE_DXIL60_SHADERS);
229 SDL_SetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN, HAVE_METAL_SHADERS);
230}
231
232#endif // SDL_VIDEO_RENDER_GPU
diff --git a/SDL-3.2.8/src/render/gpu/SDL_shaders_gpu.h b/SDL-3.2.8/src/render/gpu/SDL_shaders_gpu.h
new file mode 100644
index 0000000..16b5a11
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/SDL_shaders_gpu.h
@@ -0,0 +1,63 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_shaders_gpu_h_
23#define SDL_shaders_gpu_h_
24
25#include "SDL_internal.h"
26
27// SDL_GPU shader implementation
28
29typedef enum
30{
31 VERT_SHADER_INVALID = -1,
32 VERT_SHADER_LINEPOINT,
33 VERT_SHADER_TRI_COLOR,
34 VERT_SHADER_TRI_TEXTURE,
35
36 NUM_VERT_SHADERS,
37} GPU_VertexShaderID;
38
39typedef enum
40{
41 FRAG_SHADER_INVALID = -1,
42 FRAG_SHADER_COLOR,
43 FRAG_SHADER_TEXTURE_RGB,
44 FRAG_SHADER_TEXTURE_RGBA,
45
46 NUM_FRAG_SHADERS,
47} GPU_FragmentShaderID;
48
49struct GPU_Shaders
50{
51 SDL_GPUShader *vert_shaders[NUM_VERT_SHADERS];
52 SDL_GPUShader *frag_shaders[NUM_FRAG_SHADERS];
53};
54
55typedef struct GPU_Shaders GPU_Shaders;
56
57void GPU_FillSupportedShaderFormats(SDL_PropertiesID props);
58extern bool GPU_InitShaders(GPU_Shaders *shaders, SDL_GPUDevice *device);
59extern void GPU_ReleaseShaders(GPU_Shaders *shaders, SDL_GPUDevice *device);
60extern SDL_GPUShader *GPU_GetVertexShader(GPU_Shaders *shaders, GPU_VertexShaderID id);
61extern SDL_GPUShader *GPU_GetFragmentShader(GPU_Shaders *shaders, GPU_FragmentShaderID id);
62
63#endif // SDL_shaders_gpu_h_
diff --git a/SDL-3.2.8/src/render/gpu/shaders/.gitattributes b/SDL-3.2.8/src/render/gpu/shaders/.gitattributes
new file mode 100644
index 0000000..4689bbb
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/.gitattributes
@@ -0,0 +1 @@
*.h linguist-generated
diff --git a/SDL-3.2.8/src/render/gpu/shaders/.gitignore b/SDL-3.2.8/src/render/gpu/shaders/.gitignore
new file mode 100644
index 0000000..2741428
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/.gitignore
@@ -0,0 +1,4 @@
1*.hlsl
2*.metal
3*.spv
4*.tmp.h
diff --git a/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh b/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh
new file mode 100755
index 0000000..9b019e5
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh
@@ -0,0 +1,106 @@
1#!/usr/bin/env bash
2
3set -e
4
5# NOTE: fxc is tested on Linux with https://github.com/mozilla/fxc2
6
7which fxc &>/dev/null && HAVE_FXC=1 || HAVE_FXC=0
8which dxc &>/dev/null && HAVE_DXC=1 || HAVE_DXC=0
9which spirv-cross &>/dev/null && HAVE_SPIRV_CROSS=1 || HAVE_SPIRV_CROSS=0
10
11[ "$HAVE_FXC" != 0 ] || echo "fxc not in PATH; D3D11 shaders will not be rebuilt"
12[ "$HAVE_DXC" != 0 ] || echo "dxc not in PATH; D3D12 shaders will not be rebuilt"
13[ "$HAVE_SPIRV_CROSS" != 0 ] || echo "spirv-cross not in PATH; D3D11, D3D12, Metal shaders will not be rebuilt"
14
15USE_FXC=${USE_FXC:-$HAVE_FXC}
16USE_DXC=${USE_DXC:-$HAVE_DXC}
17USE_SPIRV_CROSS=${USE_SPIRV_CROSS:-$HAVE_SPIRV_CROSS}
18
19spirv_bundle="spir-v.h"
20dxbc50_bundle="dxbc50.h"
21dxil60_bundle="dxil60.h"
22metal_bundle="metal.h"
23
24rm -f "$spirv_bundle"
25[ "$USE_SPIRV_CROSS" != 0 ] && rm -f "$metal_bundle"
26[ "$USE_SPIRV_CROSS" != 0 ] && [ "$USE_FXC" != 0 ] && rm -f "$dxbc50_bundle"
27[ "$USE_SPIRV_CROSS" != 0 ] && [ "$USE_DXC" != 0 ] && rm -f "$dxil60_bundle"
28
29make-header() {
30 xxd -i "$1" | sed \
31 -e 's/^unsigned /const unsigned /g' \
32 -e 's,^const,static const,' \
33 > "$1.h"
34}
35
36compile-hlsl-dxbc() {
37 local src="$1"
38 local profile="$2"
39 local output_basename="$3"
40 local var_name="$(echo "$output_basename" | sed -e 's/\./_/g')"
41
42 fxc "$src" /E main /T $2 /Fh "$output_basename.tmp.h" || exit $?
43 sed \
44 -e "s/g_main/$var_name/;s/\r//g" \
45 -e 's,^const,static const,' \
46 -e 's,const unsigned,const signed,' \
47 < "$output_basename.tmp.h" \
48 > "$output_basename.h"
49 rm -f "$output_basename.tmp.h"
50}
51
52compile-hlsl-dxil() {
53 local src="$1"
54 local profile="$2"
55 local output_basename="$3"
56 local var_name="$(echo "$output_basename" | sed -e 's/\./_/g')"
57
58 dxc "$src" -E main -T $2 -Fh "$output_basename.tmp.h" -O3 || exit $?
59 sed \
60 -e "s/g_main/$var_name/;s/\r//g" \
61 -e 's,^const,static const,' \
62 < "$output_basename.tmp.h" \
63 > "$output_basename.h"
64 rm -f "$output_basename.tmp.h"
65}
66
67for i in *.vert *.frag; do
68 spv="$i.spv"
69 metal="$i.metal"
70 hlsl50="$i.sm50.hlsl"
71 dxbc50="$i.sm50.dxbc"
72 hlsl60="$i.sm60.hlsl"
73 dxil60="$i.sm60.dxil"
74
75 glslangValidator -g0 -Os "$i" -V -o "$spv" --quiet
76
77 make-header "$spv"
78 echo "#include \"$spv.h\"" >> "$spirv_bundle"
79
80 if [ "$USE_SPIRV_CROSS" = "0" ]; then
81 continue
82 fi
83
84 spirv-cross "$spv" --hlsl --shader-model 50 --hlsl-enable-compat --output "$hlsl50"
85 spirv-cross "$spv" --hlsl --shader-model 60 --hlsl-enable-compat --output "$hlsl60"
86
87 if [ "${i##*.}" == "frag" ]; then
88 hlsl_stage="ps"
89 else
90 hlsl_stage="vs"
91 fi
92
93 if [ "$USE_FXC" != "0" ]; then
94 compile-hlsl-dxbc "$hlsl50" ${hlsl_stage}_5_0 "$dxbc50"
95 echo "#include \"$dxbc50.h\"" >> "$dxbc50_bundle"
96 fi
97
98 if [ "$USE_DXC" != "0" ]; then
99 compile-hlsl-dxil "$hlsl60" ${hlsl_stage}_6_0 "$dxil60"
100 echo "#include \"$dxil60.h\"" >> "$dxil60_bundle"
101 fi
102
103 spirv-cross "$spv" --msl --output "$metal"
104 make-header "$metal"
105 echo "#include \"$metal.h\"" >> "$metal_bundle"
106done
diff --git a/SDL-3.2.8/src/render/gpu/shaders/color.frag b/SDL-3.2.8/src/render/gpu/shaders/color.frag
new file mode 100644
index 0000000..8ce1e6b
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/color.frag
@@ -0,0 +1,9 @@
1#version 450
2
3layout(location = 0) in vec4 v_color;
4
5layout(location = 0) out vec4 o_color;
6
7void main() {
8 o_color = v_color;
9}
diff --git a/SDL-3.2.8/src/render/gpu/shaders/color.frag.metal.h b/SDL-3.2.8/src/render/gpu/shaders/color.frag.metal.h
new file mode 100644
index 0000000..a5f9899
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/color.frag.metal.h
@@ -0,0 +1,28 @@
1static const unsigned char color_frag_metal[] = {
2 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65,
3 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x0a,
4 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69,
5 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
6 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
7 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x0a,
8 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30,
9 0x5f, 0x6f, 0x75, 0x74, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
10 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x5f, 0x39, 0x20, 0x5b, 0x5b,
11 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a,
12 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d,
13 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20,
14 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x5f, 0x31,
15 0x31, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63,
16 0x6e, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x66,
17 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e,
18 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28,
19 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20,
20 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d,
21 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e,
22 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20,
23 0x7b, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e,
24 0x6d, 0x5f, 0x39, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x5f, 0x31,
25 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
26 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a
27};
28static const unsigned int color_frag_metal_len = 298;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/color.frag.sm50.dxbc.h b/SDL-3.2.8/src/render/gpu/shaders/color.frag.sm50.dxbc.h
new file mode 100644
index 0000000..ddd8012
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/color.frag.sm50.dxbc.h
@@ -0,0 +1,85 @@
1static const signed char color_frag_sm50_dxbc[] =
2{
3 68, 88, 66, 67, 114,-117,
4-124, 82, -97, 76, -66, -74,
5 70, 116, 14, -14, 95,-122,
6 65, 73, 1, 0, 0, 0,
7 -24, 1, 0, 0, 5, 0,
8 0, 0, 52, 0, 0, 0,
9 -96, 0, 0, 0, -44, 0,
10 0, 0, 8, 1, 0, 0,
11 76, 1, 0, 0, 82, 68,
12 69, 70, 100, 0, 0, 0,
13 0, 0, 0, 0, 0, 0,
14 0, 0, 0, 0, 0, 0,
15 60, 0, 0, 0, 0, 5,
16 -1, -1, 0, 1, 0, 0,
17 60, 0, 0, 0, 82, 68,
18 49, 49, 60, 0, 0, 0,
19 24, 0, 0, 0, 32, 0,
20 0, 0, 40, 0, 0, 0,
21 36, 0, 0, 0, 12, 0,
22 0, 0, 0, 0, 0, 0,
23 77, 105, 99, 114, 111, 115,
24 111, 102, 116, 32, 40, 82,
25 41, 32, 72, 76, 83, 76,
26 32, 83, 104, 97, 100, 101,
27 114, 32, 67, 111, 109, 112,
28 105, 108, 101, 114, 32, 49,
29 48, 46, 49, 0, 73, 83,
30 71, 78, 44, 0, 0, 0,
31 1, 0, 0, 0, 8, 0,
32 0, 0, 32, 0, 0, 0,
33 0, 0, 0, 0, 0, 0,
34 0, 0, 3, 0, 0, 0,
35 0, 0, 0, 0, 15, 15,
36 0, 0, 84, 69, 88, 67,
37 79, 79, 82, 68, 0, -85,
38 -85, -85, 79, 83, 71, 78,
39 44, 0, 0, 0, 1, 0,
40 0, 0, 8, 0, 0, 0,
41 32, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0,
43 3, 0, 0, 0, 0, 0,
44 0, 0, 15, 0, 0, 0,
45 83, 86, 95, 84, 97, 114,
46 103, 101, 116, 0, -85, -85,
47 83, 72, 69, 88, 60, 0,
48 0, 0, 80, 0, 0, 0,
49 15, 0, 0, 0, 106, 8,
50 0, 1, 98, 16, 0, 3,
51 -14, 16, 16, 0, 0, 0,
52 0, 0, 101, 0, 0, 3,
53 -14, 32, 16, 0, 0, 0,
54 0, 0, 54, 0, 0, 5,
55 -14, 32, 16, 0, 0, 0,
56 0, 0, 70, 30, 16, 0,
57 0, 0, 0, 0, 62, 0,
58 0, 1, 83, 84, 65, 84,
59-108, 0, 0, 0, 2, 0,
60 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, 2, 0,
62 0, 0, 0, 0, 0, 0,
63 0, 0, 0, 0, 0, 0,
64 0, 0, 1, 0, 0, 0,
65 0, 0, 0, 0, 0, 0,
66 0, 0, 0, 0, 0, 0,
67 0, 0, 0, 0, 0, 0,
68 0, 0, 0, 0, 0, 0,
69 0, 0, 0, 0, 0, 0,
70 0, 0, 0, 0, 0, 0,
71 0, 0, 0, 0, 0, 0,
72 0, 0, 1, 0, 0, 0,
73 0, 0, 0, 0, 0, 0,
74 0, 0, 0, 0, 0, 0,
75 0, 0, 0, 0, 0, 0,
76 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0,
78 0, 0, 0, 0, 0, 0,
79 0, 0, 0, 0, 0, 0,
80 0, 0, 0, 0, 0, 0,
81 0, 0, 0, 0, 0, 0,
82 0, 0, 0, 0, 0, 0,
83 0, 0, 0, 0, 0, 0,
84 0, 0
85};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/color.frag.sm60.dxil.h b/SDL-3.2.8/src/render/gpu/shaders/color.frag.sm60.dxil.h
new file mode 100644
index 0000000..f8d2a1c
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/color.frag.sm60.dxil.h
@@ -0,0 +1,340 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; TEXCOORD 0 xyzw 0 NONE float xyzw
8;
9;
10; Output signature:
11;
12; Name Index Mask Register SysValue Format Used
13; -------------------- ----- ------ -------- -------- ------- ------
14; SV_Target 0 xyzw 0 TARGET float xyzw
15;
16; shader hash: 79268435b7929fdbc9f529459f44b878
17;
18; Pipeline Runtime Information:
19;
20; Pixel Shader
21; DepthOutput=0
22; SampleFrequency=0
23;
24;
25; Input signature:
26;
27; Name Index InterpMode DynIdx
28; -------------------- ----- ---------------------- ------
29; TEXCOORD 0 linear
30;
31; Output signature:
32;
33; Name Index InterpMode DynIdx
34; -------------------- ----- ---------------------- ------
35; SV_Target 0
36;
37; Buffer Definitions:
38;
39;
40; Resource Bindings:
41;
42; Name Type Format Dim ID HLSL Bind Count
43; ------------------------------ ---------- ------- ----------- ------- -------------- ------
44;
45;
46; ViewId state:
47;
48; Number of inputs: 4, outputs: 4
49; Outputs dependent on ViewId: { }
50; Inputs contributing to computation of Outputs:
51; output 0 depends on inputs: { 0 }
52; output 1 depends on inputs: { 1 }
53; output 2 depends on inputs: { 2 }
54; output 3 depends on inputs: { 3 }
55;
56target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
57target triple = "dxil-ms-dx"
58
59define void @main() {
60 %1 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
61 %2 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
62 %3 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
63 %4 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
64 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %1) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
65 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %2) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
66 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %3) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
67 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %4) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
68 ret void
69}
70
71; Function Attrs: nounwind readnone
72declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
73
74; Function Attrs: nounwind
75declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
76
77attributes #0 = { nounwind readnone }
78attributes #1 = { nounwind }
79
80!llvm.ident = !{!0}
81!dx.version = !{!1}
82!dx.valver = !{!2}
83!dx.shaderModel = !{!3}
84!dx.viewIdState = !{!4}
85!dx.entryPoints = !{!5}
86
87!0 = !{!"dxc(private) 1.8.0.4662 (416fab6b5)"}
88!1 = !{i32 1, i32 0}
89!2 = !{i32 1, i32 8}
90!3 = !{!"ps", i32 6, i32 0}
91!4 = !{[6 x i32] [i32 4, i32 4, i32 1, i32 2, i32 4, i32 8]}
92!5 = !{void ()* @main, !"main", !6, null, null}
93!6 = !{!7, !11, null}
94!7 = !{!8}
95!8 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !9, i8 2, i32 1, i8 4, i32 0, i8 0, !10}
96!9 = !{i32 0}
97!10 = !{i32 3, i32 15}
98!11 = !{!12}
99!12 = !{i32 0, !"SV_Target", i8 9, i8 16, !9, i8 0, i32 1, i8 4, i32 0, i8 0, !10}
100
101#endif
102
103static const unsigned char color_frag_sm60_dxil[] = {
104 0x44, 0x58, 0x42, 0x43, 0x33, 0x91, 0x9f, 0xec, 0x78, 0x7d, 0xbb, 0xfa,
105 0xeb, 0x8d, 0xfb, 0x1b, 0x79, 0x47, 0x1d, 0xb2, 0x01, 0x00, 0x00, 0x00,
106 0x0c, 0x0b, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
107 0x4c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00,
108 0x58, 0x01, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, 0x2c, 0x06, 0x00, 0x00,
109 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00,
111 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44,
115 0x00, 0x00, 0x00, 0x00, 0x4f, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00,
116 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
118 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65,
120 0x74, 0x00, 0x00, 0x00, 0x50, 0x53, 0x56, 0x30, 0x8c, 0x00, 0x00, 0x00,
121 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01,
124 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 0x10, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
127 0x44, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x10,
131 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
132 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54,
133 0xb0, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00,
134 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
135 0x98, 0x04, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
136 0x23, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
137 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49,
138 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19,
139 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42,
140 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88,
141 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42,
142 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c,
143 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00,
144 0x06, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07,
145 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20,
146 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
147 0x13, 0x82, 0x60, 0x42, 0x20, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00,
148 0x0f, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04,
149 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14,
150 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x30, 0x23, 0x00,
151 0x25, 0x00, 0x8a, 0x19, 0x80, 0x39, 0x02, 0x30, 0x98, 0x23, 0x40, 0x8a,
152 0x31, 0x44, 0x54, 0x44, 0x56, 0x0c, 0x20, 0xa2, 0x1a, 0xc2, 0x81, 0x80,
153 0x34, 0x20, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87,
154 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50,
155 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30,
156 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0,
157 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20,
158 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
159 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
160 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10,
161 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
162 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0,
163 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
164 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e,
165 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86,
166 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0xc8, 0x02, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
169 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xa2,
170 0x12, 0x18, 0x01, 0x28, 0x86, 0x32, 0x28, 0x8f, 0x92, 0x28, 0x04, 0xaa,
171 0x92, 0x18, 0x01, 0x28, 0x82, 0x42, 0x28, 0x10, 0xda, 0xb1, 0x0c, 0x82,
172 0x08, 0x04, 0x02, 0x01, 0x79, 0x18, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00,
173 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x31, 0x20, 0xc3, 0x1b,
174 0x43, 0x81, 0x93, 0x4b, 0xb3, 0x0b, 0xa3, 0x2b, 0x4b, 0x01, 0x89, 0x71,
175 0xc1, 0x71, 0x81, 0x71, 0xa1, 0xb1, 0xb1, 0x91, 0x01, 0x41, 0xa1, 0x89,
176 0xb1, 0x31, 0x0b, 0x13, 0xb3, 0x11, 0xab, 0x49, 0xd9, 0x10, 0x04, 0x13,
177 0x04, 0x62, 0x98, 0x20, 0x10, 0xc4, 0x06, 0x61, 0x20, 0x36, 0x08, 0x04,
178 0x41, 0x01, 0x6e, 0x6e, 0x82, 0x40, 0x14, 0x1b, 0x86, 0x03, 0x21, 0x26,
179 0x08, 0x02, 0xb0, 0x01, 0xd8, 0x30, 0x10, 0xcb, 0xb2, 0x21, 0x60, 0x36,
180 0x0c, 0x83, 0xd2, 0x4c, 0x10, 0x96, 0x67, 0x43, 0xf0, 0x90, 0x68, 0x0b,
181 0x4b, 0x73, 0x23, 0x42, 0x55, 0x84, 0x35, 0xf4, 0xf4, 0x24, 0x45, 0x34,
182 0x41, 0x28, 0x94, 0x09, 0x42, 0xb1, 0x6c, 0x08, 0x88, 0x09, 0x42, 0xc1,
183 0x4c, 0x10, 0x8a, 0x66, 0x82, 0x40, 0x18, 0x13, 0x04, 0xe2, 0xd8, 0x20,
184 0x60, 0xd9, 0x86, 0x85, 0x90, 0x26, 0xaa, 0xb2, 0x86, 0x8b, 0xa0, 0xb4,
185 0x0d, 0xc1, 0xc6, 0x64, 0xca, 0xea, 0x8b, 0x2a, 0x4c, 0xee, 0xac, 0x8c,
186 0x6e, 0x82, 0x50, 0x38, 0x1b, 0x16, 0xa2, 0x9b, 0xbc, 0x8a, 0x1a, 0x2e,
187 0x82, 0xd2, 0x36, 0x04, 0xdf, 0x86, 0x81, 0x03, 0x03, 0x60, 0x43, 0xa1,
188 0x44, 0x61, 0x00, 0x00, 0x2c, 0xd2, 0xdc, 0xe6, 0xe8, 0xe6, 0x26, 0x08,
189 0x04, 0x42, 0x63, 0x2e, 0xed, 0xec, 0x8b, 0x8d, 0x6c, 0x82, 0x40, 0x24,
190 0x34, 0xe6, 0xd2, 0xce, 0xbe, 0xe6, 0xe8, 0x36, 0x18, 0x63, 0x40, 0x06,
191 0x65, 0x60, 0x06, 0x67, 0x60, 0x06, 0x55, 0xd8, 0xd8, 0xec, 0xda, 0x5c,
192 0xd2, 0xc8, 0xca, 0xdc, 0xe8, 0xa6, 0x04, 0x41, 0x15, 0x32, 0x3c, 0x17,
193 0xbb, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x29, 0x01, 0xd1, 0x84, 0x0c,
194 0xcf, 0xc5, 0x2e, 0x8c, 0xcd, 0xae, 0x4c, 0x6e, 0x4a, 0x50, 0xd4, 0x21,
195 0xc3, 0x73, 0x99, 0x43, 0x0b, 0x23, 0x2b, 0x93, 0x6b, 0x7a, 0x23, 0x2b,
196 0x63, 0x9b, 0x12, 0x20, 0x95, 0xc8, 0xf0, 0x5c, 0xe8, 0xf2, 0xe0, 0xca,
197 0x82, 0xdc, 0xdc, 0xde, 0xe8, 0xc2, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0xa6,
198 0x04, 0x4d, 0x1d, 0x32, 0x3c, 0x17, 0xbb, 0xb4, 0xb2, 0xbb, 0x24, 0xb2,
199 0x29, 0xba, 0x30, 0xba, 0xb2, 0x29, 0xc1, 0x53, 0x87, 0x0c, 0xcf, 0xa5,
200 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e, 0x6e, 0x4a,
201 0x10, 0x06, 0x5d, 0xc8, 0xf0, 0x5c, 0xc6, 0xde, 0xea, 0xdc, 0xe8, 0xca,
202 0xe4, 0xe6, 0xa6, 0x04, 0x67, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
203 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
204 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
205 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
206 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
207 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
208 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
209 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
210 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
211 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
212 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
213 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
214 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
215 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
216 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
217 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
218 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
219 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
220 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
221 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
222 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
223 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
224 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
225 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
226 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
227 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
228 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
229 0x0b, 0x00, 0x00, 0x00, 0x16, 0x30, 0x0d, 0x97, 0xef, 0x3c, 0xfe, 0xe2,
230 0x00, 0x83, 0xd8, 0x3c, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70,
231 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4,
232 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00,
234 0x00, 0x00, 0x00, 0x00, 0x79, 0x26, 0x84, 0x35, 0xb7, 0x92, 0x9f, 0xdb,
235 0xc9, 0xf5, 0x29, 0x45, 0x9f, 0x44, 0xb8, 0x78, 0x44, 0x58, 0x49, 0x4c,
236 0xd8, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00,
237 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
238 0xc0, 0x04, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
239 0x2d, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
240 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49,
241 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19,
242 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42,
243 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88,
244 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42,
245 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c,
246 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00,
247 0x06, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07,
248 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20,
249 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
250 0x13, 0x82, 0x60, 0x42, 0x20, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00,
251 0x0f, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04,
252 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14,
253 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x30, 0x23, 0x00,
254 0x25, 0x00, 0x8a, 0x19, 0x80, 0x39, 0x02, 0x30, 0x98, 0x23, 0x40, 0x8a,
255 0x31, 0x44, 0x54, 0x44, 0x56, 0x0c, 0x20, 0xa2, 0x1a, 0xc2, 0x81, 0x80,
256 0x34, 0x20, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87,
257 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50,
258 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30,
259 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0,
260 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20,
261 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
262 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
263 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10,
264 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
265 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0,
266 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
267 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e,
268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86,
269 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0x00, 0xc8, 0x02, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10,
272 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xa2,
273 0x12, 0x18, 0x01, 0x28, 0x88, 0x62, 0x28, 0x83, 0xf2, 0xa0, 0x2a, 0x89,
274 0x11, 0x80, 0x22, 0x28, 0x84, 0x02, 0xa1, 0x1d, 0xcb, 0x20, 0x88, 0x40,
275 0x20, 0x10, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
276 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x31, 0x20, 0xc3, 0x1b,
277 0x43, 0x81, 0x93, 0x4b, 0xb3, 0x0b, 0xa3, 0x2b, 0x4b, 0x01, 0x89, 0x71,
278 0xc1, 0x71, 0x81, 0x71, 0xa1, 0xb1, 0xb1, 0x91, 0x01, 0x41, 0xa1, 0x89,
279 0xb1, 0x31, 0x0b, 0x13, 0xb3, 0x11, 0xab, 0x49, 0xd9, 0x10, 0x04, 0x13,
280 0x04, 0x62, 0x98, 0x20, 0x10, 0xc4, 0x06, 0x61, 0x20, 0x26, 0x08, 0x44,
281 0xb1, 0x41, 0x18, 0x0c, 0x0a, 0x70, 0x73, 0x13, 0x04, 0xc2, 0xd8, 0x30,
282 0x20, 0x09, 0x31, 0x41, 0x58, 0x9c, 0x0d, 0xc1, 0x32, 0x41, 0x10, 0x00,
283 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0xa8, 0x8a, 0xb0, 0x86, 0x9e, 0x9e,
284 0xa4, 0x88, 0x26, 0x08, 0x45, 0x32, 0x41, 0x28, 0x94, 0x0d, 0x01, 0x31,
285 0x41, 0x28, 0x96, 0x09, 0x42, 0xc1, 0x4c, 0x10, 0x88, 0x63, 0x82, 0x40,
286 0x20, 0x1b, 0x84, 0xca, 0xda, 0xb0, 0x10, 0x0f, 0x14, 0x49, 0xd3, 0x40,
287 0x11, 0xd1, 0xb5, 0x21, 0xc0, 0x98, 0x4c, 0x59, 0x7d, 0x51, 0x85, 0xc9,
288 0x9d, 0x95, 0xd1, 0x4d, 0x10, 0x8a, 0x66, 0xc3, 0x42, 0x68, 0xd0, 0x26,
289 0x45, 0x03, 0x45, 0x44, 0xd7, 0x86, 0x80, 0xdb, 0x30, 0x64, 0x1d, 0xb0,
290 0xa1, 0x68, 0x1c, 0x0f, 0x00, 0xaa, 0xb0, 0xb1, 0xd9, 0xb5, 0xb9, 0xa4,
291 0x91, 0x95, 0xb9, 0xd1, 0x4d, 0x09, 0x82, 0x2a, 0x64, 0x78, 0x2e, 0x76,
292 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x02, 0xa2, 0x09, 0x19, 0x9e,
293 0x8b, 0x5d, 0x18, 0x9b, 0x5d, 0x99, 0xdc, 0x94, 0xc0, 0xa8, 0x43, 0x86,
294 0xe7, 0x32, 0x87, 0x16, 0x46, 0x56, 0x26, 0xd7, 0xf4, 0x46, 0x56, 0xc6,
295 0x36, 0x25, 0x48, 0xea, 0x90, 0xe1, 0xb9, 0xd8, 0xa5, 0x95, 0xdd, 0x25,
296 0x91, 0x4d, 0xd1, 0x85, 0xd1, 0x95, 0x4d, 0x09, 0x96, 0x3a, 0x64, 0x78,
297 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73,
298 0x53, 0x02, 0x0f, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
299 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
300 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
301 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,
302 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30,
303 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8,
304 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b,
305 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76,
306 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e,
307 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e,
308 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61,
309 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4,
310 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76,
311 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37,
312 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76,
313 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71,
314 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e,
315 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1,
316 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61,
317 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90,
318 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8,
319 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc,
320 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8,
321 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b,
322 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a,
323 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e,
324 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
325 0x16, 0x30, 0x0d, 0x97, 0xef, 0x3c, 0xfe, 0xe2, 0x00, 0x83, 0xd8, 0x3c,
326 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b,
327 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00,
328 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
329 0x1e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
330 0x03, 0x00, 0x00, 0x00, 0x44, 0x85, 0x30, 0x03, 0x50, 0x0a, 0x54, 0x25,
331 0x50, 0x06, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x4c,
332 0x05, 0x04, 0x29, 0xc4, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x94,
333 0x11, 0x45, 0x43, 0x31, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x75,
334 0x48, 0xd2, 0x62, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x61, 0x21,
335 0xd3, 0x44, 0x1c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0x58, 0x07,
336 0x45, 0x39, 0xc4, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xd6, 0x41,
337 0x51, 0xc6, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x88, 0x75, 0x50,
338 0x54, 0x23, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x62, 0x1d, 0x14,
339 0x55, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00
340};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/color.frag.spv.h b/SDL-3.2.8/src/render/gpu/shaders/color.frag.spv.h
new file mode 100644
index 0000000..51e02de
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/color.frag.spv.h
@@ -0,0 +1,29 @@
1static const unsigned char color_frag_spv[] = {
2 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00,
3 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
4 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
5 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
6 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
7 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00,
8 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
9 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00,
10 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
11 0x09, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12 0x47, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
13 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
14 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
15 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
16 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
17 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
18 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
19 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
20 0x20, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
21 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
22 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00,
23 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00,
25 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
26 0x0b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00,
27 0x0c, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
28};
29static const unsigned int color_frag_spv_len = 312;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/dxbc50.h b/SDL-3.2.8/src/render/gpu/shaders/dxbc50.h
new file mode 100644
index 0000000..1c01126
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/dxbc50.h
@@ -0,0 +1,6 @@
1#include "linepoint.vert.sm50.dxbc.h"
2#include "tri_color.vert.sm50.dxbc.h"
3#include "tri_texture.vert.sm50.dxbc.h"
4#include "color.frag.sm50.dxbc.h"
5#include "texture_rgba.frag.sm50.dxbc.h"
6#include "texture_rgb.frag.sm50.dxbc.h"
diff --git a/SDL-3.2.8/src/render/gpu/shaders/dxil60.h b/SDL-3.2.8/src/render/gpu/shaders/dxil60.h
new file mode 100644
index 0000000..88489f9
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/dxil60.h
@@ -0,0 +1,6 @@
1#include "linepoint.vert.sm60.dxil.h"
2#include "tri_color.vert.sm60.dxil.h"
3#include "tri_texture.vert.sm60.dxil.h"
4#include "color.frag.sm60.dxil.h"
5#include "texture_rgba.frag.sm60.dxil.h"
6#include "texture_rgb.frag.sm60.dxil.h"
diff --git a/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert
new file mode 100644
index 0000000..34596d5
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert
@@ -0,0 +1,17 @@
1#version 450
2
3layout(location = 0) in vec2 a_position;
4
5layout(location = 0) out vec4 v_color;
6
7layout(set = 1, binding = 0) uniform Context {
8 mat4 mvp;
9 vec4 color;
10 vec2 texture_size; /* XXX unused */
11} u_context;
12
13void main() {
14 gl_PointSize = 1.0; /* FIXME: D3D11 pls */
15 gl_Position = u_context.mvp * vec4(a_position, 0, 1);
16 v_color = u_context.color;
17}
diff --git a/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.metal.h b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.metal.h
new file mode 100644
index 0000000..96b1c37
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.metal.h
@@ -0,0 +1,51 @@
1static const unsigned char linepoint_vert_metal[] = {
2 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65,
3 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x0a,
4 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69,
5 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
6 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
7 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x0a,
8 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x32, 0x32, 0x0a, 0x7b,
9 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78,
10 0x34, 0x20, 0x5f, 0x6d, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
11 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x31, 0x3b, 0x0a, 0x20,
12 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x6d,
13 0x32, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63,
14 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x0a,
15 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34,
16 0x20, 0x6d, 0x5f, 0x33, 0x38, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72,
17 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20,
18 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, 0x6c,
19 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b,
20 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x5d, 0x3b, 0x0a,
21 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x67, 0x6c,
22 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x5b,
23 0x5b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5d,
24 0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63,
25 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x0a, 0x7b,
26 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20,
27 0x6d, 0x5f, 0x32, 0x39, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69,
28 0x62, 0x75, 0x74, 0x65, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x7d,
29 0x3b, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61,
30 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e,
31 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69,
32 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e,
33 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74,
34 0x20, 0x5f, 0x32, 0x32, 0x26, 0x20, 0x5f, 0x32, 0x34, 0x20, 0x5b, 0x5b,
35 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x29,
36 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30,
37 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b,
38 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67,
39 0x6c, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x20,
40 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f,
41 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69,
42 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34, 0x2e, 0x5f, 0x6d, 0x30,
43 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x69, 0x6e,
44 0x2e, 0x6d, 0x5f, 0x32, 0x39, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20,
45 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75,
46 0x74, 0x2e, 0x6d, 0x5f, 0x33, 0x38, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x34,
47 0x2e, 0x5f, 0x6d, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
48 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x0a, 0x7d, 0x0a,
49 0x0a
50};
51static const unsigned int linepoint_vert_metal_len = 565;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.sm50.dxbc.h b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.sm50.dxbc.h
new file mode 100644
index 0000000..c626676
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.sm50.dxbc.h
@@ -0,0 +1,172 @@
1static const signed char linepoint_vert_sm50_dxbc[] =
2{
3 68, 88, 66, 67, 0, 119,
4 101, -18, 103, 113, 34, 52,
5 -82, 96, 17, 4, -92, 11,
6 -67, 71, 1, 0, 0, 0,
7 -12, 3, 0, 0, 5, 0,
8 0, 0, 52, 0, 0, 0,
9 -12, 1, 0, 0, 40, 2,
10 0, 0,-128, 2, 0, 0,
11 88, 3, 0, 0, 82, 68,
12 69, 70, -72, 1, 0, 0,
13 1, 0, 0, 0, 100, 0,
14 0, 0, 1, 0, 0, 0,
15 60, 0, 0, 0, 0, 5,
16 -2, -1, 0, 1, 0, 0,
17-112, 1, 0, 0, 82, 68,
18 49, 49, 60, 0, 0, 0,
19 24, 0, 0, 0, 32, 0,
20 0, 0, 40, 0, 0, 0,
21 36, 0, 0, 0, 12, 0,
22 0, 0, 0, 0, 0, 0,
23 92, 0, 0, 0, 0, 0,
24 0, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0,
27 1, 0, 0, 0, 1, 0,
28 0, 0, 95, 50, 50, 95,
29 50, 52, 0, -85, 92, 0,
30 0, 0, 3, 0, 0, 0,
31 124, 0, 0, 0, 96, 0,
32 0, 0, 0, 0, 0, 0,
33 0, 0, 0, 0, -12, 0,
34 0, 0, 0, 0, 0, 0,
35 64, 0, 0, 0, 2, 0,
36 0, 0, 4, 1, 0, 0,
37 0, 0, 0, 0, -1, -1,
38 -1, -1, 0, 0, 0, 0,
39 -1, -1, -1, -1, 0, 0,
40 0, 0, 40, 1, 0, 0,
41 64, 0, 0, 0, 16, 0,
42 0, 0, 2, 0, 0, 0,
43 56, 1, 0, 0, 0, 0,
44 0, 0, -1, -1, -1, -1,
45 0, 0, 0, 0, -1, -1,
46 -1, -1, 0, 0, 0, 0,
47 92, 1, 0, 0, 80, 0,
48 0, 0, 8, 0, 0, 0,
49 0, 0, 0, 0, 108, 1,
50 0, 0, 0, 0, 0, 0,
51 -1, -1, -1, -1, 0, 0,
52 0, 0, -1, -1, -1, -1,
53 0, 0, 0, 0, 95, 50,
54 52, 95, 109, 48, 0, 102,
55 108, 111, 97, 116, 52, 120,
56 52, 0, 2, 0, 3, 0,
57 4, 0, 4, 0, 0, 0,
58 0, 0, 0, 0, 0, 0,
59 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, -5, 0,
62 0, 0, 95, 50, 52, 95,
63 109, 49, 0, 102, 108, 111,
64 97, 116, 52, 0, -85, -85,
65 1, 0, 3, 0, 1, 0,
66 4, 0, 0, 0, 0, 0,
67 0, 0, 0, 0, 0, 0,
68 0, 0, 0, 0, 0, 0,
69 0, 0, 0, 0, 0, 0,
70 0, 0, 47, 1, 0, 0,
71 95, 50, 52, 95, 109, 50,
72 0, 102, 108, 111, 97, 116,
73 50, 0, -85, -85, 1, 0,
74 3, 0, 1, 0, 2, 0,
75 0, 0, 0, 0, 0, 0,
76 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0,
78 0, 0, 0, 0, 0, 0,
79 99, 1, 0, 0, 77, 105,
80 99, 114, 111, 115, 111, 102,
81 116, 32, 40, 82, 41, 32,
82 72, 76, 83, 76, 32, 83,
83 104, 97, 100, 101, 114, 32,
84 67, 111, 109, 112, 105, 108,
85 101, 114, 32, 49, 48, 46,
86 49, 0, 73, 83, 71, 78,
87 44, 0, 0, 0, 1, 0,
88 0, 0, 8, 0, 0, 0,
89 32, 0, 0, 0, 0, 0,
90 0, 0, 0, 0, 0, 0,
91 3, 0, 0, 0, 0, 0,
92 0, 0, 3, 3, 0, 0,
93 84, 69, 88, 67, 79, 79,
94 82, 68, 0, -85, -85, -85,
95 79, 83, 71, 78, 80, 0,
96 0, 0, 2, 0, 0, 0,
97 8, 0, 0, 0, 56, 0,
98 0, 0, 0, 0, 0, 0,
99 0, 0, 0, 0, 3, 0,
100 0, 0, 0, 0, 0, 0,
101 15, 0, 0, 0, 65, 0,
102 0, 0, 0, 0, 0, 0,
103 1, 0, 0, 0, 3, 0,
104 0, 0, 1, 0, 0, 0,
105 15, 0, 0, 0, 84, 69,
106 88, 67, 79, 79, 82, 68,
107 0, 83, 86, 95, 80, 111,
108 115, 105, 116, 105, 111, 110,
109 0, -85, -85, -85, 83, 72,
110 69, 88, -48, 0, 0, 0,
111 80, 0, 1, 0, 52, 0,
112 0, 0, 106, 8, 0, 1,
113 89, 0, 0, 4, 70,-114,
114 32, 0, 0, 0, 0, 0,
115 5, 0, 0, 0, 95, 0,
116 0, 3, 50, 16, 16, 0,
117 0, 0, 0, 0, 101, 0,
118 0, 3, -14, 32, 16, 0,
119 0, 0, 0, 0, 103, 0,
120 0, 4, -14, 32, 16, 0,
121 1, 0, 0, 0, 1, 0,
122 0, 0, 104, 0, 0, 2,
123 1, 0, 0, 0, 54, 0,
124 0, 6, -14, 32, 16, 0,
125 0, 0, 0, 0, 70,-114,
126 32, 0, 0, 0, 0, 0,
127 4, 0, 0, 0, 56, 0,
128 0, 8, -14, 0, 16, 0,
129 0, 0, 0, 0, 86, 21,
130 16, 0, 0, 0, 0, 0,
131 70,-114, 32, 0, 0, 0,
132 0, 0, 1, 0, 0, 0,
133 50, 0, 0, 10, -14, 0,
134 16, 0, 0, 0, 0, 0,
135 6, 16, 16, 0, 0, 0,
136 0, 0, 70,-114, 32, 0,
137 0, 0, 0, 0, 0, 0,
138 0, 0, 70, 14, 16, 0,
139 0, 0, 0, 0, 0, 0,
140 0, 8, -14, 32, 16, 0,
141 1, 0, 0, 0, 70, 14,
142 16, 0, 0, 0, 0, 0,
143 70,-114, 32, 0, 0, 0,
144 0, 0, 3, 0, 0, 0,
145 62, 0, 0, 1, 83, 84,
146 65, 84,-108, 0, 0, 0,
147 5, 0, 0, 0, 1, 0,
148 0, 0, 0, 0, 0, 0,
149 3, 0, 0, 0, 3, 0,
150 0, 0, 0, 0, 0, 0,
151 0, 0, 0, 0, 1, 0,
152 0, 0, 0, 0, 0, 0,
153 0, 0, 0, 0, 0, 0,
154 0, 0, 0, 0, 0, 0,
155 0, 0, 0, 0, 0, 0,
156 0, 0, 0, 0, 0, 0,
157 0, 0, 0, 0, 0, 0,
158 0, 0, 0, 0, 0, 0,
159 0, 0, 0, 0, 1, 0,
160 0, 0, 0, 0, 0, 0,
161 0, 0, 0, 0, 0, 0,
162 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0,
164 0, 0, 0, 0, 0, 0,
165 0, 0, 0, 0, 0, 0,
166 0, 0, 0, 0, 0, 0,
167 0, 0, 0, 0, 0, 0,
168 0, 0, 0, 0, 0, 0,
169 0, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0,
171 0, 0, 0, 0
172};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.sm60.dxil.h b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.sm60.dxil.h
new file mode 100644
index 0000000..8320325
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.sm60.dxil.h
@@ -0,0 +1,496 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; TEXCOORD 0 xy 0 NONE float xy
8;
9;
10; Output signature:
11;
12; Name Index Mask Register SysValue Format Used
13; -------------------- ----- ------ -------- -------- ------- ------
14; TEXCOORD 0 xyzw 0 NONE float xyzw
15; SV_Position 0 xyzw 1 POS float xyzw
16;
17; shader hash: 28e70f2da15e5a0c84402943a6b12723
18;
19; Pipeline Runtime Information:
20;
21; Vertex Shader
22; OutputPositionPresent=1
23;
24;
25; Input signature:
26;
27; Name Index InterpMode DynIdx
28; -------------------- ----- ---------------------- ------
29; TEXCOORD 0
30;
31; Output signature:
32;
33; Name Index InterpMode DynIdx
34; -------------------- ----- ---------------------- ------
35; TEXCOORD 0 linear
36; SV_Position 0 noperspective
37;
38; Buffer Definitions:
39;
40; cbuffer _22_24
41; {
42;
43; struct hostlayout._22_24
44; {
45;
46; row_major float4x4 _24_m0; ; Offset: 0
47; float4 _24_m1; ; Offset: 64
48; float2 _24_m2; ; Offset: 80
49;
50; } _22_24; ; Offset: 0 Size: 88
51;
52; }
53;
54;
55; Resource Bindings:
56;
57; Name Type Format Dim ID HLSL Bind Count
58; ------------------------------ ---------- ------- ----------- ------- -------------- ------
59; _22_24 cbuffer NA NA CB0 cb0,space1 1
60;
61;
62; ViewId state:
63;
64; Number of inputs: 2, outputs: 8
65; Outputs dependent on ViewId: { }
66; Inputs contributing to computation of Outputs:
67; output 4 depends on inputs: { 0, 1 }
68; output 5 depends on inputs: { 0, 1 }
69; output 6 depends on inputs: { 0, 1 }
70; output 7 depends on inputs: { 0, 1 }
71;
72target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
73target triple = "dxil-ms-dx"
74
75%dx.types.Handle = type { i8* }
76%dx.types.CBufRet.f32 = type { float, float, float, float }
77%hostlayout._22_24 = type { [4 x <4 x float>], <4 x float>, <2 x float> }
78
79define void @main() {
80 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
81 %2 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
82 %3 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
83 %4 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 0) ; CBufferLoadLegacy(handle,regIndex)
84 %5 = extractvalue %dx.types.CBufRet.f32 %4, 0
85 %6 = extractvalue %dx.types.CBufRet.f32 %4, 1
86 %7 = extractvalue %dx.types.CBufRet.f32 %4, 2
87 %8 = extractvalue %dx.types.CBufRet.f32 %4, 3
88 %9 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 1) ; CBufferLoadLegacy(handle,regIndex)
89 %10 = extractvalue %dx.types.CBufRet.f32 %9, 0
90 %11 = extractvalue %dx.types.CBufRet.f32 %9, 1
91 %12 = extractvalue %dx.types.CBufRet.f32 %9, 2
92 %13 = extractvalue %dx.types.CBufRet.f32 %9, 3
93 %14 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 3) ; CBufferLoadLegacy(handle,regIndex)
94 %15 = extractvalue %dx.types.CBufRet.f32 %14, 0
95 %16 = extractvalue %dx.types.CBufRet.f32 %14, 1
96 %17 = extractvalue %dx.types.CBufRet.f32 %14, 2
97 %18 = extractvalue %dx.types.CBufRet.f32 %14, 3
98 %19 = fmul fast float %5, %2
99 %20 = call float @dx.op.tertiary.f32(i32 46, float %3, float %10, float %19) ; FMad(a,b,c)
100 %21 = fadd fast float %15, %20
101 %22 = fmul fast float %6, %2
102 %23 = call float @dx.op.tertiary.f32(i32 46, float %3, float %11, float %22) ; FMad(a,b,c)
103 %24 = fadd fast float %23, %16
104 %25 = fmul fast float %7, %2
105 %26 = call float @dx.op.tertiary.f32(i32 46, float %3, float %12, float %25) ; FMad(a,b,c)
106 %27 = fadd fast float %26, %17
107 %28 = fmul fast float %8, %2
108 %29 = call float @dx.op.tertiary.f32(i32 46, float %3, float %13, float %28) ; FMad(a,b,c)
109 %30 = fadd fast float %29, %18
110 %31 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 4) ; CBufferLoadLegacy(handle,regIndex)
111 %32 = extractvalue %dx.types.CBufRet.f32 %31, 0
112 %33 = extractvalue %dx.types.CBufRet.f32 %31, 1
113 %34 = extractvalue %dx.types.CBufRet.f32 %31, 2
114 %35 = extractvalue %dx.types.CBufRet.f32 %31, 3
115 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %32) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
116 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %33) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
117 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %34) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
118 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %35) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
119 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 0, float %21) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
120 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 1, float %24) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
121 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 2, float %27) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
122 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 3, float %30) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
123 ret void
124}
125
126; Function Attrs: nounwind readnone
127declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
128
129; Function Attrs: nounwind
130declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
131
132; Function Attrs: nounwind readonly
133declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
134
135; Function Attrs: nounwind readnone
136declare float @dx.op.tertiary.f32(i32, float, float, float) #0
137
138; Function Attrs: nounwind readonly
139declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
140
141attributes #0 = { nounwind readnone }
142attributes #1 = { nounwind }
143attributes #2 = { nounwind readonly }
144
145!llvm.ident = !{!0}
146!dx.version = !{!1}
147!dx.valver = !{!2}
148!dx.shaderModel = !{!3}
149!dx.resources = !{!4}
150!dx.viewIdState = !{!7}
151!dx.entryPoints = !{!8}
152
153!0 = !{!"dxc(private) 1.8.0.4662 (416fab6b5)"}
154!1 = !{i32 1, i32 0}
155!2 = !{i32 1, i32 8}
156!3 = !{!"vs", i32 6, i32 0}
157!4 = !{null, null, !5, null}
158!5 = !{!6}
159!6 = !{i32 0, %hostlayout._22_24* undef, !"", i32 1, i32 0, i32 1, i32 88, null}
160!7 = !{[4 x i32] [i32 2, i32 8, i32 240, i32 240]}
161!8 = !{void ()* @main, !"main", !9, !4, null}
162!9 = !{!10, !14, null}
163!10 = !{!11}
164!11 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !12, i8 0, i32 1, i8 2, i32 0, i8 0, !13}
165!12 = !{i32 0}
166!13 = !{i32 3, i32 3}
167!14 = !{!15, !17}
168!15 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !12, i8 2, i32 1, i8 4, i32 0, i8 0, !16}
169!16 = !{i32 3, i32 15}
170!17 = !{i32 1, !"SV_Position", i8 9, i8 3, !12, i8 4, i32 1, i8 4, i32 1, i8 0, !16}
171
172#endif
173
174static const unsigned char linepoint_vert_sm60_dxil[] = {
175 0x44, 0x58, 0x42, 0x43, 0x07, 0x97, 0x68, 0xde, 0x5f, 0x50, 0x0b, 0x5d,
176 0x22, 0x1b, 0xe5, 0xb4, 0xe8, 0xdb, 0x02, 0xea, 0x01, 0x00, 0x00, 0x00,
177 0x04, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
178 0x4c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
179 0xb8, 0x01, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00,
180 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00,
182 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44,
186 0x00, 0x00, 0x00, 0x00, 0x4f, 0x53, 0x47, 0x31, 0x60, 0x00, 0x00, 0x00,
187 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
192 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x53, 0x56, 0x5f,
194 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00,
195 0x50, 0x53, 0x56, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
196 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
198 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00,
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
201 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203 0x18, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
204 0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x6d,
205 0x61, 0x69, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x01, 0x00, 0x42, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x44, 0x03,
210 0x03, 0x04, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54,
212 0x4c, 0x06, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0x93, 0x01, 0x00, 0x00,
213 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
214 0x34, 0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
215 0x8a, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
216 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49,
217 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19,
218 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42,
219 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88,
220 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42,
221 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c,
222 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00,
223 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07,
224 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20,
225 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00,
226 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42,
227 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00,
228 0x24, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04,
229 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14,
230 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x6c, 0x23, 0x00,
231 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29,
232 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1,
233 0xa3, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95,
234 0x98, 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e,
235 0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab,
236 0x10, 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11,
237 0x04, 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10,
238 0x43, 0x12, 0xd4, 0x61, 0x04, 0x61, 0xb8, 0xe8, 0x70, 0xa4, 0x69, 0x01,
239 0x30, 0x87, 0x9a, 0xfc, 0xdf, 0xb6, 0x7f, 0x1b, 0x47, 0x83, 0xad, 0x97,
240 0x70, 0x12, 0x10, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87,
241 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50,
242 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30,
243 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0,
244 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20,
245 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
246 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
247 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10,
248 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
249 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0,
250 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
251 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e,
252 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86,
253 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00,
258 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x12, 0x00, 0x00, 0x00,
259 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
260 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x1b, 0x50,
261 0x04, 0x85, 0x50, 0x06, 0xe5, 0x50, 0x12, 0x05, 0x18, 0x50, 0x1a, 0x05,
262 0x1a, 0x50, 0x1e, 0x05, 0x51, 0x58, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08,
263 0x0a, 0xa1, 0x0c, 0x28, 0xd6, 0x00, 0xe1, 0x19, 0x00, 0xca, 0x33, 0x00,
264 0xa4, 0xc7, 0x22, 0x04, 0x04, 0x3e, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00,
265 0x79, 0x18, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
266 0x46, 0x02, 0x13, 0xc4, 0x31, 0x20, 0xc3, 0x1b, 0x43, 0x81, 0x93, 0x4b,
267 0xb3, 0x0b, 0xa3, 0x2b, 0x4b, 0x01, 0x89, 0x71, 0xc1, 0x71, 0x81, 0x71,
268 0xa1, 0xb1, 0xb1, 0x91, 0x01, 0x41, 0xa1, 0x89, 0xb1, 0x31, 0x0b, 0x13,
269 0xb3, 0x11, 0xab, 0x49, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20,
270 0x10, 0xc7, 0x06, 0x61, 0x20, 0x36, 0x08, 0x04, 0x41, 0xc1, 0x6e, 0x6e,
271 0x82, 0x40, 0x20, 0x1b, 0x86, 0x03, 0x21, 0x26, 0x08, 0x19, 0x47, 0xe3,
272 0x4b, 0x46, 0xe6, 0x4b, 0x86, 0x66, 0x82, 0x40, 0x24, 0x1b, 0x10, 0x42,
273 0x59, 0x06, 0x62, 0x60, 0x80, 0x0d, 0x41, 0xb3, 0x81, 0x00, 0x00, 0x07,
274 0x98, 0x20, 0x60, 0x1b, 0x8d, 0x2f, 0x19, 0x9a, 0xaf, 0x36, 0x98, 0x09,
275 0x02, 0xa1, 0x4c, 0x10, 0x88, 0x65, 0xc3, 0x30, 0x4d, 0xc3, 0x04, 0x81,
276 0x60, 0x26, 0x08, 0x44, 0x33, 0x41, 0x20, 0x9c, 0x09, 0x42, 0xa4, 0x6d,
277 0x50, 0x90, 0x48, 0xa2, 0x2a, 0xc2, 0xba, 0x2e, 0x8c, 0xc6, 0x97, 0x0c,
278 0xcd, 0x57, 0x5b, 0xcc, 0x04, 0x81, 0x78, 0x26, 0x08, 0x04, 0xb4, 0x41,
279 0x41, 0xb4, 0x6a, 0xb3, 0xae, 0x0b, 0xe3, 0x26, 0x1a, 0x5f, 0x32, 0x34,
280 0x5f, 0x6d, 0x32, 0x13, 0x04, 0x22, 0xda, 0x80, 0x20, 0x5e, 0xf5, 0x59,
281 0x17, 0x27, 0x6d, 0x20, 0x98, 0xac, 0x03, 0x83, 0x0d, 0x03, 0x01, 0x85,
282 0xc1, 0x04, 0x41, 0x00, 0x36, 0x00, 0x1b, 0x06, 0x82, 0x0c, 0xc8, 0x60,
283 0x43, 0x50, 0x06, 0x1b, 0x86, 0x61, 0x0c, 0xcc, 0x60, 0x82, 0xa0, 0x75,
284 0x1b, 0x02, 0x34, 0x20, 0xd1, 0x16, 0x96, 0xe6, 0x46, 0x84, 0xaa, 0x08,
285 0x6b, 0xe8, 0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50, 0x54, 0x13, 0x84, 0xc2,
286 0xda, 0x10, 0x10, 0x13, 0x84, 0xe2, 0xda, 0x20, 0x54, 0xd5, 0x86, 0x85,
287 0x58, 0x03, 0x36, 0x68, 0x03, 0x37, 0x68, 0x83, 0xe1, 0x0d, 0x88, 0x36,
288 0x80, 0x83, 0x0d, 0x41, 0x1c, 0x4c, 0x10, 0x0a, 0x6c, 0x82, 0x40, 0x48,
289 0x1b, 0x84, 0x8a, 0x0e, 0x36, 0x2c, 0xc4, 0x1a, 0xb0, 0x41, 0x1b, 0xb8,
290 0xc1, 0x1b, 0x0c, 0x73, 0x40, 0xb4, 0x41, 0x1d, 0x70, 0x99, 0xb2, 0xfa,
291 0x82, 0x7a, 0x9b, 0x4b, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x20, 0x14, 0xd9,
292 0x86, 0x65, 0xb8, 0x03, 0x36, 0xc0, 0x03, 0x37, 0x98, 0x83, 0x61, 0x0e,
293 0x86, 0x36, 0xa8, 0x83, 0x0d, 0x82, 0x1d, 0xe4, 0xc1, 0x86, 0x41, 0x0e,
294 0xf4, 0x00, 0xd8, 0x50, 0x8c, 0x81, 0x1a, 0xec, 0xc1, 0x03, 0xd0, 0x30,
295 0x63, 0x7b, 0x0b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x13, 0x8b, 0x34, 0xb7,
296 0x39, 0xba, 0xb9, 0x09, 0x02, 0x41, 0xd1, 0x98, 0x4b, 0x3b, 0xfb, 0x62,
297 0x23, 0xa3, 0x31, 0x97, 0x76, 0xf6, 0x35, 0x47, 0xb7, 0x01, 0xe9, 0x03,
298 0x3f, 0xf8, 0x03, 0x50, 0x08, 0x05, 0x49, 0x14, 0xfc, 0xa0, 0x0a, 0x1b,
299 0x9b, 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd, 0x94, 0x20, 0xa8,
300 0x42, 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6, 0xe6, 0x36, 0x25,
301 0x20, 0x9a, 0x90, 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9, 0x95, 0xc9, 0x4d,
302 0x09, 0x8a, 0x3a, 0x64, 0x78, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72,
303 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x02, 0xa4, 0x0c, 0x19, 0x9e, 0x8b,
304 0x5c, 0xd9, 0xdc, 0x5b, 0x9d, 0xdc, 0x58, 0xd9, 0xdc, 0x94, 0xc0, 0xa9,
305 0x44, 0x86, 0xe7, 0x42, 0x97, 0x07, 0x57, 0x16, 0xe4, 0xe6, 0xf6, 0x46,
306 0x17, 0x46, 0x97, 0xf6, 0xe6, 0x36, 0x37, 0x45, 0x08, 0x03, 0x33, 0xa8,
307 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76, 0x97, 0x44, 0x36, 0x45, 0x17,
308 0x46, 0x57, 0x36, 0x25, 0x40, 0x83, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e,
309 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x82, 0x3d,
310 0xe8, 0x42, 0x86, 0xe7, 0x32, 0xf6, 0x56, 0xe7, 0x46, 0x57, 0x26, 0x37,
311 0x37, 0x25, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
312 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
313 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
314 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
315 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
316 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
317 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
318 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
319 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
320 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
321 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
322 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
323 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
324 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
325 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
326 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
327 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
328 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
329 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
330 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
331 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
332 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
333 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
334 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
335 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
336 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
337 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
338 0x18, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10,
339 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25, 0x61, 0x00, 0x02, 0xe6,
340 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01,
341 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0, 0x34, 0x5c, 0xbe, 0xf3,
342 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x09,
343 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4,
344 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3, 0xe5, 0x3b, 0x8f, 0x3f,
345 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03,
346 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48,
347 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xe7, 0x0f, 0x2d,
348 0xa1, 0x5e, 0x5a, 0x0c, 0x84, 0x40, 0x29, 0x43, 0xa6, 0xb1, 0x27, 0x23,
349 0x44, 0x58, 0x49, 0x4c, 0xd4, 0x06, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00,
350 0xb5, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00,
351 0x10, 0x00, 0x00, 0x00, 0xbc, 0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde,
352 0x21, 0x0c, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00,
353 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91,
354 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c,
355 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02,
356 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b,
357 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5,
358 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50,
359 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06,
360 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff,
361 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff,
362 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f,
363 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
364 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00,
365 0x89, 0x20, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09,
366 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3,
367 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c,
368 0x10, 0x6c, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0,
369 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80,
370 0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0x7c,
371 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x11, 0x31, 0xc6, 0x18,
372 0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19,
373 0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42, 0xad, 0x14, 0x83, 0x8c,
374 0x31, 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4, 0x10, 0x12, 0x49, 0x0e,
375 0x04, 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x61, 0x04, 0x61, 0xb8, 0xe8,
376 0x70, 0xa4, 0x69, 0x01, 0x30, 0x87, 0x9a, 0xfc, 0xdf, 0xb6, 0x7f, 0x1b,
377 0x47, 0x83, 0xad, 0x97, 0x70, 0x12, 0x10, 0x00, 0x13, 0x14, 0x72, 0xc0,
378 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0,
379 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d,
380 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
381 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78,
382 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a,
383 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
384 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
385 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
386 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6,
387 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78,
388 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76,
389 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x79, 0x80, 0x00, 0x08,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01,
395 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00,
396 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90,
397 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50,
398 0x10, 0xc5, 0x50, 0xb0, 0x01, 0x65, 0x50, 0x1e, 0x54, 0x4a, 0x62, 0x04,
399 0xa0, 0x08, 0x0a, 0xa1, 0x0c, 0x28, 0xcf, 0x00, 0x90, 0x1e, 0x8b, 0x10,
400 0x10, 0xf8, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
401 0x53, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
402 0x31, 0x20, 0xc3, 0x1b, 0x43, 0x81, 0x93, 0x4b, 0xb3, 0x0b, 0xa3, 0x2b,
403 0x4b, 0x01, 0x89, 0x71, 0xc1, 0x71, 0x81, 0x71, 0xa1, 0xb1, 0xb1, 0x91,
404 0x01, 0x41, 0xa1, 0x89, 0xb1, 0x31, 0x0b, 0x13, 0xb3, 0x11, 0xab, 0x49,
405 0xd9, 0x10, 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61,
406 0x20, 0x26, 0x08, 0x04, 0xb2, 0x41, 0x18, 0x0c, 0x0a, 0x76, 0x73, 0x13,
407 0x04, 0x22, 0xd9, 0x30, 0x20, 0x09, 0x31, 0x41, 0xc8, 0x24, 0x02, 0x13,
408 0x04, 0x42, 0xd9, 0x80, 0x10, 0x0b, 0x33, 0x10, 0x43, 0x03, 0x6c, 0x08,
409 0x9c, 0x0d, 0x04, 0x00, 0x3c, 0xc0, 0x04, 0x41, 0x9b, 0x36, 0x04, 0xd1,
410 0x04, 0x41, 0x00, 0x48, 0xb4, 0x85, 0xa5, 0xb9, 0x11, 0xa1, 0x2a, 0xc2,
411 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20, 0x14, 0xcd, 0x04, 0xa1, 0x70,
412 0x36, 0x04, 0xc4, 0x04, 0xa1, 0x78, 0x26, 0x08, 0xc4, 0xb2, 0x41, 0xd0,
413 0xb4, 0x0d, 0x0b, 0x51, 0x59, 0x17, 0x76, 0x0d, 0x19, 0x71, 0x6d, 0x1b,
414 0x02, 0x6e, 0x82, 0x50, 0x40, 0x13, 0x04, 0x82, 0xd9, 0x20, 0x68, 0xdf,
415 0x86, 0x85, 0xa8, 0xac, 0x0b, 0xcb, 0x06, 0x8f, 0xb8, 0xc0, 0x80, 0xcb,
416 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x04,
417 0xa1, 0x88, 0x36, 0x2c, 0x83, 0x18, 0x58, 0x63, 0x80, 0x79, 0x83, 0x37,
418 0x5c, 0x60, 0xb0, 0x41, 0x08, 0x03, 0x32, 0xd8, 0x30, 0x74, 0x65, 0x00,
419 0x6c, 0x28, 0x26, 0xca, 0x0c, 0x20, 0xa0, 0x0a, 0x1b, 0x9b, 0x5d, 0x9b,
420 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd, 0x94, 0x20, 0xa8, 0x42, 0x86, 0xe7,
421 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6, 0xe6, 0x36, 0x25, 0x20, 0x9a, 0x90,
422 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9, 0x95, 0xc9, 0x4d, 0x09, 0x8c, 0x3a,
423 0x64, 0x78, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64,
424 0x65, 0x6c, 0x53, 0x82, 0xa4, 0x0c, 0x19, 0x9e, 0x8b, 0x5c, 0xd9, 0xdc,
425 0x5b, 0x9d, 0xdc, 0x58, 0xd9, 0xdc, 0x94, 0xe0, 0xa9, 0x43, 0x86, 0xe7,
426 0x62, 0x97, 0x56, 0x76, 0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57, 0x36,
427 0x25, 0x88, 0xea, 0x90, 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41,
428 0xbd, 0xa5, 0xb9, 0xd1, 0xcd, 0x4d, 0x09, 0xcc, 0x00, 0x00, 0x00, 0x00,
429 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
430 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
431 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
432 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
433 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
434 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
435 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
436 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
437 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
438 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
439 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
440 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
441 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
442 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
443 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
444 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
445 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
446 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
447 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
448 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
449 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
450 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
451 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
452 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
453 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
454 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
455 0x71, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97,
456 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25,
457 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce,
458 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0,
459 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93,
460 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e,
461 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3,
462 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7,
463 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
464 0x5c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
465 0x05, 0x00, 0x00, 0x00, 0x44, 0x4a, 0xa1, 0xec, 0x8a, 0xab, 0x10, 0x66,
466 0x00, 0x4a, 0x8e, 0x4a, 0x09, 0x50, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00,
467 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x20, 0x5d, 0x43, 0x53, 0x55, 0xc1,
468 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x9c, 0x61, 0x59, 0x4f, 0x31,
469 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x77, 0x5c, 0x17, 0x61, 0x8c,
470 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0xc3, 0x29, 0x03, 0x36, 0x9a, 0x10,
471 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4, 0x30,
472 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x4d, 0x18, 0x3c, 0x88, 0x37, 0x9a,
473 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09, 0xc4,
474 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x8d, 0x19, 0x50, 0x8d, 0x37,
475 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, 0x09,
476 0xc4, 0x60, 0x4e, 0x24, 0x9f, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78,
477 0xd6, 0x20, 0x8b, 0x94, 0xc0, 0x8c, 0x00, 0x3a, 0x06, 0x51, 0xf2, 0x19,
478 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0xc7, 0x0d, 0x38, 0x8a, 0x09, 0x2c,
479 0x40, 0xa0, 0x63, 0xd2, 0x25, 0x9f, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30,
480 0x78, 0xe2, 0xe0, 0xbb, 0x9c, 0xc0, 0x02, 0x05, 0x3a, 0x46, 0x69, 0xf2,
481 0x19, 0x31, 0x40, 0x00, 0x10, 0x04, 0x83, 0x87, 0x0e, 0xc4, 0x40, 0x83,
482 0x02, 0x0b, 0x18, 0xe8, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0x73,
483 0x07, 0x65, 0xe0, 0x8d, 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1,
484 0x68, 0xc2, 0x20, 0x8c, 0x26, 0x10, 0xc3, 0x88, 0x41, 0x02, 0x80, 0x20,
485 0x18, 0x20, 0x7d, 0xb0, 0x06, 0x78, 0x80, 0x07, 0x71, 0x40, 0x8c, 0x18,
486 0x24, 0x00, 0x08, 0x82, 0x01, 0xd2, 0x07, 0x6b, 0x80, 0x07, 0x78, 0x50,
487 0x06, 0xc3, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x7d, 0xb0, 0x06,
488 0x78, 0x80, 0x07, 0x70, 0x20, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01,
489 0xd2, 0x07, 0x6b, 0x80, 0x07, 0x78, 0xe0, 0x06, 0xc1, 0x88, 0x41, 0x02,
490 0x80, 0x20, 0x18, 0x20, 0x7d, 0xb0, 0x06, 0x79, 0x80, 0x07, 0x71, 0xf0,
491 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xd2, 0x07, 0x6b, 0x90, 0x07,
492 0x78, 0x50, 0x06, 0xcc, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x7d,
493 0xb0, 0x06, 0x79, 0x80, 0x07, 0x70, 0x90, 0x8c, 0x18, 0x24, 0x00, 0x08,
494 0x82, 0x01, 0xd2, 0x07, 0x6b, 0x90, 0x07, 0x78, 0xe0, 0x06, 0x06, 0x02,
495 0x00, 0x00, 0x00, 0x00
496};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.spv.h b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.spv.h
new file mode 100644
index 0000000..449e8dd
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/linepoint.vert.spv.h
@@ -0,0 +1,93 @@
1static const unsigned char linepoint_vert_spv[] = {
2 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00,
3 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
4 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
5 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
6 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
7 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
9 0x0d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
10 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
12 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
13 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00,
14 0x02, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
15 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
16 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00,
17 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00,
18 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
19 0x48, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
21 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
22 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00,
23 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
24 0x48, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
25 0x23, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00,
26 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
27 0x18, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
28 0x47, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
29 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00,
30 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
31 0x26, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00,
33 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00,
34 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
35 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
36 0x15, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
37 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
38 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00,
39 0x0a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
40 0x1e, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
41 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
42 0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
43 0x0b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
44 0x0d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00,
45 0x0e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
46 0x2b, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
47 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
48 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x20, 0x00, 0x04, 0x00,
49 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
50 0x2b, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
51 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
52 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
53 0x15, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
54 0x1e, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
55 0x07, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
56 0x17, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
57 0x3b, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
58 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x19, 0x00, 0x00, 0x00,
59 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
60 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
61 0x3b, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
62 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
63 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
64 0x24, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
65 0x3b, 0x00, 0x04, 0x00, 0x24, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
66 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x27, 0x00, 0x00, 0x00,
67 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00,
68 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
69 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00,
70 0x41, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
71 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
72 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00,
73 0x19, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
74 0x13, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
75 0x1b, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
76 0x15, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
77 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
78 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
79 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
80 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00,
81 0x22, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
82 0x1f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x91, 0x00, 0x05, 0x00,
83 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
84 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x24, 0x00, 0x00, 0x00,
85 0x25, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
86 0x3e, 0x00, 0x03, 0x00, 0x25, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
87 0x41, 0x00, 0x05, 0x00, 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
88 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
89 0x07, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
90 0x3e, 0x00, 0x03, 0x00, 0x26, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
91 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
92};
93static const unsigned int linepoint_vert_spv_len = 1076;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/metal.h b/SDL-3.2.8/src/render/gpu/shaders/metal.h
new file mode 100644
index 0000000..1841a69
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/metal.h
@@ -0,0 +1,6 @@
1#include "linepoint.vert.metal.h"
2#include "tri_color.vert.metal.h"
3#include "tri_texture.vert.metal.h"
4#include "color.frag.metal.h"
5#include "texture_rgba.frag.metal.h"
6#include "texture_rgb.frag.metal.h"
diff --git a/SDL-3.2.8/src/render/gpu/shaders/spir-v.h b/SDL-3.2.8/src/render/gpu/shaders/spir-v.h
new file mode 100644
index 0000000..85aa3c2
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/spir-v.h
@@ -0,0 +1,6 @@
1#include "linepoint.vert.spv.h"
2#include "tri_color.vert.spv.h"
3#include "tri_texture.vert.spv.h"
4#include "color.frag.spv.h"
5#include "texture_rgba.frag.spv.h"
6#include "texture_rgb.frag.spv.h"
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag
new file mode 100644
index 0000000..9a9ada8
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag
@@ -0,0 +1,12 @@
1#version 450
2
3layout(location = 0) in vec4 v_color;
4layout(location = 1) in vec2 v_uv;
5
6layout(set = 2, binding = 0) uniform sampler2D u_texture;
7
8layout(location = 0) out vec4 o_color;
9
10void main() {
11 o_color = vec4(texture(u_texture, v_uv).rgb, 1) * v_color;
12}
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.metal.h b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.metal.h
new file mode 100644
index 0000000..fbde876
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.metal.h
@@ -0,0 +1,41 @@
1static const unsigned char texture_rgb_frag_metal[] = {
2 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65,
3 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x0a,
4 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69,
5 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
6 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
7 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x0a,
8 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30,
9 0x5f, 0x6f, 0x75, 0x74, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
10 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x5f, 0x39, 0x20, 0x5b, 0x5b,
11 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a,
12 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d,
13 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20,
14 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x5f, 0x32,
15 0x38, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63,
16 0x6e, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
17 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x5f, 0x31, 0x37, 0x20, 0x5b,
18 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x31, 0x29,
19 0x5d, 0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x66, 0x72, 0x61, 0x67,
20 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f,
21 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69,
22 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73,
23 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x74,
24 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f,
25 0x61, 0x74, 0x3e, 0x20, 0x5f, 0x31, 0x33, 0x20, 0x5b, 0x5b, 0x74, 0x65,
26 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20,
27 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x5f, 0x31, 0x33, 0x53,
28 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x73, 0x61, 0x6d, 0x70, 0x6c,
29 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x29, 0x0a, 0x7b, 0x0a, 0x20,
30 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74,
31 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x0a, 0x20,
32 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6d, 0x5f, 0x39, 0x20, 0x3d,
33 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x5f, 0x31, 0x33, 0x2e,
34 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x5f, 0x31, 0x33, 0x53, 0x6d,
35 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x5f, 0x31, 0x37,
36 0x29, 0x2e, 0x78, 0x79, 0x7a, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x20,
37 0x2a, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x5f, 0x32, 0x38, 0x3b, 0x0a, 0x20,
38 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75,
39 0x74, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a
40};
41static const unsigned int texture_rgb_frag_metal_len = 450;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.sm50.dxbc.h b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.sm50.dxbc.h
new file mode 100644
index 0000000..183103a
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.sm50.dxbc.h
@@ -0,0 +1,123 @@
1static const signed char texture_rgb_frag_sm50_dxbc[] =
2{
3 68, 88, 66, 67, -22, -54,
4 -48, 73, -47, -40, -92, -21,
5 -43, -46, 13,-120, -20, 126,
6 110, 46, 1, 0, 0, 0,
7 -52, 2, 0, 0, 5, 0,
8 0, 0, 52, 0, 0, 0,
9 -12, 0, 0, 0, 64, 1,
10 0, 0, 116, 1, 0, 0,
11 48, 2, 0, 0, 82, 68,
12 69, 70, -72, 0, 0, 0,
13 0, 0, 0, 0, 0, 0,
14 0, 0, 2, 0, 0, 0,
15 60, 0, 0, 0, 0, 5,
16 -1, -1, 0, 1, 0, 0,
17-115, 0, 0, 0, 82, 68,
18 49, 49, 60, 0, 0, 0,
19 24, 0, 0, 0, 32, 0,
20 0, 0, 40, 0, 0, 0,
21 36, 0, 0, 0, 12, 0,
22 0, 0, 0, 0, 0, 0,
23 124, 0, 0, 0, 3, 0,
24 0, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0,
27 1, 0, 0, 0, 1, 0,
28 0, 0,-119, 0, 0, 0,
29 2, 0, 0, 0, 5, 0,
30 0, 0, 4, 0, 0, 0,
31 -1, -1, -1, -1, 0, 0,
32 0, 0, 1, 0, 0, 0,
33 13, 0, 0, 0, 95, 95,
34 49, 51, 95, 115, 97, 109,
35 112, 108, 101, 114, 0, 95,
36 49, 51, 0, 77, 105, 99,
37 114, 111, 115, 111, 102, 116,
38 32, 40, 82, 41, 32, 72,
39 76, 83, 76, 32, 83, 104,
40 97, 100, 101, 114, 32, 67,
41 111, 109, 112, 105, 108, 101,
42 114, 32, 49, 48, 46, 49,
43 0, -85, -85, -85, 73, 83,
44 71, 78, 68, 0, 0, 0,
45 2, 0, 0, 0, 8, 0,
46 0, 0, 56, 0, 0, 0,
47 0, 0, 0, 0, 0, 0,
48 0, 0, 3, 0, 0, 0,
49 0, 0, 0, 0, 15, 15,
50 0, 0, 56, 0, 0, 0,
51 1, 0, 0, 0, 0, 0,
52 0, 0, 3, 0, 0, 0,
53 1, 0, 0, 0, 3, 3,
54 0, 0, 84, 69, 88, 67,
55 79, 79, 82, 68, 0, -85,
56 -85, -85, 79, 83, 71, 78,
57 44, 0, 0, 0, 1, 0,
58 0, 0, 8, 0, 0, 0,
59 32, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0,
61 3, 0, 0, 0, 0, 0,
62 0, 0, 15, 0, 0, 0,
63 83, 86, 95, 84, 97, 114,
64 103, 101, 116, 0, -85, -85,
65 83, 72, 69, 88, -76, 0,
66 0, 0, 80, 0, 0, 0,
67 45, 0, 0, 0, 106, 8,
68 0, 1, 90, 0, 0, 3,
69 0, 96, 16, 0, 0, 0,
70 0, 0, 88, 24, 0, 4,
71 0, 112, 16, 0, 0, 0,
72 0, 0, 85, 85, 0, 0,
73 98, 16, 0, 3, -14, 16,
74 16, 0, 0, 0, 0, 0,
75 98, 16, 0, 3, 50, 16,
76 16, 0, 1, 0, 0, 0,
77 101, 0, 0, 3, -14, 32,
78 16, 0, 0, 0, 0, 0,
79 104, 0, 0, 2, 1, 0,
80 0, 0, 69, 0, 0,-117,
81 -62, 0, 0,-128, 67, 85,
82 21, 0, 114, 0, 16, 0,
83 0, 0, 0, 0, 70, 16,
84 16, 0, 1, 0, 0, 0,
85 70, 126, 16, 0, 0, 0,
86 0, 0, 0, 96, 16, 0,
87 0, 0, 0, 0, 54, 0,
88 0, 5,-126, 0, 16, 0,
89 0, 0, 0, 0, 1, 64,
90 0, 0, 0, 0,-128, 63,
91 56, 0, 0, 7, -14, 32,
92 16, 0, 0, 0, 0, 0,
93 70, 14, 16, 0, 0, 0,
94 0, 0, 70, 30, 16, 0,
95 0, 0, 0, 0, 62, 0,
96 0, 1, 83, 84, 65, 84,
97-108, 0, 0, 0, 4, 0,
98 0, 0, 1, 0, 0, 0,
99 0, 0, 0, 0, 3, 0,
100 0, 0, 1, 0, 0, 0,
101 0, 0, 0, 0, 0, 0,
102 0, 0, 1, 0, 0, 0,
103 0, 0, 0, 0, 0, 0,
104 0, 0, 0, 0, 0, 0,
105 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 0, 0, 0,
107 1, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0,
110 0, 0, 1, 0, 0, 0,
111 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0,
113 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 0,
115 0, 0, 0, 0, 0, 0,
116 0, 0, 0, 0, 0, 0,
117 0, 0, 0, 0, 0, 0,
118 0, 0, 0, 0, 0, 0,
119 0, 0, 0, 0, 0, 0,
120 0, 0, 0, 0, 0, 0,
121 0, 0, 0, 0, 0, 0,
122 0, 0
123};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.sm60.dxil.h b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.sm60.dxil.h
new file mode 100644
index 0000000..e07e135
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.sm60.dxil.h
@@ -0,0 +1,465 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; TEXCOORD 0 xyzw 0 NONE float xyzw
8; TEXCOORD 1 xy 1 NONE float xy
9;
10;
11; Output signature:
12;
13; Name Index Mask Register SysValue Format Used
14; -------------------- ----- ------ -------- -------- ------- ------
15; SV_Target 0 xyzw 0 TARGET float xyzw
16;
17; shader hash: 6899b843a76b999aab785570052af6a1
18;
19; Pipeline Runtime Information:
20;
21; Pixel Shader
22; DepthOutput=0
23; SampleFrequency=0
24;
25;
26; Input signature:
27;
28; Name Index InterpMode DynIdx
29; -------------------- ----- ---------------------- ------
30; TEXCOORD 0 linear
31; TEXCOORD 1 linear
32;
33; Output signature:
34;
35; Name Index InterpMode DynIdx
36; -------------------- ----- ---------------------- ------
37; SV_Target 0
38;
39; Buffer Definitions:
40;
41;
42; Resource Bindings:
43;
44; Name Type Format Dim ID HLSL Bind Count
45; ------------------------------ ---------- ------- ----------- ------- -------------- ------
46; __13_sampler sampler NA NA S0 s0,space2 1
47; _13 texture f32 2d T0 t0,space2 1
48;
49;
50; ViewId state:
51;
52; Number of inputs: 6, outputs: 4
53; Outputs dependent on ViewId: { }
54; Inputs contributing to computation of Outputs:
55; output 0 depends on inputs: { 0, 4, 5 }
56; output 1 depends on inputs: { 1, 4, 5 }
57; output 2 depends on inputs: { 2, 4, 5 }
58; output 3 depends on inputs: { 3 }
59;
60target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
61target triple = "dxil-ms-dx"
62
63%dx.types.Handle = type { i8* }
64%dx.types.ResRet.f32 = type { float, float, float, float, i32 }
65%"class.Texture2D<vector<float, 4> >" = type { <4 x float>, %"class.Texture2D<vector<float, 4> >::mips_type" }
66%"class.Texture2D<vector<float, 4> >::mips_type" = type { i32 }
67%struct.SamplerState = type { i32 }
68
69define void @main() {
70 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
71 %2 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 3, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
72 %3 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
73 %4 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
74 %5 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
75 %6 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
76 %7 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
77 %8 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
78 %9 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %1, %dx.types.Handle %2, float %3, float %4, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
79 %10 = extractvalue %dx.types.ResRet.f32 %9, 0
80 %11 = extractvalue %dx.types.ResRet.f32 %9, 1
81 %12 = extractvalue %dx.types.ResRet.f32 %9, 2
82 %13 = fmul fast float %10, %5
83 %14 = fmul fast float %11, %6
84 %15 = fmul fast float %12, %7
85 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %13) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
86 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %14) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
87 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %15) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
88 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %8) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
89 ret void
90}
91
92; Function Attrs: nounwind readnone
93declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
94
95; Function Attrs: nounwind
96declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
97
98; Function Attrs: nounwind readonly
99declare %dx.types.ResRet.f32 @dx.op.sample.f32(i32, %dx.types.Handle, %dx.types.Handle, float, float, float, float, i32, i32, i32, float) #2
100
101; Function Attrs: nounwind readonly
102declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
103
104attributes #0 = { nounwind readnone }
105attributes #1 = { nounwind }
106attributes #2 = { nounwind readonly }
107
108!llvm.ident = !{!0}
109!dx.version = !{!1}
110!dx.valver = !{!2}
111!dx.shaderModel = !{!3}
112!dx.resources = !{!4}
113!dx.viewIdState = !{!10}
114!dx.entryPoints = !{!11}
115
116!0 = !{!"dxc(private) 1.8.0.4662 (416fab6b5)"}
117!1 = !{i32 1, i32 0}
118!2 = !{i32 1, i32 8}
119!3 = !{!"ps", i32 6, i32 0}
120!4 = !{!5, null, null, !8}
121!5 = !{!6}
122!6 = !{i32 0, %"class.Texture2D<vector<float, 4> >"* undef, !"", i32 2, i32 0, i32 1, i32 2, i32 0, !7}
123!7 = !{i32 0, i32 9}
124!8 = !{!9}
125!9 = !{i32 0, %struct.SamplerState* undef, !"", i32 2, i32 0, i32 1, i32 0, null}
126!10 = !{[8 x i32] [i32 6, i32 4, i32 1, i32 2, i32 4, i32 8, i32 7, i32 7]}
127!11 = !{void ()* @main, !"main", !12, !4, null}
128!12 = !{!13, !20, null}
129!13 = !{!14, !17}
130!14 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !15, i8 2, i32 1, i8 4, i32 0, i8 0, !16}
131!15 = !{i32 0}
132!16 = !{i32 3, i32 15}
133!17 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !18, i8 2, i32 1, i8 2, i32 1, i8 0, !19}
134!18 = !{i32 1}
135!19 = !{i32 3, i32 3}
136!20 = !{!21}
137!21 = !{i32 0, !"SV_Target", i8 9, i8 16, !15, i8 0, i32 1, i8 4, i32 0, i8 0, !16}
138
139#endif
140
141static const unsigned char texture_rgb_frag_sm60_dxil[] = {
142 0x44, 0x58, 0x42, 0x43, 0x80, 0x0c, 0x49, 0xdc, 0x1e, 0x21, 0x6f, 0xab,
143 0x8e, 0x0c, 0x74, 0xde, 0x47, 0xb3, 0x50, 0xf3, 0x01, 0x00, 0x00, 0x00,
144 0x1c, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
145 0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
146 0xd8, 0x01, 0x00, 0x00, 0x38, 0x08, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00,
147 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x54, 0x00, 0x00, 0x00,
149 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
153 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
154 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00,
156 0x4f, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
157 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x00,
161 0x50, 0x53, 0x56, 0x30, 0xec, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
164 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
167 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x18, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
172 0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x6d,
173 0x61, 0x69, 0x6e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00,
176 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00,
177 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 0x01, 0x00, 0x44, 0x10, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
179 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
180 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x58, 0x06, 0x00, 0x00,
182 0x60, 0x00, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
183 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00,
184 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x8d, 0x01, 0x00, 0x00,
185 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
186 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
187 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
188 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14,
189 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20,
190 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
191 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
192 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
193 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
194 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
195 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
196 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
197 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
198 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84,
199 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c,
200 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66,
201 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14,
202 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0x9b, 0x86, 0xcb, 0x9f,
203 0xb0, 0x87, 0x90, 0xfc, 0x95, 0x90, 0x56, 0x62, 0xf2, 0x8b, 0xdb, 0x46,
204 0xc5, 0x18, 0x63, 0x10, 0x2a, 0xf7, 0x0c, 0x97, 0x3f, 0x61, 0x0f, 0x21,
205 0xf9, 0x21, 0xd0, 0x0c, 0x0b, 0x81, 0x82, 0x55, 0x18, 0x45, 0x18, 0x1b,
206 0x63, 0x0c, 0x42, 0xc8, 0xa0, 0x36, 0x47, 0x10, 0x14, 0x83, 0x91, 0x42,
207 0xc8, 0x23, 0x38, 0x10, 0x30, 0x8c, 0x40, 0x0c, 0x33, 0xb5, 0xc1, 0x38,
208 0xb0, 0x43, 0x38, 0xcc, 0xc3, 0x3c, 0xb8, 0x01, 0x2d, 0x94, 0x03, 0x3e,
209 0xd0, 0x43, 0x3d, 0xc8, 0x43, 0x39, 0xc8, 0x01, 0x29, 0xf0, 0x81, 0x3d,
210 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x03, 0x1f, 0x98, 0x03, 0x3b,
211 0xbc, 0x43, 0x38, 0xd0, 0x03, 0x1b, 0x80, 0x01, 0x1d, 0xf8, 0x01, 0x18,
212 0xf8, 0x81, 0x1e, 0xe8, 0x41, 0x3b, 0xa4, 0x03, 0x3c, 0xcc, 0xc3, 0x2f,
213 0xd0, 0x43, 0x3e, 0xc0, 0x43, 0x39, 0xa0, 0x80, 0xcc, 0x24, 0x06, 0xe3,
214 0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xb4, 0x50, 0x0e, 0xf8,
215 0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, 0xf6,
216 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec,
217 0xf0, 0x0e, 0xe1, 0x40, 0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60,
218 0xe0, 0x07, 0x48, 0x98, 0x94, 0xea, 0x4d, 0xd2, 0x14, 0x51, 0xc2, 0xe4,
219 0xb3, 0x00, 0xf3, 0x2c, 0x44, 0xc4, 0x4e, 0xc0, 0x44, 0xa0, 0x80, 0xd0,
220 0x4d, 0x04, 0x02, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87,
221 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50,
222 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30,
223 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0,
224 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20,
225 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
226 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
227 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10,
228 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
229 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0,
230 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
231 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e,
232 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86,
233 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
238 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
239 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x45, 0x50, 0x12,
240 0x65, 0x50, 0x1e, 0x85, 0x52, 0x08, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08,
241 0x0a, 0xa1, 0x40, 0xc8, 0xce, 0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x16,
242 0x62, 0x10, 0x81, 0x40, 0x20, 0xc7, 0x01, 0x00, 0x79, 0x18, 0x00, 0x00,
243 0x7b, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
244 0x31, 0x20, 0xc3, 0x1b, 0x43, 0x81, 0x93, 0x4b, 0xb3, 0x0b, 0xa3, 0x2b,
245 0x4b, 0x01, 0x89, 0x71, 0xc1, 0x71, 0x81, 0x71, 0xa1, 0xb1, 0xb1, 0x91,
246 0x01, 0x41, 0xa1, 0x89, 0xb1, 0x31, 0x0b, 0x13, 0xb3, 0x11, 0xab, 0x49,
247 0xd9, 0x10, 0x04, 0x13, 0x04, 0xa2, 0x98, 0x20, 0x10, 0xc6, 0x06, 0x61,
248 0x20, 0x36, 0x08, 0x04, 0x41, 0x01, 0x6e, 0x6e, 0x82, 0x40, 0x1c, 0x1b,
249 0x86, 0x03, 0x21, 0x26, 0x08, 0xd6, 0xc4, 0xe1, 0x2b, 0x66, 0x66, 0x82,
250 0x40, 0x20, 0x13, 0x04, 0x22, 0xd9, 0x20, 0x10, 0xcd, 0x86, 0x84, 0x50,
251 0x16, 0x86, 0x18, 0x18, 0xc2, 0xd9, 0x10, 0x3c, 0x13, 0x04, 0x8c, 0x22,
252 0xf3, 0xf5, 0x15, 0x33, 0xf3, 0x35, 0x17, 0xd6, 0x06, 0xc7, 0x56, 0x26,
253 0xb7, 0x01, 0x21, 0x22, 0x89, 0x21, 0x06, 0x02, 0xd8, 0x10, 0x4c, 0x1b,
254 0x08, 0x08, 0x00, 0xa8, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0xc4,
255 0x75, 0x6d, 0x08, 0xb0, 0x0d, 0xc3, 0x60, 0x65, 0x13, 0x84, 0xac, 0xda,
256 0x10, 0x6c, 0x24, 0xda, 0xc2, 0xd2, 0xdc, 0x88, 0x50, 0x15, 0x61, 0x0d,
257 0x3d, 0x3d, 0x49, 0x11, 0x4d, 0x10, 0x0a, 0x67, 0x82, 0x50, 0x3c, 0x1b,
258 0x02, 0x62, 0x82, 0x50, 0x40, 0x13, 0x84, 0x22, 0x9a, 0x20, 0x10, 0xca,
259 0x04, 0x81, 0x58, 0x36, 0x08, 0x64, 0x50, 0x06, 0x1b, 0x16, 0xc2, 0xfb,
260 0xc0, 0x20, 0x0c, 0xc4, 0x60, 0x18, 0x03, 0x02, 0x0c, 0xcc, 0x60, 0x43,
261 0x30, 0x6c, 0x10, 0xc8, 0x80, 0x0c, 0x36, 0x2c, 0x83, 0xf7, 0x81, 0x01,
262 0x1a, 0x88, 0xc1, 0x20, 0x06, 0x03, 0x18, 0xa4, 0xc1, 0x06, 0xe1, 0x0c,
263 0xd4, 0x80, 0xc9, 0x94, 0xd5, 0x17, 0x55, 0x98, 0xdc, 0x59, 0x19, 0xdd,
264 0x04, 0xa1, 0x90, 0x36, 0x2c, 0x04, 0x1b, 0x7c, 0x6d, 0x10, 0x06, 0x60,
265 0x30, 0x8c, 0x01, 0x01, 0x06, 0x66, 0xb0, 0x21, 0x70, 0x83, 0x0d, 0xc3,
266 0x1a, 0xbc, 0x01, 0xb0, 0xa1, 0xb0, 0x3a, 0x38, 0xa8, 0x00, 0x1a, 0x66,
267 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x2c, 0xd2, 0xdc, 0xe6, 0xe8, 0xe6, 0x26,
268 0x08, 0x04, 0x43, 0x63, 0x2e, 0xed, 0xec, 0x8b, 0x8d, 0x8c, 0xc6, 0x5c,
269 0xda, 0xd9, 0xd7, 0x1c, 0xdd, 0x04, 0x81, 0x68, 0x88, 0xd0, 0x95, 0xe1,
270 0x7d, 0xb9, 0xbd, 0xc9, 0xb5, 0x6d, 0x50, 0xe4, 0x80, 0x0c, 0xe6, 0x80,
271 0x0e, 0xea, 0x00, 0xb1, 0x83, 0x3b, 0xc0, 0x83, 0xa1, 0x0a, 0x1b, 0x9b,
272 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd, 0x94, 0x20, 0xa8, 0x42,
273 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6, 0xe6, 0x36, 0x25, 0x20,
274 0x9a, 0x90, 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9, 0x95, 0xc9, 0x4d, 0x09,
275 0x8a, 0x3a, 0x64, 0x78, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4d,
276 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x02, 0xa4, 0x0c, 0x19, 0x9e, 0x8b, 0x5c,
277 0xd9, 0xdc, 0x5b, 0x9d, 0xdc, 0x58, 0xd9, 0xdc, 0x94, 0x80, 0xaa, 0x44,
278 0x86, 0xe7, 0x42, 0x97, 0x07, 0x57, 0x16, 0xe4, 0xe6, 0xf6, 0x46, 0x17,
279 0x46, 0x97, 0xf6, 0xe6, 0x36, 0x37, 0x25, 0xc8, 0xea, 0x90, 0xe1, 0xb9,
280 0xd8, 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1, 0x85, 0xd1, 0x95, 0x4d,
281 0x09, 0xb6, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50,
282 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x02, 0x38, 0xe8, 0x42, 0x86, 0xe7,
283 0x32, 0xf6, 0x56, 0xe7, 0x46, 0x57, 0x26, 0x37, 0x37, 0x25, 0xc0, 0x03,
284 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
285 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
286 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
287 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,
288 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30,
289 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8,
290 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b,
291 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76,
292 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e,
293 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e,
294 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61,
295 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4,
296 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76,
297 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37,
298 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76,
299 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71,
300 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e,
301 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1,
302 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61,
303 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90,
304 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8,
305 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc,
306 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8,
307 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b,
308 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a,
309 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e,
310 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
311 0x46, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x11, 0xc0, 0x44, 0x84,
312 0x40, 0x33, 0x2c, 0x84, 0x05, 0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38,
313 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d, 0xdb, 0x00, 0x34, 0x5c,
314 0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0xe1, 0x17, 0xb7, 0x6d, 0x02,
315 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d,
316 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 0x68, 0x99, 0xb8, 0x43, 0xa7, 0x6b, 0x99, 0x9a,
319 0xab, 0x78, 0x55, 0x70, 0x05, 0x2a, 0xf6, 0xa1, 0x44, 0x58, 0x49, 0x4c,
320 0xc0, 0x06, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00,
321 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
322 0xa8, 0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
323 0xa7, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
324 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49,
325 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19,
326 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42,
327 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88,
328 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42,
329 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c,
330 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00,
331 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07,
332 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20,
333 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00,
334 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42,
335 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00,
336 0x43, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04,
337 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14,
338 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00,
339 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29,
340 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1,
341 0x9b, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0xfc, 0x95, 0x90, 0x56, 0x62,
342 0xf2, 0x8b, 0xdb, 0x46, 0xc5, 0x18, 0x63, 0x10, 0x2a, 0xf7, 0x0c, 0x97,
343 0x3f, 0x61, 0x0f, 0x21, 0xf9, 0x21, 0xd0, 0x0c, 0x0b, 0x81, 0x82, 0x55,
344 0x18, 0x45, 0x18, 0x1b, 0x63, 0x0c, 0x42, 0xc8, 0xa0, 0x36, 0x47, 0x10,
345 0x14, 0x83, 0x91, 0x42, 0xc8, 0x23, 0x38, 0x10, 0x30, 0x8c, 0x40, 0x0c,
346 0x33, 0xb5, 0xc1, 0x38, 0xb0, 0x43, 0x38, 0xcc, 0xc3, 0x3c, 0xb8, 0x01,
347 0x2d, 0x94, 0x03, 0x3e, 0xd0, 0x43, 0x3d, 0xc8, 0x43, 0x39, 0xc8, 0x01,
348 0x29, 0xf0, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x03,
349 0x1f, 0x98, 0x03, 0x3b, 0xbc, 0x43, 0x38, 0xd0, 0x03, 0x1b, 0x80, 0x01,
350 0x1d, 0xf8, 0x01, 0x18, 0xf8, 0x81, 0x1e, 0xe8, 0x41, 0x3b, 0xa4, 0x03,
351 0x3c, 0xcc, 0xc3, 0x2f, 0xd0, 0x43, 0x3e, 0xc0, 0x43, 0x39, 0xa0, 0x80,
352 0xcc, 0x24, 0x06, 0xe3, 0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, 0x06,
353 0xb4, 0x50, 0x0e, 0xf8, 0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07,
354 0xa4, 0xc0, 0x07, 0xf6, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f,
355 0x7c, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, 0x40, 0x0f, 0x6c, 0x00, 0x06,
356 0x74, 0xe0, 0x07, 0x60, 0xe0, 0x07, 0x48, 0x98, 0x94, 0xea, 0x4d, 0xd2,
357 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x00, 0xf3, 0x2c, 0x44, 0xc4, 0x4e, 0xc0,
358 0x44, 0xa0, 0x80, 0xd0, 0x4d, 0x04, 0x02, 0x00, 0x13, 0x14, 0x72, 0xc0,
359 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0,
360 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d,
361 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
362 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78,
363 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a,
364 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
365 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
366 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
367 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6,
368 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78,
369 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76,
370 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00, 0x18,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00,
376 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90,
377 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50,
378 0x10, 0xc5, 0x50, 0x04, 0x25, 0x51, 0x06, 0xe5, 0x41, 0xa5, 0x24, 0x46,
379 0x00, 0x8a, 0xa0, 0x10, 0x0a, 0x84, 0xec, 0x0c, 0x00, 0xe1, 0x19, 0x00,
380 0xca, 0x63, 0x21, 0x06, 0x11, 0x08, 0x04, 0x72, 0x1c, 0x00, 0x00, 0x00,
381 0x79, 0x18, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
382 0x46, 0x02, 0x13, 0xc4, 0x31, 0x20, 0xc3, 0x1b, 0x43, 0x81, 0x93, 0x4b,
383 0xb3, 0x0b, 0xa3, 0x2b, 0x4b, 0x01, 0x89, 0x71, 0xc1, 0x71, 0x81, 0x71,
384 0xa1, 0xb1, 0xb1, 0x91, 0x01, 0x41, 0xa1, 0x89, 0xb1, 0x31, 0x0b, 0x13,
385 0xb3, 0x11, 0xab, 0x49, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xa2, 0x98, 0x20,
386 0x10, 0xc6, 0x06, 0x61, 0x20, 0x26, 0x08, 0xc4, 0xb1, 0x41, 0x18, 0x0c,
387 0x0a, 0x70, 0x73, 0x13, 0x04, 0x02, 0xd9, 0x30, 0x20, 0x09, 0x31, 0x41,
388 0xb0, 0x24, 0x02, 0x13, 0x04, 0x22, 0x99, 0x20, 0x10, 0xca, 0x06, 0x81,
389 0x70, 0x36, 0x24, 0xc4, 0xc2, 0x34, 0xc4, 0xd0, 0x10, 0xcf, 0x86, 0x00,
390 0x9a, 0x20, 0x60, 0xd3, 0x06, 0x84, 0x90, 0x98, 0x86, 0x18, 0x08, 0x60,
391 0x43, 0x30, 0x6d, 0x20, 0x22, 0x00, 0xa0, 0x26, 0x08, 0x19, 0xb5, 0x21,
392 0xb0, 0x26, 0x08, 0x02, 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55,
393 0x11, 0xd6, 0xd0, 0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0x68, 0x26, 0x08,
394 0x85, 0xb3, 0x21, 0x20, 0x26, 0x08, 0xc5, 0x33, 0x41, 0x28, 0xa0, 0x09,
395 0x02, 0xb1, 0x4c, 0x10, 0x08, 0x66, 0x83, 0x00, 0x06, 0x61, 0xb0, 0x61,
396 0x21, 0xb4, 0x8d, 0xeb, 0xbc, 0xe1, 0x23, 0x38, 0x31, 0xd8, 0x10, 0x0c,
397 0x1b, 0x04, 0x30, 0x00, 0x83, 0x0d, 0xcb, 0xa0, 0x6d, 0x1c, 0x19, 0x78,
398 0x83, 0x37, 0x70, 0x65, 0xb0, 0x41, 0x18, 0x03, 0x33, 0x60, 0x32, 0x65,
399 0xf5, 0x45, 0x15, 0x26, 0x77, 0x56, 0x46, 0x37, 0x41, 0x28, 0xa2, 0x0d,
400 0x0b, 0x81, 0x06, 0x5b, 0x1a, 0x74, 0xdc, 0xf0, 0x11, 0x9c, 0x18, 0x6c,
401 0x08, 0xd4, 0x60, 0xc3, 0x70, 0x06, 0x6b, 0x00, 0x6c, 0x28, 0xb0, 0x8c,
402 0x0d, 0x2a, 0xa0, 0x0a, 0x1b, 0x9b, 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99,
403 0x1b, 0xdd, 0x94, 0x20, 0xa8, 0x42, 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37,
404 0x97, 0xf6, 0xe6, 0x36, 0x25, 0x20, 0x9a, 0x90, 0xe1, 0xb9, 0xd8, 0x85,
405 0xb1, 0xd9, 0x95, 0xc9, 0x4d, 0x09, 0x8c, 0x3a, 0x64, 0x78, 0x2e, 0x73,
406 0x68, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x82,
407 0xa4, 0x0c, 0x19, 0x9e, 0x8b, 0x5c, 0xd9, 0xdc, 0x5b, 0x9d, 0xdc, 0x58,
408 0xd9, 0xdc, 0x94, 0x80, 0xaa, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76,
409 0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0xb0, 0xea, 0x90,
410 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1,
411 0xcd, 0x4d, 0x09, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
412 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
413 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
414 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
415 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
416 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
417 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
418 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
419 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
420 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
421 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
422 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
423 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
424 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
425 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
426 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
427 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
428 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
429 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
430 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
431 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
432 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
433 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
434 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
435 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
436 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
437 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
438 0x12, 0x00, 0x00, 0x00, 0x46, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10,
439 0x11, 0xc0, 0x44, 0x84, 0x40, 0x33, 0x2c, 0x84, 0x05, 0x4c, 0xc3, 0xe5,
440 0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d,
441 0xdb, 0x00, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0xe1,
442 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13,
443 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03,
444 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00,
445 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
446 0xf4, 0x46, 0x00, 0x88, 0xcc, 0x00, 0x14, 0x42, 0x29, 0x94, 0x5c, 0xe1,
447 0x51, 0x29, 0x83, 0x12, 0xa0, 0x31, 0x03, 0x00, 0x23, 0x06, 0x09, 0x00,
448 0x82, 0x60, 0x00, 0x69, 0x05, 0x84, 0x61, 0xc9, 0x88, 0x41, 0x02, 0x80,
449 0x20, 0x18, 0x40, 0x9b, 0x41, 0x64, 0x99, 0x32, 0x62, 0x90, 0x00, 0x20,
450 0x08, 0x06, 0xc6, 0x97, 0x6c, 0x9a, 0xa4, 0x8c, 0x18, 0x24, 0x00, 0x08,
451 0x82, 0x81, 0x01, 0x06, 0x0a, 0xb7, 0x15, 0xcb, 0x88, 0x41, 0x02, 0x80,
452 0x20, 0x18, 0x18, 0x61, 0xb0, 0x70, 0x1c, 0xc5, 0x8c, 0x18, 0x24, 0x00,
453 0x08, 0x82, 0x81, 0x21, 0x06, 0x4c, 0xd7, 0x1d, 0xcd, 0x88, 0x41, 0x02,
454 0x80, 0x20, 0x18, 0x18, 0x63, 0xd0, 0x78, 0x5e, 0xe5, 0x8c, 0x18, 0x24,
455 0x00, 0x08, 0x82, 0x81, 0x41, 0x06, 0xce, 0xf7, 0x29, 0xcf, 0x88, 0xc1,
456 0x03, 0x80, 0x20, 0x18, 0x34, 0x63, 0xc0, 0x20, 0x87, 0x51, 0x24, 0x09,
457 0x18, 0x80, 0x01, 0x94, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
458 0x26, 0x0c, 0x82, 0x0d, 0x88, 0x7c, 0x6c, 0x40, 0xe4, 0x63, 0x03, 0x22,
459 0x9f, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xd6, 0xa0, 0x3a, 0x83,
460 0x33, 0xf8, 0x86, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40, 0xd6, 0xa0,
461 0x3a, 0x83, 0x33, 0x88, 0x84, 0x11, 0x83, 0x04, 0x00, 0x41, 0x30, 0x40,
462 0xd6, 0xa0, 0x3a, 0x83, 0x33, 0xf0, 0x82, 0x11, 0x83, 0x04, 0x00, 0x41,
463 0x30, 0x40, 0xd6, 0xa0, 0x3a, 0x83, 0x33, 0x90, 0x10, 0x04, 0x00, 0x00,
464 0x00, 0x00, 0x00, 0x00
465};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.spv.h b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.spv.h
new file mode 100644
index 0000000..3ba7d55
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgb.frag.spv.h
@@ -0,0 +1,59 @@
1static const unsigned char texture_rgb_frag_spv[] = {
2 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00,
3 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
4 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
5 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
6 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
7 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00,
8 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
9 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
10 0x10, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
11 0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
12 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00,
13 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
14 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15 0x47, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
16 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00,
17 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00,
18 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
19 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00,
20 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
21 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
22 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
23 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
24 0x03, 0x00, 0x00, 0x00, 0x19, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x00, 0x00,
25 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
26 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
27 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00,
28 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
29 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
30 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31 0x17, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
32 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00,
33 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
34 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
35 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
36 0x00, 0x00, 0x80, 0x3f, 0x20, 0x00, 0x04, 0x00, 0x1b, 0x00, 0x00, 0x00,
37 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
38 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
39 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
40 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
41 0x05, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00,
42 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
43 0x0f, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
44 0x57, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
45 0x0e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
46 0x06, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00,
48 0x18, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
49 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
50 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00,
51 0x07, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
52 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
53 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
54 0x1c, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
55 0x1e, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
56 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
57 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
58};
59static const unsigned int texture_rgb_frag_spv_len = 668;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag
new file mode 100644
index 0000000..05fd18c
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag
@@ -0,0 +1,12 @@
1#version 450
2
3layout(location = 0) in vec4 v_color;
4layout(location = 1) in vec2 v_uv;
5
6layout(set = 2, binding = 0) uniform sampler2D u_texture;
7
8layout(location = 0) out vec4 o_color;
9
10void main() {
11 o_color = texture(u_texture, v_uv) * v_color;
12}
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.metal.h b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.metal.h
new file mode 100644
index 0000000..9c8f150
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.metal.h
@@ -0,0 +1,40 @@
1static const unsigned char texture_rgba_frag_metal[] = {
2 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65,
3 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x0a,
4 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69,
5 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
6 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
7 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x0a,
8 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30,
9 0x5f, 0x6f, 0x75, 0x74, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
10 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x5f, 0x39, 0x20, 0x5b, 0x5b,
11 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a,
12 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d,
13 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20,
14 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x5f, 0x32,
15 0x31, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63,
16 0x6e, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
17 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x5f, 0x31, 0x37, 0x20, 0x5b,
18 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x31, 0x29,
19 0x5d, 0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x66, 0x72, 0x61, 0x67,
20 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f,
21 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69,
22 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73,
23 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x74,
24 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f,
25 0x61, 0x74, 0x3e, 0x20, 0x5f, 0x31, 0x33, 0x20, 0x5b, 0x5b, 0x74, 0x65,
26 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x2c, 0x20,
27 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x5f, 0x31, 0x33, 0x53,
28 0x6d, 0x70, 0x6c, 0x72, 0x20, 0x5b, 0x5b, 0x73, 0x61, 0x6d, 0x70, 0x6c,
29 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x29, 0x0a, 0x7b, 0x0a, 0x20,
30 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74,
31 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x0a, 0x20,
32 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6d, 0x5f, 0x39, 0x20, 0x3d,
33 0x20, 0x5f, 0x31, 0x33, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28,
34 0x5f, 0x31, 0x33, 0x53, 0x6d, 0x70, 0x6c, 0x72, 0x2c, 0x20, 0x69, 0x6e,
35 0x2e, 0x6d, 0x5f, 0x31, 0x37, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x2e,
36 0x6d, 0x5f, 0x32, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65,
37 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x0a, 0x7d, 0x0a,
38 0x0a
39};
40static const unsigned int texture_rgba_frag_metal_len = 433;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.sm50.dxbc.h b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.sm50.dxbc.h
new file mode 100644
index 0000000..d240991
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.sm50.dxbc.h
@@ -0,0 +1,120 @@
1static const signed char texture_rgba_frag_sm50_dxbc[] =
2{
3 68, 88, 66, 67, -83, 124,
4 -3, -84,-102, 126, 29, -62,
5-107, 79, -74, 72, -7, 33,
6 124,-103, 1, 0, 0, 0,
7 -72, 2, 0, 0, 5, 0,
8 0, 0, 52, 0, 0, 0,
9 -12, 0, 0, 0, 64, 1,
10 0, 0, 116, 1, 0, 0,
11 28, 2, 0, 0, 82, 68,
12 69, 70, -72, 0, 0, 0,
13 0, 0, 0, 0, 0, 0,
14 0, 0, 2, 0, 0, 0,
15 60, 0, 0, 0, 0, 5,
16 -1, -1, 0, 1, 0, 0,
17-115, 0, 0, 0, 82, 68,
18 49, 49, 60, 0, 0, 0,
19 24, 0, 0, 0, 32, 0,
20 0, 0, 40, 0, 0, 0,
21 36, 0, 0, 0, 12, 0,
22 0, 0, 0, 0, 0, 0,
23 124, 0, 0, 0, 3, 0,
24 0, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0,
27 1, 0, 0, 0, 1, 0,
28 0, 0,-119, 0, 0, 0,
29 2, 0, 0, 0, 5, 0,
30 0, 0, 4, 0, 0, 0,
31 -1, -1, -1, -1, 0, 0,
32 0, 0, 1, 0, 0, 0,
33 13, 0, 0, 0, 95, 95,
34 49, 51, 95, 115, 97, 109,
35 112, 108, 101, 114, 0, 95,
36 49, 51, 0, 77, 105, 99,
37 114, 111, 115, 111, 102, 116,
38 32, 40, 82, 41, 32, 72,
39 76, 83, 76, 32, 83, 104,
40 97, 100, 101, 114, 32, 67,
41 111, 109, 112, 105, 108, 101,
42 114, 32, 49, 48, 46, 49,
43 0, -85, -85, -85, 73, 83,
44 71, 78, 68, 0, 0, 0,
45 2, 0, 0, 0, 8, 0,
46 0, 0, 56, 0, 0, 0,
47 0, 0, 0, 0, 0, 0,
48 0, 0, 3, 0, 0, 0,
49 0, 0, 0, 0, 15, 15,
50 0, 0, 56, 0, 0, 0,
51 1, 0, 0, 0, 0, 0,
52 0, 0, 3, 0, 0, 0,
53 1, 0, 0, 0, 3, 3,
54 0, 0, 84, 69, 88, 67,
55 79, 79, 82, 68, 0, -85,
56 -85, -85, 79, 83, 71, 78,
57 44, 0, 0, 0, 1, 0,
58 0, 0, 8, 0, 0, 0,
59 32, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0,
61 3, 0, 0, 0, 0, 0,
62 0, 0, 15, 0, 0, 0,
63 83, 86, 95, 84, 97, 114,
64 103, 101, 116, 0, -85, -85,
65 83, 72, 69, 88, -96, 0,
66 0, 0, 80, 0, 0, 0,
67 40, 0, 0, 0, 106, 8,
68 0, 1, 90, 0, 0, 3,
69 0, 96, 16, 0, 0, 0,
70 0, 0, 88, 24, 0, 4,
71 0, 112, 16, 0, 0, 0,
72 0, 0, 85, 85, 0, 0,
73 98, 16, 0, 3, -14, 16,
74 16, 0, 0, 0, 0, 0,
75 98, 16, 0, 3, 50, 16,
76 16, 0, 1, 0, 0, 0,
77 101, 0, 0, 3, -14, 32,
78 16, 0, 0, 0, 0, 0,
79 104, 0, 0, 2, 1, 0,
80 0, 0, 69, 0, 0,-117,
81 -62, 0, 0,-128, 67, 85,
82 21, 0, -14, 0, 16, 0,
83 0, 0, 0, 0, 70, 16,
84 16, 0, 1, 0, 0, 0,
85 70, 126, 16, 0, 0, 0,
86 0, 0, 0, 96, 16, 0,
87 0, 0, 0, 0, 56, 0,
88 0, 7, -14, 32, 16, 0,
89 0, 0, 0, 0, 70, 14,
90 16, 0, 0, 0, 0, 0,
91 70, 30, 16, 0, 0, 0,
92 0, 0, 62, 0, 0, 1,
93 83, 84, 65, 84,-108, 0,
94 0, 0, 3, 0, 0, 0,
95 1, 0, 0, 0, 0, 0,
96 0, 0, 3, 0, 0, 0,
97 1, 0, 0, 0, 0, 0,
98 0, 0, 0, 0, 0, 0,
99 1, 0, 0, 0, 0, 0,
100 0, 0, 0, 0, 0, 0,
101 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 0, 0, 0,
103 0, 0, 0, 0, 1, 0,
104 0, 0, 0, 0, 0, 0,
105 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0,
110 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0,
113 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 0,
115 0, 0, 0, 0, 0, 0,
116 0, 0, 0, 0, 0, 0,
117 0, 0, 0, 0, 0, 0,
118 0, 0, 0, 0, 0, 0
119
120};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.sm60.dxil.h b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.sm60.dxil.h
new file mode 100644
index 0000000..eba7080
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.sm60.dxil.h
@@ -0,0 +1,467 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; TEXCOORD 0 xyzw 0 NONE float xyzw
8; TEXCOORD 1 xy 1 NONE float xy
9;
10;
11; Output signature:
12;
13; Name Index Mask Register SysValue Format Used
14; -------------------- ----- ------ -------- -------- ------- ------
15; SV_Target 0 xyzw 0 TARGET float xyzw
16;
17; shader hash: ab99026f3068b3314341ba15eaf626a8
18;
19; Pipeline Runtime Information:
20;
21; Pixel Shader
22; DepthOutput=0
23; SampleFrequency=0
24;
25;
26; Input signature:
27;
28; Name Index InterpMode DynIdx
29; -------------------- ----- ---------------------- ------
30; TEXCOORD 0 linear
31; TEXCOORD 1 linear
32;
33; Output signature:
34;
35; Name Index InterpMode DynIdx
36; -------------------- ----- ---------------------- ------
37; SV_Target 0
38;
39; Buffer Definitions:
40;
41;
42; Resource Bindings:
43;
44; Name Type Format Dim ID HLSL Bind Count
45; ------------------------------ ---------- ------- ----------- ------- -------------- ------
46; __13_sampler sampler NA NA S0 s0,space2 1
47; _13 texture f32 2d T0 t0,space2 1
48;
49;
50; ViewId state:
51;
52; Number of inputs: 6, outputs: 4
53; Outputs dependent on ViewId: { }
54; Inputs contributing to computation of Outputs:
55; output 0 depends on inputs: { 0, 4, 5 }
56; output 1 depends on inputs: { 1, 4, 5 }
57; output 2 depends on inputs: { 2, 4, 5 }
58; output 3 depends on inputs: { 3, 4, 5 }
59;
60target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
61target triple = "dxil-ms-dx"
62
63%dx.types.Handle = type { i8* }
64%dx.types.ResRet.f32 = type { float, float, float, float, i32 }
65%"class.Texture2D<vector<float, 4> >" = type { <4 x float>, %"class.Texture2D<vector<float, 4> >::mips_type" }
66%"class.Texture2D<vector<float, 4> >::mips_type" = type { i32 }
67%struct.SamplerState = type { i32 }
68
69define void @main() {
70 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
71 %2 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 3, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
72 %3 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
73 %4 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
74 %5 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
75 %6 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
76 %7 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
77 %8 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
78 %9 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %1, %dx.types.Handle %2, float %3, float %4, float undef, float undef, i32 0, i32 0, i32 undef, float undef) ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
79 %10 = extractvalue %dx.types.ResRet.f32 %9, 0
80 %11 = extractvalue %dx.types.ResRet.f32 %9, 1
81 %12 = extractvalue %dx.types.ResRet.f32 %9, 2
82 %13 = extractvalue %dx.types.ResRet.f32 %9, 3
83 %14 = fmul fast float %10, %5
84 %15 = fmul fast float %11, %6
85 %16 = fmul fast float %12, %7
86 %17 = fmul fast float %13, %8
87 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %14) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
88 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %15) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
89 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %16) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
90 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %17) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
91 ret void
92}
93
94; Function Attrs: nounwind readnone
95declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
96
97; Function Attrs: nounwind
98declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
99
100; Function Attrs: nounwind readonly
101declare %dx.types.ResRet.f32 @dx.op.sample.f32(i32, %dx.types.Handle, %dx.types.Handle, float, float, float, float, i32, i32, i32, float) #2
102
103; Function Attrs: nounwind readonly
104declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
105
106attributes #0 = { nounwind readnone }
107attributes #1 = { nounwind }
108attributes #2 = { nounwind readonly }
109
110!llvm.ident = !{!0}
111!dx.version = !{!1}
112!dx.valver = !{!2}
113!dx.shaderModel = !{!3}
114!dx.resources = !{!4}
115!dx.viewIdState = !{!10}
116!dx.entryPoints = !{!11}
117
118!0 = !{!"dxc(private) 1.8.0.4662 (416fab6b5)"}
119!1 = !{i32 1, i32 0}
120!2 = !{i32 1, i32 8}
121!3 = !{!"ps", i32 6, i32 0}
122!4 = !{!5, null, null, !8}
123!5 = !{!6}
124!6 = !{i32 0, %"class.Texture2D<vector<float, 4> >"* undef, !"", i32 2, i32 0, i32 1, i32 2, i32 0, !7}
125!7 = !{i32 0, i32 9}
126!8 = !{!9}
127!9 = !{i32 0, %struct.SamplerState* undef, !"", i32 2, i32 0, i32 1, i32 0, null}
128!10 = !{[8 x i32] [i32 6, i32 4, i32 1, i32 2, i32 4, i32 8, i32 15, i32 15]}
129!11 = !{void ()* @main, !"main", !12, !4, null}
130!12 = !{!13, !20, null}
131!13 = !{!14, !17}
132!14 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !15, i8 2, i32 1, i8 4, i32 0, i8 0, !16}
133!15 = !{i32 0}
134!16 = !{i32 3, i32 15}
135!17 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !18, i8 2, i32 1, i8 2, i32 1, i8 0, !19}
136!18 = !{i32 1}
137!19 = !{i32 3, i32 3}
138!20 = !{!21}
139!21 = !{i32 0, !"SV_Target", i8 9, i8 16, !15, i8 0, i32 1, i8 4, i32 0, i8 0, !16}
140
141#endif
142
143static const unsigned char texture_rgba_frag_sm60_dxil[] = {
144 0x44, 0x58, 0x42, 0x43, 0x5c, 0x82, 0x6d, 0x45, 0x43, 0x35, 0xdf, 0xf5,
145 0xad, 0xf7, 0x1b, 0x5e, 0xc0, 0x65, 0x38, 0x3f, 0x01, 0x00, 0x00, 0x00,
146 0x24, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
147 0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
148 0xd8, 0x01, 0x00, 0x00, 0x38, 0x08, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00,
149 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x54, 0x00, 0x00, 0x00,
151 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
155 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
156 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00,
158 0x4f, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
159 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x00,
163 0x50, 0x53, 0x56, 0x30, 0xec, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
166 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00,
167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
169 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x18, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
174 0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x6d,
175 0x61, 0x69, 0x6e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00,
178 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00,
179 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x01, 0x00, 0x44, 0x10, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
181 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
182 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x58, 0x06, 0x00, 0x00,
184 0x60, 0x00, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
185 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00,
186 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x8d, 0x01, 0x00, 0x00,
187 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
188 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
189 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
190 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14,
191 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20,
192 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
193 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
194 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
195 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
196 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
197 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
198 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
199 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
200 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84,
201 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c,
202 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66,
203 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14,
204 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0x9b, 0x86, 0xcb, 0x9f,
205 0xb0, 0x87, 0x90, 0xfc, 0x95, 0x90, 0x56, 0x62, 0xf2, 0x8b, 0xdb, 0x46,
206 0xc5, 0x18, 0x63, 0x10, 0x2a, 0xf7, 0x0c, 0x97, 0x3f, 0x61, 0x0f, 0x21,
207 0xf9, 0x21, 0xd0, 0x0c, 0x0b, 0x81, 0x82, 0x55, 0x18, 0x45, 0x18, 0x1b,
208 0x63, 0x0c, 0x42, 0xc8, 0xa0, 0x36, 0x47, 0x10, 0x14, 0x83, 0x91, 0x42,
209 0xc8, 0x23, 0x38, 0x10, 0x30, 0x8c, 0x40, 0x0c, 0x33, 0xb5, 0xc1, 0x38,
210 0xb0, 0x43, 0x38, 0xcc, 0xc3, 0x3c, 0xb8, 0x01, 0x2d, 0x94, 0x03, 0x3e,
211 0xd0, 0x43, 0x3d, 0xc8, 0x43, 0x39, 0xc8, 0x01, 0x29, 0xf0, 0x81, 0x3d,
212 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x03, 0x1f, 0x98, 0x03, 0x3b,
213 0xbc, 0x43, 0x38, 0xd0, 0x03, 0x1b, 0x80, 0x01, 0x1d, 0xf8, 0x01, 0x18,
214 0xf8, 0x81, 0x1e, 0xe8, 0x41, 0x3b, 0xa4, 0x03, 0x3c, 0xcc, 0xc3, 0x2f,
215 0xd0, 0x43, 0x3e, 0xc0, 0x43, 0x39, 0xa0, 0x80, 0xcc, 0x24, 0x06, 0xe3,
216 0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xb4, 0x50, 0x0e, 0xf8,
217 0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, 0xf6,
218 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec,
219 0xf0, 0x0e, 0xe1, 0x40, 0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60,
220 0xe0, 0x07, 0x48, 0x98, 0x94, 0xea, 0x4d, 0xd2, 0x14, 0x51, 0xc2, 0xe4,
221 0xb3, 0x00, 0xf3, 0x2c, 0x44, 0xc4, 0x4e, 0xc0, 0x44, 0xa0, 0x80, 0xd0,
222 0x4d, 0x04, 0x02, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87,
223 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50,
224 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30,
225 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0,
226 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20,
227 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
228 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90,
229 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10,
230 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
231 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0,
232 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
233 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e,
234 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86,
235 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
240 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47,
241 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50, 0x0c, 0x45, 0x50, 0x12,
242 0x65, 0x50, 0x1e, 0x85, 0x50, 0x2c, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08,
243 0x0a, 0xa1, 0x40, 0xc8, 0xce, 0x00, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x16,
244 0x62, 0x10, 0x81, 0x40, 0x20, 0xcf, 0x03, 0x00, 0x79, 0x18, 0x00, 0x00,
245 0x7b, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
246 0x31, 0x20, 0xc3, 0x1b, 0x43, 0x81, 0x93, 0x4b, 0xb3, 0x0b, 0xa3, 0x2b,
247 0x4b, 0x01, 0x89, 0x71, 0xc1, 0x71, 0x81, 0x71, 0xa1, 0xb1, 0xb1, 0x91,
248 0x01, 0x41, 0xa1, 0x89, 0xb1, 0x31, 0x0b, 0x13, 0xb3, 0x11, 0xab, 0x49,
249 0xd9, 0x10, 0x04, 0x13, 0x04, 0xa2, 0x98, 0x20, 0x10, 0xc6, 0x06, 0x61,
250 0x20, 0x36, 0x08, 0x04, 0x41, 0x01, 0x6e, 0x6e, 0x82, 0x40, 0x1c, 0x1b,
251 0x86, 0x03, 0x21, 0x26, 0x08, 0xd6, 0xc4, 0xe1, 0x2b, 0x66, 0x66, 0x82,
252 0x40, 0x20, 0x13, 0x04, 0x22, 0xd9, 0x20, 0x10, 0xcd, 0x86, 0x84, 0x50,
253 0x16, 0x86, 0x18, 0x18, 0xc2, 0xd9, 0x10, 0x3c, 0x13, 0x04, 0x8c, 0x22,
254 0xf3, 0xf5, 0x15, 0x33, 0xf3, 0x35, 0x17, 0xd6, 0x06, 0xc7, 0x56, 0x26,
255 0xb7, 0x01, 0x21, 0x22, 0x89, 0x21, 0x06, 0x02, 0xd8, 0x10, 0x4c, 0x1b,
256 0x08, 0x08, 0x00, 0xa8, 0x09, 0x82, 0x00, 0x6c, 0x00, 0x36, 0x0c, 0xc4,
257 0x75, 0x6d, 0x08, 0xb0, 0x0d, 0xc3, 0x60, 0x65, 0x13, 0x84, 0xac, 0xda,
258 0x10, 0x6c, 0x24, 0xda, 0xc2, 0xd2, 0xdc, 0x88, 0x50, 0x15, 0x61, 0x0d,
259 0x3d, 0x3d, 0x49, 0x11, 0x4d, 0x10, 0x0a, 0x67, 0x82, 0x50, 0x3c, 0x1b,
260 0x02, 0x62, 0x82, 0x50, 0x40, 0x13, 0x84, 0x22, 0x9a, 0x20, 0x10, 0xca,
261 0x04, 0x81, 0x58, 0x36, 0x08, 0x64, 0x50, 0x06, 0x1b, 0x16, 0xc2, 0xfb,
262 0xc0, 0x20, 0x0c, 0xc4, 0x60, 0x18, 0x03, 0x02, 0x0c, 0xcc, 0x60, 0x43,
263 0x30, 0x6c, 0x10, 0xc8, 0x80, 0x0c, 0x36, 0x2c, 0x83, 0xf7, 0x81, 0x01,
264 0x1a, 0x88, 0xc1, 0x20, 0x06, 0x03, 0x18, 0xa4, 0xc1, 0x06, 0xe1, 0x0c,
265 0xd4, 0x80, 0xc9, 0x94, 0xd5, 0x17, 0x55, 0x98, 0xdc, 0x59, 0x19, 0xdd,
266 0x04, 0xa1, 0x90, 0x36, 0x2c, 0x04, 0x1b, 0x7c, 0x6d, 0x10, 0x06, 0x60,
267 0x30, 0x8c, 0x01, 0x01, 0x06, 0x66, 0xb0, 0x21, 0x70, 0x83, 0x0d, 0xc3,
268 0x1a, 0xbc, 0x01, 0xb0, 0xa1, 0xb0, 0x3a, 0x38, 0xa8, 0x00, 0x1a, 0x66,
269 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x13, 0x04, 0x82, 0x61, 0x91, 0xe6, 0x36,
270 0x47, 0x37, 0x37, 0x41, 0x20, 0x1a, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x6c,
271 0x64, 0x34, 0xe6, 0xd2, 0xce, 0xbe, 0xe6, 0xe8, 0x88, 0xd0, 0x95, 0xe1,
272 0x7d, 0xb9, 0xbd, 0xc9, 0xb5, 0x6d, 0x50, 0xe4, 0x60, 0x0e, 0xe8, 0xa0,
273 0x0e, 0xec, 0x00, 0xb9, 0x83, 0x39, 0xc0, 0x83, 0xa1, 0x0a, 0x1b, 0x9b,
274 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd, 0x94, 0x20, 0xa8, 0x42,
275 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6, 0xe6, 0x36, 0x25, 0x20,
276 0x9a, 0x90, 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9, 0x95, 0xc9, 0x4d, 0x09,
277 0x8a, 0x3a, 0x64, 0x78, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4d,
278 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x02, 0xa4, 0x0c, 0x19, 0x9e, 0x8b, 0x5c,
279 0xd9, 0xdc, 0x5b, 0x9d, 0xdc, 0x58, 0xd9, 0xdc, 0x94, 0x80, 0xaa, 0x44,
280 0x86, 0xe7, 0x42, 0x97, 0x07, 0x57, 0x16, 0xe4, 0xe6, 0xf6, 0x46, 0x17,
281 0x46, 0x97, 0xf6, 0xe6, 0x36, 0x37, 0x25, 0xc8, 0xea, 0x90, 0xe1, 0xb9,
282 0xd8, 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1, 0x85, 0xd1, 0x95, 0x4d,
283 0x09, 0xb6, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50,
284 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x02, 0x38, 0xe8, 0x42, 0x86, 0xe7,
285 0x32, 0xf6, 0x56, 0xe7, 0x46, 0x57, 0x26, 0x37, 0x37, 0x25, 0xc0, 0x03,
286 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
287 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88,
288 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73,
289 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e,
290 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30,
291 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8,
292 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b,
293 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76,
294 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e,
295 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e,
296 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61,
297 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4,
298 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76,
299 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37,
300 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76,
301 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71,
302 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e,
303 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1,
304 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61,
305 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90,
306 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8,
307 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc,
308 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8,
309 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b,
310 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a,
311 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e,
312 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
313 0x46, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x11, 0xc0, 0x44, 0x84,
314 0x40, 0x33, 0x2c, 0x84, 0x05, 0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38,
315 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d, 0xdb, 0x00, 0x34, 0x5c,
316 0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0xe1, 0x17, 0xb7, 0x6d, 0x02,
317 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13, 0x11, 0x28, 0x35, 0x3d,
318 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0xab, 0x99, 0x02, 0x6f, 0x30, 0x68, 0xb3, 0x31,
321 0x43, 0x41, 0xba, 0x15, 0xea, 0xf6, 0x26, 0xa8, 0x44, 0x58, 0x49, 0x4c,
322 0xc8, 0x06, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xb2, 0x01, 0x00, 0x00,
323 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
324 0xb0, 0x06, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
325 0xa9, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
326 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49,
327 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19,
328 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42,
329 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88,
330 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42,
331 0xe4, 0x48, 0x0e, 0x90, 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c,
332 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00,
333 0x08, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07,
334 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20,
335 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00,
336 0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42,
337 0x20, 0x4c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00,
338 0x43, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04,
339 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14,
340 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x68, 0x23, 0x00,
341 0x25, 0x00, 0x14, 0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29,
342 0xc6, 0x20, 0x84, 0x14, 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1,
343 0x9b, 0x86, 0xcb, 0x9f, 0xb0, 0x87, 0x90, 0xfc, 0x95, 0x90, 0x56, 0x62,
344 0xf2, 0x8b, 0xdb, 0x46, 0xc5, 0x18, 0x63, 0x10, 0x2a, 0xf7, 0x0c, 0x97,
345 0x3f, 0x61, 0x0f, 0x21, 0xf9, 0x21, 0xd0, 0x0c, 0x0b, 0x81, 0x82, 0x55,
346 0x18, 0x45, 0x18, 0x1b, 0x63, 0x0c, 0x42, 0xc8, 0xa0, 0x36, 0x47, 0x10,
347 0x14, 0x83, 0x91, 0x42, 0xc8, 0x23, 0x38, 0x10, 0x30, 0x8c, 0x40, 0x0c,
348 0x33, 0xb5, 0xc1, 0x38, 0xb0, 0x43, 0x38, 0xcc, 0xc3, 0x3c, 0xb8, 0x01,
349 0x2d, 0x94, 0x03, 0x3e, 0xd0, 0x43, 0x3d, 0xc8, 0x43, 0x39, 0xc8, 0x01,
350 0x29, 0xf0, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x03,
351 0x1f, 0x98, 0x03, 0x3b, 0xbc, 0x43, 0x38, 0xd0, 0x03, 0x1b, 0x80, 0x01,
352 0x1d, 0xf8, 0x01, 0x18, 0xf8, 0x81, 0x1e, 0xe8, 0x41, 0x3b, 0xa4, 0x03,
353 0x3c, 0xcc, 0xc3, 0x2f, 0xd0, 0x43, 0x3e, 0xc0, 0x43, 0x39, 0xa0, 0x80,
354 0xcc, 0x24, 0x06, 0xe3, 0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, 0x06,
355 0xb4, 0x50, 0x0e, 0xf8, 0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07,
356 0xa4, 0xc0, 0x07, 0xf6, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f,
357 0x7c, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, 0x40, 0x0f, 0x6c, 0x00, 0x06,
358 0x74, 0xe0, 0x07, 0x60, 0xe0, 0x07, 0x48, 0x98, 0x94, 0xea, 0x4d, 0xd2,
359 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x00, 0xf3, 0x2c, 0x44, 0xc4, 0x4e, 0xc0,
360 0x44, 0xa0, 0x80, 0xd0, 0x4d, 0x04, 0x02, 0x00, 0x13, 0x14, 0x72, 0xc0,
361 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0,
362 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d,
363 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
364 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78,
365 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a,
366 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
367 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
368 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
369 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6,
370 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78,
371 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76,
372 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x81, 0x80, 0x00, 0x18,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x00,
378 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90,
379 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x25, 0x30, 0x02, 0x50,
380 0x10, 0xc5, 0x50, 0x04, 0x25, 0x51, 0x06, 0xe5, 0x41, 0xa5, 0x24, 0x46,
381 0x00, 0x8a, 0xa0, 0x10, 0x0a, 0x84, 0xec, 0x0c, 0x00, 0xe1, 0x19, 0x00,
382 0xca, 0x63, 0x21, 0x06, 0x11, 0x08, 0x04, 0xf2, 0x3c, 0x00, 0x00, 0x00,
383 0x79, 0x18, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
384 0x46, 0x02, 0x13, 0xc4, 0x31, 0x20, 0xc3, 0x1b, 0x43, 0x81, 0x93, 0x4b,
385 0xb3, 0x0b, 0xa3, 0x2b, 0x4b, 0x01, 0x89, 0x71, 0xc1, 0x71, 0x81, 0x71,
386 0xa1, 0xb1, 0xb1, 0x91, 0x01, 0x41, 0xa1, 0x89, 0xb1, 0x31, 0x0b, 0x13,
387 0xb3, 0x11, 0xab, 0x49, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xa2, 0x98, 0x20,
388 0x10, 0xc6, 0x06, 0x61, 0x20, 0x26, 0x08, 0xc4, 0xb1, 0x41, 0x18, 0x0c,
389 0x0a, 0x70, 0x73, 0x13, 0x04, 0x02, 0xd9, 0x30, 0x20, 0x09, 0x31, 0x41,
390 0xb0, 0x24, 0x02, 0x13, 0x04, 0x22, 0x99, 0x20, 0x10, 0xca, 0x06, 0x81,
391 0x70, 0x36, 0x24, 0xc4, 0xc2, 0x34, 0xc4, 0xd0, 0x10, 0xcf, 0x86, 0x00,
392 0x9a, 0x20, 0x60, 0xd3, 0x06, 0x84, 0x90, 0x98, 0x86, 0x18, 0x08, 0x60,
393 0x43, 0x30, 0x6d, 0x20, 0x22, 0x00, 0xa0, 0x26, 0x08, 0x19, 0xb5, 0x21,
394 0xb0, 0x26, 0x08, 0x02, 0x40, 0xa2, 0x2d, 0x2c, 0xcd, 0x8d, 0x08, 0x55,
395 0x11, 0xd6, 0xd0, 0xd3, 0x93, 0x14, 0xd1, 0x04, 0xa1, 0x68, 0x26, 0x08,
396 0x85, 0xb3, 0x21, 0x20, 0x26, 0x08, 0xc5, 0x33, 0x41, 0x28, 0xa0, 0x09,
397 0x02, 0xb1, 0x4c, 0x10, 0x08, 0x66, 0x83, 0x00, 0x06, 0x61, 0xb0, 0x61,
398 0x21, 0xb4, 0x8d, 0xeb, 0xbc, 0xe1, 0x23, 0x38, 0x31, 0xd8, 0x10, 0x0c,
399 0x1b, 0x04, 0x30, 0x00, 0x83, 0x0d, 0xcb, 0xa0, 0x6d, 0x1c, 0x19, 0x78,
400 0x83, 0x37, 0x70, 0x65, 0xb0, 0x41, 0x18, 0x03, 0x33, 0x60, 0x32, 0x65,
401 0xf5, 0x45, 0x15, 0x26, 0x77, 0x56, 0x46, 0x37, 0x41, 0x28, 0xa2, 0x0d,
402 0x0b, 0x81, 0x06, 0x5b, 0x1a, 0x74, 0xdc, 0xf0, 0x11, 0x9c, 0x18, 0x6c,
403 0x08, 0xd4, 0x60, 0xc3, 0x70, 0x06, 0x6b, 0x00, 0x6c, 0x28, 0xb0, 0x8c,
404 0x0d, 0x2a, 0xa0, 0x0a, 0x1b, 0x9b, 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99,
405 0x1b, 0xdd, 0x94, 0x20, 0xa8, 0x42, 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37,
406 0x97, 0xf6, 0xe6, 0x36, 0x25, 0x20, 0x9a, 0x90, 0xe1, 0xb9, 0xd8, 0x85,
407 0xb1, 0xd9, 0x95, 0xc9, 0x4d, 0x09, 0x8c, 0x3a, 0x64, 0x78, 0x2e, 0x73,
408 0x68, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x82,
409 0xa4, 0x0c, 0x19, 0x9e, 0x8b, 0x5c, 0xd9, 0xdc, 0x5b, 0x9d, 0xdc, 0x58,
410 0xd9, 0xdc, 0x94, 0x80, 0xaa, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76,
411 0x97, 0x44, 0x36, 0x45, 0x17, 0x46, 0x57, 0x36, 0x25, 0xb0, 0xea, 0x90,
412 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1,
413 0xcd, 0x4d, 0x09, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
414 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
415 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
416 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
417 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce,
418 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b,
419 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c,
420 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07,
421 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11,
422 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0,
423 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8,
424 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b,
425 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b,
426 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87,
427 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07,
428 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87,
429 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81,
430 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30,
431 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
432 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca,
433 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39,
434 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b,
435 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b,
436 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87,
437 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87,
438 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40,
439 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00,
440 0x12, 0x00, 0x00, 0x00, 0x46, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xbe, 0x10,
441 0x11, 0xc0, 0x44, 0x84, 0x40, 0x33, 0x2c, 0x84, 0x05, 0x4c, 0xc3, 0xe5,
442 0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d,
443 0xdb, 0x00, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x12, 0xc0, 0x3c, 0x0b, 0xe1,
444 0x17, 0xb7, 0x6d, 0x02, 0xd5, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x93, 0x13,
445 0x11, 0x28, 0x35, 0x3d, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x00, 0x04, 0x03,
446 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00,
447 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
448 0xf4, 0x46, 0x00, 0x88, 0xcc, 0x00, 0x14, 0x42, 0x29, 0x94, 0x5c, 0xe1,
449 0x51, 0x29, 0x83, 0x12, 0xa0, 0x31, 0x03, 0x00, 0x23, 0x06, 0x09, 0x00,
450 0x82, 0x60, 0x00, 0x69, 0x05, 0x84, 0x61, 0xc9, 0x88, 0x41, 0x02, 0x80,
451 0x20, 0x18, 0x40, 0x9b, 0x41, 0x64, 0x99, 0x32, 0x62, 0x90, 0x00, 0x20,
452 0x08, 0x06, 0xc6, 0x97, 0x6c, 0x9a, 0xa4, 0x8c, 0x18, 0x24, 0x00, 0x08,
453 0x82, 0x81, 0x01, 0x06, 0x0a, 0xb7, 0x15, 0xcb, 0x88, 0x41, 0x02, 0x80,
454 0x20, 0x18, 0x18, 0x61, 0xb0, 0x70, 0x1c, 0xc5, 0x8c, 0x18, 0x24, 0x00,
455 0x08, 0x82, 0x81, 0x21, 0x06, 0x4c, 0xd7, 0x1d, 0xcd, 0x88, 0x41, 0x02,
456 0x80, 0x20, 0x18, 0x18, 0x63, 0xd0, 0x78, 0x5e, 0xe5, 0x8c, 0x18, 0x24,
457 0x00, 0x08, 0x82, 0x81, 0x41, 0x06, 0xce, 0xf7, 0x29, 0xcf, 0x88, 0xc1,
458 0x03, 0x80, 0x20, 0x18, 0x34, 0x63, 0xc0, 0x20, 0x87, 0x51, 0x24, 0x09,
459 0x18, 0x80, 0x01, 0x94, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c,
460 0x26, 0x0c, 0xc2, 0x68, 0x02, 0x31, 0x18, 0x91, 0xc8, 0xc7, 0x88, 0x44,
461 0x3e, 0x46, 0x24, 0xf2, 0x31, 0x22, 0x91, 0xcf, 0x88, 0x41, 0x02, 0x80,
462 0x20, 0x18, 0x20, 0x6d, 0x70, 0xa5, 0x41, 0x1a, 0x84, 0x01, 0x31, 0x62,
463 0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x1b, 0x5c, 0x69, 0x90, 0x06, 0xd3,
464 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x48, 0x1b, 0x5c, 0x69, 0x90,
465 0x06, 0x60, 0x20, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xd2, 0x06,
466 0x57, 0x1a, 0xa4, 0x01, 0x15, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
467};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.spv.h b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.spv.h
new file mode 100644
index 0000000..1210023
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/texture_rgba.frag.spv.h
@@ -0,0 +1,50 @@
1static const unsigned char texture_rgba_frag_spv[] = {
2 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00,
3 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
4 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
5 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
6 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
7 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00,
8 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
9 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
10 0x10, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
11 0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
12 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00,
13 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
14 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15 0x47, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
16 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00,
17 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00,
18 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
19 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00,
20 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
21 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
22 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
23 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
24 0x03, 0x00, 0x00, 0x00, 0x19, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x00, 0x00,
25 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
26 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
27 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00,
28 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
29 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
30 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31 0x17, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
32 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00,
33 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
34 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
35 0x20, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
36 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
37 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00,
38 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00,
40 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
41 0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00,
42 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x57, 0x00, 0x05, 0x00,
43 0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
44 0x12, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
45 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
46 0x07, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
47 0x16, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00,
48 0x17, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
49};
50static const unsigned int texture_rgba_frag_spv_len = 564;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert
new file mode 100644
index 0000000..d9ad22e
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert
@@ -0,0 +1,17 @@
1#version 450
2
3layout(location = 0) in vec2 a_position;
4layout(location = 1) in vec4 a_color;
5
6layout(location = 0) out vec4 v_color;
7
8layout(set = 1, binding = 0) uniform Context {
9 mat4 mvp;
10 vec4 color; /* XXX unused */
11 vec2 texture_size; /* XXX unused */
12} u_context;
13
14void main() {
15 gl_Position = u_context.mvp * vec4(a_position, 0, 1);
16 v_color = a_color;
17}
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.metal.h b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.metal.h
new file mode 100644
index 0000000..b2993e5
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.metal.h
@@ -0,0 +1,48 @@
1static const unsigned char tri_color_vert_metal[] = {
2 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65,
3 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x0a,
4 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69,
5 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
6 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
7 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x0a,
8 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x0a, 0x7b,
9 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78,
10 0x34, 0x20, 0x5f, 0x6d, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
11 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x31, 0x3b, 0x0a, 0x20,
12 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x6d,
13 0x32, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63,
14 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x0a,
15 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34,
16 0x20, 0x6d, 0x5f, 0x33, 0x35, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72,
17 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20,
18 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, 0x6c,
19 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b,
20 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x5d, 0x3b, 0x0a,
21 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d,
22 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20,
23 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x5f, 0x32,
24 0x35, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
25 0x65, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
26 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6d, 0x5f, 0x33, 0x37, 0x20,
27 0x5b, 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28,
28 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x76, 0x65,
29 0x72, 0x74, 0x65, 0x78, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f,
30 0x75, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69,
31 0x6e, 0x30, 0x5f, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73,
32 0x74, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63,
33 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x26,
34 0x20, 0x5f, 0x32, 0x30, 0x20, 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65,
35 0x72, 0x28, 0x30, 0x29, 0x5d, 0x5d, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20,
36 0x20, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20,
37 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x0a, 0x20, 0x20,
38 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73,
39 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e,
40 0x5f, 0x6d, 0x30, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34,
41 0x28, 0x69, 0x6e, 0x2e, 0x6d, 0x5f, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e,
42 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20,
43 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x6d, 0x5f, 0x33, 0x35, 0x20, 0x3d, 0x20,
44 0x69, 0x6e, 0x2e, 0x6d, 0x5f, 0x33, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20,
45 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x3b,
46 0x0a, 0x7d, 0x0a, 0x0a
47};
48static const unsigned int tri_color_vert_metal_len = 532;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.sm50.dxbc.h b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.sm50.dxbc.h
new file mode 100644
index 0000000..0819d8a
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.sm50.dxbc.h
@@ -0,0 +1,178 @@
1static const signed char tri_color_vert_sm50_dxbc[] =
2{
3 68, 88, 66, 67, -99, -1,
4 -83, -50, 75, -96, -1, 28,
5-104, -33, 121, 1,-117, -87,
6 -7,-107, 1, 0, 0, 0,
7 20, 4, 0, 0, 5, 0,
8 0, 0, 52, 0, 0, 0,
9 -12, 1, 0, 0, 64, 2,
10 0, 0,-104, 2, 0, 0,
11 120, 3, 0, 0, 82, 68,
12 69, 70, -72, 1, 0, 0,
13 1, 0, 0, 0, 100, 0,
14 0, 0, 1, 0, 0, 0,
15 60, 0, 0, 0, 0, 5,
16 -2, -1, 0, 1, 0, 0,
17-112, 1, 0, 0, 82, 68,
18 49, 49, 60, 0, 0, 0,
19 24, 0, 0, 0, 32, 0,
20 0, 0, 40, 0, 0, 0,
21 36, 0, 0, 0, 12, 0,
22 0, 0, 0, 0, 0, 0,
23 92, 0, 0, 0, 0, 0,
24 0, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0,
27 1, 0, 0, 0, 1, 0,
28 0, 0, 95, 49, 56, 95,
29 50, 48, 0, -85, 92, 0,
30 0, 0, 3, 0, 0, 0,
31 124, 0, 0, 0, 96, 0,
32 0, 0, 0, 0, 0, 0,
33 0, 0, 0, 0, -12, 0,
34 0, 0, 0, 0, 0, 0,
35 64, 0, 0, 0, 2, 0,
36 0, 0, 4, 1, 0, 0,
37 0, 0, 0, 0, -1, -1,
38 -1, -1, 0, 0, 0, 0,
39 -1, -1, -1, -1, 0, 0,
40 0, 0, 40, 1, 0, 0,
41 64, 0, 0, 0, 16, 0,
42 0, 0, 0, 0, 0, 0,
43 56, 1, 0, 0, 0, 0,
44 0, 0, -1, -1, -1, -1,
45 0, 0, 0, 0, -1, -1,
46 -1, -1, 0, 0, 0, 0,
47 92, 1, 0, 0, 80, 0,
48 0, 0, 8, 0, 0, 0,
49 0, 0, 0, 0, 108, 1,
50 0, 0, 0, 0, 0, 0,
51 -1, -1, -1, -1, 0, 0,
52 0, 0, -1, -1, -1, -1,
53 0, 0, 0, 0, 95, 50,
54 48, 95, 109, 48, 0, 102,
55 108, 111, 97, 116, 52, 120,
56 52, 0, 2, 0, 3, 0,
57 4, 0, 4, 0, 0, 0,
58 0, 0, 0, 0, 0, 0,
59 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, -5, 0,
62 0, 0, 95, 50, 48, 95,
63 109, 49, 0, 102, 108, 111,
64 97, 116, 52, 0, -85, -85,
65 1, 0, 3, 0, 1, 0,
66 4, 0, 0, 0, 0, 0,
67 0, 0, 0, 0, 0, 0,
68 0, 0, 0, 0, 0, 0,
69 0, 0, 0, 0, 0, 0,
70 0, 0, 47, 1, 0, 0,
71 95, 50, 48, 95, 109, 50,
72 0, 102, 108, 111, 97, 116,
73 50, 0, -85, -85, 1, 0,
74 3, 0, 1, 0, 2, 0,
75 0, 0, 0, 0, 0, 0,
76 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0,
78 0, 0, 0, 0, 0, 0,
79 99, 1, 0, 0, 77, 105,
80 99, 114, 111, 115, 111, 102,
81 116, 32, 40, 82, 41, 32,
82 72, 76, 83, 76, 32, 83,
83 104, 97, 100, 101, 114, 32,
84 67, 111, 109, 112, 105, 108,
85 101, 114, 32, 49, 48, 46,
86 49, 0, 73, 83, 71, 78,
87 68, 0, 0, 0, 2, 0,
88 0, 0, 8, 0, 0, 0,
89 56, 0, 0, 0, 0, 0,
90 0, 0, 0, 0, 0, 0,
91 3, 0, 0, 0, 0, 0,
92 0, 0, 3, 3, 0, 0,
93 56, 0, 0, 0, 1, 0,
94 0, 0, 0, 0, 0, 0,
95 3, 0, 0, 0, 1, 0,
96 0, 0, 15, 15, 0, 0,
97 84, 69, 88, 67, 79, 79,
98 82, 68, 0, -85, -85, -85,
99 79, 83, 71, 78, 80, 0,
100 0, 0, 2, 0, 0, 0,
101 8, 0, 0, 0, 56, 0,
102 0, 0, 0, 0, 0, 0,
103 0, 0, 0, 0, 3, 0,
104 0, 0, 0, 0, 0, 0,
105 15, 0, 0, 0, 65, 0,
106 0, 0, 0, 0, 0, 0,
107 1, 0, 0, 0, 3, 0,
108 0, 0, 1, 0, 0, 0,
109 15, 0, 0, 0, 84, 69,
110 88, 67, 79, 79, 82, 68,
111 0, 83, 86, 95, 80, 111,
112 115, 105, 116, 105, 111, 110,
113 0, -85, -85, -85, 83, 72,
114 69, 88, -40, 0, 0, 0,
115 80, 0, 1, 0, 54, 0,
116 0, 0, 106, 8, 0, 1,
117 89, 0, 0, 4, 70,-114,
118 32, 0, 0, 0, 0, 0,
119 4, 0, 0, 0, 95, 0,
120 0, 3, 50, 16, 16, 0,
121 0, 0, 0, 0, 95, 0,
122 0, 3, -14, 16, 16, 0,
123 1, 0, 0, 0, 101, 0,
124 0, 3, -14, 32, 16, 0,
125 0, 0, 0, 0, 103, 0,
126 0, 4, -14, 32, 16, 0,
127 1, 0, 0, 0, 1, 0,
128 0, 0, 104, 0, 0, 2,
129 1, 0, 0, 0, 54, 0,
130 0, 5, -14, 32, 16, 0,
131 0, 0, 0, 0, 70, 30,
132 16, 0, 1, 0, 0, 0,
133 56, 0, 0, 8, -14, 0,
134 16, 0, 0, 0, 0, 0,
135 86, 21, 16, 0, 0, 0,
136 0, 0, 70,-114, 32, 0,
137 0, 0, 0, 0, 1, 0,
138 0, 0, 50, 0, 0, 10,
139 -14, 0, 16, 0, 0, 0,
140 0, 0, 6, 16, 16, 0,
141 0, 0, 0, 0, 70,-114,
142 32, 0, 0, 0, 0, 0,
143 0, 0, 0, 0, 70, 14,
144 16, 0, 0, 0, 0, 0,
145 0, 0, 0, 8, -14, 32,
146 16, 0, 1, 0, 0, 0,
147 70, 14, 16, 0, 0, 0,
148 0, 0, 70,-114, 32, 0,
149 0, 0, 0, 0, 3, 0,
150 0, 0, 62, 0, 0, 1,
151 83, 84, 65, 84,-108, 0,
152 0, 0, 5, 0, 0, 0,
153 1, 0, 0, 0, 0, 0,
154 0, 0, 4, 0, 0, 0,
155 3, 0, 0, 0, 0, 0,
156 0, 0, 0, 0, 0, 0,
157 1, 0, 0, 0, 0, 0,
158 0, 0, 0, 0, 0, 0,
159 0, 0, 0, 0, 0, 0,
160 0, 0, 0, 0, 0, 0,
161 0, 0, 0, 0, 0, 0,
162 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0,
164 0, 0, 0, 0, 0, 0,
165 1, 0, 0, 0, 0, 0,
166 0, 0, 0, 0, 0, 0,
167 0, 0, 0, 0, 0, 0,
168 0, 0, 0, 0, 0, 0,
169 0, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0,
171 0, 0, 0, 0, 0, 0,
172 0, 0, 0, 0, 0, 0,
173 0, 0, 0, 0, 0, 0,
174 0, 0, 0, 0, 0, 0,
175 0, 0, 0, 0, 0, 0,
176 0, 0, 0, 0, 0, 0
177
178};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.sm60.dxil.h b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.sm60.dxil.h
new file mode 100644
index 0000000..0bb9325
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.sm60.dxil.h
@@ -0,0 +1,515 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; TEXCOORD 0 xy 0 NONE float xy
8; TEXCOORD 1 xyzw 1 NONE float xyzw
9;
10;
11; Output signature:
12;
13; Name Index Mask Register SysValue Format Used
14; -------------------- ----- ------ -------- -------- ------- ------
15; TEXCOORD 0 xyzw 0 NONE float xyzw
16; SV_Position 0 xyzw 1 POS float xyzw
17;
18; shader hash: f13b1cc9b87e560da744659dd5d39dcb
19;
20; Pipeline Runtime Information:
21;
22; Vertex Shader
23; OutputPositionPresent=1
24;
25;
26; Input signature:
27;
28; Name Index InterpMode DynIdx
29; -------------------- ----- ---------------------- ------
30; TEXCOORD 0
31; TEXCOORD 1
32;
33; Output signature:
34;
35; Name Index InterpMode DynIdx
36; -------------------- ----- ---------------------- ------
37; TEXCOORD 0 linear
38; SV_Position 0 noperspective
39;
40; Buffer Definitions:
41;
42; cbuffer _18_20
43; {
44;
45; struct hostlayout._18_20
46; {
47;
48; row_major float4x4 _20_m0; ; Offset: 0
49; float4 _20_m1; ; Offset: 64
50; float2 _20_m2; ; Offset: 80
51;
52; } _18_20; ; Offset: 0 Size: 88
53;
54; }
55;
56;
57; Resource Bindings:
58;
59; Name Type Format Dim ID HLSL Bind Count
60; ------------------------------ ---------- ------- ----------- ------- -------------- ------
61; _18_20 cbuffer NA NA CB0 cb0,space1 1
62;
63;
64; ViewId state:
65;
66; Number of inputs: 8, outputs: 8
67; Outputs dependent on ViewId: { }
68; Inputs contributing to computation of Outputs:
69; output 0 depends on inputs: { 4 }
70; output 1 depends on inputs: { 5 }
71; output 2 depends on inputs: { 6 }
72; output 3 depends on inputs: { 7 }
73; output 4 depends on inputs: { 0, 1 }
74; output 5 depends on inputs: { 0, 1 }
75; output 6 depends on inputs: { 0, 1 }
76; output 7 depends on inputs: { 0, 1 }
77;
78target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
79target triple = "dxil-ms-dx"
80
81%dx.types.Handle = type { i8* }
82%dx.types.CBufRet.f32 = type { float, float, float, float }
83%hostlayout._18_20 = type { [4 x <4 x float>], <4 x float>, <2 x float> }
84
85define void @main() {
86 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
87 %2 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
88 %3 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
89 %4 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
90 %5 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
91 %6 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
92 %7 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
93 %8 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 0) ; CBufferLoadLegacy(handle,regIndex)
94 %9 = extractvalue %dx.types.CBufRet.f32 %8, 0
95 %10 = extractvalue %dx.types.CBufRet.f32 %8, 1
96 %11 = extractvalue %dx.types.CBufRet.f32 %8, 2
97 %12 = extractvalue %dx.types.CBufRet.f32 %8, 3
98 %13 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 1) ; CBufferLoadLegacy(handle,regIndex)
99 %14 = extractvalue %dx.types.CBufRet.f32 %13, 0
100 %15 = extractvalue %dx.types.CBufRet.f32 %13, 1
101 %16 = extractvalue %dx.types.CBufRet.f32 %13, 2
102 %17 = extractvalue %dx.types.CBufRet.f32 %13, 3
103 %18 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 3) ; CBufferLoadLegacy(handle,regIndex)
104 %19 = extractvalue %dx.types.CBufRet.f32 %18, 0
105 %20 = extractvalue %dx.types.CBufRet.f32 %18, 1
106 %21 = extractvalue %dx.types.CBufRet.f32 %18, 2
107 %22 = extractvalue %dx.types.CBufRet.f32 %18, 3
108 %23 = fmul fast float %9, %6
109 %24 = call float @dx.op.tertiary.f32(i32 46, float %7, float %14, float %23) ; FMad(a,b,c)
110 %25 = fadd fast float %19, %24
111 %26 = fmul fast float %10, %6
112 %27 = call float @dx.op.tertiary.f32(i32 46, float %7, float %15, float %26) ; FMad(a,b,c)
113 %28 = fadd fast float %27, %20
114 %29 = fmul fast float %11, %6
115 %30 = call float @dx.op.tertiary.f32(i32 46, float %7, float %16, float %29) ; FMad(a,b,c)
116 %31 = fadd fast float %30, %21
117 %32 = fmul fast float %12, %6
118 %33 = call float @dx.op.tertiary.f32(i32 46, float %7, float %17, float %32) ; FMad(a,b,c)
119 %34 = fadd fast float %33, %22
120 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %2) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
121 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %3) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
122 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %4) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
123 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %5) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
124 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 0, float %25) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
125 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 1, float %28) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
126 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 2, float %31) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
127 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 3, float %34) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
128 ret void
129}
130
131; Function Attrs: nounwind readnone
132declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
133
134; Function Attrs: nounwind
135declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
136
137; Function Attrs: nounwind readonly
138declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
139
140; Function Attrs: nounwind readnone
141declare float @dx.op.tertiary.f32(i32, float, float, float) #0
142
143; Function Attrs: nounwind readonly
144declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
145
146attributes #0 = { nounwind readnone }
147attributes #1 = { nounwind }
148attributes #2 = { nounwind readonly }
149
150!llvm.ident = !{!0}
151!dx.version = !{!1}
152!dx.valver = !{!2}
153!dx.shaderModel = !{!3}
154!dx.resources = !{!4}
155!dx.viewIdState = !{!7}
156!dx.entryPoints = !{!8}
157
158!0 = !{!"dxc(private) 1.8.0.4662 (416fab6b5)"}
159!1 = !{i32 1, i32 0}
160!2 = !{i32 1, i32 8}
161!3 = !{!"vs", i32 6, i32 0}
162!4 = !{null, null, !5, null}
163!5 = !{!6}
164!6 = !{i32 0, %hostlayout._18_20* undef, !"", i32 1, i32 0, i32 1, i32 88, null}
165!7 = !{[10 x i32] [i32 8, i32 8, i32 240, i32 240, i32 0, i32 0, i32 1, i32 2, i32 4, i32 8]}
166!8 = !{void ()* @main, !"main", !9, !4, null}
167!9 = !{!10, !17, null}
168!10 = !{!11, !14}
169!11 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !12, i8 0, i32 1, i8 2, i32 0, i8 0, !13}
170!12 = !{i32 0}
171!13 = !{i32 3, i32 3}
172!14 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !15, i8 0, i32 1, i8 4, i32 1, i8 0, !16}
173!15 = !{i32 1}
174!16 = !{i32 3, i32 15}
175!17 = !{!18, !19}
176!18 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !12, i8 2, i32 1, i8 4, i32 0, i8 0, !16}
177!19 = !{i32 1, !"SV_Position", i8 9, i8 3, !12, i8 4, i32 1, i8 4, i32 1, i8 0, !16}
178
179#endif
180
181static const unsigned char tri_color_vert_sm60_dxil[] = {
182 0x44, 0x58, 0x42, 0x43, 0xeb, 0x11, 0xa0, 0x76, 0xea, 0x69, 0xbc, 0x28,
183 0xcd, 0xbc, 0x0c, 0xab, 0x14, 0x5d, 0xfa, 0x53, 0x01, 0x00, 0x00, 0x00,
184 0x98, 0x0f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
185 0x4c, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00,
186 0x08, 0x02, 0x00, 0x00, 0x70, 0x08, 0x00, 0x00, 0x8c, 0x08, 0x00, 0x00,
187 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x54, 0x00, 0x00, 0x00,
189 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
193 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
194 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00,
196 0x4f, 0x53, 0x47, 0x31, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
197 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
199 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
201 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
202 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43,
203 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69,
204 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x50, 0x53, 0x56, 0x30,
205 0xf0, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
208 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
210 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
211 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
213 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x54, 0x45,
214 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f,
215 0x4f, 0x52, 0x44, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
216 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
217 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 0x01, 0x00, 0x42, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
219 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x44, 0x00, 0x03, 0x00, 0x00, 0x00,
220 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00,
221 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222 0x01, 0x01, 0x44, 0x03, 0x03, 0x04, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
223 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
225 0x08, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x60, 0x06, 0x00, 0x00,
226 0x60, 0x00, 0x01, 0x00, 0x98, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
227 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x06, 0x00, 0x00,
228 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x00,
229 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
230 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
231 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
232 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14,
233 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20,
234 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
235 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
236 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
237 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
238 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
239 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
240 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
241 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
242 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84,
243 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c,
244 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x6c, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66,
245 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14,
246 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f,
247 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6,
248 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42,
249 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42,
250 0xad, 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4,
251 0x10, 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x61,
252 0x04, 0x61, 0xb8, 0xe8, 0x70, 0xa4, 0x69, 0x01, 0x30, 0x87, 0x9a, 0xfc,
253 0xbf, 0xe6, 0x7f, 0x9b, 0x46, 0x83, 0xad, 0x97, 0x70, 0x2a, 0x10, 0x00,
254 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79,
255 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e,
256 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
257 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07,
258 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
259 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07,
260 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07,
261 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07,
262 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
263 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
264 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07,
265 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00,
267 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20,
268 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34,
269 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4,
270 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
271 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
272 0x40, 0x16, 0x08, 0x00, 0x13, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
273 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
274 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x1b, 0x50, 0x04, 0x85, 0x50, 0x06,
275 0xe5, 0x50, 0x12, 0x05, 0x18, 0x50, 0x1a, 0x05, 0x1a, 0x50, 0x1e, 0x05,
276 0x51, 0x56, 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08, 0x0a, 0xa1, 0x0c, 0x28,
277 0xd6, 0x00, 0xe1, 0x19, 0x00, 0xca, 0x33, 0x00, 0xa4, 0xc7, 0x52, 0x10,
278 0x04, 0x3e, 0xe0, 0x03, 0x00, 0x02, 0x81, 0x40, 0x00, 0x00, 0x00, 0x00,
279 0x79, 0x18, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90,
280 0x46, 0x02, 0x13, 0xc4, 0x31, 0x20, 0xc3, 0x1b, 0x43, 0x81, 0x93, 0x4b,
281 0xb3, 0x0b, 0xa3, 0x2b, 0x4b, 0x01, 0x89, 0x71, 0xc1, 0x71, 0x81, 0x71,
282 0xa1, 0xb1, 0xb1, 0x91, 0x01, 0x41, 0xa1, 0x89, 0xb1, 0x31, 0x0b, 0x13,
283 0xb3, 0x11, 0xab, 0x49, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20,
284 0x10, 0xc7, 0x06, 0x61, 0x20, 0x36, 0x08, 0x04, 0x41, 0xc1, 0x6e, 0x6e,
285 0x82, 0x40, 0x20, 0x1b, 0x86, 0x03, 0x21, 0x26, 0x08, 0x19, 0x47, 0xe3,
286 0x2b, 0x06, 0xe7, 0x4b, 0x06, 0x66, 0x82, 0x40, 0x24, 0x1b, 0x10, 0x42,
287 0x59, 0x06, 0x62, 0x60, 0x80, 0x0d, 0x41, 0xb3, 0x81, 0x00, 0x00, 0x07,
288 0x98, 0x20, 0x60, 0x1b, 0x8d, 0x2f, 0x19, 0x98, 0xaf, 0x36, 0x98, 0x09,
289 0x02, 0xa1, 0x4c, 0x10, 0x88, 0x65, 0xc3, 0x30, 0x4d, 0xc3, 0x04, 0x81,
290 0x60, 0x26, 0x08, 0x44, 0x33, 0x41, 0x20, 0x9c, 0x09, 0x42, 0xa4, 0x6d,
291 0x50, 0x90, 0x48, 0xa2, 0x2a, 0xc2, 0xba, 0x2e, 0x8c, 0xc6, 0x97, 0x0c,
292 0xcc, 0x57, 0x5b, 0xcc, 0x04, 0x81, 0x78, 0x26, 0x08, 0x04, 0xb4, 0x01,
293 0x41, 0xb4, 0x6a, 0xb3, 0x2e, 0x6e, 0xa2, 0xf1, 0x25, 0x03, 0xf3, 0xd5,
294 0x26, 0x33, 0x41, 0x20, 0xa2, 0x0d, 0x08, 0xe2, 0x55, 0x9f, 0x75, 0x71,
295 0xd2, 0x06, 0x82, 0xc9, 0x3a, 0x30, 0xd8, 0x30, 0x10, 0x50, 0x18, 0x4c,
296 0x10, 0x04, 0x60, 0x03, 0xb0, 0x61, 0x20, 0xc8, 0x80, 0x0c, 0x36, 0x04,
297 0x65, 0xb0, 0x61, 0x18, 0xc6, 0xc0, 0x0c, 0x26, 0x08, 0x5a, 0xb7, 0x21,
298 0x40, 0x03, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x44, 0xa8, 0x8a, 0xb0, 0x86,
299 0x9e, 0x9e, 0xa4, 0x88, 0x26, 0x08, 0x45, 0x35, 0x41, 0x28, 0xac, 0x0d,
300 0x01, 0x31, 0x41, 0x28, 0xae, 0x0d, 0x42, 0x55, 0x6d, 0x58, 0x88, 0x35,
301 0x60, 0x83, 0x36, 0x70, 0x83, 0x36, 0x18, 0xde, 0x80, 0x68, 0x03, 0x38,
302 0xd8, 0x10, 0x0c, 0x13, 0x84, 0x02, 0x9b, 0x20, 0x10, 0xd2, 0x06, 0xa1,
303 0xa2, 0x83, 0x0d, 0xcb, 0xb0, 0x06, 0x6c, 0xd0, 0x06, 0x72, 0xd0, 0x06,
304 0xc3, 0x1c, 0x0c, 0x6d, 0x50, 0x07, 0x1b, 0x84, 0x38, 0xb0, 0x83, 0x0d,
305 0x0b, 0xb1, 0x06, 0x6c, 0xd0, 0x06, 0x6e, 0xf0, 0x06, 0xc3, 0x1c, 0x10,
306 0x6d, 0x50, 0x07, 0x5c, 0xa6, 0xac, 0xbe, 0xa0, 0xde, 0xe6, 0xd2, 0xe8,
307 0xd2, 0xde, 0xdc, 0x26, 0x08, 0x45, 0xb6, 0x61, 0x19, 0xf2, 0x80, 0x0d,
308 0xf4, 0xc0, 0x0d, 0xe6, 0x60, 0x98, 0x83, 0xa1, 0x0d, 0xea, 0x60, 0x83,
309 0x80, 0x07, 0x7b, 0xb0, 0x61, 0xb8, 0x03, 0x3e, 0x00, 0x36, 0x14, 0x63,
310 0xa0, 0x06, 0x7d, 0xf0, 0x00, 0x34, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0xe6,
311 0x26, 0x08, 0xc4, 0xc4, 0x22, 0xcd, 0x6d, 0x8e, 0x6e, 0x6e, 0x82, 0x40,
312 0x50, 0x34, 0xe6, 0xd2, 0xce, 0xbe, 0xd8, 0xc8, 0x68, 0xcc, 0xa5, 0x9d,
313 0x7d, 0xcd, 0xd1, 0x6d, 0x40, 0xfe, 0x00, 0x14, 0x42, 0x41, 0x14, 0x46,
314 0x01, 0x21, 0x05, 0x50, 0xa8, 0xc2, 0xc6, 0x66, 0xd7, 0xe6, 0x92, 0x46,
315 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08, 0xaa, 0x90, 0xe1, 0xb9, 0xd8, 0x95,
316 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d, 0x09, 0x88, 0x26, 0x64, 0x78, 0x2e,
317 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x82, 0xa2, 0x0e, 0x19, 0x9e,
318 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99, 0x5c, 0xd3, 0x1b, 0x59, 0x19, 0xdb,
319 0x94, 0x00, 0x29, 0x43, 0x86, 0xe7, 0x22, 0x57, 0x36, 0xf7, 0x56, 0x27,
320 0x37, 0x56, 0x36, 0x37, 0x25, 0x70, 0x2a, 0x91, 0xe1, 0xb9, 0xd0, 0xe5,
321 0xc1, 0x95, 0x05, 0xb9, 0xb9, 0xbd, 0xd1, 0x85, 0xd1, 0xa5, 0xbd, 0xb9,
322 0xcd, 0x4d, 0x11, 0xc2, 0xc0, 0x0c, 0xea, 0x90, 0xe1, 0xb9, 0xd8, 0xa5,
323 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1, 0x85, 0xd1, 0x95, 0x4d, 0x09, 0xd0,
324 0xa0, 0x0e, 0x19, 0x9e, 0x4b, 0x99, 0x1b, 0x9d, 0x5c, 0x1e, 0xd4, 0x5b,
325 0x9a, 0x1b, 0xdd, 0xdc, 0x94, 0xa0, 0x0f, 0xba, 0x90, 0xe1, 0xb9, 0x8c,
326 0xbd, 0xd5, 0xb9, 0xd1, 0x95, 0xc9, 0xcd, 0x4d, 0x09, 0x48, 0x01, 0x00,
327 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
328 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
329 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
330 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
331 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
332 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
333 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
334 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
335 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
336 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
337 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
338 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
339 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
340 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
341 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
342 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
343 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
344 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
345 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
346 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
347 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
348 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
349 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
350 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
351 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
352 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
353 0x71, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97,
354 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25,
355 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce,
356 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0,
357 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93,
358 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e,
359 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3,
360 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7,
361 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0xf1, 0x3b, 0x1c, 0xc9, 0xb8, 0x7e, 0x56, 0x0d, 0xa7, 0x44, 0x65, 0x9d,
364 0xd5, 0xd3, 0x9d, 0xcb, 0x44, 0x58, 0x49, 0x4c, 0x04, 0x07, 0x00, 0x00,
365 0x60, 0x00, 0x01, 0x00, 0xc1, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
366 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00,
367 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xb8, 0x01, 0x00, 0x00,
368 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
369 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
370 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
371 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14,
372 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20,
373 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
374 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
375 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
376 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
377 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
378 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
379 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
380 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
381 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84,
382 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c,
383 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x6c, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66,
384 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14,
385 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f,
386 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6,
387 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42,
388 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42,
389 0xad, 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4,
390 0x10, 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x61,
391 0x04, 0x61, 0xb8, 0xe8, 0x70, 0xa4, 0x69, 0x01, 0x30, 0x87, 0x9a, 0xfc,
392 0xbf, 0xe6, 0x7f, 0x9b, 0x46, 0x83, 0xad, 0x97, 0x70, 0x2a, 0x10, 0x00,
393 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79,
394 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e,
395 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
396 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07,
397 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
398 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07,
399 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07,
400 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07,
401 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
402 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
403 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07,
404 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00,
406 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20,
407 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34,
408 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4,
409 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
410 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x40, 0x16, 0x08, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
412 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
413 0x25, 0x30, 0x02, 0x50, 0x10, 0xc5, 0x50, 0xb0, 0x01, 0x65, 0x50, 0x1e,
414 0x54, 0x4a, 0x62, 0x04, 0xa0, 0x08, 0x0a, 0xa1, 0x0c, 0x28, 0xcf, 0x00,
415 0x90, 0x1e, 0x4b, 0x41, 0x10, 0xf8, 0x80, 0x0f, 0x00, 0x08, 0x04, 0x02,
416 0x01, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
417 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x31, 0x20, 0xc3, 0x1b,
418 0x43, 0x81, 0x93, 0x4b, 0xb3, 0x0b, 0xa3, 0x2b, 0x4b, 0x01, 0x89, 0x71,
419 0xc1, 0x71, 0x81, 0x71, 0xa1, 0xb1, 0xb1, 0x91, 0x01, 0x41, 0xa1, 0x89,
420 0xb1, 0x31, 0x0b, 0x13, 0xb3, 0x11, 0xab, 0x49, 0xd9, 0x10, 0x04, 0x13,
421 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x20, 0x26, 0x08, 0x04,
422 0xb2, 0x41, 0x18, 0x0c, 0x0a, 0x76, 0x73, 0x13, 0x04, 0x22, 0xd9, 0x30,
423 0x20, 0x09, 0x31, 0x41, 0xc8, 0x24, 0x02, 0x13, 0x04, 0x42, 0xd9, 0x80,
424 0x10, 0x0b, 0x33, 0x10, 0x43, 0x03, 0x6c, 0x08, 0x9c, 0x0d, 0x04, 0x00,
425 0x3c, 0xc0, 0x04, 0x41, 0x9b, 0x36, 0x04, 0xd1, 0x04, 0x41, 0x00, 0x48,
426 0xb4, 0x85, 0xa5, 0xb9, 0x11, 0xa1, 0x2a, 0xc2, 0x1a, 0x7a, 0x7a, 0x92,
427 0x22, 0x9a, 0x20, 0x14, 0xcd, 0x04, 0xa1, 0x70, 0x36, 0x04, 0xc4, 0x04,
428 0xa1, 0x78, 0x26, 0x08, 0xc4, 0xb2, 0x41, 0xd0, 0xb4, 0x0d, 0x0b, 0x51,
429 0x59, 0x17, 0x76, 0x0d, 0x19, 0x71, 0x6d, 0x1b, 0x82, 0x61, 0x82, 0x50,
430 0x40, 0x13, 0x04, 0x82, 0xd9, 0x20, 0x68, 0xdf, 0x86, 0x65, 0xa8, 0xac,
431 0xab, 0xbb, 0x06, 0x6f, 0xb8, 0xc0, 0x60, 0x83, 0xc0, 0x85, 0xc1, 0x86,
432 0x85, 0xa8, 0xac, 0x0b, 0xcb, 0x06, 0x8f, 0xb8, 0xc0, 0x80, 0xcb, 0x94,
433 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x04, 0xa1,
434 0x88, 0x36, 0x2c, 0x03, 0x19, 0x58, 0x65, 0x80, 0x79, 0x83, 0x37, 0x5c,
435 0x60, 0xb0, 0x41, 0x18, 0x03, 0x33, 0xd8, 0x30, 0x88, 0xc1, 0x19, 0x00,
436 0x1b, 0x8a, 0x89, 0x42, 0x03, 0x08, 0xa8, 0xc2, 0xc6, 0x66, 0xd7, 0xe6,
437 0x92, 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08, 0xaa, 0x90, 0xe1, 0xb9,
438 0xd8, 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d, 0x09, 0x88, 0x26, 0x64,
439 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x02, 0xa3, 0x0e,
440 0x19, 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99, 0x5c, 0xd3, 0x1b, 0x59,
441 0x19, 0xdb, 0x94, 0x20, 0x29, 0x43, 0x86, 0xe7, 0x22, 0x57, 0x36, 0xf7,
442 0x56, 0x27, 0x37, 0x56, 0x36, 0x37, 0x25, 0x78, 0xea, 0x90, 0xe1, 0xb9,
443 0xd8, 0xa5, 0x95, 0xdd, 0x25, 0x91, 0x4d, 0xd1, 0x85, 0xd1, 0x95, 0x4d,
444 0x09, 0xa2, 0x3a, 0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50,
445 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x53, 0x02, 0x34, 0x00, 0x00, 0x00, 0x00,
446 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
447 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
448 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
449 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
450 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
451 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
452 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
453 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
454 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
455 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
456 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
457 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
458 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
459 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
460 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
461 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
462 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
463 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
464 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
465 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
466 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
467 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
468 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
469 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
470 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
471 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
472 0x71, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97,
473 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25,
474 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce,
475 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0,
476 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93,
477 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e,
478 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3,
479 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7,
480 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
481 0x63, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
482 0x05, 0x00, 0x00, 0x00, 0x44, 0x4a, 0xa1, 0x10, 0x66, 0x00, 0x8a, 0xab,
483 0xec, 0x4a, 0x8e, 0x4a, 0x09, 0x50, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00,
484 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x20, 0x5d, 0x43, 0x53, 0x55, 0xc1,
485 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x1c, 0x72, 0x59, 0xcf, 0x31,
486 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x97, 0x60, 0x17, 0x81, 0x8c,
487 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xe1, 0x29, 0x19, 0x06, 0x25, 0x23,
488 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x7c, 0x8b, 0x96, 0x3d, 0xca, 0x88,
489 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x60, 0xc0, 0x68, 0xda, 0xb4, 0x8c,
490 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0x11, 0x06, 0xcd, 0xb6, 0x21, 0xcc,
491 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0x60, 0xb0, 0x1c, 0xdc, 0x68,
492 0x42, 0x00, 0x8c, 0x26, 0x08, 0xc1, 0x68, 0xc2, 0x20, 0x8c, 0x26, 0x10,
493 0xc3, 0x88, 0xc1, 0x01, 0x80, 0x20, 0x18, 0x34, 0x65, 0x00, 0x31, 0x62,
494 0x30, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3,
495 0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x8d, 0x1a, 0x54,
496 0x91, 0x18, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c,
497 0xc2, 0x68, 0x02, 0x31, 0x98, 0x13, 0xc9, 0x67, 0xc4, 0x00, 0x01, 0x40,
498 0x10, 0x0c, 0x9e, 0x37, 0xe0, 0x22, 0x25, 0x30, 0x23, 0x80, 0x8e, 0x41,
499 0x94, 0x7c, 0x46, 0x0c, 0x10, 0x00, 0x04, 0xc1, 0xe0, 0x91, 0x83, 0x8f,
500 0x62, 0x02, 0x0b, 0x10, 0xe8, 0x98, 0x74, 0xc9, 0x67, 0xc4, 0x00, 0x01,
501 0x40, 0x10, 0x0c, 0x9e, 0x3a, 0x10, 0x83, 0xcb, 0x09, 0x2c, 0x50, 0xa0,
502 0x63, 0x94, 0x26, 0x9f, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0xf0,
503 0xa0, 0x0c, 0x34, 0x28, 0xb0, 0x80, 0x81, 0xce, 0x88, 0x41, 0x02, 0x80,
504 0x20, 0x18, 0x20, 0x7c, 0xa0, 0x06, 0x77, 0x70, 0x07, 0x70, 0x10, 0x06,
505 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0xf0, 0x81, 0x1a, 0xdc, 0xc1,
506 0x1d, 0x90, 0x01, 0x18, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xc2,
507 0x07, 0x6a, 0x70, 0x07, 0x77, 0xf0, 0x06, 0xdf, 0x88, 0x41, 0x02, 0x80,
508 0x20, 0x18, 0x20, 0x7c, 0xa0, 0x06, 0x77, 0x70, 0x07, 0x6d, 0xe0, 0x8d,
509 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0xc2, 0x07, 0x6a, 0x80, 0x07, 0x77,
510 0x00, 0x07, 0xca, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x7c, 0xa0,
511 0x06, 0x78, 0x70, 0x07, 0x64, 0x70, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82,
512 0x01, 0xc2, 0x07, 0x6a, 0x80, 0x07, 0x77, 0xf0, 0x06, 0xc4, 0x88, 0x41,
513 0x02, 0x80, 0x20, 0x18, 0x20, 0x7c, 0xa0, 0x06, 0x78, 0x70, 0x07, 0x6d,
514 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
515};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.spv.h b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.spv.h
new file mode 100644
index 0000000..6570ab4
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_color.vert.spv.h
@@ -0,0 +1,89 @@
1static const unsigned char tri_color_vert_spv[] = {
2 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00,
3 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
4 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
5 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
6 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
7 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
9 0x0d, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
10 0x25, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00,
11 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
13 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
14 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
15 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00,
16 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
17 0x47, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
18 0x48, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, 0x00,
20 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x48, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22 0x07, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
23 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
24 0x40, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, 0x00,
25 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
26 0x47, 0x00, 0x03, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
27 0x47, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
28 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
29 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
30 0x19, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31 0x47, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
32 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x25, 0x00, 0x00, 0x00,
33 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00,
34 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
35 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00,
36 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
37 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00,
38 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 0x2b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
40 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
41 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x06, 0x00,
42 0x0b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
43 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
44 0x0c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
45 0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
46 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00,
47 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
48 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x18, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
50 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00,
51 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x05, 0x00,
52 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
53 0x11, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
54 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
55 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
56 0x20, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
57 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00,
58 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
59 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
60 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
62 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x20, 0x00, 0x04, 0x00,
63 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
64 0x3b, 0x00, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
65 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x24, 0x00, 0x00, 0x00,
66 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
67 0x24, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
68 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
69 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
70 0x05, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00,
71 0x16, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
72 0x3d, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
73 0x16, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00,
74 0x1a, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
75 0x06, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
76 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00,
77 0x1e, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
78 0x50, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
79 0x1d, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
80 0x1c, 0x00, 0x00, 0x00, 0x91, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
81 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
82 0x41, 0x00, 0x05, 0x00, 0x21, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
83 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
84 0x22, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
85 0x07, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
86 0x3e, 0x00, 0x03, 0x00, 0x23, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
87 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
88};
89static const unsigned int tri_color_vert_spv_len = 1028;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert
new file mode 100644
index 0000000..bdf4366
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert
@@ -0,0 +1,20 @@
1#version 450
2
3layout(location = 0) in vec2 a_position;
4layout(location = 1) in vec4 a_color;
5layout(location = 2) in vec2 a_uv;
6
7layout(location = 0) out vec4 v_color;
8layout(location = 1) out vec2 v_uv;
9
10layout(set = 1, binding = 0) uniform Context {
11 mat4 mvp;
12 vec4 color; /* XXX unused */
13 vec2 texture_size;
14} u_context;
15
16void main() {
17 gl_Position = u_context.mvp * vec4(a_position, 0, 1);
18 v_color = a_color;
19 v_uv = a_uv / u_context.texture_size;
20}
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.metal.h b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.metal.h
new file mode 100644
index 0000000..a5019fc
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.metal.h
@@ -0,0 +1,56 @@
1static const unsigned char tri_texture_vert_metal[] = {
2 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x6d, 0x65,
3 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x64, 0x6c, 0x69, 0x62, 0x3e, 0x0a,
4 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x69,
5 0x6d, 0x64, 0x2f, 0x73, 0x69, 0x6d, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x0a,
6 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70,
7 0x61, 0x63, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x3b, 0x0a, 0x0a,
8 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x0a, 0x7b,
9 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78,
10 0x34, 0x20, 0x5f, 0x6d, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
11 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x5f, 0x6d, 0x31, 0x3b, 0x0a, 0x20,
12 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x5f, 0x6d,
13 0x32, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63,
14 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x0a,
15 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34,
16 0x20, 0x6d, 0x5f, 0x33, 0x35, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72,
17 0x28, 0x6c, 0x6f, 0x63, 0x6e, 0x30, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20,
18 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x5f,
19 0x34, 0x30, 0x20, 0x5b, 0x5b, 0x75, 0x73, 0x65, 0x72, 0x28, 0x6c, 0x6f,
20 0x63, 0x6e, 0x31, 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20,
21 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f,
22 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5b, 0x5b, 0x70, 0x6f, 0x73,
23 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x5d, 0x3b, 0x0a, 0x7d, 0x3b, 0x0a,
24 0x0a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e,
25 0x30, 0x5f, 0x69, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
26 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x5f, 0x32, 0x35, 0x20, 0x5b,
27 0x5b, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x30,
28 0x29, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f,
29 0x61, 0x74, 0x34, 0x20, 0x6d, 0x5f, 0x33, 0x37, 0x20, 0x5b, 0x5b, 0x61,
30 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x31, 0x29, 0x5d,
31 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
32 0x32, 0x20, 0x6d, 0x5f, 0x34, 0x31, 0x20, 0x5b, 0x5b, 0x61, 0x74, 0x74,
33 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x32, 0x29, 0x5d, 0x5d, 0x3b,
34 0x0a, 0x7d, 0x3b, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20,
35 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x61,
36 0x69, 0x6e, 0x30, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x30, 0x5f, 0x69, 0x6e,
37 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x5b, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f,
38 0x69, 0x6e, 0x5d, 0x5d, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61,
39 0x6e, 0x74, 0x20, 0x5f, 0x31, 0x38, 0x26, 0x20, 0x5f, 0x32, 0x30, 0x20,
40 0x5b, 0x5b, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x30, 0x29, 0x5d,
41 0x5d, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x69,
42 0x6e, 0x30, 0x5f, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d,
43 0x20, 0x7b, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74,
44 0x2e, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
45 0x20, 0x3d, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x5f, 0x6d, 0x30, 0x20, 0x2a,
46 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x69, 0x6e, 0x2e, 0x6d,
47 0x5f, 0x32, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e,
48 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e,
49 0x6d, 0x5f, 0x33, 0x35, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x5f,
50 0x33, 0x37, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e,
51 0x6d, 0x5f, 0x34, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x2e, 0x6d, 0x5f,
52 0x34, 0x31, 0x20, 0x2f, 0x20, 0x5f, 0x32, 0x30, 0x2e, 0x5f, 0x6d, 0x32,
53 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,
54 0x20, 0x6f, 0x75, 0x74, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a
55};
56static const unsigned int tri_texture_vert_metal_len = 633;
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.sm50.dxbc.h b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.sm50.dxbc.h
new file mode 100644
index 0000000..f34d45d
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.sm50.dxbc.h
@@ -0,0 +1,195 @@
1static const signed char tri_texture_vert_sm50_dxbc[] =
2{
3 68, 88, 66, 67, 108, 113,
4-108, 81, -2, 27, 41, 94,
5 -47, 10, -97, -76, -86, -88,
6 -2, 29, 1, 0, 0, 0,
7 124, 4, 0, 0, 5, 0,
8 0, 0, 52, 0, 0, 0,
9 -12, 1, 0, 0, 88, 2,
10 0, 0, -56, 2, 0, 0,
11 -32, 3, 0, 0, 82, 68,
12 69, 70, -72, 1, 0, 0,
13 1, 0, 0, 0, 100, 0,
14 0, 0, 1, 0, 0, 0,
15 60, 0, 0, 0, 0, 5,
16 -2, -1, 0, 1, 0, 0,
17-112, 1, 0, 0, 82, 68,
18 49, 49, 60, 0, 0, 0,
19 24, 0, 0, 0, 32, 0,
20 0, 0, 40, 0, 0, 0,
21 36, 0, 0, 0, 12, 0,
22 0, 0, 0, 0, 0, 0,
23 92, 0, 0, 0, 0, 0,
24 0, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0,
27 1, 0, 0, 0, 1, 0,
28 0, 0, 95, 49, 56, 95,
29 50, 48, 0, -85, 92, 0,
30 0, 0, 3, 0, 0, 0,
31 124, 0, 0, 0, 96, 0,
32 0, 0, 0, 0, 0, 0,
33 0, 0, 0, 0, -12, 0,
34 0, 0, 0, 0, 0, 0,
35 64, 0, 0, 0, 2, 0,
36 0, 0, 4, 1, 0, 0,
37 0, 0, 0, 0, -1, -1,
38 -1, -1, 0, 0, 0, 0,
39 -1, -1, -1, -1, 0, 0,
40 0, 0, 40, 1, 0, 0,
41 64, 0, 0, 0, 16, 0,
42 0, 0, 0, 0, 0, 0,
43 56, 1, 0, 0, 0, 0,
44 0, 0, -1, -1, -1, -1,
45 0, 0, 0, 0, -1, -1,
46 -1, -1, 0, 0, 0, 0,
47 92, 1, 0, 0, 80, 0,
48 0, 0, 8, 0, 0, 0,
49 2, 0, 0, 0, 108, 1,
50 0, 0, 0, 0, 0, 0,
51 -1, -1, -1, -1, 0, 0,
52 0, 0, -1, -1, -1, -1,
53 0, 0, 0, 0, 95, 50,
54 48, 95, 109, 48, 0, 102,
55 108, 111, 97, 116, 52, 120,
56 52, 0, 2, 0, 3, 0,
57 4, 0, 4, 0, 0, 0,
58 0, 0, 0, 0, 0, 0,
59 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, -5, 0,
62 0, 0, 95, 50, 48, 95,
63 109, 49, 0, 102, 108, 111,
64 97, 116, 52, 0, -85, -85,
65 1, 0, 3, 0, 1, 0,
66 4, 0, 0, 0, 0, 0,
67 0, 0, 0, 0, 0, 0,
68 0, 0, 0, 0, 0, 0,
69 0, 0, 0, 0, 0, 0,
70 0, 0, 47, 1, 0, 0,
71 95, 50, 48, 95, 109, 50,
72 0, 102, 108, 111, 97, 116,
73 50, 0, -85, -85, 1, 0,
74 3, 0, 1, 0, 2, 0,
75 0, 0, 0, 0, 0, 0,
76 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0,
78 0, 0, 0, 0, 0, 0,
79 99, 1, 0, 0, 77, 105,
80 99, 114, 111, 115, 111, 102,
81 116, 32, 40, 82, 41, 32,
82 72, 76, 83, 76, 32, 83,
83 104, 97, 100, 101, 114, 32,
84 67, 111, 109, 112, 105, 108,
85 101, 114, 32, 49, 48, 46,
86 49, 0, 73, 83, 71, 78,
87 92, 0, 0, 0, 3, 0,
88 0, 0, 8, 0, 0, 0,
89 80, 0, 0, 0, 0, 0,
90 0, 0, 0, 0, 0, 0,
91 3, 0, 0, 0, 0, 0,
92 0, 0, 3, 3, 0, 0,
93 80, 0, 0, 0, 1, 0,
94 0, 0, 0, 0, 0, 0,
95 3, 0, 0, 0, 1, 0,
96 0, 0, 15, 15, 0, 0,
97 80, 0, 0, 0, 2, 0,
98 0, 0, 0, 0, 0, 0,
99 3, 0, 0, 0, 2, 0,
100 0, 0, 3, 3, 0, 0,
101 84, 69, 88, 67, 79, 79,
102 82, 68, 0, -85, -85, -85,
103 79, 83, 71, 78, 104, 0,
104 0, 0, 3, 0, 0, 0,
105 8, 0, 0, 0, 80, 0,
106 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 3, 0,
108 0, 0, 0, 0, 0, 0,
109 15, 0, 0, 0, 80, 0,
110 0, 0, 1, 0, 0, 0,
111 0, 0, 0, 0, 3, 0,
112 0, 0, 1, 0, 0, 0,
113 3, 12, 0, 0, 89, 0,
114 0, 0, 0, 0, 0, 0,
115 1, 0, 0, 0, 3, 0,
116 0, 0, 2, 0, 0, 0,
117 15, 0, 0, 0, 84, 69,
118 88, 67, 79, 79, 82, 68,
119 0, 83, 86, 95, 80, 111,
120 115, 105, 116, 105, 111, 110,
121 0, -85, -85, -85, 83, 72,
122 69, 88, 16, 1, 0, 0,
123 80, 0, 1, 0, 68, 0,
124 0, 0, 106, 8, 0, 1,
125 89, 0, 0, 4, 70,-114,
126 32, 0, 0, 0, 0, 0,
127 6, 0, 0, 0, 95, 0,
128 0, 3, 50, 16, 16, 0,
129 0, 0, 0, 0, 95, 0,
130 0, 3, -14, 16, 16, 0,
131 1, 0, 0, 0, 95, 0,
132 0, 3, 50, 16, 16, 0,
133 2, 0, 0, 0, 101, 0,
134 0, 3, -14, 32, 16, 0,
135 0, 0, 0, 0, 101, 0,
136 0, 3, 50, 32, 16, 0,
137 1, 0, 0, 0, 103, 0,
138 0, 4, -14, 32, 16, 0,
139 2, 0, 0, 0, 1, 0,
140 0, 0, 104, 0, 0, 2,
141 1, 0, 0, 0, 54, 0,
142 0, 5, -14, 32, 16, 0,
143 0, 0, 0, 0, 70, 30,
144 16, 0, 1, 0, 0, 0,
145 14, 0, 0, 8, 50, 32,
146 16, 0, 1, 0, 0, 0,
147 70, 16, 16, 0, 2, 0,
148 0, 0, 70,-128, 32, 0,
149 0, 0, 0, 0, 5, 0,
150 0, 0, 56, 0, 0, 8,
151 -14, 0, 16, 0, 0, 0,
152 0, 0, 86, 21, 16, 0,
153 0, 0, 0, 0, 70,-114,
154 32, 0, 0, 0, 0, 0,
155 1, 0, 0, 0, 50, 0,
156 0, 10, -14, 0, 16, 0,
157 0, 0, 0, 0, 6, 16,
158 16, 0, 0, 0, 0, 0,
159 70,-114, 32, 0, 0, 0,
160 0, 0, 0, 0, 0, 0,
161 70, 14, 16, 0, 0, 0,
162 0, 0, 0, 0, 0, 8,
163 -14, 32, 16, 0, 2, 0,
164 0, 0, 70, 14, 16, 0,
165 0, 0, 0, 0, 70,-114,
166 32, 0, 0, 0, 0, 0,
167 3, 0, 0, 0, 62, 0,
168 0, 1, 83, 84, 65, 84,
169-108, 0, 0, 0, 6, 0,
170 0, 0, 1, 0, 0, 0,
171 0, 0, 0, 0, 6, 0,
172 0, 0, 4, 0, 0, 0,
173 0, 0, 0, 0, 0, 0,
174 0, 0, 1, 0, 0, 0,
175 0, 0, 0, 0, 0, 0,
176 0, 0, 0, 0, 0, 0,
177 0, 0, 0, 0, 0, 0,
178 0, 0, 0, 0, 0, 0,
179 0, 0, 0, 0, 0, 0,
180 0, 0, 0, 0, 0, 0,
181 0, 0, 0, 0, 0, 0,
182 0, 0, 1, 0, 0, 0,
183 0, 0, 0, 0, 0, 0,
184 0, 0, 0, 0, 0, 0,
185 0, 0, 0, 0, 0, 0,
186 0, 0, 0, 0, 0, 0,
187 0, 0, 0, 0, 0, 0,
188 0, 0, 0, 0, 0, 0,
189 0, 0, 0, 0, 0, 0,
190 0, 0, 0, 0, 0, 0,
191 0, 0, 0, 0, 0, 0,
192 0, 0, 0, 0, 0, 0,
193 0, 0, 0, 0, 0, 0,
194 0, 0
195};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.sm60.dxil.h b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.sm60.dxil.h
new file mode 100644
index 0000000..4324106
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.sm60.dxil.h
@@ -0,0 +1,558 @@
1#if 0
2;
3; Input signature:
4;
5; Name Index Mask Register SysValue Format Used
6; -------------------- ----- ------ -------- -------- ------- ------
7; TEXCOORD 0 xy 0 NONE float xy
8; TEXCOORD 1 xyzw 1 NONE float xyzw
9; TEXCOORD 2 xy 2 NONE float xy
10;
11;
12; Output signature:
13;
14; Name Index Mask Register SysValue Format Used
15; -------------------- ----- ------ -------- -------- ------- ------
16; TEXCOORD 0 xyzw 0 NONE float xyzw
17; TEXCOORD 1 xy 1 NONE float xy
18; SV_Position 0 xyzw 2 POS float xyzw
19;
20; shader hash: c10d07e0100207069cb29b72a35d05b6
21;
22; Pipeline Runtime Information:
23;
24; Vertex Shader
25; OutputPositionPresent=1
26;
27;
28; Input signature:
29;
30; Name Index InterpMode DynIdx
31; -------------------- ----- ---------------------- ------
32; TEXCOORD 0
33; TEXCOORD 1
34; TEXCOORD 2
35;
36; Output signature:
37;
38; Name Index InterpMode DynIdx
39; -------------------- ----- ---------------------- ------
40; TEXCOORD 0 linear
41; TEXCOORD 1 linear
42; SV_Position 0 noperspective
43;
44; Buffer Definitions:
45;
46; cbuffer _18_20
47; {
48;
49; struct hostlayout._18_20
50; {
51;
52; row_major float4x4 _20_m0; ; Offset: 0
53; float4 _20_m1; ; Offset: 64
54; float2 _20_m2; ; Offset: 80
55;
56; } _18_20; ; Offset: 0 Size: 88
57;
58; }
59;
60;
61; Resource Bindings:
62;
63; Name Type Format Dim ID HLSL Bind Count
64; ------------------------------ ---------- ------- ----------- ------- -------------- ------
65; _18_20 cbuffer NA NA CB0 cb0,space1 1
66;
67;
68; ViewId state:
69;
70; Number of inputs: 10, outputs: 12
71; Outputs dependent on ViewId: { }
72; Inputs contributing to computation of Outputs:
73; output 0 depends on inputs: { 4 }
74; output 1 depends on inputs: { 5 }
75; output 2 depends on inputs: { 6 }
76; output 3 depends on inputs: { 7 }
77; output 4 depends on inputs: { 8 }
78; output 5 depends on inputs: { 9 }
79; output 8 depends on inputs: { 0, 1 }
80; output 9 depends on inputs: { 0, 1 }
81; output 10 depends on inputs: { 0, 1 }
82; output 11 depends on inputs: { 0, 1 }
83;
84target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
85target triple = "dxil-ms-dx"
86
87%dx.types.Handle = type { i8* }
88%dx.types.CBufRet.f32 = type { float, float, float, float }
89%hostlayout._18_20 = type { [4 x <4 x float>], <4 x float>, <2 x float> }
90
91define void @main() {
92 %1 = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false) ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
93 %2 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
94 %3 = call float @dx.op.loadInput.f32(i32 4, i32 2, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
95 %4 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
96 %5 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
97 %6 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 2, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
98 %7 = call float @dx.op.loadInput.f32(i32 4, i32 1, i32 0, i8 3, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
99 %8 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
100 %9 = call float @dx.op.loadInput.f32(i32 4, i32 0, i32 0, i8 1, i32 undef) ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
101 %10 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 0) ; CBufferLoadLegacy(handle,regIndex)
102 %11 = extractvalue %dx.types.CBufRet.f32 %10, 0
103 %12 = extractvalue %dx.types.CBufRet.f32 %10, 1
104 %13 = extractvalue %dx.types.CBufRet.f32 %10, 2
105 %14 = extractvalue %dx.types.CBufRet.f32 %10, 3
106 %15 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 1) ; CBufferLoadLegacy(handle,regIndex)
107 %16 = extractvalue %dx.types.CBufRet.f32 %15, 0
108 %17 = extractvalue %dx.types.CBufRet.f32 %15, 1
109 %18 = extractvalue %dx.types.CBufRet.f32 %15, 2
110 %19 = extractvalue %dx.types.CBufRet.f32 %15, 3
111 %20 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 3) ; CBufferLoadLegacy(handle,regIndex)
112 %21 = extractvalue %dx.types.CBufRet.f32 %20, 0
113 %22 = extractvalue %dx.types.CBufRet.f32 %20, 1
114 %23 = extractvalue %dx.types.CBufRet.f32 %20, 2
115 %24 = extractvalue %dx.types.CBufRet.f32 %20, 3
116 %25 = fmul fast float %11, %8
117 %26 = call float @dx.op.tertiary.f32(i32 46, float %9, float %16, float %25) ; FMad(a,b,c)
118 %27 = fadd fast float %21, %26
119 %28 = fmul fast float %12, %8
120 %29 = call float @dx.op.tertiary.f32(i32 46, float %9, float %17, float %28) ; FMad(a,b,c)
121 %30 = fadd fast float %29, %22
122 %31 = fmul fast float %13, %8
123 %32 = call float @dx.op.tertiary.f32(i32 46, float %9, float %18, float %31) ; FMad(a,b,c)
124 %33 = fadd fast float %32, %23
125 %34 = fmul fast float %14, %8
126 %35 = call float @dx.op.tertiary.f32(i32 46, float %9, float %19, float %34) ; FMad(a,b,c)
127 %36 = fadd fast float %35, %24
128 %37 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %1, i32 5) ; CBufferLoadLegacy(handle,regIndex)
129 %38 = extractvalue %dx.types.CBufRet.f32 %37, 0
130 %39 = extractvalue %dx.types.CBufRet.f32 %37, 1
131 %40 = fdiv fast float %2, %38
132 %41 = fdiv fast float %3, %39
133 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %4) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
134 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %5) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
135 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %6) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
136 call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %7) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
137 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 0, float %40) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
138 call void @dx.op.storeOutput.f32(i32 5, i32 1, i32 0, i8 1, float %41) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
139 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 0, float %27) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
140 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 1, float %30) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
141 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 2, float %33) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
142 call void @dx.op.storeOutput.f32(i32 5, i32 2, i32 0, i8 3, float %36) ; StoreOutput(outputSigId,rowIndex,colIndex,value)
143 ret void
144}
145
146; Function Attrs: nounwind readnone
147declare float @dx.op.loadInput.f32(i32, i32, i32, i8, i32) #0
148
149; Function Attrs: nounwind
150declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
151
152; Function Attrs: nounwind readonly
153declare %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32, %dx.types.Handle, i32) #2
154
155; Function Attrs: nounwind readnone
156declare float @dx.op.tertiary.f32(i32, float, float, float) #0
157
158; Function Attrs: nounwind readonly
159declare %dx.types.Handle @dx.op.createHandle(i32, i8, i32, i32, i1) #2
160
161attributes #0 = { nounwind readnone }
162attributes #1 = { nounwind }
163attributes #2 = { nounwind readonly }
164
165!llvm.ident = !{!0}
166!dx.version = !{!1}
167!dx.valver = !{!2}
168!dx.shaderModel = !{!3}
169!dx.resources = !{!4}
170!dx.viewIdState = !{!7}
171!dx.entryPoints = !{!8}
172
173!0 = !{!"dxc(private) 1.8.0.4662 (416fab6b5)"}
174!1 = !{i32 1, i32 0}
175!2 = !{i32 1, i32 8}
176!3 = !{!"vs", i32 6, i32 0}
177!4 = !{null, null, !5, null}
178!5 = !{!6}
179!6 = !{i32 0, %hostlayout._18_20* undef, !"", i32 1, i32 0, i32 1, i32 88, null}
180!7 = !{[12 x i32] [i32 10, i32 12, i32 3840, i32 3840, i32 0, i32 0, i32 1, i32 2, i32 4, i32 8, i32 16, i32 32]}
181!8 = !{void ()* @main, !"main", !9, !4, null}
182!9 = !{!10, !19, null}
183!10 = !{!11, !14, !17}
184!11 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !12, i8 0, i32 1, i8 2, i32 0, i8 0, !13}
185!12 = !{i32 0}
186!13 = !{i32 3, i32 3}
187!14 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !15, i8 0, i32 1, i8 4, i32 1, i8 0, !16}
188!15 = !{i32 1}
189!16 = !{i32 3, i32 15}
190!17 = !{i32 2, !"TEXCOORD", i8 9, i8 0, !18, i8 0, i32 1, i8 2, i32 2, i8 0, !13}
191!18 = !{i32 2}
192!19 = !{!20, !21, !22}
193!20 = !{i32 0, !"TEXCOORD", i8 9, i8 0, !12, i8 2, i32 1, i8 4, i32 0, i8 0, !16}
194!21 = !{i32 1, !"TEXCOORD", i8 9, i8 0, !15, i8 2, i32 1, i8 2, i32 1, i8 0, !13}
195!22 = !{i32 2, !"SV_Position", i8 9, i8 3, !12, i8 4, i32 1, i8 4, i32 2, i8 0, !16}
196
197#endif
198
199static const unsigned char tri_texture_vert_sm60_dxil[] = {
200 0x44, 0x58, 0x42, 0x43, 0x1d, 0x39, 0x3a, 0xc6, 0x32, 0xb6, 0x8e, 0x58,
201 0x41, 0xa6, 0x3b, 0x02, 0xc5, 0x3c, 0xcc, 0x94, 0x01, 0x00, 0x00, 0x00,
202 0xc8, 0x10, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
203 0x4c, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00,
204 0x8c, 0x02, 0x00, 0x00, 0x24, 0x09, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00,
205 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, 0x74, 0x00, 0x00, 0x00,
207 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00,
210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00,
211 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
212 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
215 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43,
216 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x53, 0x47, 0x31,
217 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
218 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
219 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00,
223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00,
224 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
225 0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x53, 0x56, 0x5f,
227 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00,
228 0x50, 0x53, 0x56, 0x30, 0x34, 0x01, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
229 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
231 0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
234 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x34, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
237 0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x54,
238 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x54, 0x45, 0x58, 0x43,
239 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52,
240 0x44, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
242 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0x01, 0x00, 0x42, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
244 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x44, 0x00, 0x03, 0x00, 0x00, 0x00,
245 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x42, 0x00,
246 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0x01, 0x00, 0x44, 0x00, 0x03, 0x02, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
248 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, 0x03, 0x02, 0x00, 0x00,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x03,
250 0x03, 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
252 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
253 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x90, 0x06, 0x00, 0x00,
255 0x60, 0x00, 0x01, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
256 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00,
257 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x9b, 0x01, 0x00, 0x00,
258 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
259 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
260 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
261 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14,
262 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20,
263 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
264 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
265 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
266 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
267 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
268 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
269 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
270 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
271 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84,
272 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c,
273 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x6c, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66,
274 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14,
275 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f,
276 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6,
277 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42,
278 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42,
279 0xad, 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4,
280 0x10, 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x61,
281 0x04, 0x61, 0xb8, 0xe8, 0x70, 0xa4, 0x69, 0x01, 0x30, 0x87, 0x9a, 0xfc,
282 0xbf, 0xe6, 0x7f, 0x9b, 0x46, 0x83, 0xad, 0x97, 0x70, 0x32, 0x10, 0x00,
283 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79,
284 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e,
285 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
286 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07,
287 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
288 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07,
289 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07,
290 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07,
291 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
292 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
293 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07,
294 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00,
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00,
296 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20,
297 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34,
298 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4,
299 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
300 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x40, 0x16, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
302 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
303 0x25, 0x30, 0x02, 0x50, 0x0c, 0x05, 0x1b, 0x50, 0x04, 0x85, 0x50, 0x06,
304 0xe5, 0x50, 0x12, 0x05, 0x18, 0x50, 0x1a, 0x05, 0x1a, 0x50, 0x1e, 0x45,
305 0x51, 0x68, 0x05, 0x41, 0xa5, 0x24, 0x46, 0x00, 0x8a, 0xa0, 0x10, 0xca,
306 0x80, 0x62, 0x0d, 0x10, 0x9e, 0x01, 0xa0, 0x3c, 0x03, 0x40, 0x7a, 0x2c,
307 0x46, 0x61, 0x40, 0x7c, 0x00, 0xf1, 0x01, 0x00, 0x02, 0x81, 0x40, 0x20,
308 0x30, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00,
309 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x31, 0x20, 0xc3, 0x1b,
310 0x43, 0x81, 0x93, 0x4b, 0xb3, 0x0b, 0xa3, 0x2b, 0x4b, 0x01, 0x89, 0x71,
311 0xc1, 0x71, 0x81, 0x71, 0xa1, 0xb1, 0xb1, 0x91, 0x01, 0x41, 0xa1, 0x89,
312 0xb1, 0x31, 0x0b, 0x13, 0xb3, 0x11, 0xab, 0x49, 0xd9, 0x10, 0x04, 0x13,
313 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61, 0x20, 0x36, 0x08, 0x04,
314 0x41, 0xc1, 0x6e, 0x6e, 0x82, 0x40, 0x20, 0x1b, 0x86, 0x03, 0x21, 0x26,
315 0x08, 0x59, 0x47, 0xe3, 0x2b, 0x06, 0xe7, 0x4b, 0x06, 0x66, 0x82, 0x40,
316 0x24, 0x1b, 0x10, 0x42, 0x59, 0x06, 0x62, 0x60, 0x80, 0x0d, 0x41, 0xb3,
317 0x81, 0x00, 0x00, 0x07, 0x98, 0x20, 0x60, 0x1c, 0x8d, 0x2f, 0x19, 0x98,
318 0xaf, 0x36, 0x98, 0x09, 0x02, 0xa1, 0x4c, 0x10, 0x88, 0x65, 0xc3, 0x30,
319 0x4d, 0xc3, 0x04, 0x81, 0x60, 0x26, 0x08, 0x44, 0x33, 0x41, 0x20, 0x9c,
320 0x09, 0x42, 0xb4, 0x6d, 0x50, 0x90, 0x48, 0xa2, 0x2a, 0xc2, 0xba, 0x2e,
321 0x8c, 0xc6, 0x97, 0x0c, 0xcc, 0x57, 0x5b, 0xcc, 0x04, 0x81, 0x78, 0x26,
322 0x08, 0x04, 0xb4, 0x01, 0x41, 0xb4, 0x6a, 0xb3, 0x2e, 0x6e, 0xa2, 0xf1,
323 0x25, 0x03, 0xf3, 0xd5, 0x26, 0x33, 0x41, 0x20, 0xa2, 0x0d, 0x0a, 0xe2,
324 0x55, 0x9f, 0x75, 0x5d, 0x18, 0x27, 0x6d, 0x20, 0x98, 0xac, 0x03, 0x83,
325 0x0d, 0x03, 0x01, 0x85, 0xc1, 0x04, 0x41, 0x00, 0x36, 0x00, 0x1b, 0x06,
326 0x82, 0x0c, 0xc8, 0x60, 0x43, 0x50, 0x06, 0x1b, 0x86, 0x61, 0x0c, 0xcc,
327 0x60, 0x82, 0xa0, 0x79, 0x1b, 0x02, 0x34, 0x20, 0xd1, 0x16, 0x96, 0xe6,
328 0x46, 0x84, 0xaa, 0x08, 0x6b, 0xe8, 0xe9, 0x49, 0x8a, 0x68, 0x82, 0x50,
329 0x58, 0x13, 0x84, 0xe2, 0xda, 0x10, 0x10, 0x13, 0x84, 0x02, 0xdb, 0x20,
330 0x54, 0xd5, 0x86, 0x85, 0x58, 0x03, 0x36, 0x68, 0x03, 0x37, 0x68, 0x83,
331 0xe1, 0x0d, 0x88, 0x36, 0x80, 0x83, 0x0d, 0xc1, 0x30, 0x41, 0x28, 0xb2,
332 0x09, 0x02, 0x21, 0x6d, 0x10, 0x2a, 0x3a, 0xd8, 0xb0, 0x0c, 0x6b, 0xc0,
333 0x06, 0x6d, 0x20, 0x07, 0x6d, 0x30, 0xcc, 0xc1, 0xd0, 0x06, 0x75, 0xb0,
334 0x21, 0x90, 0x36, 0x2c, 0xd2, 0x1a, 0xb0, 0x41, 0x1b, 0xdc, 0x41, 0x1b,
335 0x0c, 0x6f, 0x20, 0xb5, 0x01, 0x1c, 0x6c, 0x18, 0xe2, 0xc0, 0x0e, 0xf0,
336 0x60, 0xc3, 0x42, 0xac, 0x01, 0x1b, 0xb4, 0x81, 0x1b, 0xbc, 0xc1, 0x30,
337 0x07, 0x44, 0x1b, 0xd4, 0xc1, 0x86, 0x65, 0x58, 0x03, 0x36, 0x68, 0x03,
338 0x39, 0x78, 0x83, 0xe1, 0x0d, 0x86, 0x36, 0x80, 0x03, 0x2e, 0x53, 0x56,
339 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x13, 0x84, 0x42,
340 0xdb, 0xb0, 0x48, 0x7c, 0xc0, 0x06, 0x7d, 0xe0, 0x06, 0x73, 0x30, 0xcc,
341 0x81, 0xd4, 0x06, 0x75, 0xb0, 0x61, 0xd0, 0x83, 0x3d, 0xf0, 0x83, 0x0d,
342 0x43, 0x1e, 0xfc, 0x01, 0xb0, 0xa1, 0x18, 0x03, 0x35, 0x00, 0x85, 0x07,
343 0xa0, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x37, 0x37, 0x41, 0x20, 0x26, 0x16,
344 0x69, 0x6e, 0x73, 0x74, 0x73, 0x13, 0x04, 0x82, 0xa2, 0x31, 0x97, 0x76,
345 0xf6, 0xc5, 0x46, 0x36, 0x41, 0x20, 0x2a, 0x1a, 0x73, 0x69, 0x67, 0x5f,
346 0x73, 0x74, 0x1b, 0x10, 0x51, 0x18, 0x05, 0x52, 0x28, 0x05, 0x53, 0x38,
347 0x05, 0x54, 0x18, 0x85, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, 0x2e, 0x69, 0x64,
348 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b, 0x5d, 0x99,
349 0xdc, 0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86, 0xe7, 0x62,
350 0x17, 0xc6, 0x66, 0x57, 0x26, 0x37, 0x25, 0x28, 0xea, 0x90, 0xe1, 0xb9,
351 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, 0x95, 0xb1, 0x4d,
352 0x09, 0x90, 0x32, 0x64, 0x78, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
353 0x63, 0x65, 0x73, 0x53, 0x02, 0xa7, 0x12, 0x19, 0x9e, 0x0b, 0x5d, 0x1e,
354 0x5c, 0x59, 0x90, 0x9b, 0xdb, 0x1b, 0x5d, 0x18, 0x5d, 0xda, 0x9b, 0xdb,
355 0xdc, 0x14, 0x21, 0x0c, 0xcc, 0xa0, 0x0e, 0x19, 0x9e, 0x8b, 0x5d, 0x5a,
356 0xd9, 0x5d, 0x12, 0xd9, 0x14, 0x5d, 0x18, 0x5d, 0xd9, 0x94, 0x00, 0x0d,
357 0xea, 0x90, 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5,
358 0xb9, 0xd1, 0xcd, 0x4d, 0x09, 0x40, 0xa1, 0x0b, 0x19, 0x9e, 0xcb, 0xd8,
359 0x5b, 0x9d, 0x1b, 0x5d, 0x99, 0xdc, 0xdc, 0x94, 0x00, 0x15, 0x00, 0x00,
360 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
361 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
362 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
363 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
364 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
365 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
366 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
367 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
368 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
369 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
370 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
371 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
372 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
373 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
374 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
375 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
376 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
377 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
378 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
379 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
380 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
381 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
382 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
383 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
384 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
385 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
386 0x71, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97,
387 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25,
388 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce,
389 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0,
390 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93,
391 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e,
392 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3,
393 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7,
394 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0xc1, 0x0d, 0x07, 0xe0, 0x10, 0x02, 0x07, 0x06, 0x9c, 0xb2, 0x9b, 0x72,
397 0xa3, 0x5d, 0x05, 0xb6, 0x44, 0x58, 0x49, 0x4c, 0x80, 0x07, 0x00, 0x00,
398 0x60, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c,
399 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x68, 0x07, 0x00, 0x00,
400 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xd7, 0x01, 0x00, 0x00,
401 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
402 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39,
403 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62,
404 0x80, 0x14, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14,
405 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20,
406 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90,
407 0x91, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a,
408 0x04, 0x29, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
409 0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d,
410 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff,
411 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, 0x49, 0x18, 0x00, 0x00,
412 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06,
413 0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
414 0x32, 0x22, 0x48, 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84,
415 0x04, 0x93, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c,
416 0x0b, 0x84, 0xa4, 0x4c, 0x10, 0x6c, 0x23, 0x00, 0x25, 0x00, 0x14, 0x66,
417 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x20, 0x84, 0x14,
418 0x42, 0xa6, 0x18, 0x80, 0x10, 0x52, 0x06, 0xa1, 0xa3, 0x86, 0xcb, 0x9f,
419 0xb0, 0x87, 0x90, 0x7c, 0x6e, 0xa3, 0x8a, 0x95, 0x98, 0xfc, 0xe2, 0xb6,
420 0x11, 0x31, 0xc6, 0x18, 0x54, 0xee, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42,
421 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0xab, 0x10, 0x8a, 0x30, 0x42,
422 0xad, 0x14, 0x83, 0x8c, 0x31, 0xe8, 0xcd, 0x11, 0x04, 0xc5, 0x60, 0xa4,
423 0x10, 0x12, 0x49, 0x0e, 0x04, 0x0c, 0x23, 0x10, 0x43, 0x12, 0xd4, 0x61,
424 0x04, 0x61, 0xb8, 0xe8, 0x70, 0xa4, 0x69, 0x01, 0x30, 0x87, 0x9a, 0xfc,
425 0xbf, 0xe6, 0x7f, 0x9b, 0x46, 0x83, 0xad, 0x97, 0x70, 0x32, 0x10, 0x00,
426 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79,
427 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e,
428 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
429 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07,
430 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e,
431 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07,
432 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07,
433 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07,
434 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
435 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
436 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07,
437 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00,
438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00,
439 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20,
440 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x34,
441 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4,
442 0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
443 0xc8, 0x23, 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444 0x40, 0x16, 0x08, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14,
445 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22,
446 0x25, 0x30, 0x02, 0x50, 0x10, 0xc5, 0x50, 0xb0, 0x01, 0x65, 0x50, 0x1e,
447 0x45, 0x40, 0xa5, 0x24, 0x46, 0x00, 0x8a, 0xa0, 0x10, 0xca, 0x80, 0xf2,
448 0x0c, 0x00, 0xe9, 0xb1, 0x18, 0x85, 0x01, 0xf1, 0x01, 0xc4, 0x07, 0x00,
449 0x08, 0x04, 0x02, 0x81, 0xc0, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
450 0x5f, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4,
451 0x31, 0x20, 0xc3, 0x1b, 0x43, 0x81, 0x93, 0x4b, 0xb3, 0x0b, 0xa3, 0x2b,
452 0x4b, 0x01, 0x89, 0x71, 0xc1, 0x71, 0x81, 0x71, 0xa1, 0xb1, 0xb1, 0x91,
453 0x01, 0x41, 0xa1, 0x89, 0xb1, 0x31, 0x0b, 0x13, 0xb3, 0x11, 0xab, 0x49,
454 0xd9, 0x10, 0x04, 0x13, 0x04, 0xc2, 0x98, 0x20, 0x10, 0xc7, 0x06, 0x61,
455 0x20, 0x26, 0x08, 0x04, 0xb2, 0x41, 0x18, 0x0c, 0x0a, 0x76, 0x73, 0x13,
456 0x04, 0x22, 0xd9, 0x30, 0x20, 0x09, 0x31, 0x41, 0xc8, 0x26, 0x02, 0x13,
457 0x04, 0x42, 0xd9, 0x80, 0x10, 0x0b, 0x33, 0x10, 0x43, 0x03, 0x6c, 0x08,
458 0x9c, 0x0d, 0x04, 0x00, 0x3c, 0xc0, 0x04, 0x41, 0xa3, 0x36, 0x04, 0xd1,
459 0x04, 0x41, 0x00, 0x48, 0xb4, 0x85, 0xa5, 0xb9, 0x11, 0xa1, 0x2a, 0xc2,
460 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20, 0x14, 0xce, 0x04, 0xa1, 0x78,
461 0x36, 0x04, 0xc4, 0x04, 0xa1, 0x80, 0x26, 0x08, 0xc4, 0xb2, 0x41, 0xd0,
462 0xb4, 0x0d, 0x0b, 0x51, 0x59, 0x17, 0x76, 0x0d, 0x19, 0x71, 0x6d, 0x1b,
463 0x82, 0x61, 0x82, 0x50, 0x44, 0x13, 0x04, 0x82, 0xd9, 0x20, 0x68, 0xdf,
464 0x86, 0x65, 0xa8, 0xac, 0xab, 0xbb, 0x06, 0x6f, 0xb8, 0xc0, 0x60, 0x82,
465 0x40, 0x34, 0x1b, 0x02, 0x31, 0xd8, 0xb0, 0x88, 0x41, 0x65, 0x5d, 0x63,
466 0x70, 0x0d, 0x99, 0x18, 0x5c, 0xdb, 0x86, 0x81, 0x0b, 0x03, 0x32, 0xd8,
467 0xb0, 0x10, 0x95, 0x75, 0x61, 0xd9, 0xe0, 0x11, 0x17, 0x18, 0x6c, 0x58,
468 0x86, 0xca, 0xba, 0xba, 0x6c, 0xc8, 0x86, 0x6b, 0xe3, 0x32, 0x65, 0xf5,
469 0x05, 0xf5, 0x36, 0x97, 0x46, 0x97, 0xf6, 0xe6, 0x36, 0x41, 0x28, 0xa4,
470 0x0d, 0x8b, 0x18, 0xa0, 0x81, 0x95, 0x06, 0x98, 0x37, 0x78, 0x62, 0x70,
471 0x81, 0xc1, 0x86, 0xc1, 0x0c, 0xce, 0x40, 0x0d, 0x36, 0x0c, 0x65, 0xb0,
472 0x06, 0xc0, 0x86, 0x62, 0xa2, 0xd8, 0x00, 0x02, 0xaa, 0xb0, 0xb1, 0xd9,
473 0xb5, 0xb9, 0xa4, 0x91, 0x95, 0xb9, 0xd1, 0x4d, 0x09, 0x82, 0x2a, 0x64,
474 0x78, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x02, 0xa2,
475 0x09, 0x19, 0x9e, 0x8b, 0x5d, 0x18, 0x9b, 0x5d, 0x99, 0xdc, 0x94, 0xc0,
476 0xa8, 0x43, 0x86, 0xe7, 0x32, 0x87, 0x16, 0x46, 0x56, 0x26, 0xd7, 0xf4,
477 0x46, 0x56, 0xc6, 0x36, 0x25, 0x48, 0xca, 0x90, 0xe1, 0xb9, 0xc8, 0x95,
478 0xcd, 0xbd, 0xd5, 0xc9, 0x8d, 0x95, 0xcd, 0x4d, 0x09, 0x9e, 0x3a, 0x64,
479 0x78, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x49, 0x64, 0x53, 0x74, 0x61, 0x74,
480 0x65, 0x53, 0x82, 0xa8, 0x0e, 0x19, 0x9e, 0x4b, 0x99, 0x1b, 0x9d, 0x5c,
481 0x1e, 0xd4, 0x5b, 0x9a, 0x1b, 0xdd, 0xdc, 0x94, 0x80, 0x0d, 0x00, 0x00,
482 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c,
483 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3,
484 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6,
485 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e,
486 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43,
487 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03,
488 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48,
489 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20,
490 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e,
491 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d,
492 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89,
493 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83,
494 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68,
495 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90,
496 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78,
497 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98,
498 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5,
499 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c,
500 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c,
501 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43,
502 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43,
503 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82,
504 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70,
505 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60,
506 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4,
507 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00,
508 0x71, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x36, 0xb0, 0x0d, 0x97,
509 0xef, 0x3c, 0xbe, 0x10, 0x50, 0x45, 0x41, 0x44, 0xa5, 0x03, 0x0c, 0x25,
510 0x61, 0x00, 0x02, 0xe6, 0x17, 0xb7, 0x6d, 0x05, 0xd2, 0x70, 0xf9, 0xce,
511 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x58, 0xc0,
512 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x8b, 0x03, 0x0c, 0x62, 0xf3, 0x50, 0x93,
513 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e,
514 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x48, 0xc3,
515 0xe5, 0x3b, 0x8f, 0x3f, 0x11, 0xd1, 0x84, 0x00, 0x11, 0xe6, 0x17, 0xb7,
516 0x6d, 0x00, 0x04, 0x03, 0x20, 0x0d, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00,
517 0x79, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00,
518 0x05, 0x00, 0x00, 0x00, 0x44, 0x4a, 0xa1, 0x10, 0x66, 0x00, 0xca, 0xae,
519 0xb8, 0x4a, 0x8e, 0x4a, 0x09, 0x50, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x00,
520 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x20, 0x61, 0x43, 0x63, 0x59, 0xc1,
521 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x1d, 0x12, 0x5d, 0xcf, 0x31,
522 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x86, 0x97, 0x48, 0x18, 0x81, 0x8c,
523 0x18, 0x24, 0x00, 0x08, 0x82, 0x81, 0xf1, 0x29, 0x5a, 0x16, 0x25, 0x23,
524 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x80, 0xc1, 0xb2, 0x69, 0x86, 0x32,
525 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x46, 0x18, 0x30, 0xdc, 0x26, 0x2d,
526 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x88, 0x41, 0xd3, 0x71, 0x11,
527 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0xc6, 0x18, 0x38, 0x5d, 0x57,
528 0x35, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x90, 0xc1, 0xe3, 0x79,
529 0x8a, 0x33, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0xcd, 0x18, 0x38, 0xc9,
530 0x37, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3,
531 0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x0d, 0x1a, 0x4c,
532 0x4e, 0x19, 0x8c, 0x26, 0x04, 0xc0, 0x68, 0x82, 0x10, 0x8c, 0x26, 0x0c,
533 0xc2, 0x68, 0x02, 0x31, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x41, 0xd3,
534 0x06, 0xd8, 0x54, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, 0xa3,
535 0x09, 0x83, 0x30, 0x9a, 0x40, 0x0c, 0xe6, 0x44, 0xf2, 0x19, 0x31, 0x40,
536 0x00, 0x10, 0x04, 0x83, 0x47, 0x0e, 0xba, 0x48, 0x09, 0xcc, 0x08, 0xa0,
537 0x63, 0x10, 0x25, 0x9f, 0x11, 0x03, 0x04, 0x00, 0x41, 0x30, 0x78, 0xea,
538 0x00, 0x0c, 0x28, 0x26, 0xb0, 0x00, 0x81, 0x8e, 0x49, 0x97, 0x7c, 0x46,
539 0x0c, 0x10, 0x00, 0x04, 0xc1, 0xe0, 0xc1, 0x83, 0x31, 0xb8, 0x9c, 0xc0,
540 0x02, 0x05, 0x3a, 0x46, 0x69, 0xf2, 0x19, 0x31, 0x40, 0x00, 0x10, 0x04,
541 0x83, 0x67, 0x0f, 0xcc, 0x40, 0x83, 0x02, 0x0b, 0x18, 0xe8, 0x8c, 0x18,
542 0x1c, 0x00, 0x08, 0x82, 0x41, 0xe3, 0x07, 0x69, 0x40, 0x06, 0x6c, 0x30,
543 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x60, 0x66, 0x20, 0xd0, 0xc7, 0xcc,
544 0x40, 0xa0, 0xcf, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xa4, 0x10,
545 0x07, 0x7f, 0xf0, 0x07, 0x77, 0x60, 0x06, 0x23, 0x06, 0x09, 0x00, 0x82,
546 0x60, 0x80, 0x90, 0x42, 0x1c, 0xfc, 0xc1, 0x1f, 0xac, 0x41, 0x19, 0x8c,
547 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x42, 0x0a, 0x71, 0xf0, 0x07, 0x7f,
548 0x60, 0x07, 0x64, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x08, 0x29,
549 0xc4, 0xc1, 0x1f, 0xfc, 0x01, 0x1d, 0x8c, 0xc1, 0x88, 0x41, 0x02, 0x80,
550 0x20, 0x18, 0x20, 0xa4, 0x10, 0x07, 0xa0, 0xf0, 0x07, 0x77, 0x20, 0x8c,
551 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x42, 0x0a, 0x71, 0x00, 0x0a, 0x7f,
552 0xb0, 0x06, 0xc1, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0xa4, 0x10,
553 0x07, 0x79, 0xf0, 0x07, 0x77, 0xf0, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82,
554 0x01, 0x42, 0x0a, 0x71, 0x90, 0x07, 0x7f, 0xb0, 0x06, 0xcc, 0x88, 0x41,
555 0x02, 0x80, 0x20, 0x18, 0x20, 0xa4, 0x10, 0x07, 0x79, 0xf0, 0x07, 0x76,
556 0x90, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, 0x42, 0x0a, 0x71, 0x90,
557 0x07, 0x7f, 0x40, 0x07, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
558};
diff --git a/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.spv.h b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.spv.h
new file mode 100644
index 0000000..862dc79
--- /dev/null
+++ b/SDL-3.2.8/src/render/gpu/shaders/tri_texture.vert.spv.h
@@ -0,0 +1,106 @@
1static const unsigned char tri_texture_vert_spv[] = {
2 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x08, 0x00,
3 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
4 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
5 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
6 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
7 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
9 0x0d, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
10 0x25, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
11 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
13 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
14 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00,
15 0x02, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
16 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
17 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00,
18 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00,
19 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
20 0x48, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
22 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
23 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, 0x00,
24 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
25 0x48, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
26 0x23, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00,
27 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
28 0x14, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
29 0x47, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
30 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x19, 0x00, 0x00, 0x00,
31 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
32 0x23, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 0x47, 0x00, 0x04, 0x00, 0x25, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
34 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x28, 0x00, 0x00, 0x00,
35 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
36 0x29, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
37 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00,
38 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00,
39 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
40 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
41 0x15, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
42 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
43 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00,
44 0x0a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
45 0x1e, 0x00, 0x06, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
46 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
47 0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
48 0x0b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
49 0x0d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00,
50 0x0e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
51 0x2b, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00,
53 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
54 0x11, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
55 0x1e, 0x00, 0x05, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
56 0x07, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
57 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
58 0x3b, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
59 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00,
60 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
61 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
62 0x3b, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
63 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
64 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
65 0x06, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f,
66 0x20, 0x00, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
67 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00,
68 0x23, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
69 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
70 0x3b, 0x00, 0x04, 0x00, 0x24, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
71 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x27, 0x00, 0x00, 0x00,
72 0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
73 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
74 0x3b, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
75 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00,
76 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
77 0x2c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
78 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
80 0x05, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00,
81 0x16, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
82 0x3d, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
83 0x16, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00,
84 0x1a, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
85 0x06, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00,
87 0x1e, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
88 0x50, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
89 0x1d, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
90 0x1c, 0x00, 0x00, 0x00, 0x91, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
91 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
92 0x41, 0x00, 0x05, 0x00, 0x21, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
93 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
94 0x22, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
95 0x07, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
96 0x3e, 0x00, 0x03, 0x00, 0x23, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
97 0x3d, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00,
98 0x29, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x00, 0x00,
99 0x2d, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00,
100 0x3d, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00,
101 0x2d, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x00,
102 0x2f, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00,
103 0x3e, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00,
104 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
105};
106static const unsigned int tri_texture_vert_spv_len = 1232;
diff --git a/SDL-3.2.8/src/render/metal/SDL_render_metal.m b/SDL-3.2.8/src/render/metal/SDL_render_metal.m
new file mode 100644
index 0000000..63d9770
--- /dev/null
+++ b/SDL-3.2.8/src/render/metal/SDL_render_metal.m
@@ -0,0 +1,2196 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_METAL
24
25#include "../SDL_sysrender.h"
26#include "../../video/SDL_pixels_c.h"
27
28#import <CoreVideo/CoreVideo.h>
29#import <Metal/Metal.h>
30#import <QuartzCore/CAMetalLayer.h>
31
32#ifdef SDL_VIDEO_DRIVER_COCOA
33#import <AppKit/NSWindow.h>
34#import <AppKit/NSView.h>
35#endif
36#ifdef SDL_VIDEO_DRIVER_UIKIT
37#import <UIKit/UIKit.h>
38#endif
39
40// Regenerate these with build-metal-shaders.sh
41#ifdef SDL_PLATFORM_MACOS
42#include "SDL_shaders_metal_macos.h"
43#elif defined(SDL_PLATFORM_TVOS)
44#if TARGET_OS_SIMULATOR
45#include "SDL_shaders_metal_tvsimulator.h"
46#else
47#include "SDL_shaders_metal_tvos.h"
48#endif
49#else
50#if TARGET_OS_SIMULATOR
51#include "SDL_shaders_metal_iphonesimulator.h"
52#else
53#include "SDL_shaders_metal_ios.h"
54#endif
55#endif
56
57// Apple Metal renderer implementation
58
59// macOS requires constants in a buffer to have a 256 byte alignment.
60// Use native type alignments from https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf
61#if defined(SDL_PLATFORM_MACOS) || TARGET_OS_SIMULATOR || TARGET_OS_MACCATALYST
62#define CONSTANT_ALIGN(x) (256)
63#else
64#define CONSTANT_ALIGN(x) (x < 4 ? 4 : x)
65#endif
66
67#define DEVICE_ALIGN(x) (x < 4 ? 4 : x)
68
69#define ALIGN_CONSTANTS(align, size) ((size + CONSTANT_ALIGN(align) - 1) & (~(CONSTANT_ALIGN(align) - 1)))
70
71static const size_t CONSTANTS_OFFSET_INVALID = 0xFFFFFFFF;
72static const size_t CONSTANTS_OFFSET_IDENTITY = 0;
73static const size_t CONSTANTS_OFFSET_HALF_PIXEL_TRANSFORM = ALIGN_CONSTANTS(16, CONSTANTS_OFFSET_IDENTITY + sizeof(float) * 16);
74static const size_t CONSTANTS_OFFSET_DECODE_BT601_LIMITED = ALIGN_CONSTANTS(16, CONSTANTS_OFFSET_HALF_PIXEL_TRANSFORM + sizeof(float) * 16);
75static const size_t CONSTANTS_OFFSET_DECODE_BT601_FULL = ALIGN_CONSTANTS(16, CONSTANTS_OFFSET_DECODE_BT601_LIMITED + sizeof(float) * 4 * 4);
76static const size_t CONSTANTS_OFFSET_DECODE_BT709_LIMITED = ALIGN_CONSTANTS(16, CONSTANTS_OFFSET_DECODE_BT601_FULL + sizeof(float) * 4 * 4);
77static const size_t CONSTANTS_OFFSET_DECODE_BT709_FULL = ALIGN_CONSTANTS(16, CONSTANTS_OFFSET_DECODE_BT709_LIMITED + sizeof(float) * 4 * 4);
78static const size_t CONSTANTS_OFFSET_DECODE_BT2020_LIMITED = ALIGN_CONSTANTS(16, CONSTANTS_OFFSET_DECODE_BT709_FULL + sizeof(float) * 4 * 4);
79static const size_t CONSTANTS_OFFSET_DECODE_BT2020_FULL = ALIGN_CONSTANTS(16, CONSTANTS_OFFSET_DECODE_BT2020_LIMITED + sizeof(float) * 4 * 4);
80static const size_t CONSTANTS_LENGTH = CONSTANTS_OFFSET_DECODE_BT2020_FULL + sizeof(float) * 4 * 4;
81
82// Sampler types
83typedef enum
84{
85 SDL_METAL_SAMPLER_NEAREST_CLAMP,
86 SDL_METAL_SAMPLER_NEAREST_WRAP,
87 SDL_METAL_SAMPLER_LINEAR_CLAMP,
88 SDL_METAL_SAMPLER_LINEAR_WRAP,
89 SDL_NUM_METAL_SAMPLERS
90} SDL_METAL_sampler_type;
91
92typedef enum SDL_MetalVertexFunction
93{
94 SDL_METAL_VERTEX_SOLID,
95 SDL_METAL_VERTEX_COPY,
96} SDL_MetalVertexFunction;
97
98typedef enum SDL_MetalFragmentFunction
99{
100 SDL_METAL_FRAGMENT_SOLID = 0,
101 SDL_METAL_FRAGMENT_COPY,
102 SDL_METAL_FRAGMENT_YUV,
103 SDL_METAL_FRAGMENT_NV12,
104 SDL_METAL_FRAGMENT_COUNT,
105} SDL_MetalFragmentFunction;
106
107typedef struct METAL_PipelineState
108{
109 SDL_BlendMode blendMode;
110 void *pipe;
111} METAL_PipelineState;
112
113typedef struct METAL_PipelineCache
114{
115 METAL_PipelineState *states;
116 int count;
117 SDL_MetalVertexFunction vertexFunction;
118 SDL_MetalFragmentFunction fragmentFunction;
119 MTLPixelFormat renderTargetFormat;
120 const char *label;
121} METAL_PipelineCache;
122
123/* Each shader combination used by drawing functions has a separate pipeline
124 * cache, and we have a separate list of caches for each render target pixel
125 * format. This is more efficient than iterating over a global cache to find
126 * the pipeline based on the specified shader combination and RT pixel format,
127 * since we know what the RT pixel format is when we set the render target, and
128 * we know what the shader combination is inside each drawing function's code. */
129typedef struct METAL_ShaderPipelines
130{
131 MTLPixelFormat renderTargetFormat;
132 METAL_PipelineCache caches[SDL_METAL_FRAGMENT_COUNT];
133} METAL_ShaderPipelines;
134
135@interface SDL3METAL_RenderData : NSObject
136@property(nonatomic, retain) id<MTLDevice> mtldevice;
137@property(nonatomic, retain) id<MTLCommandQueue> mtlcmdqueue;
138@property(nonatomic, retain) id<MTLCommandBuffer> mtlcmdbuffer;
139@property(nonatomic, retain) id<MTLRenderCommandEncoder> mtlcmdencoder;
140@property(nonatomic, retain) id<MTLLibrary> mtllibrary;
141@property(nonatomic, retain) id<CAMetalDrawable> mtlbackbuffer;
142@property(nonatomic, retain) NSMutableArray<id<MTLSamplerState>> *mtlsamplers;
143@property(nonatomic, retain) id<MTLBuffer> mtlbufconstants;
144@property(nonatomic, retain) id<MTLBuffer> mtlbufquadindices;
145@property(nonatomic, assign) SDL_MetalView mtlview;
146@property(nonatomic, retain) CAMetalLayer *mtllayer;
147@property(nonatomic, retain) MTLRenderPassDescriptor *mtlpassdesc;
148@property(nonatomic, assign) METAL_ShaderPipelines *activepipelines;
149@property(nonatomic, assign) METAL_ShaderPipelines *allpipelines;
150@property(nonatomic, assign) int pipelinescount;
151@end
152
153@implementation SDL3METAL_RenderData
154@end
155
156@interface SDL3METAL_TextureData : NSObject
157@property(nonatomic, retain) id<MTLTexture> mtltexture;
158@property(nonatomic, retain) id<MTLTexture> mtltextureUv;
159@property(nonatomic, assign) SDL_MetalFragmentFunction fragmentFunction;
160#ifdef SDL_HAVE_YUV
161@property(nonatomic, assign) BOOL yuv;
162@property(nonatomic, assign) BOOL nv12;
163@property(nonatomic, assign) size_t conversionBufferOffset;
164#endif
165@property(nonatomic, assign) BOOL hasdata;
166@property(nonatomic, retain) id<MTLBuffer> lockedbuffer;
167@property(nonatomic, assign) SDL_Rect lockedrect;
168@end
169
170@implementation SDL3METAL_TextureData
171@end
172
173static const MTLBlendOperation invalidBlendOperation = (MTLBlendOperation)0xFFFFFFFF;
174static const MTLBlendFactor invalidBlendFactor = (MTLBlendFactor)0xFFFFFFFF;
175
176static MTLBlendOperation GetBlendOperation(SDL_BlendOperation operation)
177{
178 switch (operation) {
179 case SDL_BLENDOPERATION_ADD:
180 return MTLBlendOperationAdd;
181 case SDL_BLENDOPERATION_SUBTRACT:
182 return MTLBlendOperationSubtract;
183 case SDL_BLENDOPERATION_REV_SUBTRACT:
184 return MTLBlendOperationReverseSubtract;
185 case SDL_BLENDOPERATION_MINIMUM:
186 return MTLBlendOperationMin;
187 case SDL_BLENDOPERATION_MAXIMUM:
188 return MTLBlendOperationMax;
189 default:
190 return invalidBlendOperation;
191 }
192}
193
194static MTLBlendFactor GetBlendFactor(SDL_BlendFactor factor)
195{
196 switch (factor) {
197 case SDL_BLENDFACTOR_ZERO:
198 return MTLBlendFactorZero;
199 case SDL_BLENDFACTOR_ONE:
200 return MTLBlendFactorOne;
201 case SDL_BLENDFACTOR_SRC_COLOR:
202 return MTLBlendFactorSourceColor;
203 case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
204 return MTLBlendFactorOneMinusSourceColor;
205 case SDL_BLENDFACTOR_SRC_ALPHA:
206 return MTLBlendFactorSourceAlpha;
207 case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
208 return MTLBlendFactorOneMinusSourceAlpha;
209 case SDL_BLENDFACTOR_DST_COLOR:
210 return MTLBlendFactorDestinationColor;
211 case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
212 return MTLBlendFactorOneMinusDestinationColor;
213 case SDL_BLENDFACTOR_DST_ALPHA:
214 return MTLBlendFactorDestinationAlpha;
215 case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
216 return MTLBlendFactorOneMinusDestinationAlpha;
217 default:
218 return invalidBlendFactor;
219 }
220}
221
222static NSString *GetVertexFunctionName(SDL_MetalVertexFunction function)
223{
224 switch (function) {
225 case SDL_METAL_VERTEX_SOLID:
226 return @"SDL_Solid_vertex";
227 case SDL_METAL_VERTEX_COPY:
228 return @"SDL_Copy_vertex";
229 default:
230 return nil;
231 }
232}
233
234static NSString *GetFragmentFunctionName(SDL_MetalFragmentFunction function)
235{
236 switch (function) {
237 case SDL_METAL_FRAGMENT_SOLID:
238 return @"SDL_Solid_fragment";
239 case SDL_METAL_FRAGMENT_COPY:
240 return @"SDL_Copy_fragment";
241 case SDL_METAL_FRAGMENT_YUV:
242 return @"SDL_YUV_fragment";
243 case SDL_METAL_FRAGMENT_NV12:
244 return @"SDL_NV12_fragment";
245 default:
246 return nil;
247 }
248}
249
250static id<MTLRenderPipelineState> MakePipelineState(SDL3METAL_RenderData *data, METAL_PipelineCache *cache,
251 NSString *blendlabel, SDL_BlendMode blendmode)
252{
253 MTLRenderPipelineDescriptor *mtlpipedesc;
254 MTLVertexDescriptor *vertdesc;
255 MTLRenderPipelineColorAttachmentDescriptor *rtdesc;
256 NSError *err = nil;
257 id<MTLRenderPipelineState> state;
258 METAL_PipelineState pipeline;
259 METAL_PipelineState *states;
260
261 id<MTLFunction> mtlvertfn = [data.mtllibrary newFunctionWithName:GetVertexFunctionName(cache->vertexFunction)];
262 id<MTLFunction> mtlfragfn = [data.mtllibrary newFunctionWithName:GetFragmentFunctionName(cache->fragmentFunction)];
263 SDL_assert(mtlvertfn != nil);
264 SDL_assert(mtlfragfn != nil);
265
266 mtlpipedesc = [[MTLRenderPipelineDescriptor alloc] init];
267 mtlpipedesc.vertexFunction = mtlvertfn;
268 mtlpipedesc.fragmentFunction = mtlfragfn;
269
270 vertdesc = [MTLVertexDescriptor vertexDescriptor];
271
272 switch (cache->vertexFunction) {
273 case SDL_METAL_VERTEX_SOLID:
274 // position (float2), color (float4)
275 vertdesc.layouts[0].stride = sizeof(float) * 2 + sizeof(float) * 4;
276 vertdesc.layouts[0].stepFunction = MTLVertexStepFunctionPerVertex;
277
278 vertdesc.attributes[0].format = MTLVertexFormatFloat2;
279 vertdesc.attributes[0].offset = 0;
280 vertdesc.attributes[0].bufferIndex = 0;
281
282 vertdesc.attributes[1].format = MTLVertexFormatFloat4;
283 vertdesc.attributes[1].offset = sizeof(float) * 2;
284 vertdesc.attributes[1].bufferIndex = 0;
285
286 break;
287 case SDL_METAL_VERTEX_COPY:
288 // position (float2), color (float4), texcoord (float2)
289 vertdesc.layouts[0].stride = sizeof(float) * 2 + sizeof(float) * 4 + sizeof(float) * 2;
290 vertdesc.layouts[0].stepFunction = MTLVertexStepFunctionPerVertex;
291
292 vertdesc.attributes[0].format = MTLVertexFormatFloat2;
293 vertdesc.attributes[0].offset = 0;
294 vertdesc.attributes[0].bufferIndex = 0;
295
296 vertdesc.attributes[1].format = MTLVertexFormatFloat4;
297 vertdesc.attributes[1].offset = sizeof(float) * 2;
298 vertdesc.attributes[1].bufferIndex = 0;
299
300 vertdesc.attributes[2].format = MTLVertexFormatFloat2;
301 vertdesc.attributes[2].offset = sizeof(float) * 2 + sizeof(float) * 4;
302 vertdesc.attributes[2].bufferIndex = 0;
303 break;
304 }
305
306 mtlpipedesc.vertexDescriptor = vertdesc;
307
308 rtdesc = mtlpipedesc.colorAttachments[0];
309 rtdesc.pixelFormat = cache->renderTargetFormat;
310
311 if (blendmode != SDL_BLENDMODE_NONE) {
312 rtdesc.blendingEnabled = YES;
313 rtdesc.sourceRGBBlendFactor = GetBlendFactor(SDL_GetBlendModeSrcColorFactor(blendmode));
314 rtdesc.destinationRGBBlendFactor = GetBlendFactor(SDL_GetBlendModeDstColorFactor(blendmode));
315 rtdesc.rgbBlendOperation = GetBlendOperation(SDL_GetBlendModeColorOperation(blendmode));
316 rtdesc.sourceAlphaBlendFactor = GetBlendFactor(SDL_GetBlendModeSrcAlphaFactor(blendmode));
317 rtdesc.destinationAlphaBlendFactor = GetBlendFactor(SDL_GetBlendModeDstAlphaFactor(blendmode));
318 rtdesc.alphaBlendOperation = GetBlendOperation(SDL_GetBlendModeAlphaOperation(blendmode));
319 } else {
320 rtdesc.blendingEnabled = NO;
321 }
322
323 mtlpipedesc.label = [@(cache->label) stringByAppendingString:blendlabel];
324
325 state = [data.mtldevice newRenderPipelineStateWithDescriptor:mtlpipedesc error:&err];
326 SDL_assert(err == nil);
327
328 pipeline.blendMode = blendmode;
329 pipeline.pipe = (void *)CFBridgingRetain(state);
330
331 states = SDL_realloc(cache->states, (cache->count + 1) * sizeof(pipeline));
332
333 if (states) {
334 states[cache->count++] = pipeline;
335 cache->states = states;
336 return (__bridge id<MTLRenderPipelineState>)pipeline.pipe;
337 } else {
338 CFBridgingRelease(pipeline.pipe);
339 return NULL;
340 }
341}
342
343static void MakePipelineCache(SDL3METAL_RenderData *data, METAL_PipelineCache *cache, const char *label,
344 MTLPixelFormat rtformat, SDL_MetalVertexFunction vertfn, SDL_MetalFragmentFunction fragfn)
345{
346 SDL_zerop(cache);
347
348 cache->vertexFunction = vertfn;
349 cache->fragmentFunction = fragfn;
350 cache->renderTargetFormat = rtformat;
351 cache->label = label;
352
353 /* Create pipeline states for the default blend modes. Custom blend modes
354 * will be added to the cache on-demand. */
355 MakePipelineState(data, cache, @" (blend=none)", SDL_BLENDMODE_NONE);
356 MakePipelineState(data, cache, @" (blend=blend)", SDL_BLENDMODE_BLEND);
357 MakePipelineState(data, cache, @" (blend=add)", SDL_BLENDMODE_ADD);
358 MakePipelineState(data, cache, @" (blend=mod)", SDL_BLENDMODE_MOD);
359 MakePipelineState(data, cache, @" (blend=mul)", SDL_BLENDMODE_MUL);
360}
361
362static void DestroyPipelineCache(METAL_PipelineCache *cache)
363{
364 if (cache != NULL) {
365 for (int i = 0; i < cache->count; i++) {
366 CFBridgingRelease(cache->states[i].pipe);
367 }
368
369 SDL_free(cache->states);
370 }
371}
372
373void MakeShaderPipelines(SDL3METAL_RenderData *data, METAL_ShaderPipelines *pipelines, MTLPixelFormat rtformat)
374{
375 SDL_zerop(pipelines);
376
377 pipelines->renderTargetFormat = rtformat;
378
379 MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_SOLID], "SDL primitives pipeline", rtformat, SDL_METAL_VERTEX_SOLID, SDL_METAL_FRAGMENT_SOLID);
380 MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_COPY], "SDL copy pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_COPY);
381 MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_YUV], "SDL YUV pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_YUV);
382 MakePipelineCache(data, &pipelines->caches[SDL_METAL_FRAGMENT_NV12], "SDL NV12 pipeline", rtformat, SDL_METAL_VERTEX_COPY, SDL_METAL_FRAGMENT_NV12);
383}
384
385static METAL_ShaderPipelines *ChooseShaderPipelines(SDL3METAL_RenderData *data, MTLPixelFormat rtformat)
386{
387 METAL_ShaderPipelines *allpipelines = data.allpipelines;
388 int count = data.pipelinescount;
389
390 for (int i = 0; i < count; i++) {
391 if (allpipelines[i].renderTargetFormat == rtformat) {
392 return &allpipelines[i];
393 }
394 }
395
396 allpipelines = SDL_realloc(allpipelines, (count + 1) * sizeof(METAL_ShaderPipelines));
397
398 if (allpipelines == NULL) {
399 return NULL;
400 }
401
402 MakeShaderPipelines(data, &allpipelines[count], rtformat);
403
404 data.allpipelines = allpipelines;
405 data.pipelinescount = count + 1;
406
407 return &data.allpipelines[count];
408}
409
410static void DestroyAllPipelines(METAL_ShaderPipelines *allpipelines, int count)
411{
412 if (allpipelines != NULL) {
413 for (int i = 0; i < count; i++) {
414 for (int cache = 0; cache < SDL_METAL_FRAGMENT_COUNT; cache++) {
415 DestroyPipelineCache(&allpipelines[i].caches[cache]);
416 }
417 }
418
419 SDL_free(allpipelines);
420 }
421}
422
423static inline id<MTLRenderPipelineState> ChoosePipelineState(SDL3METAL_RenderData *data, METAL_ShaderPipelines *pipelines, SDL_MetalFragmentFunction fragfn, SDL_BlendMode blendmode)
424{
425 METAL_PipelineCache *cache = &pipelines->caches[fragfn];
426
427 for (int i = 0; i < cache->count; i++) {
428 if (cache->states[i].blendMode == blendmode) {
429 return (__bridge id<MTLRenderPipelineState>)cache->states[i].pipe;
430 }
431 }
432
433 return MakePipelineState(data, cache, [NSString stringWithFormat:@" (blend=custom 0x%x)", blendmode], blendmode);
434}
435
436static bool METAL_ActivateRenderCommandEncoder(SDL_Renderer *renderer, MTLLoadAction load, MTLClearColor *clear_color, id<MTLBuffer> vertex_buffer)
437{
438 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
439
440 /* Our SetRenderTarget just signals that the next render operation should
441 * set up a new render pass. This is where that work happens. */
442 if (data.mtlcmdencoder == nil) {
443 id<MTLTexture> mtltexture = nil;
444
445 if (renderer->target != NULL) {
446 SDL3METAL_TextureData *texdata = (__bridge SDL3METAL_TextureData *)renderer->target->internal;
447 mtltexture = texdata.mtltexture;
448 } else {
449 if (data.mtlbackbuffer == nil) {
450 /* The backbuffer's contents aren't guaranteed to persist after
451 * presenting, so we can leave it undefined when loading it. */
452 data.mtlbackbuffer = [data.mtllayer nextDrawable];
453 if (load == MTLLoadActionLoad) {
454 load = MTLLoadActionDontCare;
455 }
456 }
457 if (data.mtlbackbuffer != nil) {
458 mtltexture = data.mtlbackbuffer.texture;
459 }
460 }
461
462 /* mtltexture can be nil here if macOS refused to give us a drawable,
463 which apparently can happen for minimized windows, etc. */
464 if (mtltexture == nil) {
465 return false;
466 }
467
468 if (load == MTLLoadActionClear) {
469 SDL_assert(clear_color != NULL);
470 data.mtlpassdesc.colorAttachments[0].clearColor = *clear_color;
471 }
472
473 data.mtlpassdesc.colorAttachments[0].loadAction = load;
474 data.mtlpassdesc.colorAttachments[0].texture = mtltexture;
475
476 data.mtlcmdbuffer = [data.mtlcmdqueue commandBuffer];
477 data.mtlcmdencoder = [data.mtlcmdbuffer renderCommandEncoderWithDescriptor:data.mtlpassdesc];
478
479 if (data.mtlbackbuffer != nil && mtltexture == data.mtlbackbuffer.texture) {
480 data.mtlcmdencoder.label = @"SDL metal renderer backbuffer";
481 } else {
482 data.mtlcmdencoder.label = @"SDL metal renderer render target";
483 }
484
485 /* Set up buffer bindings for positions, texcoords, and color once here,
486 * the offsets are adjusted in the code that uses them. */
487 if (vertex_buffer != nil) {
488 [data.mtlcmdencoder setVertexBuffer:vertex_buffer offset:0 atIndex:0];
489 [data.mtlcmdencoder setFragmentBuffer:vertex_buffer offset:0 atIndex:0];
490 }
491
492 data.activepipelines = ChooseShaderPipelines(data, mtltexture.pixelFormat);
493
494 // make sure this has a definite place in the queue. This way it will
495 // execute reliably whether the app tries to make its own command buffers
496 // or whatever. This means we can _always_ batch rendering commands!
497 [data.mtlcmdbuffer enqueue];
498 }
499
500 return true;
501}
502
503static void METAL_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
504{
505}
506
507static bool METAL_GetOutputSize(SDL_Renderer *renderer, int *w, int *h)
508{
509 @autoreleasepool {
510 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
511 if (w) {
512 *w = (int)data.mtllayer.drawableSize.width;
513 }
514 if (h) {
515 *h = (int)data.mtllayer.drawableSize.height;
516 }
517 return true;
518 }
519}
520
521static bool METAL_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
522{
523 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
524 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
525 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
526 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
527 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
528 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
529
530 if (GetBlendFactor(srcColorFactor) == invalidBlendFactor ||
531 GetBlendFactor(srcAlphaFactor) == invalidBlendFactor ||
532 GetBlendOperation(colorOperation) == invalidBlendOperation ||
533 GetBlendFactor(dstColorFactor) == invalidBlendFactor ||
534 GetBlendFactor(dstAlphaFactor) == invalidBlendFactor ||
535 GetBlendOperation(alphaOperation) == invalidBlendOperation) {
536 return false;
537 }
538 return true;
539}
540
541size_t GetBT601ConversionMatrix(SDL_Colorspace colorspace)
542{
543 switch (SDL_COLORSPACERANGE(colorspace)) {
544 case SDL_COLOR_RANGE_LIMITED:
545 case SDL_COLOR_RANGE_UNKNOWN:
546 return CONSTANTS_OFFSET_DECODE_BT601_LIMITED;
547 case SDL_COLOR_RANGE_FULL:
548 return CONSTANTS_OFFSET_DECODE_BT601_FULL;
549 default:
550 break;
551 }
552 return 0;
553}
554
555size_t GetBT709ConversionMatrix(SDL_Colorspace colorspace)
556{
557 switch (SDL_COLORSPACERANGE(colorspace)) {
558 case SDL_COLOR_RANGE_LIMITED:
559 case SDL_COLOR_RANGE_UNKNOWN:
560 return CONSTANTS_OFFSET_DECODE_BT709_LIMITED;
561 case SDL_COLOR_RANGE_FULL:
562 return CONSTANTS_OFFSET_DECODE_BT709_FULL;
563 default:
564 break;
565 }
566 return 0;
567}
568
569size_t GetBT2020ConversionMatrix(SDL_Colorspace colorspace)
570{
571 switch (SDL_COLORSPACERANGE(colorspace)) {
572 case SDL_COLOR_RANGE_LIMITED:
573 case SDL_COLOR_RANGE_UNKNOWN:
574 return CONSTANTS_OFFSET_DECODE_BT2020_LIMITED;
575 case SDL_COLOR_RANGE_FULL:
576 return CONSTANTS_OFFSET_DECODE_BT2020_FULL;
577 default:
578 break;
579 }
580 return 0;
581}
582
583size_t GetYCbCRtoRGBConversionMatrix(SDL_Colorspace colorspace, int w, int h, int bits_per_pixel)
584{
585 const int YUV_SD_THRESHOLD = 576;
586
587 switch (SDL_COLORSPACEMATRIX(colorspace)) {
588 case SDL_MATRIX_COEFFICIENTS_BT470BG:
589 case SDL_MATRIX_COEFFICIENTS_BT601:
590 return GetBT601ConversionMatrix(colorspace);
591
592 case SDL_MATRIX_COEFFICIENTS_BT709:
593 return GetBT709ConversionMatrix(colorspace);
594
595 case SDL_MATRIX_COEFFICIENTS_BT2020_NCL:
596 return GetBT2020ConversionMatrix(colorspace);
597
598 case SDL_MATRIX_COEFFICIENTS_UNSPECIFIED:
599 switch (bits_per_pixel) {
600 case 8:
601 if (h <= YUV_SD_THRESHOLD) {
602 return GetBT601ConversionMatrix(colorspace);
603 } else {
604 return GetBT709ConversionMatrix(colorspace);
605 }
606 case 10:
607 case 16:
608 return GetBT2020ConversionMatrix(colorspace);
609 default:
610 break;
611 }
612 break;
613 default:
614 break;
615 }
616 return 0;
617}
618
619static bool METAL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
620{
621 @autoreleasepool {
622 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
623 MTLPixelFormat pixfmt;
624 MTLTextureDescriptor *mtltexdesc;
625 id<MTLTexture> mtltexture = nil, mtltextureUv = nil;
626 SDL3METAL_TextureData *texturedata;
627 CVPixelBufferRef pixelbuffer = nil;
628 IOSurfaceRef surface = nil;
629
630 pixelbuffer = SDL_GetPointerProperty(create_props, SDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER, nil);
631 if (pixelbuffer) {
632 surface = CVPixelBufferGetIOSurface(pixelbuffer);
633 if (!surface) {
634 return SDL_SetError("CVPixelBufferGetIOSurface() failed");
635 }
636 }
637
638 switch (texture->format) {
639 case SDL_PIXELFORMAT_ABGR8888:
640 if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
641 pixfmt = MTLPixelFormatRGBA8Unorm_sRGB;
642 } else {
643 pixfmt = MTLPixelFormatRGBA8Unorm;
644 }
645 break;
646 case SDL_PIXELFORMAT_ARGB8888:
647 if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
648 pixfmt = MTLPixelFormatBGRA8Unorm_sRGB;
649 } else {
650 pixfmt = MTLPixelFormatBGRA8Unorm;
651 }
652 break;
653 case SDL_PIXELFORMAT_ABGR2101010:
654 pixfmt = MTLPixelFormatRGB10A2Unorm;
655 break;
656 case SDL_PIXELFORMAT_IYUV:
657 case SDL_PIXELFORMAT_YV12:
658 case SDL_PIXELFORMAT_NV12:
659 case SDL_PIXELFORMAT_NV21:
660 pixfmt = MTLPixelFormatR8Unorm;
661 break;
662 case SDL_PIXELFORMAT_P010:
663 pixfmt = MTLPixelFormatR16Unorm;
664 break;
665 case SDL_PIXELFORMAT_RGBA64_FLOAT:
666 pixfmt = MTLPixelFormatRGBA16Float;
667 break;
668 case SDL_PIXELFORMAT_RGBA128_FLOAT:
669 pixfmt = MTLPixelFormatRGBA32Float;
670 break;
671 default:
672 return SDL_SetError("Texture format %s not supported by Metal", SDL_GetPixelFormatName(texture->format));
673 }
674
675 mtltexdesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:pixfmt
676 width:(NSUInteger)texture->w
677 height:(NSUInteger)texture->h
678 mipmapped:NO];
679
680 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
681 mtltexdesc.usage = MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget;
682 } else {
683 mtltexdesc.usage = MTLTextureUsageShaderRead;
684 }
685
686 if (surface) {
687 mtltexture = [data.mtldevice newTextureWithDescriptor:mtltexdesc iosurface:surface plane:0];
688 } else {
689 mtltexture = [data.mtldevice newTextureWithDescriptor:mtltexdesc];
690 }
691 if (mtltexture == nil) {
692 return SDL_SetError("Texture allocation failed");
693 }
694
695 mtltextureUv = nil;
696#ifdef SDL_HAVE_YUV
697 BOOL yuv = (texture->format == SDL_PIXELFORMAT_IYUV || texture->format == SDL_PIXELFORMAT_YV12);
698 BOOL nv12 = (texture->format == SDL_PIXELFORMAT_NV12 || texture->format == SDL_PIXELFORMAT_NV21 || texture->format == SDL_PIXELFORMAT_P010);
699
700 if (yuv) {
701 mtltexdesc.pixelFormat = MTLPixelFormatR8Unorm;
702 mtltexdesc.width = (texture->w + 1) / 2;
703 mtltexdesc.height = (texture->h + 1) / 2;
704 mtltexdesc.textureType = MTLTextureType2DArray;
705 mtltexdesc.arrayLength = 2;
706 } else if (texture->format == SDL_PIXELFORMAT_P010) {
707 mtltexdesc.pixelFormat = MTLPixelFormatRG16Unorm;
708 mtltexdesc.width = (texture->w + 1) / 2;
709 mtltexdesc.height = (texture->h + 1) / 2;
710 } else if (nv12) {
711 mtltexdesc.pixelFormat = MTLPixelFormatRG8Unorm;
712 mtltexdesc.width = (texture->w + 1) / 2;
713 mtltexdesc.height = (texture->h + 1) / 2;
714 }
715
716 if (yuv || nv12) {
717 if (surface) {
718 mtltextureUv = [data.mtldevice newTextureWithDescriptor:mtltexdesc iosurface:surface plane:1];
719 } else {
720 mtltextureUv = [data.mtldevice newTextureWithDescriptor:mtltexdesc];
721 }
722 if (mtltextureUv == nil) {
723 return SDL_SetError("Texture allocation failed");
724 }
725 }
726#endif // SDL_HAVE_YUV
727 texturedata = [[SDL3METAL_TextureData alloc] init];
728#ifdef SDL_HAVE_YUV
729 if (yuv) {
730 texturedata.fragmentFunction = SDL_METAL_FRAGMENT_YUV;
731 } else if (nv12) {
732 texturedata.fragmentFunction = SDL_METAL_FRAGMENT_NV12;
733 } else
734#endif
735 {
736 texturedata.fragmentFunction = SDL_METAL_FRAGMENT_COPY;
737 }
738 texturedata.mtltexture = mtltexture;
739 texturedata.mtltextureUv = mtltextureUv;
740#ifdef SDL_HAVE_YUV
741 texturedata.yuv = yuv;
742 texturedata.nv12 = nv12;
743 if (yuv || nv12) {
744 size_t offset = GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8);
745 if (offset == 0) {
746 return SDL_SetError("Unsupported YUV colorspace");
747 }
748 texturedata.conversionBufferOffset = offset;
749 }
750#endif
751 texture->internal = (void *)CFBridgingRetain(texturedata);
752
753 return true;
754 }
755}
756
757static void METAL_UploadTextureData(id<MTLTexture> texture, SDL_Rect rect, int slice,
758 const void *pixels, int pitch)
759{
760 [texture replaceRegion:MTLRegionMake2D(rect.x, rect.y, rect.w, rect.h)
761 mipmapLevel:0
762 slice:slice
763 withBytes:pixels
764 bytesPerRow:pitch
765 bytesPerImage:0];
766}
767
768static MTLStorageMode METAL_GetStorageMode(id<MTLResource> resource)
769{
770 return resource.storageMode;
771}
772
773static bool METAL_UpdateTextureInternal(SDL_Renderer *renderer, SDL3METAL_TextureData *texturedata,
774 id<MTLTexture> texture, SDL_Rect rect, int slice,
775 const void *pixels, int pitch)
776{
777 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
778 SDL_Rect stagingrect = { 0, 0, rect.w, rect.h };
779 MTLTextureDescriptor *desc;
780 id<MTLTexture> stagingtex;
781 id<MTLBlitCommandEncoder> blitcmd;
782
783 /* If the texture is managed or shared and this is the first upload, we can
784 * use replaceRegion to upload to it directly. Otherwise we upload the data
785 * to a staging texture and copy that over. */
786 if (!texturedata.hasdata && METAL_GetStorageMode(texture) != MTLStorageModePrivate) {
787 METAL_UploadTextureData(texture, rect, slice, pixels, pitch);
788 return true;
789 }
790
791 desc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:texture.pixelFormat
792 width:rect.w
793 height:rect.h
794 mipmapped:NO];
795
796 if (desc == nil) {
797 return SDL_OutOfMemory();
798 }
799
800 /* TODO: We could have a pool of textures or a MTLHeap we allocate from,
801 * and release a staging texture back to the pool in the command buffer's
802 * completion handler. */
803 stagingtex = [data.mtldevice newTextureWithDescriptor:desc];
804 if (stagingtex == nil) {
805 return SDL_OutOfMemory();
806 }
807
808 METAL_UploadTextureData(stagingtex, stagingrect, 0, pixels, pitch);
809
810 if (data.mtlcmdencoder != nil) {
811 [data.mtlcmdencoder endEncoding];
812 data.mtlcmdencoder = nil;
813 }
814
815 if (data.mtlcmdbuffer == nil) {
816 data.mtlcmdbuffer = [data.mtlcmdqueue commandBuffer];
817 }
818
819 blitcmd = [data.mtlcmdbuffer blitCommandEncoder];
820
821 [blitcmd copyFromTexture:stagingtex
822 sourceSlice:0
823 sourceLevel:0
824 sourceOrigin:MTLOriginMake(0, 0, 0)
825 sourceSize:MTLSizeMake(rect.w, rect.h, 1)
826 toTexture:texture
827 destinationSlice:slice
828 destinationLevel:0
829 destinationOrigin:MTLOriginMake(rect.x, rect.y, 0)];
830
831 [blitcmd endEncoding];
832
833 /* TODO: This isn't very efficient for the YUV formats, which call
834 * UpdateTextureInternal multiple times in a row. */
835 [data.mtlcmdbuffer commit];
836 data.mtlcmdbuffer = nil;
837
838 return true;
839}
840
841static bool METAL_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
842 const SDL_Rect *rect, const void *pixels, int pitch)
843{
844 @autoreleasepool {
845 SDL3METAL_TextureData *texturedata = (__bridge SDL3METAL_TextureData *)texture->internal;
846
847 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltexture, *rect, 0, pixels, pitch)) {
848 return false;
849 }
850#ifdef SDL_HAVE_YUV
851 if (texturedata.yuv) {
852 int Uslice = texture->format == SDL_PIXELFORMAT_YV12 ? 1 : 0;
853 int Vslice = texture->format == SDL_PIXELFORMAT_YV12 ? 0 : 1;
854 int UVpitch = (pitch + 1) / 2;
855 SDL_Rect UVrect = { rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2 };
856
857 // Skip to the correct offset into the next texture
858 pixels = (const void *)((const Uint8 *)pixels + rect->h * pitch);
859 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltextureUv, UVrect, Uslice, pixels, UVpitch)) {
860 return false;
861 }
862
863 // Skip to the correct offset into the next texture
864 pixels = (const void *)((const Uint8 *)pixels + UVrect.h * UVpitch);
865 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltextureUv, UVrect, Vslice, pixels, UVpitch)) {
866 return false;
867 }
868 }
869
870 if (texturedata.nv12) {
871 SDL_Rect UVrect = { rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2 };
872 int UVpitch = 2 * ((pitch + 1) / 2);
873
874 // Skip to the correct offset into the next texture
875 pixels = (const void *)((const Uint8 *)pixels + rect->h * pitch);
876 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltextureUv, UVrect, 0, pixels, UVpitch)) {
877 return false;
878 }
879 }
880#endif
881 texturedata.hasdata = YES;
882
883 return true;
884 }
885}
886
887#ifdef SDL_HAVE_YUV
888static bool METAL_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
889 const SDL_Rect *rect,
890 const Uint8 *Yplane, int Ypitch,
891 const Uint8 *Uplane, int Upitch,
892 const Uint8 *Vplane, int Vpitch)
893{
894 @autoreleasepool {
895 SDL3METAL_TextureData *texturedata = (__bridge SDL3METAL_TextureData *)texture->internal;
896 const int Uslice = 0;
897 const int Vslice = 1;
898 SDL_Rect UVrect = { rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2 };
899
900 // Bail out if we're supposed to update an empty rectangle
901 if (rect->w <= 0 || rect->h <= 0) {
902 return true;
903 }
904
905 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltexture, *rect, 0, Yplane, Ypitch)) {
906 return false;
907 }
908 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltextureUv, UVrect, Uslice, Uplane, Upitch)) {
909 return false;
910 }
911 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltextureUv, UVrect, Vslice, Vplane, Vpitch)) {
912 return false;
913 }
914
915 texturedata.hasdata = YES;
916
917 return true;
918 }
919}
920
921static bool METAL_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
922 const SDL_Rect *rect,
923 const Uint8 *Yplane, int Ypitch,
924 const Uint8 *UVplane, int UVpitch)
925{
926 @autoreleasepool {
927 SDL3METAL_TextureData *texturedata = (__bridge SDL3METAL_TextureData *)texture->internal;
928 SDL_Rect UVrect = { rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2 };
929
930 // Bail out if we're supposed to update an empty rectangle
931 if (rect->w <= 0 || rect->h <= 0) {
932 return true;
933 }
934
935 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltexture, *rect, 0, Yplane, Ypitch)) {
936 return false;
937 }
938
939 if (!METAL_UpdateTextureInternal(renderer, texturedata, texturedata.mtltextureUv, UVrect, 0, UVplane, UVpitch)) {
940 return false;
941 }
942
943 texturedata.hasdata = YES;
944
945 return true;
946 }
947}
948#endif
949
950static bool METAL_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
951 const SDL_Rect *rect, void **pixels, int *pitch)
952{
953 @autoreleasepool {
954 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
955 SDL3METAL_TextureData *texturedata = (__bridge SDL3METAL_TextureData *)texture->internal;
956 int buffersize = 0;
957 id<MTLBuffer> lockedbuffer = nil;
958
959 if (rect->w <= 0 || rect->h <= 0) {
960 return SDL_SetError("Invalid rectangle dimensions for LockTexture.");
961 }
962
963 *pitch = SDL_BYTESPERPIXEL(texture->format) * rect->w;
964#ifdef SDL_HAVE_YUV
965 if (texturedata.yuv || texturedata.nv12) {
966 buffersize = ((*pitch) * rect->h) + (2 * (*pitch + 1) / 2) * ((rect->h + 1) / 2);
967 } else
968#endif
969 {
970 buffersize = (*pitch) * rect->h;
971 }
972
973 lockedbuffer = [data.mtldevice newBufferWithLength:buffersize options:MTLResourceStorageModeShared];
974 if (lockedbuffer == nil) {
975 return SDL_OutOfMemory();
976 }
977
978 texturedata.lockedrect = *rect;
979 texturedata.lockedbuffer = lockedbuffer;
980 *pixels = [lockedbuffer contents];
981
982 return true;
983 }
984}
985
986static void METAL_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
987{
988 @autoreleasepool {
989 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
990 SDL3METAL_TextureData *texturedata = (__bridge SDL3METAL_TextureData *)texture->internal;
991 id<MTLBlitCommandEncoder> blitcmd;
992 SDL_Rect rect = texturedata.lockedrect;
993 int pitch = SDL_BYTESPERPIXEL(texture->format) * rect.w;
994#ifdef SDL_HAVE_YUV
995 SDL_Rect UVrect = { rect.x / 2, rect.y / 2, (rect.w + 1) / 2, (rect.h + 1) / 2 };
996#endif
997
998 if (texturedata.lockedbuffer == nil) {
999 return;
1000 }
1001
1002 if (data.mtlcmdencoder != nil) {
1003 [data.mtlcmdencoder endEncoding];
1004 data.mtlcmdencoder = nil;
1005 }
1006
1007 if (data.mtlcmdbuffer == nil) {
1008 data.mtlcmdbuffer = [data.mtlcmdqueue commandBuffer];
1009 }
1010
1011 blitcmd = [data.mtlcmdbuffer blitCommandEncoder];
1012
1013 [blitcmd copyFromBuffer:texturedata.lockedbuffer
1014 sourceOffset:0
1015 sourceBytesPerRow:pitch
1016 sourceBytesPerImage:0
1017 sourceSize:MTLSizeMake(rect.w, rect.h, 1)
1018 toTexture:texturedata.mtltexture
1019 destinationSlice:0
1020 destinationLevel:0
1021 destinationOrigin:MTLOriginMake(rect.x, rect.y, 0)];
1022#ifdef SDL_HAVE_YUV
1023 if (texturedata.yuv) {
1024 int Uslice = texture->format == SDL_PIXELFORMAT_YV12 ? 1 : 0;
1025 int Vslice = texture->format == SDL_PIXELFORMAT_YV12 ? 0 : 1;
1026 int UVpitch = (pitch + 1) / 2;
1027
1028 [blitcmd copyFromBuffer:texturedata.lockedbuffer
1029 sourceOffset:rect.h * pitch
1030 sourceBytesPerRow:UVpitch
1031 sourceBytesPerImage:UVpitch * UVrect.h
1032 sourceSize:MTLSizeMake(UVrect.w, UVrect.h, 1)
1033 toTexture:texturedata.mtltextureUv
1034 destinationSlice:Uslice
1035 destinationLevel:0
1036 destinationOrigin:MTLOriginMake(UVrect.x, UVrect.y, 0)];
1037
1038 [blitcmd copyFromBuffer:texturedata.lockedbuffer
1039 sourceOffset:(rect.h * pitch) + UVrect.h * UVpitch
1040 sourceBytesPerRow:UVpitch
1041 sourceBytesPerImage:UVpitch * UVrect.h
1042 sourceSize:MTLSizeMake(UVrect.w, UVrect.h, 1)
1043 toTexture:texturedata.mtltextureUv
1044 destinationSlice:Vslice
1045 destinationLevel:0
1046 destinationOrigin:MTLOriginMake(UVrect.x, UVrect.y, 0)];
1047 }
1048
1049 if (texturedata.nv12) {
1050 int UVpitch = 2 * ((pitch + 1) / 2);
1051
1052 [blitcmd copyFromBuffer:texturedata.lockedbuffer
1053 sourceOffset:rect.h * pitch
1054 sourceBytesPerRow:UVpitch
1055 sourceBytesPerImage:0
1056 sourceSize:MTLSizeMake(UVrect.w, UVrect.h, 1)
1057 toTexture:texturedata.mtltextureUv
1058 destinationSlice:0
1059 destinationLevel:0
1060 destinationOrigin:MTLOriginMake(UVrect.x, UVrect.y, 0)];
1061 }
1062#endif
1063 [blitcmd endEncoding];
1064
1065 [data.mtlcmdbuffer commit];
1066 data.mtlcmdbuffer = nil;
1067
1068 texturedata.lockedbuffer = nil; // Retained property, so it calls release.
1069 texturedata.hasdata = YES;
1070 }
1071}
1072
1073static void METAL_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
1074{
1075}
1076
1077static bool METAL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
1078{
1079 @autoreleasepool {
1080 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1081
1082 if (data.mtlcmdencoder) {
1083 /* End encoding for the previous render target so we can set up a new
1084 * render pass for this one. */
1085 [data.mtlcmdencoder endEncoding];
1086 [data.mtlcmdbuffer commit];
1087
1088 data.mtlcmdencoder = nil;
1089 data.mtlcmdbuffer = nil;
1090 }
1091
1092 /* We don't begin a new render pass right away - we delay it until an actual
1093 * draw or clear happens. That way we can use hardware clears when possible,
1094 * which are only available when beginning a new render pass. */
1095 return true;
1096 }
1097}
1098
1099static bool METAL_QueueSetViewport(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
1100{
1101 float projection[4][4]; // Prepare an orthographic projection
1102 const int w = cmd->data.viewport.rect.w;
1103 const int h = cmd->data.viewport.rect.h;
1104 const size_t matrixlen = sizeof(projection);
1105 float *matrix = (float *)SDL_AllocateRenderVertices(renderer, matrixlen, CONSTANT_ALIGN(16), &cmd->data.viewport.first);
1106 if (!matrix) {
1107 return false;
1108 }
1109
1110 SDL_memset(projection, '\0', matrixlen);
1111 if (w && h) {
1112 projection[0][0] = 2.0f / w;
1113 projection[1][1] = -2.0f / h;
1114 projection[3][0] = -1.0f;
1115 projection[3][1] = 1.0f;
1116 projection[3][3] = 1.0f;
1117 }
1118 SDL_memcpy(matrix, projection, matrixlen);
1119
1120 return true;
1121}
1122
1123static bool METAL_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
1124{
1125 return true; // nothing to do in this backend.
1126}
1127
1128static bool METAL_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
1129{
1130 SDL_FColor color = cmd->data.draw.color;
1131 bool convert_color = SDL_RenderingLinearSpace(renderer);
1132
1133 const size_t vertlen = (2 * sizeof(float) + 4 * sizeof(float)) * count;
1134 float *verts = (float *)SDL_AllocateRenderVertices(renderer, vertlen, DEVICE_ALIGN(8), &cmd->data.draw.first);
1135 if (!verts) {
1136 return false;
1137 }
1138 cmd->data.draw.count = count;
1139
1140 if (convert_color) {
1141 SDL_ConvertToLinear(&color);
1142 }
1143
1144 for (int i = 0; i < count; i++, points++) {
1145 *(verts++) = points->x;
1146 *(verts++) = points->y;
1147 *(verts++) = color.r;
1148 *(verts++) = color.g;
1149 *(verts++) = color.b;
1150 *(verts++) = color.a;
1151 }
1152 return true;
1153}
1154
1155static bool METAL_QueueDrawLines(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
1156{
1157 SDL_FColor color = cmd->data.draw.color;
1158 bool convert_color = SDL_RenderingLinearSpace(renderer);
1159 size_t vertlen;
1160 float *verts;
1161
1162 SDL_assert(count >= 2); // should have been checked at the higher level.
1163
1164 vertlen = (2 * sizeof(float) + 4 * sizeof(float)) * count;
1165 verts = (float *)SDL_AllocateRenderVertices(renderer, vertlen, DEVICE_ALIGN(8), &cmd->data.draw.first);
1166 if (!verts) {
1167 return false;
1168 }
1169 cmd->data.draw.count = count;
1170
1171 if (convert_color) {
1172 SDL_ConvertToLinear(&color);
1173 }
1174
1175 for (int i = 0; i < count; i++, points++) {
1176 *(verts++) = points->x;
1177 *(verts++) = points->y;
1178 *(verts++) = color.r;
1179 *(verts++) = color.g;
1180 *(verts++) = color.b;
1181 *(verts++) = color.a;
1182 }
1183
1184 /* If the line segment is completely horizontal or vertical,
1185 make it one pixel longer, to satisfy the diamond-exit rule.
1186 We should probably do this for diagonal lines too, but we'd have to
1187 do some trigonometry to figure out the correct pixel and generally
1188 when we have problems with pixel perfection, it's for straight lines
1189 that are missing a pixel that frames something and not arbitrary
1190 angles. Maybe !!! FIXME for later, though. */
1191
1192 points -= 2; // update the last line.
1193 verts -= 2 + 1;
1194
1195 {
1196 const float xstart = points[0].x;
1197 const float ystart = points[0].y;
1198 const float xend = points[1].x;
1199 const float yend = points[1].y;
1200
1201 if (ystart == yend) { // horizontal line
1202 verts[0] += (xend > xstart) ? 1.0f : -1.0f;
1203 } else if (xstart == xend) { // vertical line
1204 verts[1] += (yend > ystart) ? 1.0f : -1.0f;
1205 }
1206 }
1207
1208 return true;
1209}
1210
1211static bool METAL_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
1212 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
1213 int num_vertices, const void *indices, int num_indices, int size_indices,
1214 float scale_x, float scale_y)
1215{
1216 bool convert_color = SDL_RenderingLinearSpace(renderer);
1217 int count = indices ? num_indices : num_vertices;
1218 const size_t vertlen = (2 * sizeof(float) + 4 * sizeof(float) + (texture ? 2 : 0) * sizeof(float)) * count;
1219 float *verts = (float *)SDL_AllocateRenderVertices(renderer, vertlen, DEVICE_ALIGN(8), &cmd->data.draw.first);
1220 if (!verts) {
1221 return false;
1222 }
1223
1224 cmd->data.draw.count = count;
1225 size_indices = indices ? size_indices : 0;
1226
1227 for (int i = 0; i < count; i++) {
1228 int j;
1229 float *xy_;
1230 SDL_FColor col_;
1231 if (size_indices == 4) {
1232 j = ((const Uint32 *)indices)[i];
1233 } else if (size_indices == 2) {
1234 j = ((const Uint16 *)indices)[i];
1235 } else if (size_indices == 1) {
1236 j = ((const Uint8 *)indices)[i];
1237 } else {
1238 j = i;
1239 }
1240
1241 xy_ = (float *)((char *)xy + j * xy_stride);
1242
1243 *(verts++) = xy_[0] * scale_x;
1244 *(verts++) = xy_[1] * scale_y;
1245
1246 col_ = *(SDL_FColor *)((char *)color + j * color_stride);
1247
1248 if (convert_color) {
1249 SDL_ConvertToLinear(&col_);
1250 }
1251
1252 *(verts++) = col_.r;
1253 *(verts++) = col_.g;
1254 *(verts++) = col_.b;
1255 *(verts++) = col_.a;
1256
1257 if (texture) {
1258 float *uv_ = (float *)((char *)uv + j * uv_stride);
1259 *(verts++) = uv_[0];
1260 *(verts++) = uv_[1];
1261 }
1262 }
1263
1264 return true;
1265}
1266
1267// These should mirror the definitions in SDL_shaders_metal.metal
1268//static const float TONEMAP_NONE = 0;
1269//static const float TONEMAP_LINEAR = 1;
1270static const float TONEMAP_CHROME = 2;
1271
1272//static const float TEXTURETYPE_NONE = 0;
1273static const float TEXTURETYPE_RGB = 1;
1274static const float TEXTURETYPE_NV12 = 2;
1275static const float TEXTURETYPE_NV21 = 3;
1276static const float TEXTURETYPE_YUV = 4;
1277
1278//static const float INPUTTYPE_UNSPECIFIED = 0;
1279static const float INPUTTYPE_SRGB = 1;
1280static const float INPUTTYPE_SCRGB = 2;
1281static const float INPUTTYPE_HDR10 = 3;
1282
1283typedef struct
1284{
1285 float scRGB_output;
1286 float texture_type;
1287 float input_type;
1288 float color_scale;
1289
1290 float tonemap_method;
1291 float tonemap_factor1;
1292 float tonemap_factor2;
1293 float sdr_white_point;
1294} PixelShaderConstants;
1295
1296typedef struct
1297{
1298 __unsafe_unretained id<MTLRenderPipelineState> pipeline;
1299 __unsafe_unretained id<MTLBuffer> vertex_buffer;
1300 size_t constants_offset;
1301 SDL_Texture *texture;
1302 bool cliprect_dirty;
1303 bool cliprect_enabled;
1304 SDL_Rect cliprect;
1305 bool viewport_dirty;
1306 SDL_Rect viewport;
1307 size_t projection_offset;
1308 bool shader_constants_dirty;
1309 PixelShaderConstants shader_constants;
1310} METAL_DrawStateCache;
1311
1312static void SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const SDL_Texture *texture, PixelShaderConstants *constants)
1313{
1314 float output_headroom;
1315
1316 SDL_zerop(constants);
1317
1318 constants->scRGB_output = (float)SDL_RenderingLinearSpace(renderer);
1319 constants->color_scale = cmd->data.draw.color_scale;
1320
1321 if (texture) {
1322 switch (texture->format) {
1323 case SDL_PIXELFORMAT_YV12:
1324 case SDL_PIXELFORMAT_IYUV:
1325 constants->texture_type = TEXTURETYPE_YUV;
1326 break;
1327 case SDL_PIXELFORMAT_NV12:
1328 constants->texture_type = TEXTURETYPE_NV12;
1329 break;
1330 case SDL_PIXELFORMAT_NV21:
1331 constants->texture_type = TEXTURETYPE_NV21;
1332 break;
1333 case SDL_PIXELFORMAT_P010:
1334 constants->texture_type = TEXTURETYPE_NV12;
1335 break;
1336 default:
1337 constants->texture_type = TEXTURETYPE_RGB;
1338 }
1339
1340 switch (SDL_COLORSPACETRANSFER(texture->colorspace)) {
1341 case SDL_TRANSFER_CHARACTERISTICS_LINEAR:
1342 constants->input_type = INPUTTYPE_SCRGB;
1343 break;
1344 case SDL_TRANSFER_CHARACTERISTICS_PQ:
1345 constants->input_type = INPUTTYPE_HDR10;
1346 break;
1347 default:
1348 constants->input_type = INPUTTYPE_SRGB;
1349 break;
1350 }
1351
1352 constants->sdr_white_point = texture->SDR_white_point;
1353
1354 if (renderer->target) {
1355 output_headroom = renderer->target->HDR_headroom;
1356 } else {
1357 output_headroom = renderer->HDR_headroom;
1358 }
1359
1360 if (texture->HDR_headroom > output_headroom) {
1361 constants->tonemap_method = TONEMAP_CHROME;
1362 constants->tonemap_factor1 = (output_headroom / (texture->HDR_headroom * texture->HDR_headroom));
1363 constants->tonemap_factor2 = (1.0f / output_headroom);
1364 }
1365 }
1366}
1367
1368static bool SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const SDL_MetalFragmentFunction shader, PixelShaderConstants *shader_constants, const size_t constants_offset, id<MTLBuffer> mtlbufvertex, METAL_DrawStateCache *statecache)
1369{
1370 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1371 const SDL_BlendMode blend = cmd->data.draw.blend;
1372 size_t first = cmd->data.draw.first;
1373 id<MTLRenderPipelineState> newpipeline;
1374 PixelShaderConstants solid_constants;
1375
1376 if (!METAL_ActivateRenderCommandEncoder(renderer, MTLLoadActionLoad, NULL, statecache->vertex_buffer)) {
1377 return false;
1378 }
1379
1380 if (statecache->viewport_dirty) {
1381 MTLViewport viewport;
1382 viewport.originX = statecache->viewport.x;
1383 viewport.originY = statecache->viewport.y;
1384 viewport.width = statecache->viewport.w;
1385 viewport.height = statecache->viewport.h;
1386 viewport.znear = 0.0;
1387 viewport.zfar = 1.0;
1388 [data.mtlcmdencoder setViewport:viewport];
1389 [data.mtlcmdencoder setVertexBuffer:mtlbufvertex offset:statecache->projection_offset atIndex:2]; // projection
1390 statecache->viewport_dirty = false;
1391 }
1392
1393 if (statecache->cliprect_dirty) {
1394 SDL_Rect output;
1395 SDL_Rect clip;
1396 if (statecache->cliprect_enabled) {
1397 clip = statecache->cliprect;
1398 clip.x += statecache->viewport.x;
1399 clip.y += statecache->viewport.y;
1400 } else {
1401 clip = statecache->viewport;
1402 }
1403
1404 // Set Scissor Rect Validation: w/h must be <= render pass
1405 SDL_zero(output);
1406
1407 if (renderer->target) {
1408 output.w = renderer->target->w;
1409 output.h = renderer->target->h;
1410 } else {
1411 METAL_GetOutputSize(renderer, &output.w, &output.h);
1412 }
1413
1414 if (SDL_GetRectIntersection(&output, &clip, &clip)) {
1415 MTLScissorRect mtlrect;
1416 mtlrect.x = clip.x;
1417 mtlrect.y = clip.y;
1418 mtlrect.width = clip.w;
1419 mtlrect.height = clip.h;
1420 [data.mtlcmdencoder setScissorRect:mtlrect];
1421 }
1422
1423 statecache->cliprect_dirty = false;
1424 }
1425
1426 newpipeline = ChoosePipelineState(data, data.activepipelines, shader, blend);
1427 if (newpipeline != statecache->pipeline) {
1428 [data.mtlcmdencoder setRenderPipelineState:newpipeline];
1429 statecache->pipeline = newpipeline;
1430 }
1431
1432 if (!shader_constants) {
1433 SetupShaderConstants(renderer, cmd, NULL, &solid_constants);
1434 shader_constants = &solid_constants;
1435 }
1436
1437 if (statecache->shader_constants_dirty ||
1438 SDL_memcmp(shader_constants, &statecache->shader_constants, sizeof(*shader_constants)) != 0) {
1439 id<MTLBuffer> mtlbufconstants = [data.mtldevice newBufferWithLength:sizeof(*shader_constants) options:MTLResourceStorageModeShared];
1440 mtlbufconstants.label = @"SDL shader constants data";
1441 SDL_memcpy([mtlbufconstants contents], shader_constants, sizeof(*shader_constants));
1442 [data.mtlcmdencoder setFragmentBuffer:mtlbufconstants offset:0 atIndex:0];
1443
1444 SDL_memcpy(&statecache->shader_constants, shader_constants, sizeof(*shader_constants));
1445 statecache->shader_constants_dirty = false;
1446 }
1447
1448 if (constants_offset != statecache->constants_offset) {
1449 if (constants_offset != CONSTANTS_OFFSET_INVALID) {
1450 [data.mtlcmdencoder setVertexBuffer:data.mtlbufconstants offset:constants_offset atIndex:3];
1451 }
1452 statecache->constants_offset = constants_offset;
1453 }
1454
1455 [data.mtlcmdencoder setVertexBufferOffset:first atIndex:0]; // position/texcoords
1456 return true;
1457}
1458
1459static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const size_t constants_offset,
1460 id<MTLBuffer> mtlbufvertex, METAL_DrawStateCache *statecache)
1461{
1462 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1463 SDL_Texture *texture = cmd->data.draw.texture;
1464 SDL3METAL_TextureData *texturedata = (__bridge SDL3METAL_TextureData *)texture->internal;
1465 PixelShaderConstants constants;
1466
1467 SetupShaderConstants(renderer, cmd, texture, &constants);
1468
1469 if (!SetDrawState(renderer, cmd, texturedata.fragmentFunction, &constants, constants_offset, mtlbufvertex, statecache)) {
1470 return false;
1471 }
1472
1473 if (texture != statecache->texture) {
1474 id<MTLSamplerState> mtlsampler;
1475
1476 if (texture->scaleMode == SDL_SCALEMODE_NEAREST) {
1477 switch (cmd->data.draw.texture_address_mode) {
1478 case SDL_TEXTURE_ADDRESS_CLAMP:
1479 mtlsampler = data.mtlsamplers[SDL_METAL_SAMPLER_NEAREST_CLAMP];
1480 break;
1481 case SDL_TEXTURE_ADDRESS_WRAP:
1482 mtlsampler = data.mtlsamplers[SDL_METAL_SAMPLER_NEAREST_WRAP];
1483 break;
1484 default:
1485 return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
1486 }
1487 } else {
1488 switch (cmd->data.draw.texture_address_mode) {
1489 case SDL_TEXTURE_ADDRESS_CLAMP:
1490 mtlsampler = data.mtlsamplers[SDL_METAL_SAMPLER_LINEAR_CLAMP];
1491 break;
1492 case SDL_TEXTURE_ADDRESS_WRAP:
1493 mtlsampler = data.mtlsamplers[SDL_METAL_SAMPLER_LINEAR_WRAP];
1494 break;
1495 default:
1496 return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
1497 }
1498 }
1499 [data.mtlcmdencoder setFragmentSamplerState:mtlsampler atIndex:0];
1500
1501 [data.mtlcmdencoder setFragmentTexture:texturedata.mtltexture atIndex:0];
1502#ifdef SDL_HAVE_YUV
1503 if (texturedata.yuv || texturedata.nv12) {
1504 [data.mtlcmdencoder setFragmentTexture:texturedata.mtltextureUv atIndex:1];
1505 [data.mtlcmdencoder setFragmentBuffer:data.mtlbufconstants offset:texturedata.conversionBufferOffset atIndex:1];
1506 }
1507#endif
1508 statecache->texture = texture;
1509 }
1510 return true;
1511}
1512
1513static void METAL_InvalidateCachedState(SDL_Renderer *renderer)
1514{
1515 // METAL_DrawStateCache only exists during a run of METAL_RunCommandQueue, so there's nothing to invalidate!
1516}
1517
1518static bool METAL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
1519{
1520 @autoreleasepool {
1521 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1522 id<MTLBuffer> mtlbufvertex = nil;
1523 METAL_DrawStateCache statecache;
1524 SDL_zero(statecache);
1525
1526 statecache.pipeline = nil;
1527 statecache.vertex_buffer = nil;
1528 statecache.constants_offset = CONSTANTS_OFFSET_INVALID;
1529 statecache.texture = NULL;
1530 statecache.shader_constants_dirty = true;
1531 statecache.cliprect_dirty = true;
1532 statecache.viewport_dirty = true;
1533 statecache.projection_offset = 0;
1534
1535 // !!! FIXME: have a ring of pre-made MTLBuffers we cycle through? How expensive is creation?
1536 if (vertsize > 0) {
1537 /* We can memcpy to a shared buffer from the CPU and read it from the GPU
1538 * without any extra copying. It's a bit slower on macOS to read shared
1539 * data from the GPU than to read managed/private data, but we avoid the
1540 * cost of copying the data and the code's simpler. Apple's best
1541 * practices guide recommends this approach for streamed vertex data.
1542 */
1543 mtlbufvertex = [data.mtldevice newBufferWithLength:vertsize options:MTLResourceStorageModeShared];
1544 mtlbufvertex.label = @"SDL vertex data";
1545 SDL_memcpy([mtlbufvertex contents], vertices, vertsize);
1546
1547 statecache.vertex_buffer = mtlbufvertex;
1548 }
1549
1550 // If there's a command buffer here unexpectedly (app requested one?). Commit it so we can start fresh.
1551 [data.mtlcmdencoder endEncoding];
1552 [data.mtlcmdbuffer commit];
1553 data.mtlcmdencoder = nil;
1554 data.mtlcmdbuffer = nil;
1555
1556 while (cmd) {
1557 switch (cmd->command) {
1558 case SDL_RENDERCMD_SETVIEWPORT:
1559 {
1560 SDL_memcpy(&statecache.viewport, &cmd->data.viewport.rect, sizeof(statecache.viewport));
1561 statecache.projection_offset = cmd->data.viewport.first;
1562 statecache.viewport_dirty = true;
1563 statecache.cliprect_dirty = true;
1564 break;
1565 }
1566
1567 case SDL_RENDERCMD_SETCLIPRECT:
1568 {
1569 SDL_memcpy(&statecache.cliprect, &cmd->data.cliprect.rect, sizeof(statecache.cliprect));
1570 statecache.cliprect_enabled = cmd->data.cliprect.enabled;
1571 statecache.cliprect_dirty = true;
1572 break;
1573 }
1574
1575 case SDL_RENDERCMD_SETDRAWCOLOR:
1576 {
1577 break;
1578 }
1579
1580 case SDL_RENDERCMD_CLEAR:
1581 {
1582 /* If we're already encoding a command buffer, dump it without committing it. We'd just
1583 clear all its work anyhow, and starting a new encoder will let us use a hardware clear
1584 operation via MTLLoadActionClear. */
1585 if (data.mtlcmdencoder != nil) {
1586 [data.mtlcmdencoder endEncoding];
1587
1588 // !!! FIXME: have to commit, or an uncommitted but enqueued buffer will prevent the frame from finishing.
1589 [data.mtlcmdbuffer commit];
1590 data.mtlcmdencoder = nil;
1591 data.mtlcmdbuffer = nil;
1592 }
1593
1594 // force all this state to be reconfigured on next command buffer.
1595 statecache.pipeline = nil;
1596 statecache.constants_offset = CONSTANTS_OFFSET_INVALID;
1597 statecache.texture = NULL;
1598 statecache.shader_constants_dirty = true;
1599 statecache.cliprect_dirty = true;
1600 statecache.viewport_dirty = true;
1601
1602 {
1603 bool convert_color = SDL_RenderingLinearSpace(renderer);
1604 SDL_FColor color = cmd->data.color.color;
1605 if (convert_color) {
1606 SDL_ConvertToLinear(&color);
1607 }
1608 color.r *= cmd->data.color.color_scale;
1609 color.g *= cmd->data.color.color_scale;
1610 color.b *= cmd->data.color.color_scale;
1611 MTLClearColor mtlcolor = MTLClearColorMake(color.r, color.g, color.b, color.a);
1612
1613 // get new command encoder, set up with an initial clear operation.
1614 // (this might fail, and future draw operations will notice.)
1615 METAL_ActivateRenderCommandEncoder(renderer, MTLLoadActionClear, &mtlcolor, mtlbufvertex);
1616 }
1617 break;
1618 }
1619
1620 case SDL_RENDERCMD_DRAW_POINTS:
1621 case SDL_RENDERCMD_DRAW_LINES:
1622 {
1623 const size_t count = cmd->data.draw.count;
1624 const MTLPrimitiveType primtype = (cmd->command == SDL_RENDERCMD_DRAW_POINTS) ? MTLPrimitiveTypePoint : MTLPrimitiveTypeLineStrip;
1625 if (SetDrawState(renderer, cmd, SDL_METAL_FRAGMENT_SOLID, NULL, CONSTANTS_OFFSET_HALF_PIXEL_TRANSFORM, mtlbufvertex, &statecache)) {
1626 [data.mtlcmdencoder drawPrimitives:primtype vertexStart:0 vertexCount:count];
1627 }
1628 break;
1629 }
1630
1631 case SDL_RENDERCMD_FILL_RECTS: // unused
1632 break;
1633
1634 case SDL_RENDERCMD_COPY: // unused
1635 break;
1636
1637 case SDL_RENDERCMD_COPY_EX: // unused
1638 break;
1639
1640 case SDL_RENDERCMD_GEOMETRY:
1641 {
1642 const size_t count = cmd->data.draw.count;
1643 SDL_Texture *texture = cmd->data.draw.texture;
1644
1645 if (texture) {
1646 if (SetCopyState(renderer, cmd, CONSTANTS_OFFSET_IDENTITY, mtlbufvertex, &statecache)) {
1647 [data.mtlcmdencoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:count];
1648 }
1649 } else {
1650 if (SetDrawState(renderer, cmd, SDL_METAL_FRAGMENT_SOLID, NULL, CONSTANTS_OFFSET_IDENTITY, mtlbufvertex, &statecache)) {
1651 [data.mtlcmdencoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:count];
1652 }
1653 }
1654 break;
1655 }
1656
1657 case SDL_RENDERCMD_NO_OP:
1658 break;
1659 }
1660 cmd = cmd->next;
1661 }
1662
1663 return true;
1664 }
1665}
1666
1667static SDL_Surface *METAL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
1668{
1669 @autoreleasepool {
1670 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1671 id<MTLTexture> mtltexture;
1672 MTLRegion mtlregion;
1673 Uint32 format;
1674 SDL_Surface *surface;
1675
1676 if (!METAL_ActivateRenderCommandEncoder(renderer, MTLLoadActionLoad, NULL, nil)) {
1677 SDL_SetError("Failed to activate render command encoder (is your window in the background?");
1678 return NULL;
1679 }
1680
1681 [data.mtlcmdencoder endEncoding];
1682 mtltexture = data.mtlpassdesc.colorAttachments[0].texture;
1683
1684#ifdef SDL_PLATFORM_MACOS
1685 /* on macOS with managed-storage textures, we need to tell the driver to
1686 * update the CPU-side copy of the texture data.
1687 * NOTE: Currently all of our textures are managed on macOS. We'll need some
1688 * extra copying for any private textures. */
1689 if (METAL_GetStorageMode(mtltexture) == MTLStorageModeManaged) {
1690 id<MTLBlitCommandEncoder> blit = [data.mtlcmdbuffer blitCommandEncoder];
1691 [blit synchronizeResource:mtltexture];
1692 [blit endEncoding];
1693 }
1694#endif
1695
1696 /* Commit the current command buffer and wait until it's completed, to make
1697 * sure the GPU has finished rendering to it by the time we read it. */
1698 [data.mtlcmdbuffer commit];
1699 [data.mtlcmdbuffer waitUntilCompleted];
1700 data.mtlcmdencoder = nil;
1701 data.mtlcmdbuffer = nil;
1702
1703 mtlregion = MTLRegionMake2D(rect->x, rect->y, rect->w, rect->h);
1704
1705 switch (mtltexture.pixelFormat) {
1706 case MTLPixelFormatBGRA8Unorm:
1707 case MTLPixelFormatBGRA8Unorm_sRGB:
1708 format = SDL_PIXELFORMAT_ARGB8888;
1709 break;
1710 case MTLPixelFormatRGBA8Unorm:
1711 case MTLPixelFormatRGBA8Unorm_sRGB:
1712 format = SDL_PIXELFORMAT_ABGR8888;
1713 break;
1714 case MTLPixelFormatRGB10A2Unorm:
1715 format = SDL_PIXELFORMAT_ABGR2101010;
1716 break;
1717 case MTLPixelFormatRGBA16Float:
1718 format = SDL_PIXELFORMAT_RGBA64_FLOAT;
1719 break;
1720 default:
1721 SDL_SetError("Unknown framebuffer pixel format");
1722 return NULL;
1723 }
1724 surface = SDL_CreateSurface(rect->w, rect->h, format);
1725 if (surface) {
1726 [mtltexture getBytes:surface->pixels bytesPerRow:surface->pitch fromRegion:mtlregion mipmapLevel:0];
1727 }
1728 return surface;
1729 }
1730}
1731
1732static bool METAL_RenderPresent(SDL_Renderer *renderer)
1733{
1734 @autoreleasepool {
1735 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1736 bool ready = true;
1737
1738 // If we don't have a command buffer, we can't present, so activate to get one.
1739 if (data.mtlcmdencoder == nil) {
1740 // We haven't even gotten a backbuffer yet? Load and clear it. Otherwise, load the existing data.
1741 if (data.mtlbackbuffer == nil) {
1742 float alpha = (SDL_GetWindowFlags(renderer->window) & SDL_WINDOW_TRANSPARENT) ? 0.0f : 1.0f;
1743 MTLClearColor color = MTLClearColorMake(0.0f, 0.0f, 0.0f, alpha);
1744 ready = METAL_ActivateRenderCommandEncoder(renderer, MTLLoadActionClear, &color, nil);
1745 } else {
1746 ready = METAL_ActivateRenderCommandEncoder(renderer, MTLLoadActionLoad, NULL, nil);
1747 }
1748 }
1749
1750 [data.mtlcmdencoder endEncoding];
1751
1752 // If we don't have a drawable to present, don't try to present it.
1753 // But we'll still try to commit the command buffer in case it was already enqueued.
1754 if (ready) {
1755 SDL_assert(data.mtlbackbuffer != nil);
1756 [data.mtlcmdbuffer presentDrawable:data.mtlbackbuffer];
1757 }
1758
1759 [data.mtlcmdbuffer commit];
1760
1761 data.mtlcmdencoder = nil;
1762 data.mtlcmdbuffer = nil;
1763 data.mtlbackbuffer = nil;
1764
1765 if (renderer->hidden || !ready) {
1766 return false;
1767 }
1768 return true;
1769 }
1770}
1771
1772static void METAL_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1773{
1774 @autoreleasepool {
1775 CFBridgingRelease(texture->internal);
1776 texture->internal = NULL;
1777 }
1778}
1779
1780static void METAL_DestroyRenderer(SDL_Renderer *renderer)
1781{
1782 @autoreleasepool {
1783 if (renderer->internal) {
1784 SDL3METAL_RenderData *data = CFBridgingRelease(renderer->internal);
1785
1786 if (data.mtlcmdencoder != nil) {
1787 [data.mtlcmdencoder endEncoding];
1788 }
1789
1790 DestroyAllPipelines(data.allpipelines, data.pipelinescount);
1791
1792 /* Release the metal view instead of destroying it,
1793 in case we want to use it later (recreating the renderer)
1794 */
1795 // SDL_Metal_DestroyView(data.mtlview);
1796 CFBridgingRelease(data.mtlview);
1797 }
1798 }
1799}
1800
1801static void *METAL_GetMetalLayer(SDL_Renderer *renderer)
1802{
1803 @autoreleasepool {
1804 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1805 return (__bridge void *)data.mtllayer;
1806 }
1807}
1808
1809static void *METAL_GetMetalCommandEncoder(SDL_Renderer *renderer)
1810{
1811 @autoreleasepool {
1812 // note that data.mtlcmdencoder can be nil if METAL_ActivateRenderCommandEncoder fails.
1813 // Before SDL 2.0.18, it might have returned a non-nil encoding that might not have been
1814 // usable for presentation. Check your return values!
1815 SDL3METAL_RenderData *data;
1816 METAL_ActivateRenderCommandEncoder(renderer, MTLLoadActionLoad, NULL, nil);
1817 data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1818 return (__bridge void *)data.mtlcmdencoder;
1819 }
1820}
1821
1822static bool METAL_SetVSync(SDL_Renderer *renderer, const int vsync)
1823{
1824#if defined(SDL_PLATFORM_MACOS) || TARGET_OS_MACCATALYST
1825 SDL3METAL_RenderData *data = (__bridge SDL3METAL_RenderData *)renderer->internal;
1826 switch (vsync) {
1827 case 0:
1828 data.mtllayer.displaySyncEnabled = NO;
1829 break;
1830 case 1:
1831 data.mtllayer.displaySyncEnabled = YES;
1832 break;
1833 default:
1834 return SDL_Unsupported();
1835 }
1836 return true;
1837#else
1838 switch (vsync) {
1839 case 1:
1840 return true;
1841 default:
1842 return SDL_Unsupported();
1843 }
1844#endif
1845}
1846
1847static SDL_MetalView GetWindowView(SDL_Window *window)
1848{
1849#ifdef SDL_VIDEO_DRIVER_COCOA
1850 NSWindow *nswindow = (__bridge NSWindow *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, NULL);
1851 NSInteger tag = (NSInteger)SDL_GetNumberProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER, 0);
1852 if (nswindow && tag) {
1853 NSView *view = nswindow.contentView;
1854 if (view.subviews.count > 0) {
1855 view = view.subviews[0];
1856 if (view.tag == tag) {
1857 return (SDL_MetalView)CFBridgingRetain(view);
1858 }
1859 }
1860 }
1861#endif
1862
1863#ifdef SDL_VIDEO_DRIVER_UIKIT
1864 UIWindow *uiwindow = (__bridge UIWindow *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_UIKIT_WINDOW_POINTER, NULL);
1865 NSInteger tag = (NSInteger)SDL_GetNumberProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER, 0);
1866 if (uiwindow && tag) {
1867 UIView *view = uiwindow.rootViewController.view;
1868 if (view.tag == tag) {
1869 return (SDL_MetalView)CFBridgingRetain(view);
1870 }
1871 }
1872#endif
1873
1874 return nil;
1875}
1876
1877static bool METAL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
1878{
1879 @autoreleasepool {
1880 SDL3METAL_RenderData *data = NULL;
1881 id<MTLDevice> mtldevice = nil;
1882 SDL_MetalView view = NULL;
1883 CAMetalLayer *layer = nil;
1884 NSError *err = nil;
1885 dispatch_data_t mtllibdata;
1886 char *constantdata;
1887 int maxtexsize, quadcount = UINT16_MAX / 4;
1888 UInt16 *indexdata;
1889 size_t indicessize = sizeof(UInt16) * quadcount * 6;
1890 MTLSamplerDescriptor *samplerdesc;
1891 id<MTLCommandQueue> mtlcmdqueue;
1892 id<MTLLibrary> mtllibrary;
1893 id<MTLBuffer> mtlbufconstantstaging, mtlbufquadindicesstaging, mtlbufconstants, mtlbufquadindices;
1894 id<MTLCommandBuffer> cmdbuffer;
1895 id<MTLBlitCommandEncoder> blitcmd;
1896 bool scRGB_supported = false;
1897
1898 // Note: matrices are column major.
1899 float identitytransform[16] = {
1900 1.0f,
1901 0.0f,
1902 0.0f,
1903 0.0f,
1904 0.0f,
1905 1.0f,
1906 0.0f,
1907 0.0f,
1908 0.0f,
1909 0.0f,
1910 1.0f,
1911 0.0f,
1912 0.0f,
1913 0.0f,
1914 0.0f,
1915 1.0f,
1916 };
1917
1918 float halfpixeltransform[16] = {
1919 1.0f,
1920 0.0f,
1921 0.0f,
1922 0.0f,
1923 0.0f,
1924 1.0f,
1925 0.0f,
1926 0.0f,
1927 0.0f,
1928 0.0f,
1929 1.0f,
1930 0.0f,
1931 0.5f,
1932 0.5f,
1933 0.0f,
1934 1.0f,
1935 };
1936
1937 const size_t YCbCr_shader_matrix_size = 4 * 4 * sizeof(float);
1938
1939 SDL_SetupRendererColorspace(renderer, create_props);
1940
1941#ifndef SDL_PLATFORM_TVOS
1942 if (@available(macos 10.11, iOS 16.0, *)) {
1943 scRGB_supported = true;
1944 }
1945#endif
1946 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
1947 if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR && scRGB_supported) {
1948 // This colorspace is supported
1949 } else {
1950 return SDL_SetError("Unsupported output colorspace");
1951 }
1952 }
1953
1954#ifdef SDL_PLATFORM_MACOS
1955 if (SDL_GetHintBoolean(SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE, true)) {
1956 NSArray<id<MTLDevice>> *devices = MTLCopyAllDevices();
1957
1958 for (id<MTLDevice> device in devices) {
1959 if (device.isLowPower) {
1960 mtldevice = device;
1961 break;
1962 }
1963 }
1964 }
1965#endif
1966
1967 if (mtldevice == nil) {
1968 mtldevice = MTLCreateSystemDefaultDevice();
1969 }
1970
1971 if (mtldevice == nil) {
1972 return SDL_SetError("Failed to obtain Metal device");
1973 }
1974
1975 view = GetWindowView(window);
1976 if (view == nil) {
1977 view = SDL_Metal_CreateView(window);
1978 }
1979
1980 if (view == NULL) {
1981 return false;
1982 }
1983
1984 // !!! FIXME: error checking on all of this.
1985 data = [[SDL3METAL_RenderData alloc] init];
1986
1987 if (data == nil) {
1988 /* Release the metal view instead of destroying it,
1989 in case we want to use it later (recreating the renderer)
1990 */
1991 // SDL_Metal_DestroyView(view);
1992 CFBridgingRelease(view);
1993 return SDL_SetError("SDL3METAL_RenderData alloc/init failed");
1994 }
1995
1996 renderer->internal = (void *)CFBridgingRetain(data);
1997 METAL_InvalidateCachedState(renderer);
1998 renderer->window = window;
1999
2000 data.mtlview = view;
2001
2002#ifdef SDL_PLATFORM_MACOS
2003 layer = (CAMetalLayer *)[(__bridge NSView *)view layer];
2004#else
2005 layer = (CAMetalLayer *)[(__bridge UIView *)view layer];
2006#endif
2007
2008#ifndef SDL_PLATFORM_TVOS
2009 if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
2010 if (@available(macos 10.11, iOS 16.0, *)) {
2011 layer.wantsExtendedDynamicRangeContent = YES;
2012 } else {
2013 SDL_assert(!"Logic error, scRGB is not actually supported");
2014 }
2015 layer.pixelFormat = MTLPixelFormatRGBA16Float;
2016
2017 const CFStringRef name = kCGColorSpaceExtendedLinearSRGB;
2018 CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(name);
2019 layer.colorspace = colorspace;
2020 CGColorSpaceRelease(colorspace);
2021 }
2022#endif // !SDL_PLATFORM_TVOS
2023
2024 layer.device = mtldevice;
2025
2026 // Necessary for RenderReadPixels.
2027 layer.framebufferOnly = NO;
2028
2029 data.mtldevice = layer.device;
2030 data.mtllayer = layer;
2031 mtlcmdqueue = [data.mtldevice newCommandQueue];
2032 data.mtlcmdqueue = mtlcmdqueue;
2033 data.mtlcmdqueue.label = @"SDL Metal Renderer";
2034 data.mtlpassdesc = [MTLRenderPassDescriptor renderPassDescriptor];
2035
2036 // The compiled .metallib is embedded in a static array in a header file
2037 // but the original shader source code is in SDL_shaders_metal.metal.
2038 mtllibdata = dispatch_data_create(sdl_metallib, sdl_metallib_len, dispatch_get_global_queue(0, 0), ^{
2039 });
2040 mtllibrary = [data.mtldevice newLibraryWithData:mtllibdata error:&err];
2041 data.mtllibrary = mtllibrary;
2042 SDL_assert(err == nil);
2043 data.mtllibrary.label = @"SDL Metal renderer shader library";
2044
2045 // Do some shader pipeline state loading up-front rather than on demand.
2046 data.pipelinescount = 0;
2047 data.allpipelines = NULL;
2048 ChooseShaderPipelines(data, MTLPixelFormatBGRA8Unorm);
2049
2050 static struct
2051 {
2052 MTLSamplerMinMagFilter filter;
2053 MTLSamplerAddressMode address;
2054 } samplerParams[] = {
2055 { MTLSamplerMinMagFilterNearest, MTLSamplerAddressModeClampToEdge },
2056 { MTLSamplerMinMagFilterNearest, MTLSamplerAddressModeRepeat },
2057 { MTLSamplerMinMagFilterLinear, MTLSamplerAddressModeClampToEdge },
2058 { MTLSamplerMinMagFilterLinear, MTLSamplerAddressModeRepeat },
2059 };
2060 SDL_COMPILE_TIME_ASSERT(samplerParams_SIZE, SDL_arraysize(samplerParams) == SDL_NUM_METAL_SAMPLERS);
2061
2062 data.mtlsamplers = [[NSMutableArray<id<MTLSamplerState>> alloc] init];
2063 samplerdesc = [[MTLSamplerDescriptor alloc] init];
2064 for (int i = 0; i < SDL_arraysize(samplerParams); ++i) {
2065 samplerdesc.minFilter = samplerParams[i].filter;
2066 samplerdesc.magFilter = samplerParams[i].filter;
2067 samplerdesc.sAddressMode = samplerParams[i].address;
2068 samplerdesc.tAddressMode = samplerParams[i].address;
2069 [data.mtlsamplers addObject:[data.mtldevice newSamplerStateWithDescriptor:samplerdesc]];
2070 }
2071
2072 mtlbufconstantstaging = [data.mtldevice newBufferWithLength:CONSTANTS_LENGTH options:MTLResourceStorageModeShared];
2073
2074 constantdata = [mtlbufconstantstaging contents];
2075 SDL_memcpy(constantdata + CONSTANTS_OFFSET_IDENTITY, identitytransform, sizeof(identitytransform));
2076 SDL_memcpy(constantdata + CONSTANTS_OFFSET_HALF_PIXEL_TRANSFORM, halfpixeltransform, sizeof(halfpixeltransform));
2077 SDL_memcpy(constantdata + CONSTANTS_OFFSET_DECODE_BT601_LIMITED, SDL_GetYCbCRtoRGBConversionMatrix(SDL_COLORSPACE_BT601_LIMITED, 0, 0, 8), YCbCr_shader_matrix_size);
2078 SDL_memcpy(constantdata + CONSTANTS_OFFSET_DECODE_BT601_FULL, SDL_GetYCbCRtoRGBConversionMatrix(SDL_COLORSPACE_BT601_FULL, 0, 0, 8), YCbCr_shader_matrix_size);
2079 SDL_memcpy(constantdata + CONSTANTS_OFFSET_DECODE_BT709_LIMITED, SDL_GetYCbCRtoRGBConversionMatrix(SDL_COLORSPACE_BT709_LIMITED, 0, 0, 8), YCbCr_shader_matrix_size);
2080 SDL_memcpy(constantdata + CONSTANTS_OFFSET_DECODE_BT709_FULL, SDL_GetYCbCRtoRGBConversionMatrix(SDL_COLORSPACE_BT709_FULL, 0, 0, 8), YCbCr_shader_matrix_size);
2081 SDL_memcpy(constantdata + CONSTANTS_OFFSET_DECODE_BT2020_LIMITED, SDL_GetYCbCRtoRGBConversionMatrix(SDL_COLORSPACE_BT2020_LIMITED, 0, 0, 10), YCbCr_shader_matrix_size);
2082 SDL_memcpy(constantdata + CONSTANTS_OFFSET_DECODE_BT2020_FULL, SDL_GetYCbCRtoRGBConversionMatrix(SDL_COLORSPACE_BT2020_FULL, 0, 0, 10), YCbCr_shader_matrix_size);
2083
2084 mtlbufquadindicesstaging = [data.mtldevice newBufferWithLength:indicessize options:MTLResourceStorageModeShared];
2085
2086 /* Quads in the following vertex order (matches the FillRects vertices):
2087 * 1---3
2088 * | \ |
2089 * 0---2
2090 */
2091 indexdata = [mtlbufquadindicesstaging contents];
2092 for (int i = 0; i < quadcount; i++) {
2093 indexdata[i * 6 + 0] = i * 4 + 0;
2094 indexdata[i * 6 + 1] = i * 4 + 1;
2095 indexdata[i * 6 + 2] = i * 4 + 2;
2096
2097 indexdata[i * 6 + 3] = i * 4 + 2;
2098 indexdata[i * 6 + 4] = i * 4 + 1;
2099 indexdata[i * 6 + 5] = i * 4 + 3;
2100 }
2101
2102 mtlbufconstants = [data.mtldevice newBufferWithLength:CONSTANTS_LENGTH options:MTLResourceStorageModePrivate];
2103 data.mtlbufconstants = mtlbufconstants;
2104 data.mtlbufconstants.label = @"SDL constant data";
2105
2106 mtlbufquadindices = [data.mtldevice newBufferWithLength:indicessize options:MTLResourceStorageModePrivate];
2107 data.mtlbufquadindices = mtlbufquadindices;
2108 data.mtlbufquadindices.label = @"SDL quad index buffer";
2109
2110 cmdbuffer = [data.mtlcmdqueue commandBuffer];
2111 blitcmd = [cmdbuffer blitCommandEncoder];
2112
2113 [blitcmd copyFromBuffer:mtlbufconstantstaging sourceOffset:0 toBuffer:mtlbufconstants destinationOffset:0 size:CONSTANTS_LENGTH];
2114 [blitcmd copyFromBuffer:mtlbufquadindicesstaging sourceOffset:0 toBuffer:mtlbufquadindices destinationOffset:0 size:indicessize];
2115
2116 [blitcmd endEncoding];
2117 [cmdbuffer commit];
2118
2119 // !!! FIXME: force more clears here so all the drawables are sane to start, and our static buffers are definitely flushed.
2120
2121 renderer->WindowEvent = METAL_WindowEvent;
2122 renderer->GetOutputSize = METAL_GetOutputSize;
2123 renderer->SupportsBlendMode = METAL_SupportsBlendMode;
2124 renderer->CreateTexture = METAL_CreateTexture;
2125 renderer->UpdateTexture = METAL_UpdateTexture;
2126#ifdef SDL_HAVE_YUV
2127 renderer->UpdateTextureYUV = METAL_UpdateTextureYUV;
2128 renderer->UpdateTextureNV = METAL_UpdateTextureNV;
2129#endif
2130 renderer->LockTexture = METAL_LockTexture;
2131 renderer->UnlockTexture = METAL_UnlockTexture;
2132 renderer->SetTextureScaleMode = METAL_SetTextureScaleMode;
2133 renderer->SetRenderTarget = METAL_SetRenderTarget;
2134 renderer->QueueSetViewport = METAL_QueueSetViewport;
2135 renderer->QueueSetDrawColor = METAL_QueueNoOp;
2136 renderer->QueueDrawPoints = METAL_QueueDrawPoints;
2137 renderer->QueueDrawLines = METAL_QueueDrawLines;
2138 renderer->QueueGeometry = METAL_QueueGeometry;
2139 renderer->InvalidateCachedState = METAL_InvalidateCachedState;
2140 renderer->RunCommandQueue = METAL_RunCommandQueue;
2141 renderer->RenderReadPixels = METAL_RenderReadPixels;
2142 renderer->RenderPresent = METAL_RenderPresent;
2143 renderer->DestroyTexture = METAL_DestroyTexture;
2144 renderer->DestroyRenderer = METAL_DestroyRenderer;
2145 renderer->SetVSync = METAL_SetVSync;
2146 renderer->GetMetalLayer = METAL_GetMetalLayer;
2147 renderer->GetMetalCommandEncoder = METAL_GetMetalCommandEncoder;
2148
2149 renderer->name = METAL_RenderDriver.name;
2150 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
2151 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
2152 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
2153 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
2154 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA128_FLOAT);
2155 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
2156 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
2157 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
2158 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
2159 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010);
2160
2161#if defined(SDL_PLATFORM_MACOS) || TARGET_OS_MACCATALYST
2162 data.mtllayer.displaySyncEnabled = NO;
2163#endif
2164
2165 // https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
2166 maxtexsize = 4096;
2167#if defined(SDL_PLATFORM_MACOS) || TARGET_OS_MACCATALYST
2168 maxtexsize = 16384;
2169#elif defined(SDL_PLATFORM_TVOS)
2170 maxtexsize = 8192;
2171 if ([mtldevice supportsFeatureSet:MTLFeatureSet_tvOS_GPUFamily2_v1]) {
2172 maxtexsize = 16384;
2173 }
2174#else
2175 if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1]) {
2176 maxtexsize = 16384;
2177 } else if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v1]) {
2178 maxtexsize = 16384;
2179 } else if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v2] || [mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v2]) {
2180 maxtexsize = 8192;
2181 } else {
2182 maxtexsize = 4096;
2183 }
2184#endif
2185
2186 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, maxtexsize);
2187
2188 return true;
2189 }
2190}
2191
2192SDL_RenderDriver METAL_RenderDriver = {
2193 METAL_CreateRenderer, "metal"
2194};
2195
2196#endif // SDL_VIDEO_RENDER_METAL
diff --git a/SDL-3.2.8/src/render/metal/SDL_shaders_metal.metal b/SDL-3.2.8/src/render/metal/SDL_shaders_metal.metal
new file mode 100644
index 0000000..c266670
--- /dev/null
+++ b/SDL-3.2.8/src/render/metal/SDL_shaders_metal.metal
@@ -0,0 +1,299 @@
1#include <metal_common>
2#include <metal_texture>
3#include <metal_matrix>
4
5using namespace metal;
6
7// These should mirror the definitions in SDL_render_metal.m
8#define TONEMAP_NONE 0
9#define TONEMAP_LINEAR 1
10#define TONEMAP_CHROME 2
11
12#define TEXTURETYPE_NONE 0
13#define TEXTURETYPE_RGB 1
14#define TEXTURETYPE_NV12 2
15#define TEXTURETYPE_NV21 3
16#define TEXTURETYPE_YUV 4
17
18#define INPUTTYPE_UNSPECIFIED 0
19#define INPUTTYPE_SRGB 1
20#define INPUTTYPE_SCRGB 2
21#define INPUTTYPE_HDR10 3
22
23struct ShaderConstants
24{
25 float scRGB_output;
26 float texture_type;
27 float input_type;
28 float color_scale;
29
30 float tonemap_method;
31 float tonemap_factor1;
32 float tonemap_factor2;
33 float sdr_white_point;
34};
35
36struct YUVDecode
37{
38 float3 offset;
39 float3x3 matrix;
40};
41
42float sRGBtoLinear(float v)
43{
44 if (v <= 0.04045) {
45 v = (v / 12.92);
46 } else {
47 v = pow(abs(v + 0.055) / 1.055, 2.4);
48 }
49 return v;
50}
51
52float sRGBfromLinear(float v)
53{
54 if (v <= 0.0031308) {
55 v = (v * 12.92);
56 } else {
57 v = (pow(abs(v), 1.0 / 2.4) * 1.055 - 0.055);
58 }
59 return v;
60}
61
62float3 PQtoLinear(float3 v, float sdr_white_point)
63{
64 const float c1 = 0.8359375;
65 const float c2 = 18.8515625;
66 const float c3 = 18.6875;
67 const float oo_m1 = 1.0 / 0.1593017578125;
68 const float oo_m2 = 1.0 / 78.84375;
69
70 float3 num = max(pow(abs(v), oo_m2) - c1, 0.0);
71 float3 den = c2 - c3 * pow(abs(v), oo_m2);
72 return (10000.0 * pow(abs(num / den), oo_m1) / sdr_white_point);
73}
74
75float3 ApplyTonemap(float3 v, float input_type, float tonemap_method, float tonemap_factor1, float tonemap_factor2)
76{
77 const float3x3 mat709to2020 = {
78 { 0.627404, 0.329283, 0.043313 },
79 { 0.069097, 0.919541, 0.011362 },
80 { 0.016391, 0.088013, 0.895595 }
81 };
82 const float3x3 mat2020to709 = {
83 { 1.660496, -0.587656, -0.072840 },
84 { -0.124547, 1.132895, -0.008348 },
85 { -0.018154, -0.100597, 1.118751 }
86 };
87
88 if (tonemap_method == TONEMAP_LINEAR) {
89 v *= tonemap_factor1;
90 } else if (tonemap_method == TONEMAP_CHROME) {
91 if (input_type == INPUTTYPE_SCRGB) {
92 // Convert to BT.2020 colorspace for tone mapping
93 v = v * mat709to2020;
94 }
95
96 float vmax = max(v.r, max(v.g, v.b));
97 if (vmax > 0.0) {
98 float scale = (1.0 + tonemap_factor1 * vmax) / (1.0 + tonemap_factor2 * vmax);
99 v *= scale;
100 }
101
102 if (input_type == INPUTTYPE_SCRGB) {
103 // Convert to BT.709 colorspace after tone mapping
104 v = v * mat2020to709;
105 }
106 }
107 return v;
108}
109
110float4 GetOutputColorSimple(float4 rgba, float color_scale)
111{
112 float4 output;
113
114 output.rgb = rgba.rgb * color_scale;
115 output.a = rgba.a;
116
117 return output;
118}
119
120float3 GetOutputColorFromSRGB(float3 rgb, float scRGB_output, float color_scale)
121{
122 float3 output;
123
124 if (scRGB_output) {
125 rgb.r = sRGBtoLinear(rgb.r);
126 rgb.g = sRGBtoLinear(rgb.g);
127 rgb.b = sRGBtoLinear(rgb.b);
128 }
129
130 output = rgb * color_scale;
131
132 return output;
133}
134
135float3 GetOutputColorFromLinear(float3 rgb, float scRGB_output, float color_scale)
136{
137 float3 output;
138
139 output = rgb * color_scale;
140
141 if (!scRGB_output) {
142 output.r = sRGBfromLinear(output.r);
143 output.g = sRGBfromLinear(output.g);
144 output.b = sRGBfromLinear(output.b);
145 output = clamp(output, 0.0, 1.0);
146 }
147
148 return output;
149}
150
151float4 GetOutputColor(float4 rgba, constant ShaderConstants &c)
152{
153 const float3x3 mat2020to709 = {
154 { 1.660496, -0.587656, -0.072840 },
155 { -0.124547, 1.132895, -0.008348 },
156 { -0.018154, -0.100597, 1.118751 }
157 };
158 float4 output;
159
160 if (c.input_type == INPUTTYPE_HDR10) {
161 rgba.rgb = PQtoLinear(rgba.rgb, c.sdr_white_point);
162 }
163
164 if (c.tonemap_method != TONEMAP_NONE) {
165 rgba.rgb = ApplyTonemap(rgba.rgb, c.input_type, c.tonemap_method, c.tonemap_factor1, c.tonemap_factor2);
166 }
167
168 if (c.input_type == INPUTTYPE_SRGB) {
169 if (c.texture_type == TEXTURETYPE_RGB) {
170 // The sampler has already converted to linear if necessary
171 output.rgb = rgba.rgb * c.color_scale;
172 } else {
173 output.rgb = GetOutputColorFromSRGB(rgba.rgb, c.scRGB_output, c.color_scale);
174 }
175 } else if (c.input_type == INPUTTYPE_SCRGB) {
176 output.rgb = GetOutputColorFromLinear(rgba.rgb, c.scRGB_output, c.color_scale);
177 } else if (c.input_type == INPUTTYPE_HDR10) {
178 rgba.rgb = rgba.rgb * mat2020to709;
179 output.rgb = GetOutputColorFromLinear(rgba.rgb, c.scRGB_output, c.color_scale);
180 } else {
181 // Unexpected input type, use magenta error color
182 output.rgb = float3(1.0, 0.0, 1.0);
183 }
184 output.a = rgba.a;
185
186 return output;
187}
188
189struct SolidVertexInput
190{
191 float2 position [[attribute(0)]];
192 float4 color [[attribute(1)]];
193};
194
195struct SolidVertexOutput
196{
197 float4 position [[position]];
198 float4 color;
199 float pointSize [[point_size]];
200};
201
202vertex SolidVertexOutput SDL_Solid_vertex(SolidVertexInput in [[stage_in]],
203 constant float4x4 &projection [[buffer(2)]],
204 constant float4x4 &transform [[buffer(3)]])
205{
206 SolidVertexOutput v;
207 v.position = (projection * transform) * float4(in.position, 0.0f, 1.0f);
208 v.color = in.color;
209 v.pointSize = 1.0f;
210 return v;
211}
212
213fragment float4 SDL_Solid_fragment(SolidVertexInput in [[stage_in]],
214 constant ShaderConstants &c [[buffer(0)]])
215{
216 return GetOutputColorSimple(1.0, c.color_scale) * in.color;
217}
218
219struct CopyVertexInput
220{
221 float2 position [[attribute(0)]];
222 float4 color [[attribute(1)]];
223 float2 texcoord [[attribute(2)]];
224};
225
226struct CopyVertexOutput
227{
228 float4 position [[position]];
229 float4 color;
230 float2 texcoord;
231};
232
233vertex CopyVertexOutput SDL_Copy_vertex(CopyVertexInput in [[stage_in]],
234 constant float4x4 &projection [[buffer(2)]],
235 constant float4x4 &transform [[buffer(3)]])
236{
237 CopyVertexOutput v;
238 v.position = (projection * transform) * float4(in.position, 0.0f, 1.0f);
239 v.color = in.color;
240 v.texcoord = in.texcoord;
241 return v;
242}
243
244fragment float4 SDL_Copy_fragment(CopyVertexOutput vert [[stage_in]],
245 constant ShaderConstants &c [[buffer(0)]],
246 texture2d<float> tex [[texture(0)]],
247 sampler s [[sampler(0)]])
248{
249 float4 rgba = tex.sample(s, vert.texcoord);
250 return GetOutputColor(rgba, c) * vert.color;
251}
252
253fragment float4 SDL_YUV_fragment(CopyVertexOutput vert [[stage_in]],
254 constant ShaderConstants &c [[buffer(0)]],
255 constant YUVDecode &decode [[buffer(1)]],
256 texture2d<float> texY [[texture(0)]],
257 texture2d_array<float> texUV [[texture(1)]],
258 sampler s [[sampler(0)]])
259{
260 float3 yuv;
261 yuv.x = texY.sample(s, vert.texcoord).r;
262 yuv.y = texUV.sample(s, vert.texcoord, 0).r;
263 yuv.z = texUV.sample(s, vert.texcoord, 1).r;
264
265 float4 rgba;
266 rgba.rgb = (yuv + decode.offset) * decode.matrix;
267 rgba.a = 1.0;
268
269 return GetOutputColor(rgba, c) * vert.color;
270}
271
272fragment float4 SDL_NV12_fragment(CopyVertexOutput vert [[stage_in]],
273 constant ShaderConstants &c [[buffer(0)]],
274 constant YUVDecode &decode [[buffer(1)]],
275 texture2d<float> texY [[texture(0)]],
276 texture2d<float> texUV [[texture(1)]],
277 sampler s [[sampler(0)]])
278{
279 float4 rgba;
280 if (c.texture_type == TEXTURETYPE_NV12) {
281 float3 yuv;
282 yuv.x = texY.sample(s, vert.texcoord).r;
283 yuv.yz = texUV.sample(s, vert.texcoord).rg;
284
285 rgba.rgb = (yuv + decode.offset) * decode.matrix;
286 } else if (c.texture_type == TEXTURETYPE_NV21) {
287 float3 yuv;
288 yuv.x = texY.sample(s, vert.texcoord).r;
289 yuv.yz = texUV.sample(s, vert.texcoord).gr;
290
291 rgba.rgb = (yuv + decode.offset) * decode.matrix;
292 } else {
293 // Unexpected texture type, use magenta error color
294 rgba.rgb = float3(1.0, 0.0, 1.0);
295 }
296 rgba.a = 1.0;
297
298 return GetOutputColor(rgba, c) * vert.color;
299}
diff --git a/SDL-3.2.8/src/render/metal/SDL_shaders_metal_ios.h b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_ios.h
new file mode 100644
index 0000000..5d04118
--- /dev/null
+++ b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_ios.h
@@ -0,0 +1,2612 @@
1const unsigned char sdl_metallib[] = {
2 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
3 0x00, 0x00, 0x00, 0x00, 0x45, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00,
5 0x00, 0x00, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00,
7 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0xe5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x76, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
10 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f,
11 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54,
12 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00,
13 0x60, 0x7a, 0x81, 0x65, 0xda, 0xf6, 0x14, 0xc4, 0x56, 0x47, 0x0b, 0x7a,
14 0x77, 0x81, 0xf4, 0xc0, 0x01, 0xee, 0xcd, 0x26, 0x7c, 0x2d, 0x8d, 0x7b,
15 0x28, 0x66, 0x63, 0x5c, 0x85, 0xe9, 0xdd, 0xb9, 0x4f, 0x46, 0x46, 0x54,
16 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00,
19 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x77, 0x00, 0x00, 0x00,
20 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f,
21 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59,
22 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x6e,
23 0xc3, 0x21, 0x35, 0x82, 0x00, 0x01, 0xe8, 0xa4, 0x27, 0xe1, 0xec, 0x73,
24 0xf1, 0xe9, 0x58, 0x2e, 0x4a, 0x0d, 0xc0, 0x5a, 0x63, 0x1e, 0x7f, 0x35,
25 0xf1, 0x6e, 0x35, 0x4e, 0xbf, 0x18, 0xae, 0x4f, 0x46, 0x46, 0x54, 0x18,
26 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
27 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
28 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
29 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x7a, 0x00, 0x00, 0x00, 0x4e,
30 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c,
31 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00,
32 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20,
33 0x00, 0x6a, 0x1d, 0x1d, 0x45, 0x2a, 0x6b, 0x07, 0x82, 0x0a, 0x87, 0xce,
34 0x97, 0xa1, 0xfe, 0x31, 0x9c, 0x83, 0x91, 0x37, 0x14, 0x18, 0x48, 0x21,
35 0x09, 0xd8, 0x88, 0xe6, 0x6a, 0xd7, 0xa1, 0x43, 0x12, 0x4f, 0x46, 0x46,
36 0x54, 0x18, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x19, 0x00, 0x00, 0x00,
38 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08,
39 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00, 0x00,
40 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43,
41 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74,
42 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48,
43 0x20, 0x00, 0xc3, 0xd6, 0x7b, 0x88, 0x85, 0xf9, 0x2a, 0x82, 0x3a, 0xbd,
44 0x11, 0xe6, 0x1e, 0x52, 0xa3, 0x10, 0xbc, 0xf6, 0x87, 0xcf, 0x2b, 0x30,
45 0xb1, 0x9a, 0xa7, 0x8c, 0xf0, 0x69, 0xee, 0x5a, 0x25, 0x8c, 0x4f, 0x46,
46 0x46, 0x54, 0x18, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x25, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00,
49 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x78, 0x00,
50 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f,
51 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74,
52 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48,
53 0x20, 0x00, 0x9f, 0x6c, 0xde, 0x3a, 0x59, 0x77, 0x6a, 0xd2, 0x35, 0x5f,
54 0x27, 0x58, 0x9c, 0x4b, 0xdb, 0x9c, 0x88, 0xf7, 0xdf, 0x70, 0x9e, 0x17,
55 0x60, 0xc0, 0xe8, 0x92, 0xf3, 0x9d, 0xc8, 0x6a, 0x12, 0x45, 0x4f, 0x46,
56 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x3e, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00,
59 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00,
60 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f,
61 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e,
62 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53,
63 0x48, 0x20, 0x00, 0xa0, 0xfa, 0x0c, 0x39, 0x0e, 0x54, 0xa2, 0xb2, 0x34,
64 0x03, 0x53, 0x34, 0x18, 0x63, 0x46, 0x2e, 0x1a, 0x02, 0x79, 0x8d, 0x88,
65 0x29, 0x32, 0xb9, 0xcc, 0xcd, 0x6b, 0xaa, 0xd8, 0x7a, 0x01, 0xd6, 0x4f,
66 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x5a, 0x00,
68 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01,
69 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x29,
70 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, 0x00, 0x02, 0x00, 0x70,
71 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f,
72 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, 0x54, 0x59, 0x04, 0x00,
73 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, 0x35, 0x00, 0x00, 0x00,
74 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, 0x70, 0x6f, 0x73, 0x69,
75 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
76 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00,
77 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, 0x03, 0x00, 0x04, 0x06,
78 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
79 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
80 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
81 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
82 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
83 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
84 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
85 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
86 0x00, 0xac, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
87 0xde, 0x21, 0x0c, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20,
88 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
89 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
90 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
91 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
92 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
93 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8,
94 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
95 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff,
96 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78,
97 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30,
98 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e,
99 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d,
100 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c,
101 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c,
102 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78,
103 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70,
104 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08,
105 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0,
106 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00,
107 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
108 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d,
109 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d,
110 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d,
111 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00,
112 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68,
113 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
114 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
115 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d,
116 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
117 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70,
118 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98,
119 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
120 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
121 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d,
122 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90,
123 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58,
124 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0,
125 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28,
126 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f,
127 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d,
128 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
129 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, 0xc2, 0x00, 0x2c, 0x40,
130 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83,
131 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03,
132 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, 0x1b, 0x08, 0x60, 0x01,
133 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c,
134 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1c,
135 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
136 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
137 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
138 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
139 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
140 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0,
141 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
142 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
143 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
144 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88,
145 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6,
146 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00,
147 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
148 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
149 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51,
150 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
151 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80,
152 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0,
153 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
154 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0,
155 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60,
156 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
157 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
158 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
159 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0,
160 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20,
161 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
162 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
163 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40,
164 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0,
165 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90,
166 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
167 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10,
168 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
169 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
170 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60,
171 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
172 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10,
173 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10,
174 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
175 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80,
176 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18,
177 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00,
178 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c,
179 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x30, 0x02,
180 0x50, 0x80, 0x01, 0x45, 0x50, 0x20, 0x65, 0x50, 0x08, 0x05, 0x41, 0x6c,
181 0x04, 0x80, 0xd6, 0x58, 0x82, 0x24, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
182 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2,
183 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x42,
184 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b,
185 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x07, 0xe3, 0x20, 0x08,
186 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae,
187 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6,
188 0x85, 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac,
189 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65,
190 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, 0xd1, 0x54,
191 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x45, 0xe0,
192 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6,
193 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17,
194 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e,
195 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74,
196 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
197 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5,
198 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5,
199 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95,
200 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a,
201 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0,
202 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f,
203 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64,
204 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca,
205 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92,
206 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b,
207 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d,
208 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94,
209 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14,
210 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04,
211 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f,
212 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, 0xd8, 0xde,
213 0xc2, 0xe8, 0x98, 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, 0xe9, 0x95,
214 0x0d, 0x51, 0x92, 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, 0x88, 0x91,
215 0x50, 0x09, 0x96, 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, 0xca, 0xe4,
216 0xe8, 0xca, 0xf0, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, 0x85, 0xa5,
217 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5,
218 0xb9, 0x91, 0x95, 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, 0x0b, 0xa3,
219 0x2b, 0x23, 0x43, 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, 0x63, 0x0b,
220 0x1b, 0x2b, 0x43, 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, 0x4a, 0xa1,
221 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, 0xc4, 0x4b,
222 0x3e, 0x45, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, 0x44, 0x4a,
223 0xa6, 0x21, 0x94, 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, 0x24, 0x60,
224 0x90, 0x40, 0x49, 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, 0xce, 0x45,
225 0xac, 0xce, 0xcc, 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, 0x8b, 0x58,
226 0x9d, 0x99, 0x59, 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x91, 0xb0,
227 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, 0x72, 0x2e,
228 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a,
229 0x65, 0xbc, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2,
230 0xe0, 0xca, 0xbe, 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, 0xd2, 0xf4,
231 0xca, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, 0x50, 0x81,
232 0x93, 0x7b, 0x53, 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, 0x02, 0x06,
233 0x0a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, 0xa1, 0x04,
234 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25,
235 0x69, 0x90, 0x48, 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, 0x9b, 0x33,
236 0x7b, 0x93, 0x6b, 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, 0x52, 0x06,
237 0xca, 0x90, 0x7c, 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c,
238 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, 0x1b, 0x0c,
239 0x41, 0x12, 0x31, 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, 0x86, 0x18,
240 0x08, 0x90, 0x74, 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, 0x83, 0x7b,
241 0xa3, 0x2b, 0x73, 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, 0x33, 0x95,
242 0xd6, 0x06, 0xc7, 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, 0x25, 0x14,
243 0x14, 0x34, 0x44, 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, 0x22, 0x07,
244 0x4c, 0x32, 0xc4, 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0xa1, 0x18, 0x84,
245 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd,
246 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11, 0x31, 0x7d, 0x4d, 0xbd, 0xb1, 0xa5,
247 0x91, 0x7d, 0xd9, 0x95, 0xc9, 0xd1, 0x95, 0xe1, 0xa5, 0x0c, 0x21, 0x12,
248 0x3b, 0x48, 0xea, 0x80, 0x56, 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a,
249 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, 0x1b, 0x5c, 0x59, 0x4b, 0x98, 0xdc, 0x19,
250 0xca, 0x4c, 0xca, 0x10, 0x23, 0xc1, 0x83, 0xc4, 0x0e, 0x92, 0x3b, 0x18,
251 0x22, 0x24, 0x78, 0x40, 0x2b, 0x2c, 0x4d, 0xae, 0x25, 0x8c, 0x2d, 0x2d,
252 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x25, 0x4c, 0xee, 0x0c,
253 0x45, 0x26, 0x65, 0x88, 0x91, 0xec, 0x41, 0x62, 0x07, 0x89, 0x1e, 0x0c,
254 0x11, 0x92, 0x3d, 0x18, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8,
255 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98,
256 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28,
257 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e,
258 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f,
259 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e,
260 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e,
261 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b,
262 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25,
263 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e,
264 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f,
265 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67,
266 0x84, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f,
267 0xf4, 0x50, 0x0e, 0xf8, 0x30, 0x25, 0x78, 0x03, 0x00, 0x79, 0x18, 0x00,
268 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
269 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
270 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
271 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
272 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
273 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
274 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
275 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
276 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
277 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
278 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
279 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
280 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
281 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
282 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
283 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
284 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
285 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
286 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
287 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
288 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
289 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
290 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
291 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
292 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
293 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
294 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
295 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
296 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
297 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
298 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
299 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
300 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
301 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
302 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
303 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
304 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
305 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
306 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
307 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
308 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
309 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
310 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
311 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
312 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
313 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
314 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
315 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
316 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
317 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
318 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
319 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
320 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
321 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
322 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
323 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00,
324 0x00, 0x06, 0x00, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x45,
325 0x44, 0x13, 0x71, 0x01, 0x00, 0x61, 0x20, 0x00, 0x00, 0x5c, 0x00, 0x00,
326 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00,
327 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10,
328 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, 0x15, 0x41, 0x09, 0x94,
329 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00,
330 0x08, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x00, 0xe3, 0x11, 0x8d,
331 0x94, 0x49, 0x14, 0x94, 0xf1, 0x08, 0x88, 0xda, 0x28, 0x0a, 0xca, 0x20,
332 0xc3, 0x70, 0x34, 0x26, 0x04, 0xf2, 0x19, 0x8f, 0xa0, 0xb0, 0xaf, 0xa1,
333 0xa0, 0x0c, 0x32, 0x1c, 0x8a, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8,
334 0x8c, 0x47, 0x64, 0x1d, 0x19, 0x4c, 0x14, 0x94, 0x41, 0x06, 0xe6, 0xc1,
335 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, 0x08, 0x4f, 0x0c, 0xd2,
336 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x94, 0x67, 0x42, 0x20, 0x1f, 0x2b,
337 0x02, 0xf8, 0x8c, 0x47, 0x88, 0xc1, 0x19, 0xb8, 0x01, 0x47, 0x41, 0x19,
338 0x64, 0x08, 0x34, 0x30, 0xb0, 0xa0, 0x92, 0xcf, 0x20, 0xc3, 0xb0, 0x8d,
339 0x81, 0x05, 0x93, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8, 0x60, 0x78, 0x67,
340 0x60, 0x41, 0x24, 0x1f, 0x1b, 0x02, 0xf8, 0x0c, 0x32, 0x24, 0x61, 0xb0,
341 0x06, 0x16, 0x3c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x78, 0xc4, 0x1b, 0xd0,
342 0xc1, 0x1e, 0xa0, 0x01, 0x05, 0x65, 0x90, 0x21, 0x38, 0x83, 0x36, 0xb0,
343 0x40, 0x0c, 0xe4, 0x33, 0xc8, 0x30, 0xa0, 0x01, 0x1c, 0x58, 0x00, 0x06,
344 0xf2, 0x19, 0x64, 0x28, 0xd4, 0x60, 0x0e, 0x2c, 0xe8, 0xe4, 0x33, 0xc8,
345 0x70, 0xb0, 0x81, 0x1d, 0x58, 0xa0, 0xc9, 0x67, 0x90, 0x81, 0x0f, 0xe2,
346 0xa0, 0x0e, 0x2c, 0x0b, 0xe4, 0x33, 0xc8, 0xe0, 0x07, 0x73, 0x80, 0x07,
347 0xe6, 0x04, 0xf2, 0xb1, 0x64, 0x80, 0x8f, 0x05, 0x0c, 0x7c, 0x2c, 0x48,
348 0xe0, 0x63, 0x01, 0x02, 0x1f, 0x0b, 0x0a, 0xf8, 0xcc, 0x36, 0xe4, 0x41,
349 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x78, 0x20, 0x64,
350 0x10, 0x10, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20,
351 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72, 0x0c, 0x01, 0x1d, 0x1c,
352 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8, 0xe0, 0xe0, 0x03, 0x24,
353 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f, 0x20, 0x79, 0xb0, 0xe5,
354 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83, 0x2d, 0x87, 0x15, 0xd0,
355 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6, 0x20, 0xa0, 0x83, 0x23,
356 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
358 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
359 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20,
360 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
361 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
362 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
363 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
364 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
365 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8,
366 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
367 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff,
368 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78,
369 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30,
370 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e,
371 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d,
372 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c,
373 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c,
374 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78,
375 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70,
376 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08,
377 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0,
378 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00,
379 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
380 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d,
381 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d,
382 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d,
383 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00,
384 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68,
385 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
386 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
387 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d,
388 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
389 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70,
390 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98,
391 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
392 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
393 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d,
394 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90,
395 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58,
396 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0,
397 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28,
398 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f,
399 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d,
400 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
401 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, 0x02, 0x01, 0x2c, 0x40,
402 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83,
403 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03,
404 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, 0x1b, 0x0a, 0x60, 0x01,
405 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c,
406 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1c,
407 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
408 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
409 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
410 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
411 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
412 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00,
413 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
414 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
415 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
416 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c,
417 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4,
418 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00,
419 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
420 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
421 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51,
422 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
423 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80,
424 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0,
425 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
426 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0,
427 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60,
428 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
429 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
430 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
431 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0,
432 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20,
433 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
434 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
435 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40,
436 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0,
437 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90,
438 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
439 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10,
440 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
441 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
442 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60,
443 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
444 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10,
445 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10,
446 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
447 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80,
448 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18,
449 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00,
450 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c,
451 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x50, 0x04,
452 0x23, 0x00, 0x05, 0x18, 0x50, 0x08, 0x65, 0x50, 0x20, 0x05, 0x41, 0x6c,
453 0x04, 0x80, 0xd6, 0x58, 0x82, 0x24, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
454 0x00, 0x06, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2,
455 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x22,
456 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b,
457 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x05, 0xe3, 0x20, 0x08,
458 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae,
459 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6,
460 0x85, 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac,
461 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65,
462 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, 0xd1, 0x54,
463 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x65, 0xe0,
464 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6,
465 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17,
466 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e,
467 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74,
468 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
469 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5,
470 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5,
471 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95,
472 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a,
473 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0,
474 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f,
475 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64,
476 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca,
477 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92,
478 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b,
479 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d,
480 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94,
481 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14,
482 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04,
483 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
484 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72,
485 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, 0xde, 0xc2,
486 0xe8, 0x64, 0x88, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x0d,
487 0x61, 0x92, 0x2a, 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, 0x86, 0x18,
488 0x09, 0x95, 0x60, 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c,
489 0x8e, 0xae, 0x0c, 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0x52, 0x58,
490 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0x57,
491 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30,
492 0xba, 0x32, 0x32, 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, 0x38, 0xb6,
493 0xb0, 0xb1, 0x32, 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, 0xaf, 0x94,
494 0x21, 0x94, 0x32, 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, 0x60, 0x90,
495 0x40, 0x89, 0x96, 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, 0x4b, 0x3e,
496 0x25, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, 0xb9, 0x86,
497 0x50, 0x8a, 0x90, 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, 0x41, 0x02,
498 0x25, 0x5a, 0x22, 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a,
499 0x33, 0xb3, 0x32, 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66,
500 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, 0xd2, 0xe4,
501 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9,
502 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1,
503 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b,
504 0xfb, 0x0a, 0x63, 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x23,
505 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, 0x4e, 0xee,
506 0x4d, 0xad, 0x6c, 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, 0x28, 0x46,
507 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, 0x24, 0x66,
508 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41,
509 0x22, 0x25, 0x6a, 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, 0xec, 0x4d,
510 0xae, 0x6d, 0x08, 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44,
511 0xf2, 0x29, 0x86, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68,
512 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, 0x44, 0x49,
513 0xc2, 0x20, 0x11, 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, 0x60, 0x88,
514 0x81, 0x00, 0x49, 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8,
515 0x37, 0xba, 0x32, 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53,
516 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42,
517 0x41, 0x41, 0x43, 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, 0x24, 0x72,
518 0xc0, 0x24, 0x43, 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x12, 0x86, 0x41,
519 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8,
520 0x1b, 0x5c, 0xd9, 0x1c, 0xca, 0x14, 0x11, 0xd3, 0xd7, 0xd0, 0x1b, 0x5c,
521 0xde, 0x97, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0x5e, 0xca, 0x10, 0x22, 0xb1,
522 0x83, 0xa4, 0x0e, 0x68, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85,
523 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0x84, 0xc9, 0x9d, 0xa1,
524 0xd0, 0xa4, 0x0c, 0x31, 0x12, 0x3c, 0x48, 0xec, 0x20, 0xb9, 0x83, 0x21,
525 0x42, 0x82, 0x07, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2,
526 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4, 0xce, 0x50,
527 0x66, 0x52, 0x86, 0x18, 0xc9, 0x1e, 0x24, 0x76, 0x90, 0xe8, 0xc1, 0x10,
528 0x21, 0xd9, 0x83, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b,
529 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39,
530 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2,
531 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0,
532 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0,
533 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30,
534 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10,
535 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60,
536 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02,
537 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0,
538 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40,
539 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46,
540 0x28, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x40,
541 0x0f, 0xe5, 0x80, 0x0f, 0x53, 0x82, 0x37, 0x00, 0x00, 0x79, 0x18, 0x00,
542 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
543 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
544 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
545 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
546 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
547 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
548 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
549 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
550 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
551 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
552 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
553 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
554 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
555 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
556 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
557 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
558 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
559 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
560 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
561 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
562 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
563 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
564 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
565 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
566 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
567 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
568 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
569 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
570 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
571 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
572 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
573 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
574 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
575 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
576 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
577 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
578 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
579 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
580 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
581 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
582 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
583 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
584 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
585 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
586 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
587 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
588 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
589 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
590 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
591 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
592 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
593 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
594 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
595 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
596 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
597 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00,
598 0x00, 0x06, 0xf0, 0xb0, 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x15, 0x11,
599 0x4d, 0xc4, 0x05, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00,
600 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
601 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10,
602 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, 0x95, 0x40, 0x19, 0x14,
603 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00,
604 0x00, 0xe3, 0x11, 0x8c, 0x84, 0x49, 0x14, 0x94, 0xf1, 0x88, 0x87, 0xd2,
605 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x60, 0x30, 0x26, 0x04, 0xf2, 0x19, 0x8f,
606 0x98, 0x30, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, 0x49, 0x64, 0x42, 0x20,
607 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x60, 0xdd, 0x18, 0x40, 0x14, 0x94,
608 0x41, 0x06, 0xc6, 0xb9, 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1,
609 0x88, 0x4e, 0x0c, 0xd0, 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x53, 0x67,
610 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, 0x84, 0xc1, 0x19, 0xb4,
611 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0xb2, 0xcf, 0x82, 0x4a, 0x3e, 0x83,
612 0x0c, 0x83, 0x26, 0x06, 0x16, 0x4c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x20,
613 0x83, 0xd1, 0x99, 0x81, 0x05, 0x91, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8,
614 0x90, 0x80, 0x81, 0x1a, 0x58, 0xf0, 0xc8, 0xc7, 0x86, 0x00, 0x3e, 0xe3,
615 0x11, 0x6e, 0x40, 0x07, 0x7a, 0x80, 0x06, 0x14, 0x94, 0x41, 0x86, 0xc0,
616 0x0c, 0xd8, 0xc0, 0x02, 0x31, 0x90, 0xcf, 0x20, 0xc3, 0x70, 0x06, 0x6f,
617 0x60, 0x01, 0x18, 0xc8, 0x67, 0x90, 0xa1, 0x48, 0x03, 0x39, 0xb0, 0xa0,
618 0x93, 0xcf, 0x20, 0xc3, 0xb1, 0x06, 0x75, 0x60, 0x81, 0x26, 0x9f, 0x41,
619 0x06, 0x3e, 0x78, 0x03, 0x3a, 0xb0, 0x2c, 0x90, 0xcf, 0x20, 0x83, 0x1f,
620 0xc4, 0xc1, 0x1d, 0x98, 0x13, 0xc8, 0xc7, 0x92, 0x01, 0x3e, 0x16, 0x30,
621 0xf0, 0xb1, 0x20, 0x81, 0x8f, 0x05, 0x08, 0x7c, 0x2c, 0x28, 0xe0, 0x33,
622 0xdb, 0x90, 0x07, 0x01, 0x30, 0xdb, 0x10, 0x94, 0x42, 0x30, 0xdb, 0x10,
623 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
624 0x00, 0x5b, 0x8e, 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72,
625 0x0c, 0x01, 0x1d, 0x1c, 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8,
626 0xe0, 0xe0, 0x03, 0x24, 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f,
627 0x20, 0x79, 0xb0, 0xe5, 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83,
628 0x2d, 0x87, 0x15, 0xd0, 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6,
629 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
630 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
631 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff,
632 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xfd, 0x02, 0x00,
633 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
634 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
635 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
636 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32,
637 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90,
638 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8,
639 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00,
640 0x00, 0x51, 0x18, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24,
641 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x8a, 0x08, 0x07, 0x78,
642 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77,
643 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a,
644 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21,
645 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1,
646 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0,
647 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c,
648 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76,
649 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
650 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
651 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
652 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
653 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1,
654 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1,
655 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1,
656 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79,
657 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77,
658 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
659 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
660 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0,
661 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
662 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79,
663 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72,
664 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
665 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
666 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01,
667 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
668 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a,
669 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a,
670 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
671 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d,
672 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1,
673 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
674 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c,
675 0xc2, 0x00, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88,
676 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc,
677 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0x00, 0x00,
678 0x00, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40,
679 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08,
680 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22,
681 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84,
682 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00,
683 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c,
684 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06,
685 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60,
686 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30,
687 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xa8, 0x70,
688 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78,
689 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37,
690 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f,
691 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07,
692 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07,
693 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06,
694 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07,
695 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07,
696 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07,
697 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07,
698 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
699 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07,
700 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07,
701 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07,
702 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07,
703 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
704 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07,
705 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
706 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07,
707 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06,
708 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07,
709 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07,
710 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07,
711 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07,
712 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f,
713 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07,
714 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07,
715 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07,
716 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07,
717 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, 0x03, 0x00, 0x80, 0x00,
718 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0d, 0x00, 0x00,
719 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
720 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, 0x28, 0x81, 0x22, 0x28,
721 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0xc2,
722 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, 0x29, 0x94, 0x82, 0xa1,
723 0x1c, 0x4b, 0x90, 0x04, 0x00, 0x79, 0x18, 0x00, 0x00, 0x27, 0x01, 0x00,
724 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32,
725 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, 0x1c, 0x40, 0x42, 0x51,
726 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62,
727 0x20, 0xc3, 0x21, 0x20, 0x02, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c,
728 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed,
729 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06,
730 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06,
731 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x70, 0x10, 0x43,
732 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36,
733 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, 0x16, 0x96, 0x26, 0xe7,
734 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6,
735 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36,
736 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70,
737 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74,
738 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x63, 0x21,
739 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95,
740 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9,
741 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1,
742 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c, 0x99,
743 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d, 0xa3,
744 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2,
745 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34,
746 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, 0xa2, 0x21, 0xc2, 0x21, 0x51,
747 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3,
748 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, 0x76, 0x56, 0xe6, 0x56, 0x26,
749 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, 0xf7, 0x36, 0x97, 0x46, 0x97,
750 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0x25, 0x2c, 0x4d,
751 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c,
752 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, 0x18, 0x5d, 0x9a, 0x5d, 0x19,
753 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x32, 0x61, 0x69, 0x72, 0x2e,
754 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, 0xe6,
755 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, 0x48, 0x70, 0x50, 0x47, 0x75,
756 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, 0x87, 0x46, 0xeb, 0xac, 0xcc,
757 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, 0xa5, 0x66, 0xec, 0x8d, 0xed,
758 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, 0x85, 0xc5, 0xd8, 0x1b, 0xdb,
759 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, 0xe0, 0x0e, 0xeb, 0xb8, 0x0e,
760 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x88, 0xd5,
761 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, 0x93, 0x73, 0x11, 0xab, 0x33,
762 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xa3, 0x14, 0x96, 0x26,
763 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, 0xf6, 0xe6, 0xf6, 0x95, 0xe6,
764 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, 0xce, 0x45, 0xae, 0x2c, 0x8c,
765 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, 0x9d, 0x5c, 0xdd, 0x18, 0xdd,
766 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, 0x9b, 0xd9, 0x1b, 0x0b, 0x33,
767 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f,
768 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, 0xca, 0xf0, 0xe8, 0xea, 0xe4,
769 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, 0xa4, 0xb9, 0xc1, 0xd5, 0xd1,
770 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, 0x7b, 0x63, 0x7b, 0x93, 0xfb,
771 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16,
772 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0xc6, 0x87, 0xee, 0xcd,
773 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, 0x6c, 0x8c, 0xee, 0x4d, 0x2e,
774 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x97, 0x59, 0xd8,
775 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, 0x32, 0xb9, 0xaf, 0x3b, 0xb4,
776 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, 0x37, 0xba, 0x21, 0xb0, 0x80,
777 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x65, 0x80, 0x08, 0x88, 0x80,
778 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, 0x88, 0x80, 0x04, 0x07, 0x19,
779 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x68, 0x80,
780 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x69, 0x80, 0x24, 0x88, 0x80,
781 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, 0x88, 0x80, 0x04, 0x07, 0x19,
782 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6c, 0xc0,
783 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f, 0xae,
784 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, 0x58, 0x9a, 0x9c, 0x4b, 0x98,
785 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x18, 0x5b, 0xda, 0x99,
786 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, 0x29, 0xb4, 0x30, 0xb2, 0x32,
787 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x06, 0x63,
788 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, 0x03, 0xc4, 0x38, 0xc2, 0x00,
789 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, 0x8e, 0x36, 0x38, 0xdc, 0x00,
790 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, 0xe0, 0xe0, 0xc8, 0x8e, 0x38,
791 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, 0x30, 0xc4, 0x30, 0x80, 0x63,
792 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, 0x5a,
793 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, 0xdd,
794 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a,
795 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65,
796 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0xe3,
797 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, 0xa0, 0x34, 0x43, 0x8c, 0x83,
798 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, 0x70, 0xd4, 0xc1, 0xa1, 0x07,
799 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, 0xa0, 0x40, 0x87, 0x1e, 0x28,
800 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, 0x22, 0x1d, 0x7a, 0xa0, 0x4c,
801 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, 0x83, 0x43, 0x0f, 0x14, 0x87,
802 0x64, 0x10, 0x96, 0x26, 0xd7, 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32,
803 0x37, 0xf6, 0x06, 0x57, 0x36, 0x87, 0x32, 0x45, 0xc4, 0xf4, 0x35, 0xf5,
804 0xc6, 0x96, 0x46, 0xf6, 0x65, 0x26, 0x17, 0x76, 0xd6, 0x56, 0xe6, 0x46,
805 0x97, 0x32, 0x84, 0x38, 0xfc, 0xe0, 0xe8, 0x03, 0x5a, 0x61, 0x69, 0x72,
806 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65,
807 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x43, 0x8c, 0x03, 0x14, 0x0e,
808 0x3f, 0x38, 0xfe, 0x60, 0x88, 0x70, 0x80, 0xc2, 0x88, 0x88, 0x1d, 0xd8,
809 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xda, 0xe1, 0x1d, 0xc8, 0xa1, 0x1e, 0xd8,
810 0xa1, 0x1c, 0xdc, 0xc0, 0x1c, 0xd8, 0x21, 0x1c, 0xce, 0x61, 0x1e, 0xa6,
811 0x08, 0xc1, 0x30, 0x42, 0x61, 0x07, 0x76, 0xb0, 0x87, 0x76, 0x70, 0x83,
812 0x74, 0x20, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0x14, 0x23, 0x96,
813 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, 0x7b, 0x28, 0x07, 0x79, 0x98, 0x87,
814 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x18, 0x23, 0xa8, 0x70, 0x48, 0x07,
815 0x79, 0x70, 0x03, 0x76, 0x08, 0x07, 0x77, 0x38, 0x87, 0x7a, 0x08, 0x87,
816 0x73, 0x28, 0x87, 0x5f, 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87,
817 0x77, 0x70, 0x87, 0x29, 0x01, 0x32, 0x62, 0x0a, 0x87, 0x74, 0x90, 0x07,
818 0x37, 0x18, 0x87, 0x77, 0x68, 0x07, 0x78, 0x48, 0x07, 0x76, 0x28, 0x87,
819 0x5f, 0x78, 0x07, 0x78, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x87,
820 0x29, 0x83, 0xc2, 0x38, 0x23, 0x98, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03,
821 0x73, 0x90, 0x87, 0x70, 0x38, 0x87, 0x76, 0x28, 0x07, 0x77, 0xa0, 0x87,
822 0x29, 0x01, 0x1d, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
823 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
824 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
825 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
826 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
827 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
828 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
829 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
830 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
831 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
832 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
833 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
834 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
835 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
836 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
837 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
838 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
839 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
840 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
841 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
842 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
843 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
844 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
845 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
846 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
847 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
848 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
849 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
850 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
851 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
852 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
853 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
854 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
855 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
856 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
857 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
858 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
859 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
860 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
861 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
862 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
863 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
864 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
865 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
866 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
867 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
868 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
869 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
870 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
871 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
872 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
873 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
874 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
875 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
876 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
877 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
878 0x00, 0x71, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x20, 0xb1,
879 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34,
880 0x13, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x14, 0x00, 0x00,
881 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
882 0x00, 0xd4, 0x73, 0x10, 0x41, 0x10, 0x68, 0x84, 0x65, 0x30, 0x03, 0x40,
883 0x3c, 0x03, 0x40, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00,
884 0x00, 0xe3, 0x0d, 0x06, 0x44, 0x50, 0x30, 0xe6, 0x18, 0x88, 0xc0, 0x1b,
885 0x64, 0x08, 0x0a, 0x64, 0x8e, 0x21, 0x28, 0x10, 0x0b, 0x18, 0xf9, 0x64,
886 0x10, 0x10, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20,
887 0xe0, 0x83, 0x23, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
888 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
890 0x00, 0x88, 0x18, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
891 0xde, 0x21, 0x0c, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20,
892 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
893 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
894 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45,
895 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
896 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
897 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8,
898 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
899 0x00, 0xef, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff,
900 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90,
901 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68,
902 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
903 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d,
904 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e,
905 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d,
906 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70,
907 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48,
908 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90,
909 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70,
910 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68,
911 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
912 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e,
913 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c,
914 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d,
915 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
916 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98,
917 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
918 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
919 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e,
920 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8,
921 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38,
922 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78,
923 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0,
924 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d,
925 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d,
926 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
927 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18,
928 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18,
929 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30,
930 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00,
931 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c,
932 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d,
933 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0,
934 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83,
935 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41,
936 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0x8c, 0xa1, 0x00,
937 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8,
938 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f, 0x18, 0xff,
939 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0,
940 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3,
941 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8,
942 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83,
943 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81,
944 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43,
945 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00, 0x0c, 0xee,
946 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40, 0x0f, 0xe9,
947 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60, 0x0e, 0xf2,
948 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90, 0x0e, 0xee,
949 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90, 0x0e, 0xed,
950 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43,
951 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3,
952 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03,
953 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b, 0xb4, 0x01,
954 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5,
955 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3,
956 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8,
957 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43,
958 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43,
959 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5,
960 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xe7,
961 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20, 0x0f, 0xef,
962 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4,
963 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3,
964 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c, 0xa4, 0x83,
965 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4,
966 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3,
967 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3,
968 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6,
969 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00,
970 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43,
971 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03,
972 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x40, 0x8e, 0xff, 0xff,
973 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0,
974 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0x80, 0x28, 0xff,
975 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9,
976 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0xc3, 0xc4, 0xfc, 0xff,
977 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, 0x34, 0xb8, 0xc3, 0x3b, 0xb4, 0x81,
978 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, 0xcc, 0x03,
979 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40,
980 0x18, 0x88, 0x09, 0x41, 0x31, 0x21, 0x30, 0x26, 0x0c, 0x07, 0x92, 0x4c,
981 0x18, 0x14, 0x24, 0x99, 0x10, 0x2c, 0x13, 0x02, 0x06, 0x89, 0x20, 0x00,
982 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85,
983 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90,
984 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x9c, 0xc1,
985 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14,
986 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04,
987 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84,
988 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89,
989 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00, 0x18, 0x44, 0x28, 0x82,
990 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25, 0x80, 0x79, 0x16, 0x22,
991 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10, 0xca, 0x11, 0x04, 0x81,
992 0x40, 0x18, 0x08, 0x25, 0xc3, 0x08, 0x03, 0x50, 0x88, 0x65, 0x59, 0x16,
993 0x62, 0xca, 0x00, 0x00, 0x00, 0x39, 0x45, 0x00, 0x00, 0x82, 0xca, 0x00,
994 0x2c, 0x0b, 0x49, 0xc5, 0x58, 0x16, 0x00, 0x00, 0x00, 0xa2, 0xca, 0xb0,
995 0x2c, 0x0b, 0x59, 0x45, 0x58, 0x16, 0xc2, 0xe6, 0x08, 0x82, 0x39, 0x02,
996 0x30, 0x18, 0x46, 0x10, 0xb6, 0x82, 0x04, 0x06, 0x22, 0x68, 0x9c, 0x06,
997 0x50, 0x37, 0x10, 0x90, 0x02, 0xdb, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x00,
998 0xc2, 0x14, 0xc0, 0x08, 0xc0, 0x30, 0xc2, 0xb0, 0x0d, 0x23, 0x10, 0x1b,
999 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
1000 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
1001 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51,
1002 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1003 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80,
1004 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0,
1005 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
1006 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0,
1007 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60,
1008 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
1009 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
1010 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1011 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0,
1012 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20,
1013 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
1014 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
1015 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40,
1016 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0,
1017 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90,
1018 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
1019 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10,
1020 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
1021 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
1022 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60,
1023 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
1024 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10,
1025 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10,
1026 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
1027 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80,
1028 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18,
1029 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x4c, 0x03,
1030 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xe6, 0x01, 0x02,
1031 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x13, 0x01, 0x01, 0x20,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0x99, 0x80, 0x00, 0x10, 0x00,
1033 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x54, 0x08, 0x30, 0x0c, 0x00, 0x00,
1034 0x00, 0x01, 0x00, 0x0c, 0x61, 0x1e, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00,
1035 0x00, 0x00, 0x86, 0x30, 0x17, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
1036 0x00, 0x43, 0x98, 0x0c, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80,
1037 0x21, 0xcc, 0x05, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10,
1038 0xc6, 0x03, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x04,
1039 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c,
1040 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xda, 0x46, 0x00, 0x0a,
1041 0xa1, 0x04, 0x8a, 0xa0, 0x20, 0x0a, 0xa8, 0x0c, 0x0a, 0xa3, 0x40, 0x0a,
1042 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x28, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28,
1043 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x02, 0xc7, 0x12, 0x24, 0x01,
1044 0x00, 0x79, 0x18, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c,
1045 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37,
1046 0xb7, 0x21, 0xc6, 0xe6, 0x7c, 0x00, 0x18, 0x80, 0x01, 0x95, 0xbb, 0x31,
1047 0xb4, 0x30, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0xb2, 0x21, 0xc6, 0xd6, 0x7c,
1048 0xc2, 0xc6, 0x30, 0x0e, 0x82, 0xe0, 0xe0, 0xd8, 0xca, 0x40, 0xda, 0xca,
1049 0xe8, 0xc2, 0xd8, 0x40, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x40,
1050 0x66, 0x64, 0x60, 0x64, 0x66, 0x5c, 0x68, 0x60, 0x68, 0x40, 0x50, 0xda,
1051 0xca, 0xe8, 0xc2, 0xd8, 0xcc, 0xca, 0x5a, 0x66, 0x64, 0x60, 0x64, 0x66,
1052 0x5c, 0x68, 0x60, 0x68, 0x52, 0x86, 0x08, 0x1f, 0x31, 0xc4, 0xd8, 0x9a,
1053 0xed, 0xd9, 0x16, 0x16, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x43, 0x90, 0xef,
1054 0xd8, 0x9a, 0xad, 0xd9, 0x16, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f,
1055 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d,
1056 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x2f,
1057 0x21, 0x17, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56,
1058 0xe6, 0x62, 0x16, 0x36, 0x47, 0xf7, 0xd5, 0x16, 0x46, 0x87, 0xf6, 0x55,
1059 0xe6, 0x16, 0x26, 0xc6, 0x56, 0x36, 0x44, 0xf8, 0x16, 0x92, 0x41, 0x58,
1060 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x99,
1061 0x5c, 0x58, 0x5b, 0x99, 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0x97, 0x59,
1062 0x19, 0xdd, 0x18, 0xda, 0x57, 0x99, 0x5b, 0x98, 0x18, 0x5b, 0xd9, 0x10,
1063 0xe1, 0x6b, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, 0x95,
1064 0xc9, 0x7d, 0xd1, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, 0x93,
1065 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, 0x0b,
1066 0x6b, 0x2b, 0xa3, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, 0xf9,
1067 0x9e, 0x6d, 0xf9, 0xa0, 0x2f, 0x1a, 0x22, 0x7c, 0x12, 0x99, 0xb0, 0x34,
1068 0x39, 0x17, 0xb8, 0xb7, 0xb9, 0x34, 0xba, 0xb4, 0x37, 0x37, 0x2a, 0x61,
1069 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x94, 0xc2, 0xd2,
1070 0xe4, 0x5c, 0xdc, 0xde, 0xbe, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6,
1071 0xe8, 0xd2, 0xec, 0xca, 0xc8, 0x84, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d,
1072 0x7d, 0xb9, 0x85, 0xb5, 0x95, 0x11, 0x81, 0x7b, 0x9b, 0x4b, 0xa3, 0x4b,
1073 0x7b, 0x73, 0x1b, 0x02, 0x6d, 0xcb, 0x47, 0x7d, 0xd5, 0x67, 0x7d, 0xd0,
1074 0x17, 0x7d, 0xd7, 0x87, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b,
1075 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0xa3,
1076 0x75, 0x56, 0xe6, 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x52, 0x33,
1077 0xf6, 0xc6, 0xf6, 0x26, 0x47, 0x64, 0x47, 0xf3, 0x65, 0x96, 0xc2, 0x27,
1078 0x2c, 0x4d, 0xce, 0x05, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, 0x8c, 0x2e,
1079 0xcd, 0xae, 0x8c, 0xc5, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x69, 0x6b,
1080 0x3e, 0xed, 0xdb, 0xbe, 0xea, 0xe3, 0x3e, 0xe8, 0x8b, 0xbe, 0xeb, 0xeb,
1081 0x98, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85, 0xd1, 0x95, 0x91, 0xa1, 0xe0,
1082 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x11, 0xd9, 0xc9, 0x7c,
1083 0x99, 0xa5, 0xd0, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x93, 0x21, 0x42, 0x57,
1084 0x86, 0x37, 0xf6, 0xf6, 0x26, 0x47, 0x36, 0x44, 0xda, 0x9c, 0x4f, 0xfb,
1085 0xbe, 0xaf, 0xfa, 0xb8, 0x0f, 0xfa, 0xc0, 0xe0, 0xbb, 0xbe, 0x30, 0xa0,
1086 0x12, 0x96, 0x26, 0xe7, 0x22, 0x56, 0x67, 0x66, 0x56, 0x26, 0xc7, 0x27,
1087 0x2c, 0x4d, 0xce, 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0xee, 0x6b, 0x2e,
1088 0x4d, 0xaf, 0x8c, 0x52, 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18,
1089 0x5d, 0xda, 0x9b, 0xdb, 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0x91, 0xb0,
1090 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x52, 0x61, 0x69, 0x72, 0x2e,
1091 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f,
1092 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0xc8, 0xcc,
1093 0x8d, 0x49, 0x1d, 0x09, 0x7d, 0xbd, 0xd5, 0xd1, 0xc1, 0xd5, 0xd1, 0x91,
1094 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b,
1095 0xa3, 0x92, 0xe6, 0x06, 0x57, 0x47, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xc6,
1096 0x65, 0xec, 0x8d, 0xed, 0x4d, 0xee, 0x6b, 0x6e, 0x2c, 0x8c, 0xad, 0x8c,
1097 0x0e, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x57, 0x5b, 0x19, 0x1d,
1098 0xda, 0x1b, 0x19, 0x1f, 0xba, 0x37, 0xb7, 0xb2, 0xb6, 0x30, 0xb8, 0x2f,
1099 0xb3, 0xb0, 0x31, 0xba, 0x37, 0xb9, 0x18, 0x3e, 0x74, 0x6f, 0x6e, 0x65,
1100 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x7c,
1101 0xe6, 0xc8, 0xe4, 0xbe, 0xee, 0xd0, 0xd2, 0xe8, 0xca, 0xbe, 0xe0, 0xde,
1102 0xd2, 0xdc, 0xe8, 0x86, 0xc0, 0xc2, 0xb6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68,
1103 0xf0, 0xa5, 0xc1, 0xc6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xa9, 0xc1,
1104 0xf6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xad, 0xc1, 0x26, 0x6d, 0xcc,
1105 0xb6, 0x7c, 0x68, 0xf0, 0xb1, 0xc1, 0x36, 0x6d, 0xcc, 0xb6, 0x7c, 0x68,
1106 0xf0, 0xb5, 0xc1, 0x46, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xb9, 0xc1,
1107 0x56, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xbd, 0xc1, 0x66, 0x6d, 0xcc,
1108 0xb6, 0x7c, 0x68, 0xf0, 0xc1, 0x01, 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30,
1109 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xb9, 0x34, 0xbd, 0x32,
1110 0x5e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70,
1111 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65,
1112 0x7c, 0xa6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x86, 0xde, 0xdc, 0xe6, 0xe8,
1113 0xc2, 0xdc, 0xe8, 0xe6, 0x18, 0x8c, 0x0d, 0x21, 0x83, 0x2d, 0xfa, 0xc6,
1114 0xe0, 0x23, 0x83, 0x0d, 0xfa, 0xca, 0x60, 0x5b, 0xb6, 0xe6, 0x33, 0x83,
1115 0xef, 0x0c, 0xbe, 0x38, 0xf8, 0xe4, 0x60, 0x83, 0xbe, 0x39, 0xd8, 0x98,
1116 0x0f, 0xfa, 0xe8, 0xe0, 0xbb, 0xbe, 0x3a, 0xe0, 0x12, 0x96, 0x26, 0xe7,
1117 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x46, 0x25, 0x2c, 0x4d, 0xce,
1118 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, 0x18, 0x5d, 0x19, 0x1e, 0x5d,
1119 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, 0xdb, 0x5b, 0x18, 0x1d, 0x0b,
1120 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x0f, 0x07, 0xba, 0x32, 0xbc,
1121 0x21, 0xd4, 0xc6, 0x7c, 0x77, 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x87,
1122 0x07, 0x1f, 0xf4, 0xe5, 0xc1, 0x77, 0x7d, 0x7a, 0xc0, 0x25, 0x2c, 0x4d,
1123 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc7, 0x5c, 0x58,
1124 0x1b, 0x1c, 0x5b, 0x99, 0x1c, 0x83, 0xb9, 0x21, 0xd2, 0x76, 0x7d, 0x7c,
1125 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x07, 0x7d, 0x7d, 0xf0, 0x5d, 0x9f,
1126 0x1f, 0x0c, 0x61, 0xbe, 0xec, 0xf3, 0x3e, 0x31, 0xf8, 0xec, 0xe0, 0xdb,
1127 0x83, 0xef, 0x0f, 0x86, 0x18, 0x0a, 0xf0, 0x4d, 0x1f, 0x28, 0x70, 0x0c,
1128 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6,
1129 0xde, 0xe0, 0xca, 0xe6, 0x50, 0xa6, 0x88, 0x98, 0xbe, 0x86, 0xde, 0xe0,
1130 0xf2, 0xbe, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0x52, 0x86,
1131 0x10, 0xdf, 0x28, 0x7c, 0xa2, 0x40, 0x2c, 0x2c, 0x4d, 0xae, 0x25, 0x8c,
1132 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x85, 0xae,
1133 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x6c, 0x6e, 0x88, 0xf1, 0x95, 0xc2, 0x37,
1134 0x0a, 0x1f, 0x29, 0x10, 0x0b, 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b,
1135 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x99, 0x0b, 0x6b, 0x83,
1136 0x63, 0x2b, 0x93, 0x9b, 0x1b, 0x62, 0x7c, 0xa7, 0xf0, 0x8d, 0xc2, 0x67,
1137 0x0a, 0x43, 0x88, 0xaf, 0x14, 0xbe, 0x53, 0xa0, 0x15, 0x96, 0x26, 0xd7,
1138 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0xd6,
1139 0x12, 0x26, 0x77, 0x86, 0x32, 0x93, 0x32, 0xc4, 0xf8, 0x54, 0xe1, 0x1b,
1140 0x85, 0x2f, 0x15, 0x86, 0x08, 0x9f, 0x2a, 0xb0, 0xfa, 0xd2, 0xa2, 0x9a,
1141 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b,
1142 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, 0x06, 0xf7,
1143 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, 0x67, 0x2a,
1144 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, 0x4a, 0x28,
1145 0x28, 0x68, 0x88, 0xf0, 0xb9, 0xc2, 0x10, 0xe3, 0x6b, 0x85, 0xef, 0x15,
1146 0xc2, 0x20, 0x1b, 0x62, 0x7c, 0x68, 0xf0, 0xc1, 0x42, 0x18, 0x64, 0x43,
1147 0xc4, 0xe0, 0x63, 0x85, 0x2f, 0x16, 0xc2, 0x20, 0xfb, 0x62, 0x21, 0x0c,
1148 0xb4, 0x2f, 0x16, 0xc2, 0x60, 0xfb, 0x62, 0x21, 0x0c, 0xb8, 0x2f, 0x16,
1149 0xc2, 0xa0, 0xfb, 0x62, 0x21, 0x0c, 0xbc, 0x2f, 0x16, 0xc2, 0xe0, 0xfb,
1150 0x62, 0x21, 0x0c, 0xb0, 0x21, 0xc6, 0x27, 0x0b, 0x5f, 0x2c, 0x84, 0xc1,
1151 0x36, 0xc4, 0xf8, 0x64, 0xe1, 0x8b, 0x85, 0x30, 0xc0, 0x86, 0x18, 0x9f,
1152 0x2c, 0x7c, 0xb1, 0x10, 0x06, 0xdd, 0x10, 0xe3, 0x93, 0x85, 0x2f, 0x16,
1153 0xc2, 0xc0, 0x1b, 0x62, 0x7c, 0xb2, 0xf0, 0xc5, 0x42, 0x18, 0x7c, 0x43,
1154 0x8c, 0x4f, 0x16, 0xbe, 0x58, 0x08, 0x03, 0x6d, 0x88, 0xf1, 0xc9, 0xc2,
1155 0x17, 0x0b, 0x61, 0xc0, 0x0d, 0x31, 0x3e, 0x59, 0xf8, 0x62, 0x21, 0x0c,
1156 0xb2, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0xb4, 0xc3,
1157 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39, 0xb0, 0x43,
1158 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2, 0x0e, 0xec,
1159 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4,
1160 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6,
1161 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x30,
1162 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10, 0x0e, 0xee,
1163 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60, 0x0f, 0xe5,
1164 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x64, 0xc4,
1165 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0, 0x0e, 0xf0,
1166 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40, 0x0f, 0xe9,
1167 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46, 0x30, 0xe1,
1168 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0x70, 0x0e, 0xed,
1169 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x50, 0x00, 0x79, 0x18, 0x00,
1170 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
1171 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
1172 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
1173 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
1174 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
1175 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
1176 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
1177 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
1178 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
1179 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
1180 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
1181 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
1182 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
1183 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
1184 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
1185 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
1186 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
1187 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
1188 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
1189 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
1190 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
1191 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
1192 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
1193 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
1194 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
1195 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
1196 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
1197 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
1198 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
1199 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
1200 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
1201 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
1202 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
1203 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
1204 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
1205 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
1206 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
1207 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
1208 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
1209 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
1210 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
1211 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
1212 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
1213 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
1214 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
1215 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
1216 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
1217 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
1218 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
1219 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
1220 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
1221 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
1222 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
1223 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
1224 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
1225 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x2e, 0x00, 0x00,
1226 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x45, 0x04,
1227 0x18, 0x0c, 0xd1, 0x4c, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, 0xb3,
1228 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, 0x51,
1229 0x14, 0x46, 0xd0, 0x00, 0x48, 0xe4, 0x0f, 0xce, 0xe4, 0x57, 0x77, 0x71,
1230 0xdb, 0xa6, 0xb0, 0x01, 0x48, 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f,
1231 0x11, 0xd7, 0x44, 0x45, 0xc4, 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x6d,
1232 0x08, 0x13, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, 0x5f, 0x00, 0x81, 0xe4,
1233 0x57, 0x77, 0x71, 0xdb, 0x16, 0x40, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34,
1234 0xfd, 0xc2, 0x02, 0x30, 0x8f, 0x5f, 0xdd, 0xc5, 0x6d, 0x5b, 0xc2, 0x04,
1235 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x17, 0x0c, 0x70, 0xf9, 0xd5, 0x5d,
1236 0xdc, 0xb6, 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3,
1237 0x58, 0x7e, 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34,
1238 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x66, 0x10, 0x01, 0x48, 0xe4,
1239 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x71, 0xdb, 0x76, 0x20,
1240 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d,
1241 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x9a, 0x01, 0x00,
1242 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x51, 0x00, 0x00,
1243 0x00, 0x64, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, 0x41, 0x2c, 0x8d, 0xd3,
1244 0x06, 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdc, 0x08, 0x00,
1245 0x6d, 0xc5, 0x30, 0x03, 0x50, 0x0e, 0xa4, 0x8d, 0x00, 0xd4, 0x00, 0x01,
1246 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3, 0xe6, 0x1c,
1247 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, 0x63, 0x04, 0x20,
1248 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30, 0x03, 0x30,
1249 0x07, 0x91, 0x0a, 0xaf, 0x90, 0x0a, 0x75, 0x40, 0xcb, 0x0c, 0xc0, 0x08,
1250 0xc0, 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08,
1251 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93,
1252 0x1e, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03,
1253 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20,
1254 0xc8, 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08,
1255 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80,
1256 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2,
1257 0x6d, 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23,
1258 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08,
1259 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c,
1260 0x87, 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3,
1261 0xf1, 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4,
1262 0xff, 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe,
1263 0x30, 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef,
1264 0x0b, 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2,
1265 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf,
1266 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0xdb,
1267 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46,
1268 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18,
1269 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00, 0x00,
1270 0x00, 0x23, 0x06, 0x4a, 0x11, 0x98, 0xc2, 0x1a, 0xa8, 0x41, 0x1b, 0x80,
1271 0x41, 0x19, 0x84, 0x41, 0x30, 0xde, 0xd0, 0x06, 0x78, 0x30, 0x0a, 0x14,
1272 0x8c, 0xe1, 0x86, 0x00, 0x0c, 0x82, 0x59, 0x86, 0x40, 0x08, 0x06, 0x19,
1273 0x08, 0x4f, 0x0d, 0xc6, 0x1b, 0xe2, 0x80, 0x0f, 0xce, 0x80, 0x82, 0x31,
1274 0x62, 0x40, 0x18, 0xc1, 0x2b, 0x0c, 0x23, 0x06, 0x85, 0x11, 0xc4, 0x42,
1275 0xb0, 0x59, 0xb0, 0xc1, 0x67, 0xc4, 0xa0, 0x30, 0x82, 0x58, 0x08, 0xc0,
1276 0xc0, 0x06, 0x4e, 0x3e, 0xc6, 0x05, 0xf1, 0xb1, 0x21, 0xa0, 0xcf, 0x88,
1277 0x01, 0x61, 0x04, 0xb6, 0x10, 0x8c, 0x18, 0x14, 0x46, 0x80, 0x0b, 0x81,
1278 0x67, 0x81, 0x27, 0x9f, 0x39, 0x06, 0x34, 0x58, 0x6c, 0x61, 0x90, 0x21,
1279 0x48, 0x83, 0x3c, 0xb0, 0x21, 0xa0, 0xcf, 0x20, 0x43, 0xb0, 0x06, 0x7c,
1280 0x30, 0xc8, 0x10, 0x54, 0x7e, 0x30, 0x4b, 0x20, 0x0c, 0x54, 0x04, 0x42,
1281 0xc0, 0x06, 0xc0, 0x78, 0xc3, 0x28, 0xb8, 0xc2, 0x2e, 0x50, 0x30, 0x86,
1282 0x1b, 0x02, 0xcd, 0x99, 0x65, 0x18, 0x88, 0x60, 0x90, 0x81, 0xa0, 0x03,
1283 0x50, 0x18, 0x6f, 0x38, 0x05, 0x59, 0xa0, 0x05, 0x0a, 0xc6, 0x78, 0x43,
1284 0x2a, 0xd0, 0x42, 0x28, 0x50, 0x30, 0x46, 0x0c, 0x90, 0x23, 0x52, 0x87,
1285 0xa2, 0x3b, 0x86, 0x60, 0x90, 0x21, 0xb8, 0x03, 0x54, 0x18, 0x64, 0x08,
1286 0x16, 0x55, 0x98, 0x25, 0x20, 0x06, 0x2a, 0x02, 0x61, 0xc0, 0x84, 0xe1,
1287 0x86, 0x30, 0x50, 0x83, 0x60, 0x96, 0xa1, 0x98, 0x82, 0xf1, 0x06, 0x58,
1288 0xd8, 0x85, 0x73, 0xa0, 0x60, 0x0c, 0x37, 0x04, 0x6d, 0x10, 0xcc, 0x32,
1289 0x18, 0x47, 0x30, 0xc8, 0x50, 0x84, 0x42, 0x2b, 0x8c, 0x37, 0xd0, 0xc2,
1290 0x2f, 0x9c, 0x03, 0x05, 0x63, 0x8e, 0x21, 0x14, 0x82, 0x77, 0x18, 0x64,
1291 0x08, 0x44, 0x41, 0x16, 0x2c, 0x28, 0xe4, 0x33, 0xc8, 0x10, 0x90, 0x42,
1292 0x2d, 0xcc, 0x12, 0xb4, 0xc1, 0x78, 0x83, 0x2e, 0x94, 0xc3, 0x3c, 0x50,
1293 0x30, 0xc6, 0x1b, 0x78, 0xe1, 0x1c, 0xde, 0x81, 0x82, 0x31, 0xc8, 0x00,
1294 0xb1, 0x82, 0x2e, 0x0c, 0x37, 0x10, 0x74, 0xe0, 0xcc, 0x32, 0x20, 0x52,
1295 0x30, 0x86, 0x20, 0xe5, 0xc3, 0x70, 0x43, 0xd0, 0x07, 0xca, 0x2c, 0x83,
1296 0x92, 0x04, 0x26, 0xfc, 0x81, 0x7c, 0x66, 0x09, 0x16, 0x1b, 0x42, 0x01,
1297 0x3e, 0x23, 0x06, 0x84, 0x11, 0x94, 0x44, 0x60, 0x01, 0x2e, 0xc8, 0x67,
1298 0xc4, 0xa0, 0x30, 0x02, 0x94, 0x08, 0x70, 0x61, 0x96, 0x60, 0x19, 0xa8,
1299 0x00, 0x94, 0x44, 0x50, 0xe6, 0x18, 0x6a, 0x21, 0x08, 0x89, 0x31, 0x84,
1300 0x0d, 0x24, 0x86, 0x1b, 0x02, 0x53, 0x50, 0x66, 0x19, 0x1a, 0x26, 0x30,
1301 0x01, 0x15, 0xe4, 0x33, 0x4b, 0xe0, 0xd8, 0xa0, 0x0a, 0xf0, 0x19, 0x31,
1302 0x20, 0x8c, 0xc0, 0x25, 0x02, 0x0b, 0xc2, 0x41, 0x3e, 0x23, 0x06, 0x85,
1303 0x11, 0xc4, 0x44, 0x10, 0x0e, 0xb3, 0x04, 0xce, 0x40, 0x05, 0xa0, 0x30,
1304 0x42, 0x33, 0xc7, 0x90, 0x04, 0x28, 0x31, 0x86, 0x40, 0x06, 0x28, 0x31,
1305 0xdc, 0x10, 0xbc, 0x82, 0x32, 0xcb, 0x00, 0x3d, 0x81, 0x09, 0xb1, 0x20,
1306 0x9f, 0x59, 0x82, 0xc8, 0x86, 0x59, 0x80, 0xcf, 0x88, 0x01, 0x61, 0x04,
1307 0x37, 0x11, 0x58, 0xa0, 0x0e, 0xf2, 0x19, 0x31, 0x28, 0x8c, 0x40, 0x27,
1308 0x02, 0x75, 0x98, 0x25, 0x88, 0x06, 0x2a, 0x00, 0xe5, 0x11, 0xa0, 0x39,
1309 0x86, 0x24, 0x80, 0x89, 0x59, 0x02, 0x69, 0xa0, 0x22, 0x10, 0x22, 0x3d,
1310 0x38, 0x06, 0x19, 0x02, 0x75, 0xb0, 0x87, 0x39, 0x06, 0x74, 0x00, 0x03,
1311 0x9b, 0x18, 0x64, 0x08, 0xd2, 0x21, 0x1f, 0x6c, 0x08, 0xe4, 0x33, 0xc8,
1312 0x10, 0xac, 0x03, 0x3f, 0xcc, 0x12, 0xb4, 0xc1, 0x70, 0xc3, 0x2c, 0xc4,
1313 0x43, 0x30, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8, 0x40, 0x07, 0xf0, 0xc0,
1314 0x0f, 0xe3, 0x0d, 0x23, 0xe1, 0x12, 0x3c, 0x41, 0xc1, 0x18, 0x6f, 0x28,
1315 0x09, 0x98, 0xc0, 0x09, 0x0a, 0xc6, 0x1c, 0x83, 0x3c, 0x04, 0x60, 0x31,
1316 0xc8, 0x10, 0xcc, 0xc3, 0x48, 0x58, 0x70, 0xc8, 0x67, 0x90, 0x21, 0xa8,
1317 0x07, 0x93, 0x18, 0x6e, 0x38, 0xc0, 0xc1, 0x99, 0x65, 0xf8, 0xaa, 0x60,
1318 0x0c, 0x61, 0x28, 0x8b, 0xe1, 0x86, 0x60, 0x1c, 0x94, 0x59, 0x86, 0xcb,
1319 0x0a, 0x4c, 0x28, 0x07, 0xf9, 0xcc, 0x12, 0x60, 0x23, 0x06, 0x84, 0x11,
1320 0xc0, 0xc5, 0x30, 0x62, 0x50, 0x18, 0x81, 0x5c, 0x04, 0xe8, 0x60, 0x81,
1321 0x3a, 0xc8, 0xc7, 0x02, 0x76, 0x80, 0xcf, 0x2c, 0x01, 0x36, 0x50, 0x01,
1322 0x28, 0x96, 0x70, 0xcd, 0x31, 0xf4, 0x43, 0xd0, 0x16, 0x63, 0x08, 0x0c,
1323 0x5b, 0x0c, 0x37, 0x04, 0xec, 0xa0, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x82,
1324 0x3b, 0xc8, 0x67, 0x96, 0x60, 0x1b, 0x31, 0x20, 0x8c, 0x20, 0x2f, 0x86,
1325 0x11, 0x83, 0xc2, 0x08, 0xf6, 0x22, 0x88, 0x07, 0x0b, 0xe6, 0x41, 0x3e,
1326 0x16, 0xd4, 0x03, 0x7c, 0x66, 0x09, 0xb6, 0x81, 0x0a, 0x40, 0xc9, 0x04,
1327 0x6d, 0x8e, 0x21, 0x09, 0xe8, 0x62, 0x0c, 0xa1, 0xa2, 0x8b, 0xe1, 0x86,
1328 0xa0, 0x1e, 0x94, 0x59, 0x86, 0x8e, 0x0b, 0x4c, 0xb8, 0x07, 0xf9, 0xcc,
1329 0x12, 0x78, 0x23, 0x06, 0x84, 0x11, 0x88, 0xc6, 0x30, 0x62, 0x50, 0x18,
1330 0x01, 0x69, 0x04, 0xfa, 0x60, 0x01, 0x3f, 0xc8, 0xc7, 0x02, 0x7f, 0x80,
1331 0xcf, 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c, 0xd0, 0xcd, 0x31, 0x24,
1332 0x01, 0x5f, 0x8c, 0x18, 0x18, 0x46, 0xa0, 0x1a, 0x41, 0x4c, 0xbc, 0xc4,
1333 0x20, 0x43, 0x30, 0x13, 0x64, 0x31, 0x4b, 0xf0, 0x0d, 0x54, 0x04, 0x7e,
1334 0x40, 0x09, 0xde, 0x20, 0x43, 0x80, 0x13, 0x66, 0x31, 0x4b, 0xd0, 0x06,
1335 0xb3, 0x0c, 0x61, 0xd0, 0x06, 0xfc, 0x30, 0xc8, 0xd0, 0x0b, 0x39, 0x51,
1336 0x16, 0x23, 0x06, 0x85, 0x11, 0xb0, 0x46, 0xd0, 0x12, 0x73, 0x0c, 0x36,
1337 0x11, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xae, 0x31, 0xb8, 0xc4, 0x1c,
1338 0x83, 0x10, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xb0, 0x51, 0xbc, 0xc4,
1339 0x1c, 0x83, 0x10, 0x9c, 0xc6, 0x20, 0x43, 0xd0, 0x13, 0x6e, 0x31, 0xc8,
1340 0x10, 0x94, 0x03, 0x5c, 0x8c, 0x37, 0xd0, 0xc5, 0x5f, 0xb4, 0x06, 0x05,
1341 0x63, 0xbc, 0xc1, 0x2e, 0x42, 0x23, 0x35, 0x28, 0x18, 0x73, 0x0c, 0x63,
1342 0x11, 0xc4, 0xc6, 0x20, 0x43, 0x40, 0x16, 0x74, 0x61, 0x41, 0x22, 0x9f,
1343 0x41, 0x86, 0xc0, 0x2c, 0xee, 0x62, 0xb8, 0xe1, 0x88, 0x09, 0x67, 0x96,
1344 0x81, 0x0d, 0xc4, 0x20, 0x18, 0x43, 0x18, 0x6c, 0x63, 0xb8, 0x21, 0xa0,
1345 0x09, 0x65, 0x96, 0x81, 0x0c, 0xc6, 0x20, 0x30, 0xc1, 0x26, 0xe4, 0x33,
1346 0x4b, 0x50, 0x06, 0x23, 0x06, 0x84, 0x11, 0x84, 0xc7, 0x30, 0x62, 0x50,
1347 0x18, 0xc1, 0x78, 0x04, 0x39, 0x61, 0xc1, 0x4e, 0xc8, 0xc7, 0x82, 0x9e,
1348 0x80, 0xcf, 0x2c, 0x41, 0x19, 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64,
1349 0x30, 0xc7, 0xe0, 0x16, 0x81, 0x6f, 0x8c, 0x21, 0x30, 0xbd, 0x31, 0xdc,
1350 0x10, 0xf4, 0x84, 0x32, 0xcb, 0x70, 0x06, 0x66, 0x10, 0x98, 0xf0, 0x13,
1351 0xf2, 0x99, 0x25, 0x40, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xd4, 0x63, 0x18,
1352 0x31, 0x28, 0x8c, 0x80, 0x3d, 0x02, 0xb1, 0xb0, 0x80, 0x2c, 0xe4, 0x63,
1353 0x81, 0x59, 0xc0, 0x67, 0x96, 0x00, 0x0d, 0x06, 0x2a, 0x00, 0xc5, 0x0c,
1354 0x84, 0x33, 0x98, 0x63, 0x48, 0x82, 0xf2, 0x18, 0x43, 0xa8, 0xca, 0x63,
1355 0xb8, 0x21, 0x30, 0x0b, 0x65, 0x96, 0x41, 0x0d, 0xd2, 0x20, 0x30, 0x01,
1356 0x2d, 0xe4, 0x33, 0x4b, 0xb0, 0x06, 0x23, 0x06, 0x84, 0x11, 0xcc, 0xc7,
1357 0x30, 0x62, 0x50, 0x18, 0x41, 0x7d, 0x04, 0x6b, 0x61, 0x41, 0x5b, 0xc8,
1358 0xc7, 0x82, 0xb7, 0x80, 0xcf, 0x2c, 0xc1, 0x1a, 0x0c, 0x54, 0x00, 0x4a,
1359 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xed, 0x31, 0x62, 0x60, 0x18,
1360 0xc1, 0x7e, 0x04, 0xa2, 0x01, 0x1a, 0x83, 0x0c, 0x01, 0x69, 0xd4, 0xc6,
1361 0x2c, 0x01, 0x1b, 0x0c, 0x54, 0x04, 0x7e, 0x10, 0x06, 0xc2, 0x1a, 0x0c,
1362 0x32, 0x04, 0xa9, 0x71, 0x1b, 0xb3, 0x04, 0x6d, 0x30, 0xd0, 0x12, 0xf0,
1363 0x88, 0xc1, 0x23, 0x12, 0x8f, 0x7c, 0xb2, 0xc0, 0x06, 0x3c, 0x02, 0x06,
1364 0x03, 0x2d, 0x01, 0x8a, 0x18, 0x7a, 0x21, 0x99, 0xc3, 0x47, 0xb0, 0x81,
1365 0xcc, 0x80, 0xc1, 0x20, 0x43, 0x20, 0xec, 0x86, 0x05, 0xe1, 0x21, 0x9f,
1366 0x0c, 0xc2, 0x81, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xd7, 0xd2, 0x07,
1367 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, 0x50, 0x13, 0xe7, 0x2c,
1368 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38,
1369 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, 0x00, 0x03, 0x11, 0x71,
1370 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, 0x21, 0x13, 0x00, 0x00,
1371 0x00, 0x01, 0x31, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0,
1372 0x40, 0x05, 0x64, 0x15, 0xb6, 0x0c, 0x42, 0x30, 0x0b, 0x5b, 0x86, 0x23,
1373 0xa0, 0x85, 0x2d, 0x83, 0x16, 0xd4, 0xc2, 0x96, 0xe1, 0x0b, 0x6c, 0x61,
1374 0xcb, 0x10, 0x06, 0xc1, 0x2d, 0x6c, 0x19, 0xd4, 0x20, 0xc0, 0x85, 0x2d,
1375 0xc3, 0x1b, 0x04, 0xb9, 0xb0, 0x65, 0xb0, 0x83, 0x40, 0x17, 0xb6, 0x0c,
1376 0x78, 0x10, 0xe4, 0xc2, 0x96, 0x81, 0x1d, 0x02, 0x5d, 0xd8, 0x32, 0xb8,
1377 0x43, 0x90, 0x0b, 0x5b, 0x06, 0xb5, 0x08, 0x74, 0x61, 0xcb, 0xc0, 0x16,
1378 0x41, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1379 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00,
1380 0x00, 0x24, 0x00, 0x00, 0x00, 0x64, 0xce, 0x41, 0x2c, 0x8d, 0x93, 0x06,
1381 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdb, 0x0c, 0x00, 0x05,
1382 0x33, 0x00, 0xb4, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f,
1383 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e,
1384 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8,
1385 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd,
1386 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25,
1387 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f,
1388 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c,
1389 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2,
1390 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c,
1391 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82,
1392 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50,
1393 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xb5, 0xc1, 0x20,
1394 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96,
1395 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86,
1396 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0x40, 0x0f,
1397 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xe8, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x3e,
1398 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xa0, 0x83, 0x11, 0x83, 0xc2, 0x08, 0xfc,
1399 0x20, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xa8, 0x83, 0x59, 0x82, 0x62, 0xa0,
1400 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xf4, 0x60, 0x0c, 0x41, 0xc8,
1401 0x83, 0x31, 0x84, 0x21, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x10, 0x05, 0x21,
1402 0x18, 0x31, 0x28, 0x8c, 0x60, 0x14, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84,
1403 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03,
1404 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c,
1405 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x29, 0x0c, 0x32, 0x04,
1406 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d,
1407 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40,
1408 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x60,
1409 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0xa0, 0x15, 0x46, 0x0c, 0x0a,
1410 0x23, 0xa8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0xa0, 0x15, 0x46, 0x0c,
1411 0x0a, 0x23, 0xb8, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0xc0, 0x15, 0x66,
1412 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a,
1413 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
1415 0x00, 0x14, 0x00, 0x00, 0x00, 0xc0, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xff,
1416 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xed, 0x06, 0x00,
1417 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
1418 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
1419 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
1420 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32,
1421 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90,
1422 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8,
1423 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00,
1424 0x00, 0x51, 0x18, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24,
1425 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70,
1426 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a,
1427 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
1428 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2,
1429 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81,
1430 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1,
1431 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39,
1432 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74,
1433 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77,
1434 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78,
1435 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72,
1436 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1437 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1,
1438 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41,
1439 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1,
1440 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a,
1441 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74,
1442 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
1443 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1444 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1,
1445 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01,
1446 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
1447 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d,
1448 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36,
1449 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1,
1450 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01,
1451 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
1452 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79,
1453 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77,
1454 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71,
1455 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74,
1456 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21,
1457 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21,
1458 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60,
1459 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4,
1460 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8,
1461 0xc3, 0x3b, 0xb4, 0x41, 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00,
1462 0x1b, 0xb6, 0xa1, 0x00, 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1,
1463 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0,
1464 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01,
1465 0xd8, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0x40, 0x80, 0x05,
1466 0xa8, 0x36, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50,
1467 0x1b, 0x7c, 0xe4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a,
1468 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73,
1469 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
1470 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1471 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21,
1472 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41,
1473 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x3c,
1474 0xb0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74,
1475 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77,
1476 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78,
1477 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72,
1478 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1479 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1,
1480 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41,
1481 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1,
1482 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a,
1483 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74,
1484 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
1485 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1486 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1,
1487 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01,
1488 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
1489 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d,
1490 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36,
1491 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1,
1492 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01,
1493 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
1494 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79,
1495 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77,
1496 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71,
1497 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74,
1498 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21,
1499 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21,
1500 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60,
1501 0x03, 0x82, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, 0x04, 0x54,
1502 0x1b, 0x8c, 0x24, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x28, 0x02, 0xb0, 0x00,
1503 0xd5, 0x06, 0x64, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09,
1504 0xa8, 0x36, 0x18, 0xcc, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50,
1505 0x1b, 0xa6, 0xe6, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x01, 0xa4, 0xc1,
1506 0x1d, 0xde, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21,
1507 0x1d, 0xdc, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
1508 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42,
1509 0x60, 0x4c, 0x08, 0x8e, 0x09, 0x03, 0x92, 0x28, 0x13, 0x86, 0x25, 0x51,
1510 0x26, 0x04, 0xcc, 0x84, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00,
1511 0x00, 0x4d, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85,
1512 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90,
1513 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xc8, 0xc1,
1514 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14,
1515 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04,
1516 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84,
1517 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e,
1518 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e,
1519 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e,
1520 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe,
1521 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40,
1522 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8,
1523 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38,
1524 0x4d, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88,
1525 0xdf, 0x1e, 0x7e, 0x20, 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41,
1526 0x04, 0x26, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98,
1527 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24,
1528 0x41, 0x10, 0x08, 0x44, 0xb2, 0x34, 0x0f, 0x41, 0x85, 0x28, 0x8a, 0xa2,
1529 0x20, 0xa9, 0x0c, 0x00, 0x00, 0x10, 0x55, 0x04, 0x00, 0x20, 0xab, 0x0c,
1530 0x40, 0x51, 0x10, 0x56, 0x8c, 0xa2, 0x00, 0x00, 0x00, 0x20, 0xad, 0x0c,
1531 0x45, 0x51, 0x10, 0x57, 0x84, 0xa2, 0x20, 0x6f, 0x8e, 0x00, 0x0c, 0xe6,
1532 0x08, 0x82, 0x61, 0x04, 0x01, 0x0c, 0x4a, 0x12, 0x34, 0x8f, 0x00, 0x86,
1533 0x62, 0x08, 0xd0, 0x58, 0x90, 0x60, 0x79, 0x84, 0x50, 0x0c, 0x01, 0x2a,
1534 0x07, 0x02, 0x52, 0x00, 0x1c, 0x46, 0x18, 0xc0, 0x60, 0x10, 0x21, 0x10,
1535 0xe6, 0x08, 0x40, 0x61, 0x10, 0xe1, 0x10, 0x06, 0x11, 0x0a, 0x61, 0x10,
1536 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x08, 0x30, 0x00, 0x00,
1537 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
1538 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
1539 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51,
1540 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1541 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80,
1542 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0,
1543 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
1544 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0,
1545 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60,
1546 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
1547 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
1548 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1549 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0,
1550 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20,
1551 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
1552 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
1553 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40,
1554 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0,
1555 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90,
1556 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
1557 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10,
1558 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
1559 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
1560 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60,
1561 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
1562 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10,
1563 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10,
1564 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
1565 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80,
1566 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x98,
1567 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x04,
1568 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xa6, 0x02, 0x02,
1569 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x73, 0x01, 0x01, 0x20,
1570 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xc9, 0x80, 0x00, 0x10, 0x00,
1571 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x6c, 0x08, 0x30, 0x0c, 0x00, 0x00,
1572 0x00, 0x01, 0x00, 0x0c, 0x61, 0x2a, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00,
1573 0x00, 0x00, 0x86, 0x30, 0x1d, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
1574 0x00, 0x43, 0x98, 0x0f, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80,
1575 0x21, 0x4c, 0x07, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10,
1576 0x86, 0x0c, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2,
1577 0x98, 0x01, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x20,
1578 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c,
1579 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x02, 0x47, 0x00, 0x4a,
1580 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c,
1581 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c,
1582 0x68, 0x2d, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42,
1583 0x29, 0x18, 0x42, 0xc7, 0x12, 0x24, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00,
1584 0x00, 0xd9, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2,
1585 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x18,
1586 0x40, 0x67, 0x00, 0xa0, 0x41, 0x19, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93,
1587 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x80, 0x41, 0x73, 0x06, 0x02,
1588 0x18, 0x38, 0x8c, 0x83, 0x20, 0x38, 0x38, 0xb6, 0x32, 0x90, 0xb6, 0x32,
1589 0xba, 0x30, 0x36, 0x10, 0xbb, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0x37, 0x90,
1590 0x19, 0x19, 0x18, 0x99, 0x19, 0x17, 0x1a, 0x18, 0x1a, 0x10, 0x94, 0xb6,
1591 0x32, 0xba, 0x30, 0x36, 0xb3, 0xb2, 0x96, 0x19, 0x19, 0x18, 0x99, 0x19,
1592 0x17, 0x1a, 0x18, 0x9a, 0x94, 0x21, 0xc2, 0x19, 0x10, 0x43, 0x0c, 0x30,
1593 0x68, 0xc0, 0x20, 0x02, 0x03, 0x86, 0x45, 0x53, 0x19, 0x5d, 0x18, 0xdb,
1594 0x10, 0xe4, 0x0c, 0x0e, 0x30, 0x68, 0xc0, 0xa0, 0x01, 0x03, 0x86, 0x5b,
1595 0x58, 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x0b,
1596 0x59, 0x99, 0xdb, 0x9b, 0x5c, 0xdb, 0xdc, 0x17, 0x59, 0xda, 0x5c, 0x98,
1597 0x18, 0x5b, 0xd9, 0x10, 0xe1, 0x0c, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e,
1598 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74,
1599 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
1600 0x43, 0x84, 0x33, 0x58, 0x48, 0x06, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f,
1601 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62,
1602 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f,
1603 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x33, 0x68, 0x18, 0x85,
1604 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, 0x95, 0xc9, 0x7d, 0xd1, 0x85,
1605 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b,
1606 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, 0x0b, 0x6b, 0x2b, 0xa3, 0x61,
1607 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, 0x39, 0x83, 0x07, 0x0c, 0x98,
1608 0x33, 0x80, 0xce, 0x20, 0x1a, 0x22, 0x9c, 0x81, 0x44, 0x26, 0x2c, 0x4d,
1609 0xce, 0x05, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x8d, 0x4a, 0x58,
1610 0x9a, 0x9c, 0xcb, 0x58, 0x99, 0x1b, 0x5d, 0x99, 0x1c, 0xa5, 0xb0, 0x34,
1611 0x39, 0x17, 0xb7, 0xb7, 0x2f, 0xb8, 0x32, 0xb9, 0x39, 0xb8, 0xb2, 0x31,
1612 0xba, 0x34, 0xbb, 0x32, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67,
1613 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, 0xd2,
1614 0xde, 0xdc, 0x86, 0x40, 0x60, 0xc0, 0x9c, 0x01, 0x75, 0x06, 0xd5, 0x19,
1615 0x58, 0x67, 0x00, 0x9d, 0x41, 0x74, 0x06, 0xd7, 0x19, 0x60, 0x94, 0xc2,
1616 0xd2, 0xe4, 0x5c, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0xbe,
1617 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x68, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85,
1618 0xd1, 0x95, 0x91, 0xa1, 0xd4, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x11, 0xd9,
1619 0xd1, 0x7c, 0x99, 0xa5, 0xf0, 0x09, 0x4b, 0x93, 0x73, 0x81, 0x2b, 0x93,
1620 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x63, 0x31, 0xf6, 0xc6,
1621 0xf6, 0x26, 0x37, 0x44, 0x02, 0x83, 0xe6, 0x0c, 0xb4, 0x33, 0xd8, 0xce,
1622 0xa0, 0x3a, 0x03, 0xee, 0x0c, 0xa0, 0x33, 0x88, 0xce, 0xe0, 0x3a, 0x83,
1623 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a,
1624 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc,
1625 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74,
1626 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0x24, 0x30, 0x80, 0xce,
1627 0x40, 0x3b, 0x83, 0xef, 0x0c, 0xaa, 0x33, 0xe0, 0xce, 0x00, 0x3a, 0x03,
1628 0x30, 0x38, 0x83, 0xeb, 0x0c, 0xc2, 0x80, 0x4a, 0x58, 0x9a, 0x9c, 0x8b,
1629 0x58, 0x9d, 0x99, 0x59, 0x99, 0x1c, 0x9f, 0xb0, 0x34, 0x39, 0x17, 0xb1,
1630 0x3a, 0x33, 0xb3, 0x32, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0x32, 0x4a, 0x61,
1631 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
1632 0x69, 0x6e, 0x64, 0x65, 0x78, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, 0xca,
1633 0xc2, 0xc8, 0x48, 0x85, 0xa5, 0xc9, 0xb9, 0xcc, 0xd1, 0xc9, 0xd5, 0x8d,
1634 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xa5, 0xb9, 0x99, 0xbd, 0xb1,
1635 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x23, 0x33, 0x37, 0x26, 0x75, 0x24, 0xf4,
1636 0xf5, 0x56, 0x47, 0x07, 0x57, 0x47, 0x47, 0x86, 0xae, 0x0c, 0x8f, 0xae,
1637 0x4e, 0xae, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0x8c, 0x4a, 0x9a, 0x1b, 0x5c,
1638 0x1d, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0x19, 0x97, 0xb1, 0x37, 0xb6, 0x37,
1639 0xb9, 0xaf, 0xb9, 0xb1, 0x30, 0xb6, 0x32, 0x3a, 0x74, 0x6f, 0x6e, 0x65,
1640 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x7c, 0xe8,
1641 0xde, 0xdc, 0xca, 0xda, 0xc2, 0xe0, 0xbe, 0xcc, 0xc2, 0xc6, 0xe8, 0xde,
1642 0xe4, 0x62, 0xf8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0x99,
1643 0x85, 0x8d, 0xd1, 0xbd, 0xc9, 0xc9, 0xf0, 0x99, 0x23, 0x93, 0xfb, 0xba,
1644 0x43, 0x4b, 0xa3, 0x2b, 0xfb, 0x82, 0x7b, 0x4b, 0x73, 0xa3, 0x1b, 0x02,
1645 0x0b, 0x60, 0xc0, 0x80, 0x81, 0x03, 0x06, 0xcc, 0x19, 0xa0, 0xc1, 0x19,
1646 0xa4, 0x01, 0x18, 0x38, 0x60, 0xe0, 0x80, 0x01, 0x73, 0x06, 0x68, 0x70,
1647 0x06, 0x6a, 0x00, 0x06, 0x11, 0x18, 0x38, 0x60, 0xc0, 0x9c, 0x01, 0x1a,
1648 0x9c, 0xc1, 0x1a, 0x80, 0x41, 0x05, 0x06, 0x0e, 0x18, 0x30, 0x67, 0x80,
1649 0x06, 0x67, 0xc0, 0x06, 0x60, 0xf0, 0x80, 0x81, 0x03, 0x06, 0xcc, 0x19,
1650 0xa0, 0xc1, 0x19, 0xb4, 0x01, 0x18, 0x58, 0x60, 0xe0, 0x80, 0x01, 0x73,
1651 0x06, 0x68, 0x70, 0x06, 0x6e, 0x00, 0x06, 0x17, 0x18, 0x38, 0x60, 0xc0,
1652 0x9c, 0x01, 0x1a, 0x9c, 0xc1, 0x1b, 0x80, 0x01, 0x06, 0x06, 0x0e, 0x18,
1653 0x30, 0x67, 0x80, 0x06, 0x67, 0x00, 0x07, 0x8c, 0xc2, 0xd2, 0xe4, 0x5c,
1654 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xbe, 0xe6, 0xd2, 0xf4,
1655 0xca, 0x78, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d, 0x7d, 0xd1, 0xe5,
1656 0xc1, 0x95, 0x7d, 0x85, 0xb1, 0xa5, 0x9d, 0xb9, 0x7d, 0xcd, 0xa5, 0xe9,
1657 0x95, 0xf1, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b,
1658 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0x63, 0x30, 0x36, 0x84, 0x0c, 0xc0, 0x80,
1659 0x3a, 0x83, 0x31, 0x38, 0x03, 0x32, 0x00, 0x03, 0xe9, 0x0c, 0xca, 0x00,
1660 0x0c, 0x18, 0x30, 0x68, 0xce, 0xc0, 0x0c, 0xce, 0xe0, 0x0c, 0xce, 0x20,
1661 0x0e, 0xce, 0x40, 0x0e, 0xc0, 0x40, 0x3a, 0x83, 0x39, 0x00, 0x03, 0xe7,
1662 0x0c, 0xa0, 0x33, 0xa0, 0x83, 0x33, 0xb8, 0xce, 0xa0, 0x0e, 0x68, 0x98,
1663 0xb1, 0xbd, 0x85, 0xd1, 0xcd, 0xd0, 0x78, 0x33, 0x33, 0x9b, 0x2b, 0xa3,
1664 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x37, 0x83, 0x37, 0x43, 0xa3, 0x2d,
1665 0x8c, 0x4e, 0x2e, 0x0d, 0x6f, 0x08, 0x05, 0x06, 0x0c, 0x18, 0x3c, 0x60,
1666 0xc0, 0x9c, 0xc1, 0x1d, 0x9c, 0x01, 0x1e, 0x80, 0xc1, 0x03, 0x06, 0x19,
1667 0x18, 0x30, 0x67, 0x90, 0x07, 0x67, 0xa0, 0x07, 0x4c, 0xb2, 0xaa, 0xac,
1668 0x88, 0xca, 0xc6, 0xde, 0xc8, 0xca, 0x68, 0x90, 0x95, 0x8d, 0xbd, 0x91,
1669 0x95, 0x0d, 0x21, 0x03, 0x30, 0x70, 0xce, 0x60, 0x0c, 0xce, 0x80, 0x0c,
1670 0xc0, 0x60, 0x3a, 0x83, 0x32, 0x00, 0x83, 0x06, 0x0c, 0x9a, 0x33, 0x30,
1671 0x83, 0x33, 0x38, 0x83, 0x33, 0xd8, 0x83, 0x33, 0x90, 0x03, 0x30, 0x98,
1672 0xce, 0x60, 0x0e, 0xc0, 0xe0, 0x39, 0x03, 0xe8, 0x0c, 0xf8, 0xe0, 0x0c,
1673 0xae, 0x33, 0xe8, 0x03, 0x2e, 0x61, 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78,
1674 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda,
1675 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xc9,
1676 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xb1, 0x80, 0xcc, 0x85, 0xb5,
1677 0xc1, 0xb1, 0x95, 0xf9, 0x90, 0xa0, 0x2b, 0xc3, 0xcb, 0x1a, 0x42, 0x81,
1678 0x81, 0x76, 0x06, 0x7f, 0x70, 0x06, 0x65, 0x00, 0x06, 0x0c, 0x18, 0x34,
1679 0x67, 0x00, 0x0a, 0x67, 0x00, 0x9d, 0x41, 0x28, 0x9c, 0xc1, 0x75, 0x06,
1680 0xa2, 0x40, 0x8f, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x4c, 0x86, 0xec,
1681 0x2b, 0x4c, 0x4e, 0x2e, 0x2c, 0x8f, 0xc7, 0x8c, 0xed, 0x2d, 0x8c, 0x8e,
1682 0x05, 0x64, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0xcc, 0x87, 0x05, 0x5d, 0x19,
1683 0x5e, 0x95, 0xd5, 0x10, 0x0a, 0x0c, 0xb6, 0x33, 0xf8, 0x83, 0x33, 0x28,
1684 0x03, 0x30, 0x68, 0xc0, 0xa0, 0x39, 0x03, 0x50, 0x38, 0x03, 0xe8, 0x0c,
1685 0x48, 0xe1, 0x0c, 0xae, 0x33, 0x28, 0x05, 0x2e, 0x61, 0x69, 0x72, 0x2e,
1686 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x3c, 0xe6, 0xc2, 0xda, 0xe0,
1687 0xd8, 0xca, 0xe4, 0x18, 0xcc, 0x0d, 0x91, 0xc0, 0x80, 0x3b, 0x83, 0x53,
1688 0x38, 0x83, 0x32, 0x00, 0x03, 0x06, 0x0c, 0x9a, 0x33, 0x80, 0xce, 0x00,
1689 0x15, 0xce, 0xe0, 0x3a, 0x83, 0x54, 0x18, 0x02, 0x9d, 0x41, 0x76, 0x06,
1690 0xde, 0x19, 0x88, 0xc1, 0x19, 0xd8, 0xc1, 0x19, 0xf8, 0xc1, 0x19, 0x8c,
1691 0xc2, 0x19, 0x98, 0xc2, 0x19, 0xa8, 0xc2, 0x10, 0x23, 0x02, 0xce, 0x60,
1692 0x3a, 0x83, 0x55, 0xa0, 0x18, 0x84, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5,
1693 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11,
1694 0x31, 0x7d, 0x65, 0x55, 0x59, 0x7d, 0x99, 0xc9, 0x85, 0x9d, 0xb5, 0x95,
1695 0xb9, 0xd1, 0xa5, 0x0c, 0x21, 0xce, 0xc0, 0x15, 0xce, 0xa0, 0x15, 0x88,
1696 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d,
1697 0xbd, 0xc1, 0x95, 0xb5, 0xd0, 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xcd,
1698 0x0d, 0x31, 0xce, 0x00, 0x16, 0xce, 0xc0, 0x15, 0xce, 0xe0, 0x15, 0x88,
1699 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d,
1700 0xbd, 0xc1, 0x95, 0xb5, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xcd,
1701 0x0d, 0x31, 0xce, 0x40, 0x16, 0xce, 0xc0, 0x15, 0xce, 0x20, 0x16, 0x86,
1702 0x10, 0x67, 0x00, 0x0b, 0x67, 0x20, 0x0b, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a,
1703 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a,
1704 0xc2, 0xe4, 0xce, 0x50, 0x66, 0x52, 0x86, 0x18, 0x67, 0x50, 0x0b, 0x67,
1705 0xe0, 0x0a, 0x67, 0x40, 0x0b, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8,
1706 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4,
1707 0xce, 0x50, 0x68, 0x52, 0x86, 0x18, 0x67, 0x70, 0x0b, 0x67, 0xe0, 0x0a,
1708 0x67, 0x60, 0x0b, 0x43, 0x88, 0x33, 0xa8, 0x85, 0x33, 0xb8, 0x85, 0x21,
1709 0xc2, 0x19, 0xdc, 0xc2, 0x10, 0xe3, 0x0c, 0x6a, 0xe1, 0x0c, 0x60, 0xe1,
1710 0x0c, 0x64, 0x81, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, 0x5a,
1711 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, 0xdd,
1712 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a,
1713 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65,
1714 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0x33,
1715 0xe8, 0x85, 0x21, 0xc6, 0x19, 0xf0, 0xc2, 0x19, 0xf8, 0xc2, 0x1a, 0x78,
1716 0x43, 0x8c, 0x33, 0x40, 0x83, 0x33, 0xf8, 0x85, 0x35, 0xf0, 0x86, 0x88,
1717 0xc1, 0x19, 0xec, 0xc2, 0x19, 0x80, 0xc3, 0x1a, 0x78, 0x67, 0x00, 0x0e,
1718 0x6b, 0xf0, 0x9d, 0x01, 0x38, 0xac, 0x01, 0x18, 0x9c, 0x01, 0x38, 0xac,
1719 0x41, 0x18, 0x9c, 0x01, 0x38, 0xac, 0x81, 0x18, 0x9c, 0x01, 0x38, 0xac,
1720 0xc1, 0x18, 0x9c, 0x01, 0x38, 0xac, 0x01, 0x19, 0x9c, 0x01, 0x38, 0xac,
1721 0x41, 0x37, 0xc4, 0x38, 0x83, 0x70, 0x38, 0x03, 0x70, 0x58, 0x03, 0x30,
1722 0x18, 0x62, 0x9c, 0x41, 0x38, 0x9c, 0x01, 0x38, 0xac, 0x41, 0x37, 0xc4,
1723 0x38, 0x83, 0x70, 0x38, 0x03, 0x70, 0x58, 0x03, 0x31, 0x18, 0x62, 0x9c,
1724 0x41, 0x38, 0x9c, 0x01, 0x38, 0xac, 0xc1, 0x18, 0x0c, 0x31, 0xce, 0x20,
1725 0x1c, 0xce, 0x00, 0x1c, 0xd6, 0x80, 0x0c, 0x86, 0x18, 0x67, 0x10, 0x0e,
1726 0x67, 0x00, 0x0e, 0x6b, 0xf0, 0x0d, 0x31, 0xce, 0x20, 0x1c, 0xce, 0x00,
1727 0x1c, 0xd6, 0x20, 0x0c, 0x86, 0x18, 0x67, 0x10, 0x0e, 0x67, 0x00, 0x0e,
1728 0x6b, 0xe0, 0x8d, 0x88, 0xd8, 0x81, 0x1d, 0xec, 0xa1, 0x1d, 0xdc, 0xa0,
1729 0x1d, 0xde, 0x81, 0x1c, 0xea, 0x81, 0x1d, 0xca, 0xc1, 0x0d, 0xcc, 0x81,
1730 0x1d, 0xc2, 0xe1, 0x1c, 0xe6, 0x61, 0x8a, 0x10, 0x0c, 0x23, 0x14, 0x76,
1731 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x48, 0x07, 0x72, 0x28, 0x07, 0x77,
1732 0xa0, 0x87, 0x29, 0x41, 0x31, 0x62, 0x09, 0x87, 0x74, 0x90, 0x07, 0x37,
1733 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87, 0x77, 0x70, 0x87, 0x29,
1734 0x81, 0x31, 0x82, 0x0a, 0x87, 0x74, 0x90, 0x07, 0x37, 0x60, 0x87, 0x70,
1735 0x70, 0x87, 0x73, 0xa8, 0x87, 0x70, 0x38, 0x87, 0x72, 0xf8, 0x05, 0x7b,
1736 0x28, 0x07, 0x79, 0x98, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x20,
1737 0x23, 0xa6, 0x70, 0x48, 0x07, 0x79, 0x70, 0x83, 0x71, 0x78, 0x87, 0x76,
1738 0x80, 0x87, 0x74, 0x60, 0x87, 0x72, 0xf8, 0x85, 0x77, 0x80, 0x07, 0x7a,
1739 0x48, 0x87, 0x77, 0x70, 0x87, 0x79, 0x98, 0x32, 0x28, 0x8c, 0x33, 0x82,
1740 0x09, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x07, 0x79, 0x08, 0x87, 0x73,
1741 0x68, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0xb0, 0x02, 0x00, 0x00,
1742 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
1743 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
1744 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
1745 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
1746 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
1747 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
1748 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
1749 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
1750 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
1751 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
1752 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
1753 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
1754 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
1755 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
1756 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
1757 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
1758 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
1759 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
1760 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
1761 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
1762 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
1763 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
1764 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70,
1765 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74,
1766 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f,
1767 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e,
1768 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41,
1769 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1,
1770 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c,
1771 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37,
1772 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f,
1773 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21,
1774 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21,
1775 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0,
1776 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88,
1777 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77,
1778 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c,
1779 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23,
1780 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01,
1781 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84,
1782 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8,
1783 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76,
1784 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e,
1785 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f,
1786 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e,
1787 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e,
1788 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1,
1789 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21,
1790 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8,
1791 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77,
1792 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19,
1793 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e,
1794 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30,
1795 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71,
1796 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77,
1797 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
1798 0x00, 0x35, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf,
1799 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45,
1800 0x51, 0x14, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05,
1801 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x01, 0x14, 0x80, 0x44, 0x7e,
1802 0x01, 0x48, 0xd3, 0x2f, 0x2c, 0x00, 0xf3, 0xf8, 0xd5, 0x5d, 0xdc, 0xb6,
1803 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3, 0x58, 0x7e,
1804 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05,
1805 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80,
1806 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x84, 0x01,
1807 0x80, 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13, 0x71, 0x4d, 0x54,
1808 0x44, 0xfc, 0xf6, 0xf0, 0x03, 0x51, 0x04, 0x60, 0x7e, 0x85, 0x17, 0xb7,
1809 0x6d, 0x04, 0x0d, 0x80, 0x44, 0xfe, 0xe0, 0x4c, 0x7e, 0x75, 0x17, 0xb7,
1810 0x6d, 0x0b, 0x1b, 0x80, 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13,
1811 0x71, 0x4d, 0x54, 0x44, 0xfc, 0xf6, 0xe0, 0x57, 0x78, 0x71, 0xdb, 0x86,
1812 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e,
1813 0x75, 0x17, 0xb7, 0x6d, 0x00, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe, 0x7f,
1814 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05,
1815 0x20, 0x4d, 0x7f, 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00,
1816 0x00, 0x61, 0x20, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e,
1817 0x10, 0x0b, 0x04, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x14, 0x8f, 0x45,
1818 0x00, 0x81, 0x70, 0xcc, 0x41, 0x30, 0x0d, 0x84, 0x07, 0xb4, 0x16, 0x41,
1819 0x09, 0x50, 0x3a, 0xc7, 0xc0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c, 0x35,
1820 0x00, 0x81, 0x40, 0xe2, 0x08, 0x00, 0x85, 0x23, 0x00, 0x35, 0x40, 0xe0,
1821 0x0c, 0x00, 0x01, 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0,
1822 0xb3, 0xe6, 0x1c, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06,
1823 0x63, 0x04, 0x20, 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03,
1824 0x30, 0x03, 0x30, 0x07, 0x21, 0x0b, 0xb2, 0x20, 0x0b, 0xb3, 0x30, 0x07,
1825 0x31, 0x0b, 0xb9, 0x30, 0x0b, 0x7d, 0x40, 0xc5, 0x0c, 0xc0, 0x08, 0xc0,
1826 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2,
1827 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93, 0x1e,
1828 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03, 0x08,
1829 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8,
1830 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, 0x82,
1831 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80, 0x20,
1832 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d,
1833 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, 0x1e,
1834 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08, 0xc2,
1835 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87,
1836 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3, 0xf1,
1837 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4, 0xff,
1838 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe, 0x30,
1839 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef, 0x0b,
1840 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed,
1841 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab,
1842 0xec, 0xcd, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81,
1843 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37,
1844 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34,
1845 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00,
1846 0x00, 0x23, 0x06, 0x4a, 0x11, 0xbc, 0xc2, 0x1b, 0xb4, 0x81, 0x1c, 0x8c,
1847 0x41, 0x19, 0x90, 0x41, 0x30, 0x62, 0xb0, 0x14, 0x41, 0x2c, 0xbc, 0x81,
1848 0x1b, 0xcc, 0xc1, 0x2b, 0x90, 0x81, 0x19, 0x94, 0x81, 0x30, 0x86, 0x10,
1849 0xc0, 0xc2, 0x20, 0xc3, 0xe0, 0xad, 0xc1, 0x1c, 0x43, 0x20, 0xc4, 0xc2,
1850 0x88, 0xc1, 0x52, 0x04, 0xb5, 0x30, 0x07, 0x72, 0x70, 0x07, 0xb2, 0x80,
1851 0x06, 0x6a, 0x90, 0x06, 0xc6, 0x18, 0x42, 0x40, 0x0b, 0x73, 0x0c, 0x43,
1852 0x10, 0x0b, 0x87, 0x07, 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x33, 0x80,
1853 0x03, 0x23, 0x02, 0xf8, 0x8c, 0x37, 0xf0, 0x01, 0x2a, 0xe4, 0xc2, 0x05,
1854 0xea, 0x52, 0x50, 0x06, 0x19, 0x82, 0x35, 0xa8, 0x83, 0x11, 0x83, 0xc2,
1855 0x08, 0xcc, 0xa1, 0x08, 0xc6, 0x2b, 0x42, 0xa1, 0x15, 0x7c, 0xe1, 0x17,
1856 0xf4, 0xe0, 0x02, 0x75, 0x29, 0x28, 0x83, 0x0c, 0x01, 0x1c, 0xe8, 0xc1,
1857 0x88, 0x41, 0x61, 0x04, 0xeb, 0xa0, 0x04, 0xe3, 0x15, 0xa6, 0x20, 0x0b,
1858 0xe3, 0x40, 0x0e, 0xa0, 0x70, 0x81, 0xba, 0x14, 0x94, 0x41, 0x86, 0xa0,
1859 0x0e, 0xfe, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x78, 0x78, 0x82, 0x39, 0x86,
1860 0x3a, 0x58, 0xd2, 0x61, 0x8e, 0x21, 0x38, 0xd2, 0x61, 0x8e, 0x21, 0x18,
1861 0xce, 0x61, 0xbc, 0xe1, 0x15, 0x74, 0x01, 0x1d, 0x28, 0x18, 0xc3, 0x0d,
1862 0xc1, 0x1f, 0x04, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0x10, 0x7d, 0x70,
1863 0x0a, 0xe3, 0x0d, 0xb3, 0xe0, 0x0b, 0xe0, 0x40, 0xc1, 0x18, 0x31, 0x20,
1864 0x8c, 0xc0, 0x1e, 0x86, 0x11, 0x83, 0xc2, 0x08, 0xf0, 0x21, 0xc8, 0x03,
1865 0x0b, 0xf2, 0x00, 0x3e, 0x23, 0x06, 0x85, 0x11, 0xe0, 0x43, 0xe0, 0x07,
1866 0x36, 0xe8, 0x81, 0x7c, 0x4c, 0x0f, 0x82, 0xf8, 0xd8, 0x10, 0xd0, 0x67,
1867 0xc4, 0x80, 0x30, 0x82, 0x7e, 0x08, 0x46, 0x0c, 0x0a, 0x23, 0xf8, 0x87,
1868 0x80, 0x0f, 0x2c, 0xe0, 0x03, 0xf9, 0xcc, 0x31, 0x98, 0xc2, 0xc2, 0x0f,
1869 0x83, 0x0c, 0xc1, 0x29, 0xd8, 0x82, 0x0d, 0x01, 0x7d, 0x06, 0x19, 0x82,
1870 0x54, 0xe0, 0x85, 0x41, 0x86, 0xa0, 0xf2, 0x85, 0x59, 0x02, 0x61, 0xa0,
1871 0x22, 0x10, 0x02, 0x36, 0x00, 0xc6, 0x1b, 0xca, 0x01, 0x1e, 0x40, 0x82,
1872 0x82, 0x31, 0xdc, 0x10, 0xdc, 0x81, 0x33, 0xcb, 0x30, 0x10, 0xc1, 0x20,
1873 0x03, 0x31, 0x0b, 0xbd, 0x30, 0xde, 0x90, 0x0e, 0xf4, 0x80, 0x0f, 0x14,
1874 0x8c, 0xf1, 0x86, 0x75, 0xb0, 0x87, 0x7c, 0xa0, 0x60, 0x8c, 0x18, 0x20,
1875 0x47, 0x14, 0x13, 0x45, 0x77, 0x0c, 0xc1, 0x20, 0x43, 0x50, 0x0b, 0xe8,
1876 0x30, 0xc8, 0x10, 0x2c, 0xea, 0x30, 0x4b, 0x40, 0x0c, 0x54, 0x04, 0xc2,
1877 0x80, 0x09, 0xc3, 0x0d, 0x61, 0x70, 0x0a, 0xc1, 0x2c, 0x43, 0x31, 0x05,
1878 0xe3, 0x0d, 0xf2, 0xd0, 0x0f, 0x2e, 0x41, 0xc1, 0x18, 0x6e, 0x08, 0x54,
1879 0x21, 0x98, 0x65, 0x30, 0x8e, 0x60, 0x90, 0xa1, 0x00, 0x07, 0x75, 0x18,
1880 0x6f, 0xb0, 0x87, 0x90, 0x58, 0x09, 0x0a, 0xc6, 0x1c, 0xc3, 0x2f, 0x04,
1881 0x35, 0x31, 0xc8, 0x10, 0x80, 0xc3, 0x3b, 0x58, 0x50, 0xc8, 0x67, 0x90,
1882 0x21, 0x10, 0x87, 0x7a, 0x98, 0x25, 0x68, 0x83, 0xf1, 0x06, 0x7e, 0x38,
1883 0x89, 0x9c, 0xa0, 0x60, 0x8c, 0x37, 0xf8, 0x43, 0x4a, 0xcc, 0x04, 0x05,
1884 0x63, 0x90, 0x01, 0x5a, 0x07, 0x7d, 0x18, 0x6e, 0x20, 0x62, 0xc1, 0x99,
1885 0x65, 0x40, 0xa4, 0x60, 0x0c, 0x41, 0xfa, 0x89, 0xe1, 0x86, 0x60, 0x17,
1886 0x94, 0x59, 0x06, 0x25, 0x09, 0x4c, 0xe8, 0x05, 0xf9, 0xcc, 0x12, 0x2c,
1887 0x36, 0xfc, 0x02, 0x7c, 0x46, 0x0c, 0x08, 0x23, 0x60, 0x8b, 0xc0, 0x82,
1888 0x7b, 0x90, 0xcf, 0x88, 0x41, 0x61, 0x04, 0x6f, 0x11, 0xdc, 0xc3, 0x2c,
1889 0xc1, 0x32, 0x50, 0x01, 0x28, 0x89, 0xa0, 0xcc, 0x31, 0xd0, 0x43, 0x70,
1890 0x16, 0x63, 0x08, 0xdb, 0x59, 0x0c, 0x37, 0x04, 0xe4, 0xa0, 0xcc, 0x32,
1891 0x34, 0x4c, 0x60, 0x82, 0x39, 0xc8, 0x67, 0x96, 0xc0, 0xb1, 0x01, 0x1d,
1892 0xe0, 0x33, 0x62, 0x40, 0x18, 0x41, 0x5d, 0x04, 0x16, 0x80, 0x84, 0x7c,
1893 0x46, 0x0c, 0x0a, 0x23, 0xc0, 0x8b, 0x00, 0x24, 0x66, 0x09, 0x9c, 0x81,
1894 0x0a, 0x40, 0x61, 0x84, 0x66, 0x8e, 0x21, 0x09, 0xde, 0x62, 0x0c, 0x81,
1895 0x0c, 0xda, 0x62, 0xb8, 0x21, 0x68, 0x07, 0x65, 0x96, 0x01, 0x7a, 0x02,
1896 0x13, 0xde, 0x41, 0x3e, 0xb3, 0x04, 0x91, 0x0d, 0xf1, 0x00, 0x9f, 0x11,
1897 0x03, 0xc2, 0x08, 0xfc, 0x22, 0xb0, 0x20, 0x25, 0xe4, 0x33, 0x62, 0x50,
1898 0x18, 0x41, 0x68, 0x04, 0x29, 0x31, 0x4b, 0x10, 0x0d, 0x54, 0x00, 0xca,
1899 0x23, 0x40, 0x73, 0x0c, 0x49, 0x50, 0x17, 0xb3, 0x04, 0xd2, 0x40, 0x45,
1900 0x20, 0x44, 0x7a, 0x70, 0x0c, 0x32, 0x04, 0x29, 0x31, 0x13, 0x73, 0x0c,
1901 0x26, 0x01, 0x06, 0x7c, 0x31, 0xc8, 0x10, 0x9c, 0x84, 0x4d, 0xd8, 0x10,
1902 0xc8, 0x67, 0x90, 0x21, 0x48, 0x09, 0x9e, 0x98, 0x25, 0x68, 0x83, 0xe1,
1903 0x86, 0x59, 0x80, 0x89, 0x60, 0x96, 0x81, 0x02, 0x83, 0x60, 0x90, 0x81,
1904 0x0e, 0x5e, 0x22, 0x27, 0xc6, 0x1b, 0xca, 0x02, 0x2e, 0x44, 0x83, 0x82,
1905 0x31, 0xde, 0x70, 0x16, 0x72, 0xc1, 0x17, 0x14, 0x8c, 0x39, 0x06, 0x98,
1906 0x08, 0x4c, 0x63, 0x90, 0x21, 0x88, 0x09, 0xb0, 0xb0, 0xe0, 0x90, 0xcf,
1907 0x20, 0x43, 0x30, 0x13, 0x66, 0x31, 0xdc, 0x70, 0xf4, 0x83, 0x33, 0xcb,
1908 0xf0, 0x55, 0xc1, 0x18, 0xc2, 0xb0, 0x1a, 0xc3, 0x0d, 0x01, 0x48, 0x28,
1909 0xb3, 0x0c, 0x97, 0x15, 0x98, 0x20, 0x12, 0xf2, 0x99, 0x25, 0xc0, 0x46,
1910 0x0c, 0x08, 0x23, 0xb8, 0x8d, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0xdc, 0x08,
1911 0x4a, 0xc2, 0x82, 0x93, 0x90, 0x8f, 0x05, 0x29, 0x01, 0x9f, 0x59, 0x02,
1912 0x6c, 0xa0, 0x02, 0x50, 0x2c, 0xe1, 0x9a, 0x63, 0xd8, 0x89, 0x60, 0x36,
1913 0xc6, 0x10, 0x98, 0xd9, 0x18, 0x6e, 0x08, 0x52, 0x42, 0x99, 0x65, 0xd0,
1914 0xb2, 0xc0, 0x84, 0x95, 0x90, 0xcf, 0x2c, 0xc1, 0x36, 0x62, 0x40, 0x18,
1915 0x01, 0x78, 0x0c, 0x23, 0x06, 0x85, 0x11, 0x88, 0x47, 0xe0, 0x12, 0x16,
1916 0xc0, 0x84, 0x7c, 0x2c, 0x90, 0x09, 0xf8, 0xcc, 0x12, 0x6c, 0x03, 0x15,
1917 0x80, 0x92, 0x09, 0xda, 0x1c, 0x43, 0x12, 0xec, 0xc6, 0x18, 0x42, 0x95,
1918 0x1b, 0xc3, 0x0d, 0x81, 0x4c, 0x28, 0xb3, 0x0c, 0x1d, 0x17, 0x98, 0x40,
1919 0x13, 0xf2, 0x99, 0x25, 0xf0, 0x46, 0x0c, 0x08, 0x23, 0x48, 0x8f, 0x61,
1920 0xc4, 0xa0, 0x30, 0x82, 0xf5, 0x08, 0x6e, 0xc2, 0x82, 0x9c, 0x90, 0x8f,
1921 0x05, 0x3b, 0x01, 0x9f, 0x59, 0x02, 0x6f, 0xa0, 0x02, 0x50, 0x38, 0xa1,
1922 0x9b, 0x63, 0x48, 0x82, 0xf0, 0x18, 0x31, 0x30, 0x8c, 0x20, 0x3e, 0x82,
1923 0xb7, 0x68, 0x8b, 0x41, 0x86, 0x20, 0x2e, 0x48, 0x63, 0x96, 0xe0, 0x1b,
1924 0xa8, 0x08, 0xfc, 0x80, 0x12, 0xbc, 0x41, 0x86, 0xe0, 0x2e, 0x4c, 0x63,
1925 0x96, 0xa0, 0x0d, 0x66, 0x19, 0xc2, 0xa0, 0x0d, 0xf8, 0x61, 0x90, 0xa1,
1926 0x17, 0xf0, 0x42, 0x34, 0x46, 0x0c, 0x0a, 0x23, 0x98, 0x8f, 0x60, 0x2d,
1927 0xe6, 0x18, 0xe8, 0x22, 0x60, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xea, 0x63,
1928 0x60, 0x8b, 0x39, 0x06, 0x21, 0x68, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xee,
1929 0xa3, 0x68, 0x8b, 0x39, 0x06, 0x21, 0x60, 0x8f, 0x41, 0x86, 0x60, 0x2f,
1930 0x5c, 0x63, 0x90, 0x21, 0x28, 0x07, 0xd8, 0x18, 0x6f, 0xb0, 0x8d, 0xf0,
1931 0x98, 0x0f, 0x0a, 0xc6, 0x78, 0x03, 0x6e, 0x8c, 0x47, 0x7b, 0x50, 0x30,
1932 0xe6, 0x18, 0x42, 0x23, 0xb8, 0x8f, 0x41, 0x86, 0x40, 0x34, 0x62, 0xc3,
1933 0x82, 0x44, 0x3e, 0x83, 0x0c, 0x01, 0x69, 0xdc, 0xc6, 0x70, 0xc3, 0xe1,
1934 0x16, 0xce, 0x2c, 0x03, 0x1b, 0x88, 0x41, 0x30, 0x86, 0x30, 0xf0, 0xc7,
1935 0x70, 0x43, 0x10, 0x17, 0xca, 0x2c, 0x03, 0x19, 0x8c, 0x41, 0x60, 0xc2,
1936 0x5c, 0xc8, 0x67, 0x96, 0xa0, 0x0c, 0x46, 0x0c, 0x08, 0x23, 0x40, 0x91,
1937 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x15, 0x09, 0xec, 0xc2, 0x02, 0xbc, 0x90,
1938 0x8f, 0x05, 0x7a, 0x01, 0x9f, 0x59, 0x82, 0x32, 0x18, 0xa8, 0x00, 0x94,
1939 0x31, 0x10, 0xc8, 0x60, 0x8e, 0x81, 0x35, 0x02, 0x12, 0x19, 0x43, 0x60,
1940 0x48, 0x64, 0xb8, 0x21, 0xd0, 0x0b, 0x65, 0x96, 0xe1, 0x0c, 0xcc, 0x20,
1941 0x30, 0x81, 0x2f, 0xe4, 0x33, 0x4b, 0x80, 0x06, 0x23, 0x06, 0x84, 0x11,
1942 0xc4, 0xc8, 0x30, 0x62, 0x50, 0x18, 0xc1, 0x8c, 0x04, 0x7f, 0x61, 0x41,
1943 0x68, 0xc8, 0xc7, 0x82, 0xd1, 0x80, 0xcf, 0x2c, 0x01, 0x1a, 0x0c, 0x54,
1944 0x00, 0x8a, 0x19, 0x08, 0x67, 0x30, 0xc7, 0x90, 0x04, 0x2c, 0x32, 0x86,
1945 0x50, 0xa9, 0xc8, 0x70, 0x43, 0x30, 0x1a, 0xca, 0x2c, 0x83, 0x1a, 0xa4,
1946 0x41, 0x60, 0x42, 0x69, 0xc8, 0x67, 0x96, 0x60, 0x0d, 0x46, 0x0c, 0x08,
1947 0x23, 0xd0, 0x91, 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x1e, 0x09, 0x50, 0xc3,
1948 0x02, 0xd5, 0x90, 0x8f, 0x05, 0xac, 0x01, 0x9f, 0x59, 0x82, 0x35, 0x18,
1949 0xa8, 0x00, 0x94, 0x34, 0x10, 0xd4, 0x60, 0x8e, 0x21, 0x09, 0x64, 0x64,
1950 0xc4, 0xc0, 0x30, 0x02, 0x31, 0x09, 0xc0, 0xc3, 0x37, 0x06, 0x19, 0x02,
1951 0xf1, 0xa8, 0x8f, 0x59, 0x02, 0x36, 0x18, 0xa8, 0x08, 0xfc, 0x20, 0x0c,
1952 0x84, 0x35, 0x18, 0x64, 0x08, 0xd0, 0xe3, 0x3e, 0x66, 0x09, 0xda, 0x60,
1953 0xa0, 0x25, 0xe0, 0x11, 0x83, 0x47, 0x24, 0x1e, 0xf9, 0x64, 0x81, 0x0d,
1954 0x78, 0x04, 0x0c, 0x06, 0x5a, 0x02, 0x14, 0x31, 0xf4, 0x42, 0x32, 0x87,
1955 0x8f, 0x60, 0x03, 0xd7, 0x01, 0x83, 0x41, 0x86, 0x40, 0xd8, 0x0f, 0x0b,
1956 0x46, 0x44, 0x3e, 0x19, 0x84, 0x03, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00,
1957 0x00, 0xd7, 0xd2, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4,
1958 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d,
1959 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b,
1960 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71,
1961 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x1f, 0x00, 0x00,
1962 0x00, 0x5b, 0x0a, 0xe0, 0x98, 0x05, 0x04, 0x17, 0xb6, 0x14, 0xc1, 0x31,
1963 0x0b, 0x08, 0x2e, 0x6c, 0x29, 0x8a, 0x63, 0x16, 0x10, 0x5c, 0xd8, 0x52,
1964 0x24, 0x47, 0x2e, 0x20, 0xba, 0xb0, 0xa5, 0x70, 0x8e, 0x5c, 0x40, 0x74,
1965 0x61, 0x4b, 0x31, 0x1d, 0xb9, 0x80, 0xe8, 0xc2, 0x96, 0x02, 0x3b, 0x72,
1966 0x01, 0xd1, 0x85, 0x2d, 0xc3, 0x17, 0x88, 0xc3, 0x96, 0x81, 0x0c, 0x82,
1967 0x71, 0xd8, 0x32, 0xdc, 0x41, 0x40, 0x0e, 0x5b, 0x06, 0x3e, 0x08, 0xca,
1968 0x61, 0xcb, 0xe0, 0x07, 0x81, 0x39, 0x6c, 0x19, 0x4e, 0x21, 0x38, 0x87,
1969 0x2d, 0x03, 0x2b, 0x04, 0xe8, 0xb0, 0x65, 0x98, 0x85, 0x20, 0x1d, 0xb6,
1970 0x0c, 0xb5, 0x10, 0xa0, 0xc3, 0x96, 0x21, 0x25, 0x82, 0x74, 0xd8, 0x32,
1971 0xac, 0x44, 0x80, 0x0e, 0x5b, 0x86, 0xd3, 0x08, 0xd2, 0x61, 0xcb, 0x90,
1972 0x1a, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1973 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00,
1974 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0xcf, 0x41, 0x30, 0x0d, 0xe4, 0x06,
1975 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xe0, 0x0c, 0x00, 0x05,
1976 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f,
1977 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e,
1978 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8,
1979 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd,
1980 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25,
1981 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f,
1982 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c,
1983 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2,
1984 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c,
1985 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82,
1986 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50,
1987 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xc5, 0xc1, 0x20,
1988 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96,
1989 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86,
1990 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x0f,
1991 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4, 0xa0, 0x30, 0x82, 0x50,
1992 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11, 0x83, 0xc2, 0x08, 0x46,
1993 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83, 0x59, 0x82, 0x62, 0xa0,
1994 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc, 0x60, 0x0c, 0x41, 0xf0,
1995 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x38, 0x05, 0x21,
1996 0x18, 0x31, 0x28, 0x8c, 0x00, 0x15, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84,
1997 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03,
1998 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c,
1999 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x2a, 0x0c, 0x32, 0x04,
2000 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d,
2001 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40,
2002 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x00,
2003 0x17, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20, 0x16, 0x46, 0x0c, 0x0a,
2004 0x23, 0xd0, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0x40, 0x16, 0x46, 0x0c,
2005 0x0a, 0x23, 0xe0, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0x20, 0x16, 0x66,
2006 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a,
2007 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
2008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2009 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
2010 0x00, 0x1c, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
2011 0xde, 0x21, 0x0c, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x0b, 0x82, 0x20,
2012 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
2013 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
2014 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45,
2015 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
2016 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
2017 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8,
2018 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
2019 0x00, 0xf7, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff,
2020 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90,
2021 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68,
2022 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
2023 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d,
2024 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e,
2025 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d,
2026 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70,
2027 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48,
2028 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90,
2029 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70,
2030 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68,
2031 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
2032 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e,
2033 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c,
2034 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d,
2035 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
2036 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98,
2037 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
2038 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
2039 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e,
2040 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8,
2041 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38,
2042 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78,
2043 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0,
2044 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d,
2045 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d,
2046 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
2047 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18,
2048 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18,
2049 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30,
2050 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00,
2051 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c,
2052 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d,
2053 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0,
2054 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83,
2055 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41,
2056 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0xb6, 0xa1, 0x00,
2057 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e,
2058 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d,
2059 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0xd8, 0x60, 0x10, 0x08,
2060 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90,
2061 0x00, 0x6a, 0x83, 0x8f, 0x18, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12,
2062 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d,
2063 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d,
2064 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43,
2065 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3,
2066 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3,
2067 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03,
2068 0x90, 0x07, 0x76, 0x00, 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5,
2069 0x90, 0x0e, 0xec, 0x40, 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee,
2070 0xf0, 0x0e, 0x6d, 0x60, 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d,
2071 0x00, 0x0f, 0xef, 0x90, 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d,
2072 0x50, 0x0e, 0xec, 0x90, 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43,
2073 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43,
2074 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43,
2075 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81,
2076 0x3b, 0xbc, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03,
2077 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d,
2078 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d,
2079 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43,
2080 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3,
2081 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03,
2082 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef,
2083 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d,
2084 0xa0, 0x0f, 0xe5, 0x20, 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0,
2085 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43,
2086 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43,
2087 0x38, 0xc0, 0x03, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43,
2088 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00,
2089 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2,
2090 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d,
2091 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3,
2092 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3,
2093 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41,
2094 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5,
2095 0x00, 0x6c, 0x40, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90,
2096 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00,
2097 0x16, 0xa0, 0xda, 0x80, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c,
2098 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90,
2099 0x00, 0x6a, 0xc3, 0xc4, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x28, 0x80,
2100 0x34, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03,
2101 0x3d, 0xa4, 0x83, 0x3b, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
2102 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41,
2103 0x31, 0x21, 0x30, 0x26, 0x0c, 0x07, 0x92, 0x4c, 0x18, 0x14, 0x24, 0x99,
2104 0x10, 0x2c, 0x13, 0x02, 0x06, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00,
2105 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4,
2106 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c,
2107 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb8, 0xc1, 0x0c, 0xc0, 0x30, 0x02,
2108 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3,
2109 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10,
2110 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18,
2111 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6,
2112 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4,
2113 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50,
2114 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21,
2115 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29,
2116 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1,
2117 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a,
2118 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00,
2119 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d,
2120 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54,
2121 0x04, 0x00, 0x20, 0xaa, 0x0c, 0x40, 0x51, 0x90, 0x55, 0x8c, 0xa2, 0x00,
2122 0x00, 0x00, 0x20, 0xac, 0x0c, 0x45, 0x51, 0x90, 0x56, 0x84, 0xa2, 0x20,
2123 0x6e, 0x8e, 0x20, 0x98, 0x23, 0x00, 0x83, 0x61, 0x04, 0xe1, 0x2b, 0x48,
2124 0xb0, 0x34, 0x82, 0x07, 0x7a, 0x00, 0x85, 0x03, 0x01, 0x29, 0xf0, 0xcd,
2125 0x11, 0x80, 0xc2, 0x20, 0x02, 0x20, 0x4c, 0x01, 0x8c, 0x00, 0x0c, 0x23,
2126 0x0c, 0xdf, 0x20, 0x42, 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21,
2127 0x0c, 0x23, 0x10, 0x1f, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0,
2128 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68,
2129 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80,
2130 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74,
2131 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9,
2132 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78,
2133 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76,
2134 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9,
2135 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72,
2136 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a,
2137 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
2138 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74,
2139 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6,
2140 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76,
2141 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a,
2142 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
2143 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78,
2144 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6,
2145 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
2146 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78,
2147 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72,
2148 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72,
2149 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72,
2150 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6,
2151 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a,
2152 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72,
2153 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72,
2154 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71,
2155 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74,
2156 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73,
2157 0x20, 0x07, 0x43, 0x98, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
2158 0x80, 0x21, 0x4c, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
2159 0x10, 0x66, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08,
2160 0x53, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xb9,
2161 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x64, 0x08,
2162 0x30, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x61, 0x26, 0x20, 0x00,
2163 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30, 0x1b, 0x10, 0x00, 0x02,
2164 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x0e, 0x08, 0x00, 0x01, 0x00,
2165 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x06, 0x04, 0x80, 0x00, 0x00, 0x00,
2166 0x00, 0x00, 0xc0, 0x10, 0x46, 0x0c, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00,
2167 0x00, 0x00, 0xc8, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
2168 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
2169 0xfa, 0x46, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80,
2170 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac,
2171 0x14, 0x8a, 0xa1, 0x1c, 0xa8, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88,
2172 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x22, 0xc7, 0x12, 0x24, 0x01, 0x00,
2173 0x00, 0x79, 0x18, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c,
2174 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37,
2175 0xb7, 0x21, 0xc6, 0xf7, 0x8c, 0x01, 0x40, 0x06, 0x64, 0x40, 0xe5, 0x6e,
2176 0x0c, 0x2d, 0x4c, 0xee, 0x6b, 0x2e, 0x4d, 0xaf, 0x6c, 0x88, 0xf1, 0x31,
2177 0x63, 0x20, 0x7c, 0x0d, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4,
2178 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd,
2179 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, 0x04,
2180 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46,
2181 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x30, 0x06, 0xc4, 0x10,
2182 0xe3, 0x63, 0x3e, 0xe8, 0x5b, 0x58, 0x34, 0x95, 0xd1, 0x85, 0xb1, 0x0d,
2183 0x41, 0xc6, 0xe0, 0xf8, 0x98, 0x8f, 0xf9, 0x16, 0x6e, 0x61, 0x69, 0x72,
2184 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e,
2185 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
2186 0x43, 0x84, 0x31, 0x48, 0xc8, 0x85, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5,
2187 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0x85, 0xcd, 0xd1, 0x7d, 0xb5, 0x85,
2188 0xd1, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6,
2189 0x60, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5,
2190 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99,
2191 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85,
2192 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6, 0xa0, 0x61, 0x14, 0x96, 0x26, 0xe7,
2193 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56,
2194 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e,
2195 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b,
2196 0x18, 0x1d, 0xcd, 0x10, 0x64, 0x0c, 0x9e, 0x6f, 0x19, 0x03, 0x68, 0x0c,
2197 0xa2, 0x21, 0xc2, 0x18, 0x48, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde,
2198 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c,
2199 0x95, 0xb9, 0xd1, 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b,
2200 0xfb, 0x82, 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b,
2201 0x23, 0x13, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6,
2202 0x56, 0x46, 0x04, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08,
2203 0xf4, 0x2d, 0x63, 0x40, 0x8d, 0x41, 0x35, 0x06, 0xd6, 0x18, 0x40, 0x63,
2204 0x10, 0x8d, 0xc1, 0x35, 0x06, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33,
2205 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a,
2206 0x3a, 0x5a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28,
2207 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29,
2208 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6,
2209 0xe8, 0xd2, 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91,
2210 0x3e, 0x66, 0x0c, 0xb4, 0x31, 0xd8, 0xc6, 0xa0, 0x1a, 0x03, 0x6e, 0x0c,
2211 0xa0, 0x31, 0x88, 0xc6, 0xe0, 0x1a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b,
2212 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8,
2213 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33,
2214 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f,
2215 0x72, 0x64, 0x43, 0xa4, 0xef, 0x19, 0x03, 0x6d, 0x0c, 0xbe, 0x31, 0xa8,
2216 0xc6, 0x80, 0x1b, 0x03, 0x68, 0x0c, 0xc0, 0x60, 0x0c, 0xae, 0x31, 0x08,
2217 0x03, 0x2a, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
2218 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe,
2219 0xe6, 0xd2, 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d,
2220 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11,
2221 0x09, 0x4b, 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26,
2222 0xe7, 0x32, 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57,
2223 0xf6, 0x95, 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e,
2224 0xcc, 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d,
2225 0x1d, 0x19, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c,
2226 0xb8, 0x32, 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70,
2227 0x65, 0x5c, 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8,
2228 0xca, 0xe8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95,
2229 0xd1, 0xa1, 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83,
2230 0xfb, 0x32, 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6,
2231 0x56, 0xd6, 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27,
2232 0xc3, 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b,
2233 0xee, 0x2d, 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x7c, 0xcb, 0xd7, 0x7c, 0xcb,
2234 0x18, 0xa0, 0xc1, 0x18, 0xa4, 0xc1, 0xd7, 0x7c, 0xcd, 0xb7, 0x8c, 0x01,
2235 0x1a, 0x8c, 0x81, 0x1a, 0x7c, 0xd0, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1,
2236 0x18, 0xac, 0xc1, 0x47, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01,
2237 0x1b, 0x7c, 0xce, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xb4, 0xc1,
2238 0x57, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x81, 0x1b, 0x7c, 0xd6,
2239 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xbc, 0xc1, 0x77, 0x7d, 0xcd,
2240 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73,
2241 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3,
2242 0x2b, 0xe3, 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97,
2243 0x07, 0x57, 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6,
2244 0x57, 0xc6, 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d,
2245 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0xf8, 0xa6,
2246 0x31, 0x18, 0x83, 0x31, 0x20, 0x83, 0x2f, 0x1a, 0x83, 0x32, 0xf8, 0x96,
2247 0x8f, 0x19, 0x03, 0x33, 0x18, 0x83, 0x33, 0x18, 0x83, 0x38, 0x18, 0x03,
2248 0x39, 0xf8, 0xa2, 0x31, 0x98, 0x83, 0xaf, 0x19, 0x03, 0x68, 0x0c, 0xe8,
2249 0x60, 0x0c, 0xae, 0x31, 0xa8, 0x03, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74,
2250 0x33, 0x34, 0xde, 0xcc, 0xcc, 0xe6, 0xca, 0xe8, 0x88, 0x98, 0xb1, 0xbd,
2251 0x85, 0xd1, 0xcd, 0xe0, 0xcd, 0xd0, 0x68, 0x0b, 0xa3, 0x93, 0x4b, 0xc3,
2252 0x1b, 0x42, 0x7d, 0xcb, 0xe7, 0x7c, 0xcb, 0x18, 0xdc, 0xc1, 0x18, 0xe0,
2253 0xc1, 0xe7, 0x7c, 0xd8, 0xb7, 0x8c, 0x41, 0x1e, 0x8c, 0x81, 0x1e, 0x30,
2254 0xc9, 0xaa, 0xb2, 0x22, 0x2a, 0x1b, 0x7b, 0x23, 0x2b, 0xa3, 0x41, 0x56,
2255 0x36, 0xf6, 0x46, 0x56, 0x36, 0x84, 0x0c, 0xbe, 0x66, 0x0c, 0xc6, 0x60,
2256 0x0c, 0xc8, 0xe0, 0x93, 0xc6, 0xa0, 0x0c, 0x3e, 0xe6, 0x63, 0xc6, 0xc0,
2257 0x0c, 0xc6, 0xe0, 0x0c, 0xc6, 0x60, 0x0f, 0xc6, 0x40, 0x0e, 0x3e, 0x69,
2258 0x0c, 0xe6, 0xe0, 0x73, 0xc6, 0x00, 0x1a, 0x03, 0x3e, 0x18, 0x83, 0x6b,
2259 0x0c, 0xfa, 0x80, 0x4b, 0x58, 0x9a, 0x9c, 0x0b, 0x5d, 0x19, 0x1e, 0x5d,
2260 0x9d, 0x5c, 0x19, 0x95, 0xb0, 0x34, 0x39, 0x97, 0xb9, 0xb0, 0x36, 0x38,
2261 0xb6, 0x32, 0x62, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64,
2262 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70,
2263 0x6c, 0x65, 0x3e, 0x24, 0xe8, 0xca, 0xf0, 0xb2, 0x86, 0x50, 0x5f, 0x36,
2264 0x06, 0x7f, 0x30, 0x06, 0x65, 0xf0, 0x2d, 0x1f, 0x33, 0x06, 0xa0, 0x30,
2265 0x06, 0xd0, 0x18, 0x84, 0xc2, 0x18, 0x5c, 0x63, 0x20, 0x0a, 0x2c, 0xe8,
2266 0xca, 0xf0, 0xaa, 0xac, 0x86, 0x50, 0x9f, 0x36, 0x06, 0x7f, 0x30, 0x06,
2267 0x65, 0xf0, 0x31, 0x1f, 0x33, 0x06, 0xa0, 0x30, 0x06, 0xd0, 0x18, 0x84,
2268 0xc2, 0x18, 0x5c, 0x63, 0x40, 0x0a, 0x5c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6,
2269 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, 0xb5, 0xc1, 0xb1,
2270 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x7d, 0xdb, 0x18, 0x98, 0xc2, 0x18,
2271 0x94, 0xc1, 0xb7, 0x7c, 0xcc, 0x18, 0x40, 0x63, 0x70, 0x0a, 0x63, 0x70,
2272 0x8d, 0x01, 0x2a, 0x0c, 0x81, 0xc6, 0x20, 0x1b, 0x03, 0x6f, 0x0c, 0xc4,
2273 0x60, 0x0c, 0xec, 0x60, 0x0c, 0xfc, 0x60, 0x0c, 0x46, 0x61, 0x0c, 0x4a,
2274 0x61, 0x0c, 0x52, 0x61, 0x88, 0xf1, 0x00, 0x63, 0x30, 0x8d, 0x81, 0x2a,
2275 0xb0, 0xfa, 0xd2, 0xa2, 0x9a, 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b,
2276 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3,
2277 0xd6, 0xe6, 0x96, 0x06, 0xf7, 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86,
2278 0x16, 0x26, 0xc7, 0x67, 0x2a, 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68,
2279 0x65, 0x05, 0x84, 0x4a, 0x28, 0x28, 0x68, 0x88, 0x30, 0x06, 0xae, 0x30,
2280 0xc4, 0x18, 0x83, 0x56, 0x18, 0x83, 0x57, 0x28, 0x83, 0x6e, 0x88, 0x31,
2281 0x06, 0x68, 0x30, 0x06, 0xb0, 0x50, 0x06, 0xdd, 0x10, 0x31, 0x18, 0x03,
2282 0x56, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6e, 0x0c, 0x62, 0xa1, 0x0c, 0xbc,
2283 0x31, 0x88, 0x85, 0x32, 0xf8, 0xc6, 0x20, 0x16, 0xca, 0x00, 0x0c, 0xc6,
2284 0x20, 0x16, 0xca, 0x20, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x40, 0x0c, 0xc6,
2285 0x20, 0x16, 0xca, 0x60, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x80, 0x1b, 0x62,
2286 0x8c, 0x81, 0x2c, 0x8c, 0x41, 0x2c, 0x94, 0x81, 0xc7, 0x31, 0x08, 0x4b,
2287 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83,
2288 0x2b, 0x9b, 0x43, 0x99, 0x22, 0x62, 0xfa, 0x72, 0xb2, 0x8a, 0x91, 0xf9,
2289 0x32, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0x4b, 0x19, 0x42, 0x8c,
2290 0x41, 0x2d, 0x8c, 0x01, 0x2d, 0xd0, 0x0a, 0x4b, 0x93, 0x6b, 0x09, 0x63,
2291 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x09, 0x93,
2292 0x3b, 0x43, 0x99, 0x49, 0x19, 0x62, 0x8c, 0xc1, 0x2d, 0x8c, 0x41, 0x2d,
2293 0x8c, 0x81, 0x2d, 0x0c, 0x11, 0xc6, 0xe0, 0x16, 0x68, 0x85, 0xa5, 0xc9,
2294 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95,
2295 0xb5, 0x84, 0xc9, 0x9d, 0xa1, 0xd0, 0xa4, 0x0c, 0x31, 0xc6, 0x40, 0x17,
2296 0xc6, 0xa0, 0x16, 0xc6, 0x20, 0x17, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84,
2297 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xd0,
2298 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xcd, 0x0d, 0x31, 0xc6, 0x80, 0x17,
2299 0xc6, 0xa0, 0x16, 0xc6, 0x60, 0x17, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84,
2300 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xcc,
2301 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xcd, 0x0d, 0x31, 0xc6, 0xc0, 0x17,
2302 0xc6, 0xa0, 0x16, 0xc6, 0xa0, 0x17, 0x86, 0x18, 0x63, 0xa0, 0x0b, 0x63,
2303 0xc0, 0x0b, 0x63, 0xe0, 0x0b, 0x43, 0x88, 0x31, 0xe0, 0x85, 0x31, 0xf0,
2304 0x85, 0x21, 0xc4, 0x18, 0xdc, 0xc2, 0x18, 0xe8, 0xc2, 0x10, 0x61, 0x0c,
2305 0x74, 0x61, 0x88, 0x31, 0x06, 0xb7, 0x30, 0x06, 0xbc, 0x30, 0x06, 0xbe,
2306 0x30, 0xc4, 0x18, 0x03, 0x59, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6f, 0x88,
2307 0x31, 0x06, 0xb2, 0x30, 0x06, 0xb1, 0x50, 0x06, 0xdc, 0x10, 0x63, 0x0c,
2308 0x64, 0x61, 0x0c, 0x62, 0xa1, 0x0c, 0xc2, 0x60, 0x88, 0x31, 0x06, 0xb2,
2309 0x30, 0x06, 0xb1, 0x50, 0x06, 0x62, 0x30, 0xc4, 0x18, 0x03, 0x59, 0x18,
2310 0x83, 0x58, 0x28, 0x83, 0x31, 0x18, 0x62, 0x8c, 0x81, 0x2c, 0x8c, 0x41,
2311 0x2c, 0x94, 0x01, 0x18, 0x0c, 0x31, 0xc6, 0x40, 0x16, 0xc6, 0x20, 0x16,
2312 0xca, 0xa0, 0x1b, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, 0x41,
2313 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98, 0x03,
2314 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28, 0xec,
2315 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e, 0xee,
2316 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e,
2317 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53,
2318 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e, 0xe1,
2319 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b, 0xf6,
2320 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x40,
2321 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e, 0xed,
2322 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f, 0xf4,
2323 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67, 0x04,
2324 0x13, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0e, 0xf2, 0x10, 0x0e, 0xe7,
2325 0xd0, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x58, 0x05, 0x00, 0x00,
2326 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
2327 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
2328 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
2329 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
2330 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
2331 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
2332 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
2333 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
2334 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
2335 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
2336 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
2337 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
2338 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
2339 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
2340 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
2341 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
2342 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
2343 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
2344 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
2345 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
2346 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
2347 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
2348 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70,
2349 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74,
2350 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f,
2351 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e,
2352 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41,
2353 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1,
2354 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c,
2355 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37,
2356 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f,
2357 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21,
2358 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21,
2359 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0,
2360 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88,
2361 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77,
2362 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c,
2363 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23,
2364 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01,
2365 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84,
2366 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8,
2367 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76,
2368 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e,
2369 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f,
2370 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e,
2371 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e,
2372 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1,
2373 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21,
2374 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8,
2375 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77,
2376 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19,
2377 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e,
2378 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30,
2379 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71,
2380 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77,
2381 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
2382 0x00, 0x2e, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf,
2383 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45,
2384 0x51, 0x14, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f,
2385 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x11, 0x34, 0x00, 0x12, 0xf9, 0x83,
2386 0x33, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x6c, 0x00, 0x12, 0xf9, 0x12,
2387 0xc0, 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0x83,
2388 0x5f, 0xe1, 0xc5, 0x6d, 0x1b, 0xc2, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2,
2389 0xf4, 0x17, 0x40, 0x20, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x05, 0x50, 0x00,
2390 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xbf, 0xb0, 0x00, 0xcc, 0xe3, 0x57, 0x77,
2391 0x71, 0xdb, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05,
2392 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x02, 0x10, 0x80, 0x44, 0x7e,
2393 0x01, 0x48, 0xd3, 0xff, 0x38, 0x96, 0x5f, 0xdc, 0xb6, 0x01, 0x44, 0x6c,
2394 0x57, 0xfe, 0xe7, 0x5b, 0xdb, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0x93,
2395 0x0d, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0x01, 0x04, 0x92,
2396 0x5f, 0xdc, 0xb6, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f,
2397 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
2398 0x00, 0x12, 0x02, 0x00, 0x00, 0x13, 0x04, 0x72, 0x10, 0x0b, 0x04, 0x00,
2399 0x00, 0x56, 0x00, 0x00, 0x00, 0xd4, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc,
2400 0x41, 0x2c, 0xcc, 0x83, 0x07, 0x94, 0x8e, 0x35, 0x00, 0x03, 0x31, 0xc7,
2401 0xb0, 0x30, 0x78, 0x30, 0xc7, 0xb0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c,
2402 0x35, 0x00, 0x81, 0x40, 0x65, 0x11, 0x94, 0x00, 0x81, 0x63, 0x09, 0x01,
2403 0x30, 0x02, 0x40, 0xdf, 0x0c, 0x00, 0x79, 0x23, 0x00, 0x35, 0x40, 0xc0,
2404 0x0c, 0x00, 0x05, 0x33, 0x00, 0x33, 0x00, 0x73, 0x10, 0xb4, 0xa0, 0x0b,
2405 0xb4, 0xb0, 0x07, 0x24, 0xcc, 0x00, 0x50, 0x31, 0x03, 0x30, 0x02, 0x30,
2406 0x03, 0x30, 0xd6, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8,
2407 0x07, 0x82, 0x20, 0x88, 0x7f, 0x63, 0x0d, 0x6c, 0x3b, 0xff, 0xa4, 0xc7,
2408 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0x37, 0xd6, 0x00, 0x82,
2409 0x20, 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2,
2410 0xf5, 0x2f, 0x8c, 0x35, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x00, 0x82, 0xe0,
2411 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x63, 0x0d, 0x20, 0x48,
2412 0xb7, 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b,
2413 0x83, 0xc1, 0x58, 0xc3, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0xeb, 0x88, 0xc7,
2414 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x30,
2415 0x1e, 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1,
2416 0x18, 0x8c, 0x35, 0x88, 0xb9, 0x98, 0xf6, 0x1f, 0x58, 0xf2, 0x6c, 0xfc,
2417 0x0b, 0x63, 0xba, 0xaa, 0xb9, 0x2f, 0x8c, 0x35, 0xfc, 0x33, 0xe9, 0xff,
2418 0xbe, 0x40, 0xd7, 0xa0, 0x98, 0x7f, 0x2d, 0x1c, 0xc7, 0xa0, 0x2f, 0x8c,
2419 0x35, 0xcc, 0x7d, 0x9b, 0xa6, 0xbe, 0xd0, 0xba, 0x21, 0xcf, 0xfb, 0x02,
2420 0x9f, 0xb3, 0x3e, 0xfe, 0x11, 0x30, 0x46, 0x00, 0x82, 0x20, 0x48, 0x82,
2421 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63, 0x04, 0x3a, 0x6b,
2422 0xce, 0x21, 0x18, 0x8c, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81,
2423 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18,
2424 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf,
2425 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba,
2426 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8,
2427 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00,
2428 0x00, 0xe3, 0x0d, 0x73, 0xe0, 0x07, 0xaf, 0x40, 0xc1, 0x18, 0x6e, 0x08,
2429 0x9e, 0x60, 0x96, 0x21, 0x10, 0x82, 0x11, 0x03, 0xa5, 0x08, 0x68, 0x81,
2430 0x0e, 0xe4, 0xe0, 0x0e, 0xc8, 0xe0, 0x0c, 0xca, 0x80, 0x18, 0x31, 0x50,
2431 0x8a, 0xa0, 0x16, 0xe8, 0x60, 0x0e, 0xf0, 0xa0, 0x0c, 0xd0, 0xc0, 0x0c,
2432 0x8a, 0x41, 0x06, 0x61, 0x0c, 0xde, 0x60, 0x90, 0x41, 0x28, 0x83, 0x38,
2433 0x18, 0x64, 0x10, 0x82, 0x39, 0x38, 0x3d, 0x50, 0x97, 0x82, 0x32, 0xc8,
2434 0x10, 0xa4, 0x81, 0x1c, 0x18, 0x11, 0xc0, 0x67, 0xbc, 0xc1, 0x0f, 0x54,
2435 0x61, 0x17, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, 0x10, 0xb8, 0xc1, 0x1d,
2436 0x8c, 0x18, 0x14, 0x46, 0x70, 0x0e, 0x45, 0x30, 0xc7, 0xf0, 0x06, 0x41,
2437 0x38, 0x8c, 0x57, 0x90, 0x02, 0x2c, 0x84, 0x83, 0x38, 0xe0, 0xc1, 0x05,
2438 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x3a, 0xe8, 0x83, 0x11, 0x83, 0xc2,
2439 0x08, 0xda, 0x61, 0x09, 0xe6, 0x18, 0x8c, 0xc0, 0x1c, 0xc6, 0x2b, 0x54,
2440 0xc1, 0x16, 0xce, 0x01, 0x1d, 0xfe, 0xe0, 0x02, 0x75, 0x29, 0x28, 0x83,
2441 0x0c, 0x81, 0x1e, 0x8c, 0xc2, 0x88, 0x41, 0x61, 0x04, 0xf3, 0x10, 0x05,
2442 0x73, 0x0c, 0x46, 0x90, 0x0e, 0xb3, 0x04, 0xc4, 0x70, 0x43, 0xc7, 0x06,
2443 0xc1, 0x2c, 0xc3, 0x40, 0x04, 0x23, 0x06, 0x4a, 0x11, 0xc0, 0x03, 0x2c,
2444 0xb8, 0xc2, 0x2c, 0x80, 0xc2, 0x28, 0x84, 0x02, 0x18, 0x8c, 0x18, 0x28,
2445 0x45, 0x10, 0x0f, 0xb0, 0xf0, 0x0a, 0xb4, 0x10, 0x0a, 0xa4, 0x20, 0x0a,
2446 0x61, 0x30, 0xc8, 0x10, 0x80, 0x82, 0x29, 0x0c, 0x32, 0x0c, 0xa0, 0xc0,
2447 0x0a, 0x83, 0x0c, 0xc2, 0x1f, 0xb8, 0xc2, 0x20, 0x83, 0x10, 0xc0, 0xc2,
2448 0xdd, 0x82, 0xba, 0x14, 0x94, 0x41, 0x86, 0xc0, 0x14, 0x5e, 0xc1, 0x88,
2449 0x00, 0x3e, 0xe3, 0x0d, 0xbb, 0x70, 0x0e, 0xf8, 0x70, 0x81, 0xba, 0x14,
2450 0x94, 0x41, 0x86, 0x60, 0x15, 0x68, 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x92,
2451 0x28, 0x82, 0x39, 0x06, 0x56, 0x08, 0xfc, 0x61, 0xbc, 0x22, 0x1c, 0xda,
2452 0xc1, 0x1f, 0xfe, 0xa1, 0x16, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, 0x10,
2453 0xc4, 0x82, 0x2e, 0x8c, 0x18, 0x14, 0x46, 0xa0, 0x12, 0x4b, 0x30, 0xc7,
2454 0x60, 0x04, 0x23, 0x31, 0x5e, 0x71, 0x0e, 0xf3, 0x40, 0x12, 0x25, 0xc1,
2455 0x0b, 0x17, 0xa8, 0x4b, 0x41, 0x19, 0x64, 0x08, 0x6e, 0x01, 0x1c, 0x46,
2456 0x0c, 0x0a, 0x23, 0x80, 0x89, 0x28, 0x98, 0x63, 0x30, 0x02, 0x93, 0x98,
2457 0x25, 0x20, 0x06, 0x3a, 0x02, 0x3e, 0x08, 0x84, 0x01, 0x2e, 0x84, 0x39,
2458 0x86, 0x60, 0x14, 0x48, 0x62, 0xbc, 0x01, 0x1e, 0xf6, 0x21, 0x25, 0x28,
2459 0x18, 0xc3, 0x0d, 0x41, 0x2b, 0x04, 0xb3, 0x0c, 0x85, 0x11, 0x0c, 0x32,
2460 0x10, 0xbf, 0x80, 0x0e, 0xe3, 0x0d, 0xf4, 0xf0, 0x0f, 0x21, 0x41, 0xc1,
2461 0x18, 0x31, 0x20, 0x8c, 0xc0, 0x26, 0x86, 0x11, 0x83, 0xc2, 0x08, 0x70,
2462 0x22, 0xd8, 0x05, 0x0b, 0x76, 0x01, 0x3e, 0x23, 0x06, 0x85, 0x11, 0xe0,
2463 0x44, 0x00, 0x0e, 0x36, 0xf0, 0x82, 0x7c, 0x8c, 0x17, 0x82, 0xf8, 0xd8,
2464 0x10, 0xd0, 0x67, 0xc4, 0x80, 0x30, 0x82, 0x9e, 0x08, 0x46, 0x0c, 0x0a,
2465 0x23, 0xf8, 0x89, 0xc0, 0x17, 0x2c, 0xf0, 0x05, 0xf9, 0xcc, 0x31, 0xa0,
2466 0xc3, 0xd2, 0x13, 0x83, 0x0c, 0x41, 0x3a, 0xdc, 0x83, 0x0d, 0x01, 0x7d,
2467 0x06, 0x19, 0x82, 0x75, 0xe8, 0x87, 0x41, 0x86, 0xa0, 0xfa, 0x87, 0x59,
2468 0x02, 0x63, 0xa0, 0x22, 0x10, 0x0a, 0x36, 0x20, 0xc6, 0x1b, 0x4c, 0x22,
2469 0x26, 0xc2, 0x82, 0x82, 0x31, 0xdc, 0x10, 0xd8, 0x82, 0x33, 0xcb, 0x70,
2470 0x20, 0xc1, 0x20, 0x03, 0x51, 0x0f, 0xfe, 0x30, 0xde, 0xa0, 0x12, 0x35,
2471 0x91, 0x13, 0x14, 0x8c, 0xf1, 0x06, 0x96, 0xb8, 0x09, 0x9d, 0xa0, 0x60,
2472 0x8c, 0x18, 0x20, 0x47, 0x14, 0x17, 0x45, 0x77, 0x0c, 0xc1, 0x20, 0x43,
2473 0x70, 0x0f, 0x29, 0x31, 0xc8, 0x10, 0x2c, 0x2b, 0x31, 0x4b, 0x80, 0x0c,
2474 0x54, 0x04, 0xc2, 0x81, 0x19, 0xc3, 0x0d, 0x61, 0x60, 0x0e, 0xc1, 0x2c,
2475 0x43, 0x72, 0x05, 0xe3, 0x0d, 0x33, 0xe1, 0x13, 0x6f, 0x41, 0xc1, 0x18,
2476 0x6e, 0x08, 0xd2, 0x21, 0x98, 0x65, 0x50, 0x96, 0x60, 0x90, 0xa1, 0x10,
2477 0x89, 0x95, 0x18, 0x6f, 0xb8, 0x09, 0xb1, 0x60, 0x0b, 0x0a, 0xc6, 0x1c,
2478 0x43, 0x48, 0x04, 0x76, 0x31, 0xc8, 0x10, 0x88, 0x04, 0x4c, 0x58, 0x50,
2479 0xc8, 0x67, 0x90, 0x21, 0x20, 0x09, 0x9b, 0x98, 0x25, 0x88, 0x83, 0xf1,
2480 0x86, 0x9e, 0x40, 0x0b, 0xbd, 0xa0, 0x60, 0x8c, 0x37, 0xfc, 0x84, 0x5a,
2481 0xd0, 0x05, 0x05, 0x63, 0x90, 0x01, 0x6a, 0x89, 0x9d, 0x18, 0x6e, 0x20,
2482 0xe0, 0xc1, 0x99, 0x65, 0x60, 0xac, 0x60, 0x0c, 0x41, 0x02, 0x8d, 0xe1,
2483 0x86, 0x20, 0x1f, 0x94, 0x59, 0x06, 0xa7, 0x09, 0x4c, 0xd8, 0x07, 0xf9,
2484 0xcc, 0x12, 0x3c, 0x36, 0xf4, 0x03, 0x7c, 0x46, 0x0c, 0x08, 0x23, 0x60,
2485 0x8d, 0xc0, 0x02, 0x90, 0x90, 0xcf, 0x88, 0x41, 0x61, 0x04, 0xaf, 0x11,
2486 0x88, 0xc4, 0x2c, 0xc1, 0x33, 0x50, 0x01, 0x28, 0x8d, 0xe0, 0xcc, 0x31,
2487 0xd8, 0x44, 0x80, 0x1a, 0x63, 0x08, 0x1b, 0x6a, 0x0c, 0x37, 0x04, 0x22,
2488 0xa1, 0xcc, 0x32, 0x44, 0x50, 0x60, 0x02, 0x49, 0xc8, 0x67, 0x96, 0x40,
2489 0xb2, 0xc1, 0x24, 0xe0, 0x33, 0x62, 0x40, 0x18, 0x41, 0x6d, 0x04, 0x16,
2490 0xa4, 0x84, 0x7c, 0x46, 0x0c, 0x0a, 0x23, 0xc0, 0x8d, 0x60, 0x25, 0x66,
2491 0x09, 0xa4, 0x81, 0x0a, 0x40, 0x81, 0x84, 0x68, 0x8e, 0x21, 0x09, 0x60,
2492 0x63, 0x0c, 0x81, 0x0c, 0x5c, 0x63, 0xb8, 0x21, 0x58, 0x09, 0x65, 0x96,
2493 0x81, 0x9a, 0x02, 0x13, 0x5a, 0x42, 0x3e, 0xb3, 0x04, 0x95, 0x0d, 0x2f,
2494 0x01, 0x9f, 0x11, 0x03, 0xc2, 0x08, 0x7c, 0x23, 0xb0, 0x40, 0x26, 0xe4,
2495 0x33, 0x62, 0x50, 0x18, 0x41, 0x78, 0x04, 0x34, 0x31, 0x4b, 0x50, 0x0d,
2496 0x54, 0x00, 0xca, 0x24, 0x50, 0x73, 0x0c, 0x49, 0x60, 0x1b, 0xb3, 0x04,
2497 0xd6, 0x40, 0x45, 0x20, 0x54, 0x7a, 0xb0, 0x0c, 0x32, 0x04, 0x6b, 0x41,
2498 0x17, 0x73, 0x0c, 0x68, 0x01, 0x06, 0xbd, 0x31, 0xc8, 0x10, 0xa4, 0xc5,
2499 0x5d, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x58, 0x8b, 0xbe, 0x98, 0x25,
2500 0x88, 0x83, 0xe1, 0x86, 0x59, 0xf0, 0x89, 0x60, 0x96, 0x01, 0x23, 0x83,
2501 0x60, 0x90, 0x81, 0x0e, 0xe2, 0x42, 0x2f, 0xc6, 0x1b, 0x4c, 0x23, 0x36,
2502 0xc6, 0x83, 0x82, 0x31, 0xde, 0x80, 0x1a, 0xb3, 0xd1, 0x1b, 0x14, 0x8c,
2503 0x39, 0x06, 0xb9, 0x08, 0xce, 0x63, 0x90, 0x21, 0x98, 0x8b, 0xd0, 0xb0,
2504 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x50, 0x17, 0xa7, 0x31, 0xdc, 0x70, 0xf0,
2505 0x84, 0x33, 0xcb, 0x30, 0x06, 0x59, 0x30, 0x86, 0x30, 0xb0, 0xc7, 0x70,
2506 0x43, 0xf0, 0x13, 0xca, 0x2c, 0xc3, 0xa6, 0x05, 0x26, 0x84, 0x85, 0x7c,
2507 0x66, 0x09, 0xb8, 0x11, 0x03, 0xc2, 0x08, 0xee, 0x63, 0x18, 0x31, 0x28,
2508 0x8c, 0x20, 0x3f, 0x02, 0xb2, 0xb0, 0xc0, 0x2c, 0xe4, 0x63, 0x01, 0x5a,
2509 0xc0, 0x67, 0x96, 0x80, 0x1b, 0xa8, 0x00, 0x14, 0x4d, 0xd8, 0xe6, 0x18,
2510 0xfa, 0x22, 0xa0, 0x8f, 0x31, 0x04, 0x86, 0x3e, 0x86, 0x1b, 0x02, 0xb4,
2511 0x50, 0x66, 0x19, 0xbc, 0x2e, 0x30, 0x41, 0x2d, 0xe4, 0x33, 0x4b, 0xf0,
2512 0x8d, 0x18, 0x10, 0x46, 0x00, 0x22, 0xc3, 0x88, 0x41, 0x61, 0x04, 0x22,
2513 0x12, 0xb4, 0x85, 0x05, 0x6f, 0x21, 0x1f, 0x0b, 0xe2, 0x02, 0x3e, 0xb3,
2514 0x04, 0xdf, 0x40, 0x05, 0xa0, 0x74, 0x82, 0x37, 0xc7, 0x90, 0x04, 0xfc,
2515 0x31, 0x86, 0x50, 0xe9, 0xc7, 0x70, 0x43, 0x10, 0x17, 0xca, 0x2c, 0x43,
2516 0x18, 0x80, 0x41, 0x60, 0xc2, 0x5c, 0xc8, 0x67, 0x96, 0x40, 0x0c, 0x46,
2517 0x0c, 0x08, 0x23, 0x48, 0x91, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0x15, 0x09,
2518 0xec, 0xc2, 0x02, 0xbc, 0x90, 0x8f, 0x05, 0x7a, 0x01, 0x9f, 0x59, 0x02,
2519 0x31, 0x18, 0xa8, 0x00, 0x14, 0x30, 0x10, 0xc2, 0x60, 0x8e, 0x21, 0x09,
2520 0x44, 0x64, 0xc4, 0xc0, 0x30, 0x82, 0x18, 0x09, 0x62, 0xe3, 0x35, 0x06,
2521 0x19, 0x82, 0xd9, 0x28, 0x8f, 0x59, 0x82, 0x31, 0x18, 0xa8, 0x08, 0xfc,
2522 0x00, 0x13, 0xc4, 0x60, 0x90, 0x21, 0xc8, 0x8d, 0xf3, 0x98, 0x25, 0x88,
2523 0x83, 0x59, 0x86, 0x32, 0x88, 0x03, 0x7e, 0x18, 0x64, 0xe8, 0x05, 0xdd,
2524 0x18, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0x66, 0x24, 0x68, 0x8d, 0x39, 0x06,
2525 0xdb, 0x08, 0x5a, 0x64, 0xc4, 0xa0, 0x30, 0x82, 0x1a, 0x19, 0x5c, 0x63,
2526 0x8e, 0x41, 0x08, 0x5c, 0x64, 0xc4, 0xa0, 0x30, 0x82, 0x1b, 0x29, 0x5e,
2527 0x63, 0x8e, 0x41, 0x08, 0x5a, 0x64, 0x90, 0x21, 0xe8, 0x8d, 0xf7, 0x18,
2528 0x64, 0x08, 0xca, 0x21, 0x3e, 0xc6, 0x1b, 0xee, 0x43, 0x44, 0x68, 0x84,
2529 0x82, 0x31, 0xde, 0x90, 0x1f, 0x24, 0xe2, 0x22, 0x14, 0x8c, 0x39, 0x86,
2530 0xf1, 0x08, 0x70, 0x64, 0x90, 0x21, 0x20, 0x0f, 0xf9, 0xb0, 0x20, 0x91,
2531 0xcf, 0x20, 0x43, 0x60, 0x1e, 0xf8, 0x31, 0xdc, 0x70, 0xb4, 0x86, 0x33,
2532 0xcb, 0x00, 0x07, 0x66, 0x10, 0x8c, 0x21, 0x0c, 0x3d, 0x32, 0xdc, 0x10,
2533 0xc0, 0x86, 0x32, 0xcb, 0x80, 0x06, 0x67, 0x10, 0x98, 0x20, 0x1b, 0xf2,
2534 0x99, 0x25, 0x48, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xd0, 0x64, 0x18, 0x31,
2535 0x28, 0x8c, 0x40, 0x4d, 0x82, 0xda, 0xb0, 0xe0, 0x36, 0xe4, 0x63, 0x41,
2536 0x6e, 0xc0, 0x67, 0x96, 0x20, 0x0d, 0x06, 0x2a, 0x00, 0xe5, 0x0c, 0x04,
2537 0x34, 0x98, 0x63, 0x70, 0x8f, 0xa0, 0x4c, 0xc6, 0x10, 0x98, 0x32, 0x19,
2538 0x6e, 0x08, 0x72, 0x43, 0x99, 0x65, 0x58, 0x03, 0x35, 0x08, 0x4c, 0xd8,
2539 0x0d, 0xf9, 0xcc, 0x12, 0xb0, 0xc1, 0x88, 0x01, 0x61, 0x04, 0x71, 0x32,
2540 0x8c, 0x18, 0x14, 0x46, 0x30, 0x27, 0x81, 0x6f, 0x58, 0x00, 0x1e, 0xf2,
2541 0xb1, 0x40, 0x3c, 0xe0, 0x33, 0x4b, 0xc0, 0x06, 0x03, 0x15, 0x80, 0xa2,
2542 0x06, 0xc2, 0x1a, 0xcc, 0x31, 0x24, 0x41, 0x9b, 0x8c, 0x21, 0x54, 0x6b,
2543 0x32, 0xdc, 0x10, 0x88, 0x87, 0x32, 0xcb, 0xe0, 0x06, 0x6d, 0x10, 0x98,
2544 0x40, 0x1e, 0xf2, 0x99, 0x25, 0x78, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xf4,
2545 0x64, 0x18, 0x31, 0x28, 0x8c, 0x80, 0x4f, 0x82, 0xf3, 0xb0, 0x20, 0x3d,
2546 0xe4, 0x63, 0xc1, 0x7a, 0xc0, 0x67, 0x96, 0xe0, 0x0d, 0x06, 0x2a, 0x00,
2547 0xa5, 0x0d, 0x04, 0x37, 0x98, 0x63, 0x48, 0x82, 0x39, 0x19, 0x31, 0x30,
2548 0x8c, 0x40, 0x54, 0x02, 0x11, 0x01, 0x91, 0x41, 0x86, 0x80, 0x44, 0x6c,
2549 0x64, 0x96, 0x00, 0x0e, 0x06, 0x2a, 0x02, 0x3f, 0x28, 0x03, 0xe1, 0x0d,
2550 0x06, 0x19, 0x02, 0x15, 0xc1, 0x91, 0x59, 0x82, 0x38, 0x18, 0x68, 0x09,
2551 0x78, 0x44, 0xe1, 0x11, 0x8b, 0x47, 0xc6, 0x40, 0x16, 0xe0, 0x80, 0x47,
2552 0xc8, 0x60, 0xa0, 0x25, 0x40, 0x11, 0x45, 0x2f, 0x2c, 0x73, 0x18, 0x03,
2553 0x02, 0x0e, 0x68, 0x88, 0x0c, 0x06, 0x19, 0x02, 0x81, 0x47, 0x2c, 0x20,
2554 0x13, 0xf9, 0x64, 0x10, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
2555 0x00, 0x17, 0xd3, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4,
2556 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d,
2557 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b,
2558 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71,
2559 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x2c, 0x00, 0x00,
2560 0x00, 0x5b, 0x8e, 0x20, 0x98, 0x85, 0x03, 0x17, 0x90, 0x5f, 0xd8, 0x52,
2561 0x10, 0x07, 0x38, 0x20, 0xe1, 0xb0, 0xa5, 0x28, 0x0e, 0x70, 0x40, 0xc2,
2562 0x61, 0x4b, 0xa1, 0x1c, 0xe2, 0x80, 0x8c, 0xc3, 0x96, 0xe2, 0x39, 0xc4,
2563 0x01, 0x19, 0x87, 0x2d, 0x45, 0x75, 0x88, 0x03, 0x32, 0x0e, 0x5b, 0x8a,
2564 0xed, 0x10, 0x07, 0x64, 0x1c, 0xb6, 0x14, 0x62, 0x70, 0x80, 0x03, 0x12,
2565 0x0e, 0x5b, 0x8a, 0x31, 0x38, 0xc0, 0x01, 0x09, 0x87, 0x2d, 0x45, 0x1a,
2566 0x1c, 0xe2, 0x80, 0x8c, 0xc3, 0x96, 0xc2, 0x0d, 0x0e, 0x71, 0x40, 0xc6,
2567 0x61, 0x4b, 0x41, 0x07, 0x87, 0x38, 0x20, 0xe3, 0xb0, 0xa5, 0xd0, 0x83,
2568 0x43, 0x1c, 0x90, 0x71, 0xd8, 0x32, 0x88, 0x42, 0x40, 0x0e, 0x5b, 0x86,
2569 0x53, 0x08, 0xca, 0x61, 0xcb, 0xa0, 0x0b, 0x81, 0x39, 0x6c, 0x19, 0x7e,
2570 0x21, 0x38, 0x87, 0x2d, 0x43, 0x38, 0x04, 0xe8, 0xb0, 0x65, 0x50, 0x87,
2571 0x60, 0x16, 0xb6, 0x0c, 0xef, 0x10, 0xa4, 0xc3, 0x96, 0xc1, 0x1e, 0x02,
2572 0x75, 0xd8, 0x32, 0xe0, 0x43, 0x90, 0x0e, 0x5b, 0x06, 0xb6, 0x08, 0xd4,
2573 0x61, 0xcb, 0xe0, 0x16, 0x41, 0x3a, 0x6c, 0x19, 0xd4, 0x23, 0x50, 0x87,
2574 0x2d, 0x03, 0x7b, 0x04, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2575 0x00, 0x61, 0x20, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a,
2576 0x2c, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xd4, 0xce, 0x41,
2577 0x2c, 0xcc, 0xd3, 0x06, 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40,
2578 0xdf, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0,
2579 0xec, 0x19, 0xca, 0x1f, 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce,
2580 0xde, 0x58, 0x83, 0x5e, 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf,
2581 0xdb, 0xa7, 0xf4, 0xe8, 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a,
2582 0xc2, 0xe8, 0xee, 0xdd, 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b,
2583 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb,
2584 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9,
2585 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea,
2586 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05,
2587 0x33, 0x00, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60,
2588 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5,
2589 0x02, 0x0d, 0x37, 0x50, 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43,
2590 0x43, 0xc5, 0xc1, 0x20, 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64,
2591 0x08, 0xa0, 0x6a, 0x96, 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61,
2592 0x48, 0x82, 0xe1, 0x86, 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31,
2593 0x28, 0x8c, 0xc0, 0x0f, 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4,
2594 0xa0, 0x30, 0x02, 0x50, 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11,
2595 0x83, 0xc2, 0x08, 0x44, 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83,
2596 0x59, 0x82, 0x62, 0xa0, 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc,
2597 0x60, 0x0c, 0x41, 0xf0, 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a,
2598 0x23, 0x30, 0x05, 0x21, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x14, 0x88, 0x60,
2599 0xb8, 0x21, 0xb8, 0x84, 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c,
2600 0x0c, 0x6c, 0x40, 0x03, 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90,
2601 0x8f, 0x05, 0x1a, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81,
2602 0x2a, 0x0c, 0x32, 0x04, 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64,
2603 0x08, 0xd2, 0xc0, 0x0d, 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4,
2604 0xa0, 0x98, 0x65, 0x40, 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18,
2605 0x31, 0x28, 0x8c, 0xe0, 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20,
2606 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xc8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84,
2607 0x40, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xd8, 0x85, 0x42, 0x0d, 0xe6, 0x18,
2608 0x84, 0x20, 0x16, 0x66, 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57,
2609 0x10, 0x04, 0x04, 0x3a, 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00,
2610 0x00, 0x00, 0x00, 0x00, 0x00
2611};
2612const unsigned int sdl_metallib_len = 31301;
diff --git a/SDL-3.2.8/src/render/metal/SDL_shaders_metal_iphonesimulator.h b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_iphonesimulator.h
new file mode 100644
index 0000000..962d3d0
--- /dev/null
+++ b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_iphonesimulator.h
@@ -0,0 +1,3155 @@
1const unsigned char sdl_metallib[] = {
2 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00,
3 0x00, 0x00, 0x00, 0x00, 0xbd, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00,
5 0x00, 0x00, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00,
7 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0x3d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00,
10 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f,
11 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54,
12 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00,
13 0x40, 0x16, 0x1e, 0x80, 0x6f, 0x65, 0x1c, 0x60, 0x4b, 0xe5, 0x3e, 0x52,
14 0xbd, 0x45, 0x4b, 0x73, 0x3d, 0xb1, 0x9c, 0xfa, 0xfe, 0xc3, 0x69, 0x80,
15 0x87, 0x85, 0xc7, 0x21, 0xed, 0x04, 0x6d, 0xba, 0x4d, 0x44, 0x53, 0x5a,
16 0x08, 0x00, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46,
17 0x46, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00,
20 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x85, 0x00,
21 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f,
22 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00,
23 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20,
24 0x00, 0x4f, 0x3e, 0x88, 0xf6, 0xd4, 0xa3, 0x24, 0xb7, 0xdd, 0x38, 0xe0,
25 0x22, 0x3d, 0x83, 0x1f, 0x22, 0x68, 0x86, 0x1c, 0x9f, 0x44, 0x3b, 0x7a,
26 0x75, 0x43, 0x0b, 0xd5, 0x0c, 0xbf, 0x6a, 0xaf, 0x7a, 0x4d, 0x44, 0x53,
27 0x5a, 0x08, 0x00, 0xb0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f,
28 0x46, 0x46, 0x54, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
29 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0x00,
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02,
31 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x88,
32 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c,
33 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d,
34 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48,
35 0x41, 0x53, 0x48, 0x20, 0x00, 0x69, 0x0c, 0xc0, 0x72, 0x21, 0x01, 0x36,
36 0xf4, 0x14, 0xe1, 0x4d, 0xa4, 0x88, 0x9b, 0xe6, 0x99, 0x4b, 0x81, 0x66,
37 0x0a, 0xe3, 0x36, 0x1a, 0x3b, 0xb2, 0xa9, 0x82, 0x63, 0x0e, 0xec, 0x2c,
38 0x58, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x00,
39 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x66, 0x00, 0x00,
40 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41 0x00, 0x50, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52,
42 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45,
43 0x4e, 0x44, 0x54, 0x87, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12,
44 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72,
45 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01,
46 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x66, 0x5d, 0xb4, 0x98,
47 0xcf, 0x81, 0x8b, 0x13, 0x13, 0xaf, 0x83, 0xd1, 0x40, 0x24, 0xf0, 0x52,
48 0x05, 0xac, 0x7a, 0x64, 0x96, 0xa7, 0xa3, 0x59, 0x4c, 0x41, 0x3c, 0xf3,
49 0xe6, 0xe4, 0xf5, 0xf2, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x50, 0x1f,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00,
51 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x60, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00,
54 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x86, 0x00, 0x00, 0x00, 0x4e, 0x41,
55 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f,
56 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50,
57 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x63, 0x82,
58 0xe4, 0xf4, 0x29, 0x67, 0x41, 0x9b, 0x27, 0xdf, 0xce, 0x83, 0x4e, 0x78,
59 0x01, 0xd6, 0xf3, 0xc5, 0x34, 0x38, 0x15, 0x0a, 0x0b, 0x3a, 0x6e, 0xc6,
60 0x9a, 0xb7, 0x3b, 0x8f, 0x19, 0x4f, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00,
61 0x10, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54,
62 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x4a, 0x00, 0x00, 0x00, 0x00,
64 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00,
65 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x87, 0x00, 0x00, 0x00,
66 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56,
67 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00,
68 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20,
69 0x00, 0x54, 0x3f, 0x4e, 0x00, 0xe4, 0xb5, 0x11, 0x83, 0x07, 0xe1, 0x16,
70 0xbd, 0xe2, 0x4a, 0x65, 0xc1, 0xb1, 0xf2, 0x03, 0x91, 0x7d, 0xa1, 0x48,
71 0xf1, 0x9b, 0x1f, 0xe7, 0xa0, 0xe0, 0x46, 0xa5, 0xcc, 0x4d, 0x44, 0x53,
72 0x5a, 0x08, 0x00, 0xc0, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f,
73 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x6c, 0x00,
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02,
76 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x45,
77 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15,
78 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00,
79 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41,
80 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54,
81 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00,
82 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63,
83 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f,
84 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00,
85 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
86 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
87 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
88 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
89 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
90 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
91 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
92 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
93 0x00, 0x14, 0x00, 0x00, 0x00, 0x84, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xff,
94 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00,
95 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00,
96 0x00, 0x21, 0x0c, 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21,
97 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
98 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
99 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
100 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
101 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88,
102 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4,
103 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46,
104 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24,
105 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78,
106 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77,
107 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a,
108 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21,
109 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1,
110 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0,
111 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c,
112 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76,
113 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
114 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
115 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
116 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
117 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1,
118 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1,
119 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1,
120 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79,
121 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77,
122 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
123 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
124 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0,
125 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
126 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79,
127 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72,
128 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
129 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
130 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01,
131 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
132 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a,
133 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a,
134 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
135 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d,
136 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1,
137 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
138 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x78,
139 0xc2, 0x00, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, 0x0c, 0xe1, 0x90, 0x0e,
140 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f,
141 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, 0x0e, 0xe9, 0x10, 0x0e,
142 0xf3, 0x00, 0x6c, 0xf0, 0x06, 0x02, 0x58, 0x80, 0x2a, 0x48, 0x03, 0x50,
143 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1,
144 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81,
145 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
146 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
147 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
148 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
149 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
150 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0,
151 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
152 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
153 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
154 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88,
155 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6,
156 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00,
157 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
158 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
159 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83,
160 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07,
161 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40,
162 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90,
163 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80,
164 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60,
165 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90,
166 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20,
167 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0,
168 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30,
169 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40,
170 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60,
171 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
172 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0,
173 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30,
174 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80,
175 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60,
176 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
177 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80,
178 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20,
179 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
180 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20,
181 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60,
182 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
183 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20,
184 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20,
185 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10,
186 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
187 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30,
188 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x10, 0xdb, 0x95, 0x3f, 0xeb, 0x2c,
189 0xc8, 0xf0, 0x57, 0x44, 0x34, 0x11, 0xd7, 0x90, 0x08, 0x80, 0x0e, 0x00,
190 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0xd8, 0x20,
191 0x50, 0xf4, 0x6c, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x00, 0x0a, 0x00, 0x00,
192 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
193 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, 0x85, 0x30, 0x02, 0x50,
194 0x80, 0x01, 0x05, 0x52, 0x06, 0xc4, 0x46, 0x00, 0x68, 0x8d, 0x25, 0x48,
195 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
196 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
197 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
198 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
199 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
200 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
201 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
202 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
203 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
204 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
205 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
206 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
207 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
208 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
209 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
210 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
211 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
212 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
213 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
214 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
215 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
216 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
217 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
218 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
219 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
220 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
221 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
222 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
223 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
224 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
225 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
226 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
227 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
228 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
229 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
230 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
231 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
232 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
233 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
234 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
235 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
236 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
237 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
238 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
239 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
240 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
241 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
242 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
243 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
244 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
245 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
246 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
247 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
248 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
249 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
250 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
251 0x00, 0x79, 0x20, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08,
252 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4,
253 0x3c, 0xec, 0x7c, 0x00, 0x00, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x01,
254 0x13, 0x19, 0x0c, 0x12, 0x59, 0x85, 0x53, 0x24, 0x90, 0xe4, 0x19, 0xca,
255 0x83, 0x44, 0x17, 0xa2, 0x24, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72,
256 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69,
257 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61,
258 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32,
259 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74,
260 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34,
261 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e,
262 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f,
263 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61,
264 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66,
265 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61,
266 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
267 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66,
268 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61,
269 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74,
270 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74,
271 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61,
272 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61,
273 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69,
274 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, 0x75, 0x74,
275 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
276 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66,
277 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f,
278 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61,
279 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x61, 0x69,
280 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x70,
281 0x75, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
282 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, 0x6e, 0x65,
283 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, 0x72, 0x5f,
284 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f,
285 0x5f, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x61, 0x69, 0x72, 0x2e,
286 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75,
287 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72,
288 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67,
289 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69,
290 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61,
291 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x66, 0x6c, 0x6f,
292 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
293 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d,
294 0x00, 0xc4, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0xa0,
295 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08, 0x23, 0x08, 0xca, 0x30,
296 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82, 0xa0, 0x14, 0x23, 0x08,
297 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5f, 0x00, 0x06, 0x33, 0x0c,
298 0x61, 0x20, 0x88, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0xf0, 0x7d, 0x63, 0x30,
299 0x03, 0x41, 0x84, 0x41, 0x18, 0x8c, 0xc1, 0x0c, 0x41, 0x31, 0x43, 0x60,
300 0xcc, 0x10, 0x1c, 0x33, 0x14, 0x48, 0xa2, 0x2c, 0xcc, 0x0c, 0x46, 0xe3,
301 0x24, 0xca, 0xf2, 0xcc, 0x50, 0x40, 0x49, 0xb4, 0x48, 0x33, 0x0c, 0x70,
302 0x10, 0x07, 0x72, 0x30, 0x83, 0x32, 0x06, 0x13, 0x35, 0x06, 0x61, 0x50,
303 0x25, 0xd6, 0xc2, 0xcc, 0xa0, 0x84, 0xc1, 0x44, 0x85, 0x41, 0x18, 0x54,
304 0x89, 0xb2, 0x3c, 0x33, 0x40, 0xdf, 0x85, 0x95, 0x01, 0xf5, 0x85, 0x41,
305 0xa6, 0x95, 0xc1, 0x66, 0x06, 0x09, 0xb7, 0x74, 0x33, 0x40, 0x67, 0x70,
306 0x61, 0x65, 0x40, 0x9d, 0x41, 0x18, 0x64, 0x5a, 0x19, 0x6c, 0x66, 0x90,
307 0x70, 0x8b, 0x37, 0x03, 0x41, 0x07, 0x75, 0x60, 0x07, 0x77, 0x30, 0xc3,
308 0x40, 0x06, 0x73, 0x80, 0x07, 0xb5, 0x01, 0x1c, 0xc7, 0x71, 0x1c, 0xc7,
309 0x71, 0x1c, 0x1a, 0xb8, 0x81, 0x85, 0x06, 0x7a, 0x60, 0x59, 0x96, 0x1b,
310 0xd0, 0x81, 0x1b, 0xd0, 0x81, 0x2f, 0xf8, 0x02, 0x4a, 0xd0, 0x04, 0x28,
311 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62, 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b,
312 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31, 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45,
313 0x38, 0x03, 0x34, 0x38, 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac,
314 0xcc, 0x8d, 0x6e, 0x94, 0x20, 0x0d, 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1,
315 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x50, 0x83, 0xa3, 0xc2,
316 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc, 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe,
317 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x46, 0x09, 0xd6, 0xe0, 0xa6,
318 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7, 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf,
319 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x51, 0x06, 0x36, 0x68, 0x03,
320 0x37, 0x38, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c,
321 0x6f, 0x94, 0x00, 0x0f, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00,
322 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70,
323 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82,
324 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6,
325 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60,
326 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20,
327 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87,
328 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07,
329 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d,
330 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc,
331 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2,
332 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8,
333 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80,
334 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00,
335 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03,
336 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00,
337 0x00, 0x61, 0x20, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41,
338 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0,
339 0x0c, 0x8a, 0x80, 0xdc, 0x08, 0xc0, 0x58, 0x44, 0x10, 0x04, 0xc1, 0x58,
340 0x84, 0x20, 0x08, 0xc2, 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x81, 0x31, 0x02,
341 0x10, 0x04, 0x41, 0xfc, 0xa3, 0x30, 0x03, 0x30, 0x03, 0x40, 0x62, 0x06,
342 0x80, 0xc6, 0x0c, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x2c, 0x00, 0x00,
343 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x08, 0x3d, 0x00, 0x00, 0x00,
344 0x00, 0xcf, 0x23, 0x06, 0x96, 0x05, 0x00, 0x00, 0x00, 0x6f, 0x6d, 0x6e,
345 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72,
346 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54,
347 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73,
348 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f,
349 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78,
350 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73,
351 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x61,
352 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f,
353 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x13, 0x04, 0x06,
354 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, 0x01, 0x14, 0xfa, 0x60,
355 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, 0x3d, 0xd8, 0x30, 0xe8,
356 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, 0xe1, 0x0f, 0x36, 0x04,
357 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x10, 0x8d,
358 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0x01, 0x51, 0x18, 0x45, 0x41, 0x28,
359 0x83, 0x0c, 0xc3, 0xd1, 0x98, 0x10, 0x88, 0xff, 0x2e, 0x04, 0x85, 0x71,
360 0x12, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0x0c, 0x64, 0x42, 0x20, 0xfe, 0x16,
361 0x14, 0xe0, 0xbf, 0x0b, 0x91, 0x75, 0x61, 0x50, 0x51, 0x10, 0xca, 0x20,
362 0x03, 0x13, 0x51, 0x26, 0x04, 0xe2, 0x6f, 0x45, 0x00, 0xfe, 0xbb, 0x10,
363 0x9e, 0x18, 0x98, 0xc1, 0x46, 0x41, 0x28, 0x83, 0x0c, 0x91, 0x85, 0x99,
364 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, 0x88, 0xc1, 0x19, 0xac,
365 0x41, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, 0x81, 0x81, 0x05, 0x95,
366 0xf8, 0x0f, 0x32, 0x0c, 0x5d, 0x18, 0x58, 0x30, 0x89, 0xbf, 0x0d, 0x01,
367 0xf8, 0x0f, 0x32, 0x18, 0x60, 0x30, 0x06, 0x16, 0x44, 0xe2, 0x6f, 0x43,
368 0x00, 0xfe, 0x83, 0x0c, 0xc9, 0x18, 0x94, 0x81, 0x05, 0x8f, 0xf8, 0xdb,
369 0x10, 0x80, 0xff, 0x2e, 0xc4, 0x1b, 0xd0, 0x01, 0x1e, 0xb4, 0x01, 0x05,
370 0xa1, 0x0c, 0x32, 0x04, 0x67, 0xd0, 0x06, 0x16, 0x88, 0x81, 0xf8, 0x0f,
371 0x32, 0x0c, 0x6a, 0xe0, 0x06, 0x16, 0x80, 0x81, 0xf8, 0x0f, 0x32, 0x14,
372 0x6c, 0xf0, 0x06, 0x16, 0x74, 0xe2, 0x3f, 0xc8, 0x70, 0xb8, 0x01, 0x1c,
373 0x58, 0xa0, 0x89, 0xff, 0x20, 0x03, 0x1f, 0xb4, 0x41, 0x1d, 0x58, 0x16,
374 0x88, 0xff, 0x20, 0x83, 0x1f, 0xbc, 0x81, 0x1d, 0x98, 0x13, 0x88, 0xbf,
375 0x25, 0x03, 0xf8, 0x5b, 0xc0, 0x80, 0xbf, 0x05, 0x09, 0xf8, 0x5b, 0x80,
376 0x80, 0xbf, 0x05, 0x05, 0xf8, 0xcf, 0x36, 0xdc, 0x41, 0x00, 0xcc, 0x36,
377 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x7c, 0x20, 0x64, 0x10, 0x10, 0x03,
378 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x20, 0x85, 0xa3, 0x14,
379 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, 0xa6, 0x80, 0x94, 0xc2,
380 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, 0x14, 0xb6, 0x1c, 0x4c,
381 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, 0x88, 0x02, 0x52, 0x38,
382 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, 0xc2, 0x51, 0x0a, 0x88,
383 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0x00,
384 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00,
385 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xd9, 0x05, 0x00, 0x00, 0x00,
386 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00,
387 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
388 0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00,
389 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
391 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00,
398 0x00, 0x12, 0x03, 0x94, 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c,
399 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65,
400 0x78, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69,
401 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f,
402 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75,
403 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
405 0x00, 0x14, 0x00, 0x00, 0x00, 0x90, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xff,
406 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00,
407 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00,
408 0x00, 0x21, 0x0c, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21,
409 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
410 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
411 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
412 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
413 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88,
414 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4,
415 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46,
416 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24,
417 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78,
418 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77,
419 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a,
420 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21,
421 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1,
422 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0,
423 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c,
424 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76,
425 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
426 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
427 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
428 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
429 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1,
430 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1,
431 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1,
432 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79,
433 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77,
434 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
435 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
436 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0,
437 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
438 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79,
439 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72,
440 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
441 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
442 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01,
443 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
444 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a,
445 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a,
446 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
447 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d,
448 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1,
449 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
450 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x78,
451 0x02, 0x01, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, 0x0c, 0xe1, 0x90, 0x0e,
452 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f,
453 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, 0x0e, 0xe9, 0x10, 0x0e,
454 0xf3, 0x00, 0x6c, 0xf0, 0x86, 0x02, 0x58, 0x80, 0x2a, 0x48, 0x03, 0x50,
455 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1,
456 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81,
457 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
458 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
459 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
460 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
461 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
462 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00,
463 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
464 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
465 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
466 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c,
467 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4,
468 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00,
469 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
470 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
471 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83,
472 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07,
473 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40,
474 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90,
475 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80,
476 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60,
477 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90,
478 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20,
479 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0,
480 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30,
481 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40,
482 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60,
483 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
484 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0,
485 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30,
486 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80,
487 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60,
488 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
489 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80,
490 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20,
491 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
492 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20,
493 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60,
494 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
495 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20,
496 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20,
497 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10,
498 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
499 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30,
500 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x0f, 0xdb, 0x95, 0x3f, 0xe7, 0x3c,
501 0xd8, 0x5f, 0x11, 0xd1, 0x44, 0x5c, 0x43, 0x22, 0xe0, 0x39, 0x00, 0x00,
502 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x62, 0x83, 0x40,
503 0x51, 0xb5, 0x01, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00,
504 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
505 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, 0x85, 0x30, 0x02, 0x50,
506 0x06, 0x05, 0x18, 0x50, 0x20, 0xc4, 0x46, 0x00, 0x68, 0x8d, 0x25, 0x48,
507 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
508 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
509 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
510 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
511 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
512 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
513 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
514 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
515 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
516 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
517 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
518 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
519 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
520 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
521 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
522 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
523 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
524 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
525 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
526 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
527 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
528 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
529 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
530 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
531 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
532 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
533 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
534 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
535 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
536 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
537 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
538 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
539 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
540 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
541 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
542 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
543 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
544 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
545 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
546 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
547 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
548 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
549 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
550 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
551 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
552 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
553 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
554 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
555 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
556 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
557 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
558 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
559 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
560 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
561 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
562 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
563 0x00, 0x79, 0x20, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08,
564 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4,
565 0x3a, 0x8c, 0x7d, 0x00, 0x00, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x01,
566 0x13, 0x19, 0x0c, 0x12, 0x59, 0x45, 0x66, 0x20, 0x90, 0xe4, 0x29, 0x0f,
567 0x12, 0x5d, 0x88, 0x92, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72,
568 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69,
569 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61,
570 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32,
571 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74,
572 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34,
573 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e,
574 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f,
575 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61,
576 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66,
577 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61,
578 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
579 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66,
580 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61,
581 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74,
582 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74,
583 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61,
584 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61,
585 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69,
586 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, 0x75, 0x74,
587 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
588 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66,
589 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
590 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72,
591 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74,
592 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72,
593 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x70, 0x75,
594 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
595 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, 0x6e, 0x65, 0x72,
596 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, 0x72, 0x5f, 0x70,
597 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x5f,
598 0x29, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61,
599 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69,
600 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69,
601 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73,
602 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74,
603 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69,
604 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72,
605 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e,
606 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x04, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00,
607 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08,
608 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82,
609 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5e,
610 0xf0, 0xcd, 0x30, 0x80, 0x81, 0x10, 0x06, 0x33, 0x04, 0xc3, 0x0c, 0x83,
611 0xe7, 0x89, 0xc1, 0x0c, 0x04, 0x01, 0x06, 0x60, 0x20, 0x06, 0x33, 0x04,
612 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, 0x50, 0x20, 0x89, 0xb2, 0x30,
613 0x33, 0x18, 0x8d, 0x93, 0x28, 0xcb, 0x33, 0x83, 0xd1, 0x40, 0x49, 0xb4,
614 0x48, 0x33, 0x0c, 0x6f, 0x00, 0x07, 0x71, 0x30, 0x83, 0x22, 0x06, 0x13,
615 0x25, 0x06, 0x60, 0x50, 0x25, 0xd1, 0xc2, 0xcc, 0xa0, 0x80, 0xc1, 0x44,
616 0x81, 0x01, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, 0x28, 0xde, 0x44, 0x79,
617 0x60, 0x50, 0x25, 0xd1, 0x22, 0xcd, 0x00, 0x91, 0x81, 0x75, 0x95, 0x01,
618 0xe5, 0x81, 0x01, 0x96, 0x95, 0x81, 0x66, 0x06, 0xc9, 0xb6, 0x70, 0x33,
619 0x40, 0x61, 0x60, 0x5d, 0x65, 0x40, 0x91, 0x01, 0x18, 0x60, 0x59, 0x19,
620 0x68, 0x66, 0x90, 0x6c, 0x4b, 0x37, 0x43, 0x31, 0x07, 0x74, 0x50, 0x07,
621 0x76, 0x70, 0x07, 0x33, 0x0c, 0x63, 0x20, 0x07, 0x78, 0x50, 0x1c, 0xc0,
622 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x89, 0x81, 0x1b, 0x58, 0x68, 0xa0,
623 0x07, 0x96, 0x65, 0xb9, 0x01, 0x1d, 0xd0, 0x01, 0x1d, 0xf8, 0x82, 0x2f,
624 0xc8, 0x82, 0x4b, 0xd0, 0x04, 0x2b, 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62,
625 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31,
626 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45, 0x30, 0x83, 0x33, 0x38, 0x85, 0x8d,
627 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, 0x00, 0x0d,
628 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73,
629 0x1b, 0x25, 0x48, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc,
630 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde,
631 0xdc, 0x46, 0x09, 0xd4, 0xe0, 0xa6, 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7,
632 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7,
633 0xb9, 0x51, 0x86, 0x35, 0x60, 0x83, 0x36, 0x38, 0x25, 0x2c, 0x4d, 0xce,
634 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, 0x00, 0x0f, 0x00, 0x00,
635 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72,
636 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8,
637 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1,
638 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21,
639 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f,
640 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e,
641 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76,
642 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c,
643 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b,
644 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61,
645 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1,
646 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f,
647 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00,
648 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c,
649 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c,
650 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
651 0x00, 0x8a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00,
652 0x00, 0x09, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc,
653 0x08, 0xc0, 0x58, 0x44, 0x10, 0x04, 0xc1, 0x58, 0x84, 0x20, 0x08, 0xc2,
654 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x85, 0x19, 0x80, 0x19, 0x00, 0x12, 0x33,
655 0x00, 0x34, 0x66, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x2c, 0x00, 0x00,
656 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, 0x3c, 0x00, 0x00, 0x00,
657 0x00, 0xcf, 0x13, 0x06, 0x96, 0x05, 0x00, 0x00, 0x00, 0x6f, 0x6d, 0x6e,
658 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72,
659 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54,
660 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73,
661 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f,
662 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x29,
663 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
664 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, 0x29, 0x61, 0x69,
665 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70,
666 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x13, 0x04, 0x06,
667 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, 0x01, 0x14, 0xfa, 0x60,
668 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, 0x3d, 0xd8, 0x30, 0xe8,
669 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, 0xe1, 0x0f, 0x36, 0x04,
670 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x10, 0x8c,
671 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0xf1, 0x50, 0x18, 0x45, 0x41, 0x28,
672 0x83, 0x0c, 0xc3, 0xc1, 0x98, 0x10, 0x88, 0xff, 0x2e, 0xc4, 0x84, 0x71,
673 0x11, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0xcc, 0x63, 0x42, 0x20, 0xfe, 0x16,
674 0x14, 0xe0, 0xbf, 0x0b, 0x81, 0x75, 0x61, 0x40, 0x51, 0x10, 0xca, 0x20,
675 0x03, 0x13, 0x4d, 0x26, 0x04, 0xe2, 0x6f, 0x45, 0x00, 0xfe, 0xbb, 0x10,
676 0x9d, 0x18, 0x98, 0x81, 0x46, 0x41, 0x28, 0x83, 0x0c, 0x91, 0x75, 0x99,
677 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, 0x84, 0xc1, 0x19, 0xac,
678 0x01, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, 0x7d, 0x16, 0x54, 0xe2,
679 0x3f, 0xc8, 0x30, 0x74, 0x60, 0x60, 0xc1, 0x24, 0xfe, 0x36, 0x04, 0xe0,
680 0x3f, 0xc8, 0x60, 0x80, 0x81, 0x18, 0x58, 0x10, 0x89, 0xbf, 0x0d, 0x01,
681 0xf8, 0x0f, 0x32, 0x24, 0x63, 0x40, 0x06, 0x16, 0x3c, 0xe2, 0x6f, 0x43,
682 0x00, 0xfe, 0xbb, 0x10, 0x6e, 0x40, 0x07, 0x78, 0xc0, 0x06, 0x14, 0x84,
683 0x32, 0xc8, 0x10, 0x9c, 0x01, 0x1b, 0x58, 0x20, 0x06, 0xe2, 0x3f, 0xc8,
684 0x30, 0xa8, 0x41, 0x1b, 0x58, 0x00, 0x06, 0xe2, 0x3f, 0xc8, 0x50, 0xb0,
685 0x81, 0x1b, 0x58, 0xd0, 0x89, 0xff, 0x20, 0xc3, 0xe1, 0x06, 0x6f, 0x60,
686 0x81, 0x26, 0xfe, 0x83, 0x0c, 0x7c, 0xe0, 0x06, 0x74, 0x60, 0x59, 0x20,
687 0xfe, 0x83, 0x0c, 0x7e, 0x00, 0x07, 0x75, 0x60, 0x4e, 0x20, 0xfe, 0x96,
688 0x0c, 0xe0, 0x6f, 0x01, 0x03, 0xfe, 0x16, 0x24, 0xe0, 0x6f, 0x01, 0x02,
689 0xfe, 0x16, 0x14, 0xe0, 0x3f, 0xdb, 0x60, 0x07, 0x01, 0x30, 0xdb, 0x10,
690 0x94, 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00,
691 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x20, 0x85, 0xa3, 0x14,
692 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, 0xa6, 0x80, 0x94, 0xc2,
693 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, 0x14, 0xb6, 0x1c, 0x4c,
694 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, 0x88, 0x02, 0x52, 0x38,
695 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, 0xc2, 0x51, 0x0a, 0x88,
696 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0x00,
697 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00,
698 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xde, 0x05, 0x00, 0x00, 0x00,
699 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00,
700 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
701 0x00, 0x0f, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00,
702 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
704 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00,
705 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00,
706 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
707 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
708 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
709 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00,
710 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00,
711 0x00, 0x12, 0x03, 0x94, 0x77, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c,
712 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78,
713 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72,
714 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f, 0x73,
715 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c,
716 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17,
718 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf4, 0x0d, 0x00,
719 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00,
720 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05,
721 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x40, 0x03, 0x00,
722 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
723 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
724 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
725 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32,
726 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14,
727 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e,
728 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
729 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x71, 0x00, 0x00,
730 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0x03,
731 0x40, 0x02, 0x28, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0,
732 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0,
733 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
734 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87,
735 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07,
736 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07,
737 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda,
738 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6,
739 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda,
740 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca,
741 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07,
742 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07,
743 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07,
744 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87,
745 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87,
746 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc,
747 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc,
748 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07,
749 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87,
750 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87,
751 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
752 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca,
753 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda,
754 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00,
755 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03,
756 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87,
757 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
758 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda,
759 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde,
760 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
761 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88,
762 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07,
763 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4,
764 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x03, 0xb0, 0x00, 0x55, 0x90,
765 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d,
766 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b,
767 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0x00, 0x49, 0x18, 0x00,
768 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00,
769 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85,
770 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90,
771 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33,
772 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44,
773 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0,
774 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10,
775 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47,
776 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04,
777 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0,
778 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68,
779 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70,
780 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08,
781 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0,
782 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76,
783 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78,
784 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d,
785 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71,
786 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72,
787 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a,
788 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73,
789 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
790 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76,
791 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76,
792 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a,
793 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73,
794 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
795 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76,
796 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
797 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a,
798 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d,
799 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78,
800 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79,
801 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75,
802 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72,
803 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6,
804 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a,
805 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72,
806 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71,
807 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71,
808 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x12, 0xdb,
809 0x95, 0x3f, 0xeb, 0x2c, 0xc8, 0xf0, 0x17, 0x11, 0x60, 0x30, 0x44, 0x33,
810 0x0d, 0x89, 0x00, 0xa9, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00,
811 0x00, 0x00, 0x00, 0x89, 0x0d, 0x02, 0x45, 0x85, 0x06, 0x00, 0x00, 0xb2,
812 0x40, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c,
813 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x22, 0x28, 0x81,
814 0x42, 0x18, 0x01, 0x28, 0xa0, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82,
815 0x29, 0x1c, 0xd2, 0x11, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42,
816 0x29, 0x98, 0xc2, 0xa1, 0x1c, 0x4b, 0x90, 0x04, 0x00, 0xb1, 0x18, 0x00,
817 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
818 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
819 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
820 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
821 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
822 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
823 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
824 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
825 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
826 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
827 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
828 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
829 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
830 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
831 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
832 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
833 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
834 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
835 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
836 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
837 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
838 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
839 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
840 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
841 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
842 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
843 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
844 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
845 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
846 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
847 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
848 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
849 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
850 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
851 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
852 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
853 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
854 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
855 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
856 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
857 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
858 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
859 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
860 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
861 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
862 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
863 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
864 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
865 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
866 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
867 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
868 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
869 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
870 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
871 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
872 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0xf6, 0x00, 0x00,
873 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8,
874 0x11, 0x32, 0x64, 0xd4, 0xca, 0x00, 0x0c, 0x66, 0x09, 0x8b, 0x12, 0x07,
875 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x52, 0xa6, 0x3c, 0x06, 0x83, 0x58,
876 0x85, 0xf2, 0x48, 0x08, 0x55, 0x30, 0x8c, 0xb2, 0x38, 0xcf, 0xf3, 0x44,
877 0xd7, 0x13, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72,
878 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69,
879 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61,
880 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32,
881 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74,
882 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34,
883 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e,
884 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f,
885 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61,
886 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66,
887 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61,
888 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
889 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66,
890 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61,
891 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65,
892 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e,
893 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
894 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x66,
895 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75,
896 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38,
897 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x76, 0x32, 0x5f,
898 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72,
899 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74,
900 0x69, 0x76, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x61, 0x69, 0x72,
901 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73,
902 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
903 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34,
904 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x69, 0x72, 0x2e,
905 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75,
906 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72,
907 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e,
908 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61,
909 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79,
910 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74,
911 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
912 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65,
913 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f,
914 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e,
915 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74,
916 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f,
917 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61,
918 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69,
919 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e,
920 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a,
921 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70,
922 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65,
923 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,
924 0x6e, 0x74, 0x73, 0x63, 0x00, 0x44, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00,
925 0x00, 0x30, 0x82, 0x80, 0x04, 0x23, 0x08, 0x09, 0x35, 0x82, 0x80, 0x08,
926 0x23, 0x08, 0xc8, 0x30, 0x82, 0x80, 0x10, 0x23, 0x08, 0x06, 0x30, 0x82,
927 0x80, 0x14, 0x23, 0x08, 0x88, 0x31, 0x82, 0x80, 0x1c, 0x23, 0x08, 0x08,
928 0x32, 0x82, 0x80, 0x24, 0x23, 0x08, 0x88, 0x32, 0x82, 0x80, 0x2c, 0x33,
929 0x0c, 0x66, 0x10, 0x9c, 0xc1, 0x0c, 0x03, 0x1a, 0x08, 0x69, 0x30, 0x43,
930 0x30, 0xcc, 0x30, 0x98, 0x81, 0x19, 0xa8, 0xc1, 0x0c, 0x04, 0x81, 0x06,
931 0x68, 0xa0, 0x06, 0x33, 0x04, 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc,
932 0x50, 0x20, 0x6a, 0xa0, 0x06, 0x89, 0x32, 0x43, 0xb0, 0x07, 0x33, 0x24,
933 0x6a, 0xb0, 0x30, 0x8d, 0x93, 0x3c, 0x50, 0x34, 0x43, 0x82, 0x06, 0x8b,
934 0xd4, 0x38, 0x89, 0x02, 0x4d, 0x33, 0xa0, 0x81, 0x1a, 0xa4, 0x81, 0x1a,
935 0x64, 0x5a, 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5b, 0x1b, 0xa4, 0x81, 0x1a,
936 0x64, 0x9c, 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0xdd, 0x1b, 0xa4, 0x81, 0x1a,
937 0x64, 0x1e, 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x5f, 0x1c, 0xa4, 0x81, 0x1a,
938 0x64, 0x60, 0x20, 0x07, 0x69, 0xa0, 0x06, 0x59, 0x18, 0xcc, 0x20, 0x99,
939 0x01, 0x55, 0xb1, 0x81, 0xa5, 0x06, 0x68, 0x70, 0x61, 0x7f, 0x20, 0x06,
940 0x6c, 0x30, 0x06, 0x69, 0x90, 0x90, 0x01, 0x54, 0x06, 0x33, 0x0c, 0x7d,
941 0xe0, 0x07, 0xa0, 0x30, 0xc3, 0xb0, 0x06, 0x7c, 0x10, 0x0a, 0xd5, 0x01,
942 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x9c, 0x1b, 0xb8,
943 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e, 0x70, 0xac, 0xc0, 0x0a,
944 0x62, 0xe3, 0x17, 0x74, 0x20, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd,
945 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d,
946 0xec, 0x6c, 0x6e, 0x14, 0x41, 0x0e, 0xe6, 0xe0, 0x14, 0x36, 0x36, 0xbb,
947 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x51, 0x02, 0x3a, 0xb8, 0x25,
948 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94,
949 0xa0, 0x0e, 0x8e, 0x0a, 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab,
950 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b,
951 0x25, 0xb0, 0x83, 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0,
952 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46,
953 0x19, 0xee, 0x00, 0x0f, 0xf2, 0xe0, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33,
954 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0x51, 0x82, 0x50, 0x00, 0x00,
955 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72,
956 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8,
957 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1,
958 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21,
959 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f,
960 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e,
961 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76,
962 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c,
963 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b,
964 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61,
965 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1,
966 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f,
967 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00,
968 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c,
969 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c,
970 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
971 0x00, 0x4e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00,
972 0x00, 0x06, 0x00, 0x00, 0x00, 0x84, 0x65, 0x30, 0x03, 0x40, 0x5a, 0x06,
973 0xd4, 0x73, 0x10, 0x04, 0x41, 0x64, 0x04, 0x63, 0x04, 0x20, 0x08, 0x82,
974 0xf8, 0x47, 0x3c, 0x03, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00,
975 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x48, 0x3d, 0x00, 0x00, 0x00,
976 0x00, 0xd5, 0xf3, 0x90, 0x81, 0x05, 0x00, 0x00, 0x00, 0x5f, 0x5a, 0x54,
977 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e,
978 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f,
979 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d,
980 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41,
981 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
982 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c,
983 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29,
984 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
985 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x00, 0x00,
986 0x00, 0x13, 0x04, 0x85, 0x99, 0x20, 0x28, 0xcd, 0x04, 0x41, 0x71, 0x26,
987 0x08, 0xca, 0x33, 0x41, 0x50, 0xa0, 0x09, 0x82, 0x12, 0x4d, 0x10, 0x14,
988 0x69, 0x82, 0xa0, 0x4c, 0x2b, 0x04, 0x58, 0x30, 0x85, 0x15, 0x43, 0x2c,
989 0xc0, 0xc2, 0x29, 0x6c, 0x08, 0x4a, 0x61, 0xc3, 0x40, 0x0a, 0xb2, 0x80,
990 0x0a, 0x1b, 0x86, 0x6c, 0x16, 0x50, 0x61, 0x43, 0x34, 0x0a, 0xb4, 0x80,
991 0x0a, 0xb4, 0x90, 0x0a, 0xb4, 0xa0, 0x0a, 0xb4, 0xb0, 0x0a, 0xb4, 0xc0,
992 0x0a, 0xb4, 0xd0, 0x0a, 0xb4, 0xe0, 0x0a, 0xb4, 0xf0, 0x0a, 0x1b, 0x86,
993 0x5a, 0xa0, 0x85, 0x55, 0xd8, 0x10, 0xc4, 0x02, 0x00, 0x7b, 0x86, 0x43,
994 0x32, 0x28, 0x80, 0x31, 0xc7, 0x30, 0x04, 0xd4, 0x20, 0x43, 0x40, 0x18,
995 0x73, 0x0c, 0x81, 0x81, 0x58, 0xd0, 0x88, 0x7f, 0x06, 0x01, 0x31, 0x00,
996 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20, 0xa8, 0x85, 0xc3, 0x16,
997 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00,
998 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xf2, 0x05, 0x00, 0x00, 0x00,
999 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00,
1000 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
1001 0x00, 0x12, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00,
1002 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1003 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00,
1005 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00,
1006 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00,
1010 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x12, 0x00, 0x00,
1011 0x00, 0x12, 0x03, 0x94, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c,
1012 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d,
1013 0x65, 0x6e, 0x74, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34,
1014 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d,
1015 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69,
1016 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17,
1018 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0x1f, 0x00,
1019 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00,
1020 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05,
1021 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x04, 0x07, 0x00,
1022 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
1023 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
1024 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
1025 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32,
1026 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14,
1027 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e,
1028 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
1029 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x64, 0x01, 0x00,
1030 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03,
1031 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0,
1032 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0,
1033 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
1034 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87,
1035 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07,
1036 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07,
1037 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda,
1038 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6,
1039 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda,
1040 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca,
1041 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07,
1042 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07,
1043 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07,
1044 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87,
1045 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87,
1046 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc,
1047 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc,
1048 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07,
1049 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87,
1050 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87,
1051 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
1052 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca,
1053 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda,
1054 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00,
1055 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03,
1056 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87,
1057 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
1058 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda,
1059 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde,
1060 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
1061 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88,
1062 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07,
1063 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4,
1064 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90,
1065 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d,
1066 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b,
1067 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x18, 0x0a,
1068 0x60, 0x01, 0xaa, 0x0d, 0x06, 0x61, 0x00, 0x0b, 0x50, 0x6d, 0x08, 0x93,
1069 0xe2, 0xff, 0xff, 0xff, 0xff, 0x07, 0x60, 0x0d, 0x00, 0x09, 0xa8, 0x88,
1070 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87,
1071 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87,
1072 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
1073 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2,
1074 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4,
1075 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03,
1076 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87,
1077 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87,
1078 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03,
1079 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83,
1080 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca,
1081 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda,
1082 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca,
1083 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc,
1084 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00,
1085 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83,
1086 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83,
1087 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca,
1088 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6,
1089 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0,
1090 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87,
1091 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03,
1092 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87,
1093 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
1094 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2,
1095 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2,
1096 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88,
1097 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87,
1098 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03,
1099 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87,
1100 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6,
1101 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda,
1102 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07,
1103 0x60, 0x43, 0x62, 0x08, 0xc0, 0x02, 0x54, 0x41, 0x1a, 0x80, 0xc1, 0x06,
1104 0xe3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f,
1105 0x20, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00,
1106 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0,
1107 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40,
1108 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b,
1109 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b,
1110 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b,
1111 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00,
1112 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40,
1113 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60,
1114 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90,
1115 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90,
1116 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b,
1117 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b,
1118 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b,
1119 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b,
1120 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50,
1121 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60,
1122 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40,
1123 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b,
1124 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39,
1125 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20,
1126 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90,
1127 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20,
1128 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10,
1129 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40,
1130 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c,
1131 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a,
1132 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10,
1133 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50,
1134 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60,
1135 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50,
1136 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39,
1137 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d,
1138 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x50, 0x92,
1139 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x36, 0x00, 0xd6, 0x00, 0x90, 0x80,
1140 0x6a, 0x83, 0xa1, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x45, 0x00, 0x16,
1141 0xa0, 0xda, 0xa0, 0x30, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00,
1142 0xac, 0x01, 0x20, 0x01, 0xd5, 0x86, 0xa9, 0xf9, 0xff, 0xff, 0xff, 0xff,
1143 0x01, 0x58, 0x03, 0x40, 0x19, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea,
1144 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0xd8, 0x50,
1145 0x38, 0x42, 0x90, 0x06, 0x60, 0xb0, 0xc1, 0x78, 0xfe, 0xff, 0xff, 0xff,
1146 0x7f, 0x00, 0x24, 0x80, 0xda, 0x10, 0x41, 0xff, 0xff, 0xff, 0xff, 0x3f,
1147 0x00, 0xca, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe9, 0xc0,
1148 0x0e, 0xf4, 0x90, 0x0e, 0xee, 0x30, 0x0f, 0x00, 0x00, 0x49, 0x18, 0x00,
1149 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x42,
1150 0x61, 0x4c, 0x08, 0x8e, 0x09, 0x01, 0x32, 0x61, 0x48, 0x94, 0x65, 0xc2,
1151 0xc0, 0x28, 0xcb, 0x04, 0xa1, 0x71, 0x26, 0x04, 0xcf, 0x84, 0x00, 0x02,
1152 0x00, 0x89, 0x20, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88,
1153 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23,
1154 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4,
1155 0x4c, 0x10, 0xb4, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08,
1156 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11,
1157 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00,
1158 0x00, 0x80, 0x41, 0x84, 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc,
1159 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00,
1160 0x18, 0x44, 0x28, 0x82, 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25,
1161 0x80, 0x79, 0x16, 0x22, 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10,
1162 0xca, 0x11, 0x04, 0x81, 0x40, 0x18, 0x08, 0x25, 0x65, 0x08, 0x02, 0x82,
1163 0x96, 0x61, 0x84, 0x01, 0x28, 0x44, 0xd3, 0x34, 0x0d, 0x39, 0x65, 0x00,
1164 0x00, 0x80, 0xa0, 0x22, 0x00, 0x00, 0x49, 0x73, 0x04, 0x41, 0x11, 0x28,
1165 0x80, 0xaa, 0x32, 0x00, 0x4d, 0x43, 0x57, 0x31, 0x9a, 0x06, 0x00, 0x00,
1166 0x80, 0xb2, 0x32, 0x34, 0x4d, 0x43, 0x5b, 0x11, 0x9a, 0x86, 0xba, 0x39,
1167 0x02, 0xc4, 0x08, 0xc1, 0x37, 0x47, 0x00, 0x06, 0xc3, 0x08, 0x42, 0x18,
1168 0x14, 0x05, 0x34, 0x10, 0x81, 0x12, 0x29, 0x00, 0x08, 0x69, 0x1c, 0x08,
1169 0x48, 0x81, 0x70, 0x04, 0x60, 0x8e, 0x00, 0x14, 0x06, 0x11, 0x00, 0x61,
1170 0x0a, 0x60, 0x18, 0x61, 0x08, 0x83, 0x61, 0x04, 0x22, 0x0c, 0x00, 0x00,
1171 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
1172 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
1173 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83,
1174 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07,
1175 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40,
1176 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90,
1177 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80,
1178 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60,
1179 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90,
1180 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20,
1181 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0,
1182 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30,
1183 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40,
1184 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60,
1185 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
1186 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0,
1187 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30,
1188 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80,
1189 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60,
1190 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1191 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80,
1192 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20,
1193 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
1194 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20,
1195 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60,
1196 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
1197 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20,
1198 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20,
1199 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10,
1200 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
1201 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30,
1202 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x11, 0xdb, 0x95, 0x3f, 0xe7, 0x3c,
1203 0xd8, 0x5f, 0x44, 0x80, 0xc1, 0x10, 0xcd, 0x34, 0x24, 0x02, 0xa2, 0x04,
1204 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44,
1205 0x11, 0x1e, 0x2c, 0x08, 0x30, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1206 0x00, 0x30, 0x24, 0x4a, 0x05, 0xca, 0x01, 0x02, 0x60, 0x00, 0x00, 0x00,
1207 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x51, 0x2f, 0x40, 0x10, 0x10, 0x00,
1208 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, 0xda, 0x21,
1209 0x92, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60,
1210 0x48, 0xe4, 0x0f, 0x56, 0x05, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x20, 0x00,
1211 0x00, 0x00, 0x00, 0x43, 0x22, 0x9a, 0x68, 0x2e, 0x20, 0x00, 0x06, 0x00,
1212 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0x85, 0x45, 0x96, 0x21,
1213 0xc0, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x48,
1214 0x2f, 0x22, 0x08, 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
1215 0x00, 0x86, 0x44, 0xab, 0x21, 0x6d, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00,
1216 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0xea, 0x8d, 0xa9, 0x03, 0x02, 0x60,
1217 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x11, 0x7c, 0x4c,
1218 0x1b, 0x10, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c,
1219 0x89, 0x46, 0x64, 0x1b, 0x03, 0x20, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01,
1220 0x00, 0x00, 0x00, 0x90, 0xd8, 0x20, 0x50, 0xb4, 0xe0, 0x00, 0x00, 0x20,
1221 0x0b, 0x04, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
1222 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
1223 0x0a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20,
1224 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x08, 0x1d, 0x01,
1225 0x28, 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x32,
1226 0xc7, 0x12, 0x24, 0x01, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
1227 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
1228 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
1229 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
1230 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
1231 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
1232 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
1233 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
1234 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
1235 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
1236 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
1237 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
1238 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
1239 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
1240 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
1241 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
1242 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
1243 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
1244 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
1245 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
1246 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
1247 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
1248 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
1249 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
1250 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
1251 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
1252 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
1253 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
1254 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
1255 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
1256 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
1257 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
1258 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
1259 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
1260 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
1261 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
1262 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
1263 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
1264 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
1265 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
1266 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
1267 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
1268 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
1269 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
1270 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
1271 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
1272 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
1273 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
1274 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
1275 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
1276 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
1277 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
1278 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
1279 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
1280 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
1281 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
1282 0x00, 0x79, 0x20, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08,
1283 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4,
1284 0xde, 0x00, 0x0d, 0x48, 0x0b, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41,
1285 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca,
1286 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f,
1287 0xb0, 0x28, 0xd8, 0xb0, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b,
1288 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61,
1289 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20,
1290 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
1291 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20,
1292 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30,
1293 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c,
1294 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e,
1295 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61,
1296 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
1297 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68,
1298 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63,
1299 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65,
1300 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68,
1301 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72,
1302 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
1303 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65,
1304 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61,
1305 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61,
1306 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72,
1307 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74,
1308 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e,
1309 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61,
1310 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
1311 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
1312 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34,
1313 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70,
1314 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67,
1315 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65,
1316 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29,
1317 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f,
1318 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
1319 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73,
1320 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74,
1321 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72,
1322 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72,
1323 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66,
1324 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f,
1325 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72,
1326 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f,
1327 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63,
1328 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d,
1329 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70,
1330 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65,
1331 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73,
1332 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69,
1333 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79,
1334 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61,
1335 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67,
1336 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72,
1337 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x61, 0x69,
1338 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72,
1339 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75,
1340 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20,
1341 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x61, 0x69,
1342 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d,
1343 0x70, 0x6c, 0x65, 0x72, 0x73, 0x24, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00,
1344 0x00, 0x30, 0x82, 0x10, 0x06, 0xcd, 0x08, 0x82, 0x19, 0x88, 0xc1, 0x08,
1345 0x42, 0x18, 0x38, 0x23, 0x08, 0x61, 0xf0, 0x8c, 0x20, 0x84, 0x01, 0x34,
1346 0x82, 0xa0, 0x00, 0x23, 0x08, 0x61, 0x10, 0x8d, 0x20, 0x84, 0x81, 0x34,
1347 0x82, 0x10, 0x06, 0xd3, 0x08, 0x42, 0x18, 0x50, 0x23, 0x08, 0x61, 0x50,
1348 0x8d, 0x20, 0x84, 0x81, 0x35, 0x82, 0x10, 0x06, 0xd7, 0x08, 0x42, 0x18,
1349 0x60, 0x23, 0x08, 0x61, 0x90, 0xcd, 0x30, 0xc0, 0x41, 0x10, 0x07, 0x33,
1350 0x0c, 0x72, 0x20, 0xcc, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0x00, 0x07, 0x70,
1351 0x40, 0x07, 0x33, 0x10, 0x84, 0x1c, 0xc8, 0x01, 0x1d, 0xcc, 0x10, 0x14,
1352 0x33, 0x04, 0xc6, 0x0c, 0xc1, 0x31, 0x43, 0x81, 0xd0, 0x01, 0x1d, 0x24,
1353 0xca, 0x0c, 0xc1, 0x29, 0xcc, 0x80, 0xd0, 0xc1, 0xc2, 0x34, 0x89, 0xe2,
1354 0x3c, 0x33, 0x24, 0x72, 0x00, 0x45, 0x8c, 0x94, 0x28, 0xce, 0x34, 0x43,
1355 0x02, 0x07, 0x10, 0xc5, 0x48, 0x49, 0xe5, 0x58, 0x33, 0xa0, 0x01, 0x1d,
1356 0xcc, 0x01, 0x1d, 0x70, 0xdd, 0x1c, 0xcc, 0x01, 0x1d, 0x70, 0x1e, 0x1e,
1357 0xcc, 0x01, 0x1d, 0x70, 0x5f, 0x1e, 0xcc, 0x01, 0x1d, 0x70, 0x60, 0xa0,
1358 0x07, 0x73, 0x40, 0x07, 0x5c, 0x18, 0xec, 0xc1, 0x1c, 0xd0, 0x01, 0x27,
1359 0x06, 0x7c, 0x30, 0x07, 0x74, 0xc0, 0x8d, 0x41, 0x1f, 0xcc, 0x01, 0x1d,
1360 0x70, 0x64, 0x30, 0x83, 0x64, 0x07, 0x17, 0x76, 0x07, 0x19, 0x1d, 0xc8,
1361 0x81, 0xb6, 0xb1, 0x42, 0x19, 0xdc, 0x81, 0x19, 0xcc, 0x41, 0x72, 0x06,
1362 0x0e, 0x1a, 0xcc, 0xa0, 0xcc, 0x41, 0x1a, 0x64, 0x74, 0x20, 0x07, 0x6a,
1363 0x90, 0xac, 0x81, 0xc3, 0x06, 0x33, 0x24, 0x7e, 0xd0, 0x06, 0x19, 0x1d,
1364 0xc8, 0x41, 0xe2, 0x06, 0xce, 0x1b, 0xcc, 0x60, 0xa4, 0x82, 0x2a, 0xac,
1365 0x42, 0x2b, 0xb8, 0xc2, 0x2b, 0xcc, 0x30, 0xd4, 0x01, 0x2a, 0xc0, 0x42,
1366 0x89, 0x01, 0x20, 0x06, 0x68, 0x20, 0x06, 0x62, 0x20, 0x06, 0x9c, 0x18,
1367 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18,
1368 0xb8, 0x81, 0x1b, 0x58, 0x74, 0xa0, 0x07, 0x96, 0x65, 0xe9, 0x01, 0x67,
1369 0x0a, 0xac, 0xc0, 0x0a, 0x74, 0xe3, 0x17, 0xf6, 0xa0, 0x0e, 0xb8, 0x20,
1370 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d,
1371 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0xc1,
1372 0x0f, 0xfe, 0xe0, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32,
1373 0x37, 0xba, 0x51, 0x02, 0x50, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae,
1374 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0x20, 0x14, 0x8e, 0x0a, 0x4b,
1375 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2,
1376 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x10, 0x85, 0x9b, 0xc2,
1377 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde,
1378 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x46, 0x81, 0x14, 0x4a,
1379 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32,
1380 0x37, 0xba, 0x51, 0x02, 0x58, 0x00, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00,
1381 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80,
1382 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43,
1383 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e,
1384 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
1385 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4,
1386 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81,
1387 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08,
1388 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01,
1389 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c,
1390 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c,
1391 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c,
1392 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1,
1393 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00,
1394 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c,
1395 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90,
1396 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x3e, 0x00, 0x00,
1397 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
1398 0x00, 0x44, 0xd5, 0xc0, 0x08, 0x00, 0x89, 0x23, 0x00, 0x04, 0x8c, 0x00,
1399 0x00, 0xf1, 0x30, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8,
1400 0x90, 0x51, 0x12, 0x44, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x63, 0x80, 0x61,
1401 0x16, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73,
1402 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f,
1403 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29,
1404 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
1405 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73,
1406 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
1407 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73,
1408 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
1409 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x00,
1410 0x00, 0x2b, 0x04, 0x5b, 0x90, 0x85, 0x15, 0xc3, 0x2d, 0xd8, 0xc2, 0x2c,
1411 0xac, 0x18, 0x70, 0xc1, 0x16, 0x68, 0x61, 0xc5, 0x90, 0x0b, 0xb6, 0x50,
1412 0x0b, 0x1b, 0x04, 0x5c, 0xb8, 0x85, 0x0d, 0x41, 0x2e, 0x00, 0x00, 0x00,
1413 0x00, 0x23, 0x06, 0x8d, 0x11, 0x82, 0x60, 0x30, 0x06, 0x61, 0x60, 0x14,
1414 0x08, 0x21, 0x0c, 0x41, 0xd0, 0x8d, 0x26, 0x04, 0xc0, 0x88, 0xc1, 0x71,
1415 0xc4, 0x20, 0x58, 0xf8, 0xc7, 0xe2, 0x06, 0x41, 0x62, 0x01, 0x23, 0xfe,
1416 0x19, 0x04, 0xc4, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0,
1417 0xc8, 0x05, 0x44, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1418 0x00, 0xe3, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00,
1419 0x00, 0x4f, 0x00, 0x00, 0x00, 0x14, 0x96, 0xc3, 0x0c, 0x40, 0x31, 0x10,
1420 0x5a, 0x02, 0x45, 0x40, 0xeb, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0xc4,
1421 0xce, 0x41, 0x40, 0x4e, 0x63, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, 0x04,
1422 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba, 0x3d,
1423 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0, 0xc7,
1424 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11,
1425 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d,
1426 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed,
1427 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, 0x73,
1428 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c,
1429 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x03, 0x40, 0xc1, 0x0c, 0xc0,
1430 0x0c, 0xc0, 0x1c, 0xc4, 0x1c, 0xe4, 0xc1, 0x1c, 0xf0, 0x01, 0x35, 0x33,
1431 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8, 0x07,
1432 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0, 0xb6,
1433 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a,
1434 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf,
1435 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b, 0x0e,
1436 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x30,
1437 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06,
1438 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3, 0x60,
1439 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0x63,
1440 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x00,
1441 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81,
1442 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3,
1443 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71,
1444 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b,
1445 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0xf1, 0x30, 0x00,
1446 0x00, 0x32, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x0e, 0xc4,
1447 0x1d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x00, 0x00, 0x5f, 0x5a, 0x54,
1448 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e,
1449 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f,
1450 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d,
1451 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41,
1452 0x00, 0x13, 0x04, 0x34, 0xd0, 0x26, 0x08, 0x68, 0xb0, 0x4d, 0x10, 0xd0,
1453 0x80, 0x9b, 0x20, 0xa0, 0x41, 0x37, 0x41, 0x40, 0x03, 0x6f, 0x82, 0x80,
1454 0x06, 0xdf, 0x04, 0x01, 0x0d, 0xc0, 0x60, 0x82, 0x80, 0x06, 0x61, 0xb0,
1455 0x21, 0xa0, 0x85, 0x0d, 0xc3, 0x2c, 0xf4, 0x42, 0x2d, 0x6c, 0x18, 0x38,
1456 0x5f, 0xa8, 0x85, 0x0d, 0x91, 0x2c, 0xfc, 0x42, 0x2d, 0xfc, 0x82, 0x2d,
1457 0xfc, 0xc2, 0x2d, 0xfc, 0x02, 0x2e, 0xfc, 0x42, 0x2e, 0xfc, 0x82, 0x2e,
1458 0xfc, 0xc2, 0x2e, 0xfc, 0x02, 0x2f, 0x6c, 0x18, 0xc0, 0xe1, 0x17, 0x6e,
1459 0x61, 0xc3, 0x00, 0x0e, 0xbf, 0xc0, 0x0b, 0x1b, 0x06, 0x70, 0xf8, 0x85,
1460 0x5c, 0xd8, 0x30, 0x80, 0xc3, 0x2f, 0xe8, 0xc2, 0x86, 0x01, 0x1c, 0x7e,
1461 0x61, 0x17, 0x36, 0x0c, 0xe0, 0xf0, 0x0b, 0xb6, 0xb0, 0x61, 0x00, 0x87,
1462 0x5f, 0xc0, 0x85, 0x0d, 0x03, 0x38, 0xfc, 0x42, 0x2d, 0x00, 0x00, 0x00,
1463 0x00, 0x7b, 0x18, 0xd2, 0x60, 0x0e, 0x40, 0x81, 0x02, 0x60, 0x0c, 0x47,
1464 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xb4, 0xc1,
1465 0x64, 0x06, 0x7b, 0x18, 0xda, 0xe0, 0x0e, 0xd8, 0x80, 0x02, 0x60, 0x8c,
1466 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xa9, 0x30, 0x8c, 0x18,
1467 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xab, 0x10, 0x40, 0x16, 0x40,
1468 0xe0, 0x3f, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xad, 0x42,
1469 0x50, 0xd9, 0x10, 0x89, 0xbf, 0x45, 0x41, 0xf8, 0xdb, 0x10, 0x90, 0xff,
1470 0x88, 0x81, 0x81, 0x84, 0x20, 0x58, 0xf8, 0x47, 0x07, 0x0b, 0xc1, 0x88,
1471 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0x26, 0x0b, 0xc1, 0x64, 0xc1,
1472 0x24, 0xfe, 0x73, 0x0c, 0xdd, 0x32, 0x0a, 0x83, 0x0c, 0x81, 0x37, 0x07,
1473 0x36, 0x04, 0xe4, 0x3f, 0xc8, 0x10, 0x80, 0x01, 0x1d, 0x0c, 0x32, 0x04,
1474 0x7e, 0x40, 0x07, 0xb3, 0x04, 0xc2, 0x40, 0x45, 0x20, 0x04, 0xfe, 0x00,
1475 0xec, 0x61, 0xf8, 0x83, 0x54, 0xa0, 0x05, 0x0a, 0x80, 0x31, 0x1c, 0x11,
1476 0xb0, 0x81, 0xe3, 0x1f, 0xb3, 0x0c, 0x03, 0x11, 0x0c, 0x32, 0x10, 0x69,
1477 0xc0, 0x07, 0x7b, 0x18, 0x46, 0xa1, 0x15, 0x5c, 0x81, 0x02, 0x60, 0xec,
1478 0x61, 0x28, 0x85, 0x57, 0x10, 0x05, 0x0a, 0x80, 0x31, 0x62, 0xa0, 0x24,
1479 0x31, 0x08, 0x16, 0xfe, 0x91, 0x91, 0x43, 0xd1, 0x1d, 0x43, 0x30, 0xc8,
1480 0x10, 0xb0, 0x01, 0x28, 0x0c, 0x32, 0x04, 0x0b, 0x28, 0xcc, 0x12, 0x10,
1481 0x03, 0x15, 0x81, 0x30, 0x60, 0xc2, 0x70, 0x44, 0x18, 0xf0, 0x41, 0xe0,
1482 0x1f, 0xb3, 0x0c, 0xc5, 0x14, 0xec, 0x61, 0x60, 0x05, 0x5b, 0x10, 0x07,
1483 0x0a, 0x80, 0x31, 0x1c, 0x11, 0xfc, 0x41, 0xe0, 0x1f, 0xb3, 0x0c, 0xc6,
1484 0x11, 0x0c, 0x32, 0x14, 0x76, 0x90, 0x0a, 0x7b, 0x18, 0x60, 0x41, 0x17,
1485 0xc6, 0x81, 0x02, 0x60, 0xcc, 0x31, 0xd8, 0x41, 0xc0, 0x0b, 0x83, 0x0c,
1486 0xc1, 0x1d, 0xb0, 0x82, 0x05, 0x85, 0xf8, 0x0f, 0x32, 0x04, 0x79, 0xd0,
1487 0x0a, 0xb3, 0x04, 0x6d, 0xb0, 0x87, 0xc1, 0x16, 0xc0, 0x41, 0x1d, 0x28,
1488 0x00, 0xc6, 0x1e, 0x06, 0x5c, 0x10, 0x87, 0x75, 0xa0, 0x00, 0x18, 0x83,
1489 0x0c, 0x50, 0x28, 0xc8, 0xc2, 0x88, 0x41, 0x81, 0x84, 0x20, 0x18, 0x54,
1490 0xfa, 0x40, 0xcc, 0x32, 0x20, 0x52, 0x30, 0x86, 0x20, 0x99, 0xc3, 0x70,
1491 0x44, 0xd0, 0x0a, 0x8a, 0x7f, 0xcc, 0x32, 0x28, 0x49, 0x60, 0x42, 0x2b,
1492 0x88, 0xff, 0x2c, 0xc1, 0x62, 0x43, 0x2b, 0x80, 0xff, 0x88, 0x81, 0x81,
1493 0x84, 0x20, 0x58, 0xf8, 0x87, 0x04, 0x12, 0x81, 0x05, 0xae, 0x20, 0xfe,
1494 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x48, 0x04, 0xae,
1495 0x30, 0x4b, 0xb0, 0x0c, 0x54, 0x00, 0x4a, 0x22, 0x28, 0x73, 0x0c, 0xaa,
1496 0x10, 0xb8, 0xc3, 0x18, 0xc2, 0x16, 0x0e, 0xc3, 0x11, 0x81, 0x2d, 0x28,
1497 0xfe, 0x31, 0xcb, 0xd0, 0x30, 0x81, 0x09, 0xb6, 0x20, 0xfe, 0xb3, 0x04,
1498 0x8e, 0x0d, 0xb6, 0x00, 0xfe, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1,
1499 0x1f, 0x52, 0x4a, 0x04, 0x16, 0xdc, 0x82, 0xf8, 0x8f, 0x18, 0x1c, 0x48,
1500 0x08, 0x82, 0x85, 0x7f, 0x40, 0x2c, 0x11, 0xdc, 0xc2, 0x2c, 0x81, 0x33,
1501 0x50, 0x01, 0x28, 0x8c, 0xd0, 0xcc, 0x31, 0x24, 0x41, 0x3a, 0x8c, 0x21,
1502 0x90, 0x41, 0x3a, 0x0c, 0x47, 0x04, 0xbf, 0xa0, 0xf8, 0xc7, 0x2c, 0x03,
1503 0xf4, 0x04, 0x26, 0xfc, 0x82, 0xf8, 0xcf, 0x12, 0x44, 0x36, 0xfc, 0x02,
1504 0xf8, 0x8f, 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x48, 0x32, 0x11,
1505 0x58, 0x00, 0x0e, 0xe2, 0x3f, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe,
1506 0x01, 0xd5, 0x44, 0x00, 0x0e, 0xb3, 0x04, 0xd1, 0x40, 0x05, 0xa0, 0x3c,
1507 0x02, 0x34, 0xc7, 0x90, 0x04, 0xf1, 0x30, 0x4b, 0x20, 0x0d, 0x54, 0x04,
1508 0x42, 0xa4, 0x07, 0xc7, 0x20, 0x43, 0xf0, 0x0b, 0xf2, 0x30, 0xc7, 0xd0,
1509 0x0b, 0x60, 0x30, 0x12, 0x83, 0x0c, 0x81, 0x2f, 0xcc, 0x83, 0x0d, 0x81,
1510 0xf8, 0x0f, 0x32, 0x04, 0xe0, 0x40, 0x0f, 0xb3, 0x04, 0x6d, 0x30, 0x1c,
1511 0x31, 0x0b, 0xe6, 0x10, 0xf8, 0xc7, 0x2c, 0x03, 0x05, 0x06, 0xc1, 0x20,
1512 0x03, 0x1d, 0x94, 0x03, 0x3e, 0xec, 0x61, 0xf8, 0x87, 0x94, 0x98, 0x09,
1513 0x0a, 0x80, 0xb1, 0x87, 0x21, 0x24, 0x56, 0x82, 0x26, 0x28, 0x00, 0xc6,
1514 0x1c, 0xc3, 0x39, 0x04, 0x2d, 0x31, 0xc8, 0x10, 0xa0, 0x43, 0x3f, 0x58,
1515 0x70, 0x88, 0xff, 0x20, 0x43, 0xa0, 0x0e, 0xfe, 0x30, 0x62, 0x50, 0x20,
1516 0x21, 0x08, 0x06, 0x95, 0x59, 0x1c, 0xb3, 0x0c, 0x5f, 0x15, 0x8c, 0x21,
1517 0x0c, 0x32, 0x31, 0x1c, 0x11, 0xfc, 0x83, 0xe2, 0x1f, 0xb3, 0x0c, 0x97,
1518 0x15, 0x98, 0xf0, 0x0f, 0xe2, 0x3f, 0x4b, 0x80, 0x8d, 0x18, 0x18, 0x48,
1519 0x08, 0x82, 0x85, 0x7f, 0x48, 0x6b, 0x31, 0x8c, 0x18, 0x1c, 0x48, 0x08,
1520 0x82, 0x85, 0x7f, 0x40, 0x6d, 0x11, 0x80, 0x84, 0x05, 0x20, 0x21, 0xfe,
1521 0x16, 0x80, 0x04, 0xf8, 0xcf, 0x12, 0x60, 0x03, 0x15, 0x80, 0x62, 0x09,
1522 0xd7, 0x1c, 0x83, 0x3c, 0x04, 0x3a, 0x31, 0x86, 0xc0, 0xb4, 0xc4, 0x70,
1523 0x44, 0x80, 0x12, 0x8a, 0x7f, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x02, 0x4a,
1524 0x88, 0xff, 0x2c, 0xc1, 0x36, 0x62, 0x60, 0x20, 0x21, 0x08, 0x16, 0xfe,
1525 0x21, 0xd1, 0xc5, 0x30, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x01,
1526 0xd9, 0x45, 0x90, 0x12, 0x16, 0xa4, 0x84, 0xf8, 0x5b, 0x90, 0x12, 0xe0,
1527 0x3f, 0x4b, 0xb0, 0x0d, 0x54, 0x00, 0x4a, 0x26, 0x68, 0x73, 0x0c, 0x49,
1528 0x50, 0x13, 0x63, 0x08, 0x55, 0x4d, 0x0c, 0x47, 0x04, 0x31, 0xa1, 0xf8,
1529 0xc7, 0x2c, 0x43, 0xc7, 0x05, 0x26, 0xc4, 0x84, 0xf8, 0xcf, 0x12, 0x78,
1530 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x52, 0x5f, 0x0c, 0x23,
1531 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x5f, 0x04, 0x32, 0x61,
1532 0x81, 0x4c, 0x88, 0xbf, 0x05, 0x32, 0x01, 0xfe, 0xb3, 0x04, 0xde, 0x40,
1533 0x05, 0xa0, 0x70, 0x42, 0x37, 0xc7, 0x90, 0x04, 0x3d, 0x31, 0x62, 0x80,
1534 0x20, 0x21, 0x08, 0x16, 0xfe, 0xe1, 0x94, 0x46, 0x60, 0x12, 0x24, 0x31,
1535 0xc8, 0x10, 0xa0, 0x04, 0x4f, 0xcc, 0x12, 0x7c, 0x03, 0x15, 0x81, 0x1f,
1536 0x50, 0x82, 0x37, 0xc8, 0x10, 0xb4, 0x84, 0x4f, 0xcc, 0x12, 0xb4, 0xc1,
1537 0x2c, 0x43, 0x18, 0xb4, 0x01, 0x3f, 0x0c, 0x32, 0xf4, 0x82, 0x4b, 0x84,
1538 0xc5, 0x88, 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0x65, 0x1a, 0x81,
1539 0x48, 0xcc, 0x31, 0xac, 0x44, 0x30, 0x17, 0x23, 0x06, 0x07, 0x12, 0x82,
1540 0x60, 0xe1, 0x1f, 0x17, 0x6a, 0x0c, 0x23, 0x31, 0xc7, 0x20, 0x04, 0x67,
1541 0x31, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x71, 0xa9, 0x46, 0x41,
1542 0x12, 0x73, 0x0c, 0x42, 0x80, 0x16, 0x83, 0x0c, 0x81, 0x4c, 0x98, 0xc5,
1543 0x20, 0x43, 0x50, 0x0e, 0x66, 0xb1, 0x87, 0x01, 0x2e, 0xf4, 0x82, 0x34,
1544 0x28, 0x00, 0xc6, 0x1e, 0x06, 0xb9, 0xe0, 0x8b, 0xd2, 0xa0, 0x00, 0x18,
1545 0x73, 0x0c, 0x38, 0x11, 0xf8, 0xc5, 0x20, 0x43, 0x90, 0x13, 0x6e, 0x61,
1546 0x41, 0x22, 0xfe, 0x83, 0x0c, 0xc1, 0x4e, 0xbc, 0xc5, 0x88, 0x41, 0x81,
1547 0x84, 0x20, 0x18, 0x54, 0xb7, 0x71, 0xcc, 0x32, 0xb0, 0x81, 0x18, 0x04,
1548 0x63, 0x08, 0xc3, 0x68, 0x0c, 0x47, 0x04, 0x70, 0xa1, 0xf8, 0xc7, 0x2c,
1549 0x03, 0x19, 0x8c, 0x41, 0x60, 0x02, 0x5c, 0x88, 0xff, 0x2c, 0x41, 0x19,
1550 0x8c, 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xbc, 0x31, 0x8c,
1551 0x18, 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x40, 0xbe, 0x11, 0xc4, 0x85,
1552 0x05, 0x71, 0x21, 0xfe, 0x16, 0xc4, 0x05, 0xf8, 0xcf, 0x12, 0x94, 0xc1,
1553 0x40, 0x05, 0xa0, 0x8c, 0x81, 0x40, 0x06, 0x73, 0x0c, 0x63, 0x11, 0xac,
1554 0xc6, 0x18, 0x02, 0xe3, 0x17, 0xc3, 0x11, 0x41, 0x5e, 0x28, 0xfe, 0x31,
1555 0xcb, 0x70, 0x06, 0x66, 0x10, 0x98, 0x90, 0x17, 0xe2, 0x3f, 0x4b, 0x80,
1556 0x06, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x52, 0x79, 0x0c,
1557 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x79, 0x04, 0x7a,
1558 0x61, 0x81, 0x5e, 0x88, 0xbf, 0x05, 0x7a, 0x01, 0xfe, 0xb3, 0x04, 0x68,
1559 0x30, 0x50, 0x01, 0x28, 0x66, 0x20, 0x9c, 0xc1, 0x1c, 0x43, 0x12, 0x98,
1560 0xc6, 0x18, 0x42, 0x65, 0x1a, 0xc3, 0x11, 0x81, 0x68, 0x28, 0xfe, 0x31,
1561 0xcb, 0xa0, 0x06, 0x69, 0x10, 0x98, 0x20, 0x1a, 0xe2, 0x3f, 0x4b, 0xb0,
1562 0x06, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x92, 0x7b, 0x0c,
1563 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x10, 0x7c, 0x04, 0xa3,
1564 0x61, 0xc1, 0x68, 0x88, 0xbf, 0x05, 0xa3, 0x01, 0xfe, 0xb3, 0x04, 0x6b,
1565 0x30, 0x50, 0x01, 0x28, 0x69, 0x20, 0xa8, 0xc1, 0x1c, 0x43, 0x12, 0xb8,
1566 0xc6, 0x88, 0x01, 0x82, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x63, 0x1f, 0xc1,
1567 0x5d, 0xd4, 0xc5, 0x20, 0x43, 0x90, 0x17, 0xad, 0x31, 0x4b, 0xc0, 0x06,
1568 0x03, 0x15, 0x81, 0x1f, 0x84, 0x81, 0xb0, 0x06, 0x83, 0x0c, 0x81, 0x5f,
1569 0xbc, 0xc6, 0x2c, 0x41, 0x1b, 0x0c, 0xb4, 0x04, 0x3c, 0x62, 0xf0, 0x88,
1570 0xc4, 0x23, 0x9f, 0x2c, 0xb0, 0x01, 0x8f, 0x80, 0xc1, 0x40, 0x4b, 0x80,
1571 0x22, 0x86, 0x5e, 0x48, 0xe6, 0xf0, 0x11, 0x6c, 0xc0, 0x2f, 0x60, 0x30,
1572 0xc8, 0x10, 0x08, 0xb1, 0x91, 0x41, 0x40, 0x0c, 0x00, 0x12, 0x00, 0x00,
1573 0x00, 0x5b, 0x86, 0x20, 0x00, 0x87, 0x2d, 0x83, 0x11, 0x84, 0xc3, 0x96,
1574 0x21, 0x0b, 0xc4, 0x61, 0xcb, 0xe0, 0x05, 0xe3, 0xb0, 0x65, 0x00, 0x83,
1575 0x80, 0x1c, 0xb6, 0x0c, 0x69, 0x10, 0x94, 0xc3, 0x96, 0xc1, 0x0d, 0x02,
1576 0x73, 0xd8, 0x32, 0xd4, 0x41, 0x70, 0x0e, 0x5b, 0x86, 0x3b, 0x08, 0xcc,
1577 0x61, 0xcb, 0xb0, 0x0e, 0xc1, 0x39, 0x6c, 0x19, 0xda, 0x21, 0x30, 0x87,
1578 0x2d, 0x43, 0x5a, 0x04, 0xe7, 0xb0, 0x65, 0x58, 0x8b, 0xc0, 0x1c, 0x00,
1579 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x73, 0x00, 0x00,
1580 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00,
1581 0x00, 0x14, 0xce, 0x00, 0x10, 0x5a, 0x02, 0x45, 0x40, 0xeb, 0x58, 0x03,
1582 0x10, 0x08, 0x23, 0x00, 0xc4, 0xce, 0x41, 0x40, 0x4e, 0x83, 0x06, 0x04,
1583 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20,
1584 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x50, 0x33, 0x03,
1585 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8, 0x5f, 0xc6, 0xea, 0x97,
1586 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d, 0xee, 0xb8, 0xa7, 0xe2,
1587 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37, 0xd6, 0xb0, 0xce, 0x31,
1588 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7, 0xb1, 0x6a, 0x7f, 0x63,
1589 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98,
1590 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0,
1591 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73,
1592 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac,
1593 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7, 0xd1, 0x0c, 0x47, 0x58,
1594 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc, 0x31, 0x24, 0x96, 0x18,
1595 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe, 0x83, 0x0c, 0x01, 0x23,
1596 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8, 0xc7, 0x2c, 0xc3, 0x90,
1597 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c, 0x03, 0x51, 0x04, 0x23,
1598 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x17, 0x1f, 0x7c, 0xce, 0x1c,
1599 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7,
1600 0xe5, 0x07, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01, 0x37, 0x62, 0x70, 0x20,
1601 0x21, 0x08, 0x16, 0xfe, 0x71, 0x81, 0xc2, 0x18, 0x40, 0x73, 0x0c, 0x42,
1602 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40, 0x70, 0xc3, 0x18, 0x42,
1603 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21, 0x0c, 0x61, 0x30, 0x62,
1604 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x01, 0x91, 0x82, 0x10, 0x8c, 0x18,
1605 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x40, 0xa5, 0x40, 0x04, 0xc3, 0x11,
1606 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x87, 0x47,
1607 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06, 0xe0, 0x6f, 0xc5, 0x1a,
1608 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04, 0xe4, 0x3f, 0xc7, 0x20,
1609 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0, 0x06, 0x16, 0x20, 0xe2,
1610 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12, 0x1c, 0x03, 0x15, 0x81,
1611 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9, 0x20, 0x43, 0x90, 0x06,
1612 0x6f, 0x30, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x71, 0xd5, 0x42,
1613 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2, 0x88, 0xc1, 0x81, 0x84,
1614 0x20, 0x58, 0xf8, 0xc7, 0x75, 0x0b, 0x43, 0x19, 0xcc, 0x31, 0x08, 0x41,
1615 0x1d, 0x8c, 0x18, 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x5c, 0xb9, 0x50,
1616 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c, 0x41, 0x32, 0x50, 0x12,
1617 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7, 0x20, 0x43, 0x10, 0x07,
1618 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00,
1619 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xeb, 0x08, 0x18, 0xb0, 0x9a,
1620 0x80, 0x07, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00,
1621 0x00, 0x67, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x30, 0x03, 0x00, 0x00,
1622 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00,
1623 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
1624 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
1625 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x01, 0x00,
1626 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
1627 0x00, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00,
1628 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
1629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
1630 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1631 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
1632 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1633 0xff, 0x00, 0x30, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
1634 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1635 0xff, 0x08, 0x24, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
1636 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1637 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
1638 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1639 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
1640 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1641 0xff, 0x08, 0x24, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
1642 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1643 0xff, 0x08, 0x24, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00,
1644 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1645 0xff, 0x00, 0x30, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
1646 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1647 0xff, 0x08, 0x24, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
1648 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1649 0xff, 0x08, 0x24, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
1650 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1651 0xff, 0x08, 0x24, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
1652 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1653 0xff, 0x08, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00,
1654 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1655 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00,
1656 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xa6, 0x02, 0x00, 0x00,
1657 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72,
1658 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a, 0x31, 0x34, 0x47, 0x65,
1659 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
1660 0x44, 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c,
1661 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x4b, 0x31, 0x35, 0x53,
1662 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e,
1663 0x74, 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63,
1664 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69,
1665 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66,
1666 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66,
1667 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63,
1668 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e,
1669 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74,
1670 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, 0x31, 0x32, 0x41, 0x70,
1671 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x44, 0x76,
1672 0x33, 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, 0x69, 0x72, 0x2e, 0x66,
1673 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32,
1674 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77,
1675 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61,
1676 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33,
1677 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d,
1678 0x61, 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e,
1679 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75,
1680 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x33,
1681 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, 0x36,
1682 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x69, 0x6f, 0x73, 0x31,
1683 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61,
1684 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17,
1686 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf8, 0x21, 0x00,
1687 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00,
1688 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05,
1689 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0xa8, 0x07, 0x00,
1690 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
1691 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
1692 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
1693 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32,
1694 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14,
1695 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e,
1696 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
1697 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x6e, 0x01, 0x00,
1698 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03,
1699 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0,
1700 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0,
1701 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
1702 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87,
1703 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07,
1704 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07,
1705 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda,
1706 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6,
1707 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda,
1708 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca,
1709 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07,
1710 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07,
1711 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07,
1712 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87,
1713 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87,
1714 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc,
1715 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc,
1716 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07,
1717 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87,
1718 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87,
1719 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
1720 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca,
1721 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda,
1722 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00,
1723 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03,
1724 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87,
1725 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
1726 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda,
1727 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde,
1728 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
1729 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88,
1730 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07,
1731 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4,
1732 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90,
1733 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d,
1734 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b,
1735 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x1b, 0x0a,
1736 0x60, 0x01, 0xaa, 0x20, 0x0d, 0x40, 0x61, 0x08, 0x87, 0x74, 0x90, 0x87,
1737 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x03,
1738 0x77, 0x78, 0x87, 0x36, 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07,
1739 0x60, 0x83, 0x41, 0x18, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x02, 0x01, 0x16,
1740 0xa0, 0xda, 0x10, 0x26, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xc0, 0x1a,
1741 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80,
1742 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00,
1743 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c,
1744 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b,
1745 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38,
1746 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d,
1747 0xa0, 0x03, 0x10, 0x07, 0x72, 0x80, 0x07, 0xc0, 0xe0, 0x0e, 0xef, 0xd0,
1748 0x06, 0xe2, 0x50, 0x0f, 0xe9, 0xc0, 0x0e, 0xf4, 0x90, 0x0e, 0xee, 0x30,
1749 0x0f, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0xd0,
1750 0x0e, 0xe5, 0xd0, 0x06, 0xf0, 0xf0, 0x0e, 0xe9, 0xe0, 0x0e, 0xf4, 0x50,
1751 0x0e, 0xf2, 0xd0, 0x06, 0xe5, 0xc0, 0x0e, 0xe9, 0xd0, 0x0e, 0x00, 0x3d,
1752 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x39,
1753 0xc8, 0x43, 0x38, 0xb4, 0x43, 0x39, 0xb4, 0x01, 0x3c, 0xbc, 0x43, 0x3a,
1754 0xb8, 0x03, 0x3d, 0x94, 0x83, 0x3c, 0xb4, 0x41, 0x39, 0xb0, 0x43, 0x3a,
1755 0xb4, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb8, 0x43, 0x1b, 0xb0, 0x43, 0x39,
1756 0x84, 0x83, 0x39, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1,
1757 0x0e, 0xef, 0xd0, 0x06, 0xe9, 0xe0, 0x0e, 0xe6, 0x30, 0x0f, 0x6d, 0x60,
1758 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d,
1759 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x3b,
1760 0x84, 0x83, 0x3b, 0xcc, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b,
1761 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00,
1762 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x30, 0x0f, 0xe9, 0x70, 0x0e, 0xee, 0x50,
1763 0x0e, 0xe4, 0xd0, 0x06, 0xfa, 0x50, 0x0e, 0xf2, 0xf0, 0x0e, 0xf3, 0xd0,
1764 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00,
1765 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b,
1766 0xd0, 0x83, 0x3c, 0x84, 0x03, 0x3c, 0xc0, 0x43, 0x3a, 0xb8, 0xc3, 0x39,
1767 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50,
1768 0x0f, 0xe5, 0x00, 0x10, 0xf3, 0x40, 0x0f, 0xe1, 0x30, 0x0e, 0xeb, 0xd0,
1769 0x06, 0xf0, 0x20, 0x0f, 0xef, 0x40, 0x0f, 0xe5, 0x30, 0x0e, 0xf4, 0xf0,
1770 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20,
1771 0x0f, 0x6d, 0x30, 0x0f, 0xe9, 0xa0, 0x0f, 0xe5, 0x00, 0xe0, 0x01, 0x40,
1772 0xd4, 0x83, 0x3b, 0xcc, 0x43, 0x38, 0x98, 0x43, 0x39, 0xb4, 0x81, 0x39,
1773 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20,
1774 0x0f, 0xf5, 0x50, 0x0e, 0xc0, 0x86, 0xe4, 0x10, 0x80, 0x05, 0xa8, 0x82,
1775 0x34, 0x00, 0x83, 0x0d, 0x06, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20,
1776 0x01, 0xd4, 0x06, 0x1f, 0x49, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24,
1777 0xa0, 0x22, 0xc2, 0x01, 0x1e, 0xe0, 0x41, 0x1e, 0xde, 0x01, 0x1f, 0xda,
1778 0xc0, 0x1c, 0xea, 0xc1, 0x1d, 0xc6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda,
1779 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87,
1780 0x72, 0x00, 0x88, 0x76, 0x48, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87,
1781 0x73, 0x08, 0x07, 0x76, 0x68, 0x03, 0x7b, 0x28, 0x87, 0x71, 0xa0, 0x87,
1782 0x77, 0x90, 0x87, 0x36, 0xb8, 0x87, 0x74, 0x20, 0x07, 0x7a, 0x40, 0x07,
1783 0x20, 0x0f, 0xec, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea,
1784 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc,
1785 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda,
1786 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda,
1787 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87,
1788 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87,
1789 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87,
1790 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03,
1791 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07,
1792 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda,
1793 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda,
1794 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87,
1795 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87,
1796 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07,
1797 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde,
1798 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda,
1799 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0,
1800 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
1801 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87,
1802 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87,
1803 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
1804 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4,
1805 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda,
1806 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6,
1807 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87,
1808 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83,
1809 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca,
1810 0x01, 0xd8, 0xa0, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00,
1811 0xac, 0x01, 0x20, 0x01, 0xd5, 0x06, 0x63, 0x09, 0x80, 0x05, 0xa8, 0x36,
1812 0x18, 0x8c, 0x00, 0x2c, 0x40, 0xb5, 0x41, 0x69, 0xfe, 0xff, 0xff, 0xff,
1813 0x7f, 0x00, 0xda, 0x00, 0x58, 0x03, 0x40, 0x02, 0xaa, 0x0d, 0x86, 0xf3,
1814 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x01, 0xd4, 0x86, 0xe9, 0xf9, 0xff,
1815 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x19, 0xdc, 0xe1, 0x1d, 0xda,
1816 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6,
1817 0x01, 0xd8, 0x50, 0x40, 0x42, 0x90, 0x06, 0x60, 0xb0, 0x21, 0x8a, 0xfe,
1818 0xff, 0xff, 0xff, 0x7f, 0x00, 0x94, 0xc1, 0x1d, 0xde, 0xa1, 0x0d, 0xc4,
1819 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21, 0x1d, 0xdc, 0x61, 0x1e, 0x00,
1820 0x00, 0x49, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40,
1821 0x18, 0x88, 0x62, 0x82, 0x60, 0x1c, 0x13, 0x02, 0x64, 0x42, 0x90, 0x4c,
1822 0x18, 0x94, 0x85, 0x99, 0x30, 0x34, 0x0b, 0x33, 0x21, 0x70, 0x26, 0x08,
1823 0x0f, 0x34, 0x21, 0x88, 0x00, 0x89, 0x20, 0x00, 0x00, 0x51, 0x00, 0x00,
1824 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4,
1825 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c,
1826 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xe0, 0xc1, 0x0c, 0xc0, 0x30, 0x02,
1827 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3,
1828 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10,
1829 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18,
1830 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6,
1831 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4,
1832 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50,
1833 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21,
1834 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29,
1835 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1,
1836 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a,
1837 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20,
1838 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48,
1839 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f,
1840 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44,
1841 0xb2, 0x34, 0x0f, 0x41, 0x65, 0x08, 0x02, 0x82, 0xa4, 0x42, 0x14, 0x45,
1842 0x51, 0x10, 0x55, 0x06, 0x00, 0x00, 0xc8, 0x2a, 0x02, 0x00, 0x10, 0x36,
1843 0x47, 0x10, 0x14, 0x41, 0x03, 0x68, 0x2b, 0x03, 0x50, 0x14, 0xd4, 0x15,
1844 0xa3, 0x28, 0x00, 0x00, 0x00, 0xe8, 0x2b, 0x43, 0x51, 0x14, 0x14, 0x16,
1845 0xa1, 0x28, 0x68, 0x9c, 0x23, 0x40, 0x8c, 0x10, 0x94, 0x73, 0x04, 0x60,
1846 0x30, 0x8c, 0x20, 0x9c, 0x41, 0x59, 0xcc, 0xe6, 0x11, 0x4e, 0x0d, 0xd5,
1847 0x00, 0xe0, 0xa4, 0xb4, 0x28, 0xe6, 0xf2, 0x08, 0x1a, 0xaa, 0x01, 0xc0,
1848 0x49, 0xeb, 0x40, 0x40, 0x0a, 0x9c, 0x73, 0x04, 0xa0, 0x30, 0x8c, 0x30,
1849 0x9c, 0xc1, 0x20, 0x42, 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21,
1850 0x8c, 0x00, 0x0c, 0x22, 0x00, 0xc2, 0x14, 0xc0, 0x30, 0x02, 0x71, 0x06,
1851 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
1852 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
1853 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70, 0x03, 0x38, 0x68, 0x83,
1854 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08, 0x07, 0x7a, 0x78, 0x07,
1855 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40,
1856 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90,
1857 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80,
1858 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60,
1859 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90,
1860 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20,
1861 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0,
1862 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30,
1863 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40,
1864 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60,
1865 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
1866 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0,
1867 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30,
1868 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80,
1869 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60,
1870 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1871 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80,
1872 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20,
1873 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
1874 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20,
1875 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60,
1876 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
1877 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20,
1878 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20,
1879 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10,
1880 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
1881 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30,
1882 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe,
1883 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0xd3, 0x90, 0x08, 0x80, 0x20, 0x00,
1884 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0x41,
1885 0x78, 0x20, 0x21, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
1886 0xc0, 0x90, 0x08, 0x15, 0x28, 0x0a, 0x08, 0x80, 0x01, 0x00, 0x00, 0x40,
1887 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xbc, 0x00, 0x59, 0x40, 0x00, 0x0c,
1888 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0x62, 0x87, 0x08,
1889 0x03, 0x02, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21,
1890 0x51, 0x3f, 0x58, 0x1b, 0x10, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00,
1891 0x00, 0x00, 0x0c, 0x89, 0x66, 0xa2, 0xe9, 0x80, 0x00, 0x18, 0x00, 0x00,
1892 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0x04, 0x16, 0xd9, 0x87, 0x00,
1893 0x03, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x43, 0xa2, 0xbc,
1894 0x88, 0x2c, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1895 0x18, 0x12, 0xa9, 0x86, 0x14, 0x06, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00,
1896 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0xe2, 0x8d, 0x69, 0x0c, 0x80, 0x00,
1897 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0xf4, 0x1e,
1898 0x53, 0x18, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
1899 0xc0, 0x90, 0x48, 0x44, 0xc2, 0x20, 0x0d, 0x80, 0x00, 0x28, 0x00, 0x00,
1900 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0x34, 0x26, 0xdb, 0x1a, 0x00,
1901 0x01, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0xc4, 0x06,
1902 0x81, 0xa2, 0xa9, 0x07, 0x00, 0x00, 0x59, 0x20, 0x00, 0x10, 0x00, 0x00,
1903 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
1904 0x47, 0xc6, 0x04, 0x43, 0x3a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0,
1905 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7,
1906 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0xe8, 0x1d, 0x01, 0x28,
1907 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x72, 0xc7,
1908 0x12, 0x24, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
1909 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
1910 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
1911 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
1912 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
1913 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
1914 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
1915 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
1916 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
1917 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
1918 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
1919 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
1920 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
1921 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
1922 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
1923 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
1924 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
1925 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
1926 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
1927 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
1928 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
1929 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
1930 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
1931 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
1932 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
1933 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
1934 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
1935 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
1936 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
1937 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
1938 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
1939 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
1940 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
1941 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
1942 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
1943 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
1944 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
1945 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
1946 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
1947 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
1948 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
1949 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
1950 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
1951 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
1952 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
1953 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
1954 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
1955 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
1956 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
1957 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
1958 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
1959 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
1960 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
1961 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
1962 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
1963 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
1964 0x00, 0x79, 0x20, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08,
1965 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4,
1966 0xee, 0x80, 0x0d, 0x6a, 0x0c, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41,
1967 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca,
1968 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f,
1969 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, 0x5e, 0xb1, 0x1c, 0x01,
1970 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
1971 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70,
1972 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65,
1973 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e,
1974 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65,
1975 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d,
1976 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70,
1977 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f,
1978 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63,
1979 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f,
1980 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61,
1981 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66,
1982 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66,
1983 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61,
1984 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61,
1985 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f,
1986 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f,
1987 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74,
1988 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65,
1989 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73,
1990 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61,
1991 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
1992 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d,
1993 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e,
1994 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f,
1995 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70,
1996 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f,
1997 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
1998 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76,
1999 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65,
2000 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75,
2001 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66,
2002 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c,
2003 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65,
2004 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72,
2005 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65,
2006 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63,
2007 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65,
2008 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e,
2009 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f,
2010 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d,
2011 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e,
2012 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31,
2013 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74,
2014 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65,
2015 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72,
2016 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61,
2017 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f,
2018 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68,
2019 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74,
2020 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x6f, 0x66, 0x66, 0x73,
2021 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x78, 0x33, 0x6d, 0x61,
2022 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44, 0x65, 0x63, 0x6f, 0x64,
2023 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x74,
2024 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61,
2025 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32,
2026 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d,
2027 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59, 0x74, 0x65, 0x78, 0x74,
2028 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3c,
2029 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c,
2030 0x65, 0x3e, 0x74, 0x65, 0x78, 0x55, 0x56, 0x61, 0x69, 0x72, 0x2e, 0x73,
2031 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65,
2032 0x72, 0x73, 0x00, 0x00, 0x00, 0xe4, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00,
2033 0x00, 0x30, 0x82, 0x70, 0x06, 0xce, 0x08, 0x82, 0x1b, 0x9c, 0xc1, 0x08,
2034 0xc2, 0x19, 0x3c, 0x23, 0x08, 0x67, 0x00, 0x8d, 0x20, 0x9c, 0x41, 0x34,
2035 0x82, 0x10, 0x01, 0x23, 0x08, 0x67, 0x20, 0x8d, 0x20, 0x9c, 0xc1, 0x34,
2036 0x82, 0x70, 0x06, 0xd4, 0x08, 0xc2, 0x19, 0x54, 0x23, 0x08, 0x67, 0x60,
2037 0x8d, 0x20, 0x9c, 0xc1, 0x35, 0x82, 0x70, 0x06, 0xd8, 0x08, 0xc2, 0x19,
2038 0x64, 0x23, 0x08, 0x67, 0xa0, 0x8d, 0x20, 0x9c, 0xc1, 0x36, 0x82, 0x70,
2039 0x06, 0xdc, 0x08, 0xc2, 0x19, 0x74, 0x23, 0x08, 0x67, 0xe0, 0xcd, 0x30,
2040 0xe0, 0x41, 0x90, 0x07, 0x33, 0x0c, 0x7a, 0x20, 0xec, 0xc1, 0x0c, 0xc1,
2041 0x30, 0xc3, 0x80, 0x07, 0x78, 0xc0, 0x07, 0x33, 0x10, 0x84, 0x1e, 0xe8,
2042 0x01, 0x1f, 0xcc, 0x10, 0x14, 0x33, 0x04, 0xc6, 0x0c, 0xc1, 0x31, 0x43,
2043 0x81, 0xf0, 0x01, 0x1f, 0x24, 0xca, 0x0c, 0xc1, 0x2c, 0xcc, 0x80, 0xf0,
2044 0xc1, 0xc2, 0x34, 0x89, 0xe2, 0x3c, 0x33, 0x24, 0x7a, 0x00, 0x45, 0x8c,
2045 0x94, 0x28, 0xce, 0x34, 0x43, 0x82, 0x07, 0x10, 0xc5, 0x48, 0x49, 0xe5,
2046 0x58, 0x33, 0xa0, 0x01, 0x1f, 0xec, 0x01, 0x1f, 0x70, 0xdd, 0x1e, 0xec,
2047 0x01, 0x1f, 0x70, 0x1e, 0x28, 0xec, 0x01, 0x1f, 0x70, 0x5f, 0x28, 0xec,
2048 0x01, 0x1f, 0x70, 0x60, 0x20, 0x0a, 0x7b, 0xc0, 0x07, 0x5c, 0x18, 0x8c,
2049 0xc2, 0x1e, 0xf0, 0x01, 0x27, 0x06, 0xa4, 0xb0, 0x07, 0x7c, 0xc0, 0x8d,
2050 0x41, 0x29, 0xec, 0x01, 0x1f, 0x70, 0x64, 0x30, 0x83, 0xe4, 0x07, 0x17,
2051 0xf6, 0x07, 0x19, 0x1f, 0xe8, 0x81, 0xb6, 0xe1, 0x42, 0x19, 0xfc, 0x81,
2052 0x19, 0xec, 0x41, 0x72, 0x06, 0x0e, 0x1a, 0xcc, 0xa0, 0xf0, 0x81, 0x28,
2053 0xf0, 0x41, 0x1a, 0xa8, 0x81, 0x28, 0x9c, 0x02, 0x1f, 0xac, 0x01, 0x1b,
2054 0xcc, 0x20, 0xed, 0xc1, 0x85, 0x99, 0x42, 0xa6, 0x07, 0x7a, 0xa0, 0x6d,
2055 0xba, 0x50, 0x06, 0xa6, 0x60, 0x06, 0xa2, 0x90, 0xb4, 0x81, 0xe3, 0x06,
2056 0x33, 0x28, 0xa8, 0xf0, 0x06, 0x19, 0x1f, 0xe8, 0x01, 0x1c, 0x24, 0x71,
2057 0xe0, 0xc8, 0xc1, 0x0c, 0x4a, 0x2a, 0xbc, 0x41, 0xa6, 0x07, 0x7a, 0x00,
2058 0x07, 0xc9, 0x1c, 0x38, 0x74, 0x30, 0x43, 0xa2, 0x0a, 0x75, 0x90, 0xf1,
2059 0x81, 0x1e, 0x24, 0x76, 0xe0, 0xdc, 0xc1, 0x0c, 0x48, 0x2d, 0xd8, 0xc2,
2060 0x2d, 0xe4, 0xc2, 0x2e, 0xf0, 0x42, 0x2f, 0xf8, 0xc2, 0x0c, 0x43, 0x1f,
2061 0xd0, 0xc2, 0x2f, 0x54, 0x1a, 0x00, 0x62, 0x80, 0x06, 0x62, 0x20, 0x06,
2062 0x62, 0xc0, 0x89, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88,
2063 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x1b, 0xb8,
2064 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e, 0x70, 0xa6, 0xc0, 0x0a,
2065 0xac, 0x40, 0x37, 0x7e, 0x81, 0x12, 0x7e, 0x61, 0x0f, 0xf6, 0xa0, 0x0e,
2066 0xf0, 0x20, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5,
2067 0xed, 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e,
2068 0x14, 0x41, 0x15, 0x56, 0xe1, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34,
2069 0xb2, 0x32, 0x37, 0xba, 0x51, 0x02, 0x56, 0xb8, 0x25, 0x2c, 0x4d, 0xce,
2070 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0xa0, 0x15, 0x8e,
2071 0x0a, 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b,
2072 0xfb, 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x70, 0x85,
2073 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca,
2074 0xbe, 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x5e, 0x01,
2075 0x16, 0x62, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3,
2076 0xb6, 0x32, 0x37, 0xba, 0x51, 0x82, 0x5f, 0x00, 0x00, 0xa9, 0x18, 0x00,
2077 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80,
2078 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43,
2079 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e,
2080 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
2081 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4,
2082 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81,
2083 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08,
2084 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01,
2085 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c,
2086 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c,
2087 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c,
2088 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1,
2089 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00,
2090 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c,
2091 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90,
2092 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x8c, 0x00, 0x00,
2093 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
2094 0x00, 0xa4, 0xd5, 0xc0, 0x08, 0x00, 0x9d, 0x33, 0x00, 0x84, 0x8e, 0x00,
2095 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03, 0x10, 0x08, 0x73, 0x0c,
2096 0x91, 0x1c, 0xc8, 0x01, 0x01, 0x23, 0x00, 0x33, 0x00, 0x63, 0x04, 0x20,
2097 0x08, 0x82, 0xf8, 0x47, 0xc1, 0x0c, 0xc0, 0x0c, 0xc0, 0x1c, 0x44, 0x1e,
2098 0xe4, 0x41, 0x1e, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00,
2099 0x00, 0x32, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x88,
2100 0x49, 0x00, 0x00, 0x00, 0x00, 0x62, 0x80, 0x61, 0x96, 0x05, 0x00, 0x00,
2101 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73,
2102 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55,
2103 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61,
2104 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f,
2105 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61,
2106 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f,
2107 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61,
2108 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f,
2109 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, 0x29, 0x61, 0x69, 0x72,
2110 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65,
2111 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x00, 0x2b, 0x04, 0x73,
2112 0x08, 0x87, 0x15, 0xc3, 0x39, 0x98, 0x83, 0x38, 0xac, 0x18, 0xd0, 0xc1,
2113 0x1c, 0xc6, 0x61, 0xc5, 0x90, 0x0e, 0xe6, 0x40, 0x0e, 0x2b, 0x06, 0x75,
2114 0x30, 0x87, 0x72, 0xd8, 0x20, 0xa0, 0xc3, 0x39, 0x6c, 0x10, 0xd4, 0x21,
2115 0x1d, 0x36, 0x04, 0xe9, 0xb0, 0x61, 0x50, 0x07, 0x74, 0x38, 0x07, 0x00,
2116 0x00, 0x23, 0x06, 0x8d, 0x11, 0x82, 0x60, 0xb0, 0x06, 0x71, 0x10, 0x3d,
2117 0x94, 0xb3, 0x34, 0x86, 0xd1, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x62, 0xe0,
2118 0x18, 0x21, 0x08, 0x06, 0x69, 0x40, 0x07, 0x52, 0x64, 0xbd, 0x01, 0xd4,
2119 0x3c, 0x08, 0xf2, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x86, 0x10, 0x8c, 0xc1,
2120 0x20, 0x03, 0x71, 0x30, 0x73, 0x0c, 0x81, 0x00, 0x8d, 0x18, 0x38, 0x46,
2121 0x08, 0x82, 0x41, 0x1a, 0xe4, 0xc1, 0x65, 0x6d, 0x76, 0x50, 0x49, 0x54,
2122 0xd3, 0xd0, 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x21, 0x04, 0x68, 0x30, 0xc7,
2123 0x40, 0x04, 0xd3, 0x75, 0xf1, 0x52, 0x10, 0x94, 0x41, 0x86, 0x00, 0xaa,
2124 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0x43, 0x18, 0xb8, 0x81, 0x1f, 0x5c, 0x10,
2125 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x6d, 0xc4, 0xe0, 0x38, 0x42,
2126 0x10, 0x2c, 0xfc, 0xa3, 0x5b, 0x85, 0x22, 0xd8, 0x48, 0x61, 0x06, 0x73,
2127 0x30, 0x0a, 0xa1, 0xe0, 0x5d, 0x10, 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08,
2128 0xb4, 0x6f, 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, 0xfc, 0xa3, 0x83, 0x05,
2129 0x25, 0xd8, 0x48, 0xb1, 0x06, 0x78, 0x80, 0x0a, 0xa6, 0x20, 0x06, 0x17,
2130 0xc4, 0x4b, 0x41, 0x50, 0x06, 0x19, 0x82, 0x8f, 0x0c, 0x46, 0x0c, 0x8e,
2131 0x23, 0x04, 0xc1, 0xc2, 0x3f, 0xba, 0x5a, 0x78, 0x82, 0x39, 0x86, 0x6f,
2132 0xe9, 0x83, 0x39, 0x86, 0xe0, 0x48, 0x83, 0x39, 0x86, 0x60, 0x48, 0x83,
2133 0x11, 0x83, 0x03, 0x89, 0x41, 0xb0, 0xf0, 0x0f, 0xc9, 0x17, 0x02, 0x3a,
2134 0xb0, 0xe0, 0x0e, 0xc4, 0x3f, 0x83, 0x80, 0x18, 0x00, 0x0d, 0x00, 0x00,
2135 0x00, 0x5b, 0x0a, 0xe0, 0x50, 0x07, 0x64, 0x1d, 0xb6, 0x14, 0xc2, 0xa1,
2136 0x0e, 0xc8, 0x3a, 0x6c, 0x29, 0x8e, 0x43, 0x1d, 0x90, 0x75, 0xd8, 0x52,
2137 0x30, 0x07, 0x3b, 0x20, 0xed, 0xb0, 0xa5, 0x88, 0x0e, 0x76, 0x40, 0xda,
2138 0x61, 0x4b, 0x61, 0x1d, 0xec, 0x80, 0xb4, 0xc3, 0x96, 0x62, 0x3b, 0xd8,
2139 0x01, 0x69, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
2140 0x00, 0xe5, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00,
2141 0x00, 0x4f, 0x00, 0x00, 0x00, 0x74, 0xce, 0x00, 0xd0, 0x5b, 0x02, 0x45,
2142 0x40, 0xf0, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0x74, 0xcf, 0x41, 0x44,
2143 0x8f, 0xa3, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, 0x04, 0x8c, 0x11, 0xf0,
2144 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba, 0x3d, 0x0d, 0x06, 0x63,
2145 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0, 0xc7, 0xa2, 0x8b, 0x7f,
2146 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08,
2147 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4, 0x3c,
2148 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xbc,
2149 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, 0x73, 0x08, 0x06, 0x23,
2150 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80, 0x20,
2151 0x08, 0x82, 0x60, 0x30, 0x03, 0x40, 0xc1, 0x0c, 0xc0, 0x0c, 0xc0, 0x1c,
2152 0x84, 0x1d, 0xf0, 0x81, 0x1d, 0xfc, 0x01, 0x15, 0x33, 0x00, 0x23, 0x00,
2153 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88,
2154 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0, 0xb6, 0xf3, 0x4f, 0x7a,
2155 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x63, 0x0d, 0x20,
2156 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x00, 0x82, 0x20,
2157 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08,
2158 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x30, 0xd6, 0x00, 0x82,
2159 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x20, 0x48, 0xb7,
2160 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78,
2161 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0x63, 0x0d, 0x20, 0x08,
2162 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x00, 0x82, 0x30, 0x1e,
2163 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6,
2164 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe,
2165 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2,
2166 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f,
2167 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00,
2168 0x00, 0x33, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x0e, 0xc4,
2169 0x1d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x00, 0x00, 0x5f, 0x5a, 0x54,
2170 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e,
2171 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f,
2172 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d,
2173 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41,
2174 0x00, 0x13, 0x84, 0x37, 0xf8, 0x26, 0x08, 0x6f, 0x00, 0x06, 0x13, 0x84,
2175 0x37, 0x08, 0x83, 0x09, 0xc2, 0x1b, 0x88, 0xc1, 0x04, 0xe1, 0x0d, 0xc6,
2176 0x60, 0x82, 0xf0, 0x06, 0x64, 0x30, 0x41, 0x78, 0x83, 0x32, 0x98, 0x20,
2177 0xbc, 0x81, 0x19, 0x6c, 0x08, 0xc6, 0x61, 0xc3, 0x20, 0x0e, 0xec, 0x40,
2178 0x0e, 0x1b, 0x06, 0xae, 0x1d, 0xc8, 0x61, 0x43, 0x14, 0x0e, 0xee, 0x40,
2179 0x0e, 0xee, 0x50, 0x0e, 0xee, 0x60, 0x0e, 0xee, 0x70, 0x0e, 0xee, 0x80,
2180 0x0e, 0xee, 0x90, 0x0e, 0xee, 0xa0, 0x0e, 0xee, 0xb0, 0x0e, 0x1b, 0x86,
2181 0x77, 0x70, 0x07, 0x73, 0xd8, 0x30, 0xbc, 0x83, 0x3b, 0xac, 0xc3, 0x86,
2182 0xe1, 0x1d, 0xdc, 0x01, 0x1d, 0x36, 0x0c, 0xef, 0xe0, 0x0e, 0xe9, 0xb0,
2183 0x61, 0x78, 0x07, 0x77, 0x50, 0x87, 0x0d, 0xc3, 0x3b, 0xb8, 0x43, 0x39,
2184 0x6c, 0x18, 0xde, 0xc1, 0x1d, 0xce, 0x61, 0xc3, 0xf0, 0x0e, 0xee, 0x40,
2185 0x0e, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x18, 0xce, 0x20, 0x0e, 0x44, 0x81,
2186 0x02, 0x60, 0x0c, 0x47, 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10,
2187 0x0c, 0x32, 0xac, 0xc1, 0x64, 0x06, 0x7b, 0x18, 0xd6, 0xa0, 0x0e, 0xec,
2188 0x80, 0x02, 0x60, 0x8c, 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x8c,
2189 0x01, 0x2b, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x61,
2190 0xe0, 0x0a, 0x01, 0x64, 0x01, 0x04, 0xfe, 0x23, 0x06, 0xc7, 0x11, 0x82,
2191 0x60, 0xe1, 0x1f, 0x61, 0xe0, 0x0a, 0x41, 0x65, 0x43, 0x24, 0xfe, 0x16,
2192 0x05, 0xe1, 0x6f, 0x43, 0x40, 0xfe, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60,
2193 0xe1, 0x1f, 0x63, 0x30, 0x0b, 0xc1, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58,
2194 0xf8, 0x47, 0x18, 0xd4, 0x42, 0x30, 0x59, 0x30, 0x89, 0xff, 0x1c, 0x43,
2195 0xb7, 0x84, 0xc2, 0x20, 0x43, 0xe0, 0xcd, 0x81, 0x0d, 0x01, 0xf9, 0x0f,
2196 0x32, 0x04, 0x60, 0x40, 0x07, 0x83, 0x0c, 0x01, 0x1f, 0xd0, 0xc1, 0x2c,
2197 0x81, 0x30, 0x50, 0x11, 0x08, 0x81, 0x3e, 0x00, 0x7b, 0x18, 0xfa, 0xe0,
2198 0x14, 0x6c, 0x81, 0x02, 0x60, 0x0c, 0x47, 0x04, 0x6c, 0xe0, 0xf8, 0xc7,
2199 0x2c, 0xc3, 0x40, 0x04, 0x83, 0x0c, 0x44, 0x1a, 0xf0, 0xc1, 0x1e, 0x86,
2200 0x50, 0x58, 0x05, 0x57, 0xa0, 0x00, 0x18, 0x7b, 0x18, 0x46, 0xa1, 0x15,
2201 0x5e, 0x81, 0x02, 0x60, 0x8c, 0x18, 0x28, 0x49, 0x0c, 0x82, 0x85, 0x7f,
2202 0x7c, 0xe7, 0x50, 0x74, 0xc7, 0x10, 0x0c, 0x32, 0x04, 0x6c, 0x00, 0x0a,
2203 0x83, 0x0c, 0xc1, 0x02, 0x0a, 0xb3, 0x04, 0xc4, 0x40, 0x45, 0x20, 0x0c,
2204 0x98, 0x30, 0x1c, 0x11, 0x06, 0x7c, 0x10, 0xf8, 0xc7, 0x2c, 0x43, 0x31,
2205 0x05, 0x7b, 0x18, 0x54, 0x81, 0x16, 0xc8, 0x81, 0x02, 0x60, 0x0c, 0x47,
2206 0x04, 0x7f, 0x10, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x85,
2207 0x1d, 0xa4, 0xc2, 0x1e, 0x06, 0x57, 0xc0, 0x85, 0x72, 0xa0, 0x00, 0x18,
2208 0x73, 0x0c, 0x76, 0x10, 0xe8, 0xc2, 0x20, 0x43, 0x70, 0x07, 0xac, 0x60,
2209 0x41, 0x21, 0xfe, 0x83, 0x0c, 0x41, 0x1e, 0xb4, 0xc2, 0x2c, 0x41, 0x1b,
2210 0xec, 0x61, 0xa0, 0x05, 0x5f, 0x60, 0x07, 0x0a, 0x80, 0xb1, 0x87, 0xc1,
2211 0x16, 0xc0, 0xa1, 0x1d, 0x28, 0x00, 0xc6, 0x20, 0x03, 0x14, 0x0a, 0xb2,
2212 0x30, 0x62, 0x50, 0x1c, 0x21, 0x08, 0x06, 0x5b, 0x3f, 0x10, 0xb3, 0x0c,
2213 0x88, 0x14, 0x8c, 0x21, 0x48, 0xe4, 0x30, 0x1c, 0x11, 0xb4, 0x82, 0xe2,
2214 0x1f, 0xb3, 0x0c, 0x4a, 0x12, 0x98, 0xd0, 0x0a, 0xe2, 0x3f, 0x4b, 0xb0,
2215 0xd8, 0xd0, 0x0a, 0xe0, 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe,
2216 0x81, 0x8d, 0x44, 0x60, 0x81, 0x2b, 0x88, 0xff, 0x88, 0xc1, 0x71, 0x84,
2217 0x20, 0x58, 0xf8, 0x87, 0x65, 0x12, 0x81, 0x2b, 0xcc, 0x12, 0x2c, 0x03,
2218 0x15, 0x80, 0x92, 0x08, 0xca, 0x1c, 0x83, 0x2a, 0x04, 0xec, 0x30, 0x86,
2219 0xb0, 0x85, 0xc3, 0x70, 0x44, 0x60, 0x0b, 0x8a, 0x7f, 0xcc, 0x32, 0x34,
2220 0x4c, 0x60, 0x82, 0x2d, 0x88, 0xff, 0x2c, 0x81, 0x63, 0x83, 0x2d, 0x80,
2221 0xff, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0xc6, 0x12, 0x81,
2222 0x05, 0xb7, 0x20, 0xfe, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f,
2223 0xd6, 0x4b, 0x04, 0xb7, 0x30, 0x4b, 0xe0, 0x0c, 0x54, 0x00, 0x0a, 0x23,
2224 0x34, 0x73, 0x0c, 0x49, 0x90, 0x0e, 0x63, 0x08, 0x64, 0x90, 0x0e, 0xc3,
2225 0x11, 0xc1, 0x2f, 0x28, 0xfe, 0x31, 0xcb, 0x00, 0x3d, 0x81, 0x09, 0xbf,
2226 0x20, 0xfe, 0xb3, 0x04, 0x91, 0x0d, 0xbf, 0x00, 0xfe, 0x23, 0x06, 0xc6,
2227 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x58, 0x4d, 0x04, 0x16, 0x80, 0x83, 0xf8,
2228 0x8f, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0x38, 0x11, 0x80,
2229 0xc3, 0x2c, 0x41, 0x34, 0x50, 0x01, 0x28, 0x8f, 0x00, 0xcd, 0x31, 0x24,
2230 0x41, 0x3c, 0xcc, 0x12, 0x48, 0x03, 0x15, 0x81, 0x10, 0xe9, 0xc1, 0x31,
2231 0xc8, 0x10, 0xfc, 0x82, 0x3c, 0xcc, 0x31, 0xf4, 0x02, 0x18, 0x84, 0xc4,
2232 0x20, 0x43, 0xe0, 0x0b, 0xf3, 0x60, 0x43, 0x20, 0xfe, 0x83, 0x0c, 0x01,
2233 0x38, 0xd0, 0xc3, 0x2c, 0x41, 0x1b, 0x0c, 0x47, 0xcc, 0x82, 0x39, 0x04,
2234 0xfe, 0x31, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8, 0x40, 0x07, 0xe5, 0x80,
2235 0x0f, 0x7b, 0x18, 0xfa, 0xe1, 0x24, 0x6a, 0x82, 0x02, 0x60, 0xec, 0x61,
2236 0xf8, 0x87, 0x94, 0xb0, 0x09, 0x0a, 0x80, 0x31, 0xc7, 0x70, 0x0e, 0xc1,
2237 0x4a, 0x0c, 0x32, 0x04, 0xe8, 0xd0, 0x0f, 0x16, 0x1c, 0xe2, 0x3f, 0xc8,
2238 0x10, 0xa8, 0x83, 0x3f, 0x8c, 0x18, 0x14, 0x47, 0x08, 0x82, 0xc1, 0x96,
2239 0x16, 0xc7, 0x2c, 0xc3, 0x57, 0x05, 0x63, 0x08, 0x03, 0x4c, 0x0c, 0x47,
2240 0x04, 0xff, 0xa0, 0xf8, 0xc7, 0x2c, 0xc3, 0x65, 0x05, 0x26, 0xfc, 0x83,
2241 0xf8, 0xcf, 0x12, 0x60, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, 0xe1, 0x1f,
2242 0x98, 0x5b, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x16,
2243 0x5c, 0x04, 0x20, 0x61, 0x01, 0x48, 0x88, 0xbf, 0x05, 0x20, 0x01, 0xfe,
2244 0xb3, 0x04, 0xd8, 0x40, 0x05, 0xa0, 0x58, 0xc2, 0x35, 0xc7, 0x20, 0x0f,
2245 0x01, 0x4e, 0x8c, 0x21, 0x30, 0x2d, 0x31, 0x1c, 0x11, 0xa0, 0x84, 0xe2,
2246 0x1f, 0xb3, 0x0c, 0x5a, 0x16, 0x98, 0x80, 0x12, 0xe2, 0x3f, 0x4b, 0xb0,
2247 0x8d, 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x60, 0x77, 0x31, 0x8c,
2248 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0x79, 0x11, 0xa4, 0x84,
2249 0x05, 0x29, 0x21, 0xfe, 0x16, 0xa4, 0x04, 0xf8, 0xcf, 0x12, 0x6c, 0x03,
2250 0x15, 0x80, 0x92, 0x09, 0xda, 0x1c, 0x43, 0x12, 0xd4, 0xc4, 0x18, 0x42,
2251 0x55, 0x13, 0xc3, 0x11, 0x41, 0x4c, 0x28, 0xfe, 0x31, 0xcb, 0xd0, 0x71,
2252 0x81, 0x09, 0x31, 0x21, 0xfe, 0xb3, 0x04, 0xde, 0x88, 0x81, 0x71, 0x84,
2253 0x20, 0x58, 0xf8, 0x07, 0x06, 0x1a, 0xc3, 0x88, 0xc1, 0x71, 0x84, 0x20,
2254 0x58, 0xf8, 0x87, 0x25, 0x1a, 0x81, 0x4c, 0x58, 0x20, 0x13, 0xe2, 0x6f,
2255 0x81, 0x4c, 0x80, 0xff, 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c, 0xd0,
2256 0xcd, 0x31, 0x24, 0x41, 0x4f, 0x8c, 0x18, 0x20, 0x47, 0x08, 0x82, 0x85,
2257 0x7f, 0x50, 0xa8, 0x11, 0x98, 0x04, 0x49, 0x0c, 0x32, 0x04, 0x28, 0xc1,
2258 0x13, 0xb3, 0x04, 0xdf, 0x40, 0x45, 0xe0, 0x07, 0x94, 0xe0, 0x0d, 0x32,
2259 0x04, 0x2d, 0xe1, 0x13, 0xb3, 0x04, 0x6d, 0x30, 0xcb, 0x10, 0x06, 0x6d,
2260 0xc0, 0x0f, 0x83, 0x0c, 0xbd, 0xe0, 0x12, 0x61, 0x31, 0x62, 0x70, 0x1c,
2261 0x21, 0x08, 0x16, 0xfe, 0xd1, 0xa5, 0x46, 0x20, 0x12, 0x73, 0x0c, 0x2b,
2262 0x11, 0xc4, 0xc5, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47, 0xb7,
2263 0x1a, 0xc3, 0x48, 0xcc, 0x31, 0x08, 0xc1, 0x59, 0x8c, 0x18, 0x1c, 0x47,
2264 0x08, 0x82, 0x85, 0x7f, 0x74, 0xad, 0x51, 0x90, 0xc4, 0x1c, 0x83, 0x10,
2265 0xa0, 0xc5, 0x20, 0x43, 0x20, 0x13, 0x66, 0x31, 0xc8, 0x10, 0x94, 0x83,
2266 0x59, 0xec, 0x61, 0x70, 0x0b, 0xbc, 0x30, 0x0d, 0x0a, 0x80, 0xb1, 0x87,
2267 0x01, 0x2e, 0xf4, 0xe2, 0x34, 0x28, 0x00, 0xc6, 0x1c, 0x03, 0x4e, 0x04,
2268 0x7c, 0x31, 0xc8, 0x10, 0xe4, 0x84, 0x5b, 0x58, 0x90, 0x88, 0xff, 0x20,
2269 0x43, 0xb0, 0x13, 0x6f, 0x31, 0x62, 0x50, 0x1c, 0x21, 0x08, 0x06, 0x9b,
2270 0x6e, 0x1c, 0xb3, 0x0c, 0x6c, 0x20, 0x06, 0xc1, 0x18, 0xc2, 0x10, 0x1a,
2271 0xc3, 0x11, 0x01, 0x5c, 0x28, 0xfe, 0x31, 0xcb, 0x40, 0x06, 0x63, 0x10,
2272 0x98, 0x00, 0x17, 0xe2, 0x3f, 0x4b, 0x50, 0x06, 0x23, 0x06, 0xc6, 0x11,
2273 0x82, 0x60, 0xe1, 0x1f, 0xd8, 0x6f, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82,
2274 0x60, 0xe1, 0x1f, 0x56, 0x78, 0x04, 0x71, 0x61, 0x41, 0x5c, 0x88, 0xbf,
2275 0x05, 0x71, 0x01, 0xfe, 0xb3, 0x04, 0x65, 0x30, 0x50, 0x01, 0x28, 0x63,
2276 0x20, 0x90, 0xc1, 0x1c, 0xc3, 0x58, 0x04, 0xa9, 0x31, 0x86, 0xc0, 0xf8,
2277 0xc5, 0x70, 0x44, 0x90, 0x17, 0x8a, 0x7f, 0xcc, 0x32, 0x9c, 0x81, 0x19,
2278 0x04, 0x26, 0xe4, 0x85, 0xf8, 0xcf, 0x12, 0xa0, 0xc1, 0x88, 0x81, 0x71,
2279 0x84, 0x20, 0x58, 0xf8, 0x07, 0x86, 0x1e, 0xc3, 0x88, 0xc1, 0x71, 0x84,
2280 0x20, 0x58, 0xf8, 0x87, 0xa5, 0x1e, 0x81, 0x5e, 0x58, 0xa0, 0x17, 0xe2,
2281 0x6f, 0x81, 0x5e, 0x80, 0xff, 0x2c, 0x01, 0x1a, 0x0c, 0x54, 0x00, 0x8a,
2282 0x19, 0x08, 0x67, 0x30, 0xc7, 0x90, 0x04, 0xa6, 0x31, 0x86, 0x50, 0x99,
2283 0xc6, 0x70, 0x44, 0x20, 0x1a, 0x8a, 0x7f, 0xcc, 0x32, 0xa8, 0x41, 0x1a,
2284 0x04, 0x26, 0x88, 0x86, 0xf8, 0xcf, 0x12, 0xac, 0xc1, 0x88, 0x81, 0x71,
2285 0x84, 0x20, 0x58, 0xf8, 0x07, 0x16, 0x1f, 0xc3, 0x88, 0xc1, 0x71, 0x84,
2286 0x20, 0x58, 0xf8, 0x87, 0x35, 0x1f, 0xc1, 0x68, 0x58, 0x30, 0x1a, 0xe2,
2287 0x6f, 0xc1, 0x68, 0x80, 0xff, 0x2c, 0xc1, 0x1a, 0x0c, 0x54, 0x00, 0x4a,
2288 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xae, 0x31, 0x62, 0x80, 0x1c,
2289 0x21, 0x08, 0x16, 0xfe, 0x41, 0xe5, 0x47, 0x70, 0x17, 0x75, 0x31, 0xc8,
2290 0x10, 0xe4, 0x45, 0x6b, 0xcc, 0x12, 0xb0, 0xc1, 0x40, 0x45, 0xe0, 0x07,
2291 0x61, 0x20, 0xac, 0xc1, 0x20, 0x43, 0xe0, 0x17, 0xaf, 0x31, 0x4b, 0xd0,
2292 0x06, 0x03, 0x2d, 0x01, 0x8f, 0x18, 0x3c, 0x22, 0xf1, 0xc8, 0x27, 0x0b,
2293 0x6c, 0xc0, 0x23, 0x60, 0x30, 0xd0, 0x12, 0xa0, 0x88, 0xa1, 0x17, 0x92,
2294 0x39, 0x7c, 0x04, 0x1b, 0xf0, 0x0b, 0x18, 0x0c, 0x32, 0x04, 0x42, 0x6c,
2295 0x64, 0x10, 0x10, 0x03, 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20,
2296 0x78, 0x87, 0x2d, 0x83, 0x11, 0xc0, 0xc3, 0x96, 0x21, 0x0b, 0xe2, 0x61,
2297 0xcb, 0xe0, 0x05, 0xf2, 0xb0, 0x65, 0x00, 0x83, 0x60, 0x1e, 0xb6, 0x0c,
2298 0x69, 0x10, 0xd0, 0xc3, 0x96, 0xc1, 0x0d, 0x82, 0x7a, 0xd8, 0x32, 0xd4,
2299 0x41, 0x60, 0x0f, 0x5b, 0x86, 0x3b, 0x08, 0xea, 0x61, 0xcb, 0xb0, 0x0e,
2300 0x81, 0x3d, 0x6c, 0x19, 0xda, 0x21, 0xa8, 0x87, 0x2d, 0x43, 0x5a, 0x04,
2301 0xf6, 0xb0, 0x65, 0x58, 0x8b, 0xa0, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
2302 0x00, 0x61, 0x20, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a,
2303 0x2c, 0x10, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x74, 0xce, 0x00,
2304 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00,
2305 0x74, 0xcf, 0x41, 0x44, 0x8f, 0xd3, 0x06, 0x04, 0x8c, 0x11, 0x80, 0x20,
2306 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x23, 0x00,
2307 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x50, 0x31, 0x03, 0x30, 0xd6, 0xc0, 0xb2,
2308 0x67, 0x28, 0x7f, 0xa8, 0x5f, 0xc6, 0xea, 0x97, 0x9f, 0xba, 0x38, 0x7b,
2309 0x63, 0x0d, 0x7a, 0x0d, 0xee, 0xb8, 0xa7, 0xe2, 0xb9, 0x6d, 0x7f, 0x6f,
2310 0x9f, 0xd2, 0xa3, 0x37, 0xd6, 0xb0, 0xce, 0x31, 0x8b, 0x7a, 0x69, 0x08,
2311 0xa3, 0xbb, 0x77, 0xb7, 0xb1, 0x6a, 0x7f, 0x63, 0x0d, 0x62, 0x2e, 0xa6,
2312 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98, 0xae, 0x6a, 0xee, 0x0b,
2313 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0, 0x35, 0x28, 0xe6, 0x5f,
2314 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73, 0xdf, 0xa6, 0xa9, 0x2f,
2315 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac, 0x8f, 0x7f, 0x00, 0x00,
2316 0x00, 0x83, 0x0c, 0xd7, 0xd1, 0x0c, 0x47, 0x58, 0x4d, 0xe0, 0x1f, 0xb3,
2317 0x0c, 0x81, 0x10, 0xcc, 0x31, 0x24, 0x96, 0x18, 0x0c, 0x32, 0x04, 0x4a,
2318 0x64, 0xc1, 0x26, 0xfe, 0x83, 0x0c, 0x01, 0x23, 0xcd, 0x12, 0x24, 0xc3,
2319 0x11, 0x5b, 0x14, 0xf8, 0xc7, 0x2c, 0xc3, 0x90, 0x04, 0xc3, 0x11, 0x9d,
2320 0x14, 0xf8, 0xc7, 0x2c, 0x03, 0x51, 0x04, 0x23, 0x06, 0xc7, 0x11, 0x82,
2321 0x60, 0xe1, 0x1f, 0x5d, 0x28, 0x7c, 0xce, 0x1c, 0x43, 0x14, 0xa4, 0xc1,
2322 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47, 0x37, 0x0a, 0x61, 0xf0,
2323 0xcc, 0x31, 0x08, 0x01, 0x37, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe,
2324 0xd1, 0x95, 0xc2, 0x18, 0x40, 0x73, 0x0c, 0x42, 0xd0, 0xcd, 0x12, 0x14,
2325 0x03, 0x15, 0x81, 0x40, 0x70, 0xc3, 0x18, 0x42, 0xf0, 0x06, 0x63, 0x08,
2326 0x42, 0x18, 0x8c, 0x21, 0x0c, 0x61, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08,
2327 0x16, 0xfe, 0x61, 0xa5, 0x82, 0x10, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82,
2328 0x85, 0x7f, 0x58, 0xaa, 0x40, 0x04, 0xc3, 0x11, 0x81, 0x27, 0xf8, 0xc7,
2329 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x87, 0x47, 0x06, 0x36, 0xa8, 0x81,
2330 0xf8, 0x5b, 0x30, 0x06, 0xe0, 0x6f, 0xc5, 0x1a, 0x88, 0xbf, 0x05, 0x65,
2331 0x00, 0xfe, 0x36, 0x04, 0xe4, 0x3f, 0xc7, 0x20, 0x06, 0xc1, 0x1e, 0x0c,
2332 0x32, 0x04, 0x63, 0xa0, 0x06, 0x16, 0x20, 0xe2, 0x3f, 0xc8, 0x10, 0x94,
2333 0xc1, 0x1a, 0xcc, 0x12, 0x1c, 0x03, 0x15, 0x81, 0x60, 0x88, 0x41, 0x31,
2334 0xcb, 0x80, 0x24, 0xd9, 0x20, 0x43, 0x90, 0x06, 0x6f, 0x30, 0x62, 0x70,
2335 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xd1, 0xe9, 0x42, 0x40, 0x06, 0x73, 0x0c,
2336 0x6a, 0x10, 0x88, 0xc2, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47,
2337 0xc7, 0x0b, 0x43, 0x19, 0xcc, 0x31, 0x08, 0x41, 0x1d, 0x8c, 0x18, 0x1c,
2338 0x47, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xbe, 0x50, 0x98, 0xc1, 0x1c, 0x83,
2339 0x10, 0xd8, 0xc1, 0x2c, 0x41, 0x32, 0x50, 0x12, 0x90, 0x42, 0xe0, 0x0a,
2340 0x82, 0x80, 0x40, 0xc7, 0x20, 0x43, 0x10, 0x07, 0x77, 0x90, 0x01, 0x00,
2341 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10,
2342 0x22, 0x84, 0x00, 0xbf, 0x09, 0x18, 0xd0, 0xac, 0x80, 0x07, 0xb4, 0x0e,
2343 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x6d, 0x00, 0x00,
2344 0x00, 0x12, 0x03, 0x94, 0x68, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
2345 0x00, 0x3e, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00,
2346 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2347 0x00, 0x58, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00,
2348 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00,
2349 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x66, 0x01, 0x00,
2350 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
2351 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2352 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2353 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00,
2354 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
2355 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00,
2356 0x00, 0x48, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
2357 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2358 0x00, 0x5c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00,
2359 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2360 0x00, 0x6c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00,
2361 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2362 0x00, 0x7d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00,
2363 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2364 0x00, 0x93, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00,
2365 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2366 0x00, 0xa0, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00,
2367 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00,
2368 0x00, 0xb9, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00,
2369 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2370 0x00, 0xca, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00,
2371 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2372 0x00, 0xdc, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00,
2373 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2374 0x00, 0xef, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00,
2375 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2376 0x00, 0x02, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00,
2377 0x00, 0x21, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2378 0x00, 0x23, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00,
2379 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00,
2380 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x5d, 0x00, 0x00,
2381 0x00, 0x12, 0x03, 0x94, 0xe6, 0x02, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c,
2382 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e,
2383 0x74, 0x5f, 0x5a, 0x31, 0x34, 0x47, 0x65, 0x74, 0x4f, 0x75, 0x74, 0x70,
2384 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66,
2385 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c, 0x63, 0x6f, 0x6e, 0x73, 0x74,
2386 0x61, 0x6e, 0x74, 0x4b, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72,
2387 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x61, 0x69, 0x72,
2388 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x2e,
2389 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73,
2390 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72,
2391 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x66,
2392 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72,
2393 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, 0x66, 0x2e, 0x66, 0x33, 0x32,
2394 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, 0x2e, 0x76, 0x33, 0x66, 0x33,
2395 0x32, 0x5f, 0x5a, 0x31, 0x32, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x54, 0x6f,
2396 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x44, 0x76, 0x33, 0x5f, 0x66, 0x66, 0x66,
2397 0x66, 0x66, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66,
2398 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66,
2399 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x76, 0x33, 0x66, 0x33,
2400 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61,
2401 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e,
2402 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x76, 0x33,
2403 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c,
2404 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64,
2405 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32,
2406 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74,
2407 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34,
2408 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34,
2409 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d,
2410 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69,
2411 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
2412 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
2413 0x00, 0x14, 0x00, 0x00, 0x00, 0xa4, 0x22, 0x00, 0x00, 0xff, 0xff, 0xff,
2414 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00,
2415 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00,
2416 0x00, 0x21, 0x0c, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0x0b, 0x02, 0x21,
2417 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
2418 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
2419 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45,
2420 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
2421 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88,
2422 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x11, 0x23, 0xc4,
2423 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46,
2424 0x06, 0x51, 0x18, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x1b, 0xc2, 0x24,
2425 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22,
2426 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1,
2427 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21,
2428 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80,
2429 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87, 0x72, 0x38, 0x87, 0x70,
2430 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79,
2431 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40,
2432 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21,
2433 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1,
2434 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00,
2435 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0,
2436 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72,
2437 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76,
2438 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72,
2439 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03, 0x77,
2440 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07, 0x80,
2441 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20,
2442 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0,
2443 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72,
2444 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87, 0x79,
2445 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74,
2446 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1,
2447 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40,
2448 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1,
2449 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a,
2450 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70,
2451 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87, 0x70,
2452 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62,
2453 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1,
2454 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40,
2455 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21,
2456 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79,
2457 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
2458 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
2459 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90, 0x06, 0x60, 0x30, 0x84,
2460 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94,
2461 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4,
2462 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x1b, 0x0a, 0x60, 0x01, 0xaa, 0x20,
2463 0x0d, 0x40, 0x61, 0x08, 0x87, 0x74, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
2464 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x03, 0x77, 0x78, 0x87, 0x36,
2465 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07, 0x60, 0x83, 0x41, 0x20,
2466 0xc0, 0x02, 0x54, 0x1b, 0xc2, 0xa4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01,
2467 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1,
2468 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0,
2469 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
2470 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36,
2471 0x60, 0x87, 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72,
2472 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72,
2473 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1,
2474 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1,
2475 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21,
2476 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81,
2477 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01,
2478 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
2479 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
2480 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
2481 0x48, 0x87, 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76,
2482 0x28, 0x87, 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
2483 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1,
2484 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01,
2485 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
2486 0x70, 0x87, 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36,
2487 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1,
2488 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1,
2489 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61,
2490 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
2491 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77,
2492 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77,
2493 0x38, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41,
2494 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61,
2495 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81,
2496 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1,
2497 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c,
2498 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36,
2499 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80,
2500 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0x90, 0x18, 0x02, 0xb0, 0x00,
2501 0x55, 0x90, 0x06, 0x60, 0xb0, 0xc1, 0x38, 0xfe, 0xff, 0xff, 0xff, 0x7f,
2502 0x00, 0x24, 0x80, 0xda, 0xe0, 0x23, 0xc8, 0xff, 0xff, 0xff, 0xff, 0x0f,
2503 0x80, 0x04, 0x54, 0x44, 0x38, 0xc0, 0x03, 0x3c, 0xc8, 0xc3, 0x3b, 0xe0,
2504 0x43, 0x1b, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb4, 0x81, 0x39, 0xc0,
2505 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f,
2506 0xf5, 0x50, 0x0e, 0x00, 0xd1, 0x0e, 0xe9, 0xe0, 0x0e, 0x6d, 0xc0, 0x0e,
2507 0xe5, 0x70, 0x0e, 0xe1, 0xc0, 0x0e, 0x6d, 0x60, 0x0f, 0xe5, 0x30, 0x0e,
2508 0xf4, 0xf0, 0x0e, 0xf2, 0xd0, 0x06, 0xf7, 0x90, 0x0e, 0xe4, 0x40, 0x0f,
2509 0xe8, 0x00, 0xe4, 0x81, 0x1d, 0x00, 0x83, 0x3b, 0xbc, 0x43, 0x1b, 0x88,
2510 0x43, 0x3d, 0xa4, 0x03, 0x3b, 0xd0, 0x43, 0x3a, 0xb8, 0xc3, 0x3c, 0x00,
2511 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94,
2512 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8,
2513 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0x00, 0xf4, 0x20, 0x0f,
2514 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe6, 0x20, 0x0f,
2515 0xe1, 0xd0, 0x0e, 0xe5, 0xd0, 0x06, 0xf0, 0xf0, 0x0e, 0xe9, 0xe0, 0x0e,
2516 0xf4, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xe5, 0xc0, 0x0e, 0xe9, 0xd0, 0x0e,
2517 0x6d, 0xe0, 0x0e, 0xef, 0xe0, 0x0e, 0x6d, 0xc0, 0x0e, 0xe5, 0x10, 0x0e,
2518 0xe6, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc,
2519 0x43, 0x1b, 0xa4, 0x83, 0x3b, 0x98, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0,
2520 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f,
2521 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xee, 0x10, 0x0e,
2522 0xee, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e,
2523 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8,
2524 0xc3, 0x3b, 0xb4, 0xc1, 0x3c, 0xa4, 0xc3, 0x39, 0xb8, 0x43, 0x39, 0x90,
2525 0x43, 0x1b, 0xe8, 0x43, 0x39, 0xc8, 0xc3, 0x3b, 0xcc, 0x43, 0x1b, 0x98,
2526 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f,
2527 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x40, 0x0f,
2528 0xf2, 0x10, 0x0e, 0xf0, 0x00, 0x0f, 0xe9, 0xe0, 0x0e, 0xe7, 0xd0, 0x06,
2529 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94,
2530 0x03, 0x40, 0xcc, 0x03, 0x3d, 0x84, 0xc3, 0x38, 0xac, 0x43, 0x1b, 0xc0,
2531 0x83, 0x3c, 0xbc, 0x03, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8,
2532 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4,
2533 0xc1, 0x3c, 0xa4, 0x83, 0x3e, 0x94, 0x03, 0x80, 0x07, 0x00, 0x51, 0x0f,
2534 0xee, 0x30, 0x0f, 0xe1, 0x60, 0x0e, 0xe5, 0xd0, 0x06, 0xe6, 0x00, 0x0f,
2535 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4,
2536 0x43, 0x39, 0x00, 0x1b, 0x94, 0xe4, 0xff, 0xff, 0xff, 0xff, 0x07, 0xa0,
2537 0x0d, 0x80, 0x35, 0x00, 0x24, 0xa0, 0xda, 0x60, 0x28, 0x01, 0xb0, 0x00,
2538 0xd5, 0x06, 0x63, 0x11, 0x80, 0x05, 0xa8, 0x36, 0x28, 0xcc, 0xff, 0xff,
2539 0xff, 0xff, 0x0f, 0x40, 0x1b, 0x00, 0x6b, 0x00, 0x48, 0x40, 0xb5, 0xc1,
2540 0x68, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24, 0x80, 0xda, 0x30, 0x39,
2541 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6b, 0x00, 0x28, 0x83, 0x3b, 0xbc,
2542 0x43, 0x1b, 0x88, 0x43, 0x3d, 0xa4, 0x03, 0x3b, 0xd0, 0x43, 0x3a, 0xb8,
2543 0xc3, 0x3c, 0x00, 0x1b, 0x8a, 0x47, 0x08, 0xd2, 0x00, 0x0c, 0x36, 0x44,
2544 0xd0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x32, 0xb8, 0xc3, 0x3b, 0xb4,
2545 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, 0xcc,
2546 0x03, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00,
2547 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x42, 0x61, 0x4c, 0x08, 0x8e,
2548 0x09, 0x01, 0x32, 0x61, 0x48, 0x94, 0x65, 0xc2, 0xc0, 0x28, 0xcb, 0x84,
2549 0xa0, 0x99, 0x20, 0x38, 0xcf, 0x84, 0x00, 0x02, 0x00, 0x89, 0x20, 0x00,
2550 0x00, 0x48, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85,
2551 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90,
2552 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xd0, 0xc1,
2553 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14,
2554 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04,
2555 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84,
2556 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e,
2557 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e,
2558 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e,
2559 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe,
2560 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40,
2561 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8,
2562 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8,
2563 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2,
2564 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08,
2565 0x44, 0xb2, 0x2c, 0x0d, 0x39, 0x65, 0x08, 0x02, 0x82, 0xa0, 0x42, 0x14,
2566 0x45, 0x51, 0x90, 0x54, 0x06, 0x00, 0x00, 0x88, 0x2a, 0x02, 0x00, 0x90,
2567 0x35, 0x47, 0x10, 0x14, 0x01, 0x03, 0x28, 0x2b, 0x03, 0x50, 0x14, 0xb4,
2568 0x15, 0xa3, 0x28, 0x00, 0x00, 0x00, 0xa8, 0x2b, 0x43, 0x51, 0x14, 0xf4,
2569 0x15, 0xa1, 0x28, 0x28, 0x9c, 0x23, 0x40, 0x8c, 0x10, 0x8c, 0x73, 0x04,
2570 0x60, 0x30, 0x8c, 0x20, 0x94, 0x41, 0x51, 0xc8, 0xa5, 0x11, 0x30, 0x13,
2571 0x03, 0x80, 0x92, 0xce, 0x81, 0x80, 0x14, 0x28, 0xe7, 0x08, 0x40, 0x61,
2572 0x10, 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x86, 0x32, 0x18,
2573 0x44, 0x08, 0x84, 0x41, 0x84, 0x43, 0x18, 0x44, 0x28, 0x84, 0x61, 0x04,
2574 0xa2, 0x0c, 0x00, 0x00, 0x00, 0x13, 0xbe, 0x70, 0x48, 0x07, 0x79, 0xb0,
2575 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68,
2576 0x83, 0x74, 0x78, 0x87, 0x79, 0x88, 0x83, 0x39, 0x70, 0x03, 0x38, 0x70,
2577 0x03, 0x38, 0x68, 0x83, 0x79, 0x48, 0x87, 0x76, 0xa8, 0x07, 0x76, 0x08,
2578 0x07, 0x7a, 0x78, 0x07, 0x79, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0,
2579 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76,
2580 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78,
2581 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d,
2582 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71,
2583 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72,
2584 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a,
2585 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73,
2586 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
2587 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76,
2588 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76,
2589 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a,
2590 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73,
2591 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
2592 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76,
2593 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
2594 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a,
2595 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d,
2596 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78,
2597 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79,
2598 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75,
2599 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72,
2600 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6,
2601 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a,
2602 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72,
2603 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71,
2604 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71,
2605 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x11, 0xc2, 0x90, 0x11, 0xdb,
2606 0x95, 0xff, 0xf9, 0xd6, 0xf6, 0x5f, 0x44, 0x80, 0xc1, 0x10, 0xcd, 0x34,
2607 0x24, 0x02, 0x22, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
2608 0x00, 0x00, 0x86, 0x44, 0x11, 0x1e, 0x40, 0x08, 0x30, 0x08, 0x00, 0x00,
2609 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x24, 0x4a, 0x05, 0x4a, 0x02, 0x02,
2610 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x51, 0x2f,
2611 0x40, 0x14, 0x10, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
2612 0x0c, 0x89, 0xda, 0x21, 0xb2, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04,
2613 0x00, 0x00, 0x00, 0x60, 0x48, 0xe4, 0x0f, 0x56, 0x06, 0x04, 0xc0, 0x00,
2614 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x22, 0x9a, 0x68, 0x36,
2615 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12,
2616 0x85, 0x45, 0xd6, 0x21, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
2617 0x00, 0xc0, 0x90, 0x48, 0x2f, 0x22, 0x0a, 0x08, 0x80, 0x01, 0x00, 0x00,
2618 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xab, 0x21, 0x7d, 0x40, 0x00,
2619 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0xea, 0x8d,
2620 0x29, 0x0c, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
2621 0x60, 0x48, 0x04, 0x1f, 0xd3, 0x07, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x20,
2622 0x00, 0x00, 0x00, 0x00, 0x43, 0xa2, 0x11, 0xd9, 0xce, 0x00, 0x08, 0x80,
2623 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x36, 0x08, 0x14,
2624 0x15, 0x3f, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00,
2625 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
2626 0x47, 0xc6, 0x04, 0x43, 0x2a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0,
2627 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7,
2628 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0x68, 0x1d, 0x01, 0x28,
2629 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x52, 0xc7,
2630 0x12, 0x24, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
2631 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
2632 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
2633 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
2634 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
2635 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
2636 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
2637 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
2638 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
2639 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
2640 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
2641 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
2642 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
2643 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
2644 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
2645 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
2646 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
2647 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
2648 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
2649 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
2650 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
2651 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
2652 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
2653 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
2654 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
2655 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
2656 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
2657 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
2658 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
2659 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
2660 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
2661 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
2662 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
2663 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
2664 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
2665 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
2666 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
2667 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
2668 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
2669 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
2670 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
2671 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
2672 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
2673 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
2674 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
2675 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
2676 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
2677 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
2678 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
2679 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
2680 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
2681 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
2682 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
2683 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
2684 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
2685 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
2686 0x00, 0x79, 0x20, 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08,
2687 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4,
2688 0xf2, 0x00, 0x0e, 0xdc, 0x0c, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41,
2689 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca,
2690 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f,
2691 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, 0xc5, 0x72, 0x04, 0xd5,
2692 0xf3, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72,
2693 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69,
2694 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61,
2695 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32,
2696 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74,
2697 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34,
2698 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e,
2699 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f,
2700 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61,
2701 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66,
2702 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61,
2703 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
2704 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66,
2705 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61,
2706 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65,
2707 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e,
2708 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
2709 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70,
2710 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63,
2711 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f,
2712 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61,
2713 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70,
2714 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66,
2715 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75,
2716 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35,
2717 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61,
2718 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69,
2719 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72,
2720 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f,
2721 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61,
2722 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69,
2723 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e,
2724 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61,
2725 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
2726 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61,
2727 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f,
2728 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f,
2729 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70,
2730 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79,
2731 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65,
2732 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74,
2733 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,
2734 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63,
2735 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f,
2736 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77,
2737 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69,
2738 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73,
2739 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74,
2740 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69,
2741 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73,
2742 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
2743 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
2744 0x78, 0x33, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44,
2745 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61,
2746 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69,
2747 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74,
2748 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c,
2749 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59,
2750 0x74, 0x65, 0x78, 0x55, 0x56, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d,
2751 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73,
2752 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72,
2753 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e,
2754 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72,
2755 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54,
2756 0x42, 0x41, 0x41, 0x00, 0x00, 0x04, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00,
2757 0x00, 0x30, 0x82, 0x50, 0x06, 0xcd, 0x08, 0x82, 0x1a, 0x98, 0xc1, 0x08,
2758 0x42, 0x19, 0x38, 0x23, 0x08, 0x65, 0xf0, 0x8c, 0x20, 0x94, 0x01, 0x34,
2759 0x82, 0xf0, 0x00, 0x23, 0x08, 0x65, 0x10, 0x8d, 0x20, 0x94, 0x81, 0x34,
2760 0x82, 0x50, 0x06, 0xd3, 0x08, 0x42, 0x19, 0x50, 0x23, 0x08, 0x65, 0x50,
2761 0x8d, 0x20, 0x94, 0x81, 0x35, 0x82, 0x50, 0x06, 0xd7, 0x08, 0x42, 0x19,
2762 0x60, 0x23, 0x08, 0x65, 0x90, 0x8d, 0x20, 0x94, 0x81, 0x36, 0x82, 0x50,
2763 0x06, 0xdb, 0x08, 0x42, 0x19, 0x70, 0x23, 0x08, 0x65, 0xd0, 0x8d, 0x20,
2764 0xac, 0x81, 0x37, 0x82, 0xb0, 0x06, 0xdf, 0x08, 0xc2, 0x1a, 0x80, 0xc1,
2765 0x08, 0xc2, 0x1a, 0x84, 0xc1, 0x08, 0xc2, 0x1a, 0x88, 0xc1, 0x08, 0xc2,
2766 0x1a, 0x8c, 0xc1, 0x08, 0xc2, 0x1a, 0x90, 0xc1, 0x08, 0xc2, 0x1a, 0x94,
2767 0xc1, 0x0c, 0x83, 0x1e, 0x04, 0x7b, 0x30, 0xc3, 0xc0, 0x07, 0x42, 0x1f,
2768 0xcc, 0x10, 0x0c, 0x33, 0x0c, 0x7a, 0xa0, 0x07, 0x7e, 0x30, 0x03, 0x41,
2769 0xf0, 0x01, 0x1f, 0xf8, 0xc1, 0x0c, 0x41, 0x31, 0x43, 0x60, 0xcc, 0x10,
2770 0x1c, 0x33, 0x14, 0x88, 0x1f, 0xf8, 0x41, 0xa2, 0xcc, 0x10, 0xf4, 0xc2,
2771 0x0c, 0x88, 0x1f, 0x2c, 0x4c, 0x93, 0x28, 0xce, 0x33, 0x43, 0xc2, 0x07,
2772 0x50, 0xc4, 0x48, 0x89, 0xe2, 0x4c, 0x33, 0x24, 0x7a, 0x00, 0x51, 0x8c,
2773 0x94, 0x54, 0x8e, 0x35, 0x03, 0x1a, 0xf8, 0x41, 0x1f, 0xf8, 0x01, 0xd7,
2774 0xf5, 0x41, 0x1f, 0xf8, 0x01, 0xe7, 0x89, 0x42, 0x1f, 0xf8, 0x01, 0xf7,
2775 0x8d, 0x42, 0x1f, 0xf8, 0x01, 0x07, 0x06, 0xa4, 0xd0, 0x07, 0x7e, 0xc0,
2776 0x85, 0x41, 0x29, 0xf4, 0x81, 0x1f, 0x70, 0x62, 0x60, 0x0a, 0x7d, 0xe0,
2777 0x07, 0xdc, 0x18, 0x9c, 0x42, 0x1f, 0xf8, 0x01, 0x47, 0x06, 0x33, 0x48,
2778 0xa0, 0x70, 0x61, 0xa1, 0x90, 0xf9, 0x01, 0x1f, 0x68, 0x9b, 0x38, 0x94,
2779 0x41, 0x28, 0x98, 0x41, 0x1f, 0x24, 0x67, 0xe0, 0xa0, 0xc1, 0x0c, 0x8a,
2780 0x1f, 0x90, 0x82, 0x1f, 0xa4, 0x81, 0x1a, 0x90, 0x42, 0x2a, 0xf8, 0xc1,
2781 0x1a, 0xb0, 0xc1, 0x0c, 0x52, 0x1f, 0x5c, 0x18, 0x2a, 0x64, 0x7c, 0xc0,
2782 0x07, 0xda, 0x46, 0x0e, 0x65, 0x80, 0x0a, 0x66, 0x40, 0x0a, 0x49, 0x1b,
2783 0x38, 0x6e, 0x30, 0x83, 0xa2, 0x0a, 0x6f, 0x90, 0xf9, 0x01, 0x1f, 0xc0,
2784 0x41, 0x12, 0x07, 0x8e, 0x1c, 0xcc, 0xa0, 0xac, 0xc2, 0x1b, 0x64, 0x7c,
2785 0xc0, 0x07, 0x70, 0x90, 0xc4, 0x81, 0x33, 0x07, 0x33, 0x24, 0xac, 0x40,
2786 0x07, 0x99, 0x1f, 0xf0, 0x41, 0x52, 0x07, 0x8e, 0x1d, 0xcc, 0x80, 0xfc,
2787 0x02, 0x38, 0x84, 0xc3, 0x38, 0x94, 0x83, 0x39, 0x9c, 0x03, 0x3a, 0xcc,
2788 0x30, 0xfc, 0x81, 0x2f, 0xa4, 0xc3, 0x0c, 0x41, 0x1e, 0xcc, 0x30, 0xe0,
2789 0xc1, 0x3a, 0xb4, 0xc2, 0x0c, 0x03, 0xc7, 0x0e, 0xad, 0x30, 0x43, 0x74,
2790 0x07, 0xed, 0xd0, 0x0a, 0xed, 0xe0, 0x0a, 0xed, 0xf0, 0x0a, 0xed, 0x00,
2791 0x0b, 0xed, 0x10, 0x0b, 0xed, 0x20, 0x0b, 0xed, 0x30, 0x0b, 0xed, 0x40,
2792 0x0b, 0x33, 0x0c, 0xee, 0xd0, 0x0e, 0xae, 0x50, 0x76, 0x00, 0x88, 0x01,
2793 0x1a, 0x88, 0x81, 0x18, 0x88, 0x01, 0x27, 0x06, 0x62, 0x20, 0x06, 0x62,
2794 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, 0x20, 0x06, 0x62,
2795 0x20, 0x06, 0x62, 0x20, 0x06, 0x68, 0x80, 0x06, 0x68, 0x80, 0x06, 0x68,
2796 0x80, 0x06, 0x6e, 0xe0, 0x06, 0x16, 0x1d, 0xe8, 0x81, 0x65, 0x59, 0x7a,
2797 0xc0, 0x99, 0x02, 0x2b, 0xb0, 0x02, 0xdd, 0xf8, 0x05, 0x4a, 0xf8, 0x85,
2798 0x3d, 0xd8, 0x83, 0x3a, 0xc0, 0x03, 0x1d, 0x70, 0x74, 0xe0, 0x06, 0xbc,
2799 0x21, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed,
2800 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14,
2801 0x81, 0x16, 0x6a, 0xe1, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2,
2802 0x32, 0x37, 0xba, 0x51, 0x02, 0x5b, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5,
2803 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0xe0, 0x16, 0x8e, 0x0a,
2804 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb,
2805 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0xc0, 0x85, 0x9b,
2806 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe,
2807 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x72, 0x41, 0x17,
2808 0x76, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6,
2809 0x32, 0x37, 0xba, 0x51, 0x82, 0x74, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00,
2810 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80,
2811 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43,
2812 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e,
2813 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
2814 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4,
2815 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81,
2816 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08,
2817 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01,
2818 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c,
2819 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c,
2820 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c,
2821 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1,
2822 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00,
2823 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c,
2824 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90,
2825 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xd9, 0x00, 0x00,
2826 0x00, 0x13, 0x04, 0x45, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
2827 0x00, 0x84, 0xd5, 0xc0, 0x08, 0x00, 0x95, 0x33, 0x00, 0x64, 0x8e, 0x00,
2828 0x8c, 0x25, 0x04, 0x00, 0xad, 0x25, 0x50, 0x04, 0x65, 0x40, 0xef, 0x58,
2829 0x03, 0x10, 0x08, 0x73, 0x0c, 0x50, 0x1c, 0xc4, 0xc1, 0x1c, 0x03, 0xe4,
2830 0xc4, 0xc1, 0x58, 0x03, 0x30, 0x10, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80,
2831 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63,
2832 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30,
2833 0x03, 0x30, 0x07, 0xc1, 0x07, 0x7b, 0xc0, 0x07, 0x7f, 0x40, 0xc2, 0x0c,
2834 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x34, 0x00, 0x00,
2835 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, 0x49, 0x00, 0x00, 0x00,
2836 0x00, 0x63, 0x60, 0x61, 0x98, 0x05, 0x00, 0x00, 0x00, 0x61, 0x69, 0x72,
2837 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65,
2838 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66,
2839 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d,
2840 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d,
2841 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c,
2842 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61,
2843 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c,
2844 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65,
2845 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c,
2846 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72,
2847 0x67, 0x28, 0x34, 0x29, 0x00, 0x2b, 0x84, 0x7a, 0x80, 0x87, 0x15, 0x83,
2848 0x3d, 0xd4, 0x43, 0x3c, 0xac, 0x18, 0xee, 0xa1, 0x1e, 0xe4, 0x61, 0xc5,
2849 0x80, 0x0f, 0xf5, 0x30, 0x0f, 0x2b, 0x86, 0x7c, 0xa8, 0x07, 0x7a, 0xd8,
2850 0x10, 0xd8, 0xc3, 0x86, 0x21, 0x1f, 0xf0, 0xe1, 0x1e, 0x36, 0x08, 0xf8,
2851 0x70, 0x0f, 0x1b, 0x04, 0x7b, 0xc8, 0x87, 0x0d, 0x41, 0x3e, 0x6c, 0x18,
2852 0xec, 0x01, 0x1f, 0xee, 0x01, 0x7b, 0x18, 0x34, 0x33, 0xb0, 0x03, 0x0a,
2853 0x80, 0x31, 0x1c, 0x11, 0x24, 0x81, 0x7f, 0xcc, 0x32, 0x04, 0x42, 0x30,
2854 0x62, 0xd0, 0x18, 0x21, 0x08, 0x06, 0x67, 0xb0, 0x07, 0x5b, 0xe6, 0x61,
2855 0xd5, 0xc5, 0x30, 0x77, 0x30, 0x9a, 0x10, 0x00, 0x23, 0x06, 0x8d, 0x11,
2856 0x82, 0x60, 0x70, 0x06, 0x7d, 0xc0, 0x6d, 0x60, 0xa0, 0x5d, 0x99, 0xe3,
2857 0xe4, 0xc1, 0x68, 0x42, 0x00, 0x0c, 0x32, 0x0c, 0xca, 0x34, 0xc8, 0x20,
2858 0x30, 0xd3, 0x20, 0x83, 0x10, 0x4c, 0x37, 0x06, 0xf0, 0x52, 0x10, 0x94,
2859 0x41, 0x86, 0x00, 0xca, 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0xc3, 0x19, 0xd0,
2860 0x01, 0x29, 0x5c, 0x00, 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x6f,
2861 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, 0xfc, 0x63, 0x83, 0x85, 0x22, 0x98,
2862 0x63, 0xb0, 0x82, 0x3c, 0xd8, 0x48, 0xd1, 0x06, 0x7a, 0xa0, 0x0a, 0xa8,
2863 0x40, 0x06, 0x17, 0xc0, 0x4b, 0x41, 0x50, 0x06, 0x19, 0x82, 0x8d, 0x0c,
2864 0x46, 0x0c, 0x8e, 0x23, 0x04, 0xc1, 0xc2, 0x3f, 0x36, 0x5b, 0x58, 0x82,
2865 0x39, 0x06, 0x23, 0x48, 0x83, 0x8d, 0x14, 0x73, 0x00, 0x0a, 0xb0, 0xe0,
2866 0x0a, 0x69, 0x70, 0x01, 0xbc, 0x14, 0x04, 0x65, 0x90, 0x21, 0x08, 0x03,
2867 0x35, 0x18, 0x31, 0x38, 0x8e, 0x10, 0x04, 0x0b, 0xff, 0xd8, 0x78, 0x21,
2868 0x0a, 0xe6, 0x18, 0x8c, 0xc0, 0x0d, 0x66, 0x09, 0x88, 0xe1, 0x88, 0xcf,
2869 0x0c, 0x02, 0xff, 0x98, 0x65, 0x18, 0x88, 0x60, 0xc4, 0xa0, 0x31, 0x42,
2870 0x10, 0x0c, 0xce, 0x20, 0x17, 0xf2, 0xe0, 0x0e, 0xf8, 0xc0, 0x0e, 0xe6,
2871 0xa0, 0x0e, 0xd4, 0x40, 0x0d, 0x6a, 0x61, 0x34, 0x21, 0x00, 0x46, 0x0c,
2872 0x1a, 0x23, 0x04, 0xc1, 0xe0, 0x0c, 0x76, 0x41, 0x0f, 0xf2, 0xc0, 0x0f,
2873 0xf0, 0xa0, 0x0e, 0xee, 0x80, 0x0d, 0xd8, 0xe0, 0x16, 0x46, 0x13, 0x02,
2874 0x60, 0x90, 0x21, 0x48, 0x03, 0x3b, 0x18, 0x64, 0x20, 0xd2, 0x40, 0x0e,
2875 0x06, 0x19, 0x04, 0x34, 0x90, 0x83, 0x41, 0x06, 0x21, 0x90, 0x83, 0x13,
2876 0x05, 0x78, 0x29, 0x08, 0xca, 0x20, 0x43, 0xf0, 0x06, 0x78, 0x60, 0x44,
2877 0x00, 0xfe, 0x1b, 0x19, 0x4c, 0x61, 0x16, 0xc6, 0xe1, 0x02, 0x78, 0x29,
2878 0x08, 0xca, 0x20, 0x43, 0x40, 0x07, 0x7d, 0x30, 0x62, 0x70, 0x1c, 0x21,
2879 0x08, 0x16, 0xfe, 0xb1, 0xbd, 0x43, 0x11, 0xcc, 0x31, 0xd4, 0x41, 0x80,
2880 0x0b, 0x1b, 0x29, 0x58, 0x21, 0x17, 0xd2, 0xe1, 0x1c, 0x46, 0xe1, 0x02,
2881 0x78, 0x29, 0x08, 0xca, 0x20, 0x43, 0xa0, 0x07, 0xa3, 0x30, 0x62, 0x70,
2882 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xd5, 0xc3, 0x12, 0xcc, 0x31, 0x18,
2883 0x01, 0x2a, 0x6c, 0xa4, 0x90, 0x85, 0x5f, 0x78, 0x87, 0x76, 0x40, 0x85,
2884 0x0b, 0xe0, 0xa5, 0x20, 0x28, 0x83, 0x0c, 0x01, 0x28, 0xa4, 0xc2, 0x88,
2885 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xb6, 0x0f, 0x51, 0x30, 0xc7,
2886 0x60, 0x04, 0xad, 0x30, 0x4b, 0x40, 0x0c, 0x74, 0x04, 0xa0, 0x10, 0x08,
2887 0x83, 0x48, 0x08, 0x73, 0x0c, 0x01, 0x2a, 0xb8, 0xc2, 0x88, 0xc1, 0x81,
2888 0xc4, 0x20, 0x58, 0xf8, 0x07, 0x44, 0x12, 0xc1, 0x2e, 0x58, 0xe0, 0x0b,
2889 0xe2, 0x9f, 0x41, 0x40, 0x0c, 0x19, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20,
2890 0x70, 0x87, 0x23, 0x1f, 0x10, 0x7d, 0xd8, 0x52, 0x10, 0xc7, 0x3e, 0x20,
2891 0xfc, 0xb0, 0xa5, 0x30, 0x8e, 0x7d, 0x40, 0xf8, 0x61, 0x4b, 0xc1, 0x1c,
2892 0xfd, 0x80, 0xf8, 0xc3, 0x96, 0x22, 0x3a, 0xfa, 0x01, 0xf1, 0x87, 0x2d,
2893 0xc5, 0x75, 0xf4, 0x03, 0xe2, 0x0f, 0x5b, 0x8a, 0xee, 0xe8, 0x07, 0xc4,
2894 0x1f, 0xb6, 0x14, 0x64, 0x70, 0xec, 0x03, 0xc2, 0x0f, 0x5b, 0x0a, 0x33,
2895 0x38, 0xf6, 0x01, 0xe1, 0x87, 0x2d, 0x45, 0x1b, 0x1c, 0xfd, 0x80, 0xf8,
2896 0xc3, 0x96, 0x42, 0x0e, 0x8e, 0x7e, 0x40, 0xfc, 0x61, 0x4b, 0x81, 0x07,
2897 0x47, 0x3f, 0x20, 0xfe, 0xb0, 0xa5, 0xf0, 0x83, 0xa3, 0x1f, 0x10, 0x7f,
2898 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xbe, 0x01, 0x00,
2899 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x4f, 0x00, 0x00,
2900 0x00, 0x54, 0xce, 0x00, 0xd0, 0x5a, 0x02, 0x45, 0x40, 0xef, 0x58, 0x03,
2901 0x10, 0x08, 0x23, 0x00, 0x34, 0xcf, 0x41, 0x40, 0x4e, 0x93, 0x06, 0x63,
2902 0x11, 0x40, 0x20, 0x1c, 0x04, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd,
2903 0x18, 0x81, 0x2c, 0xba, 0x3d, 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab,
2904 0xed, 0x37, 0x46, 0xd0, 0xc7, 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f,
2905 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81,
2906 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18,
2907 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf,
2908 0x18, 0x81, 0xce, 0x9a, 0x73, 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20,
2909 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30,
2910 0x03, 0x40, 0xc1, 0x0c, 0xc0, 0x0c, 0xc0, 0x1c, 0x44, 0x1d, 0xec, 0x41,
2911 0x1d, 0xf8, 0x01, 0x15, 0x33, 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d,
2912 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82,
2913 0xf8, 0x37, 0xd6, 0xc0, 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4,
2914 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f,
2915 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58,
2916 0x03, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80,
2917 0x20, 0xb8, 0xe6, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01,
2918 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35,
2919 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a,
2920 0xe2, 0x31, 0x0b, 0x06, 0x63, 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80,
2921 0x20, 0x8c, 0x87, 0x63, 0x00, 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83,
2922 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab,
2923 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d,
2924 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7,
2925 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3,
2926 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00,
2927 0x00, 0x1b, 0x06, 0x77, 0x68, 0x87, 0x57, 0xd8, 0x30, 0xb8, 0x43, 0x3b,
2928 0xd0, 0xc2, 0x86, 0xc1, 0x1d, 0xda, 0x21, 0x16, 0x36, 0x0c, 0xee, 0xd0,
2929 0x0e, 0xb2, 0xb0, 0x61, 0x70, 0x87, 0x76, 0x98, 0x85, 0x0d, 0x83, 0x3b,
2930 0xb4, 0x03, 0x2c, 0x6c, 0x18, 0xdc, 0xa1, 0x1d, 0x5a, 0x01, 0x00, 0x00,
2931 0x00, 0x7b, 0x18, 0xce, 0x20, 0x0e, 0x44, 0x81, 0x02, 0x60, 0x0c, 0x47,
2932 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xac, 0xc1,
2933 0x64, 0x06, 0x7b, 0x18, 0xd6, 0xa0, 0x0e, 0xec, 0x80, 0x02, 0x60, 0x8c,
2934 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x84, 0xc1, 0x2a, 0x0c, 0x23,
2935 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x5f, 0x2b, 0x04, 0x90, 0x05,
2936 0x10, 0xf8, 0x8f, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x7c, 0xad,
2937 0x10, 0x54, 0x36, 0x44, 0xe2, 0x6f, 0x51, 0x10, 0xfe, 0x36, 0x04, 0xe4,
2938 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x11, 0x06, 0xb2, 0x10,
2939 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x7c, 0xb4, 0x10, 0x4c,
2940 0x16, 0x4c, 0xe2, 0x3f, 0xc7, 0xd0, 0x2d, 0xa1, 0x30, 0xc8, 0x10, 0x78,
2941 0x73, 0x60, 0x43, 0x40, 0xfe, 0x83, 0x0c, 0x01, 0x18, 0xd0, 0xc1, 0x20,
2942 0x43, 0xc0, 0x07, 0x74, 0x30, 0x4b, 0x20, 0x0c, 0x54, 0x04, 0x42, 0xa0,
2943 0x0f, 0xc0, 0x1e, 0x86, 0x3e, 0x38, 0x05, 0x5b, 0xa0, 0x00, 0x18, 0xc3,
2944 0x11, 0x01, 0x1b, 0x38, 0xfe, 0x31, 0xcb, 0x30, 0x10, 0xc1, 0x20, 0x03,
2945 0x91, 0x06, 0x7c, 0xb0, 0x87, 0x21, 0x14, 0x56, 0xc1, 0x15, 0x28, 0x00,
2946 0xc6, 0x1e, 0x86, 0x51, 0x68, 0x85, 0x57, 0xa0, 0x00, 0x18, 0x23, 0x06,
2947 0x4a, 0x12, 0x83, 0x60, 0xe1, 0x1f, 0x9d, 0x39, 0x14, 0xdd, 0x31, 0x04,
2948 0x83, 0x0c, 0x01, 0x1b, 0x80, 0xc2, 0x20, 0x43, 0xb0, 0x80, 0xc2, 0x2c,
2949 0x01, 0x31, 0x50, 0x11, 0x08, 0x03, 0x26, 0x0c, 0x47, 0x84, 0x01, 0x1f,
2950 0x04, 0xfe, 0x31, 0xcb, 0x50, 0x4c, 0xc1, 0x1e, 0x06, 0x55, 0xa0, 0x05,
2951 0x72, 0xa0, 0x00, 0x18, 0xc3, 0x11, 0xc1, 0x1f, 0x04, 0xfe, 0x31, 0xcb,
2952 0x60, 0x1c, 0xc1, 0x20, 0x43, 0x61, 0x07, 0xa9, 0xb0, 0x87, 0xc1, 0x15,
2953 0x70, 0xa1, 0x1c, 0x28, 0x00, 0xc6, 0x1c, 0x83, 0x1d, 0x04, 0xba, 0x30,
2954 0xc8, 0x10, 0xdc, 0x01, 0x2b, 0x58, 0x50, 0x88, 0xff, 0x20, 0x43, 0x90,
2955 0x07, 0xad, 0x30, 0x4b, 0xd0, 0x06, 0x7b, 0x18, 0x68, 0xc1, 0x17, 0xd8,
2956 0x81, 0x02, 0x60, 0xec, 0x61, 0xb0, 0x05, 0x70, 0x68, 0x07, 0x0a, 0x80,
2957 0x31, 0xc8, 0x00, 0x85, 0x82, 0x2c, 0x8c, 0x18, 0x14, 0x47, 0x08, 0x82,
2958 0x41, 0xc6, 0x0f, 0xc4, 0x2c, 0x03, 0x22, 0x05, 0x63, 0x08, 0x12, 0x39,
2959 0x0c, 0x47, 0x04, 0xad, 0xa0, 0xf8, 0xc7, 0x2c, 0x83, 0x92, 0x04, 0x26,
2960 0xb4, 0x82, 0xf8, 0xcf, 0x12, 0x2c, 0x36, 0xb4, 0x02, 0xf8, 0x8f, 0x18,
2961 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0x22, 0x11, 0x58, 0xe0, 0x0a,
2962 0xe2, 0x3f, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0x95, 0x44,
2963 0xe0, 0x0a, 0xb3, 0x04, 0xcb, 0x40, 0x05, 0xa0, 0x24, 0x82, 0x32, 0xc7,
2964 0xa0, 0x0a, 0x01, 0x3b, 0x8c, 0x21, 0x6c, 0xe1, 0x30, 0x1c, 0x11, 0xd8,
2965 0x82, 0xe2, 0x1f, 0xb3, 0x0c, 0x0d, 0x13, 0x98, 0x60, 0x0b, 0xe2, 0x3f,
2966 0x4b, 0xe0, 0xd8, 0x60, 0x0b, 0xe0, 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08,
2967 0x16, 0xfe, 0x61, 0xad, 0x44, 0x60, 0xc1, 0x2d, 0x88, 0xff, 0x88, 0xc1,
2968 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0xe5, 0x12, 0xc1, 0x2d, 0xcc, 0x12,
2969 0x38, 0x03, 0x15, 0x80, 0xc2, 0x08, 0xcd, 0x1c, 0x43, 0x12, 0xa4, 0xc3,
2970 0x18, 0x02, 0x19, 0xa4, 0xc3, 0x70, 0x44, 0xf0, 0x0b, 0x8a, 0x7f, 0xcc,
2971 0x32, 0x40, 0x4f, 0x60, 0xc2, 0x2f, 0x88, 0xff, 0x2c, 0x41, 0x64, 0xc3,
2972 0x2f, 0x80, 0xff, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x45,
2973 0x13, 0x81, 0x05, 0xe0, 0x20, 0xfe, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60,
2974 0xe1, 0x1f, 0xd4, 0x4d, 0x04, 0xe0, 0x30, 0x4b, 0x10, 0x0d, 0x54, 0x00,
2975 0xca, 0x23, 0x40, 0x73, 0x0c, 0x49, 0x10, 0x0f, 0xb3, 0x04, 0xd2, 0x40,
2976 0x45, 0x20, 0x44, 0x7a, 0x70, 0x0c, 0x32, 0x04, 0xbf, 0x20, 0x0f, 0x73,
2977 0x0c, 0xbd, 0x00, 0x06, 0x21, 0x31, 0xc8, 0x10, 0xf8, 0xc2, 0x3c, 0xd8,
2978 0x10, 0x88, 0xff, 0x20, 0x43, 0x00, 0x0e, 0xf4, 0x30, 0x4b, 0xd0, 0x06,
2979 0xc3, 0x11, 0xb3, 0x60, 0x0e, 0x81, 0x7f, 0xcc, 0x32, 0x50, 0x60, 0x10,
2980 0x0c, 0x32, 0xd0, 0x41, 0x39, 0xe0, 0xc3, 0x1e, 0x86, 0x7e, 0x38, 0x89,
2981 0x9a, 0xa0, 0x00, 0x18, 0x7b, 0x18, 0xfe, 0x21, 0x25, 0x6c, 0x82, 0x02,
2982 0x60, 0xcc, 0x31, 0x9c, 0x43, 0xb0, 0x12, 0x83, 0x0c, 0x01, 0x3a, 0xf4,
2983 0x83, 0x05, 0x87, 0xf8, 0x0f, 0x32, 0x04, 0xea, 0xe0, 0x0f, 0x23, 0x06,
2984 0xc5, 0x11, 0x82, 0x60, 0x90, 0xa1, 0xc5, 0x31, 0xcb, 0xf0, 0x55, 0xc1,
2985 0x18, 0xc2, 0x00, 0x13, 0xc3, 0x11, 0xc1, 0x3f, 0x28, 0xfe, 0x31, 0xcb,
2986 0x70, 0x59, 0x81, 0x09, 0xff, 0x20, 0xfe, 0xb3, 0x04, 0xd8, 0x88, 0x81,
2987 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xd5, 0x16, 0xc3, 0x88, 0xc1, 0x71,
2988 0x84, 0x20, 0x58, 0xf8, 0x07, 0xf5, 0x16, 0x01, 0x48, 0x58, 0x00, 0x12,
2989 0xe2, 0x6f, 0x01, 0x48, 0x80, 0xff, 0x2c, 0x01, 0x36, 0x50, 0x01, 0x28,
2990 0x96, 0x70, 0xcd, 0x31, 0xc8, 0x43, 0x80, 0x13, 0x63, 0x08, 0x4c, 0x4b,
2991 0x0c, 0x47, 0x04, 0x28, 0xa1, 0xf8, 0xc7, 0x2c, 0x83, 0x96, 0x05, 0x26,
2992 0xa0, 0x84, 0xf8, 0xcf, 0x12, 0x6c, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60,
2993 0xe1, 0x1f, 0x96, 0x5d, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1,
2994 0x1f, 0x14, 0x5e, 0x04, 0x29, 0x61, 0x41, 0x4a, 0x88, 0xbf, 0x05, 0x29,
2995 0x01, 0xfe, 0xb3, 0x04, 0xdb, 0x40, 0x05, 0xa0, 0x64, 0x82, 0x36, 0xc7,
2996 0x90, 0x04, 0x35, 0x31, 0x86, 0x50, 0xd5, 0xc4, 0x70, 0x44, 0x10, 0x13,
2997 0x8a, 0x7f, 0xcc, 0x32, 0x74, 0x5c, 0x60, 0x42, 0x4c, 0x88, 0xff, 0x2c,
2998 0x81, 0x37, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xfd, 0xc5,
2999 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0x85, 0x46, 0x20,
3000 0x13, 0x16, 0xc8, 0x84, 0xf8, 0x5b, 0x20, 0x13, 0xe0, 0x3f, 0x4b, 0xe0,
3001 0x0d, 0x54, 0x00, 0x0a, 0x27, 0x74, 0x73, 0x0c, 0x49, 0xd0, 0x13, 0x23,
3002 0x06, 0xc8, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0xd2, 0x69, 0x04, 0x26, 0x41,
3003 0x12, 0x83, 0x0c, 0x01, 0x4a, 0xf0, 0xc4, 0x2c, 0xc1, 0x37, 0x50, 0x11,
3004 0xf8, 0x01, 0x25, 0x78, 0x83, 0x0c, 0x41, 0x4b, 0xf8, 0xc4, 0x2c, 0x41,
3005 0x1b, 0xcc, 0x32, 0x84, 0x41, 0x1b, 0xf0, 0xc3, 0x20, 0x43, 0x2f, 0xb8,
3006 0x44, 0x58, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xa8,
3007 0x11, 0x88, 0xc4, 0x1c, 0xc3, 0x4a, 0x04, 0x71, 0x31, 0x62, 0x70, 0x1c,
3008 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xa9, 0xc6, 0x30, 0x12, 0x73, 0x0c, 0x42,
3009 0x70, 0x16, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x1b, 0x6b,
3010 0x14, 0x24, 0x31, 0xc7, 0x20, 0x04, 0x68, 0x31, 0xc8, 0x10, 0xc8, 0x84,
3011 0x59, 0x0c, 0x32, 0x04, 0xe5, 0x60, 0x16, 0x7b, 0x18, 0xdc, 0x02, 0x2f,
3012 0x4c, 0x83, 0x02, 0x60, 0xec, 0x61, 0x80, 0x0b, 0xbd, 0x38, 0x0d, 0x0a,
3013 0x80, 0x31, 0xc7, 0x80, 0x13, 0x01, 0x5f, 0x0c, 0x32, 0x04, 0x39, 0xe1,
3014 0x16, 0x16, 0x24, 0xe2, 0x3f, 0xc8, 0x10, 0xec, 0xc4, 0x5b, 0x8c, 0x18,
3015 0x14, 0x47, 0x08, 0x82, 0x41, 0x96, 0x1b, 0xc7, 0x2c, 0x03, 0x1b, 0x88,
3016 0x41, 0x30, 0x86, 0x30, 0x84, 0xc6, 0x70, 0x44, 0x00, 0x17, 0x8a, 0x7f,
3017 0xcc, 0x32, 0x90, 0xc1, 0x18, 0x04, 0x26, 0xc0, 0x85, 0xf8, 0xcf, 0x12,
3018 0x94, 0xc1, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xe5, 0x1b,
3019 0xc3, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x05, 0x1e, 0x41,
3020 0x5c, 0x58, 0x10, 0x17, 0xe2, 0x6f, 0x41, 0x5c, 0x80, 0xff, 0x2c, 0x41,
3021 0x19, 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64, 0x30, 0xc7, 0x30, 0x16,
3022 0x41, 0x6a, 0x8c, 0x21, 0x30, 0x7e, 0x31, 0x1c, 0x11, 0xe4, 0x85, 0xe2,
3023 0x1f, 0xb3, 0x0c, 0x67, 0x60, 0x06, 0x81, 0x09, 0x79, 0x21, 0xfe, 0xb3,
3024 0x04, 0x68, 0x30, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0x9d,
3025 0xc7, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xa5, 0x47,
3026 0xa0, 0x17, 0x16, 0xe8, 0x85, 0xf8, 0x5b, 0xa0, 0x17, 0xe0, 0x3f, 0x4b,
3027 0x80, 0x06, 0x03, 0x15, 0x80, 0x62, 0x06, 0xc2, 0x19, 0xcc, 0x31, 0x24,
3028 0x81, 0x69, 0x8c, 0x21, 0x54, 0xa6, 0x31, 0x1c, 0x11, 0x88, 0x86, 0xe2,
3029 0x1f, 0xb3, 0x0c, 0x6a, 0x90, 0x06, 0x81, 0x09, 0xa2, 0x21, 0xfe, 0xb3,
3030 0x04, 0x6b, 0x30, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xc1,
3031 0xc7, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xc9, 0x47,
3032 0x30, 0x1a, 0x16, 0x8c, 0x86, 0xf8, 0x5b, 0x30, 0x1a, 0xe0, 0x3f, 0x4b,
3033 0xb0, 0x06, 0x03, 0x15, 0x80, 0x92, 0x06, 0x82, 0x1a, 0xcc, 0x31, 0x24,
3034 0x81, 0x6b, 0x8c, 0x18, 0x20, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xf8,
3035 0x11, 0xdc, 0x45, 0x5d, 0x0c, 0x32, 0x04, 0x79, 0xd1, 0x1a, 0xb3, 0x04,
3036 0x6c, 0x30, 0x50, 0x11, 0xf8, 0x41, 0x18, 0x08, 0x6b, 0x30, 0xc8, 0x10,
3037 0xf8, 0xc5, 0x6b, 0xcc, 0x12, 0xb4, 0xc1, 0x40, 0x4b, 0xc0, 0x23, 0x06,
3038 0x8f, 0x48, 0x3c, 0xf2, 0xc9, 0x02, 0x1b, 0xf0, 0x08, 0x18, 0x0c, 0xb4,
3039 0x04, 0x28, 0x62, 0xe8, 0x85, 0x64, 0x0e, 0x1f, 0xc1, 0x06, 0xfc, 0x02,
3040 0x06, 0x83, 0x0c, 0x81, 0x10, 0x1b, 0x19, 0x04, 0xc4, 0x00, 0x00, 0x00,
3041 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0x78, 0x87, 0x2d, 0x83,
3042 0x11, 0xc0, 0xc3, 0x96, 0x21, 0x0b, 0xe2, 0x61, 0xcb, 0xe0, 0x05, 0xf2,
3043 0xb0, 0x65, 0x00, 0x83, 0x60, 0x1e, 0xb6, 0x0c, 0x69, 0x10, 0xb8, 0xc3,
3044 0x96, 0xc1, 0x0d, 0x02, 0x7a, 0xd8, 0x32, 0xd4, 0x41, 0x50, 0x0f, 0x5b,
3045 0x86, 0x3b, 0x08, 0xe8, 0x61, 0xcb, 0xb0, 0x0e, 0x41, 0x3d, 0x6c, 0x19,
3046 0xda, 0x21, 0xa0, 0x87, 0x2d, 0x43, 0x5a, 0x04, 0xf5, 0xb0, 0x65, 0x58,
3047 0x8b, 0x80, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
3048 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00,
3049 0x00, 0x25, 0x00, 0x00, 0x00, 0x54, 0xce, 0x00, 0xd0, 0x5a, 0x02, 0x45,
3050 0x40, 0xef, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0x34, 0xcf, 0x41, 0x40,
3051 0x4e, 0xc3, 0x06, 0x04, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18,
3052 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc,
3053 0x00, 0x50, 0x31, 0x03, 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8,
3054 0x5f, 0xc6, 0xea, 0x97, 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d,
3055 0xee, 0xb8, 0xa7, 0xe2, 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37,
3056 0xd6, 0xb0, 0xce, 0x31, 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7,
3057 0xb1, 0x6a, 0x7f, 0x63, 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c,
3058 0x1b, 0xff, 0xc2, 0x98, 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c,
3059 0xfa, 0xbf, 0x2f, 0xd0, 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8,
3060 0x0b, 0x63, 0x0d, 0x73, 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3,
3061 0xbe, 0xc0, 0xe7, 0xac, 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7,
3062 0xd1, 0x0c, 0x47, 0x58, 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc,
3063 0x31, 0x24, 0x96, 0x18, 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe,
3064 0x83, 0x0c, 0x01, 0x23, 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8,
3065 0xc7, 0x2c, 0xc3, 0x90, 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c,
3066 0x03, 0x51, 0x04, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x1b,
3067 0x28, 0x7c, 0xce, 0x1c, 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x71, 0x84,
3068 0x20, 0x58, 0xf8, 0xc7, 0x26, 0x0a, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01,
3069 0x37, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0x91, 0xc2, 0x18,
3070 0x40, 0x73, 0x0c, 0x42, 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40,
3071 0x70, 0xc3, 0x18, 0x42, 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21,
3072 0x0c, 0x61, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xa1,
3073 0x82, 0x10, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x50, 0xa9,
3074 0x40, 0x04, 0xc3, 0x11, 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04,
3075 0x83, 0x0c, 0x87, 0x47, 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06,
3076 0xe0, 0x6f, 0xc5, 0x1a, 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04,
3077 0xe4, 0x3f, 0xc7, 0x20, 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0,
3078 0x06, 0x16, 0x20, 0xe2, 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12,
3079 0x1c, 0x03, 0x15, 0x81, 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9,
3080 0x20, 0x43, 0x90, 0x06, 0x6f, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16,
3081 0xfe, 0xb1, 0xe5, 0x42, 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2,
3082 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xb6, 0x0b, 0x43, 0x19,
3083 0xcc, 0x31, 0x08, 0x41, 0x1d, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85,
3084 0x7f, 0x6c, 0xbd, 0x50, 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c,
3085 0x41, 0x32, 0x50, 0x12, 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7,
3086 0x20, 0x43, 0x10, 0x07, 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00,
3087 0x00, 0x04, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xd2,
3088 0x09, 0x18, 0xd0, 0xba, 0x80, 0x07, 0xed, 0x0e, 0x00, 0x00, 0x00, 0x00,
3089 0x00, 0x65, 0x0c, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94,
3090 0x30, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00,
3091 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
3092 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
3093 0x00, 0x0d, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
3094 0x00, 0x27, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3095 0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
3096 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3097 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3098 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
3099 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00,
3100 0x00, 0x38, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
3101 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0x49, 0x00, 0x00,
3102 0x00, 0x14, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
3103 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x5d, 0x00, 0x00,
3104 0x00, 0x10, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
3105 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00,
3106 0x00, 0x11, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
3107 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00,
3108 0x00, 0x16, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
3109 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x94, 0x00, 0x00,
3110 0x00, 0x0d, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
3111 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xa1, 0x00, 0x00,
3112 0x00, 0x19, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00,
3113 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0xba, 0x00, 0x00,
3114 0x00, 0x11, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
3115 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xcb, 0x00, 0x00,
3116 0x00, 0x12, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
3117 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xdd, 0x00, 0x00,
3118 0x00, 0x13, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
3119 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xf0, 0x00, 0x00,
3120 0x00, 0x13, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
3121 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00,
3122 0x00, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00,
3123 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
3124 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94,
3125 0xa6, 0x02, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, 0x31,
3126 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a,
3127 0x31, 0x34, 0x47, 0x65, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43,
3128 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31,
3129 0x31, 0x4d, 0x54, 0x4c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74,
3130 0x4b, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e,
3131 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61,
3132 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66,
3133 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70,
3134 0x6f, 0x77, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61,
3135 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61,
3136 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75,
3137 0x2e, 0x69, 0x31, 0x2e, 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72,
3138 0x2e, 0x64, 0x6f, 0x74, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a,
3139 0x31, 0x32, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d,
3140 0x61, 0x70, 0x44, 0x76, 0x33, 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61,
3141 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78,
3142 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74,
3143 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69,
3144 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e,
3145 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73,
3146 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32,
3147 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74,
3148 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34,
3149 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34,
3150 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d,
3151 0x69, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69,
3152 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
3153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3154};
3155const unsigned int sdl_metallib_len = 37821;
diff --git a/SDL-3.2.8/src/render/metal/SDL_shaders_metal_macos.h b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_macos.h
new file mode 100644
index 0000000..e3c4230
--- /dev/null
+++ b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_macos.h
@@ -0,0 +1,2532 @@
1const unsigned char sdl_metallib[] = {
2 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x80, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
3 0x00, 0x00, 0x00, 0x00, 0x85, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00,
5 0x00, 0x00, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00,
7 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0xe5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x72, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
10 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f,
11 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54,
12 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00,
13 0x50, 0x0f, 0x81, 0xd3, 0x48, 0x9a, 0xd9, 0x04, 0x20, 0xa9, 0x3e, 0x02,
14 0x8a, 0x68, 0xb0, 0x30, 0x34, 0x06, 0x99, 0x69, 0x0c, 0x03, 0x74, 0x35,
15 0xb5, 0x66, 0x90, 0x7b, 0x6c, 0x3a, 0x14, 0x62, 0x4f, 0x46, 0x46, 0x54,
16 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00,
19 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x77, 0x00, 0x00, 0x00,
20 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f,
21 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59,
22 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xf0,
23 0x2e, 0x14, 0xc5, 0xee, 0x9f, 0xd5, 0xcc, 0x21, 0x55, 0xa5, 0x5b, 0xe0,
24 0x3c, 0xdf, 0x01, 0x52, 0xa7, 0x30, 0x4a, 0x99, 0xd1, 0xa8, 0x5f, 0x13,
25 0xe2, 0xf0, 0x62, 0x6a, 0x80, 0x37, 0xb7, 0x4f, 0x46, 0x46, 0x54, 0x18,
26 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
27 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
28 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
29 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x7a, 0x00, 0x00, 0x00, 0x4e,
30 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c,
31 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00,
32 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20,
33 0x00, 0x74, 0x71, 0x0b, 0x57, 0x4b, 0xa1, 0xa5, 0xee, 0x31, 0x5f, 0xf7,
34 0x98, 0x90, 0x9f, 0xc4, 0x0b, 0x72, 0x5f, 0x4b, 0xd5, 0x4b, 0xce, 0x85,
35 0x2b, 0x45, 0x6c, 0x7e, 0xdd, 0xa5, 0x54, 0x8e, 0xb0, 0x4f, 0x46, 0x46,
36 0x54, 0x18, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x00, 0x00, 0x00,
38 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08,
39 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00, 0x00,
40 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43,
41 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74,
42 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48,
43 0x20, 0x00, 0x83, 0x74, 0xe0, 0x68, 0x12, 0xd5, 0x8c, 0xd4, 0x71, 0xdb,
44 0xb9, 0x4c, 0x41, 0x85, 0x0e, 0x4d, 0x36, 0xf9, 0x66, 0x8d, 0x70, 0x81,
45 0x5b, 0xbb, 0xe9, 0x81, 0x42, 0xc5, 0x56, 0x6f, 0x27, 0xa3, 0x4f, 0x46,
46 0x46, 0x54, 0x18, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x23, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00,
49 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x78, 0x00,
50 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f,
51 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74,
52 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48,
53 0x20, 0x00, 0x3a, 0x25, 0xd4, 0xcc, 0x66, 0x7c, 0x15, 0x7f, 0xc4, 0x37,
54 0x91, 0x2a, 0xc4, 0x81, 0x61, 0xee, 0xdc, 0xcf, 0xd6, 0x25, 0x51, 0xcf,
55 0x14, 0x26, 0xf5, 0xe3, 0xb9, 0xd9, 0x21, 0x42, 0x05, 0x8e, 0x4f, 0x46,
56 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00,
59 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00,
60 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f,
61 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e,
62 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53,
63 0x48, 0x20, 0x00, 0x22, 0x61, 0x99, 0x75, 0x7e, 0x79, 0xc7, 0x29, 0xce,
64 0x24, 0x1e, 0x6f, 0x01, 0x62, 0x29, 0x3a, 0x12, 0xe8, 0xf8, 0xd8, 0xa5,
65 0xf2, 0x5e, 0x21, 0xb5, 0x28, 0x04, 0xc8, 0xf3, 0x8d, 0x60, 0xfb, 0x4f,
66 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x57, 0x00,
68 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01,
69 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x29,
70 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, 0x00, 0x02, 0x00, 0x70,
71 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f,
72 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, 0x54, 0x59, 0x04, 0x00,
73 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, 0x35, 0x00, 0x00, 0x00,
74 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, 0x70, 0x6f, 0x73, 0x69,
75 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
76 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00,
77 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, 0x03, 0x00, 0x04, 0x06,
78 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
79 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
80 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
81 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
82 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
83 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
84 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
85 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
86 0x00, 0xe8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
87 0xde, 0x21, 0x0c, 0x00, 0x00, 0xf7, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20,
88 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
89 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
90 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
91 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
92 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
93 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8,
94 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
95 0x00, 0x6a, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff,
96 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78,
97 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30,
98 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e,
99 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d,
100 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c,
101 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c,
102 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78,
103 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70,
104 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08,
105 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0,
106 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00,
107 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
108 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d,
109 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d,
110 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d,
111 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00,
112 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68,
113 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
114 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
115 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d,
116 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
117 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70,
118 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98,
119 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
120 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
121 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d,
122 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90,
123 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58,
124 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0,
125 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28,
126 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f,
127 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d,
128 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
129 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x18, 0xc2, 0x00, 0x2c, 0x40,
130 0xb5, 0xc1, 0x18, 0x08, 0x60, 0x01, 0x2a, 0x00, 0x00, 0x49, 0x18, 0x00,
131 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
132 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
133 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
134 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
135 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0,
136 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
137 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
138 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
139 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88,
140 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6,
141 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00,
142 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
143 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87,
144 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83,
145 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0,
146 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
147 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0,
148 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90,
149 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
150 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0,
151 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60,
152 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
153 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
154 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
155 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0,
156 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30,
157 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20,
158 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
159 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
160 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0,
161 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10,
162 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
163 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0,
164 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20,
165 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
166 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50,
167 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50,
168 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50,
169 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40,
170 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00,
171 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
172 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x41, 0x00, 0x00, 0x08, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00,
174 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
175 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x30, 0x02, 0x50, 0x80, 0x01, 0x45,
176 0x50, 0x20, 0x65, 0x50, 0x08, 0x05, 0x41, 0x6c, 0x04, 0x80, 0xd6, 0x58,
177 0xc2, 0x23, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xe4, 0x00, 0x00,
178 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32,
179 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x42, 0x24, 0xc0, 0xa2, 0x50,
180 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62,
181 0x28, 0x41, 0x22, 0x28, 0x07, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c,
182 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed,
183 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06,
184 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06,
185 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x90, 0x10, 0x43,
186 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36,
187 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x45, 0xe0, 0x16, 0x96, 0x26, 0xe7,
188 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6,
189 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36,
190 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70,
191 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74,
192 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x64, 0x61,
193 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95,
194 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9,
195 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89,
196 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a, 0x9c, 0x0b, 0xdc,
197 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0, 0x34, 0x39, 0x97,
198 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, 0xb7, 0xb0, 0xb6,
199 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64, 0xc2, 0xd2, 0xe4,
200 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca, 0x88, 0xc0, 0xbd,
201 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92, 0x27, 0x81, 0x92,
202 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5d, 0x99, 0x1c,
203 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0xad, 0xb3,
204 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, 0x9a, 0xb1, 0x37,
205 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14, 0x16, 0x63, 0x6f,
206 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04, 0x4a, 0xa2, 0x44,
207 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74,
208 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0x98,
209 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, 0xe9, 0x95, 0x0d, 0x51, 0x92,
210 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, 0x88, 0x91, 0x50, 0x09, 0x96,
211 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, 0xca, 0xe4, 0xe8, 0xca, 0xf0,
212 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0,
213 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95,
214 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, 0x0b, 0xa3, 0x2b, 0x23, 0x43,
215 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, 0x63, 0x0b, 0x1b, 0x2b, 0x43,
216 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, 0x4a, 0xa1, 0x61, 0xc6, 0xf6,
217 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, 0xc4, 0x4b, 0x3e, 0x45, 0x50,
218 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, 0x44, 0x4a, 0xa6, 0x21, 0x94,
219 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, 0x24, 0x60, 0x90, 0x40, 0x49,
220 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, 0xce, 0x45, 0xac, 0xce, 0xcc,
221 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, 0x8b, 0x58, 0x9d, 0x99, 0x59,
222 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x91, 0xb0, 0x34, 0x39, 0x17,
223 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67,
224 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xbc, 0xc2,
225 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xbe,
226 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x88, 0x98,
227 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, 0x50, 0x81, 0x93, 0x7b, 0x53,
228 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, 0x02, 0x06, 0x0a, 0x91, 0x90,
229 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, 0xa1, 0x04, 0x89, 0x19, 0x24,
230 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48,
231 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, 0x9b, 0x33, 0x7b, 0x93, 0x6b,
232 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c,
233 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28,
234 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, 0x1b, 0x0c, 0x41, 0x12, 0x31,
235 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, 0x86, 0x18, 0x08, 0x90, 0x74,
236 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, 0x83, 0x7b, 0xa3, 0x2b, 0x73,
237 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, 0x33, 0x95, 0xd6, 0x06, 0xc7,
238 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, 0x25, 0x14, 0x14, 0x34, 0x44,
239 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, 0x22, 0x07, 0x4c, 0x32, 0xc4,
240 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0x19, 0x11, 0xb1, 0x03, 0x3b, 0xd8,
241 0x43, 0x3b, 0xb8, 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94,
242 0x83, 0x1b, 0x98, 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21,
243 0x18, 0x46, 0x28, 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e,
244 0xe4, 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e,
245 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e,
246 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f,
247 0x6e, 0xc0, 0x0e, 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e,
248 0xe5, 0xf0, 0x0b, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e,
249 0xee, 0x30, 0x25, 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06,
250 0xe3, 0xf0, 0x0e, 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b,
251 0xef, 0x00, 0x0f, 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65,
252 0x50, 0x18, 0x67, 0x84, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f,
253 0xe5, 0x20, 0x0f, 0xf4, 0x50, 0x0e, 0xf8, 0x30, 0x25, 0x78, 0x03, 0x00,
254 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
255 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
256 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
257 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
258 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
259 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
260 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
261 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
262 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
263 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
264 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
265 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
266 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
267 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
268 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
269 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
270 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
271 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
272 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
273 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
274 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
275 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
276 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70,
277 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74,
278 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f,
279 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e,
280 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41,
281 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1,
282 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c,
283 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37,
284 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f,
285 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21,
286 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21,
287 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0,
288 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88,
289 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77,
290 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c,
291 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23,
292 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01,
293 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84,
294 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8,
295 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76,
296 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e,
297 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f,
298 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e,
299 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e,
300 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1,
301 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21,
302 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8,
303 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77,
304 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19,
305 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e,
306 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30,
307 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71,
308 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77,
309 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
310 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb1, 0x5d, 0xf9, 0xb3, 0xce,
311 0x82, 0x0c, 0x7f, 0x45, 0x44, 0x13, 0x71, 0x01, 0x00, 0x61, 0x20, 0x00,
312 0x00, 0x54, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00,
313 0x00, 0x0b, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6,
314 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88,
315 0x15, 0x41, 0x09, 0x94, 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14,
316 0x66, 0x00, 0x66, 0x00, 0x08, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0x1f,
317 0x00, 0xe3, 0x11, 0x8d, 0x94, 0x49, 0x14, 0x94, 0xf1, 0x08, 0x88, 0xda,
318 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x70, 0x34, 0x26, 0x04, 0xf2, 0x19, 0x8f,
319 0xa0, 0xb0, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, 0x8a, 0x64, 0x42, 0x20,
320 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x64, 0x1d, 0x19, 0x4c, 0x14, 0x94,
321 0x41, 0x06, 0xe6, 0xc1, 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1,
322 0x08, 0x4f, 0x0c, 0xd2, 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x94, 0x67,
323 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, 0x88, 0xc1, 0x19, 0xb8,
324 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0x34, 0x30, 0xb0, 0xa0, 0x92, 0xcf,
325 0x20, 0xc3, 0xb0, 0x8d, 0x81, 0x05, 0x93, 0x7c, 0x6c, 0x08, 0xe0, 0x33,
326 0xc8, 0x60, 0x78, 0x67, 0x60, 0x41, 0x24, 0x1f, 0x1b, 0x02, 0xf8, 0x0c,
327 0x32, 0x24, 0x61, 0xb0, 0x06, 0x16, 0x3c, 0xf2, 0xb1, 0x21, 0x80, 0xcf,
328 0x78, 0xc4, 0x1b, 0xd0, 0xc1, 0x1e, 0xa0, 0x01, 0x05, 0x65, 0x90, 0x21,
329 0x38, 0x83, 0x36, 0xb0, 0x40, 0x0c, 0xe4, 0x33, 0xc8, 0x30, 0xa0, 0x01,
330 0x1c, 0x58, 0x00, 0x06, 0xf2, 0x19, 0x64, 0x28, 0xd4, 0x60, 0x0e, 0x2c,
331 0xe8, 0xe4, 0x33, 0xc8, 0x70, 0xb0, 0x81, 0x1d, 0x58, 0xa0, 0xc9, 0x67,
332 0x90, 0x81, 0x0f, 0xe2, 0xa0, 0x0e, 0x2c, 0x0b, 0xe4, 0x33, 0xc8, 0xe0,
333 0x07, 0x73, 0x80, 0x07, 0xe6, 0x04, 0xf2, 0xb1, 0x64, 0x80, 0x8f, 0x05,
334 0x0c, 0x7c, 0x2c, 0x48, 0xe0, 0x63, 0x01, 0x02, 0x1f, 0x0b, 0x0a, 0xf8,
335 0xcc, 0x36, 0xe4, 0x41, 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36,
336 0x04, 0x78, 0x20, 0x64, 0x10, 0x10, 0x03, 0x00, 0x00, 0x09, 0x00, 0x00,
337 0x00, 0x5b, 0x86, 0x20, 0xa0, 0x83, 0x2d, 0xc3, 0x10, 0xd0, 0xc1, 0x96,
338 0xe1, 0x08, 0xe8, 0x60, 0xcb, 0xc0, 0x04, 0x74, 0xb0, 0x65, 0x88, 0x02,
339 0x3a, 0xd8, 0x32, 0x58, 0x01, 0x1d, 0x6c, 0x19, 0xc6, 0x20, 0xa0, 0x03,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
342 0x00, 0xf8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
343 0xde, 0x21, 0x0c, 0x00, 0x00, 0xfb, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20,
344 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
345 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
346 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
347 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
348 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
349 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8,
350 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
351 0x00, 0x6a, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff,
352 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78,
353 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30,
354 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e,
355 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d,
356 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c,
357 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c,
358 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78,
359 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70,
360 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08,
361 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0,
362 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00,
363 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
364 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d,
365 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d,
366 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d,
367 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00,
368 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68,
369 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
370 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
371 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d,
372 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
373 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70,
374 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98,
375 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
376 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
377 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d,
378 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90,
379 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58,
380 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0,
381 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28,
382 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f,
383 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d,
384 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
385 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x18, 0x02, 0x01, 0x2c, 0x40,
386 0xb5, 0xc1, 0x18, 0x0a, 0x60, 0x01, 0x2a, 0x00, 0x00, 0x49, 0x18, 0x00,
387 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
388 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
389 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
390 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
391 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00,
392 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
393 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
394 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
395 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c,
396 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4,
397 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00,
398 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
399 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87,
400 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83,
401 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0,
402 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
403 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0,
404 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90,
405 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
406 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0,
407 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60,
408 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
409 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
410 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
411 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0,
412 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30,
413 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20,
414 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
415 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
416 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0,
417 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10,
418 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
419 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0,
420 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20,
421 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
422 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50,
423 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50,
424 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50,
425 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40,
426 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00,
427 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
428 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x41, 0x00, 0x00, 0x08, 0x00,
429 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00,
430 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
431 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x50, 0x04, 0x23, 0x00, 0x05, 0x18,
432 0x50, 0x08, 0x65, 0x50, 0x20, 0x05, 0x41, 0x6c, 0x04, 0x80, 0xd6, 0x58,
433 0xc2, 0x23, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xea, 0x00, 0x00,
434 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32,
435 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x22, 0x24, 0xc0, 0xa2, 0x50,
436 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62,
437 0x28, 0x41, 0x22, 0x28, 0x05, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c,
438 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed,
439 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06,
440 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06,
441 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x90, 0x10, 0x43,
442 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36,
443 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x65, 0xe0, 0x16, 0x96, 0x26, 0xe7,
444 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6,
445 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36,
446 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70,
447 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74,
448 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x64, 0x61,
449 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95,
450 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9,
451 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89,
452 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a, 0x9c, 0x0b, 0xdc,
453 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0, 0x34, 0x39, 0x97,
454 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f, 0xb7, 0xb0, 0xb6,
455 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64, 0xc2, 0xd2, 0xe4,
456 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca, 0x88, 0xc0, 0xbd,
457 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92, 0x27, 0x81, 0x92,
458 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5d, 0x99, 0x1c,
459 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0xad, 0xb3,
460 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94, 0x9a, 0xb1, 0x37,
461 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14, 0x16, 0x63, 0x6f,
462 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04, 0x4a, 0xa2, 0x44,
463 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
464 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76,
465 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0x64, 0x88,
466 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x0d, 0x61, 0x92, 0x2a,
467 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, 0x86, 0x18, 0x09, 0x95, 0x60,
468 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c,
469 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0x52, 0x58, 0x9a, 0x9c, 0x0b,
470 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0x57, 0x9a, 0x1b, 0x59,
471 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32,
472 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, 0x38, 0xb6, 0xb0, 0xb1, 0x32,
473 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, 0xaf, 0x94, 0x21, 0x94, 0x32,
474 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, 0x60, 0x90, 0x40, 0x89, 0x96,
475 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, 0x4b, 0x3e, 0x25, 0x50, 0x82,
476 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, 0xb9, 0x86, 0x50, 0x8a, 0x90,
477 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, 0x41, 0x02, 0x25, 0x5a, 0x22,
478 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a, 0x33, 0xb3, 0x32,
479 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
480 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, 0xca,
481 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d, 0x7d, 0xd1,
482 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, 0x0a, 0x4b, 0x93,
483 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x0a, 0x63,
484 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x23, 0x62, 0xc6, 0xf6,
485 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, 0x4e, 0xee, 0x4d, 0xad, 0x6c,
486 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, 0x28, 0x46, 0x42, 0x06, 0x49,
487 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81,
488 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6a,
489 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, 0xec, 0x4d, 0xae, 0x6d, 0x08,
490 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x86,
491 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09,
492 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, 0x44, 0x49, 0xc2, 0x20, 0x11,
493 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, 0x60, 0x88, 0x81, 0x00, 0x49,
494 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32,
495 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70,
496 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43,
497 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, 0x24, 0x72, 0xc0, 0x24, 0x43,
498 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x92, 0x11, 0x11, 0x3b, 0xb0, 0x83,
499 0x3d, 0xb4, 0x83, 0x1b, 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43,
500 0x39, 0xb8, 0x81, 0x39, 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11,
501 0x82, 0x61, 0x84, 0xc2, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9,
502 0x40, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1,
503 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9,
504 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2,
505 0xe0, 0x06, 0xec, 0x10, 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7,
506 0x50, 0x0e, 0xbf, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef,
507 0xe0, 0x0e, 0x53, 0x02, 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e,
508 0x30, 0x0e, 0xef, 0xd0, 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf,
509 0xf0, 0x0e, 0xf0, 0x40, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53,
510 0x06, 0x85, 0x71, 0x46, 0x28, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6,
511 0x50, 0x0e, 0xf2, 0x40, 0x0f, 0xe5, 0x80, 0x0f, 0x53, 0x82, 0x37, 0x00,
512 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
513 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
514 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
515 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
516 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
517 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
518 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
519 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
520 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
521 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
522 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
523 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
524 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
525 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
526 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
527 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
528 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
529 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
530 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
531 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
532 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
533 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
534 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70,
535 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74,
536 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f,
537 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e,
538 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41,
539 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1,
540 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c,
541 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37,
542 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f,
543 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21,
544 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21,
545 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0,
546 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88,
547 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77,
548 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c,
549 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23,
550 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01,
551 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84,
552 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8,
553 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76,
554 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e,
555 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f,
556 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e,
557 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e,
558 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1,
559 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21,
560 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8,
561 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77,
562 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19,
563 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e,
564 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30,
565 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71,
566 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77,
567 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
568 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0xf0, 0xb0, 0x5d, 0xf9, 0x73, 0xce,
569 0x83, 0xfd, 0x15, 0x11, 0x4d, 0xc4, 0x05, 0x00, 0x00, 0x61, 0x20, 0x00,
570 0x00, 0x52, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00,
571 0x00, 0x09, 0x00, 0x00, 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6,
572 0x22, 0x04, 0x41, 0x10, 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88,
573 0x95, 0x40, 0x19, 0x14, 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14,
574 0x66, 0x00, 0x66, 0x00, 0x00, 0xe3, 0x11, 0x8c, 0x84, 0x49, 0x14, 0x94,
575 0xf1, 0x88, 0x87, 0xd2, 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x60, 0x30, 0x26,
576 0x04, 0xf2, 0x19, 0x8f, 0x98, 0x30, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c,
577 0x49, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x60, 0xdd,
578 0x18, 0x40, 0x14, 0x94, 0x41, 0x06, 0xc6, 0xb9, 0x4c, 0x08, 0xe4, 0x63,
579 0x45, 0x00, 0x9f, 0xf1, 0x88, 0x4e, 0x0c, 0xd0, 0xc0, 0xa2, 0xa0, 0x0c,
580 0x32, 0x44, 0x53, 0x67, 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47,
581 0x84, 0xc1, 0x19, 0xb4, 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0xb2, 0xcf,
582 0x82, 0x4a, 0x3e, 0x83, 0x0c, 0x83, 0x26, 0x06, 0x16, 0x4c, 0xf2, 0xb1,
583 0x21, 0x80, 0xcf, 0x20, 0x83, 0xd1, 0x99, 0x81, 0x05, 0x91, 0x7c, 0x6c,
584 0x08, 0xe0, 0x33, 0xc8, 0x90, 0x80, 0x81, 0x1a, 0x58, 0xf0, 0xc8, 0xc7,
585 0x86, 0x00, 0x3e, 0xe3, 0x11, 0x6e, 0x40, 0x07, 0x7a, 0x80, 0x06, 0x14,
586 0x94, 0x41, 0x86, 0xc0, 0x0c, 0xd8, 0xc0, 0x02, 0x31, 0x90, 0xcf, 0x20,
587 0xc3, 0x70, 0x06, 0x6f, 0x60, 0x01, 0x18, 0xc8, 0x67, 0x90, 0xa1, 0x48,
588 0x03, 0x39, 0xb0, 0xa0, 0x93, 0xcf, 0x20, 0xc3, 0xb1, 0x06, 0x75, 0x60,
589 0x81, 0x26, 0x9f, 0x41, 0x06, 0x3e, 0x78, 0x03, 0x3a, 0xb0, 0x2c, 0x90,
590 0xcf, 0x20, 0x83, 0x1f, 0xc4, 0xc1, 0x1d, 0x98, 0x13, 0xc8, 0xc7, 0x92,
591 0x01, 0x3e, 0x16, 0x30, 0xf0, 0xb1, 0x20, 0x81, 0x8f, 0x05, 0x08, 0x7c,
592 0x2c, 0x28, 0xe0, 0x33, 0xdb, 0x90, 0x07, 0x01, 0x30, 0xdb, 0x10, 0x94,
593 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, 0x00,
594 0x00, 0x09, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0xa0, 0x83, 0x2d, 0xc3,
595 0x10, 0xd0, 0xc1, 0x96, 0xe1, 0x08, 0xe8, 0x60, 0xcb, 0xc0, 0x04, 0x74,
596 0xb0, 0x65, 0x88, 0x02, 0x3a, 0xd8, 0x32, 0x58, 0x01, 0x1d, 0x6c, 0x19,
597 0xc6, 0x20, 0xa0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
598 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
599 0x00, 0x14, 0x00, 0x00, 0x00, 0x98, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xff,
600 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xe3, 0x02, 0x00,
601 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
602 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
603 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
604 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32,
605 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90,
606 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8,
607 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00,
608 0x00, 0x51, 0x18, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24,
609 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x8a, 0x08, 0x07, 0x78,
610 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77,
611 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a,
612 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21,
613 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1,
614 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0,
615 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c,
616 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76,
617 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
618 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
619 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
620 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
621 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1,
622 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1,
623 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1,
624 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79,
625 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77,
626 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
627 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
628 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0,
629 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
630 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79,
631 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72,
632 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
633 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
634 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01,
635 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
636 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a,
637 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a,
638 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
639 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d,
640 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1,
641 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
642 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x18,
643 0xc2, 0x00, 0x2c, 0x40, 0x05, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00,
644 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00,
645 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4,
646 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88,
647 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04,
648 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e,
649 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00,
650 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03,
651 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08,
652 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00,
653 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
654 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87,
655 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83,
656 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0,
657 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
658 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0,
659 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90,
660 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
661 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0,
662 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60,
663 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
664 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
665 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
666 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0,
667 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30,
668 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20,
669 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
670 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
671 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0,
672 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10,
673 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
674 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0,
675 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20,
676 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
677 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50,
678 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50,
679 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50,
680 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40,
681 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00,
682 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
683 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x31, 0x00, 0x00, 0x08, 0x00,
684 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00,
685 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
686 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, 0x28, 0x81, 0x22, 0x28,
687 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0xc2,
688 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, 0x29, 0x94, 0x82, 0xa1,
689 0x1c, 0x4b, 0x78, 0x04, 0x00, 0x79, 0x18, 0x00, 0x00, 0x13, 0x01, 0x00,
690 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32,
691 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, 0x1c, 0x40, 0x42, 0x51,
692 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62,
693 0x20, 0xc3, 0x21, 0x20, 0x02, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c,
694 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed,
695 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06,
696 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06,
697 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x70, 0x10, 0x43,
698 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36,
699 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, 0x16, 0x96, 0x26, 0xe7,
700 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6,
701 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36,
702 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70,
703 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74,
704 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x63, 0x61,
705 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95,
706 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9,
707 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89,
708 0xb1, 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c,
709 0x99, 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d,
710 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8,
711 0xb2, 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74,
712 0x34, 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, 0xa2, 0x21, 0xc2, 0x21,
713 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73,
714 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, 0x76, 0x56, 0xe6, 0x56,
715 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, 0xf7, 0x36, 0x97, 0x46,
716 0x97, 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0x25, 0x2c,
717 0x4d, 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, 0x8e, 0x4f, 0x58, 0x9a,
718 0x9c, 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, 0x18, 0x5d, 0x9a, 0x5d,
719 0x19, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x32, 0x61, 0x69, 0x72,
720 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde,
721 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, 0x48, 0x70, 0x50, 0x47,
722 0x75, 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, 0x87, 0x46, 0xeb, 0xac,
723 0xcc, 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, 0xa5, 0x66, 0xec, 0x8d,
724 0xed, 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, 0x85, 0xc5, 0xd8, 0x1b,
725 0xdb, 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, 0xe0, 0x0e, 0xeb, 0xb8,
726 0x0e, 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x88,
727 0xd5, 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, 0x93, 0x73, 0x11, 0xab,
728 0x33, 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xa3, 0x14, 0x96,
729 0x26, 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, 0xf6, 0xe6, 0xf6, 0x95,
730 0xe6, 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, 0xce, 0x45, 0xae, 0x2c,
731 0x8c, 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, 0x9d, 0x5c, 0xdd, 0x18,
732 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, 0x9b, 0xd9, 0x1b, 0x0b,
733 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f,
734 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, 0xca, 0xf0, 0xe8, 0xea,
735 0xe4, 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, 0xa4, 0xb9, 0xc1, 0xd5,
736 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, 0x7b, 0x63, 0x7b, 0x93,
737 0xfb, 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, 0xf7, 0xe6, 0x56, 0xd6,
738 0x16, 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0xc6, 0x87, 0xee,
739 0xcd, 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, 0x6c, 0x8c, 0xee, 0x4d,
740 0x2e, 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x97, 0x59,
741 0xd8, 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, 0x32, 0xb9, 0xaf, 0x3b,
742 0xb4, 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, 0x37, 0xba, 0x21, 0xb0,
743 0x80, 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x65, 0x80, 0x08, 0x88,
744 0x80, 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, 0x88, 0x80, 0x04, 0x07,
745 0x19, 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x68,
746 0x80, 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x69, 0x80, 0x24, 0x88,
747 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, 0x88, 0x80, 0x04, 0x07,
748 0x19, 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6c,
749 0xc0, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f,
750 0xae, 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, 0x58, 0x9a, 0x9c, 0x4b,
751 0x98, 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x18, 0x5b, 0xda,
752 0x99, 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, 0x29, 0xb4, 0x30, 0xb2,
753 0x32, 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x06,
754 0x63, 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, 0x03, 0xc4, 0x38, 0xc2,
755 0x00, 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, 0x8e, 0x36, 0x38, 0xdc,
756 0x00, 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, 0xe0, 0xe0, 0xc8, 0x8e,
757 0x38, 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, 0x30, 0xc4, 0x30, 0x80,
758 0x63, 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14,
759 0x5a, 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b,
760 0xdd, 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37,
761 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c,
762 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84,
763 0xe3, 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, 0xa0, 0x34, 0x43, 0x8c,
764 0x83, 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, 0x70, 0xd4, 0xc1, 0xa1,
765 0x07, 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, 0xa0, 0x40, 0x87, 0x1e,
766 0x28, 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, 0x22, 0x1d, 0x7a, 0xa0,
767 0x4c, 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, 0x83, 0x43, 0x0f, 0x14,
768 0x67, 0x44, 0xc4, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xed, 0xf0,
769 0x0e, 0xe4, 0x50, 0x0f, 0xec, 0x50, 0x0e, 0x6e, 0x60, 0x0e, 0xec, 0x10,
770 0x0e, 0xe7, 0x30, 0x0f, 0x53, 0x84, 0x60, 0x18, 0xa1, 0xb0, 0x03, 0x3b,
771 0xd8, 0x43, 0x3b, 0xb8, 0x41, 0x3a, 0x90, 0x43, 0x39, 0xb8, 0x03, 0x3d,
772 0x4c, 0x09, 0x8a, 0x11, 0x4b, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x81, 0x3d,
773 0x94, 0x83, 0x3c, 0xcc, 0x43, 0x3a, 0xbc, 0x83, 0x3b, 0x4c, 0x09, 0x8c,
774 0x11, 0x54, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x01, 0x3b, 0x84, 0x83, 0x3b,
775 0x9c, 0x43, 0x3d, 0x84, 0xc3, 0x39, 0x94, 0xc3, 0x2f, 0xd8, 0x43, 0x39,
776 0xc8, 0xc3, 0x3c, 0xa4, 0xc3, 0x3b, 0xb8, 0xc3, 0x94, 0x00, 0x19, 0x31,
777 0x85, 0x43, 0x3a, 0xc8, 0x83, 0x1b, 0x8c, 0xc3, 0x3b, 0xb4, 0x03, 0x3c,
778 0xa4, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x03, 0x3c, 0xd0, 0x43, 0x3a,
779 0xbc, 0x83, 0x3b, 0xcc, 0xc3, 0x94, 0x41, 0x61, 0x9c, 0x11, 0x4c, 0x38,
780 0xa4, 0x83, 0x3c, 0xb8, 0x81, 0x39, 0xc8, 0x43, 0x38, 0x9c, 0x43, 0x3b,
781 0x94, 0x83, 0x3b, 0xd0, 0xc3, 0x94, 0x80, 0x0e, 0x00, 0x79, 0x18, 0x00,
782 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
783 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
784 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
785 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
786 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
787 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
788 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
789 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
790 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
791 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
792 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
793 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
794 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
795 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
796 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
797 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
798 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
799 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
800 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
801 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
802 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
803 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
804 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
805 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
806 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
807 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
808 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
809 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
810 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
811 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
812 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
813 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
814 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
815 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
816 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
817 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
818 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
819 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
820 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
821 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
822 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
823 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
824 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
825 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
826 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
827 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
828 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
829 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
830 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
831 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
832 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
833 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
834 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
835 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
836 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
837 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00,
838 0x00, 0x06, 0x20, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x11,
839 0x01, 0x06, 0x43, 0x34, 0x13, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
840 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00,
841 0x00, 0x06, 0x00, 0x00, 0x00, 0xd4, 0x73, 0x10, 0x41, 0x10, 0x68, 0x84,
842 0x65, 0x30, 0x03, 0x40, 0x3c, 0x03, 0x40, 0x30, 0x46, 0x00, 0x82, 0x20,
843 0x88, 0x7f, 0x00, 0x00, 0x00, 0xe3, 0x0d, 0x06, 0x44, 0x50, 0x30, 0xe6,
844 0x18, 0x88, 0xc0, 0x1b, 0x64, 0x08, 0x0a, 0x64, 0x8e, 0x21, 0x28, 0x10,
845 0x0b, 0x18, 0xf9, 0x64, 0x10, 0x10, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00,
846 0x00, 0x5b, 0x86, 0x20, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17,
848 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x50, 0x18, 0x00,
849 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00,
850 0x00, 0x11, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00,
851 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04,
852 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08,
853 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b,
854 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44,
855 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21,
856 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6,
857 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0xe8, 0x00, 0x00,
858 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00,
859 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87,
860 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87,
861 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
862 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca,
863 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8,
864 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0,
865 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03,
866 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07,
867 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87,
868 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07,
869 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4,
870 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4,
871 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc,
872 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda,
873 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2,
874 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87,
875 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07,
876 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4,
877 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2,
878 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2,
879 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08,
880 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07,
881 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03,
882 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8,
883 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8,
884 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda,
885 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87,
886 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03,
887 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07,
888 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87,
889 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea,
890 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0,
891 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
892 0x7a, 0x28, 0x07, 0x60, 0x83, 0x21, 0x10, 0xc0, 0x02, 0x54, 0x1b, 0x8c,
893 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06,
894 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f,
895 0x18, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00,
896 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0,
897 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40,
898 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b,
899 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b,
900 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b,
901 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00,
902 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40,
903 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60,
904 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90,
905 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90,
906 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b,
907 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b,
908 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b,
909 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b,
910 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50,
911 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60,
912 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40,
913 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b,
914 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39,
915 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20,
916 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90,
917 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20,
918 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10,
919 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40,
920 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c,
921 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a,
922 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10,
923 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50,
924 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60,
925 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50,
926 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39,
927 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d,
928 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x40, 0x8e,
929 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, 0x80, 0x6a, 0x83, 0x81,
930 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0x80,
931 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, 0x20, 0x01, 0xd5, 0x06,
932 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0xc3, 0xc4,
933 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, 0x34, 0xb8, 0xc3, 0x3b,
934 0xb4, 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b,
935 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00,
936 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, 0x31, 0x21, 0x30, 0x26,
937 0x0c, 0x07, 0x92, 0x4c, 0x18, 0x14, 0x24, 0x99, 0x10, 0x2c, 0x13, 0x02,
938 0x06, 0x89, 0x20, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88,
939 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23,
940 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4,
941 0x4c, 0x10, 0x9c, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08,
942 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11,
943 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x80, 0x41, 0x84, 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc,
945 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00,
946 0x18, 0x44, 0x28, 0x82, 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25,
947 0x80, 0x79, 0x16, 0x22, 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10,
948 0xca, 0x11, 0x04, 0x81, 0x40, 0x18, 0x08, 0x25, 0xc3, 0x08, 0x03, 0x50,
949 0x88, 0x65, 0x59, 0x16, 0x62, 0xca, 0x00, 0x00, 0x00, 0x39, 0x45, 0x00,
950 0x00, 0x82, 0xca, 0x00, 0x2c, 0x0b, 0x49, 0xc5, 0x58, 0x16, 0x00, 0x00,
951 0x00, 0xa2, 0xca, 0xb0, 0x2c, 0x0b, 0x59, 0x45, 0x58, 0x16, 0xc2, 0xe6,
952 0x08, 0x82, 0x39, 0x02, 0x30, 0x18, 0x46, 0x10, 0xb6, 0x82, 0x04, 0x06,
953 0x22, 0x68, 0x9c, 0x06, 0x50, 0x37, 0x10, 0x90, 0x02, 0xdb, 0x1c, 0x01,
954 0x28, 0x0c, 0x22, 0x00, 0xc2, 0x14, 0xc0, 0x08, 0xc0, 0x30, 0xc2, 0xb0,
955 0x0d, 0x23, 0x10, 0x1b, 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0,
956 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68,
957 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80,
958 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5,
959 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
960 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78,
961 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a,
962 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76,
963 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a,
964 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76,
965 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d,
966 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
967 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
968 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a,
969 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72,
970 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d,
971 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
972 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74,
973 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a,
974 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79,
975 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72,
976 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71,
977 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6,
978 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a,
979 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76,
980 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76,
981 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71,
982 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71,
983 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74,
984 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78,
985 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x51,
986 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x34, 0x40,
987 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x61, 0x1e, 0x20, 0x00,
988 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30, 0x11, 0x10, 0x00, 0x02,
989 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x09, 0x08, 0x00, 0x01, 0x00,
990 0x00, 0x00, 0x00, 0x80, 0x21, 0x4c, 0x85, 0x00, 0xc3, 0x00, 0x00, 0x00,
991 0x10, 0x00, 0xc0, 0x10, 0xe6, 0x01, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00,
992 0x00, 0x60, 0x08, 0x73, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
993 0x30, 0x84, 0xc9, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
994 0xc2, 0x5c, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x61,
995 0x3c, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x40, 0x00,
996 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c,
997 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xda, 0x46, 0x00, 0x0a,
998 0xa1, 0x04, 0x8a, 0xa0, 0x20, 0x0a, 0xa8, 0x0c, 0x0a, 0xa3, 0x40, 0x0a,
999 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x28, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28,
1000 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x02, 0xc7, 0x12, 0x1e, 0x01,
1001 0x00, 0x79, 0x18, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c,
1002 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37,
1003 0xb7, 0x21, 0xc6, 0xe6, 0x7c, 0x00, 0x18, 0x80, 0x01, 0x95, 0xbb, 0x31,
1004 0xb4, 0x30, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0xb2, 0x21, 0xc6, 0xd6, 0x7c,
1005 0xc2, 0xc6, 0x30, 0x0e, 0x82, 0xe0, 0xe0, 0xd8, 0xca, 0x40, 0xda, 0xca,
1006 0xe8, 0xc2, 0xd8, 0x40, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x40,
1007 0x66, 0x64, 0x60, 0x64, 0x66, 0x5c, 0x68, 0x60, 0x68, 0x40, 0x50, 0xda,
1008 0xca, 0xe8, 0xc2, 0xd8, 0xcc, 0xca, 0x5a, 0x66, 0x64, 0x60, 0x64, 0x66,
1009 0x5c, 0x68, 0x60, 0x68, 0x52, 0x86, 0x08, 0x1f, 0x31, 0xc4, 0xd8, 0x9a,
1010 0xed, 0xd9, 0x16, 0x16, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x43, 0x90, 0xef,
1011 0xd8, 0x9a, 0xad, 0xd9, 0x16, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f,
1012 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d,
1013 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x2f,
1014 0x21, 0x17, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56,
1015 0xe6, 0x62, 0x16, 0x36, 0x47, 0xf7, 0xd5, 0x16, 0x46, 0x87, 0xf6, 0x55,
1016 0xe6, 0x16, 0x26, 0xc6, 0x56, 0x36, 0x44, 0xf8, 0x16, 0x96, 0x41, 0x58,
1017 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x99,
1018 0x5c, 0x58, 0x5b, 0x99, 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0x97, 0x59,
1019 0x19, 0xdd, 0x18, 0xda, 0x17, 0x59, 0xda, 0x5c, 0x98, 0x18, 0x5b, 0xd9,
1020 0x10, 0xe1, 0x6b, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91,
1021 0x95, 0xc9, 0x7d, 0xd1, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b,
1022 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72,
1023 0x0b, 0x6b, 0x2b, 0xa3, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04,
1024 0xf9, 0x9e, 0x6d, 0xf9, 0xa0, 0x2f, 0x1a, 0x22, 0x7c, 0x12, 0x99, 0xb0,
1025 0x34, 0x39, 0x17, 0xb8, 0xb7, 0xb9, 0x34, 0xba, 0xb4, 0x37, 0x37, 0x2a,
1026 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x94, 0xc2,
1027 0xd2, 0xe4, 0x5c, 0xdc, 0xde, 0xbe, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca,
1028 0xc6, 0xe8, 0xd2, 0xec, 0xca, 0xc8, 0x84, 0xa5, 0xc9, 0xb9, 0x84, 0xc9,
1029 0x9d, 0x7d, 0xb9, 0x85, 0xb5, 0x95, 0x11, 0x81, 0x7b, 0x9b, 0x4b, 0xa3,
1030 0x4b, 0x7b, 0x73, 0x1b, 0x02, 0x6d, 0xcb, 0x47, 0x7d, 0xd5, 0x67, 0x7d,
1031 0xd0, 0x17, 0x7d, 0xd7, 0x87, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93,
1032 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3,
1033 0xa3, 0x75, 0x56, 0xe6, 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x52,
1034 0x33, 0xf6, 0xc6, 0xf6, 0x26, 0x47, 0x64, 0x47, 0xf3, 0x65, 0x96, 0xc2,
1035 0x27, 0x2c, 0x4d, 0xce, 0x05, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, 0x8c,
1036 0x2e, 0xcd, 0xae, 0x8c, 0xc5, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x69,
1037 0x6b, 0x3e, 0xed, 0xdb, 0xbe, 0xea, 0xe3, 0x3e, 0xe8, 0x8b, 0xbe, 0xeb,
1038 0xeb, 0x98, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85, 0xd1, 0x95, 0x91, 0xa1,
1039 0xe0, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x11, 0xd9, 0xc9,
1040 0x7c, 0x99, 0xa5, 0xd0, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x93, 0x21, 0x42,
1041 0x57, 0x86, 0x37, 0xf6, 0xf6, 0x26, 0x47, 0x36, 0x44, 0xda, 0x9c, 0x4f,
1042 0xfb, 0xbe, 0xaf, 0xfa, 0xb8, 0x0f, 0xfa, 0xc0, 0xe0, 0xbb, 0xbe, 0x30,
1043 0xa0, 0x12, 0x96, 0x26, 0xe7, 0x22, 0x56, 0x67, 0x66, 0x56, 0x26, 0xc7,
1044 0x27, 0x2c, 0x4d, 0xce, 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0xee, 0x6b,
1045 0x2e, 0x4d, 0xaf, 0x8c, 0x52, 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58,
1046 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0x91,
1047 0xb0, 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x52, 0x61, 0x69, 0x72,
1048 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65,
1049 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0xc8,
1050 0xcc, 0x8d, 0x49, 0x1d, 0x09, 0x7d, 0xbd, 0xd5, 0xd1, 0xc1, 0xd5, 0xd1,
1051 0x91, 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0xfb, 0xa2, 0xcb, 0x83,
1052 0x2b, 0xa3, 0x92, 0xe6, 0x06, 0x57, 0x47, 0xf7, 0x45, 0x97, 0x07, 0x57,
1053 0xc6, 0x65, 0xec, 0x8d, 0xed, 0x4d, 0xee, 0x6b, 0x6e, 0x2c, 0x8c, 0xad,
1054 0x8c, 0x0e, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x57, 0x5b, 0x19,
1055 0x1d, 0xda, 0x1b, 0x19, 0x1f, 0xba, 0x37, 0xb7, 0xb2, 0xb6, 0x30, 0xb8,
1056 0x2f, 0xb3, 0xb0, 0x31, 0xba, 0x37, 0xb9, 0x18, 0x3e, 0x74, 0x6f, 0x6e,
1057 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32,
1058 0x7c, 0xe6, 0xc8, 0xe4, 0xbe, 0xee, 0xd0, 0xd2, 0xe8, 0xca, 0xbe, 0xe0,
1059 0xde, 0xd2, 0xdc, 0xe8, 0x86, 0xc0, 0xc2, 0xb6, 0x6c, 0xcc, 0xb6, 0x7c,
1060 0x68, 0xf0, 0xa5, 0xc1, 0xc6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xa9,
1061 0xc1, 0xf6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xad, 0xc1, 0x26, 0x6d,
1062 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xb1, 0xc1, 0x36, 0x6d, 0xcc, 0xb6, 0x7c,
1063 0x68, 0xf0, 0xb5, 0xc1, 0x46, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xb9,
1064 0xc1, 0x56, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xbd, 0xc1, 0x66, 0x6d,
1065 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xc1, 0x01, 0xa3, 0xb0, 0x34, 0x39, 0x97,
1066 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xb9, 0x34, 0xbd,
1067 0x32, 0x5e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79,
1068 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a,
1069 0x65, 0x7c, 0xa6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x86, 0xde, 0xdc, 0xe6,
1070 0xe8, 0xc2, 0xdc, 0xe8, 0xe6, 0x18, 0x8c, 0x0d, 0x21, 0x83, 0x2d, 0xfa,
1071 0xc6, 0xe0, 0x23, 0x83, 0x0d, 0xfa, 0xca, 0x60, 0x5b, 0xb6, 0xe6, 0x33,
1072 0x83, 0xef, 0x0c, 0xbe, 0x38, 0xf8, 0xe4, 0x60, 0x83, 0xbe, 0x39, 0xd8,
1073 0x98, 0x0f, 0xfa, 0xe8, 0xe0, 0xbb, 0xbe, 0x3a, 0xe0, 0x12, 0x96, 0x26,
1074 0xe7, 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x46, 0x25, 0x2c, 0x4d,
1075 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, 0x18, 0x5d, 0x19, 0x1e,
1076 0x5d, 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, 0xdb, 0x5b, 0x18, 0x1d,
1077 0x0b, 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x0f, 0x07, 0xba, 0x32,
1078 0xbc, 0x21, 0xd4, 0xc6, 0x7c, 0x77, 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd,
1079 0x87, 0x07, 0x1f, 0xf4, 0xe5, 0xc1, 0x77, 0x7d, 0x7a, 0xc0, 0x25, 0x2c,
1080 0x4d, 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc7, 0x5c,
1081 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x1c, 0x83, 0xb9, 0x21, 0xd2, 0x76, 0x7d,
1082 0x7c, 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x07, 0x7d, 0x7d, 0xf0, 0x5d,
1083 0x9f, 0x1f, 0x0c, 0x61, 0xbe, 0xec, 0xf3, 0x3e, 0x31, 0xf8, 0xec, 0xe0,
1084 0xdb, 0x83, 0xef, 0x0f, 0x86, 0x18, 0x0a, 0xf0, 0x4d, 0x1f, 0x28, 0x70,
1085 0x0c, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6,
1086 0xc6, 0xde, 0xe0, 0xca, 0xe6, 0x50, 0xa6, 0x88, 0x98, 0xbe, 0x86, 0xde,
1087 0xe0, 0xf2, 0xbe, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0x52,
1088 0x86, 0x10, 0xdf, 0x28, 0x7c, 0xa2, 0x40, 0x2c, 0x2c, 0x4d, 0xae, 0x25,
1089 0x8c, 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x85,
1090 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x6c, 0x6e, 0x88, 0xf1, 0x95, 0xc2,
1091 0x37, 0x0a, 0x1f, 0x29, 0x10, 0x0b, 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b,
1092 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x99, 0x0b, 0x6b,
1093 0x83, 0x63, 0x2b, 0x93, 0x9b, 0x1b, 0x62, 0x7c, 0xa7, 0xf0, 0x8d, 0xc2,
1094 0x67, 0x0a, 0x43, 0x88, 0xaf, 0x14, 0xbe, 0x53, 0x60, 0xf5, 0xa5, 0x45,
1095 0x35, 0x15, 0x53, 0x33, 0x85, 0x16, 0x46, 0x56, 0x26, 0x37, 0xf4, 0xe6,
1096 0x36, 0x47, 0x17, 0xe6, 0x46, 0x37, 0xc7, 0xe7, 0xad, 0xcd, 0x2d, 0x0d,
1097 0xee, 0x8d, 0xae, 0xcc, 0x8d, 0x0e, 0x64, 0x0c, 0x2d, 0x4c, 0x8e, 0xcf,
1098 0x54, 0x5a, 0x1b, 0x1c, 0x5b, 0x19, 0xc8, 0xd0, 0xca, 0x0a, 0x08, 0x95,
1099 0x50, 0x50, 0xd0, 0x10, 0xe1, 0x5b, 0x85, 0x21, 0xc6, 0xa7, 0x0a, 0x1f,
1100 0x2b, 0x84, 0x41, 0x36, 0xc4, 0xf8, 0xd0, 0xe0, 0x6b, 0x85, 0x30, 0xc8,
1101 0x86, 0x88, 0xc1, 0x97, 0x0a, 0x9f, 0x2b, 0x84, 0x41, 0xf6, 0xb9, 0x42,
1102 0x18, 0x68, 0x9f, 0x2b, 0x84, 0xc1, 0xf6, 0xb9, 0x42, 0x18, 0x70, 0x9f,
1103 0x2b, 0x84, 0x41, 0xf7, 0xb9, 0x42, 0x18, 0x78, 0x9f, 0x2b, 0x84, 0xc1,
1104 0xf7, 0xb9, 0x42, 0x18, 0x60, 0x43, 0x8c, 0xef, 0x15, 0x3e, 0x57, 0x08,
1105 0x83, 0x6d, 0x88, 0xf1, 0xbd, 0xc2, 0xe7, 0x0a, 0x61, 0x80, 0x0d, 0x31,
1106 0xbe, 0x57, 0xf8, 0x5c, 0x21, 0x0c, 0xba, 0x21, 0xc6, 0xf7, 0x0a, 0x9f,
1107 0x2b, 0x84, 0x81, 0x37, 0xc4, 0xf8, 0x5e, 0xe1, 0x73, 0x85, 0x30, 0xf8,
1108 0x86, 0x18, 0xdf, 0x2b, 0x7c, 0xae, 0x10, 0x06, 0xda, 0x10, 0xe3, 0x7b,
1109 0x85, 0xcf, 0x15, 0xc2, 0x80, 0x1b, 0x62, 0x7c, 0xaf, 0xf0, 0xb9, 0x42,
1110 0x18, 0x64, 0x23, 0x22, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
1111 0x87, 0x77, 0x20, 0x87, 0x7a, 0x60, 0x87, 0x72, 0x70, 0x03, 0x73, 0x60,
1112 0x87, 0x70, 0x38, 0x87, 0x79, 0x98, 0x22, 0x04, 0xc3, 0x08, 0x85, 0x1d,
1113 0xd8, 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xd2, 0x81, 0x1c, 0xca, 0xc1, 0x1d,
1114 0xe8, 0x61, 0x4a, 0x50, 0x8c, 0x58, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d,
1115 0xec, 0xa1, 0x1c, 0xe4, 0x61, 0x1e, 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x4a,
1116 0x60, 0x8c, 0xa0, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xd8, 0x21, 0x1c,
1117 0xdc, 0xe1, 0x1c, 0xea, 0x21, 0x1c, 0xce, 0xa1, 0x1c, 0x7e, 0xc1, 0x1e,
1118 0xca, 0x41, 0x1e, 0xe6, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0xa6, 0x04, 0xc8,
1119 0x88, 0x29, 0x1c, 0xd2, 0x41, 0x1e, 0xdc, 0x60, 0x1c, 0xde, 0xa1, 0x1d,
1120 0xe0, 0x21, 0x1d, 0xd8, 0xa1, 0x1c, 0x7e, 0xe1, 0x1d, 0xe0, 0x81, 0x1e,
1121 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x1e, 0xa6, 0x0c, 0x0a, 0xe3, 0x8c, 0x60,
1122 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xe1, 0x1c,
1123 0xda, 0xa1, 0x1c, 0xdc, 0x81, 0x1e, 0xa6, 0x04, 0xa1, 0x00, 0x00, 0x00,
1124 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
1125 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
1126 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
1127 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
1128 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
1129 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
1130 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
1131 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
1132 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
1133 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
1134 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
1135 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
1136 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
1137 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
1138 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
1139 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
1140 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
1141 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
1142 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
1143 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
1144 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
1145 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
1146 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70,
1147 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74,
1148 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f,
1149 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e,
1150 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41,
1151 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1,
1152 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c,
1153 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37,
1154 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f,
1155 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21,
1156 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21,
1157 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0,
1158 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88,
1159 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77,
1160 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c,
1161 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23,
1162 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01,
1163 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84,
1164 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8,
1165 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76,
1166 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e,
1167 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f,
1168 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e,
1169 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e,
1170 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1,
1171 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21,
1172 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8,
1173 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77,
1174 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19,
1175 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e,
1176 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30,
1177 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71,
1178 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77,
1179 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
1180 0x00, 0x2e, 0x00, 0x00, 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce,
1181 0x83, 0xfd, 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x56, 0x90, 0xfd, 0x73,
1182 0x6d, 0x6b, 0xcf, 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5,
1183 0xfd, 0x17, 0x45, 0x51, 0x14, 0x46, 0xd0, 0x00, 0x48, 0xe4, 0x0f, 0xce,
1184 0xe4, 0x57, 0x77, 0x71, 0xdb, 0xa6, 0xb0, 0x01, 0x48, 0xe4, 0x4b, 0x00,
1185 0xf3, 0x2c, 0xc4, 0x3f, 0x11, 0xd7, 0x44, 0x45, 0xc4, 0x6f, 0x0f, 0x7e,
1186 0x85, 0x17, 0xb7, 0x6d, 0x08, 0x13, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3,
1187 0x5f, 0x00, 0x81, 0xe4, 0x57, 0x77, 0x71, 0xdb, 0x16, 0x40, 0x01, 0x48,
1188 0xe4, 0x17, 0x80, 0x34, 0xfd, 0xc2, 0x02, 0x30, 0x8f, 0x5f, 0xdd, 0xc5,
1189 0x6d, 0x5b, 0xc2, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x17, 0x0c,
1190 0x70, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05,
1191 0x20, 0x4d, 0xff, 0xe3, 0x58, 0x7e, 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48,
1192 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x66,
1193 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e,
1194 0x71, 0xdb, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f,
1195 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1196 0x00, 0x99, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00,
1197 0x00, 0x51, 0x00, 0x00, 0x00, 0x64, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc,
1198 0x41, 0x2c, 0x8d, 0xd3, 0x06, 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81,
1199 0x40, 0xdc, 0x08, 0x00, 0x6d, 0xc5, 0x30, 0x03, 0x50, 0x0e, 0xa4, 0x8d,
1200 0x00, 0xd4, 0x00, 0x01, 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46,
1201 0xa0, 0xb3, 0xe6, 0x1c, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09,
1202 0x06, 0x63, 0x04, 0x20, 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30,
1203 0x03, 0x30, 0x03, 0x30, 0x07, 0x91, 0x0a, 0xaf, 0x90, 0x0a, 0x75, 0x40,
1204 0xcb, 0x0c, 0xc0, 0x08, 0xc0, 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20,
1205 0xfe, 0x81, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35,
1206 0xb0, 0xed, 0xfc, 0x93, 0x1e, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc,
1207 0x93, 0xde, 0x58, 0x03, 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2,
1208 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0,
1209 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39,
1210 0x18, 0x8c, 0x35, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b,
1211 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7,
1212 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82,
1213 0xc1, 0x58, 0x03, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1,
1214 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda,
1215 0x7f, 0x60, 0xc9, 0xb3, 0xf1, 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30,
1216 0xd6, 0xf0, 0xcf, 0xa4, 0xff, 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5,
1217 0x70, 0x1c, 0x83, 0xbe, 0x30, 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42,
1218 0xeb, 0x86, 0x3c, 0xef, 0x0b, 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18,
1219 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde,
1220 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2,
1221 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c,
1222 0xba, 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2,
1223 0xe8, 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08,
1224 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x4a, 0x11, 0x98, 0xc2, 0x1a,
1225 0xa8, 0x41, 0x1b, 0x80, 0x41, 0x19, 0x84, 0x41, 0x30, 0xde, 0xd0, 0x06,
1226 0x78, 0x30, 0x0a, 0x14, 0x8c, 0xe1, 0x86, 0x00, 0x0c, 0x82, 0x59, 0x86,
1227 0x40, 0x08, 0x06, 0x19, 0x08, 0x4f, 0x0d, 0xc6, 0x1b, 0xe2, 0x80, 0x0f,
1228 0xce, 0x80, 0x82, 0x31, 0x62, 0x40, 0x18, 0xc1, 0x2b, 0x0c, 0x23, 0x06,
1229 0x85, 0x11, 0xc4, 0x42, 0xb0, 0x59, 0xb0, 0xc1, 0x67, 0xc4, 0xa0, 0x30,
1230 0x82, 0x58, 0x08, 0xc0, 0xc0, 0x06, 0x4e, 0x3e, 0xc6, 0x05, 0xf1, 0xb1,
1231 0x21, 0xa0, 0xcf, 0x88, 0x01, 0x61, 0x04, 0xb6, 0x10, 0x8c, 0x18, 0x14,
1232 0x46, 0x80, 0x0b, 0x81, 0x67, 0x81, 0x27, 0x9f, 0x39, 0x06, 0x34, 0x58,
1233 0x6c, 0x61, 0x90, 0x21, 0x48, 0x83, 0x3c, 0xb0, 0x21, 0xa0, 0xcf, 0x20,
1234 0x43, 0xb0, 0x06, 0x7c, 0x30, 0xc8, 0x10, 0x54, 0x7e, 0x30, 0x4b, 0x20,
1235 0x0c, 0x54, 0x04, 0x42, 0xc0, 0x06, 0xc0, 0x78, 0xc3, 0x28, 0xb8, 0xc2,
1236 0x2e, 0x50, 0x30, 0x86, 0x1b, 0x02, 0xcd, 0x99, 0x65, 0x18, 0x88, 0x60,
1237 0x90, 0x81, 0xa0, 0x03, 0x50, 0x18, 0x6f, 0x38, 0x05, 0x59, 0xa0, 0x05,
1238 0x0a, 0xc6, 0x78, 0x43, 0x2a, 0xd0, 0x42, 0x28, 0x50, 0x30, 0x46, 0x0c,
1239 0x90, 0x23, 0x52, 0x87, 0xa2, 0x3b, 0x86, 0x60, 0x90, 0x21, 0xb8, 0x03,
1240 0x54, 0x18, 0x64, 0x08, 0x16, 0x55, 0x98, 0x25, 0x20, 0x06, 0x2a, 0x02,
1241 0x61, 0xc0, 0x84, 0xe1, 0x86, 0x30, 0x50, 0x83, 0x60, 0x96, 0xa1, 0x98,
1242 0x82, 0xf1, 0x06, 0x58, 0xd8, 0x85, 0x73, 0xa0, 0x60, 0x0c, 0x37, 0x04,
1243 0x6d, 0x10, 0xcc, 0x32, 0x18, 0x47, 0x30, 0xc8, 0x50, 0x84, 0x42, 0x2b,
1244 0x8c, 0x37, 0xd0, 0xc2, 0x2f, 0x9c, 0x03, 0x05, 0x63, 0x8e, 0x21, 0x14,
1245 0x82, 0x77, 0x18, 0x64, 0x08, 0x44, 0x41, 0x16, 0x2c, 0x28, 0xe4, 0x33,
1246 0xc8, 0x10, 0x90, 0x42, 0x2d, 0xcc, 0x12, 0xb4, 0xc1, 0x78, 0x83, 0x2e,
1247 0x94, 0xc3, 0x3c, 0x50, 0x30, 0xc6, 0x1b, 0x78, 0xe1, 0x1c, 0xde, 0x81,
1248 0x82, 0x31, 0xc8, 0x00, 0xb1, 0x82, 0x2e, 0x0c, 0x37, 0x10, 0x74, 0xe0,
1249 0xcc, 0x32, 0x20, 0x52, 0x30, 0x86, 0x20, 0xe5, 0xc3, 0x70, 0x43, 0xd0,
1250 0x07, 0xca, 0x2c, 0x83, 0x92, 0x04, 0x26, 0xfc, 0x81, 0x7c, 0x66, 0x09,
1251 0x16, 0x1b, 0x42, 0x01, 0x3e, 0x23, 0x06, 0x84, 0x11, 0x94, 0x44, 0x60,
1252 0x01, 0x2e, 0xc8, 0x67, 0xc4, 0xa0, 0x30, 0x02, 0x94, 0x08, 0x70, 0x61,
1253 0x96, 0x60, 0x19, 0xa8, 0x00, 0x94, 0x44, 0x50, 0xe6, 0x18, 0x6a, 0x21,
1254 0x08, 0x89, 0x31, 0x84, 0x0d, 0x24, 0x86, 0x1b, 0x02, 0x53, 0x50, 0x66,
1255 0x19, 0x1a, 0x26, 0x30, 0x01, 0x15, 0xe4, 0x33, 0x4b, 0xe0, 0xd8, 0xa0,
1256 0x0a, 0xf0, 0x19, 0x31, 0x20, 0x8c, 0xc0, 0x25, 0x02, 0x0b, 0xc2, 0x41,
1257 0x3e, 0x23, 0x06, 0x85, 0x11, 0xc4, 0x44, 0x10, 0x0e, 0xb3, 0x04, 0xce,
1258 0x40, 0x05, 0xa0, 0x30, 0x42, 0x33, 0xc7, 0x90, 0x04, 0x28, 0x31, 0x86,
1259 0x40, 0x06, 0x28, 0x31, 0xdc, 0x10, 0xbc, 0x82, 0x32, 0xcb, 0x00, 0x3d,
1260 0x81, 0x09, 0xb1, 0x20, 0x9f, 0x59, 0x82, 0xc8, 0x86, 0x59, 0x80, 0xcf,
1261 0x88, 0x01, 0x61, 0x04, 0x37, 0x11, 0x58, 0xa0, 0x0e, 0xf2, 0x19, 0x31,
1262 0x28, 0x8c, 0x40, 0x27, 0x02, 0x75, 0x98, 0x25, 0x88, 0x06, 0x2a, 0x00,
1263 0xe5, 0x11, 0xa0, 0x39, 0x86, 0x24, 0x80, 0x89, 0x59, 0x02, 0x69, 0xa0,
1264 0x22, 0x10, 0x22, 0x3d, 0x38, 0x06, 0x19, 0x02, 0x75, 0xb0, 0x87, 0x39,
1265 0x06, 0x74, 0x00, 0x03, 0x9b, 0x18, 0x64, 0x08, 0xd2, 0x21, 0x1f, 0x6c,
1266 0x08, 0xe4, 0x33, 0xc8, 0x10, 0xac, 0x03, 0x3f, 0xcc, 0x12, 0xb4, 0xc1,
1267 0x70, 0xc3, 0x2c, 0xc4, 0x43, 0x30, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8,
1268 0x40, 0x07, 0xf0, 0xc0, 0x0f, 0xe3, 0x0d, 0x23, 0xe1, 0x12, 0x3c, 0x41,
1269 0xc1, 0x18, 0x6f, 0x28, 0x09, 0x98, 0xc0, 0x09, 0x0a, 0xc6, 0x1c, 0x83,
1270 0x3c, 0x04, 0x60, 0x31, 0xc8, 0x10, 0xcc, 0xc3, 0x48, 0x58, 0x70, 0xc8,
1271 0x67, 0x90, 0x21, 0xa8, 0x07, 0x93, 0x18, 0x6e, 0x38, 0xc0, 0xc1, 0x99,
1272 0x65, 0xf8, 0xaa, 0x60, 0x0c, 0x61, 0x28, 0x8b, 0xe1, 0x86, 0x60, 0x1c,
1273 0x94, 0x59, 0x86, 0xcb, 0x0a, 0x4c, 0x28, 0x07, 0xf9, 0xcc, 0x12, 0x60,
1274 0x23, 0x06, 0x84, 0x11, 0xc0, 0xc5, 0x30, 0x62, 0x50, 0x18, 0x81, 0x5c,
1275 0x04, 0xe8, 0x60, 0x81, 0x3a, 0xc8, 0xc7, 0x02, 0x76, 0x80, 0xcf, 0x2c,
1276 0x01, 0x36, 0x50, 0x01, 0x28, 0x96, 0x70, 0xcd, 0x31, 0xf4, 0x43, 0xd0,
1277 0x16, 0x63, 0x08, 0x0c, 0x5b, 0x0c, 0x37, 0x04, 0xec, 0xa0, 0xcc, 0x32,
1278 0x68, 0x59, 0x60, 0x82, 0x3b, 0xc8, 0x67, 0x96, 0x60, 0x1b, 0x31, 0x20,
1279 0x8c, 0x20, 0x2f, 0x86, 0x11, 0x83, 0xc2, 0x08, 0xf6, 0x22, 0x88, 0x07,
1280 0x0b, 0xe6, 0x41, 0x3e, 0x16, 0xd4, 0x03, 0x7c, 0x66, 0x09, 0xb6, 0x81,
1281 0x0a, 0x40, 0xc9, 0x04, 0x6d, 0x8e, 0x21, 0x09, 0xe8, 0x62, 0x0c, 0xa1,
1282 0xa2, 0x8b, 0xe1, 0x86, 0xa0, 0x1e, 0x94, 0x59, 0x86, 0x8e, 0x0b, 0x4c,
1283 0xb8, 0x07, 0xf9, 0xcc, 0x12, 0x78, 0x23, 0x06, 0x84, 0x11, 0x88, 0xc6,
1284 0x30, 0x62, 0x50, 0x18, 0x01, 0x69, 0x04, 0xfa, 0x60, 0x01, 0x3f, 0xc8,
1285 0xc7, 0x02, 0x7f, 0x80, 0xcf, 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c,
1286 0xd0, 0xcd, 0x31, 0x24, 0x01, 0x5f, 0x8c, 0x18, 0x18, 0x46, 0xa0, 0x1a,
1287 0x41, 0x4c, 0xbc, 0xc4, 0x20, 0x43, 0x30, 0x13, 0x64, 0x31, 0x4b, 0xf0,
1288 0x0d, 0x54, 0x04, 0x7e, 0x40, 0x09, 0xde, 0x20, 0x43, 0x80, 0x13, 0x66,
1289 0x31, 0x4b, 0xd0, 0x06, 0xb3, 0x0c, 0x61, 0xd0, 0x06, 0xfc, 0x30, 0xc8,
1290 0xd0, 0x0b, 0x39, 0x51, 0x16, 0x23, 0x06, 0x85, 0x11, 0xb0, 0x46, 0xd0,
1291 0x12, 0x73, 0x0c, 0x36, 0x11, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xae,
1292 0x31, 0xb8, 0xc4, 0x1c, 0x83, 0x10, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04,
1293 0xb0, 0x51, 0xbc, 0xc4, 0x1c, 0x83, 0x10, 0x9c, 0xc6, 0x20, 0x43, 0xd0,
1294 0x13, 0x6e, 0x31, 0xc8, 0x10, 0x94, 0x03, 0x5c, 0x8c, 0x37, 0xd0, 0xc5,
1295 0x5f, 0xb4, 0x06, 0x05, 0x63, 0xbc, 0xc1, 0x2e, 0x42, 0x23, 0x35, 0x28,
1296 0x18, 0x73, 0x0c, 0x63, 0x11, 0xc4, 0xc6, 0x20, 0x43, 0x40, 0x16, 0x74,
1297 0x61, 0x41, 0x22, 0x9f, 0x41, 0x86, 0xc0, 0x2c, 0xee, 0x62, 0xb8, 0xe1,
1298 0x88, 0x09, 0x67, 0x96, 0x81, 0x0d, 0xc4, 0x20, 0x18, 0x43, 0x18, 0x6c,
1299 0x63, 0xb8, 0x21, 0xa0, 0x09, 0x65, 0x96, 0x81, 0x0c, 0xc6, 0x20, 0x30,
1300 0xc1, 0x26, 0xe4, 0x33, 0x4b, 0x50, 0x06, 0x23, 0x06, 0x84, 0x11, 0x84,
1301 0xc7, 0x30, 0x62, 0x50, 0x18, 0xc1, 0x78, 0x04, 0x39, 0x61, 0xc1, 0x4e,
1302 0xc8, 0xc7, 0x82, 0x9e, 0x80, 0xcf, 0x2c, 0x41, 0x19, 0x0c, 0x54, 0x00,
1303 0xca, 0x18, 0x08, 0x64, 0x30, 0xc7, 0xe0, 0x16, 0x81, 0x6f, 0x8c, 0x21,
1304 0x30, 0xbd, 0x31, 0xdc, 0x10, 0xf4, 0x84, 0x32, 0xcb, 0x70, 0x06, 0x66,
1305 0x10, 0x98, 0xf0, 0x13, 0xf2, 0x99, 0x25, 0x40, 0x83, 0x11, 0x03, 0xc2,
1306 0x08, 0xd4, 0x63, 0x18, 0x31, 0x28, 0x8c, 0x80, 0x3d, 0x02, 0xb1, 0xb0,
1307 0x80, 0x2c, 0xe4, 0x63, 0x81, 0x59, 0xc0, 0x67, 0x96, 0x00, 0x0d, 0x06,
1308 0x2a, 0x00, 0xc5, 0x0c, 0x84, 0x33, 0x98, 0x63, 0x48, 0x82, 0xf2, 0x18,
1309 0x43, 0xa8, 0xca, 0x63, 0xb8, 0x21, 0x30, 0x0b, 0x65, 0x96, 0x41, 0x0d,
1310 0xd2, 0x20, 0x30, 0x01, 0x2d, 0xe4, 0x33, 0x4b, 0xb0, 0x06, 0x23, 0x06,
1311 0x84, 0x11, 0xcc, 0xc7, 0x30, 0x62, 0x50, 0x18, 0x41, 0x7d, 0x04, 0x6b,
1312 0x61, 0x41, 0x5b, 0xc8, 0xc7, 0x82, 0xb7, 0x80, 0xcf, 0x2c, 0xc1, 0x1a,
1313 0x0c, 0x54, 0x00, 0x4a, 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xed,
1314 0x31, 0x62, 0x60, 0x18, 0xc1, 0x7e, 0x04, 0xa2, 0x01, 0x1a, 0x83, 0x0c,
1315 0x01, 0x69, 0xd4, 0xc6, 0x2c, 0x01, 0x1b, 0x0c, 0x54, 0x04, 0x7e, 0x10,
1316 0x06, 0xc2, 0x1a, 0x0c, 0x32, 0x04, 0xa9, 0x71, 0x1b, 0xb3, 0x04, 0x6d,
1317 0x30, 0xd0, 0x12, 0xf0, 0x88, 0xc1, 0x23, 0x12, 0x8f, 0x7c, 0xb2, 0xc0,
1318 0x06, 0x3c, 0x02, 0x06, 0x03, 0x2d, 0x01, 0x8a, 0x18, 0x7a, 0x21, 0x99,
1319 0xc3, 0x47, 0xb0, 0x81, 0xcc, 0x80, 0xc1, 0x20, 0x43, 0x20, 0xec, 0x86,
1320 0x05, 0xe1, 0x21, 0x9f, 0x0c, 0xc2, 0x81, 0x00, 0x00, 0x0d, 0x00, 0x00,
1321 0x00, 0xd7, 0xd2, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4,
1322 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d,
1323 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b,
1324 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71,
1325 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x13, 0x00, 0x00,
1326 0x00, 0x5b, 0x06, 0xe0, 0x40, 0x85, 0x2d, 0x83, 0x10, 0xc0, 0xc2, 0x96,
1327 0xe1, 0x08, 0x62, 0x61, 0xcb, 0xa0, 0x05, 0xb2, 0xb0, 0x65, 0xf8, 0x82,
1328 0x59, 0xd8, 0x32, 0x84, 0x41, 0x40, 0x0b, 0x5b, 0x06, 0x35, 0x08, 0x6a,
1329 0x61, 0xcb, 0xf0, 0x06, 0x81, 0x2d, 0x6c, 0x19, 0xec, 0x20, 0xb8, 0x85,
1330 0x2d, 0x03, 0x1e, 0x04, 0xb6, 0xb0, 0x65, 0x60, 0x87, 0xe0, 0x16, 0xb6,
1331 0x0c, 0xee, 0x10, 0xd8, 0xc2, 0x96, 0x41, 0x2d, 0x82, 0x5b, 0xd8, 0x32,
1332 0xb0, 0x45, 0x60, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1333 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00,
1334 0x00, 0x24, 0x00, 0x00, 0x00, 0x64, 0xce, 0x41, 0x2c, 0x8d, 0x93, 0x06,
1335 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdb, 0x0c, 0x00, 0x05,
1336 0x33, 0x00, 0xb4, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f,
1337 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e,
1338 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8,
1339 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd,
1340 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25,
1341 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f,
1342 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c,
1343 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2,
1344 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c,
1345 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82,
1346 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50,
1347 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xb5, 0xc1, 0x20,
1348 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96,
1349 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86,
1350 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0x40, 0x0f,
1351 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xe8, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x3e,
1352 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xa0, 0x83, 0x11, 0x83, 0xc2, 0x08, 0xfc,
1353 0x20, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xa8, 0x83, 0x59, 0x82, 0x62, 0xa0,
1354 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xf4, 0x60, 0x0c, 0x41, 0xc8,
1355 0x83, 0x31, 0x84, 0x21, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x10, 0x05, 0x21,
1356 0x18, 0x31, 0x28, 0x8c, 0x60, 0x14, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84,
1357 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03,
1358 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c,
1359 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x29, 0x0c, 0x32, 0x04,
1360 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d,
1361 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40,
1362 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x60,
1363 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0xa0, 0x15, 0x46, 0x0c, 0x0a,
1364 0x23, 0xa8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0xa0, 0x15, 0x46, 0x0c,
1365 0x0a, 0x23, 0xb8, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0xc0, 0x15, 0x66,
1366 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a,
1367 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
1370 0x00, 0x0c, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
1371 0xde, 0x21, 0x0c, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20,
1372 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
1373 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
1374 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45,
1375 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
1376 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
1377 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8,
1378 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
1379 0x00, 0xea, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff,
1380 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90,
1381 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68,
1382 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
1383 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d,
1384 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e,
1385 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d,
1386 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70,
1387 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48,
1388 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90,
1389 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70,
1390 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68,
1391 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
1392 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e,
1393 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c,
1394 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d,
1395 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
1396 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98,
1397 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
1398 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
1399 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e,
1400 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8,
1401 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38,
1402 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78,
1403 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0,
1404 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d,
1405 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d,
1406 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
1407 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18,
1408 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18,
1409 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30,
1410 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00,
1411 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c,
1412 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d,
1413 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x83, 0x21, 0x10, 0xc0,
1414 0x02, 0x54, 0x1b, 0x8c, 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06,
1415 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0x40, 0x80, 0x05, 0xa8, 0x36, 0x18, 0xc6,
1416 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x1b, 0x7c, 0xe4, 0xf8,
1417 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80,
1418 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18,
1419 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
1420 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d,
1421 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d,
1422 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e,
1423 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x3c, 0xb0, 0x03, 0x60, 0x70,
1424 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48,
1425 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90,
1426 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70,
1427 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68,
1428 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
1429 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e,
1430 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c,
1431 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d,
1432 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
1433 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98,
1434 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
1435 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
1436 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e,
1437 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8,
1438 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38,
1439 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78,
1440 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0,
1441 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d,
1442 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d,
1443 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
1444 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18,
1445 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18,
1446 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30,
1447 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00,
1448 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c,
1449 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d,
1450 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0x03, 0x82, 0xfc, 0xff,
1451 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, 0x04, 0x54, 0x1b, 0x8c, 0x24, 0x00,
1452 0x16, 0xa0, 0xda, 0x60, 0x28, 0x02, 0xb0, 0x00, 0xd5, 0x06, 0x64, 0xf9,
1453 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x36, 0x18, 0xcc,
1454 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x1b, 0xa6, 0xe6, 0xff,
1455 0xff, 0xff, 0xff, 0x07, 0x40, 0x01, 0xa4, 0xc1, 0x1d, 0xde, 0xa1, 0x0d,
1456 0xc4, 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21, 0x1d, 0xdc, 0x61, 0x1e,
1457 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x07, 0x00, 0x00,
1458 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42, 0x60, 0x4c, 0x08, 0x8e,
1459 0x09, 0x03, 0x92, 0x28, 0x13, 0x86, 0x25, 0x51, 0x26, 0x04, 0xcc, 0x84,
1460 0xa0, 0x01, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x4d, 0x00, 0x00,
1461 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4,
1462 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c,
1463 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xc8, 0xc1, 0x0c, 0xc0, 0x30, 0x02,
1464 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3,
1465 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10,
1466 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18,
1467 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6,
1468 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4,
1469 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50,
1470 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21,
1471 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29,
1472 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1,
1473 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a,
1474 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20,
1475 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48,
1476 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f,
1477 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44,
1478 0xb2, 0x34, 0x0f, 0x41, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa9, 0x0c, 0x00,
1479 0x00, 0x10, 0x55, 0x04, 0x00, 0x20, 0xab, 0x0c, 0x40, 0x51, 0x10, 0x56,
1480 0x8c, 0xa2, 0x00, 0x00, 0x00, 0x20, 0xad, 0x0c, 0x45, 0x51, 0x10, 0x57,
1481 0x84, 0xa2, 0x20, 0x6f, 0x8e, 0x00, 0x0c, 0xe6, 0x08, 0x82, 0x61, 0x04,
1482 0x01, 0x0c, 0x4a, 0x12, 0x34, 0x8f, 0x00, 0x86, 0x62, 0x08, 0xd0, 0x58,
1483 0x90, 0x60, 0x79, 0x84, 0x50, 0x0c, 0x01, 0x2a, 0x07, 0x02, 0x52, 0x00,
1484 0x1c, 0x46, 0x18, 0xc0, 0x60, 0x10, 0x21, 0x10, 0xe6, 0x08, 0x40, 0x61,
1485 0x10, 0xe1, 0x10, 0x06, 0x11, 0x0a, 0x61, 0x10, 0x01, 0x10, 0xa6, 0x00,
1486 0x46, 0x00, 0x86, 0x11, 0x08, 0x30, 0x00, 0x00, 0x00, 0x13, 0xb2, 0x70,
1487 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78,
1488 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87, 0x71, 0x78, 0x87, 0x79,
1489 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83, 0x38, 0x70, 0x03, 0x38,
1490 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0, 0x07, 0x76, 0x40, 0x07,
1491 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x90, 0x0e,
1492 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x80, 0x07,
1493 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07,
1494 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x6d, 0x90, 0x0e,
1495 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07,
1496 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07,
1497 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
1498 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x76, 0x40, 0x07,
1499 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f,
1500 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07,
1501 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07,
1502 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07,
1503 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x74, 0x80, 0x07,
1504 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f,
1505 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
1506 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07,
1507 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x20, 0x07,
1508 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07,
1509 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20, 0x07, 0x7a, 0x20, 0x07,
1510 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f,
1511 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07,
1512 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50, 0x07, 0x71, 0x20, 0x07,
1513 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07,
1514 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07,
1515 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07,
1516 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07,
1517 0x72, 0x30, 0x84, 0x89, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
1518 0x18, 0xc2, 0x4c, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
1519 0x61, 0x2a, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30,
1520 0x17, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x0c,
1521 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x86, 0x00,
1522 0xc3, 0x00, 0x00, 0x00, 0x10, 0x00, 0xc0, 0x10, 0xa6, 0x02, 0x02, 0x40,
1523 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0xd3, 0x01, 0x01, 0x20, 0x00,
1524 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xf9, 0x80, 0x00, 0x10, 0x00, 0x00,
1525 0x00, 0x00, 0x00, 0x18, 0xc2, 0x74, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00,
1526 0x00, 0x00, 0x0c, 0x61, 0xc8, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,
1527 0x00, 0x80, 0x21, 0x8c, 0x19, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00,
1528 0x00, 0x90, 0x05, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
1529 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
1530 0x02, 0x47, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80,
1531 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac,
1532 0x14, 0x8a, 0xa1, 0x1c, 0x68, 0x2d, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88,
1533 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x42, 0xc7, 0x12, 0x1e, 0x01, 0x00,
1534 0x00, 0x79, 0x18, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c,
1535 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37,
1536 0xb7, 0x21, 0x06, 0x18, 0x40, 0x67, 0x00, 0xa0, 0x41, 0x19, 0x50, 0xb9,
1537 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x80,
1538 0x41, 0x73, 0x06, 0x02, 0x18, 0x38, 0x8c, 0x83, 0x20, 0x38, 0x38, 0xb6,
1539 0x32, 0x90, 0xb6, 0x32, 0xba, 0x30, 0x36, 0x10, 0xbb, 0x32, 0xb9, 0xb9,
1540 0xb4, 0x37, 0x37, 0x90, 0x19, 0x19, 0x18, 0x99, 0x19, 0x17, 0x1a, 0x18,
1541 0x1a, 0x10, 0x94, 0xb6, 0x32, 0xba, 0x30, 0x36, 0xb3, 0xb2, 0x96, 0x19,
1542 0x19, 0x18, 0x99, 0x19, 0x17, 0x1a, 0x18, 0x9a, 0x94, 0x21, 0xc2, 0x19,
1543 0x10, 0x43, 0x0c, 0x30, 0x68, 0xc0, 0x20, 0x02, 0x03, 0x86, 0x45, 0x53,
1544 0x19, 0x5d, 0x18, 0xdb, 0x10, 0xe4, 0x0c, 0x0e, 0x30, 0x68, 0xc0, 0xa0,
1545 0x01, 0x03, 0x86, 0x5b, 0x58, 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c,
1546 0x1a, 0x5b, 0x99, 0x0b, 0x59, 0x99, 0xdb, 0x9b, 0x5c, 0xdb, 0xdc, 0x17,
1547 0x59, 0xda, 0x5c, 0x98, 0x18, 0x5b, 0xd9, 0x10, 0xe1, 0x0c, 0x12, 0x72,
1548 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e,
1549 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e,
1550 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x33, 0x58, 0x58, 0x06, 0x61, 0x69,
1551 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72,
1552 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65,
1553 0x74, 0x63, 0x68, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43,
1554 0x84, 0x33, 0x68, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91,
1555 0x95, 0xc9, 0x7d, 0xd1, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b,
1556 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72,
1557 0x0b, 0x6b, 0x2b, 0xa3, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04,
1558 0x39, 0x83, 0x07, 0x0c, 0x98, 0x33, 0x80, 0xce, 0x20, 0x1a, 0x22, 0x9c,
1559 0x81, 0x44, 0x26, 0x2c, 0x4d, 0xce, 0x05, 0xee, 0x6d, 0x2e, 0x8d, 0x2e,
1560 0xed, 0xcd, 0x8d, 0x4a, 0x58, 0x9a, 0x9c, 0xcb, 0x58, 0x99, 0x1b, 0x5d,
1561 0x99, 0x1c, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0xb7, 0xb7, 0x2f, 0xb8, 0x32,
1562 0xb9, 0x39, 0xb8, 0xb2, 0x31, 0xba, 0x34, 0xbb, 0x32, 0x32, 0x61, 0x69,
1563 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0,
1564 0xde, 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x40, 0x60, 0xc0, 0x9c,
1565 0x01, 0x75, 0x06, 0xd5, 0x19, 0x58, 0x67, 0x00, 0x9d, 0x41, 0x74, 0x06,
1566 0xd7, 0x19, 0x60, 0x94, 0xc2, 0xd2, 0xe4, 0x5c, 0xcc, 0xe4, 0xc2, 0xce,
1567 0xda, 0xca, 0xdc, 0xe8, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x68, 0x9d,
1568 0x95, 0xb9, 0x95, 0xc9, 0x85, 0xd1, 0x95, 0x91, 0xa1, 0xd4, 0x8c, 0xbd,
1569 0xb1, 0xbd, 0xc9, 0x11, 0xd9, 0xd1, 0x7c, 0x99, 0xa5, 0xf0, 0x09, 0x4b,
1570 0x93, 0x73, 0x81, 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3,
1571 0x2b, 0x63, 0x31, 0xf6, 0xc6, 0xf6, 0x26, 0x37, 0x44, 0x02, 0x83, 0xe6,
1572 0x0c, 0xb4, 0x33, 0xd8, 0xce, 0xa0, 0x3a, 0x03, 0xee, 0x0c, 0xa0, 0x33,
1573 0x88, 0xce, 0xe0, 0x3a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c,
1574 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b,
1575 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7,
1576 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64,
1577 0x43, 0x24, 0x30, 0x80, 0xce, 0x40, 0x3b, 0x83, 0xef, 0x0c, 0xaa, 0x33,
1578 0xe0, 0xce, 0x00, 0x3a, 0x03, 0x30, 0x38, 0x83, 0xeb, 0x0c, 0xc2, 0x80,
1579 0x4a, 0x58, 0x9a, 0x9c, 0x8b, 0x58, 0x9d, 0x99, 0x59, 0x99, 0x1c, 0x9f,
1580 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a, 0x33, 0xb3, 0x32, 0xb9, 0xaf, 0xb9,
1581 0x34, 0xbd, 0x32, 0x4a, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61,
1582 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x44, 0xc2,
1583 0xd2, 0xe4, 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x48, 0x85, 0xa5, 0xc9, 0xb9,
1584 0xcc, 0xd1, 0xc9, 0xd5, 0x8d, 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d,
1585 0xa5, 0xb9, 0x99, 0xbd, 0xb1, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x23, 0x33,
1586 0x37, 0x26, 0x75, 0x24, 0xf4, 0xf5, 0x56, 0x47, 0x07, 0x57, 0x47, 0x47,
1587 0x86, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0xec, 0x8b, 0x2e, 0x0f, 0xae,
1588 0x8c, 0x4a, 0x9a, 0x1b, 0x5c, 0x1d, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0x19,
1589 0x97, 0xb1, 0x37, 0xb6, 0x37, 0xb9, 0xaf, 0xb9, 0xb1, 0x30, 0xb6, 0x32,
1590 0x3a, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74,
1591 0x68, 0x6f, 0x64, 0x7c, 0xe8, 0xde, 0xdc, 0xca, 0xda, 0xc2, 0xe0, 0xbe,
1592 0xcc, 0xc2, 0xc6, 0xe8, 0xde, 0xe4, 0x62, 0xf8, 0xd0, 0xbd, 0xb9, 0x95,
1593 0xb5, 0x85, 0xc1, 0x7d, 0x99, 0x85, 0x8d, 0xd1, 0xbd, 0xc9, 0xc9, 0xf0,
1594 0x99, 0x23, 0x93, 0xfb, 0xba, 0x43, 0x4b, 0xa3, 0x2b, 0xfb, 0x82, 0x7b,
1595 0x4b, 0x73, 0xa3, 0x1b, 0x02, 0x0b, 0x60, 0xc0, 0x80, 0x81, 0x03, 0x06,
1596 0xcc, 0x19, 0xa0, 0xc1, 0x19, 0xa4, 0x01, 0x18, 0x38, 0x60, 0xe0, 0x80,
1597 0x01, 0x73, 0x06, 0x68, 0x70, 0x06, 0x6a, 0x00, 0x06, 0x11, 0x18, 0x38,
1598 0x60, 0xc0, 0x9c, 0x01, 0x1a, 0x9c, 0xc1, 0x1a, 0x80, 0x41, 0x05, 0x06,
1599 0x0e, 0x18, 0x30, 0x67, 0x80, 0x06, 0x67, 0xc0, 0x06, 0x60, 0xf0, 0x80,
1600 0x81, 0x03, 0x06, 0xcc, 0x19, 0xa0, 0xc1, 0x19, 0xb4, 0x01, 0x18, 0x58,
1601 0x60, 0xe0, 0x80, 0x01, 0x73, 0x06, 0x68, 0x70, 0x06, 0x6e, 0x00, 0x06,
1602 0x17, 0x18, 0x38, 0x60, 0xc0, 0x9c, 0x01, 0x1a, 0x9c, 0xc1, 0x1b, 0x80,
1603 0x01, 0x06, 0x06, 0x0e, 0x18, 0x30, 0x67, 0x80, 0x06, 0x67, 0x00, 0x07,
1604 0x8c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0,
1605 0xca, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x78, 0x85, 0xa5, 0xc9, 0xb9, 0x84,
1606 0xc9, 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0x85, 0xb1, 0xa5, 0x9d,
1607 0xb9, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1, 0x99, 0x42, 0x0b, 0x23, 0x2b,
1608 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0x63, 0x30,
1609 0x36, 0x84, 0x0c, 0xc0, 0x80, 0x3a, 0x83, 0x31, 0x38, 0x03, 0x32, 0x00,
1610 0x03, 0xe9, 0x0c, 0xca, 0x00, 0x0c, 0x18, 0x30, 0x68, 0xce, 0xc0, 0x0c,
1611 0xce, 0xe0, 0x0c, 0xce, 0x20, 0x0e, 0xce, 0x40, 0x0e, 0xc0, 0x40, 0x3a,
1612 0x83, 0x39, 0x00, 0x03, 0xe7, 0x0c, 0xa0, 0x33, 0xa0, 0x83, 0x33, 0xb8,
1613 0xce, 0xa0, 0x0e, 0x68, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xcd, 0xd0, 0x78,
1614 0x33, 0x33, 0x9b, 0x2b, 0xa3, 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x37,
1615 0x83, 0x37, 0x43, 0xa3, 0x2d, 0x8c, 0x4e, 0x2e, 0x0d, 0x6f, 0x08, 0x05,
1616 0x06, 0x0c, 0x18, 0x3c, 0x60, 0xc0, 0x9c, 0xc1, 0x1d, 0x9c, 0x01, 0x1e,
1617 0x80, 0xc1, 0x03, 0x06, 0x19, 0x18, 0x30, 0x67, 0x90, 0x07, 0x67, 0xa0,
1618 0x07, 0x4c, 0xb2, 0xaa, 0xac, 0x88, 0xca, 0xc6, 0xde, 0xc8, 0xca, 0x68,
1619 0x90, 0x95, 0x8d, 0xbd, 0x91, 0x95, 0x0d, 0x21, 0x03, 0x30, 0x70, 0xce,
1620 0x60, 0x0c, 0xce, 0x80, 0x0c, 0xc0, 0x60, 0x3a, 0x83, 0x32, 0x00, 0x83,
1621 0x06, 0x0c, 0x9a, 0x33, 0x30, 0x83, 0x33, 0x38, 0x83, 0x33, 0xd8, 0x83,
1622 0x33, 0x90, 0x03, 0x30, 0x98, 0xce, 0x60, 0x0e, 0xc0, 0xe0, 0x39, 0x03,
1623 0xe8, 0x0c, 0xf8, 0xe0, 0x0c, 0xae, 0x33, 0xe8, 0x03, 0x2e, 0x61, 0x69,
1624 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2,
1625 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1,
1626 0xd1, 0xd5, 0xc9, 0x95, 0xc9, 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1,
1627 0xb1, 0x80, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xf9, 0x90, 0xa0, 0x2b,
1628 0xc3, 0xcb, 0x1a, 0x42, 0x81, 0x81, 0x76, 0x06, 0x7f, 0x70, 0x06, 0x65,
1629 0x00, 0x06, 0x0c, 0x18, 0x34, 0x67, 0x00, 0x0a, 0x67, 0x00, 0x9d, 0x41,
1630 0x28, 0x9c, 0xc1, 0x75, 0x06, 0xa2, 0x40, 0x8f, 0xae, 0x0c, 0x8f, 0xae,
1631 0x4e, 0xae, 0x4c, 0x86, 0xec, 0x2b, 0x4c, 0x4e, 0x2e, 0x2c, 0x8f, 0xc7,
1632 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0x05, 0x64, 0x2e, 0xac, 0x0d, 0x8e, 0xad,
1633 0xcc, 0x87, 0x05, 0x5d, 0x19, 0x5e, 0x95, 0xd5, 0x10, 0x0a, 0x0c, 0xb6,
1634 0x33, 0xf8, 0x83, 0x33, 0x28, 0x03, 0x30, 0x68, 0xc0, 0xa0, 0x39, 0x03,
1635 0x50, 0x38, 0x03, 0xe8, 0x0c, 0x48, 0xe1, 0x0c, 0xae, 0x33, 0x28, 0x05,
1636 0x2e, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72,
1637 0x3c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x18, 0xcc, 0x0d, 0x91,
1638 0xc0, 0x80, 0x3b, 0x83, 0x53, 0x38, 0x83, 0x32, 0x00, 0x03, 0x06, 0x0c,
1639 0x9a, 0x33, 0x80, 0xce, 0x00, 0x15, 0xce, 0xe0, 0x3a, 0x83, 0x54, 0x18,
1640 0x02, 0x9d, 0x41, 0x76, 0x06, 0xde, 0x19, 0x88, 0xc1, 0x19, 0xd8, 0xc1,
1641 0x19, 0xf8, 0xc1, 0x19, 0x8c, 0xc2, 0x19, 0x98, 0xc2, 0x19, 0xa8, 0xc2,
1642 0x10, 0x23, 0x02, 0xce, 0x60, 0x3a, 0x83, 0x55, 0xa0, 0x18, 0x84, 0xa5,
1643 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1,
1644 0x95, 0xcd, 0xa1, 0x4c, 0x11, 0x31, 0x7d, 0x65, 0x55, 0x59, 0x7d, 0x99,
1645 0xc9, 0x85, 0x9d, 0xb5, 0x95, 0xb9, 0xd1, 0xa5, 0x0c, 0x21, 0xce, 0xc0,
1646 0x15, 0xce, 0xa0, 0x15, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5,
1647 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xd0, 0x95, 0xe1,
1648 0xd1, 0xd5, 0xc9, 0x95, 0xcd, 0x0d, 0x31, 0xce, 0x00, 0x16, 0xce, 0xc0,
1649 0x15, 0xce, 0xe0, 0x15, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5,
1650 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xcc, 0x85, 0xb5,
1651 0xc1, 0xb1, 0x95, 0xc9, 0xcd, 0x0d, 0x31, 0xce, 0x40, 0x16, 0xce, 0xc0,
1652 0x15, 0xce, 0x20, 0x16, 0x86, 0x10, 0x67, 0x00, 0x0b, 0x67, 0x20, 0x0b,
1653 0xac, 0xbe, 0xb4, 0xa8, 0xa6, 0x62, 0x6a, 0xa6, 0xd0, 0xc2, 0xc8, 0xca,
1654 0xe4, 0x86, 0xde, 0xdc, 0xe6, 0xe8, 0xc2, 0xdc, 0xe8, 0xe6, 0xf8, 0xbc,
1655 0xb5, 0xb9, 0xa5, 0xc1, 0xbd, 0xd1, 0x95, 0xb9, 0xd1, 0x81, 0x8c, 0xa1,
1656 0x85, 0xc9, 0xf1, 0x99, 0x4a, 0x6b, 0x83, 0x63, 0x2b, 0x03, 0x19, 0x5a,
1657 0x59, 0x01, 0xa1, 0x12, 0x0a, 0x0a, 0x1a, 0x22, 0x9c, 0x81, 0x2d, 0x0c,
1658 0x31, 0xce, 0xa0, 0x16, 0xce, 0xe0, 0x16, 0xd6, 0xc0, 0x1b, 0x62, 0x9c,
1659 0x01, 0x1a, 0x9c, 0x01, 0x2e, 0xac, 0x81, 0x37, 0x44, 0x0c, 0xce, 0x80,
1660 0x16, 0xce, 0x20, 0x17, 0xd6, 0xc0, 0x3b, 0x83, 0x5c, 0x58, 0x83, 0xef,
1661 0x0c, 0x72, 0x61, 0x0d, 0xc0, 0xe0, 0x0c, 0x72, 0x61, 0x0d, 0xc2, 0xe0,
1662 0x0c, 0x72, 0x61, 0x0d, 0xc4, 0xe0, 0x0c, 0x72, 0x61, 0x0d, 0xc6, 0xe0,
1663 0x0c, 0x72, 0x61, 0x0d, 0xc8, 0xe0, 0x0c, 0x72, 0x61, 0x0d, 0xba, 0x21,
1664 0xc6, 0x19, 0xe8, 0xc2, 0x19, 0xe4, 0xc2, 0x1a, 0x80, 0xc1, 0x10, 0xe3,
1665 0x0c, 0x74, 0xe1, 0x0c, 0x72, 0x61, 0x0d, 0xba, 0x21, 0xc6, 0x19, 0xe8,
1666 0xc2, 0x19, 0xe4, 0xc2, 0x1a, 0x88, 0xc1, 0x10, 0xe3, 0x0c, 0x74, 0xe1,
1667 0x0c, 0x72, 0x61, 0x0d, 0xc6, 0x60, 0x88, 0x71, 0x06, 0xba, 0x70, 0x06,
1668 0xb9, 0xb0, 0x06, 0x64, 0x30, 0xc4, 0x38, 0x03, 0x5d, 0x38, 0x83, 0x5c,
1669 0x58, 0x83, 0x6f, 0x88, 0x71, 0x06, 0xba, 0x70, 0x06, 0xb9, 0xb0, 0x06,
1670 0x61, 0x30, 0xc4, 0x38, 0x03, 0x5d, 0x38, 0x83, 0x5c, 0x58, 0x03, 0x6f,
1671 0x44, 0xc4, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xed, 0xf0, 0x0e,
1672 0xe4, 0x50, 0x0f, 0xec, 0x50, 0x0e, 0x6e, 0x60, 0x0e, 0xec, 0x10, 0x0e,
1673 0xe7, 0x30, 0x0f, 0x53, 0x84, 0x60, 0x18, 0xa1, 0xb0, 0x03, 0x3b, 0xd8,
1674 0x43, 0x3b, 0xb8, 0x41, 0x3a, 0x90, 0x43, 0x39, 0xb8, 0x03, 0x3d, 0x4c,
1675 0x09, 0x8a, 0x11, 0x4b, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x81, 0x3d, 0x94,
1676 0x83, 0x3c, 0xcc, 0x43, 0x3a, 0xbc, 0x83, 0x3b, 0x4c, 0x09, 0x8c, 0x11,
1677 0x54, 0x38, 0xa4, 0x83, 0x3c, 0xb8, 0x01, 0x3b, 0x84, 0x83, 0x3b, 0x9c,
1678 0x43, 0x3d, 0x84, 0xc3, 0x39, 0x94, 0xc3, 0x2f, 0xd8, 0x43, 0x39, 0xc8,
1679 0xc3, 0x3c, 0xa4, 0xc3, 0x3b, 0xb8, 0xc3, 0x94, 0x00, 0x19, 0x31, 0x85,
1680 0x43, 0x3a, 0xc8, 0x83, 0x1b, 0x8c, 0xc3, 0x3b, 0xb4, 0x03, 0x3c, 0xa4,
1681 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x03, 0x3c, 0xd0, 0x43, 0x3a, 0xbc,
1682 0x83, 0x3b, 0xcc, 0xc3, 0x94, 0x41, 0x61, 0x9c, 0x11, 0x4c, 0x38, 0xa4,
1683 0x83, 0x3c, 0xb8, 0x81, 0x39, 0xc8, 0x43, 0x38, 0x9c, 0x43, 0x3b, 0x94,
1684 0x83, 0x3b, 0xd0, 0xc3, 0x94, 0x80, 0x15, 0x00, 0x00, 0x79, 0x18, 0x00,
1685 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
1686 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
1687 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
1688 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
1689 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
1690 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
1691 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
1692 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
1693 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
1694 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
1695 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
1696 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
1697 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
1698 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
1699 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
1700 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
1701 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
1702 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
1703 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
1704 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
1705 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
1706 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
1707 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
1708 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
1709 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
1710 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
1711 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
1712 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
1713 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
1714 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
1715 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
1716 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
1717 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
1718 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
1719 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
1720 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
1721 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
1722 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
1723 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
1724 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
1725 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
1726 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
1727 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
1728 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
1729 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
1730 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
1731 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
1732 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
1733 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
1734 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
1735 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
1736 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
1737 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
1738 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
1739 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
1740 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x35, 0x00, 0x00,
1741 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, 0xb3, 0x60, 0xad, 0xd3,
1742 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, 0x51, 0x14, 0x96, 0x30,
1743 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x75,
1744 0x17, 0xb7, 0x6d, 0x01, 0x14, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, 0x2f,
1745 0x2c, 0x00, 0xf3, 0xf8, 0xd5, 0x5d, 0xdc, 0xb6, 0x09, 0x40, 0x00, 0x12,
1746 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3, 0x58, 0x7e, 0x71, 0xdb, 0x36, 0x10,
1747 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71,
1748 0xdb, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63,
1749 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x84, 0x01, 0x80, 0x44, 0xbe, 0x04,
1750 0x30, 0xcf, 0x42, 0xfc, 0x13, 0x71, 0x4d, 0x54, 0x44, 0xfc, 0xf6, 0xf0,
1751 0x03, 0x51, 0x04, 0x60, 0x7e, 0x85, 0x17, 0xb7, 0x6d, 0x04, 0x0d, 0x80,
1752 0x44, 0xfe, 0xe0, 0x4c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x0b, 0x1b, 0x80,
1753 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13, 0x71, 0x4d, 0x54, 0x44,
1754 0xfc, 0xf6, 0xe0, 0x57, 0x78, 0x71, 0xdb, 0x86, 0x30, 0x01, 0x48, 0xe4,
1755 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x75, 0x17, 0xb7, 0x6d,
1756 0x00, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe, 0x7f, 0x11, 0x01, 0x06, 0x43,
1757 0x34, 0x93, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0xc1,
1758 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1759 0x00, 0xcb, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00,
1760 0x00, 0x55, 0x00, 0x00, 0x00, 0x14, 0x8f, 0x45, 0x00, 0x81, 0x70, 0xcc,
1761 0x41, 0x30, 0x0d, 0x84, 0x07, 0xb4, 0x16, 0x41, 0x09, 0x50, 0x3a, 0xc7,
1762 0xc0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xe2,
1763 0x08, 0x00, 0x85, 0x23, 0x00, 0x35, 0x40, 0xe0, 0x0c, 0x00, 0x01, 0x63,
1764 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3, 0xe6, 0x1c, 0x82,
1765 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, 0x63, 0x04, 0x20, 0x08,
1766 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30, 0x03, 0x30, 0x07,
1767 0x21, 0x0b, 0xb2, 0x20, 0x0b, 0xb3, 0x30, 0x07, 0x31, 0x0b, 0xb9, 0x30,
1768 0x0b, 0x7d, 0x40, 0xc5, 0x0c, 0xc0, 0x08, 0xc0, 0x0c, 0xc0, 0x58, 0x03,
1769 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2, 0x1f, 0x08, 0x82, 0x20,
1770 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93, 0x1e, 0xdb, 0xce, 0x3f, 0xe9,
1771 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03, 0x08, 0x82, 0x6c, 0xfd, 0x0b,
1772 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x30, 0xd6,
1773 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20,
1774 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x00,
1775 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x63, 0x0d,
1776 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e,
1777 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x20,
1778 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x30, 0xd6, 0x20,
1779 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3, 0xf1, 0x2f, 0x8c, 0xe9, 0xaa,
1780 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4, 0xff, 0xfb, 0x02, 0x5d, 0x83,
1781 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe, 0x30, 0xd6, 0x30, 0xf7, 0x6d,
1782 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef, 0x0b, 0x7c, 0xce, 0xfa, 0xf8,
1783 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c,
1784 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0xcd, 0x00, 0x8c,
1785 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed,
1786 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5,
1787 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0,
1788 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x4a,
1789 0x11, 0xbc, 0xc2, 0x1b, 0xb4, 0x81, 0x1c, 0x8c, 0x41, 0x19, 0x90, 0x41,
1790 0x30, 0x62, 0xb0, 0x14, 0x41, 0x2c, 0xbc, 0x81, 0x1b, 0xcc, 0xc1, 0x2b,
1791 0x90, 0x81, 0x19, 0x94, 0x81, 0x30, 0x86, 0x10, 0xc0, 0xc2, 0x20, 0xc3,
1792 0xe0, 0xad, 0xc1, 0x1c, 0x43, 0x20, 0xc4, 0xc2, 0x88, 0xc1, 0x52, 0x04,
1793 0xb5, 0x30, 0x07, 0x72, 0x70, 0x07, 0xb2, 0x80, 0x06, 0x6a, 0x90, 0x06,
1794 0xc6, 0x18, 0x42, 0x40, 0x0b, 0x73, 0x0c, 0x43, 0x10, 0x0b, 0x87, 0x07,
1795 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x33, 0x80, 0x03, 0x23, 0x02, 0xf8,
1796 0x8c, 0x37, 0xf0, 0x01, 0x2a, 0xe4, 0xc2, 0x05, 0xea, 0x52, 0x50, 0x06,
1797 0x19, 0x82, 0x35, 0xa8, 0x83, 0x11, 0x83, 0xc2, 0x08, 0xcc, 0xa1, 0x08,
1798 0xc6, 0x2b, 0x42, 0xa1, 0x15, 0x7c, 0xe1, 0x17, 0xf4, 0xe0, 0x02, 0x75,
1799 0x29, 0x28, 0x83, 0x0c, 0x01, 0x1c, 0xe8, 0xc1, 0x88, 0x41, 0x61, 0x04,
1800 0xeb, 0xa0, 0x04, 0xe3, 0x15, 0xa6, 0x20, 0x0b, 0xe3, 0x40, 0x0e, 0xa0,
1801 0x70, 0x81, 0xba, 0x14, 0x94, 0x41, 0x86, 0xa0, 0x0e, 0xfe, 0x60, 0xc4,
1802 0xa0, 0x30, 0x02, 0x78, 0x78, 0x82, 0x39, 0x86, 0x3a, 0x58, 0xd2, 0x61,
1803 0x8e, 0x21, 0x38, 0xd2, 0x61, 0x8e, 0x21, 0x18, 0xce, 0x61, 0xbc, 0xe1,
1804 0x15, 0x74, 0x01, 0x1d, 0x28, 0x18, 0xc3, 0x0d, 0xc1, 0x1f, 0x04, 0xb3,
1805 0x0c, 0x81, 0x10, 0x0c, 0x32, 0x10, 0x7d, 0x70, 0x0a, 0xe3, 0x0d, 0xb3,
1806 0xe0, 0x0b, 0xe0, 0x40, 0xc1, 0x18, 0x31, 0x20, 0x8c, 0xc0, 0x1e, 0x86,
1807 0x11, 0x83, 0xc2, 0x08, 0xf0, 0x21, 0xc8, 0x03, 0x0b, 0xf2, 0x00, 0x3e,
1808 0x23, 0x06, 0x85, 0x11, 0xe0, 0x43, 0xe0, 0x07, 0x36, 0xe8, 0x81, 0x7c,
1809 0x4c, 0x0f, 0x82, 0xf8, 0xd8, 0x10, 0xd0, 0x67, 0xc4, 0x80, 0x30, 0x82,
1810 0x7e, 0x08, 0x46, 0x0c, 0x0a, 0x23, 0xf8, 0x87, 0x80, 0x0f, 0x2c, 0xe0,
1811 0x03, 0xf9, 0xcc, 0x31, 0x98, 0xc2, 0xc2, 0x0f, 0x83, 0x0c, 0xc1, 0x29,
1812 0xd8, 0x82, 0x0d, 0x01, 0x7d, 0x06, 0x19, 0x82, 0x54, 0xe0, 0x85, 0x41,
1813 0x86, 0xa0, 0xf2, 0x85, 0x59, 0x02, 0x61, 0xa0, 0x22, 0x10, 0x02, 0x36,
1814 0x00, 0xc6, 0x1b, 0xca, 0x01, 0x1e, 0x40, 0x82, 0x82, 0x31, 0xdc, 0x10,
1815 0xdc, 0x81, 0x33, 0xcb, 0x30, 0x10, 0xc1, 0x20, 0x03, 0x31, 0x0b, 0xbd,
1816 0x30, 0xde, 0x90, 0x0e, 0xf4, 0x80, 0x0f, 0x14, 0x8c, 0xf1, 0x86, 0x75,
1817 0xb0, 0x87, 0x7c, 0xa0, 0x60, 0x8c, 0x18, 0x20, 0x47, 0x14, 0x13, 0x45,
1818 0x77, 0x0c, 0xc1, 0x20, 0x43, 0x50, 0x0b, 0xe8, 0x30, 0xc8, 0x10, 0x2c,
1819 0xea, 0x30, 0x4b, 0x40, 0x0c, 0x54, 0x04, 0xc2, 0x80, 0x09, 0xc3, 0x0d,
1820 0x61, 0x70, 0x0a, 0xc1, 0x2c, 0x43, 0x31, 0x05, 0xe3, 0x0d, 0xf2, 0xd0,
1821 0x0f, 0x2e, 0x41, 0xc1, 0x18, 0x6e, 0x08, 0x54, 0x21, 0x98, 0x65, 0x30,
1822 0x8e, 0x60, 0x90, 0xa1, 0x00, 0x07, 0x75, 0x18, 0x6f, 0xb0, 0x87, 0x90,
1823 0x58, 0x09, 0x0a, 0xc6, 0x1c, 0xc3, 0x2f, 0x04, 0x35, 0x31, 0xc8, 0x10,
1824 0x80, 0xc3, 0x3b, 0x58, 0x50, 0xc8, 0x67, 0x90, 0x21, 0x10, 0x87, 0x7a,
1825 0x98, 0x25, 0x68, 0x83, 0xf1, 0x06, 0x7e, 0x38, 0x89, 0x9c, 0xa0, 0x60,
1826 0x8c, 0x37, 0xf8, 0x43, 0x4a, 0xcc, 0x04, 0x05, 0x63, 0x90, 0x01, 0x5a,
1827 0x07, 0x7d, 0x18, 0x6e, 0x20, 0x62, 0xc1, 0x99, 0x65, 0x40, 0xa4, 0x60,
1828 0x0c, 0x41, 0xfa, 0x89, 0xe1, 0x86, 0x60, 0x17, 0x94, 0x59, 0x06, 0x25,
1829 0x09, 0x4c, 0xe8, 0x05, 0xf9, 0xcc, 0x12, 0x2c, 0x36, 0xfc, 0x02, 0x7c,
1830 0x46, 0x0c, 0x08, 0x23, 0x60, 0x8b, 0xc0, 0x82, 0x7b, 0x90, 0xcf, 0x88,
1831 0x41, 0x61, 0x04, 0x6f, 0x11, 0xdc, 0xc3, 0x2c, 0xc1, 0x32, 0x50, 0x01,
1832 0x28, 0x89, 0xa0, 0xcc, 0x31, 0xd0, 0x43, 0x70, 0x16, 0x63, 0x08, 0xdb,
1833 0x59, 0x0c, 0x37, 0x04, 0xe4, 0xa0, 0xcc, 0x32, 0x34, 0x4c, 0x60, 0x82,
1834 0x39, 0xc8, 0x67, 0x96, 0xc0, 0xb1, 0x01, 0x1d, 0xe0, 0x33, 0x62, 0x40,
1835 0x18, 0x41, 0x5d, 0x04, 0x16, 0x80, 0x84, 0x7c, 0x46, 0x0c, 0x0a, 0x23,
1836 0xc0, 0x8b, 0x00, 0x24, 0x66, 0x09, 0x9c, 0x81, 0x0a, 0x40, 0x61, 0x84,
1837 0x66, 0x8e, 0x21, 0x09, 0xde, 0x62, 0x0c, 0x81, 0x0c, 0xda, 0x62, 0xb8,
1838 0x21, 0x68, 0x07, 0x65, 0x96, 0x01, 0x7a, 0x02, 0x13, 0xde, 0x41, 0x3e,
1839 0xb3, 0x04, 0x91, 0x0d, 0xf1, 0x00, 0x9f, 0x11, 0x03, 0xc2, 0x08, 0xfc,
1840 0x22, 0xb0, 0x20, 0x25, 0xe4, 0x33, 0x62, 0x50, 0x18, 0x41, 0x68, 0x04,
1841 0x29, 0x31, 0x4b, 0x10, 0x0d, 0x54, 0x00, 0xca, 0x23, 0x40, 0x73, 0x0c,
1842 0x49, 0x50, 0x17, 0xb3, 0x04, 0xd2, 0x40, 0x45, 0x20, 0x44, 0x7a, 0x70,
1843 0x0c, 0x32, 0x04, 0x29, 0x31, 0x13, 0x73, 0x0c, 0x26, 0x01, 0x06, 0x7c,
1844 0x31, 0xc8, 0x10, 0x9c, 0x84, 0x4d, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21,
1845 0x48, 0x09, 0x9e, 0x98, 0x25, 0x68, 0x83, 0xe1, 0x86, 0x59, 0x80, 0x89,
1846 0x60, 0x96, 0x81, 0x02, 0x83, 0x60, 0x90, 0x81, 0x0e, 0x5e, 0x22, 0x27,
1847 0xc6, 0x1b, 0xca, 0x02, 0x2e, 0x44, 0x83, 0x82, 0x31, 0xde, 0x70, 0x16,
1848 0x72, 0xc1, 0x17, 0x14, 0x8c, 0x39, 0x06, 0x98, 0x08, 0x4c, 0x63, 0x90,
1849 0x21, 0x88, 0x09, 0xb0, 0xb0, 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x30, 0x13,
1850 0x66, 0x31, 0xdc, 0x70, 0xf4, 0x83, 0x33, 0xcb, 0xf0, 0x55, 0xc1, 0x18,
1851 0xc2, 0xb0, 0x1a, 0xc3, 0x0d, 0x01, 0x48, 0x28, 0xb3, 0x0c, 0x97, 0x15,
1852 0x98, 0x20, 0x12, 0xf2, 0x99, 0x25, 0xc0, 0x46, 0x0c, 0x08, 0x23, 0xb8,
1853 0x8d, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0xdc, 0x08, 0x4a, 0xc2, 0x82, 0x93,
1854 0x90, 0x8f, 0x05, 0x29, 0x01, 0x9f, 0x59, 0x02, 0x6c, 0xa0, 0x02, 0x50,
1855 0x2c, 0xe1, 0x9a, 0x63, 0xd8, 0x89, 0x60, 0x36, 0xc6, 0x10, 0x98, 0xd9,
1856 0x18, 0x6e, 0x08, 0x52, 0x42, 0x99, 0x65, 0xd0, 0xb2, 0xc0, 0x84, 0x95,
1857 0x90, 0xcf, 0x2c, 0xc1, 0x36, 0x62, 0x40, 0x18, 0x01, 0x78, 0x0c, 0x23,
1858 0x06, 0x85, 0x11, 0x88, 0x47, 0xe0, 0x12, 0x16, 0xc0, 0x84, 0x7c, 0x2c,
1859 0x90, 0x09, 0xf8, 0xcc, 0x12, 0x6c, 0x03, 0x15, 0x80, 0x92, 0x09, 0xda,
1860 0x1c, 0x43, 0x12, 0xec, 0xc6, 0x18, 0x42, 0x95, 0x1b, 0xc3, 0x0d, 0x81,
1861 0x4c, 0x28, 0xb3, 0x0c, 0x1d, 0x17, 0x98, 0x40, 0x13, 0xf2, 0x99, 0x25,
1862 0xf0, 0x46, 0x0c, 0x08, 0x23, 0x48, 0x8f, 0x61, 0xc4, 0xa0, 0x30, 0x82,
1863 0xf5, 0x08, 0x6e, 0xc2, 0x82, 0x9c, 0x90, 0x8f, 0x05, 0x3b, 0x01, 0x9f,
1864 0x59, 0x02, 0x6f, 0xa0, 0x02, 0x50, 0x38, 0xa1, 0x9b, 0x63, 0x48, 0x82,
1865 0xf0, 0x18, 0x31, 0x30, 0x8c, 0x20, 0x3e, 0x82, 0xb7, 0x68, 0x8b, 0x41,
1866 0x86, 0x20, 0x2e, 0x48, 0x63, 0x96, 0xe0, 0x1b, 0xa8, 0x08, 0xfc, 0x80,
1867 0x12, 0xbc, 0x41, 0x86, 0xe0, 0x2e, 0x4c, 0x63, 0x96, 0xa0, 0x0d, 0x66,
1868 0x19, 0xc2, 0xa0, 0x0d, 0xf8, 0x61, 0x90, 0xa1, 0x17, 0xf0, 0x42, 0x34,
1869 0x46, 0x0c, 0x0a, 0x23, 0x98, 0x8f, 0x60, 0x2d, 0xe6, 0x18, 0xe8, 0x22,
1870 0x60, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xea, 0x63, 0x60, 0x8b, 0x39, 0x06,
1871 0x21, 0x68, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xee, 0xa3, 0x68, 0x8b, 0x39,
1872 0x06, 0x21, 0x60, 0x8f, 0x41, 0x86, 0x60, 0x2f, 0x5c, 0x63, 0x90, 0x21,
1873 0x28, 0x07, 0xd8, 0x18, 0x6f, 0xb0, 0x8d, 0xf0, 0x98, 0x0f, 0x0a, 0xc6,
1874 0x78, 0x03, 0x6e, 0x8c, 0x47, 0x7b, 0x50, 0x30, 0xe6, 0x18, 0x42, 0x23,
1875 0xb8, 0x8f, 0x41, 0x86, 0x40, 0x34, 0x62, 0xc3, 0x82, 0x44, 0x3e, 0x83,
1876 0x0c, 0x01, 0x69, 0xdc, 0xc6, 0x70, 0xc3, 0xe1, 0x16, 0xce, 0x2c, 0x03,
1877 0x1b, 0x88, 0x41, 0x30, 0x86, 0x30, 0xf0, 0xc7, 0x70, 0x43, 0x10, 0x17,
1878 0xca, 0x2c, 0x03, 0x19, 0x8c, 0x41, 0x60, 0xc2, 0x5c, 0xc8, 0x67, 0x96,
1879 0xa0, 0x0c, 0x46, 0x0c, 0x08, 0x23, 0x40, 0x91, 0x61, 0xc4, 0xa0, 0x30,
1880 0x02, 0x15, 0x09, 0xec, 0xc2, 0x02, 0xbc, 0x90, 0x8f, 0x05, 0x7a, 0x01,
1881 0x9f, 0x59, 0x82, 0x32, 0x18, 0xa8, 0x00, 0x94, 0x31, 0x10, 0xc8, 0x60,
1882 0x8e, 0x81, 0x35, 0x02, 0x12, 0x19, 0x43, 0x60, 0x48, 0x64, 0xb8, 0x21,
1883 0xd0, 0x0b, 0x65, 0x96, 0xe1, 0x0c, 0xcc, 0x20, 0x30, 0x81, 0x2f, 0xe4,
1884 0x33, 0x4b, 0x80, 0x06, 0x23, 0x06, 0x84, 0x11, 0xc4, 0xc8, 0x30, 0x62,
1885 0x50, 0x18, 0xc1, 0x8c, 0x04, 0x7f, 0x61, 0x41, 0x68, 0xc8, 0xc7, 0x82,
1886 0xd1, 0x80, 0xcf, 0x2c, 0x01, 0x1a, 0x0c, 0x54, 0x00, 0x8a, 0x19, 0x08,
1887 0x67, 0x30, 0xc7, 0x90, 0x04, 0x2c, 0x32, 0x86, 0x50, 0xa9, 0xc8, 0x70,
1888 0x43, 0x30, 0x1a, 0xca, 0x2c, 0x83, 0x1a, 0xa4, 0x41, 0x60, 0x42, 0x69,
1889 0xc8, 0x67, 0x96, 0x60, 0x0d, 0x46, 0x0c, 0x08, 0x23, 0xd0, 0x91, 0x61,
1890 0xc4, 0xa0, 0x30, 0x02, 0x1e, 0x09, 0x50, 0xc3, 0x02, 0xd5, 0x90, 0x8f,
1891 0x05, 0xac, 0x01, 0x9f, 0x59, 0x82, 0x35, 0x18, 0xa8, 0x00, 0x94, 0x34,
1892 0x10, 0xd4, 0x60, 0x8e, 0x21, 0x09, 0x64, 0x64, 0xc4, 0xc0, 0x30, 0x02,
1893 0x31, 0x09, 0xc0, 0xc3, 0x37, 0x06, 0x19, 0x02, 0xf1, 0xa8, 0x8f, 0x59,
1894 0x02, 0x36, 0x18, 0xa8, 0x08, 0xfc, 0x20, 0x0c, 0x84, 0x35, 0x18, 0x64,
1895 0x08, 0xd0, 0xe3, 0x3e, 0x66, 0x09, 0xda, 0x60, 0xa0, 0x25, 0xe0, 0x11,
1896 0x83, 0x47, 0x24, 0x1e, 0xf9, 0x64, 0x81, 0x0d, 0x78, 0x04, 0x0c, 0x06,
1897 0x5a, 0x02, 0x14, 0x31, 0xf4, 0x42, 0x32, 0x87, 0x8f, 0x60, 0x03, 0xd7,
1898 0x01, 0x83, 0x41, 0x86, 0x40, 0xd8, 0x0f, 0x0b, 0x46, 0x44, 0x3e, 0x19,
1899 0x84, 0x03, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xd7, 0xd2, 0x07,
1900 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, 0x50, 0x13, 0xe7, 0x2c,
1901 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38,
1902 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, 0x00, 0x03, 0x11, 0x71,
1903 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, 0x21, 0x13, 0x00, 0x00,
1904 0x00, 0x01, 0x31, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x5b, 0x06, 0xe0,
1905 0x98, 0x85, 0x2d, 0x43, 0x70, 0xcc, 0xc2, 0x96, 0xa1, 0x38, 0x66, 0x61,
1906 0xcb, 0xf0, 0x05, 0xbb, 0xb0, 0x65, 0x20, 0x83, 0x80, 0x17, 0xb6, 0x0c,
1907 0x77, 0x10, 0xf4, 0xc2, 0x96, 0x81, 0x0f, 0x02, 0x5f, 0xd8, 0x32, 0xf8,
1908 0x41, 0xf0, 0x0b, 0x5b, 0x86, 0x53, 0x08, 0xc0, 0x61, 0xcb, 0xc0, 0x0a,
1909 0x41, 0x38, 0x6c, 0x19, 0x66, 0x21, 0x10, 0x87, 0x2d, 0x43, 0x2d, 0x04,
1910 0xe1, 0xb0, 0x65, 0x48, 0x89, 0x40, 0x1c, 0xb6, 0x0c, 0x2b, 0x11, 0x84,
1911 0xc3, 0x96, 0xe1, 0x34, 0x02, 0x71, 0xd8, 0x32, 0xa4, 0x46, 0x10, 0x0e,
1912 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x67, 0x00, 0x00,
1913 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00,
1914 0x00, 0x14, 0xcf, 0x41, 0x30, 0x0d, 0xe4, 0x06, 0x94, 0x8e, 0x00, 0x8c,
1915 0x35, 0x00, 0x81, 0x40, 0xe0, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x54, 0xcc,
1916 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f, 0xea, 0x97, 0xb1, 0xfa,
1917 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e, 0x83, 0x3b, 0xee, 0xa9,
1918 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8, 0x8d, 0x35, 0xac, 0x73,
1919 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd, 0x6d, 0xac, 0xda, 0xdf,
1920 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30,
1921 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b,
1922 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3,
1923 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39,
1924 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80,
1925 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00,
1926 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50, 0x42, 0x30, 0xcb, 0x10,
1927 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xc5, 0xc1, 0x20, 0x43, 0xe0, 0x48, 0x16,
1928 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96, 0x20, 0x19, 0x6e, 0xc8,
1929 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86, 0x2d, 0x09, 0x66, 0x19,
1930 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x0f, 0x3a, 0x69, 0x8e, 0xa1,
1931 0x0a, 0xf0, 0x60, 0xc4, 0xa0, 0x30, 0x82, 0x50, 0xf8, 0xa6, 0x39, 0x06,
1932 0x21, 0xc8, 0x83, 0x11, 0x83, 0xc2, 0x08, 0x46, 0x21, 0x0c, 0xa8, 0x39,
1933 0x06, 0x21, 0xc0, 0x83, 0x59, 0x82, 0x62, 0xa0, 0x22, 0x10, 0x08, 0x6e,
1934 0x18, 0x43, 0x08, 0xfc, 0x60, 0x0c, 0x41, 0xf0, 0x83, 0x31, 0x84, 0x81,
1935 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x38, 0x05, 0x21, 0x18, 0x31, 0x28, 0x8c,
1936 0x00, 0x15, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84, 0x59, 0x06, 0xe3, 0x08,
1937 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03, 0xf9, 0x58, 0x80, 0xc1,
1938 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c, 0x6c, 0x08, 0xe8, 0x33,
1939 0xc7, 0x60, 0x06, 0x81, 0x2a, 0x0c, 0x32, 0x04, 0x67, 0xb0, 0x06, 0x16,
1940 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d, 0x66, 0x09, 0x8e, 0x81,
1941 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40, 0x92, 0x6c, 0x90, 0x21,
1942 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x00, 0x17, 0x02, 0x34, 0x98,
1943 0x63, 0x70, 0x83, 0x20, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xd0, 0x85, 0x21,
1944 0x0d, 0xe6, 0x18, 0x84, 0x40, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xe0, 0x85,
1945 0x42, 0x0d, 0xe6, 0x18, 0x84, 0x20, 0x16, 0x66, 0x09, 0x92, 0x81, 0x92,
1946 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a, 0x06, 0x19, 0x02, 0x36,
1947 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17,
1948 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0x1b, 0x00,
1949 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00,
1950 0x00, 0xc9, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00,
1951 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04,
1952 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08,
1953 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b,
1954 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44,
1955 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21,
1956 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6,
1957 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00, 0x00, 0xe8, 0x00, 0x00,
1958 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00,
1959 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87,
1960 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87,
1961 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
1962 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca,
1963 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8,
1964 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0,
1965 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03,
1966 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07,
1967 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87,
1968 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07,
1969 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4,
1970 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4,
1971 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc,
1972 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda,
1973 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2,
1974 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87,
1975 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07,
1976 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4,
1977 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2,
1978 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2,
1979 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08,
1980 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07,
1981 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03,
1982 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8,
1983 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8,
1984 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda,
1985 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87,
1986 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03,
1987 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07,
1988 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87,
1989 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea,
1990 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0,
1991 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
1992 0x7a, 0x28, 0x07, 0x60, 0x83, 0x21, 0x10, 0xc0, 0x02, 0x54, 0x1b, 0x8c,
1993 0xa1, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x10, 0x08, 0xb0, 0x00, 0xd5, 0x06,
1994 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f,
1995 0x18, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00,
1996 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0,
1997 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40,
1998 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b,
1999 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b,
2000 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b,
2001 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00,
2002 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40,
2003 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60,
2004 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90,
2005 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90,
2006 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b,
2007 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b,
2008 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b,
2009 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b,
2010 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50,
2011 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60,
2012 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40,
2013 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b,
2014 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39,
2015 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20,
2016 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90,
2017 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20,
2018 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10,
2019 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40,
2020 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c,
2021 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a,
2022 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10,
2023 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50,
2024 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60,
2025 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50,
2026 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39,
2027 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d,
2028 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x40, 0x8e,
2029 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, 0x80, 0x6a, 0x83, 0x81,
2030 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0x80,
2031 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, 0x20, 0x01, 0xd5, 0x06,
2032 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0xc3, 0xc4,
2033 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, 0x34, 0xb8, 0xc3, 0x3b,
2034 0xb4, 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b,
2035 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00,
2036 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41, 0x31, 0x21, 0x30, 0x26,
2037 0x0c, 0x07, 0x92, 0x4c, 0x18, 0x14, 0x24, 0x99, 0x10, 0x2c, 0x13, 0x02,
2038 0x06, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88,
2039 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23,
2040 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4,
2041 0x4c, 0x10, 0xb8, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08,
2042 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11,
2043 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00,
2044 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66,
2045 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0,
2046 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21,
2047 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d,
2048 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84,
2049 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff,
2050 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80,
2051 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02,
2052 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x18, 0xa1,
2053 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d, 0x39, 0x85, 0x28, 0x8a,
2054 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54, 0x04, 0x00, 0x20, 0xaa,
2055 0x0c, 0x40, 0x51, 0x90, 0x55, 0x8c, 0xa2, 0x00, 0x00, 0x00, 0x20, 0xac,
2056 0x0c, 0x45, 0x51, 0x90, 0x56, 0x84, 0xa2, 0x20, 0x6e, 0x8e, 0x20, 0x98,
2057 0x23, 0x00, 0x83, 0x61, 0x04, 0xe1, 0x2b, 0x48, 0xb0, 0x34, 0x82, 0x07,
2058 0x7a, 0x00, 0x85, 0x03, 0x01, 0x29, 0xf0, 0xcd, 0x11, 0x80, 0xc2, 0x20,
2059 0x02, 0x20, 0x4c, 0x01, 0x8c, 0x00, 0x0c, 0x23, 0x0c, 0xdf, 0x20, 0x42,
2060 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21, 0x0c, 0x23, 0x10, 0x1f,
2061 0x00, 0x13, 0xb2, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
2062 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x76, 0x08, 0x87,
2063 0x71, 0x78, 0x87, 0x79, 0xc0, 0x87, 0x38, 0x80, 0x03, 0x37, 0x88, 0x83,
2064 0x38, 0x70, 0x03, 0x38, 0xd8, 0x70, 0x1b, 0xe5, 0xd0, 0x06, 0xf0, 0xa0,
2065 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
2066 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0,
2067 0x06, 0xe9, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90,
2068 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
2069 0x07, 0x6d, 0x90, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0,
2070 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60,
2071 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20,
2072 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
2073 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
2074 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0,
2075 0x07, 0x71, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x40, 0x07, 0x7a, 0x30,
2076 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x73, 0x20,
2077 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60,
2078 0x0f, 0x74, 0x80, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
2079 0x07, 0x6d, 0x60, 0x0f, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xa0,
2080 0x07, 0x76, 0x40, 0x07, 0x6d, 0x60, 0x0f, 0x79, 0x60, 0x07, 0x7a, 0x10,
2081 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
2082 0x0f, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0,
2083 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x79, 0x20,
2084 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
2085 0x07, 0x6d, 0x60, 0x0f, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50,
2086 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x50,
2087 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50, 0x07, 0x71, 0x20, 0x07, 0x7a, 0x50,
2088 0x07, 0x71, 0x20, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x00, 0x07, 0x72, 0x40,
2089 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00,
2090 0x07, 0x72, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60,
2091 0x07, 0x7a, 0x30, 0x07, 0x72, 0x30, 0x84, 0x79, 0x00, 0x00, 0x08, 0x00,
2092 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x44, 0x40, 0x00, 0x08, 0x00, 0x00,
2093 0x00, 0x00, 0x00, 0x0c, 0x61, 0x26, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00,
2094 0x00, 0x00, 0x86, 0x30, 0x15, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
2095 0x00, 0x43, 0x98, 0x0b, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80,
2096 0x21, 0x4c, 0x86, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x10, 0x00, 0xc0, 0x10,
2097 0x66, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0xb3,
2098 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xe9, 0x80,
2099 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x6c, 0x40, 0x00,
2100 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x61, 0xc4, 0x00, 0x08, 0x00,
2101 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x10, 0x00, 0x00,
2102 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
2103 0x47, 0xc6, 0x04, 0x43, 0xfa, 0x46, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4,
2104 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a,
2105 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0xa8, 0x2c, 0x9c, 0x11,
2106 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x22, 0xc7,
2107 0x12, 0x1e, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xae, 0x01, 0x00,
2108 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32,
2109 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0xc6, 0xf7, 0x8c, 0x01, 0x40, 0x06,
2110 0x64, 0x40, 0xe5, 0x6e, 0x0c, 0x2d, 0x4c, 0xee, 0x6b, 0x2e, 0x4d, 0xaf,
2111 0x6c, 0x88, 0xf1, 0x31, 0x63, 0x20, 0x7c, 0x0d, 0xe3, 0x20, 0x08, 0x0e,
2112 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c,
2113 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85,
2114 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac,
2115 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88,
2116 0x30, 0x06, 0xc4, 0x10, 0xe3, 0x63, 0x3e, 0xe8, 0x5b, 0x58, 0x34, 0x95,
2117 0xd1, 0x85, 0xb1, 0x0d, 0x41, 0xc6, 0xe0, 0xf8, 0x98, 0x8f, 0xf9, 0x16,
2118 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
2119 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73,
2120 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x31, 0x48, 0xc8, 0x85, 0xa5, 0xc9,
2121 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0x85, 0xcd,
2122 0xd1, 0x7d, 0xb5, 0x85, 0xd1, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1,
2123 0x95, 0x0d, 0x11, 0xc6, 0x60, 0x61, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c,
2124 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95,
2125 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1,
2126 0x7d, 0x91, 0xa5, 0xcd, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6, 0xa0,
2127 0x61, 0x14, 0x96, 0x26, 0xe7, 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7,
2128 0x45, 0x17, 0x26, 0x77, 0x56, 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25,
2129 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad,
2130 0x8c, 0x86, 0x19, 0xdb, 0x5b, 0x18, 0x1d, 0xcd, 0x10, 0x64, 0x0c, 0x9e,
2131 0x6f, 0x19, 0x03, 0x68, 0x0c, 0xa2, 0x21, 0xc2, 0x18, 0x48, 0x64, 0xc2,
2132 0xd2, 0xe4, 0x5c, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0xa8,
2133 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0x95, 0xb9, 0xd1, 0x95, 0xc9, 0x51, 0x0a,
2134 0x4b, 0x93, 0x73, 0x71, 0x7b, 0xfb, 0x82, 0x2b, 0x93, 0x9b, 0x83, 0x2b,
2135 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x23, 0x13, 0x96, 0x26, 0xe7, 0x12, 0x26,
2136 0x77, 0xf6, 0xe5, 0x16, 0xd6, 0x56, 0x46, 0x04, 0xee, 0x6d, 0x2e, 0x8d,
2137 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0xf4, 0x2d, 0x63, 0x40, 0x8d, 0x41, 0x35,
2138 0x06, 0xd6, 0x18, 0x40, 0x63, 0x10, 0x8d, 0xc1, 0x35, 0x06, 0x18, 0xa5,
2139 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba,
2140 0xaf, 0x34, 0x37, 0xb8, 0x3a, 0x3a, 0x5a, 0x67, 0x65, 0x6e, 0x65, 0x72,
2141 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44,
2142 0x76, 0x34, 0x5f, 0x66, 0x29, 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xca,
2143 0xe4, 0xe6, 0xe0, 0xca, 0xc6, 0xe8, 0xd2, 0xec, 0xca, 0x58, 0x8c, 0xbd,
2144 0xb1, 0xbd, 0xc9, 0x0d, 0x91, 0x3e, 0x66, 0x0c, 0xb4, 0x31, 0xd8, 0xc6,
2145 0xa0, 0x1a, 0x03, 0x6e, 0x0c, 0xa0, 0x31, 0x88, 0xc6, 0xe0, 0x1a, 0x83,
2146 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a,
2147 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc,
2148 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74,
2149 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0xa4, 0xef, 0x19, 0x03,
2150 0x6d, 0x0c, 0xbe, 0x31, 0xa8, 0xc6, 0x80, 0x1b, 0x03, 0x68, 0x0c, 0xc0,
2151 0x60, 0x0c, 0xae, 0x31, 0x08, 0x03, 0x2a, 0x61, 0x69, 0x72, 0x2e, 0x62,
2152 0x75, 0x66, 0x66, 0x65, 0x72, 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc4, 0xea,
2153 0xcc, 0xcc, 0xca, 0xe4, 0xbe, 0xe6, 0xd2, 0xf4, 0xca, 0x28, 0x85, 0xa5,
2154 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5,
2155 0xb9, 0x91, 0x95, 0xe1, 0x11, 0x09, 0x4b, 0x93, 0x73, 0x91, 0x2b, 0x0b,
2156 0x23, 0x23, 0x15, 0x96, 0x26, 0xe7, 0x32, 0x47, 0x27, 0x57, 0x37, 0x46,
2157 0xf7, 0x45, 0x97, 0x07, 0x57, 0xf6, 0x95, 0xe6, 0x66, 0xf6, 0xc6, 0xc2,
2158 0x8c, 0xed, 0x2d, 0x8c, 0x8e, 0xcc, 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7,
2159 0x5b, 0x1d, 0x1d, 0x5c, 0x1d, 0x1d, 0x19, 0xba, 0x32, 0x3c, 0xba, 0x3a,
2160 0xb9, 0xb2, 0x2f, 0xba, 0x3c, 0xb8, 0x32, 0x2a, 0x69, 0x6e, 0x70, 0x75,
2161 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5c, 0xc6, 0xde, 0xd8, 0xde, 0xe4,
2162 0xbe, 0xe6, 0xc6, 0xc2, 0xd8, 0xca, 0xe8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5,
2163 0x85, 0xc1, 0x7d, 0xb5, 0x95, 0xd1, 0xa1, 0xbd, 0x91, 0xf1, 0xa1, 0x7b,
2164 0x73, 0x2b, 0x6b, 0x0b, 0x83, 0xfb, 0x32, 0x0b, 0x1b, 0xa3, 0x7b, 0x93,
2165 0x8b, 0xe1, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16, 0x06, 0xf7, 0x65, 0x16,
2166 0x36, 0x46, 0xf7, 0x26, 0x27, 0xc3, 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e,
2167 0x2d, 0x8d, 0xae, 0xec, 0x0b, 0xee, 0x2d, 0xcd, 0x8d, 0x6e, 0x08, 0x2c,
2168 0x7c, 0xcb, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xa4, 0xc1, 0xd7,
2169 0x7c, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x81, 0x1a, 0x7c, 0xd0, 0xd7,
2170 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xac, 0xc1, 0x47, 0x7d, 0xcd, 0xb7,
2171 0x8c, 0x01, 0x1a, 0x8c, 0x01, 0x1b, 0x7c, 0xce, 0xd7, 0x7c, 0xcb, 0x18,
2172 0xa0, 0xc1, 0x18, 0xb4, 0xc1, 0x57, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a,
2173 0x8c, 0x81, 0x1b, 0x7c, 0xd6, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18,
2174 0xbc, 0xc1, 0x77, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01, 0x1c,
2175 0x30, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83,
2176 0x2b, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xe3, 0x15, 0x96, 0x26, 0xe7, 0x12,
2177 0x26, 0x77, 0xf6, 0x45, 0x97, 0x07, 0x57, 0xf6, 0x15, 0xc6, 0x96, 0x76,
2178 0xe6, 0xf6, 0x35, 0x97, 0xa6, 0x57, 0xc6, 0x67, 0x0a, 0x2d, 0x8c, 0xac,
2179 0x4c, 0x6e, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x8e, 0xc1,
2180 0xd8, 0x10, 0x32, 0xf8, 0xa6, 0x31, 0x18, 0x83, 0x31, 0x20, 0x83, 0x2f,
2181 0x1a, 0x83, 0x32, 0xf8, 0x96, 0x8f, 0x19, 0x03, 0x33, 0x18, 0x83, 0x33,
2182 0x18, 0x83, 0x38, 0x18, 0x03, 0x39, 0xf8, 0xa2, 0x31, 0x98, 0x83, 0xaf,
2183 0x19, 0x03, 0x68, 0x0c, 0xe8, 0x60, 0x0c, 0xae, 0x31, 0xa8, 0x03, 0x1a,
2184 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x34, 0xde, 0xcc, 0xcc, 0xe6, 0xca,
2185 0xe8, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xcd, 0xe0, 0xcd, 0xd0, 0x68,
2186 0x0b, 0xa3, 0x93, 0x4b, 0xc3, 0x1b, 0x42, 0x7d, 0xcb, 0xe7, 0x7c, 0xcb,
2187 0x18, 0xdc, 0xc1, 0x18, 0xe0, 0xc1, 0xe7, 0x7c, 0xd8, 0xb7, 0x8c, 0x41,
2188 0x1e, 0x8c, 0x81, 0x1e, 0x30, 0xc9, 0xaa, 0xb2, 0x22, 0x2a, 0x1b, 0x7b,
2189 0x23, 0x2b, 0xa3, 0x41, 0x56, 0x36, 0xf6, 0x46, 0x56, 0x36, 0x84, 0x0c,
2190 0xbe, 0x66, 0x0c, 0xc6, 0x60, 0x0c, 0xc8, 0xe0, 0x93, 0xc6, 0xa0, 0x0c,
2191 0x3e, 0xe6, 0x63, 0xc6, 0xc0, 0x0c, 0xc6, 0xe0, 0x0c, 0xc6, 0x60, 0x0f,
2192 0xc6, 0x40, 0x0e, 0x3e, 0x69, 0x0c, 0xe6, 0xe0, 0x73, 0xc6, 0x00, 0x1a,
2193 0x03, 0x3e, 0x18, 0x83, 0x6b, 0x0c, 0xfa, 0x80, 0x4b, 0x58, 0x9a, 0x9c,
2194 0x0b, 0x5d, 0x19, 0x1e, 0x5d, 0x9d, 0x5c, 0x19, 0x95, 0xb0, 0x34, 0x39,
2195 0x97, 0xb9, 0xb0, 0x36, 0x38, 0xb6, 0x32, 0x62, 0x74, 0x65, 0x78, 0x74,
2196 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c,
2197 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x24, 0xe8, 0xca, 0xf0,
2198 0xb2, 0x86, 0x50, 0x5f, 0x36, 0x06, 0x7f, 0x30, 0x06, 0x65, 0xf0, 0x2d,
2199 0x1f, 0x33, 0x06, 0xa0, 0x30, 0x06, 0xd0, 0x18, 0x84, 0xc2, 0x18, 0x5c,
2200 0x63, 0x20, 0x0a, 0x2c, 0xe8, 0xca, 0xf0, 0xaa, 0xac, 0x86, 0x50, 0x9f,
2201 0x36, 0x06, 0x7f, 0x30, 0x06, 0x65, 0xf0, 0x31, 0x1f, 0x33, 0x06, 0xa0,
2202 0x30, 0x06, 0xd0, 0x18, 0x84, 0xc2, 0x18, 0x5c, 0x63, 0x40, 0x0a, 0x5c,
2203 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78,
2204 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x7d,
2205 0xdb, 0x18, 0x98, 0xc2, 0x18, 0x94, 0xc1, 0xb7, 0x7c, 0xcc, 0x18, 0x40,
2206 0x63, 0x70, 0x0a, 0x63, 0x70, 0x8d, 0x01, 0x2a, 0x0c, 0x81, 0xc6, 0x20,
2207 0x1b, 0x03, 0x6f, 0x0c, 0xc4, 0x60, 0x0c, 0xec, 0x60, 0x0c, 0xfc, 0x60,
2208 0x0c, 0x46, 0x61, 0x0c, 0x4a, 0x61, 0x0c, 0x52, 0x61, 0x88, 0xf1, 0x00,
2209 0x63, 0x30, 0x8d, 0x81, 0x2a, 0xb0, 0xfa, 0xd2, 0xa2, 0x9a, 0x8a, 0xa9,
2210 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b,
2211 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, 0x06, 0xf7, 0x46, 0x57,
2212 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, 0x67, 0x2a, 0xad, 0x0d,
2213 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, 0x4a, 0x28, 0x28, 0x68,
2214 0x88, 0x30, 0x06, 0xae, 0x30, 0xc4, 0x18, 0x83, 0x56, 0x18, 0x83, 0x57,
2215 0x28, 0x83, 0x6e, 0x88, 0x31, 0x06, 0x68, 0x30, 0x06, 0xb0, 0x50, 0x06,
2216 0xdd, 0x10, 0x31, 0x18, 0x03, 0x56, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6e,
2217 0x0c, 0x62, 0xa1, 0x0c, 0xbc, 0x31, 0x88, 0x85, 0x32, 0xf8, 0xc6, 0x20,
2218 0x16, 0xca, 0x00, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x20, 0x0c, 0xc6, 0x20,
2219 0x16, 0xca, 0x40, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x60, 0x0c, 0xc6, 0x20,
2220 0x16, 0xca, 0x80, 0x1b, 0x62, 0x8c, 0x81, 0x2c, 0x8c, 0x41, 0x2c, 0x94,
2221 0x81, 0xc7, 0x31, 0x08, 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b,
2222 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x9b, 0x43, 0x99, 0x22, 0x62, 0xfa,
2223 0x72, 0xb2, 0x8a, 0x91, 0xf9, 0x32, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73,
2224 0xa3, 0x4b, 0x19, 0x42, 0x8c, 0x41, 0x2d, 0x8c, 0x01, 0x2d, 0x10, 0x0b,
2225 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b,
2226 0x83, 0x2b, 0x6b, 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0x9b, 0x1b,
2227 0x62, 0x8c, 0xc1, 0x2d, 0x8c, 0x41, 0x2d, 0x8c, 0x81, 0x2d, 0x10, 0x0b,
2228 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b,
2229 0x83, 0x2b, 0x6b, 0x99, 0x0b, 0x6b, 0x83, 0x63, 0x2b, 0x93, 0x9b, 0x1b,
2230 0x62, 0x8c, 0x41, 0x2e, 0x8c, 0x41, 0x2d, 0x8c, 0x01, 0x2e, 0x0c, 0x21,
2231 0xc6, 0xe0, 0x16, 0xc6, 0x20, 0x17, 0x86, 0x18, 0x63, 0x20, 0x0b, 0x63,
2232 0x10, 0x0b, 0x65, 0xf0, 0x0d, 0x31, 0xc6, 0x40, 0x16, 0xc6, 0x20, 0x16,
2233 0xca, 0x80, 0x1b, 0x62, 0x8c, 0x81, 0x2c, 0x8c, 0x41, 0x2c, 0x94, 0x41,
2234 0x18, 0x0c, 0x31, 0xc6, 0x40, 0x16, 0xc6, 0x20, 0x16, 0xca, 0x40, 0x0c,
2235 0x86, 0x18, 0x63, 0x20, 0x0b, 0x63, 0x10, 0x0b, 0x65, 0x30, 0x06, 0x43,
2236 0x8c, 0x31, 0x90, 0x85, 0x31, 0x88, 0x85, 0x32, 0x00, 0x83, 0x21, 0xc6,
2237 0x18, 0xc8, 0xc2, 0x18, 0xc4, 0x42, 0x19, 0x74, 0x23, 0x22, 0x76, 0x60,
2238 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x77, 0x20, 0x87, 0x7a, 0x60,
2239 0x87, 0x72, 0x70, 0x03, 0x73, 0x60, 0x87, 0x70, 0x38, 0x87, 0x79, 0x98,
2240 0x22, 0x04, 0xc3, 0x08, 0x85, 0x1d, 0xd8, 0xc1, 0x1e, 0xda, 0xc1, 0x0d,
2241 0xd2, 0x81, 0x1c, 0xca, 0xc1, 0x1d, 0xe8, 0x61, 0x4a, 0x50, 0x8c, 0x58,
2242 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d, 0xec, 0xa1, 0x1c, 0xe4, 0x61, 0x1e,
2243 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x4a, 0x60, 0x8c, 0xa0, 0xc2, 0x21, 0x1d,
2244 0xe4, 0xc1, 0x0d, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xea, 0x21, 0x1c,
2245 0xce, 0xa1, 0x1c, 0x7e, 0xc1, 0x1e, 0xca, 0x41, 0x1e, 0xe6, 0x21, 0x1d,
2246 0xde, 0xc1, 0x1d, 0xa6, 0x04, 0xc8, 0x88, 0x29, 0x1c, 0xd2, 0x41, 0x1e,
2247 0xdc, 0x60, 0x1c, 0xde, 0xa1, 0x1d, 0xe0, 0x21, 0x1d, 0xd8, 0xa1, 0x1c,
2248 0x7e, 0xe1, 0x1d, 0xe0, 0x81, 0x1e, 0xd2, 0xe1, 0x1d, 0xdc, 0x61, 0x1e,
2249 0xa6, 0x0c, 0x0a, 0xe3, 0x8c, 0x60, 0xc2, 0x21, 0x1d, 0xe4, 0xc1, 0x0d,
2250 0xcc, 0x41, 0x1e, 0xc2, 0xe1, 0x1c, 0xda, 0xa1, 0x1c, 0xdc, 0x81, 0x1e,
2251 0xa6, 0x04, 0xab, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
2252 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
2253 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
2254 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
2255 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
2256 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
2257 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
2258 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
2259 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
2260 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
2261 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
2262 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
2263 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
2264 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
2265 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
2266 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
2267 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
2268 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
2269 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
2270 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
2271 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
2272 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
2273 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
2274 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
2275 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
2276 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
2277 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
2278 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
2279 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
2280 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
2281 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
2282 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
2283 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
2284 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
2285 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
2286 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
2287 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
2288 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
2289 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
2290 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
2291 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
2292 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
2293 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
2294 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
2295 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
2296 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
2297 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
2298 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
2299 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
2300 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
2301 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
2302 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
2303 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
2304 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
2305 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
2306 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
2307 0x00, 0x71, 0x20, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd,
2308 0x73, 0x6d, 0x6b, 0xcf, 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74,
2309 0xd5, 0xfd, 0x17, 0x45, 0x51, 0x14, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17,
2310 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x11, 0x34,
2311 0x00, 0x12, 0xf9, 0x83, 0x33, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x6c,
2312 0x00, 0x12, 0xf9, 0x12, 0xc0, 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51,
2313 0x11, 0xf1, 0xdb, 0x83, 0x5f, 0xe1, 0xc5, 0x6d, 0x1b, 0xc2, 0x04, 0x20,
2314 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x17, 0x40, 0x20, 0xf9, 0xd5, 0x5d, 0xdc,
2315 0xb6, 0x05, 0x50, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xbf, 0xb0, 0x00,
2316 0xcc, 0xe3, 0x57, 0x77, 0x71, 0xdb, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17,
2317 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x02,
2318 0x10, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, 0xff, 0x38, 0x96, 0x5f, 0xdc,
2319 0xb6, 0x01, 0x44, 0x6c, 0x57, 0xfe, 0xe7, 0x5b, 0xdb, 0x7f, 0x11, 0x01,
2320 0x06, 0x43, 0x34, 0x93, 0x0d, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d,
2321 0x7f, 0x01, 0x04, 0x92, 0x5f, 0xdc, 0xb6, 0x19, 0x44, 0x00, 0x12, 0xf9,
2322 0x05, 0x20, 0x4d, 0x7f, 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00,
2323 0x00, 0x61, 0x20, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x13, 0x04, 0x72,
2324 0x10, 0x0b, 0x04, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0xd4, 0x8e, 0x45,
2325 0x00, 0x81, 0x70, 0xcc, 0x41, 0x2c, 0xcc, 0x83, 0x07, 0x94, 0x8e, 0x35,
2326 0x00, 0x03, 0x31, 0xc7, 0xb0, 0x30, 0x78, 0x30, 0xc7, 0xb0, 0xe0, 0x01,
2327 0x1e, 0x8c, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0x65, 0x11, 0x94, 0x00,
2328 0x81, 0x63, 0x09, 0x01, 0x30, 0x02, 0x40, 0xdf, 0x0c, 0x00, 0x79, 0x23,
2329 0x00, 0x35, 0x40, 0xc0, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x33, 0x00, 0x73,
2330 0x10, 0xb4, 0xa0, 0x0b, 0xb4, 0xb0, 0x07, 0x24, 0xcc, 0x00, 0x50, 0x31,
2331 0x03, 0x30, 0x02, 0x30, 0x03, 0x30, 0xd6, 0x00, 0x82, 0x20, 0x88, 0x7f,
2332 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x63, 0x0d, 0x6c,
2333 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4,
2334 0x37, 0xd6, 0x00, 0x82, 0x20, 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd,
2335 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x8c, 0x35, 0x80, 0x20, 0xb8, 0xe6,
2336 0x60, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06,
2337 0x63, 0x0d, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60,
2338 0x00, 0x82, 0x74, 0x9b, 0x83, 0xc1, 0x58, 0xc3, 0x3a, 0xe2, 0x31, 0x0b,
2339 0x06, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0x30,
2340 0xd6, 0x00, 0x82, 0x30, 0x1e, 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06,
2341 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x8c, 0x35, 0x88, 0xb9, 0x98, 0xf6, 0x1f,
2342 0x58, 0xf2, 0x6c, 0xfc, 0x0b, 0x63, 0xba, 0xaa, 0xb9, 0x2f, 0x8c, 0x35,
2343 0xfc, 0x33, 0xe9, 0xff, 0xbe, 0x40, 0xd7, 0xa0, 0x98, 0x7f, 0x2d, 0x1c,
2344 0xc7, 0xa0, 0x2f, 0x8c, 0x35, 0xcc, 0x7d, 0x9b, 0xa6, 0xbe, 0xd0, 0xba,
2345 0x21, 0xcf, 0xfb, 0x02, 0x9f, 0xb3, 0x3e, 0xfe, 0x11, 0x30, 0x46, 0x00,
2346 0x82, 0x20, 0x48, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06,
2347 0x63, 0x04, 0x3a, 0x6b, 0xce, 0x21, 0x18, 0x8c, 0x11, 0xbc, 0x7b, 0x5a,
2348 0xde, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c,
2349 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0x80,
2350 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63,
2351 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e,
2352 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa,
2353 0xd3, 0xdd, 0x08, 0x00, 0x00, 0xe3, 0x0d, 0x73, 0xe0, 0x07, 0xaf, 0x40,
2354 0xc1, 0x18, 0x6e, 0x08, 0x9e, 0x60, 0x96, 0x21, 0x10, 0x82, 0x11, 0x03,
2355 0xa5, 0x08, 0x68, 0x81, 0x0e, 0xe4, 0xe0, 0x0e, 0xc8, 0xe0, 0x0c, 0xca,
2356 0x80, 0x18, 0x31, 0x50, 0x8a, 0xa0, 0x16, 0xe8, 0x60, 0x0e, 0xf0, 0xa0,
2357 0x0c, 0xd0, 0xc0, 0x0c, 0x8a, 0x41, 0x06, 0x61, 0x0c, 0xde, 0x60, 0x90,
2358 0x41, 0x28, 0x83, 0x38, 0x18, 0x64, 0x10, 0x82, 0x39, 0x38, 0x3d, 0x50,
2359 0x97, 0x82, 0x32, 0xc8, 0x10, 0xa4, 0x81, 0x1c, 0x18, 0x11, 0xc0, 0x67,
2360 0xbc, 0xc1, 0x0f, 0x54, 0x61, 0x17, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8,
2361 0x10, 0xb8, 0xc1, 0x1d, 0x8c, 0x18, 0x14, 0x46, 0x70, 0x0e, 0x45, 0x30,
2362 0xc7, 0xf0, 0x06, 0x41, 0x38, 0x8c, 0x57, 0x90, 0x02, 0x2c, 0x84, 0x83,
2363 0x38, 0xe0, 0xc1, 0x05, 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x3a, 0xe8,
2364 0x83, 0x11, 0x83, 0xc2, 0x08, 0xda, 0x61, 0x09, 0xe6, 0x18, 0x8c, 0xc0,
2365 0x1c, 0xc6, 0x2b, 0x54, 0xc1, 0x16, 0xce, 0x01, 0x1d, 0xfe, 0xe0, 0x02,
2366 0x75, 0x29, 0x28, 0x83, 0x0c, 0x81, 0x1e, 0x8c, 0xc2, 0x88, 0x41, 0x61,
2367 0x04, 0xf3, 0x10, 0x05, 0x73, 0x0c, 0x46, 0x90, 0x0e, 0xb3, 0x04, 0xc4,
2368 0x70, 0x43, 0xc7, 0x06, 0xc1, 0x2c, 0xc3, 0x40, 0x04, 0x23, 0x06, 0x4a,
2369 0x11, 0xc0, 0x03, 0x2c, 0xb8, 0xc2, 0x2c, 0x80, 0xc2, 0x28, 0x84, 0x02,
2370 0x18, 0x8c, 0x18, 0x28, 0x45, 0x10, 0x0f, 0xb0, 0xf0, 0x0a, 0xb4, 0x10,
2371 0x0a, 0xa4, 0x20, 0x0a, 0x61, 0x30, 0xc8, 0x10, 0x80, 0x82, 0x29, 0x0c,
2372 0x32, 0x0c, 0xa0, 0xc0, 0x0a, 0x83, 0x0c, 0xc2, 0x1f, 0xb8, 0xc2, 0x20,
2373 0x83, 0x10, 0xc0, 0xc2, 0xdd, 0x82, 0xba, 0x14, 0x94, 0x41, 0x86, 0xc0,
2374 0x14, 0x5e, 0xc1, 0x88, 0x00, 0x3e, 0xe3, 0x0d, 0xbb, 0x70, 0x0e, 0xf8,
2375 0x70, 0x81, 0xba, 0x14, 0x94, 0x41, 0x86, 0x60, 0x15, 0x68, 0x61, 0xc4,
2376 0xa0, 0x30, 0x02, 0x92, 0x28, 0x82, 0x39, 0x06, 0x56, 0x08, 0xfc, 0x61,
2377 0xbc, 0x22, 0x1c, 0xda, 0xc1, 0x1f, 0xfe, 0xa1, 0x16, 0x2e, 0x50, 0x97,
2378 0x82, 0x32, 0xc8, 0x10, 0xc4, 0x82, 0x2e, 0x8c, 0x18, 0x14, 0x46, 0xa0,
2379 0x12, 0x4b, 0x30, 0xc7, 0x60, 0x04, 0x23, 0x31, 0x5e, 0x71, 0x0e, 0xf3,
2380 0x40, 0x12, 0x25, 0xc1, 0x0b, 0x17, 0xa8, 0x4b, 0x41, 0x19, 0x64, 0x08,
2381 0x6e, 0x01, 0x1c, 0x46, 0x0c, 0x0a, 0x23, 0x80, 0x89, 0x28, 0x98, 0x63,
2382 0x30, 0x02, 0x93, 0x98, 0x25, 0x20, 0x06, 0x3a, 0x02, 0x3e, 0x08, 0x84,
2383 0x01, 0x2e, 0x84, 0x39, 0x86, 0x60, 0x14, 0x48, 0x62, 0xbc, 0x01, 0x1e,
2384 0xf6, 0x21, 0x25, 0x28, 0x18, 0xc3, 0x0d, 0x41, 0x2b, 0x04, 0xb3, 0x0c,
2385 0x85, 0x11, 0x0c, 0x32, 0x10, 0xbf, 0x80, 0x0e, 0xe3, 0x0d, 0xf4, 0xf0,
2386 0x0f, 0x21, 0x41, 0xc1, 0x18, 0x31, 0x20, 0x8c, 0xc0, 0x26, 0x86, 0x11,
2387 0x83, 0xc2, 0x08, 0x70, 0x22, 0xd8, 0x05, 0x0b, 0x76, 0x01, 0x3e, 0x23,
2388 0x06, 0x85, 0x11, 0xe0, 0x44, 0x00, 0x0e, 0x36, 0xf0, 0x82, 0x7c, 0x8c,
2389 0x17, 0x82, 0xf8, 0xd8, 0x10, 0xd0, 0x67, 0xc4, 0x80, 0x30, 0x82, 0x9e,
2390 0x08, 0x46, 0x0c, 0x0a, 0x23, 0xf8, 0x89, 0xc0, 0x17, 0x2c, 0xf0, 0x05,
2391 0xf9, 0xcc, 0x31, 0xa0, 0xc3, 0xd2, 0x13, 0x83, 0x0c, 0x41, 0x3a, 0xdc,
2392 0x83, 0x0d, 0x01, 0x7d, 0x06, 0x19, 0x82, 0x75, 0xe8, 0x87, 0x41, 0x86,
2393 0xa0, 0xfa, 0x87, 0x59, 0x02, 0x63, 0xa0, 0x22, 0x10, 0x0a, 0x36, 0x20,
2394 0xc6, 0x1b, 0x4c, 0x22, 0x26, 0xc2, 0x82, 0x82, 0x31, 0xdc, 0x10, 0xd8,
2395 0x82, 0x33, 0xcb, 0x70, 0x20, 0xc1, 0x20, 0x03, 0x51, 0x0f, 0xfe, 0x30,
2396 0xde, 0xa0, 0x12, 0x35, 0x91, 0x13, 0x14, 0x8c, 0xf1, 0x06, 0x96, 0xb8,
2397 0x09, 0x9d, 0xa0, 0x60, 0x8c, 0x18, 0x20, 0x47, 0x14, 0x17, 0x45, 0x77,
2398 0x0c, 0xc1, 0x20, 0x43, 0x70, 0x0f, 0x29, 0x31, 0xc8, 0x10, 0x2c, 0x2b,
2399 0x31, 0x4b, 0x80, 0x0c, 0x54, 0x04, 0xc2, 0x81, 0x19, 0xc3, 0x0d, 0x61,
2400 0x60, 0x0e, 0xc1, 0x2c, 0x43, 0x72, 0x05, 0xe3, 0x0d, 0x33, 0xe1, 0x13,
2401 0x6f, 0x41, 0xc1, 0x18, 0x6e, 0x08, 0xd2, 0x21, 0x98, 0x65, 0x50, 0x96,
2402 0x60, 0x90, 0xa1, 0x10, 0x89, 0x95, 0x18, 0x6f, 0xb8, 0x09, 0xb1, 0x60,
2403 0x0b, 0x0a, 0xc6, 0x1c, 0x43, 0x48, 0x04, 0x76, 0x31, 0xc8, 0x10, 0x88,
2404 0x04, 0x4c, 0x58, 0x50, 0xc8, 0x67, 0x90, 0x21, 0x20, 0x09, 0x9b, 0x98,
2405 0x25, 0x88, 0x83, 0xf1, 0x86, 0x9e, 0x40, 0x0b, 0xbd, 0xa0, 0x60, 0x8c,
2406 0x37, 0xfc, 0x84, 0x5a, 0xd0, 0x05, 0x05, 0x63, 0x90, 0x01, 0x6a, 0x89,
2407 0x9d, 0x18, 0x6e, 0x20, 0xe0, 0xc1, 0x99, 0x65, 0x60, 0xac, 0x60, 0x0c,
2408 0x41, 0x02, 0x8d, 0xe1, 0x86, 0x20, 0x1f, 0x94, 0x59, 0x06, 0xa7, 0x09,
2409 0x4c, 0xd8, 0x07, 0xf9, 0xcc, 0x12, 0x3c, 0x36, 0xf4, 0x03, 0x7c, 0x46,
2410 0x0c, 0x08, 0x23, 0x60, 0x8d, 0xc0, 0x02, 0x90, 0x90, 0xcf, 0x88, 0x41,
2411 0x61, 0x04, 0xaf, 0x11, 0x88, 0xc4, 0x2c, 0xc1, 0x33, 0x50, 0x01, 0x28,
2412 0x8d, 0xe0, 0xcc, 0x31, 0xd8, 0x44, 0x80, 0x1a, 0x63, 0x08, 0x1b, 0x6a,
2413 0x0c, 0x37, 0x04, 0x22, 0xa1, 0xcc, 0x32, 0x44, 0x50, 0x60, 0x02, 0x49,
2414 0xc8, 0x67, 0x96, 0x40, 0xb2, 0xc1, 0x24, 0xe0, 0x33, 0x62, 0x40, 0x18,
2415 0x41, 0x6d, 0x04, 0x16, 0xa4, 0x84, 0x7c, 0x46, 0x0c, 0x0a, 0x23, 0xc0,
2416 0x8d, 0x60, 0x25, 0x66, 0x09, 0xa4, 0x81, 0x0a, 0x40, 0x81, 0x84, 0x68,
2417 0x8e, 0x21, 0x09, 0x60, 0x63, 0x0c, 0x81, 0x0c, 0x5c, 0x63, 0xb8, 0x21,
2418 0x58, 0x09, 0x65, 0x96, 0x81, 0x9a, 0x02, 0x13, 0x5a, 0x42, 0x3e, 0xb3,
2419 0x04, 0x95, 0x0d, 0x2f, 0x01, 0x9f, 0x11, 0x03, 0xc2, 0x08, 0x7c, 0x23,
2420 0xb0, 0x40, 0x26, 0xe4, 0x33, 0x62, 0x50, 0x18, 0x41, 0x78, 0x04, 0x34,
2421 0x31, 0x4b, 0x50, 0x0d, 0x54, 0x00, 0xca, 0x24, 0x50, 0x73, 0x0c, 0x49,
2422 0x60, 0x1b, 0xb3, 0x04, 0xd6, 0x40, 0x45, 0x20, 0x54, 0x7a, 0xb0, 0x0c,
2423 0x32, 0x04, 0x6b, 0x41, 0x17, 0x73, 0x0c, 0x68, 0x01, 0x06, 0xbd, 0x31,
2424 0xc8, 0x10, 0xa4, 0xc5, 0x5d, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x58,
2425 0x8b, 0xbe, 0x98, 0x25, 0x88, 0x83, 0xe1, 0x86, 0x59, 0xf0, 0x89, 0x60,
2426 0x96, 0x01, 0x23, 0x83, 0x60, 0x90, 0x81, 0x0e, 0xe2, 0x42, 0x2f, 0xc6,
2427 0x1b, 0x4c, 0x23, 0x36, 0xc6, 0x83, 0x82, 0x31, 0xde, 0x80, 0x1a, 0xb3,
2428 0xd1, 0x1b, 0x14, 0x8c, 0x39, 0x06, 0xb9, 0x08, 0xce, 0x63, 0x90, 0x21,
2429 0x98, 0x8b, 0xd0, 0xb0, 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x50, 0x17, 0xa7,
2430 0x31, 0xdc, 0x70, 0xf0, 0x84, 0x33, 0xcb, 0x30, 0x06, 0x59, 0x30, 0x86,
2431 0x30, 0xb0, 0xc7, 0x70, 0x43, 0xf0, 0x13, 0xca, 0x2c, 0xc3, 0xa6, 0x05,
2432 0x26, 0x84, 0x85, 0x7c, 0x66, 0x09, 0xb8, 0x11, 0x03, 0xc2, 0x08, 0xee,
2433 0x63, 0x18, 0x31, 0x28, 0x8c, 0x20, 0x3f, 0x02, 0xb2, 0xb0, 0xc0, 0x2c,
2434 0xe4, 0x63, 0x01, 0x5a, 0xc0, 0x67, 0x96, 0x80, 0x1b, 0xa8, 0x00, 0x14,
2435 0x4d, 0xd8, 0xe6, 0x18, 0xfa, 0x22, 0xa0, 0x8f, 0x31, 0x04, 0x86, 0x3e,
2436 0x86, 0x1b, 0x02, 0xb4, 0x50, 0x66, 0x19, 0xbc, 0x2e, 0x30, 0x41, 0x2d,
2437 0xe4, 0x33, 0x4b, 0xf0, 0x8d, 0x18, 0x10, 0x46, 0x00, 0x22, 0xc3, 0x88,
2438 0x41, 0x61, 0x04, 0x22, 0x12, 0xb4, 0x85, 0x05, 0x6f, 0x21, 0x1f, 0x0b,
2439 0xe2, 0x02, 0x3e, 0xb3, 0x04, 0xdf, 0x40, 0x05, 0xa0, 0x74, 0x82, 0x37,
2440 0xc7, 0x90, 0x04, 0xfc, 0x31, 0x86, 0x50, 0xe9, 0xc7, 0x70, 0x43, 0x10,
2441 0x17, 0xca, 0x2c, 0x43, 0x18, 0x80, 0x41, 0x60, 0xc2, 0x5c, 0xc8, 0x67,
2442 0x96, 0x40, 0x0c, 0x46, 0x0c, 0x08, 0x23, 0x48, 0x91, 0x61, 0xc4, 0xa0,
2443 0x30, 0x82, 0x15, 0x09, 0xec, 0xc2, 0x02, 0xbc, 0x90, 0x8f, 0x05, 0x7a,
2444 0x01, 0x9f, 0x59, 0x02, 0x31, 0x18, 0xa8, 0x00, 0x14, 0x30, 0x10, 0xc2,
2445 0x60, 0x8e, 0x21, 0x09, 0x44, 0x64, 0xc4, 0xc0, 0x30, 0x82, 0x18, 0x09,
2446 0x62, 0xe3, 0x35, 0x06, 0x19, 0x82, 0xd9, 0x28, 0x8f, 0x59, 0x82, 0x31,
2447 0x18, 0xa8, 0x08, 0xfc, 0x00, 0x13, 0xc4, 0x60, 0x90, 0x21, 0xc8, 0x8d,
2448 0xf3, 0x98, 0x25, 0x88, 0x83, 0x59, 0x86, 0x32, 0x88, 0x03, 0x7e, 0x18,
2449 0x64, 0xe8, 0x05, 0xdd, 0x18, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0x66, 0x24,
2450 0x68, 0x8d, 0x39, 0x06, 0xdb, 0x08, 0x5a, 0x64, 0xc4, 0xa0, 0x30, 0x82,
2451 0x1a, 0x19, 0x5c, 0x63, 0x8e, 0x41, 0x08, 0x5c, 0x64, 0xc4, 0xa0, 0x30,
2452 0x82, 0x1b, 0x29, 0x5e, 0x63, 0x8e, 0x41, 0x08, 0x5a, 0x64, 0x90, 0x21,
2453 0xe8, 0x8d, 0xf7, 0x18, 0x64, 0x08, 0xca, 0x21, 0x3e, 0xc6, 0x1b, 0xee,
2454 0x43, 0x44, 0x68, 0x84, 0x82, 0x31, 0xde, 0x90, 0x1f, 0x24, 0xe2, 0x22,
2455 0x14, 0x8c, 0x39, 0x86, 0xf1, 0x08, 0x70, 0x64, 0x90, 0x21, 0x20, 0x0f,
2456 0xf9, 0xb0, 0x20, 0x91, 0xcf, 0x20, 0x43, 0x60, 0x1e, 0xf8, 0x31, 0xdc,
2457 0x70, 0xb4, 0x86, 0x33, 0xcb, 0x00, 0x07, 0x66, 0x10, 0x8c, 0x21, 0x0c,
2458 0x3d, 0x32, 0xdc, 0x10, 0xc0, 0x86, 0x32, 0xcb, 0x80, 0x06, 0x67, 0x10,
2459 0x98, 0x20, 0x1b, 0xf2, 0x99, 0x25, 0x48, 0x83, 0x11, 0x03, 0xc2, 0x08,
2460 0xd0, 0x64, 0x18, 0x31, 0x28, 0x8c, 0x40, 0x4d, 0x82, 0xda, 0xb0, 0xe0,
2461 0x36, 0xe4, 0x63, 0x41, 0x6e, 0xc0, 0x67, 0x96, 0x20, 0x0d, 0x06, 0x2a,
2462 0x00, 0xe5, 0x0c, 0x04, 0x34, 0x98, 0x63, 0x70, 0x8f, 0xa0, 0x4c, 0xc6,
2463 0x10, 0x98, 0x32, 0x19, 0x6e, 0x08, 0x72, 0x43, 0x99, 0x65, 0x58, 0x03,
2464 0x35, 0x08, 0x4c, 0xd8, 0x0d, 0xf9, 0xcc, 0x12, 0xb0, 0xc1, 0x88, 0x01,
2465 0x61, 0x04, 0x71, 0x32, 0x8c, 0x18, 0x14, 0x46, 0x30, 0x27, 0x81, 0x6f,
2466 0x58, 0x00, 0x1e, 0xf2, 0xb1, 0x40, 0x3c, 0xe0, 0x33, 0x4b, 0xc0, 0x06,
2467 0x03, 0x15, 0x80, 0xa2, 0x06, 0xc2, 0x1a, 0xcc, 0x31, 0x24, 0x41, 0x9b,
2468 0x8c, 0x21, 0x54, 0x6b, 0x32, 0xdc, 0x10, 0x88, 0x87, 0x32, 0xcb, 0xe0,
2469 0x06, 0x6d, 0x10, 0x98, 0x40, 0x1e, 0xf2, 0x99, 0x25, 0x78, 0x83, 0x11,
2470 0x03, 0xc2, 0x08, 0xf4, 0x64, 0x18, 0x31, 0x28, 0x8c, 0x80, 0x4f, 0x82,
2471 0xf3, 0xb0, 0x20, 0x3d, 0xe4, 0x63, 0xc1, 0x7a, 0xc0, 0x67, 0x96, 0xe0,
2472 0x0d, 0x06, 0x2a, 0x00, 0xa5, 0x0d, 0x04, 0x37, 0x98, 0x63, 0x48, 0x82,
2473 0x39, 0x19, 0x31, 0x30, 0x8c, 0x40, 0x54, 0x02, 0x11, 0x01, 0x91, 0x41,
2474 0x86, 0x80, 0x44, 0x6c, 0x64, 0x96, 0x00, 0x0e, 0x06, 0x2a, 0x02, 0x3f,
2475 0x28, 0x03, 0xe1, 0x0d, 0x06, 0x19, 0x02, 0x15, 0xc1, 0x91, 0x59, 0x82,
2476 0x38, 0x18, 0x68, 0x09, 0x78, 0x44, 0xe1, 0x11, 0x8b, 0x47, 0xc6, 0x40,
2477 0x16, 0xe0, 0x80, 0x47, 0xc8, 0x60, 0xa0, 0x25, 0x40, 0x11, 0x45, 0x2f,
2478 0x2c, 0x73, 0x18, 0x03, 0x02, 0x0e, 0x68, 0x88, 0x0c, 0x06, 0x19, 0x02,
2479 0x81, 0x47, 0x2c, 0x20, 0x13, 0xf9, 0x64, 0x10, 0x0e, 0x04, 0x00, 0x00,
2480 0x00, 0x0d, 0x00, 0x00, 0x00, 0x17, 0xd3, 0x07, 0xff, 0x5c, 0xe3, 0x20,
2481 0x31, 0xa1, 0xd4, 0xf4, 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8,
2482 0x5f, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd,
2483 0x44, 0xd6, 0x39, 0x7b, 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40,
2484 0x33, 0x49, 0x3e, 0x71, 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00,
2485 0x00, 0x19, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0x98, 0x85, 0x2d, 0x03,
2486 0x71, 0xe8, 0xc2, 0x96, 0xa1, 0x38, 0x74, 0x61, 0xcb, 0x20, 0x06, 0x87,
2487 0x2e, 0x6c, 0x19, 0xc6, 0xe0, 0xd0, 0x85, 0x2d, 0x83, 0x28, 0x04, 0xbb,
2488 0xb0, 0x65, 0x38, 0x85, 0x80, 0x17, 0xb6, 0x0c, 0xba, 0x10, 0xf4, 0xc2,
2489 0x96, 0xe1, 0x17, 0x02, 0x5f, 0xd8, 0x32, 0x84, 0x43, 0xf0, 0x0b, 0x5b,
2490 0x06, 0x75, 0x08, 0x66, 0x61, 0xcb, 0xf0, 0x0e, 0x01, 0x38, 0x6c, 0x19,
2491 0xec, 0x21, 0x08, 0x87, 0x2d, 0x03, 0x3e, 0x04, 0xe0, 0xb0, 0x65, 0x60,
2492 0x8b, 0x20, 0x1c, 0xb6, 0x0c, 0x6e, 0x11, 0x80, 0xc3, 0x96, 0x41, 0x3d,
2493 0x82, 0x70, 0xd8, 0x32, 0xb0, 0x47, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
2494 0x00, 0x61, 0x20, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a,
2495 0x2c, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xd4, 0xce, 0x41,
2496 0x2c, 0xcc, 0xd3, 0x06, 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40,
2497 0xdf, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0,
2498 0xec, 0x19, 0xca, 0x1f, 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce,
2499 0xde, 0x58, 0x83, 0x5e, 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf,
2500 0xdb, 0xa7, 0xf4, 0xe8, 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a,
2501 0xc2, 0xe8, 0xee, 0xdd, 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b,
2502 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb,
2503 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9,
2504 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea,
2505 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05,
2506 0x33, 0x00, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60,
2507 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5,
2508 0x02, 0x0d, 0x37, 0x50, 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43,
2509 0x43, 0xc5, 0xc1, 0x20, 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64,
2510 0x08, 0xa0, 0x6a, 0x96, 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61,
2511 0x48, 0x82, 0xe1, 0x86, 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31,
2512 0x28, 0x8c, 0xc0, 0x0f, 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4,
2513 0xa0, 0x30, 0x02, 0x50, 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11,
2514 0x83, 0xc2, 0x08, 0x44, 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83,
2515 0x59, 0x82, 0x62, 0xa0, 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc,
2516 0x60, 0x0c, 0x41, 0xf0, 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a,
2517 0x23, 0x30, 0x05, 0x21, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x14, 0x88, 0x60,
2518 0xb8, 0x21, 0xb8, 0x84, 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c,
2519 0x0c, 0x6c, 0x40, 0x03, 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90,
2520 0x8f, 0x05, 0x1a, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81,
2521 0x2a, 0x0c, 0x32, 0x04, 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64,
2522 0x08, 0xd2, 0xc0, 0x0d, 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4,
2523 0xa0, 0x98, 0x65, 0x40, 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18,
2524 0x31, 0x28, 0x8c, 0xe0, 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20,
2525 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xc8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84,
2526 0x40, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xd8, 0x85, 0x42, 0x0d, 0xe6, 0x18,
2527 0x84, 0x20, 0x16, 0x66, 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57,
2528 0x10, 0x04, 0x04, 0x3a, 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00,
2529 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2530 0x00, 0x00, 0x00, 0x00, 0x00
2531};
2532const unsigned int sdl_metallib_len = 30341;
diff --git a/SDL-3.2.8/src/render/metal/SDL_shaders_metal_tvos.h b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_tvos.h
new file mode 100644
index 0000000..5d04118
--- /dev/null
+++ b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_tvos.h
@@ -0,0 +1,2612 @@
1const unsigned char sdl_metallib[] = {
2 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
3 0x00, 0x00, 0x00, 0x00, 0x45, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00,
5 0x00, 0x00, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00,
7 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0xe5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x76, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
10 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f,
11 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54,
12 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00,
13 0x60, 0x7a, 0x81, 0x65, 0xda, 0xf6, 0x14, 0xc4, 0x56, 0x47, 0x0b, 0x7a,
14 0x77, 0x81, 0xf4, 0xc0, 0x01, 0xee, 0xcd, 0x26, 0x7c, 0x2d, 0x8d, 0x7b,
15 0x28, 0x66, 0x63, 0x5c, 0x85, 0xe9, 0xdd, 0xb9, 0x4f, 0x46, 0x46, 0x54,
16 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00,
19 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x77, 0x00, 0x00, 0x00,
20 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f,
21 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54, 0x59,
22 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x6e,
23 0xc3, 0x21, 0x35, 0x82, 0x00, 0x01, 0xe8, 0xa4, 0x27, 0xe1, 0xec, 0x73,
24 0xf1, 0xe9, 0x58, 0x2e, 0x4a, 0x0d, 0xc0, 0x5a, 0x63, 0x1e, 0x7f, 0x35,
25 0xf1, 0x6e, 0x35, 0x4e, 0xbf, 0x18, 0xae, 0x4f, 0x46, 0x46, 0x54, 0x18,
26 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
27 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
28 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01,
29 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x7a, 0x00, 0x00, 0x00, 0x4e,
30 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c,
31 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00,
32 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20,
33 0x00, 0x6a, 0x1d, 0x1d, 0x45, 0x2a, 0x6b, 0x07, 0x82, 0x0a, 0x87, 0xce,
34 0x97, 0xa1, 0xfe, 0x31, 0x9c, 0x83, 0x91, 0x37, 0x14, 0x18, 0x48, 0x21,
35 0x09, 0xd8, 0x88, 0xe6, 0x6a, 0xd7, 0xa1, 0x43, 0x12, 0x4f, 0x46, 0x46,
36 0x54, 0x18, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x19, 0x00, 0x00, 0x00,
38 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00, 0x08,
39 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00, 0x00,
40 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43,
41 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74,
42 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48,
43 0x20, 0x00, 0xc3, 0xd6, 0x7b, 0x88, 0x85, 0xf9, 0x2a, 0x82, 0x3a, 0xbd,
44 0x11, 0xe6, 0x1e, 0x52, 0xa3, 0x10, 0xbc, 0xf6, 0x87, 0xcf, 0x2b, 0x30,
45 0xb1, 0x9a, 0xa7, 0x8c, 0xf0, 0x69, 0xee, 0x5a, 0x25, 0x8c, 0x4f, 0x46,
46 0x46, 0x54, 0x18, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x25, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00,
49 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x78, 0x00,
50 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f,
51 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74,
52 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48,
53 0x20, 0x00, 0x9f, 0x6c, 0xde, 0x3a, 0x59, 0x77, 0x6a, 0xd2, 0x35, 0x5f,
54 0x27, 0x58, 0x9c, 0x4b, 0xdb, 0x9c, 0x88, 0xf7, 0xdf, 0x70, 0x9e, 0x17,
55 0x60, 0xc0, 0xe8, 0x92, 0xf3, 0x9d, 0xc8, 0x6a, 0x12, 0x45, 0x4f, 0x46,
56 0x46, 0x54, 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x3e, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01, 0x00,
59 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x79, 0x00,
60 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f,
61 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e,
62 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53,
63 0x48, 0x20, 0x00, 0xa0, 0xfa, 0x0c, 0x39, 0x0e, 0x54, 0xa2, 0xb2, 0x34,
64 0x03, 0x53, 0x34, 0x18, 0x63, 0x46, 0x2e, 0x1a, 0x02, 0x79, 0x8d, 0x88,
65 0x29, 0x32, 0xb9, 0xcc, 0xcd, 0x6b, 0xaa, 0xd8, 0x7a, 0x01, 0xd6, 0x4f,
66 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x5a, 0x00,
68 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x01,
69 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x29,
70 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15, 0x00, 0x02, 0x00, 0x70,
71 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f,
72 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41, 0x54, 0x59, 0x04, 0x00,
73 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54, 0x35, 0x00, 0x00, 0x00,
74 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00, 0x70, 0x6f, 0x73, 0x69,
75 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
76 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x00,
77 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00, 0x03, 0x00, 0x04, 0x06,
78 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
79 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
80 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
81 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
82 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
83 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
84 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
85 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
86 0x00, 0xac, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
87 0xde, 0x21, 0x0c, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20,
88 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
89 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
90 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
91 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
92 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
93 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8,
94 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
95 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff,
96 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78,
97 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30,
98 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e,
99 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d,
100 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c,
101 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c,
102 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78,
103 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70,
104 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08,
105 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0,
106 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00,
107 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
108 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d,
109 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d,
110 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d,
111 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00,
112 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68,
113 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
114 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
115 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d,
116 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
117 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70,
118 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98,
119 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
120 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
121 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d,
122 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90,
123 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58,
124 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0,
125 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28,
126 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f,
127 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d,
128 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
129 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, 0xc2, 0x00, 0x2c, 0x40,
130 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83,
131 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03,
132 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, 0x1b, 0x08, 0x60, 0x01,
133 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c,
134 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1c,
135 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
136 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
137 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
138 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
139 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
140 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0,
141 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
142 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
143 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
144 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88,
145 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6,
146 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00,
147 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
148 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
149 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51,
150 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
151 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80,
152 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0,
153 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
154 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0,
155 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60,
156 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
157 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
158 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
159 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0,
160 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20,
161 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
162 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
163 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40,
164 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0,
165 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90,
166 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
167 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10,
168 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
169 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
170 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60,
171 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
172 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10,
173 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10,
174 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
175 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80,
176 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18,
177 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00,
178 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c,
179 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x30, 0x02,
180 0x50, 0x80, 0x01, 0x45, 0x50, 0x20, 0x65, 0x50, 0x08, 0x05, 0x41, 0x6c,
181 0x04, 0x80, 0xd6, 0x58, 0x82, 0x24, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
182 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2,
183 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x42,
184 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b,
185 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x07, 0xe3, 0x20, 0x08,
186 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae,
187 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6,
188 0x85, 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac,
189 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65,
190 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x45, 0x60, 0xd1, 0x54,
191 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x45, 0xe0,
192 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6,
193 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17,
194 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e,
195 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74,
196 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
197 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5,
198 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5,
199 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95,
200 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a,
201 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0,
202 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f,
203 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64,
204 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca,
205 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92,
206 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b,
207 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d,
208 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94,
209 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14,
210 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04,
211 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x3a, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f,
212 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xcc, 0xd8, 0xde,
213 0xc2, 0xe8, 0x98, 0xc0, 0xbd, 0xa5, 0xb9, 0xd1, 0x4d, 0xa5, 0xe9, 0x95,
214 0x0d, 0x51, 0x92, 0x2c, 0x81, 0x12, 0x2d, 0x91, 0x92, 0x6d, 0x88, 0x91,
215 0x50, 0x09, 0x96, 0x70, 0x84, 0xc2, 0xd2, 0xe4, 0x5c, 0xec, 0xca, 0xe4,
216 0xe8, 0xca, 0xf0, 0xbe, 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x28, 0x85, 0xa5,
217 0xc9, 0xb9, 0xb0, 0xbd, 0x8d, 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5,
218 0xb9, 0x91, 0x95, 0xe1, 0xd1, 0x3b, 0x2b, 0x73, 0x2b, 0x93, 0x0b, 0xa3,
219 0x2b, 0x23, 0x43, 0xf9, 0xfa, 0x0a, 0x4b, 0x93, 0xfb, 0x82, 0x63, 0x0b,
220 0x1b, 0x2b, 0x43, 0x7b, 0x63, 0x23, 0x2b, 0x93, 0xfb, 0xfa, 0x4a, 0xa1,
221 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x27, 0x33, 0x84, 0x52, 0x84, 0xc4, 0x4b,
222 0x3e, 0x45, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x09, 0x83, 0x44, 0x4a,
223 0xa6, 0x21, 0x94, 0x12, 0x24, 0x5e, 0xf2, 0x29, 0x81, 0x12, 0x24, 0x60,
224 0x90, 0x40, 0x49, 0x94, 0x48, 0xc9, 0x45, 0x25, 0x2c, 0x4d, 0xce, 0x45,
225 0xac, 0xce, 0xcc, 0xac, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c, 0x8b, 0x58,
226 0x9d, 0x99, 0x59, 0x99, 0xdc, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x91, 0xb0,
227 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x46, 0x61, 0x69, 0x72, 0x2e,
228 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a,
229 0x65, 0xbc, 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2,
230 0xe0, 0xca, 0xbe, 0xc2, 0xd8, 0xd2, 0xce, 0xdc, 0xbe, 0xe6, 0xd2, 0xf4,
231 0xca, 0x88, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xd1, 0xe0, 0xd1, 0x50, 0x81,
232 0x93, 0x7b, 0x53, 0x2b, 0x1b, 0xa3, 0x4b, 0x7b, 0x73, 0x1b, 0x02, 0x06,
233 0x0a, 0x91, 0x90, 0x41, 0x52, 0x06, 0xca, 0x90, 0x7c, 0x0a, 0xa1, 0x04,
234 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c, 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25,
235 0x69, 0x90, 0x48, 0x89, 0x1a, 0x30, 0xa1, 0x93, 0x0b, 0x73, 0x9b, 0x33,
236 0x7b, 0x93, 0x6b, 0x1b, 0x02, 0x06, 0x8a, 0x91, 0x90, 0x41, 0x52, 0x06,
237 0xca, 0x90, 0x7c, 0x8a, 0xa1, 0x04, 0x89, 0x19, 0x24, 0x67, 0xa0, 0x0c,
238 0x09, 0x1a, 0x28, 0x45, 0x02, 0x25, 0x69, 0x90, 0x48, 0x09, 0x1b, 0x0c,
239 0x41, 0x12, 0x31, 0x48, 0xc6, 0x20, 0x59, 0x83, 0xa4, 0x0d, 0x86, 0x18,
240 0x08, 0x90, 0x74, 0x89, 0x1b, 0xf0, 0x79, 0x6b, 0x73, 0x4b, 0x83, 0x7b,
241 0xa3, 0x2b, 0x73, 0xa3, 0x03, 0x19, 0x43, 0x0b, 0x93, 0xe3, 0x33, 0x95,
242 0xd6, 0x06, 0xc7, 0x56, 0x06, 0x32, 0xb4, 0xb2, 0x02, 0x42, 0x25, 0x14,
243 0x14, 0x34, 0x44, 0x48, 0xe2, 0x60, 0x88, 0x91, 0xc0, 0x41, 0x22, 0x07,
244 0x4c, 0x32, 0xc4, 0x48, 0xe6, 0x20, 0x99, 0x03, 0x26, 0xa1, 0x18, 0x84,
245 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd,
246 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11, 0x31, 0x7d, 0x4d, 0xbd, 0xb1, 0xa5,
247 0x91, 0x7d, 0xd9, 0x95, 0xc9, 0xd1, 0x95, 0xe1, 0xa5, 0x0c, 0x21, 0x12,
248 0x3b, 0x48, 0xea, 0x80, 0x56, 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a,
249 0xd8, 0x5c, 0xcb, 0xdc, 0xd8, 0x1b, 0x5c, 0x59, 0x4b, 0x98, 0xdc, 0x19,
250 0xca, 0x4c, 0xca, 0x10, 0x23, 0xc1, 0x83, 0xc4, 0x0e, 0x92, 0x3b, 0x18,
251 0x22, 0x24, 0x78, 0x40, 0x2b, 0x2c, 0x4d, 0xae, 0x25, 0x8c, 0x2d, 0x2d,
252 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x25, 0x4c, 0xee, 0x0c,
253 0x45, 0x26, 0x65, 0x88, 0x91, 0xec, 0x41, 0x62, 0x07, 0x89, 0x1e, 0x0c,
254 0x11, 0x92, 0x3d, 0x18, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8,
255 0x41, 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98,
256 0x03, 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28,
257 0xec, 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e,
258 0xee, 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f,
259 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e,
260 0x53, 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e,
261 0xe1, 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b,
262 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25,
263 0x40, 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e,
264 0xed, 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f,
265 0xf4, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67,
266 0x84, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0f, 0xe5, 0x20, 0x0f,
267 0xf4, 0x50, 0x0e, 0xf8, 0x30, 0x25, 0x78, 0x03, 0x00, 0x79, 0x18, 0x00,
268 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
269 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
270 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
271 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
272 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
273 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
274 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
275 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
276 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
277 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
278 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
279 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
280 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
281 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
282 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
283 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
284 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
285 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
286 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
287 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
288 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
289 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
290 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
291 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
292 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
293 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
294 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
295 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
296 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
297 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
298 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
299 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
300 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
301 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
302 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
303 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
304 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
305 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
306 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
307 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
308 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
309 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
310 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
311 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
312 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
313 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
314 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
315 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
316 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
317 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
318 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
319 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
320 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
321 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
322 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
323 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00,
324 0x00, 0x06, 0x00, 0xb1, 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x45,
325 0x44, 0x13, 0x71, 0x01, 0x00, 0x61, 0x20, 0x00, 0x00, 0x5c, 0x00, 0x00,
326 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00,
327 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10,
328 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, 0x15, 0x41, 0x09, 0x94,
329 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00,
330 0x08, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0x1f, 0x00, 0xe3, 0x11, 0x8d,
331 0x94, 0x49, 0x14, 0x94, 0xf1, 0x08, 0x88, 0xda, 0x28, 0x0a, 0xca, 0x20,
332 0xc3, 0x70, 0x34, 0x26, 0x04, 0xf2, 0x19, 0x8f, 0xa0, 0xb0, 0xaf, 0xa1,
333 0xa0, 0x0c, 0x32, 0x1c, 0x8a, 0x64, 0x42, 0x20, 0x1f, 0x0b, 0x0a, 0xf8,
334 0x8c, 0x47, 0x64, 0x1d, 0x19, 0x4c, 0x14, 0x94, 0x41, 0x06, 0xe6, 0xc1,
335 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1, 0x08, 0x4f, 0x0c, 0xd2,
336 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x94, 0x67, 0x42, 0x20, 0x1f, 0x2b,
337 0x02, 0xf8, 0x8c, 0x47, 0x88, 0xc1, 0x19, 0xb8, 0x01, 0x47, 0x41, 0x19,
338 0x64, 0x08, 0x34, 0x30, 0xb0, 0xa0, 0x92, 0xcf, 0x20, 0xc3, 0xb0, 0x8d,
339 0x81, 0x05, 0x93, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8, 0x60, 0x78, 0x67,
340 0x60, 0x41, 0x24, 0x1f, 0x1b, 0x02, 0xf8, 0x0c, 0x32, 0x24, 0x61, 0xb0,
341 0x06, 0x16, 0x3c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x78, 0xc4, 0x1b, 0xd0,
342 0xc1, 0x1e, 0xa0, 0x01, 0x05, 0x65, 0x90, 0x21, 0x38, 0x83, 0x36, 0xb0,
343 0x40, 0x0c, 0xe4, 0x33, 0xc8, 0x30, 0xa0, 0x01, 0x1c, 0x58, 0x00, 0x06,
344 0xf2, 0x19, 0x64, 0x28, 0xd4, 0x60, 0x0e, 0x2c, 0xe8, 0xe4, 0x33, 0xc8,
345 0x70, 0xb0, 0x81, 0x1d, 0x58, 0xa0, 0xc9, 0x67, 0x90, 0x81, 0x0f, 0xe2,
346 0xa0, 0x0e, 0x2c, 0x0b, 0xe4, 0x33, 0xc8, 0xe0, 0x07, 0x73, 0x80, 0x07,
347 0xe6, 0x04, 0xf2, 0xb1, 0x64, 0x80, 0x8f, 0x05, 0x0c, 0x7c, 0x2c, 0x48,
348 0xe0, 0x63, 0x01, 0x02, 0x1f, 0x0b, 0x0a, 0xf8, 0xcc, 0x36, 0xe4, 0x41,
349 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x78, 0x20, 0x64,
350 0x10, 0x10, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20,
351 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72, 0x0c, 0x01, 0x1d, 0x1c,
352 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8, 0xe0, 0xe0, 0x03, 0x24,
353 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f, 0x20, 0x79, 0xb0, 0xe5,
354 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83, 0x2d, 0x87, 0x15, 0xd0,
355 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6, 0x20, 0xa0, 0x83, 0x23,
356 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
358 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
359 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x0b, 0x82, 0x20,
360 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
361 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
362 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
363 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
364 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
365 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x48, 0x11, 0x62, 0xa8,
366 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
367 0x00, 0x79, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24, 0xf8, 0xff, 0xff, 0xff,
368 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78,
369 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30,
370 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e,
371 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d,
372 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c,
373 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c,
374 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c, 0x00, 0x06, 0x77, 0x78,
375 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76, 0xa0, 0x87, 0x74, 0x70,
376 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08,
377 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0,
378 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x00,
379 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
380 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1, 0x0d, 0xe0, 0xe1, 0x1d,
381 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xca, 0x81, 0x1d,
382 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1, 0x1d, 0xda, 0x80, 0x1d,
383 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00,
384 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77, 0x30, 0x87, 0x79, 0x68,
385 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
386 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d,
387 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d,
388 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
389 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79, 0x48, 0x87, 0x73, 0x70,
390 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72, 0x90, 0x87, 0x77, 0x98,
391 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
392 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
393 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01, 0x1e, 0xd2, 0xc1, 0x1d,
394 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90,
395 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a, 0x08, 0x87, 0x71, 0x58,
396 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a, 0x28, 0x87, 0x71, 0xa0,
397 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28,
398 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d, 0x28, 0x07, 0x00, 0x0f,
399 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1, 0x1c, 0xca, 0xa1, 0x0d,
400 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
401 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c, 0x02, 0x01, 0x2c, 0x40,
402 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83,
403 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03,
404 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0x61, 0x1b, 0x0a, 0x60, 0x01,
405 0xaa, 0x21, 0x1c, 0xd2, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c,
406 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1c,
407 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
408 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
409 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
410 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
411 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
412 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00,
413 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
414 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
415 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
416 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c,
417 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4,
418 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00,
419 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
420 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
421 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51,
422 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
423 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80,
424 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0,
425 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
426 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0,
427 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60,
428 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
429 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
430 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
431 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0,
432 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20,
433 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
434 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
435 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40,
436 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0,
437 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90,
438 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
439 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10,
440 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
441 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
442 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60,
443 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
444 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10,
445 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10,
446 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
447 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80,
448 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18,
449 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00,
450 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c,
451 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x25, 0x50, 0x04,
452 0x23, 0x00, 0x05, 0x18, 0x50, 0x08, 0x65, 0x50, 0x20, 0x05, 0x41, 0x6c,
453 0x04, 0x80, 0xd6, 0x58, 0x82, 0x24, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00,
454 0x00, 0x06, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2,
455 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x86, 0x22,
456 0x24, 0xc0, 0xa2, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b,
457 0xd3, 0x2b, 0x1b, 0x62, 0x28, 0x41, 0x22, 0x28, 0x05, 0xe3, 0x20, 0x08,
458 0x0e, 0x8e, 0xad, 0x0c, 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae,
459 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6,
460 0x85, 0x06, 0x86, 0x06, 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac,
461 0xac, 0x65, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65,
462 0x88, 0x90, 0x10, 0x43, 0x0c, 0x25, 0x50, 0x10, 0x65, 0x60, 0xd1, 0x54,
463 0x46, 0x17, 0xc6, 0x36, 0x04, 0x49, 0x0e, 0x25, 0x50, 0x02, 0x65, 0xe0,
464 0x16, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6,
465 0x42, 0x56, 0xe6, 0xf6, 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17,
466 0x26, 0xc6, 0x56, 0x36, 0x44, 0x48, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e,
467 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74,
468 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
469 0x43, 0x84, 0x64, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5,
470 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5,
471 0x99, 0x99, 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95,
472 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0x92, 0x86, 0x4c, 0x58, 0x9a,
473 0x9c, 0x0b, 0xdc, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0x1b, 0xa3, 0xb0,
474 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0x2f,
475 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x64,
476 0xc2, 0xd2, 0xe4, 0x5c, 0xc2, 0xe4, 0xce, 0xbe, 0xdc, 0xc2, 0xda, 0xca,
477 0x88, 0xc0, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x0d, 0x51, 0x92,
478 0x27, 0x81, 0x92, 0x28, 0x91, 0x92, 0x89, 0x51, 0x58, 0x9a, 0x9c, 0x8b,
479 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0xde, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d,
480 0x1d, 0xad, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30, 0xba, 0x32, 0x32, 0x94,
481 0x9a, 0xb1, 0x37, 0xb6, 0x37, 0x39, 0x22, 0x3b, 0x9a, 0x2f, 0xb3, 0x14,
482 0x16, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x43, 0x98, 0xa4, 0x4a, 0xac, 0x04,
483 0x4a, 0xa2, 0x44, 0x4a, 0x2e, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
484 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72,
485 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x34, 0xcc, 0xd8, 0xde, 0xc2,
486 0xe8, 0x64, 0x88, 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x0d,
487 0x61, 0x92, 0x2a, 0xc9, 0x12, 0x28, 0xd1, 0x12, 0x29, 0xd9, 0x86, 0x18,
488 0x09, 0x95, 0x60, 0x09, 0x47, 0x28, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c,
489 0x8e, 0xae, 0x0c, 0xef, 0x2b, 0xcd, 0x0d, 0xae, 0x8e, 0x8e, 0x52, 0x58,
490 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18, 0x5d, 0xda, 0x9b, 0xdb, 0x57,
491 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0xbd, 0xb3, 0x32, 0xb7, 0x32, 0xb9, 0x30,
492 0xba, 0x32, 0x32, 0x94, 0xaf, 0xaf, 0xb0, 0x34, 0xb9, 0x2f, 0x38, 0xb6,
493 0xb0, 0xb1, 0x32, 0xb4, 0x37, 0x36, 0xb2, 0x32, 0xb9, 0xaf, 0xaf, 0x94,
494 0x21, 0x94, 0x32, 0x24, 0x5e, 0xf2, 0x29, 0x83, 0x12, 0x24, 0x60, 0x90,
495 0x40, 0x89, 0x96, 0x48, 0xc9, 0x34, 0x84, 0x52, 0x82, 0xc4, 0x4b, 0x3e,
496 0x25, 0x50, 0x82, 0x04, 0x0c, 0x12, 0x28, 0x89, 0x12, 0x29, 0xb9, 0x86,
497 0x50, 0x8a, 0x90, 0x78, 0xc9, 0xa7, 0x08, 0x4a, 0x90, 0x80, 0x41, 0x02,
498 0x25, 0x5a, 0x22, 0x25, 0x1b, 0x95, 0xb0, 0x34, 0x39, 0x17, 0xb1, 0x3a,
499 0x33, 0xb3, 0x32, 0x39, 0x3e, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66,
500 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x44, 0xc2, 0xd2, 0xe4,
501 0x5c, 0xe4, 0xca, 0xc2, 0xc8, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9,
502 0x9d, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xcd, 0xa5, 0xe9, 0x95, 0xf1,
503 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b,
504 0xfb, 0x0a, 0x63, 0x4b, 0x3b, 0x73, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x23,
505 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x83, 0x47, 0x43, 0x05, 0x4e, 0xee,
506 0x4d, 0xad, 0x6c, 0x8c, 0x2e, 0xed, 0xcd, 0x6d, 0x08, 0x18, 0x28, 0x46,
507 0x42, 0x06, 0x49, 0x19, 0x28, 0x44, 0xf2, 0x29, 0x82, 0x12, 0x24, 0x66,
508 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68, 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41,
509 0x22, 0x25, 0x6a, 0xc0, 0x84, 0x4e, 0x2e, 0xcc, 0x6d, 0xce, 0xec, 0x4d,
510 0xae, 0x6d, 0x08, 0x18, 0x28, 0x45, 0x42, 0x06, 0x49, 0x19, 0x28, 0x44,
511 0xf2, 0x29, 0x86, 0x12, 0x24, 0x66, 0x90, 0x9c, 0x81, 0x42, 0x24, 0x68,
512 0xa0, 0x1c, 0x09, 0x94, 0xa4, 0x41, 0x22, 0x25, 0x6c, 0x30, 0x44, 0x49,
513 0xc2, 0x20, 0x11, 0x83, 0x64, 0x0c, 0x92, 0x35, 0x48, 0xda, 0x60, 0x88,
514 0x81, 0x00, 0x49, 0x97, 0xb8, 0x01, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8,
515 0x37, 0xba, 0x32, 0x37, 0x3a, 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53,
516 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42,
517 0x41, 0x41, 0x43, 0x84, 0x24, 0x0e, 0x86, 0x18, 0x09, 0x1c, 0x24, 0x72,
518 0xc0, 0x24, 0x43, 0x8c, 0x64, 0x0e, 0x92, 0x39, 0x60, 0x12, 0x86, 0x41,
519 0x58, 0x9a, 0x5c, 0x4b, 0x18, 0x5b, 0x5a, 0xd8, 0x5c, 0xcb, 0xdc, 0xd8,
520 0x1b, 0x5c, 0xd9, 0x1c, 0xca, 0x14, 0x11, 0xd3, 0xd7, 0xd0, 0x1b, 0x5c,
521 0xde, 0x97, 0x5d, 0x99, 0x1c, 0x5d, 0x19, 0x5e, 0xca, 0x10, 0x22, 0xb1,
522 0x83, 0xa4, 0x0e, 0x68, 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85,
523 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0x84, 0xc9, 0x9d, 0xa1,
524 0xd0, 0xa4, 0x0c, 0x31, 0x12, 0x3c, 0x48, 0xec, 0x20, 0xb9, 0x83, 0x21,
525 0x42, 0x82, 0x07, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2,
526 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4, 0xce, 0x50,
527 0x66, 0x52, 0x86, 0x18, 0xc9, 0x1e, 0x24, 0x76, 0x90, 0xe8, 0xc1, 0x10,
528 0x21, 0xd9, 0x83, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b,
529 0xb4, 0xc3, 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39,
530 0xb0, 0x43, 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2,
531 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0,
532 0x0e, 0xf4, 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0,
533 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30,
534 0x25, 0x30, 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10,
535 0x0e, 0xee, 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60,
536 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02,
537 0x64, 0xc4, 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0,
538 0x0e, 0xf0, 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40,
539 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46,
540 0x28, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6, 0x50, 0x0e, 0xf2, 0x40,
541 0x0f, 0xe5, 0x80, 0x0f, 0x53, 0x82, 0x37, 0x00, 0x00, 0x79, 0x18, 0x00,
542 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
543 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
544 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
545 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
546 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
547 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
548 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
549 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
550 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
551 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
552 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
553 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
554 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
555 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
556 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
557 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
558 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
559 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
560 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
561 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
562 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
563 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
564 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
565 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
566 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
567 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
568 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
569 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
570 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
571 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
572 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
573 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
574 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
575 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
576 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
577 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
578 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
579 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
580 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
581 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
582 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
583 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
584 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
585 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
586 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
587 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
588 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
589 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
590 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
591 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
592 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
593 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
594 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
595 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
596 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
597 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00,
598 0x00, 0x06, 0xf0, 0xb0, 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x15, 0x11,
599 0x4d, 0xc4, 0x05, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00,
600 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
601 0x00, 0xe4, 0xc6, 0x22, 0x86, 0x61, 0x18, 0xc6, 0x22, 0x04, 0x41, 0x10,
602 0xc6, 0x22, 0x82, 0x20, 0x08, 0x46, 0x00, 0x88, 0x95, 0x40, 0x19, 0x14,
603 0x01, 0x8d, 0x19, 0x00, 0x12, 0x33, 0x00, 0x14, 0x66, 0x00, 0x66, 0x00,
604 0x00, 0xe3, 0x11, 0x8c, 0x84, 0x49, 0x14, 0x94, 0xf1, 0x88, 0x87, 0xd2,
605 0x28, 0x0a, 0xca, 0x20, 0xc3, 0x60, 0x30, 0x26, 0x04, 0xf2, 0x19, 0x8f,
606 0x98, 0x30, 0xaf, 0xa1, 0xa0, 0x0c, 0x32, 0x1c, 0x49, 0x64, 0x42, 0x20,
607 0x1f, 0x0b, 0x0a, 0xf8, 0x8c, 0x47, 0x60, 0xdd, 0x18, 0x40, 0x14, 0x94,
608 0x41, 0x06, 0xc6, 0xb9, 0x4c, 0x08, 0xe4, 0x63, 0x45, 0x00, 0x9f, 0xf1,
609 0x88, 0x4e, 0x0c, 0xd0, 0xc0, 0xa2, 0xa0, 0x0c, 0x32, 0x44, 0x53, 0x67,
610 0x42, 0x20, 0x1f, 0x2b, 0x02, 0xf8, 0x8c, 0x47, 0x84, 0xc1, 0x19, 0xb4,
611 0x01, 0x47, 0x41, 0x19, 0x64, 0x08, 0xb2, 0xcf, 0x82, 0x4a, 0x3e, 0x83,
612 0x0c, 0x83, 0x26, 0x06, 0x16, 0x4c, 0xf2, 0xb1, 0x21, 0x80, 0xcf, 0x20,
613 0x83, 0xd1, 0x99, 0x81, 0x05, 0x91, 0x7c, 0x6c, 0x08, 0xe0, 0x33, 0xc8,
614 0x90, 0x80, 0x81, 0x1a, 0x58, 0xf0, 0xc8, 0xc7, 0x86, 0x00, 0x3e, 0xe3,
615 0x11, 0x6e, 0x40, 0x07, 0x7a, 0x80, 0x06, 0x14, 0x94, 0x41, 0x86, 0xc0,
616 0x0c, 0xd8, 0xc0, 0x02, 0x31, 0x90, 0xcf, 0x20, 0xc3, 0x70, 0x06, 0x6f,
617 0x60, 0x01, 0x18, 0xc8, 0x67, 0x90, 0xa1, 0x48, 0x03, 0x39, 0xb0, 0xa0,
618 0x93, 0xcf, 0x20, 0xc3, 0xb1, 0x06, 0x75, 0x60, 0x81, 0x26, 0x9f, 0x41,
619 0x06, 0x3e, 0x78, 0x03, 0x3a, 0xb0, 0x2c, 0x90, 0xcf, 0x20, 0x83, 0x1f,
620 0xc4, 0xc1, 0x1d, 0x98, 0x13, 0xc8, 0xc7, 0x92, 0x01, 0x3e, 0x16, 0x30,
621 0xf0, 0xb1, 0x20, 0x81, 0x8f, 0x05, 0x08, 0x7c, 0x2c, 0x28, 0xe0, 0x33,
622 0xdb, 0x90, 0x07, 0x01, 0x30, 0xdb, 0x10, 0x94, 0x42, 0x30, 0xdb, 0x10,
623 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
624 0x00, 0x5b, 0x8e, 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0xd8, 0x72,
625 0x0c, 0x01, 0x1d, 0x1c, 0x7c, 0x80, 0xe4, 0xc1, 0x96, 0xe3, 0x08, 0xe8,
626 0xe0, 0xe0, 0x03, 0x24, 0x0f, 0xb6, 0x1c, 0x4c, 0x40, 0x07, 0x07, 0x1f,
627 0x20, 0x79, 0xb0, 0xe5, 0x88, 0x02, 0x3a, 0x38, 0xf8, 0x00, 0xc9, 0x83,
628 0x2d, 0x87, 0x15, 0xd0, 0xc1, 0x91, 0x07, 0x08, 0x1f, 0x6c, 0x39, 0xc6,
629 0x20, 0xa0, 0x83, 0x23, 0x0f, 0x10, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
630 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
631 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xff,
632 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xfd, 0x02, 0x00,
633 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
634 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
635 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
636 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32,
637 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90,
638 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8,
639 0x08, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00,
640 0x00, 0x51, 0x18, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24,
641 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x8a, 0x08, 0x07, 0x78,
642 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77,
643 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a,
644 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21,
645 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1,
646 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0,
647 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c,
648 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76,
649 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
650 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
651 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
652 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
653 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1,
654 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1,
655 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1,
656 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79,
657 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77,
658 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
659 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
660 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0,
661 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
662 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79,
663 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72,
664 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
665 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
666 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01,
667 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
668 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a,
669 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a,
670 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
671 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d,
672 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1,
673 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
674 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x6c,
675 0xc2, 0x00, 0x2c, 0x40, 0x35, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88,
676 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc,
677 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0x00, 0x00,
678 0x00, 0x49, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40,
679 0x00, 0x89, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08,
680 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22,
681 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84,
682 0x4c, 0x10, 0x3c, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00,
683 0x67, 0x49, 0x53, 0x44, 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c,
684 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06,
685 0x11, 0x06, 0xa1, 0x10, 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60,
686 0x90, 0x02, 0x38, 0x47, 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30,
687 0x00, 0xc3, 0x08, 0x04, 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xa8, 0x70,
688 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78,
689 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37,
690 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f,
691 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07,
692 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07,
693 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06,
694 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07,
695 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07,
696 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07,
697 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07,
698 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
699 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07,
700 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07,
701 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07,
702 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07,
703 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06,
704 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07,
705 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07,
706 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07,
707 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06,
708 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07,
709 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07,
710 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07,
711 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07,
712 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f,
713 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07,
714 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07,
715 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07,
716 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07,
717 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18, 0x03, 0x00, 0x80, 0x00,
718 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, 0x0d, 0x00, 0x00,
719 0x00, 0x32, 0x1e, 0x98, 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
720 0x47, 0xc6, 0x04, 0x43, 0xc2, 0x11, 0x80, 0x42, 0x28, 0x81, 0x22, 0x28,
721 0x88, 0x02, 0x2a, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0xc2,
722 0x19, 0x01, 0x28, 0x8c, 0x42, 0x28, 0x88, 0x02, 0x29, 0x94, 0x82, 0xa1,
723 0x1c, 0x4b, 0x90, 0x04, 0x00, 0x79, 0x18, 0x00, 0x00, 0x27, 0x01, 0x00,
724 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32,
725 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x42, 0x1c, 0x40, 0x42, 0x51,
726 0xb9, 0x1b, 0x43, 0x0b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62,
727 0x20, 0xc3, 0x21, 0x20, 0x02, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c,
728 0xa4, 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed,
729 0xcd, 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06,
730 0x04, 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06,
731 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x70, 0x10, 0x43,
732 0x0c, 0x64, 0x40, 0x0a, 0x24, 0x60, 0xd1, 0x54, 0x46, 0x17, 0xc6, 0x36,
733 0x04, 0x39, 0x0e, 0x64, 0x40, 0x06, 0x24, 0xe0, 0x16, 0x96, 0x26, 0xe7,
734 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56, 0xe6, 0x42, 0x56, 0xe6, 0xf6,
735 0x26, 0xd7, 0x36, 0xf7, 0x45, 0x96, 0x36, 0x17, 0x26, 0xc6, 0x56, 0x36,
736 0x44, 0x38, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70,
737 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74,
738 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x63, 0x21,
739 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5, 0xb1, 0x95,
740 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99, 0x95, 0xc9,
741 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1,
742 0x95, 0x0d, 0x11, 0x8e, 0x86, 0x51, 0x58, 0x9a, 0x9c, 0x8b, 0x5c, 0x99,
743 0x1b, 0x59, 0x99, 0xdc, 0x17, 0x5d, 0x98, 0xdc, 0x59, 0x19, 0x1d, 0xa3,
744 0xb0, 0x34, 0x39, 0x97, 0x30, 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2,
745 0x2f, 0xb7, 0xb0, 0xb6, 0x32, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34,
746 0x43, 0x90, 0xe3, 0x41, 0x82, 0x03, 0x3a, 0xa2, 0x21, 0xc2, 0x21, 0x51,
747 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3,
748 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0x63, 0x76, 0x56, 0xe6, 0x56, 0x26,
749 0x17, 0x46, 0x57, 0x46, 0x86, 0x82, 0x03, 0xf7, 0x36, 0x97, 0x46, 0x97,
750 0xf6, 0xe6, 0x46, 0x64, 0x27, 0xf3, 0x65, 0x96, 0x42, 0x25, 0x2c, 0x4d,
751 0xce, 0x65, 0xac, 0xcc, 0x8d, 0xae, 0x4c, 0x8e, 0x4f, 0x58, 0x9a, 0x9c,
752 0x0b, 0x5c, 0x99, 0xdc, 0x1c, 0x5c, 0xd9, 0x18, 0x5d, 0x9a, 0x5d, 0x19,
753 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x32, 0x61, 0x69, 0x72, 0x2e,
754 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, 0xe6,
755 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0x86, 0x48, 0x48, 0x70, 0x50, 0x47, 0x75,
756 0x58, 0xc7, 0x75, 0x40, 0x07, 0x76, 0x64, 0x87, 0x46, 0xeb, 0xac, 0xcc,
757 0xad, 0x4c, 0x2e, 0x8c, 0xae, 0x8c, 0x0c, 0xa5, 0x66, 0xec, 0x8d, 0xed,
758 0x4d, 0x8e, 0xc8, 0x8e, 0xe6, 0xcb, 0x2c, 0x85, 0xc5, 0xd8, 0x1b, 0xdb,
759 0x9b, 0xdc, 0x10, 0x09, 0x19, 0x0e, 0xea, 0xe0, 0x0e, 0xeb, 0xb8, 0x0e,
760 0xe8, 0x88, 0x8e, 0xec, 0xe8, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x88, 0xd5,
761 0x99, 0x99, 0x95, 0xc9, 0xf1, 0x09, 0x4b, 0x93, 0x73, 0x11, 0xab, 0x33,
762 0x33, 0x2b, 0x93, 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0xa3, 0x14, 0x96, 0x26,
763 0xe7, 0xc2, 0xf6, 0x36, 0x16, 0x46, 0x97, 0xf6, 0xe6, 0xf6, 0x95, 0xe6,
764 0x46, 0x56, 0x86, 0x47, 0x24, 0x2c, 0x4d, 0xce, 0x45, 0xae, 0x2c, 0x8c,
765 0x8c, 0x54, 0x58, 0x9a, 0x9c, 0xcb, 0x1c, 0x9d, 0x5c, 0xdd, 0x18, 0xdd,
766 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x9a, 0x9b, 0xd9, 0x1b, 0x0b, 0x33,
767 0xb6, 0xb7, 0x30, 0x3a, 0x32, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f,
768 0x75, 0x74, 0x70, 0x75, 0x74, 0x64, 0xe8, 0xca, 0xf0, 0xe8, 0xea, 0xe4,
769 0xca, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xa8, 0xa4, 0xb9, 0xc1, 0xd5, 0xd1,
770 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x71, 0x19, 0x7b, 0x63, 0x7b, 0x93, 0xfb,
771 0x9a, 0x1b, 0x0b, 0x63, 0x2b, 0xa3, 0x43, 0xf7, 0xe6, 0x56, 0xd6, 0x16,
772 0x06, 0xf7, 0xd5, 0x56, 0x46, 0x87, 0xf6, 0x46, 0xc6, 0x87, 0xee, 0xcd,
773 0xad, 0xac, 0x2d, 0x0c, 0xee, 0xcb, 0x2c, 0x6c, 0x8c, 0xee, 0x4d, 0x2e,
774 0x86, 0x0f, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x97, 0x59, 0xd8,
775 0x18, 0xdd, 0x9b, 0x9c, 0x0c, 0x9f, 0x39, 0x32, 0xb9, 0xaf, 0x3b, 0xb4,
776 0x34, 0xba, 0xb2, 0x2f, 0xb8, 0xb7, 0x34, 0x37, 0xba, 0x21, 0xb0, 0x80,
777 0x04, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x65, 0x80, 0x08, 0x88, 0x80,
778 0x04, 0x07, 0x19, 0x1c, 0x66, 0x80, 0x14, 0x88, 0x80, 0x04, 0x07, 0x19,
779 0x1c, 0x67, 0x80, 0x1c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x68, 0x80,
780 0x20, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x69, 0x80, 0x24, 0x88, 0x80,
781 0x04, 0x07, 0x19, 0x1c, 0x6a, 0x80, 0x28, 0x88, 0x80, 0x04, 0x07, 0x19,
782 0x1c, 0x6b, 0x80, 0x2c, 0x88, 0x80, 0x04, 0x07, 0x19, 0x1c, 0x6c, 0xc0,
783 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e, 0x0f, 0xae,
784 0xec, 0x6b, 0x2e, 0x4d, 0xaf, 0x8c, 0x57, 0x58, 0x9a, 0x9c, 0x4b, 0x98,
785 0xdc, 0xd9, 0x17, 0x5d, 0x1e, 0x5c, 0xd9, 0x57, 0x18, 0x5b, 0xda, 0x99,
786 0xdb, 0xd7, 0x5c, 0x9a, 0x5e, 0x19, 0x9f, 0x29, 0xb4, 0x30, 0xb2, 0x32,
787 0xb9, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x06, 0x63,
788 0x43, 0xc8, 0x00, 0x21, 0x8e, 0xef, 0x00, 0x03, 0xc4, 0x38, 0xc2, 0x00,
789 0x09, 0x90, 0xe1, 0x10, 0x83, 0x63, 0x0c, 0x8e, 0x36, 0x38, 0xdc, 0x00,
790 0x31, 0x8e, 0x37, 0x40, 0x84, 0x03, 0x3a, 0xe0, 0xe0, 0xc8, 0x8e, 0x38,
791 0x18, 0x62, 0x1c, 0xdb, 0xe1, 0x1d, 0x72, 0x30, 0xc4, 0x30, 0x80, 0x63,
792 0x3a, 0xe6, 0x80, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, 0x5a,
793 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, 0xdd,
794 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a,
795 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65,
796 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0xe3,
797 0x0e, 0x86, 0x18, 0x87, 0x1d, 0x1c, 0x78, 0xa0, 0x34, 0x43, 0x8c, 0x83,
798 0x0c, 0x8e, 0x3c, 0x50, 0x9a, 0x21, 0x62, 0x70, 0xd4, 0xc1, 0xa1, 0x07,
799 0x4a, 0x73, 0xe8, 0x81, 0xf2, 0x1c, 0x7a, 0xa0, 0x40, 0x87, 0x1e, 0x28,
800 0xce, 0xa1, 0x07, 0x4a, 0x74, 0xe8, 0x81, 0x22, 0x1d, 0x7a, 0xa0, 0x4c,
801 0x87, 0x1e, 0x28, 0xcc, 0x10, 0xe3, 0xd8, 0x83, 0x43, 0x0f, 0x14, 0x87,
802 0x64, 0x10, 0x96, 0x26, 0xd7, 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32,
803 0x37, 0xf6, 0x06, 0x57, 0x36, 0x87, 0x32, 0x45, 0xc4, 0xf4, 0x35, 0xf5,
804 0xc6, 0x96, 0x46, 0xf6, 0x65, 0x26, 0x17, 0x76, 0xd6, 0x56, 0xe6, 0x46,
805 0x97, 0x32, 0x84, 0x38, 0xfc, 0xe0, 0xe8, 0x03, 0x5a, 0x61, 0x69, 0x72,
806 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65,
807 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32, 0x29, 0x43, 0x8c, 0x03, 0x14, 0x0e,
808 0x3f, 0x38, 0xfe, 0x60, 0x88, 0x70, 0x80, 0xc2, 0x88, 0x88, 0x1d, 0xd8,
809 0xc1, 0x1e, 0xda, 0xc1, 0x0d, 0xda, 0xe1, 0x1d, 0xc8, 0xa1, 0x1e, 0xd8,
810 0xa1, 0x1c, 0xdc, 0xc0, 0x1c, 0xd8, 0x21, 0x1c, 0xce, 0x61, 0x1e, 0xa6,
811 0x08, 0xc1, 0x30, 0x42, 0x61, 0x07, 0x76, 0xb0, 0x87, 0x76, 0x70, 0x83,
812 0x74, 0x20, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0x14, 0x23, 0x96,
813 0x70, 0x48, 0x07, 0x79, 0x70, 0x03, 0x7b, 0x28, 0x07, 0x79, 0x98, 0x87,
814 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x18, 0x23, 0xa8, 0x70, 0x48, 0x07,
815 0x79, 0x70, 0x03, 0x76, 0x08, 0x07, 0x77, 0x38, 0x87, 0x7a, 0x08, 0x87,
816 0x73, 0x28, 0x87, 0x5f, 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87,
817 0x77, 0x70, 0x87, 0x29, 0x01, 0x32, 0x62, 0x0a, 0x87, 0x74, 0x90, 0x07,
818 0x37, 0x18, 0x87, 0x77, 0x68, 0x07, 0x78, 0x48, 0x07, 0x76, 0x28, 0x87,
819 0x5f, 0x78, 0x07, 0x78, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x87,
820 0x29, 0x83, 0xc2, 0x38, 0x23, 0x98, 0x70, 0x48, 0x07, 0x79, 0x70, 0x03,
821 0x73, 0x90, 0x87, 0x70, 0x38, 0x87, 0x76, 0x28, 0x07, 0x77, 0xa0, 0x87,
822 0x29, 0x01, 0x1d, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
823 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
824 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
825 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
826 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
827 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
828 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
829 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
830 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
831 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
832 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
833 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
834 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
835 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
836 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
837 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
838 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
839 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
840 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
841 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
842 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
843 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
844 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
845 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
846 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
847 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
848 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
849 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
850 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
851 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
852 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
853 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
854 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
855 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
856 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
857 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
858 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
859 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
860 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
861 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
862 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
863 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
864 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
865 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
866 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
867 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
868 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
869 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
870 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
871 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
872 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
873 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
874 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
875 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
876 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
877 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
878 0x00, 0x71, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x20, 0xb1,
879 0x5d, 0xf9, 0xb3, 0xce, 0x82, 0x0c, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34,
880 0x13, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x14, 0x00, 0x00,
881 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
882 0x00, 0xd4, 0x73, 0x10, 0x41, 0x10, 0x68, 0x84, 0x65, 0x30, 0x03, 0x40,
883 0x3c, 0x03, 0x40, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00,
884 0x00, 0xe3, 0x0d, 0x06, 0x44, 0x50, 0x30, 0xe6, 0x18, 0x88, 0xc0, 0x1b,
885 0x64, 0x08, 0x0a, 0x64, 0x8e, 0x21, 0x28, 0x10, 0x0b, 0x18, 0xf9, 0x64,
886 0x10, 0x10, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20,
887 0xe0, 0x83, 0x23, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
888 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
890 0x00, 0x88, 0x18, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
891 0xde, 0x21, 0x0c, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x0b, 0x82, 0x20,
892 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
893 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
894 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45,
895 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
896 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
897 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8,
898 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
899 0x00, 0xef, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff,
900 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90,
901 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68,
902 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
903 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d,
904 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e,
905 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d,
906 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70,
907 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48,
908 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90,
909 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70,
910 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68,
911 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
912 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e,
913 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c,
914 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d,
915 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
916 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98,
917 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
918 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
919 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e,
920 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8,
921 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38,
922 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78,
923 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0,
924 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d,
925 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d,
926 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
927 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18,
928 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18,
929 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30,
930 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00,
931 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c,
932 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d,
933 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0,
934 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83,
935 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41,
936 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0x8c, 0xa1, 0x00,
937 0x16, 0xa0, 0xda, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8,
938 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f, 0x18, 0xff,
939 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0,
940 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3,
941 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8,
942 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83,
943 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81,
944 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43,
945 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00, 0x0c, 0xee,
946 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40, 0x0f, 0xe9,
947 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60, 0x0e, 0xf2,
948 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90, 0x0e, 0xee,
949 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90, 0x0e, 0xed,
950 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43,
951 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3,
952 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03,
953 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b, 0xb4, 0x01,
954 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5,
955 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3,
956 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8,
957 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43,
958 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43,
959 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5,
960 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xe7,
961 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20, 0x0f, 0xef,
962 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4,
963 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3,
964 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c, 0xa4, 0x83,
965 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4,
966 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3,
967 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3,
968 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6,
969 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00,
970 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43,
971 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03,
972 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x40, 0x8e, 0xff, 0xff,
973 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90, 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0,
974 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00, 0x16, 0xa0, 0xda, 0x80, 0x28, 0xff,
975 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c, 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9,
976 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0xc3, 0xc4, 0xfc, 0xff,
977 0xff, 0xff, 0xff, 0x00, 0x28, 0x80, 0x34, 0xb8, 0xc3, 0x3b, 0xb4, 0x81,
978 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, 0xcc, 0x03,
979 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40,
980 0x18, 0x88, 0x09, 0x41, 0x31, 0x21, 0x30, 0x26, 0x0c, 0x07, 0x92, 0x4c,
981 0x18, 0x14, 0x24, 0x99, 0x10, 0x2c, 0x13, 0x02, 0x06, 0x89, 0x20, 0x00,
982 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85,
983 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90,
984 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x9c, 0xc1,
985 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14,
986 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04,
987 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84,
988 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89,
989 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00, 0x18, 0x44, 0x28, 0x82,
990 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25, 0x80, 0x79, 0x16, 0x22,
991 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10, 0xca, 0x11, 0x04, 0x81,
992 0x40, 0x18, 0x08, 0x25, 0xc3, 0x08, 0x03, 0x50, 0x88, 0x65, 0x59, 0x16,
993 0x62, 0xca, 0x00, 0x00, 0x00, 0x39, 0x45, 0x00, 0x00, 0x82, 0xca, 0x00,
994 0x2c, 0x0b, 0x49, 0xc5, 0x58, 0x16, 0x00, 0x00, 0x00, 0xa2, 0xca, 0xb0,
995 0x2c, 0x0b, 0x59, 0x45, 0x58, 0x16, 0xc2, 0xe6, 0x08, 0x82, 0x39, 0x02,
996 0x30, 0x18, 0x46, 0x10, 0xb6, 0x82, 0x04, 0x06, 0x22, 0x68, 0x9c, 0x06,
997 0x50, 0x37, 0x10, 0x90, 0x02, 0xdb, 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x00,
998 0xc2, 0x14, 0xc0, 0x08, 0xc0, 0x30, 0xc2, 0xb0, 0x0d, 0x23, 0x10, 0x1b,
999 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
1000 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
1001 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51,
1002 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1003 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80,
1004 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0,
1005 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
1006 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0,
1007 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60,
1008 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
1009 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
1010 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1011 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0,
1012 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20,
1013 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
1014 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
1015 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40,
1016 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0,
1017 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90,
1018 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
1019 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10,
1020 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
1021 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
1022 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60,
1023 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
1024 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10,
1025 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10,
1026 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
1027 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80,
1028 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x18,
1029 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x4c, 0x03,
1030 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xe6, 0x01, 0x02,
1031 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x13, 0x01, 0x01, 0x20,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0x99, 0x80, 0x00, 0x10, 0x00,
1033 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x54, 0x08, 0x30, 0x0c, 0x00, 0x00,
1034 0x00, 0x01, 0x00, 0x0c, 0x61, 0x1e, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00,
1035 0x00, 0x00, 0x86, 0x30, 0x17, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
1036 0x00, 0x43, 0x98, 0x0c, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80,
1037 0x21, 0xcc, 0x05, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10,
1038 0xc6, 0x03, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0b, 0x04,
1039 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c,
1040 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xda, 0x46, 0x00, 0x0a,
1041 0xa1, 0x04, 0x8a, 0xa0, 0x20, 0x0a, 0xa8, 0x0c, 0x0a, 0xa3, 0x40, 0x0a,
1042 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x28, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28,
1043 0x88, 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x02, 0xc7, 0x12, 0x24, 0x01,
1044 0x00, 0x79, 0x18, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c,
1045 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37,
1046 0xb7, 0x21, 0xc6, 0xe6, 0x7c, 0x00, 0x18, 0x80, 0x01, 0x95, 0xbb, 0x31,
1047 0xb4, 0x30, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0xb2, 0x21, 0xc6, 0xd6, 0x7c,
1048 0xc2, 0xc6, 0x30, 0x0e, 0x82, 0xe0, 0xe0, 0xd8, 0xca, 0x40, 0xda, 0xca,
1049 0xe8, 0xc2, 0xd8, 0x40, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x40,
1050 0x66, 0x64, 0x60, 0x64, 0x66, 0x5c, 0x68, 0x60, 0x68, 0x40, 0x50, 0xda,
1051 0xca, 0xe8, 0xc2, 0xd8, 0xcc, 0xca, 0x5a, 0x66, 0x64, 0x60, 0x64, 0x66,
1052 0x5c, 0x68, 0x60, 0x68, 0x52, 0x86, 0x08, 0x1f, 0x31, 0xc4, 0xd8, 0x9a,
1053 0xed, 0xd9, 0x16, 0x16, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x43, 0x90, 0xef,
1054 0xd8, 0x9a, 0xad, 0xd9, 0x16, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f,
1055 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d,
1056 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x2f,
1057 0x21, 0x17, 0x96, 0x26, 0xe7, 0x32, 0xf6, 0xd6, 0x06, 0x97, 0xc6, 0x56,
1058 0xe6, 0x62, 0x16, 0x36, 0x47, 0xf7, 0xd5, 0x16, 0x46, 0x87, 0xf6, 0x55,
1059 0xe6, 0x16, 0x26, 0xc6, 0x56, 0x36, 0x44, 0xf8, 0x16, 0x92, 0x41, 0x58,
1060 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x8b, 0x99,
1061 0x5c, 0x58, 0x5b, 0x99, 0x58, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0x97, 0x59,
1062 0x19, 0xdd, 0x18, 0xda, 0x57, 0x99, 0x5b, 0x98, 0x18, 0x5b, 0xd9, 0x10,
1063 0xe1, 0x6b, 0x18, 0x85, 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, 0x95,
1064 0xc9, 0x7d, 0xd1, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, 0x93,
1065 0x73, 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, 0x0b,
1066 0x6b, 0x2b, 0xa3, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, 0xf9,
1067 0x9e, 0x6d, 0xf9, 0xa0, 0x2f, 0x1a, 0x22, 0x7c, 0x12, 0x99, 0xb0, 0x34,
1068 0x39, 0x17, 0xb8, 0xb7, 0xb9, 0x34, 0xba, 0xb4, 0x37, 0x37, 0x2a, 0x61,
1069 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x94, 0xc2, 0xd2,
1070 0xe4, 0x5c, 0xdc, 0xde, 0xbe, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6,
1071 0xe8, 0xd2, 0xec, 0xca, 0xc8, 0x84, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d,
1072 0x7d, 0xb9, 0x85, 0xb5, 0x95, 0x11, 0x81, 0x7b, 0x9b, 0x4b, 0xa3, 0x4b,
1073 0x7b, 0x73, 0x1b, 0x02, 0x6d, 0xcb, 0x47, 0x7d, 0xd5, 0x67, 0x7d, 0xd0,
1074 0x17, 0x7d, 0xd7, 0x87, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x31, 0x93, 0x0b,
1075 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0xfb, 0x4a, 0x73, 0x83, 0xab, 0xa3, 0xa3,
1076 0x75, 0x56, 0xe6, 0x56, 0x26, 0x17, 0x46, 0x57, 0x46, 0x86, 0x52, 0x33,
1077 0xf6, 0xc6, 0xf6, 0x26, 0x47, 0x64, 0x47, 0xf3, 0x65, 0x96, 0xc2, 0x27,
1078 0x2c, 0x4d, 0xce, 0x05, 0xae, 0x4c, 0x6e, 0x0e, 0xae, 0x6c, 0x8c, 0x2e,
1079 0xcd, 0xae, 0x8c, 0xc5, 0xd8, 0x1b, 0xdb, 0x9b, 0xdc, 0x10, 0x69, 0x6b,
1080 0x3e, 0xed, 0xdb, 0xbe, 0xea, 0xe3, 0x3e, 0xe8, 0x8b, 0xbe, 0xeb, 0xeb,
1081 0x98, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85, 0xd1, 0x95, 0x91, 0xa1, 0xe0,
1082 0xd0, 0x95, 0xe1, 0x8d, 0xbd, 0xbd, 0xc9, 0x91, 0x11, 0xd9, 0xc9, 0x7c,
1083 0x99, 0xa5, 0xd0, 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x93, 0x21, 0x42, 0x57,
1084 0x86, 0x37, 0xf6, 0xf6, 0x26, 0x47, 0x36, 0x44, 0xda, 0x9c, 0x4f, 0xfb,
1085 0xbe, 0xaf, 0xfa, 0xb8, 0x0f, 0xfa, 0xc0, 0xe0, 0xbb, 0xbe, 0x30, 0xa0,
1086 0x12, 0x96, 0x26, 0xe7, 0x22, 0x56, 0x67, 0x66, 0x56, 0x26, 0xc7, 0x27,
1087 0x2c, 0x4d, 0xce, 0x45, 0xac, 0xce, 0xcc, 0xac, 0x4c, 0xee, 0x6b, 0x2e,
1088 0x4d, 0xaf, 0x8c, 0x52, 0x58, 0x9a, 0x9c, 0x0b, 0xdb, 0xdb, 0x58, 0x18,
1089 0x5d, 0xda, 0x9b, 0xdb, 0x57, 0x9a, 0x1b, 0x59, 0x19, 0x1e, 0x91, 0xb0,
1090 0x34, 0x39, 0x17, 0xb9, 0xb2, 0x30, 0x32, 0x52, 0x61, 0x69, 0x72, 0x2e,
1091 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f,
1092 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0xcc, 0xd8, 0xde, 0xc2, 0xe8, 0xc8, 0xcc,
1093 0x8d, 0x49, 0x1d, 0x09, 0x7d, 0xbd, 0xd5, 0xd1, 0xc1, 0xd5, 0xd1, 0x91,
1094 0xa1, 0x2b, 0xc3, 0xa3, 0xab, 0x93, 0x2b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b,
1095 0xa3, 0x92, 0xe6, 0x06, 0x57, 0x47, 0xf7, 0x45, 0x97, 0x07, 0x57, 0xc6,
1096 0x65, 0xec, 0x8d, 0xed, 0x4d, 0xee, 0x6b, 0x6e, 0x2c, 0x8c, 0xad, 0x8c,
1097 0x0e, 0xdd, 0x9b, 0x5b, 0x59, 0x5b, 0x18, 0xdc, 0x57, 0x5b, 0x19, 0x1d,
1098 0xda, 0x1b, 0x19, 0x1f, 0xba, 0x37, 0xb7, 0xb2, 0xb6, 0x30, 0xb8, 0x2f,
1099 0xb3, 0xb0, 0x31, 0xba, 0x37, 0xb9, 0x18, 0x3e, 0x74, 0x6f, 0x6e, 0x65,
1100 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x7c,
1101 0xe6, 0xc8, 0xe4, 0xbe, 0xee, 0xd0, 0xd2, 0xe8, 0xca, 0xbe, 0xe0, 0xde,
1102 0xd2, 0xdc, 0xe8, 0x86, 0xc0, 0xc2, 0xb6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68,
1103 0xf0, 0xa5, 0xc1, 0xc6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xa9, 0xc1,
1104 0xf6, 0x6c, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xad, 0xc1, 0x26, 0x6d, 0xcc,
1105 0xb6, 0x7c, 0x68, 0xf0, 0xb1, 0xc1, 0x36, 0x6d, 0xcc, 0xb6, 0x7c, 0x68,
1106 0xf0, 0xb5, 0xc1, 0x46, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xb9, 0xc1,
1107 0x56, 0x6d, 0xcc, 0xb6, 0x7c, 0x68, 0xf0, 0xbd, 0xc1, 0x66, 0x6d, 0xcc,
1108 0xb6, 0x7c, 0x68, 0xf0, 0xc1, 0x01, 0xa3, 0xb0, 0x34, 0x39, 0x97, 0x30,
1109 0xb9, 0xb3, 0x2f, 0xba, 0x3c, 0xb8, 0xb2, 0xaf, 0xb9, 0x34, 0xbd, 0x32,
1110 0x5e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70,
1111 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65,
1112 0x7c, 0xa6, 0xd0, 0xc2, 0xc8, 0xca, 0xe4, 0x86, 0xde, 0xdc, 0xe6, 0xe8,
1113 0xc2, 0xdc, 0xe8, 0xe6, 0x18, 0x8c, 0x0d, 0x21, 0x83, 0x2d, 0xfa, 0xc6,
1114 0xe0, 0x23, 0x83, 0x0d, 0xfa, 0xca, 0x60, 0x5b, 0xb6, 0xe6, 0x33, 0x83,
1115 0xef, 0x0c, 0xbe, 0x38, 0xf8, 0xe4, 0x60, 0x83, 0xbe, 0x39, 0xd8, 0x98,
1116 0x0f, 0xfa, 0xe8, 0xe0, 0xbb, 0xbe, 0x3a, 0xe0, 0x12, 0x96, 0x26, 0xe7,
1117 0x42, 0x57, 0x86, 0x47, 0x57, 0x27, 0x57, 0x46, 0x25, 0x2c, 0x4d, 0xce,
1118 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x8c, 0x18, 0x5d, 0x19, 0x1e, 0x5d,
1119 0x9d, 0x5c, 0x99, 0x0c, 0x19, 0x8f, 0x19, 0xdb, 0x5b, 0x18, 0x1d, 0x0b,
1120 0xc8, 0x5c, 0x58, 0x1b, 0x1c, 0x5b, 0x99, 0x0f, 0x07, 0xba, 0x32, 0xbc,
1121 0x21, 0xd4, 0xc6, 0x7c, 0x77, 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x87,
1122 0x07, 0x1f, 0xf4, 0xe5, 0xc1, 0x77, 0x7d, 0x7a, 0xc0, 0x25, 0x2c, 0x4d,
1123 0xce, 0x65, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0x4c, 0x8e, 0xc7, 0x5c, 0x58,
1124 0x1b, 0x1c, 0x5b, 0x99, 0x1c, 0x83, 0xb9, 0x21, 0xd2, 0x76, 0x7d, 0x7c,
1125 0xf0, 0x95, 0xc1, 0xb6, 0x6c, 0xcd, 0x07, 0x7d, 0x7d, 0xf0, 0x5d, 0x9f,
1126 0x1f, 0x0c, 0x61, 0xbe, 0xec, 0xf3, 0x3e, 0x31, 0xf8, 0xec, 0xe0, 0xdb,
1127 0x83, 0xef, 0x0f, 0x86, 0x18, 0x0a, 0xf0, 0x4d, 0x1f, 0x28, 0x70, 0x0c,
1128 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6,
1129 0xde, 0xe0, 0xca, 0xe6, 0x50, 0xa6, 0x88, 0x98, 0xbe, 0x86, 0xde, 0xe0,
1130 0xf2, 0xbe, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0x52, 0x86,
1131 0x10, 0xdf, 0x28, 0x7c, 0xa2, 0x40, 0x2c, 0x2c, 0x4d, 0xae, 0x25, 0x8c,
1132 0x2d, 0x2d, 0x6c, 0xae, 0x65, 0x6e, 0xec, 0x0d, 0xae, 0xac, 0x85, 0xae,
1133 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x6c, 0x6e, 0x88, 0xf1, 0x95, 0xc2, 0x37,
1134 0x0a, 0x1f, 0x29, 0x10, 0x0b, 0x4b, 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b,
1135 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x99, 0x0b, 0x6b, 0x83,
1136 0x63, 0x2b, 0x93, 0x9b, 0x1b, 0x62, 0x7c, 0xa7, 0xf0, 0x8d, 0xc2, 0x67,
1137 0x0a, 0x43, 0x88, 0xaf, 0x14, 0xbe, 0x53, 0xa0, 0x15, 0x96, 0x26, 0xd7,
1138 0x12, 0xc6, 0x96, 0x16, 0x36, 0xd7, 0x32, 0x37, 0xf6, 0x06, 0x57, 0xd6,
1139 0x12, 0x26, 0x77, 0x86, 0x32, 0x93, 0x32, 0xc4, 0xf8, 0x54, 0xe1, 0x1b,
1140 0x85, 0x2f, 0x15, 0x86, 0x08, 0x9f, 0x2a, 0xb0, 0xfa, 0xd2, 0xa2, 0x9a,
1141 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b,
1142 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3, 0xd6, 0xe6, 0x96, 0x06, 0xf7,
1143 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86, 0x16, 0x26, 0xc7, 0x67, 0x2a,
1144 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68, 0x65, 0x05, 0x84, 0x4a, 0x28,
1145 0x28, 0x68, 0x88, 0xf0, 0xb9, 0xc2, 0x10, 0xe3, 0x6b, 0x85, 0xef, 0x15,
1146 0xc2, 0x20, 0x1b, 0x62, 0x7c, 0x68, 0xf0, 0xc1, 0x42, 0x18, 0x64, 0x43,
1147 0xc4, 0xe0, 0x63, 0x85, 0x2f, 0x16, 0xc2, 0x20, 0xfb, 0x62, 0x21, 0x0c,
1148 0xb4, 0x2f, 0x16, 0xc2, 0x60, 0xfb, 0x62, 0x21, 0x0c, 0xb8, 0x2f, 0x16,
1149 0xc2, 0xa0, 0xfb, 0x62, 0x21, 0x0c, 0xbc, 0x2f, 0x16, 0xc2, 0xe0, 0xfb,
1150 0x62, 0x21, 0x0c, 0xb0, 0x21, 0xc6, 0x27, 0x0b, 0x5f, 0x2c, 0x84, 0xc1,
1151 0x36, 0xc4, 0xf8, 0x64, 0xe1, 0x8b, 0x85, 0x30, 0xc0, 0x86, 0x18, 0x9f,
1152 0x2c, 0x7c, 0xb1, 0x10, 0x06, 0xdd, 0x10, 0xe3, 0x93, 0x85, 0x2f, 0x16,
1153 0xc2, 0xc0, 0x1b, 0x62, 0x7c, 0xb2, 0xf0, 0xc5, 0x42, 0x18, 0x7c, 0x43,
1154 0x8c, 0x4f, 0x16, 0xbe, 0x58, 0x08, 0x03, 0x6d, 0x88, 0xf1, 0xc9, 0xc2,
1155 0x17, 0x0b, 0x61, 0xc0, 0x0d, 0x31, 0x3e, 0x59, 0xf8, 0x62, 0x21, 0x0c,
1156 0xb2, 0x11, 0x11, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0xb4, 0xc3,
1157 0x3b, 0x90, 0x43, 0x3d, 0xb0, 0x43, 0x39, 0xb8, 0x81, 0x39, 0xb0, 0x43,
1158 0x38, 0x9c, 0xc3, 0x3c, 0x4c, 0x11, 0x82, 0x61, 0x84, 0xc2, 0x0e, 0xec,
1159 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xe9, 0x40, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4,
1160 0x30, 0x25, 0x28, 0x46, 0x2c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xf6,
1161 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x30,
1162 0x46, 0x50, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xec, 0x10, 0x0e, 0xee,
1163 0x70, 0x0e, 0xf5, 0x10, 0x0e, 0xe7, 0x50, 0x0e, 0xbf, 0x60, 0x0f, 0xe5,
1164 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53, 0x02, 0x64, 0xc4,
1165 0x14, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x30, 0x0e, 0xef, 0xd0, 0x0e, 0xf0,
1166 0x90, 0x0e, 0xec, 0x50, 0x0e, 0xbf, 0xf0, 0x0e, 0xf0, 0x40, 0x0f, 0xe9,
1167 0xf0, 0x0e, 0xee, 0x30, 0x0f, 0x53, 0x06, 0x85, 0x71, 0x46, 0x30, 0xe1,
1168 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0x70, 0x0e, 0xed,
1169 0x50, 0x0e, 0xee, 0x40, 0x0f, 0x53, 0x82, 0x50, 0x00, 0x79, 0x18, 0x00,
1170 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
1171 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
1172 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
1173 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
1174 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
1175 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
1176 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
1177 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
1178 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
1179 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
1180 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
1181 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
1182 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
1183 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
1184 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
1185 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
1186 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
1187 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
1188 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
1189 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
1190 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
1191 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
1192 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
1193 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
1194 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
1195 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
1196 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
1197 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
1198 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
1199 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
1200 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
1201 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
1202 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
1203 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
1204 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
1205 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
1206 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
1207 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
1208 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
1209 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
1210 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
1211 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
1212 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
1213 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
1214 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
1215 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
1216 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
1217 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
1218 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
1219 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
1220 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
1221 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
1222 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
1223 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
1224 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
1225 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x2e, 0x00, 0x00,
1226 0x00, 0x06, 0x10, 0xb1, 0x5d, 0xf9, 0x73, 0xce, 0x83, 0xfd, 0x45, 0x04,
1227 0x18, 0x0c, 0xd1, 0x4c, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf, 0xb3,
1228 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45, 0x51,
1229 0x14, 0x46, 0xd0, 0x00, 0x48, 0xe4, 0x0f, 0xce, 0xe4, 0x57, 0x77, 0x71,
1230 0xdb, 0xa6, 0xb0, 0x01, 0x48, 0xe4, 0x4b, 0x00, 0xf3, 0x2c, 0xc4, 0x3f,
1231 0x11, 0xd7, 0x44, 0x45, 0xc4, 0x6f, 0x0f, 0x7e, 0x85, 0x17, 0xb7, 0x6d,
1232 0x08, 0x13, 0x80, 0x44, 0x7e, 0x01, 0x48, 0xd3, 0x5f, 0x00, 0x81, 0xe4,
1233 0x57, 0x77, 0x71, 0xdb, 0x16, 0x40, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34,
1234 0xfd, 0xc2, 0x02, 0x30, 0x8f, 0x5f, 0xdd, 0xc5, 0x6d, 0x5b, 0xc2, 0x04,
1235 0x20, 0x91, 0x5f, 0x00, 0xd2, 0xf4, 0x17, 0x0c, 0x70, 0xf9, 0xd5, 0x5d,
1236 0xdc, 0xb6, 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3,
1237 0x58, 0x7e, 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34,
1238 0xfd, 0x05, 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x66, 0x10, 0x01, 0x48, 0xe4,
1239 0x17, 0x80, 0x34, 0xfd, 0x05, 0x03, 0x5c, 0x7e, 0x71, 0xdb, 0x76, 0x20,
1240 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d,
1241 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x9a, 0x01, 0x00,
1242 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x51, 0x00, 0x00,
1243 0x00, 0x64, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc, 0x41, 0x2c, 0x8d, 0xd3,
1244 0x06, 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdc, 0x08, 0x00,
1245 0x6d, 0xc5, 0x30, 0x03, 0x50, 0x0e, 0xa4, 0x8d, 0x00, 0xd4, 0x00, 0x01,
1246 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0, 0xb3, 0xe6, 0x1c,
1247 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06, 0x63, 0x04, 0x20,
1248 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30, 0x03, 0x30,
1249 0x07, 0x91, 0x0a, 0xaf, 0x90, 0x0a, 0x75, 0x40, 0xcb, 0x0c, 0xc0, 0x08,
1250 0xc0, 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08,
1251 0xe2, 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93,
1252 0x1e, 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03,
1253 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20,
1254 0xc8, 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08,
1255 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80,
1256 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2,
1257 0x6d, 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23,
1258 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08,
1259 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c,
1260 0x87, 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3,
1261 0xf1, 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4,
1262 0xff, 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe,
1263 0x30, 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef,
1264 0x0b, 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2,
1265 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf,
1266 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0xdb,
1267 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37, 0x46,
1268 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34, 0x18,
1269 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00, 0x00,
1270 0x00, 0x23, 0x06, 0x4a, 0x11, 0x98, 0xc2, 0x1a, 0xa8, 0x41, 0x1b, 0x80,
1271 0x41, 0x19, 0x84, 0x41, 0x30, 0xde, 0xd0, 0x06, 0x78, 0x30, 0x0a, 0x14,
1272 0x8c, 0xe1, 0x86, 0x00, 0x0c, 0x82, 0x59, 0x86, 0x40, 0x08, 0x06, 0x19,
1273 0x08, 0x4f, 0x0d, 0xc6, 0x1b, 0xe2, 0x80, 0x0f, 0xce, 0x80, 0x82, 0x31,
1274 0x62, 0x40, 0x18, 0xc1, 0x2b, 0x0c, 0x23, 0x06, 0x85, 0x11, 0xc4, 0x42,
1275 0xb0, 0x59, 0xb0, 0xc1, 0x67, 0xc4, 0xa0, 0x30, 0x82, 0x58, 0x08, 0xc0,
1276 0xc0, 0x06, 0x4e, 0x3e, 0xc6, 0x05, 0xf1, 0xb1, 0x21, 0xa0, 0xcf, 0x88,
1277 0x01, 0x61, 0x04, 0xb6, 0x10, 0x8c, 0x18, 0x14, 0x46, 0x80, 0x0b, 0x81,
1278 0x67, 0x81, 0x27, 0x9f, 0x39, 0x06, 0x34, 0x58, 0x6c, 0x61, 0x90, 0x21,
1279 0x48, 0x83, 0x3c, 0xb0, 0x21, 0xa0, 0xcf, 0x20, 0x43, 0xb0, 0x06, 0x7c,
1280 0x30, 0xc8, 0x10, 0x54, 0x7e, 0x30, 0x4b, 0x20, 0x0c, 0x54, 0x04, 0x42,
1281 0xc0, 0x06, 0xc0, 0x78, 0xc3, 0x28, 0xb8, 0xc2, 0x2e, 0x50, 0x30, 0x86,
1282 0x1b, 0x02, 0xcd, 0x99, 0x65, 0x18, 0x88, 0x60, 0x90, 0x81, 0xa0, 0x03,
1283 0x50, 0x18, 0x6f, 0x38, 0x05, 0x59, 0xa0, 0x05, 0x0a, 0xc6, 0x78, 0x43,
1284 0x2a, 0xd0, 0x42, 0x28, 0x50, 0x30, 0x46, 0x0c, 0x90, 0x23, 0x52, 0x87,
1285 0xa2, 0x3b, 0x86, 0x60, 0x90, 0x21, 0xb8, 0x03, 0x54, 0x18, 0x64, 0x08,
1286 0x16, 0x55, 0x98, 0x25, 0x20, 0x06, 0x2a, 0x02, 0x61, 0xc0, 0x84, 0xe1,
1287 0x86, 0x30, 0x50, 0x83, 0x60, 0x96, 0xa1, 0x98, 0x82, 0xf1, 0x06, 0x58,
1288 0xd8, 0x85, 0x73, 0xa0, 0x60, 0x0c, 0x37, 0x04, 0x6d, 0x10, 0xcc, 0x32,
1289 0x18, 0x47, 0x30, 0xc8, 0x50, 0x84, 0x42, 0x2b, 0x8c, 0x37, 0xd0, 0xc2,
1290 0x2f, 0x9c, 0x03, 0x05, 0x63, 0x8e, 0x21, 0x14, 0x82, 0x77, 0x18, 0x64,
1291 0x08, 0x44, 0x41, 0x16, 0x2c, 0x28, 0xe4, 0x33, 0xc8, 0x10, 0x90, 0x42,
1292 0x2d, 0xcc, 0x12, 0xb4, 0xc1, 0x78, 0x83, 0x2e, 0x94, 0xc3, 0x3c, 0x50,
1293 0x30, 0xc6, 0x1b, 0x78, 0xe1, 0x1c, 0xde, 0x81, 0x82, 0x31, 0xc8, 0x00,
1294 0xb1, 0x82, 0x2e, 0x0c, 0x37, 0x10, 0x74, 0xe0, 0xcc, 0x32, 0x20, 0x52,
1295 0x30, 0x86, 0x20, 0xe5, 0xc3, 0x70, 0x43, 0xd0, 0x07, 0xca, 0x2c, 0x83,
1296 0x92, 0x04, 0x26, 0xfc, 0x81, 0x7c, 0x66, 0x09, 0x16, 0x1b, 0x42, 0x01,
1297 0x3e, 0x23, 0x06, 0x84, 0x11, 0x94, 0x44, 0x60, 0x01, 0x2e, 0xc8, 0x67,
1298 0xc4, 0xa0, 0x30, 0x02, 0x94, 0x08, 0x70, 0x61, 0x96, 0x60, 0x19, 0xa8,
1299 0x00, 0x94, 0x44, 0x50, 0xe6, 0x18, 0x6a, 0x21, 0x08, 0x89, 0x31, 0x84,
1300 0x0d, 0x24, 0x86, 0x1b, 0x02, 0x53, 0x50, 0x66, 0x19, 0x1a, 0x26, 0x30,
1301 0x01, 0x15, 0xe4, 0x33, 0x4b, 0xe0, 0xd8, 0xa0, 0x0a, 0xf0, 0x19, 0x31,
1302 0x20, 0x8c, 0xc0, 0x25, 0x02, 0x0b, 0xc2, 0x41, 0x3e, 0x23, 0x06, 0x85,
1303 0x11, 0xc4, 0x44, 0x10, 0x0e, 0xb3, 0x04, 0xce, 0x40, 0x05, 0xa0, 0x30,
1304 0x42, 0x33, 0xc7, 0x90, 0x04, 0x28, 0x31, 0x86, 0x40, 0x06, 0x28, 0x31,
1305 0xdc, 0x10, 0xbc, 0x82, 0x32, 0xcb, 0x00, 0x3d, 0x81, 0x09, 0xb1, 0x20,
1306 0x9f, 0x59, 0x82, 0xc8, 0x86, 0x59, 0x80, 0xcf, 0x88, 0x01, 0x61, 0x04,
1307 0x37, 0x11, 0x58, 0xa0, 0x0e, 0xf2, 0x19, 0x31, 0x28, 0x8c, 0x40, 0x27,
1308 0x02, 0x75, 0x98, 0x25, 0x88, 0x06, 0x2a, 0x00, 0xe5, 0x11, 0xa0, 0x39,
1309 0x86, 0x24, 0x80, 0x89, 0x59, 0x02, 0x69, 0xa0, 0x22, 0x10, 0x22, 0x3d,
1310 0x38, 0x06, 0x19, 0x02, 0x75, 0xb0, 0x87, 0x39, 0x06, 0x74, 0x00, 0x03,
1311 0x9b, 0x18, 0x64, 0x08, 0xd2, 0x21, 0x1f, 0x6c, 0x08, 0xe4, 0x33, 0xc8,
1312 0x10, 0xac, 0x03, 0x3f, 0xcc, 0x12, 0xb4, 0xc1, 0x70, 0xc3, 0x2c, 0xc4,
1313 0x43, 0x30, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8, 0x40, 0x07, 0xf0, 0xc0,
1314 0x0f, 0xe3, 0x0d, 0x23, 0xe1, 0x12, 0x3c, 0x41, 0xc1, 0x18, 0x6f, 0x28,
1315 0x09, 0x98, 0xc0, 0x09, 0x0a, 0xc6, 0x1c, 0x83, 0x3c, 0x04, 0x60, 0x31,
1316 0xc8, 0x10, 0xcc, 0xc3, 0x48, 0x58, 0x70, 0xc8, 0x67, 0x90, 0x21, 0xa8,
1317 0x07, 0x93, 0x18, 0x6e, 0x38, 0xc0, 0xc1, 0x99, 0x65, 0xf8, 0xaa, 0x60,
1318 0x0c, 0x61, 0x28, 0x8b, 0xe1, 0x86, 0x60, 0x1c, 0x94, 0x59, 0x86, 0xcb,
1319 0x0a, 0x4c, 0x28, 0x07, 0xf9, 0xcc, 0x12, 0x60, 0x23, 0x06, 0x84, 0x11,
1320 0xc0, 0xc5, 0x30, 0x62, 0x50, 0x18, 0x81, 0x5c, 0x04, 0xe8, 0x60, 0x81,
1321 0x3a, 0xc8, 0xc7, 0x02, 0x76, 0x80, 0xcf, 0x2c, 0x01, 0x36, 0x50, 0x01,
1322 0x28, 0x96, 0x70, 0xcd, 0x31, 0xf4, 0x43, 0xd0, 0x16, 0x63, 0x08, 0x0c,
1323 0x5b, 0x0c, 0x37, 0x04, 0xec, 0xa0, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x82,
1324 0x3b, 0xc8, 0x67, 0x96, 0x60, 0x1b, 0x31, 0x20, 0x8c, 0x20, 0x2f, 0x86,
1325 0x11, 0x83, 0xc2, 0x08, 0xf6, 0x22, 0x88, 0x07, 0x0b, 0xe6, 0x41, 0x3e,
1326 0x16, 0xd4, 0x03, 0x7c, 0x66, 0x09, 0xb6, 0x81, 0x0a, 0x40, 0xc9, 0x04,
1327 0x6d, 0x8e, 0x21, 0x09, 0xe8, 0x62, 0x0c, 0xa1, 0xa2, 0x8b, 0xe1, 0x86,
1328 0xa0, 0x1e, 0x94, 0x59, 0x86, 0x8e, 0x0b, 0x4c, 0xb8, 0x07, 0xf9, 0xcc,
1329 0x12, 0x78, 0x23, 0x06, 0x84, 0x11, 0x88, 0xc6, 0x30, 0x62, 0x50, 0x18,
1330 0x01, 0x69, 0x04, 0xfa, 0x60, 0x01, 0x3f, 0xc8, 0xc7, 0x02, 0x7f, 0x80,
1331 0xcf, 0x2c, 0x81, 0x37, 0x50, 0x01, 0x28, 0x9c, 0xd0, 0xcd, 0x31, 0x24,
1332 0x01, 0x5f, 0x8c, 0x18, 0x18, 0x46, 0xa0, 0x1a, 0x41, 0x4c, 0xbc, 0xc4,
1333 0x20, 0x43, 0x30, 0x13, 0x64, 0x31, 0x4b, 0xf0, 0x0d, 0x54, 0x04, 0x7e,
1334 0x40, 0x09, 0xde, 0x20, 0x43, 0x80, 0x13, 0x66, 0x31, 0x4b, 0xd0, 0x06,
1335 0xb3, 0x0c, 0x61, 0xd0, 0x06, 0xfc, 0x30, 0xc8, 0xd0, 0x0b, 0x39, 0x51,
1336 0x16, 0x23, 0x06, 0x85, 0x11, 0xb0, 0x46, 0xd0, 0x12, 0x73, 0x0c, 0x36,
1337 0x11, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xae, 0x31, 0xb8, 0xc4, 0x1c,
1338 0x83, 0x10, 0x98, 0xc6, 0x88, 0x41, 0x61, 0x04, 0xb0, 0x51, 0xbc, 0xc4,
1339 0x1c, 0x83, 0x10, 0x9c, 0xc6, 0x20, 0x43, 0xd0, 0x13, 0x6e, 0x31, 0xc8,
1340 0x10, 0x94, 0x03, 0x5c, 0x8c, 0x37, 0xd0, 0xc5, 0x5f, 0xb4, 0x06, 0x05,
1341 0x63, 0xbc, 0xc1, 0x2e, 0x42, 0x23, 0x35, 0x28, 0x18, 0x73, 0x0c, 0x63,
1342 0x11, 0xc4, 0xc6, 0x20, 0x43, 0x40, 0x16, 0x74, 0x61, 0x41, 0x22, 0x9f,
1343 0x41, 0x86, 0xc0, 0x2c, 0xee, 0x62, 0xb8, 0xe1, 0x88, 0x09, 0x67, 0x96,
1344 0x81, 0x0d, 0xc4, 0x20, 0x18, 0x43, 0x18, 0x6c, 0x63, 0xb8, 0x21, 0xa0,
1345 0x09, 0x65, 0x96, 0x81, 0x0c, 0xc6, 0x20, 0x30, 0xc1, 0x26, 0xe4, 0x33,
1346 0x4b, 0x50, 0x06, 0x23, 0x06, 0x84, 0x11, 0x84, 0xc7, 0x30, 0x62, 0x50,
1347 0x18, 0xc1, 0x78, 0x04, 0x39, 0x61, 0xc1, 0x4e, 0xc8, 0xc7, 0x82, 0x9e,
1348 0x80, 0xcf, 0x2c, 0x41, 0x19, 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64,
1349 0x30, 0xc7, 0xe0, 0x16, 0x81, 0x6f, 0x8c, 0x21, 0x30, 0xbd, 0x31, 0xdc,
1350 0x10, 0xf4, 0x84, 0x32, 0xcb, 0x70, 0x06, 0x66, 0x10, 0x98, 0xf0, 0x13,
1351 0xf2, 0x99, 0x25, 0x40, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xd4, 0x63, 0x18,
1352 0x31, 0x28, 0x8c, 0x80, 0x3d, 0x02, 0xb1, 0xb0, 0x80, 0x2c, 0xe4, 0x63,
1353 0x81, 0x59, 0xc0, 0x67, 0x96, 0x00, 0x0d, 0x06, 0x2a, 0x00, 0xc5, 0x0c,
1354 0x84, 0x33, 0x98, 0x63, 0x48, 0x82, 0xf2, 0x18, 0x43, 0xa8, 0xca, 0x63,
1355 0xb8, 0x21, 0x30, 0x0b, 0x65, 0x96, 0x41, 0x0d, 0xd2, 0x20, 0x30, 0x01,
1356 0x2d, 0xe4, 0x33, 0x4b, 0xb0, 0x06, 0x23, 0x06, 0x84, 0x11, 0xcc, 0xc7,
1357 0x30, 0x62, 0x50, 0x18, 0x41, 0x7d, 0x04, 0x6b, 0x61, 0x41, 0x5b, 0xc8,
1358 0xc7, 0x82, 0xb7, 0x80, 0xcf, 0x2c, 0xc1, 0x1a, 0x0c, 0x54, 0x00, 0x4a,
1359 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xed, 0x31, 0x62, 0x60, 0x18,
1360 0xc1, 0x7e, 0x04, 0xa2, 0x01, 0x1a, 0x83, 0x0c, 0x01, 0x69, 0xd4, 0xc6,
1361 0x2c, 0x01, 0x1b, 0x0c, 0x54, 0x04, 0x7e, 0x10, 0x06, 0xc2, 0x1a, 0x0c,
1362 0x32, 0x04, 0xa9, 0x71, 0x1b, 0xb3, 0x04, 0x6d, 0x30, 0xd0, 0x12, 0xf0,
1363 0x88, 0xc1, 0x23, 0x12, 0x8f, 0x7c, 0xb2, 0xc0, 0x06, 0x3c, 0x02, 0x06,
1364 0x03, 0x2d, 0x01, 0x8a, 0x18, 0x7a, 0x21, 0x99, 0xc3, 0x47, 0xb0, 0x81,
1365 0xcc, 0x80, 0xc1, 0x20, 0x43, 0x20, 0xec, 0x86, 0x05, 0xe1, 0x21, 0x9f,
1366 0x0c, 0xc2, 0x81, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xd7, 0xd2, 0x07,
1367 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4, 0x50, 0x13, 0xe7, 0x2c,
1368 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d, 0x9b, 0x6d, 0x29, 0x38,
1369 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b, 0x00, 0x03, 0x11, 0x71,
1370 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71, 0x21, 0x13, 0x00, 0x00,
1371 0x00, 0x01, 0x31, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0,
1372 0x40, 0x05, 0x64, 0x15, 0xb6, 0x0c, 0x42, 0x30, 0x0b, 0x5b, 0x86, 0x23,
1373 0xa0, 0x85, 0x2d, 0x83, 0x16, 0xd4, 0xc2, 0x96, 0xe1, 0x0b, 0x6c, 0x61,
1374 0xcb, 0x10, 0x06, 0xc1, 0x2d, 0x6c, 0x19, 0xd4, 0x20, 0xc0, 0x85, 0x2d,
1375 0xc3, 0x1b, 0x04, 0xb9, 0xb0, 0x65, 0xb0, 0x83, 0x40, 0x17, 0xb6, 0x0c,
1376 0x78, 0x10, 0xe4, 0xc2, 0x96, 0x81, 0x1d, 0x02, 0x5d, 0xd8, 0x32, 0xb8,
1377 0x43, 0x90, 0x0b, 0x5b, 0x06, 0xb5, 0x08, 0x74, 0x61, 0xcb, 0xc0, 0x16,
1378 0x41, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1379 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00,
1380 0x00, 0x24, 0x00, 0x00, 0x00, 0x64, 0xce, 0x41, 0x2c, 0x8d, 0x93, 0x06,
1381 0x54, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xdb, 0x0c, 0x00, 0x05,
1382 0x33, 0x00, 0xb4, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f,
1383 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e,
1384 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8,
1385 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd,
1386 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25,
1387 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f,
1388 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c,
1389 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2,
1390 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c,
1391 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82,
1392 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50,
1393 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xb5, 0xc1, 0x20,
1394 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96,
1395 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86,
1396 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0x40, 0x0f,
1397 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xe8, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x3e,
1398 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xa0, 0x83, 0x11, 0x83, 0xc2, 0x08, 0xfc,
1399 0x20, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xa8, 0x83, 0x59, 0x82, 0x62, 0xa0,
1400 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xf4, 0x60, 0x0c, 0x41, 0xc8,
1401 0x83, 0x31, 0x84, 0x21, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x10, 0x05, 0x21,
1402 0x18, 0x31, 0x28, 0x8c, 0x60, 0x14, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84,
1403 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03,
1404 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c,
1405 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x29, 0x0c, 0x32, 0x04,
1406 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d,
1407 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40,
1408 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x60,
1409 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0xa0, 0x15, 0x46, 0x0c, 0x0a,
1410 0x23, 0xa8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0xa0, 0x15, 0x46, 0x0c,
1411 0x0a, 0x23, 0xb8, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0xc0, 0x15, 0x66,
1412 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a,
1413 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
1415 0x00, 0x14, 0x00, 0x00, 0x00, 0xc0, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xff,
1416 0xff, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xed, 0x06, 0x00,
1417 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
1418 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
1419 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
1420 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32,
1421 0x14, 0x38, 0x08, 0x18, 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90,
1422 0x21, 0x23, 0xc4, 0x52, 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8,
1423 0x88, 0x11, 0x62, 0xa8, 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00,
1424 0x00, 0x51, 0x18, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24,
1425 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70,
1426 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a,
1427 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
1428 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2,
1429 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81,
1430 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1,
1431 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39,
1432 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74,
1433 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77,
1434 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78,
1435 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72,
1436 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1437 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1,
1438 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41,
1439 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1,
1440 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a,
1441 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74,
1442 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
1443 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1444 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1,
1445 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01,
1446 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
1447 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d,
1448 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36,
1449 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1,
1450 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01,
1451 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
1452 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79,
1453 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77,
1454 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71,
1455 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74,
1456 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21,
1457 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21,
1458 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60,
1459 0xc3, 0x26, 0x10, 0xc0, 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4,
1460 0x81, 0x38, 0xd4, 0x83, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8,
1461 0xc3, 0x3b, 0xb4, 0x41, 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00,
1462 0x1b, 0xb6, 0xa1, 0x00, 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1,
1463 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0,
1464 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01,
1465 0xd8, 0x60, 0x10, 0x06, 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0x40, 0x80, 0x05,
1466 0xa8, 0x36, 0x18, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50,
1467 0x1b, 0x7c, 0xe4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a,
1468 0x08, 0x07, 0x78, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73,
1469 0xa8, 0x07, 0x77, 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
1470 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1471 0x20, 0xda, 0x21, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21,
1472 0x1c, 0xd8, 0xa1, 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41,
1473 0x1e, 0xda, 0xe0, 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x3c,
1474 0xb0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74,
1475 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77,
1476 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78,
1477 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72,
1478 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1479 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1,
1480 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41,
1481 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1,
1482 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a,
1483 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74,
1484 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
1485 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
1486 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1,
1487 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01,
1488 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
1489 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d,
1490 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36,
1491 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1,
1492 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01,
1493 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
1494 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79,
1495 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77,
1496 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71,
1497 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74,
1498 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21,
1499 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21,
1500 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60,
1501 0x03, 0x82, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x80, 0x04, 0x54,
1502 0x1b, 0x8c, 0x24, 0x00, 0x16, 0xa0, 0xda, 0x60, 0x28, 0x02, 0xb0, 0x00,
1503 0xd5, 0x06, 0x64, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x09,
1504 0xa8, 0x36, 0x18, 0xcc, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50,
1505 0x1b, 0xa6, 0xe6, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x01, 0xa4, 0xc1,
1506 0x1d, 0xde, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21,
1507 0x1d, 0xdc, 0x61, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
1508 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40, 0x18, 0x88, 0x62, 0x42,
1509 0x60, 0x4c, 0x08, 0x8e, 0x09, 0x03, 0x92, 0x28, 0x13, 0x86, 0x25, 0x51,
1510 0x26, 0x04, 0xcc, 0x84, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00,
1511 0x00, 0x4d, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85,
1512 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90,
1513 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xc8, 0xc1,
1514 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14,
1515 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04,
1516 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84,
1517 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e,
1518 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e,
1519 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e,
1520 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe,
1521 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40,
1522 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8,
1523 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38,
1524 0x4d, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88,
1525 0xdf, 0x1e, 0x7e, 0x20, 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41,
1526 0x04, 0x26, 0xb8, 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98,
1527 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24,
1528 0x41, 0x10, 0x08, 0x44, 0xb2, 0x34, 0x0f, 0x41, 0x85, 0x28, 0x8a, 0xa2,
1529 0x20, 0xa9, 0x0c, 0x00, 0x00, 0x10, 0x55, 0x04, 0x00, 0x20, 0xab, 0x0c,
1530 0x40, 0x51, 0x10, 0x56, 0x8c, 0xa2, 0x00, 0x00, 0x00, 0x20, 0xad, 0x0c,
1531 0x45, 0x51, 0x10, 0x57, 0x84, 0xa2, 0x20, 0x6f, 0x8e, 0x00, 0x0c, 0xe6,
1532 0x08, 0x82, 0x61, 0x04, 0x01, 0x0c, 0x4a, 0x12, 0x34, 0x8f, 0x00, 0x86,
1533 0x62, 0x08, 0xd0, 0x58, 0x90, 0x60, 0x79, 0x84, 0x50, 0x0c, 0x01, 0x2a,
1534 0x07, 0x02, 0x52, 0x00, 0x1c, 0x46, 0x18, 0xc0, 0x60, 0x10, 0x21, 0x10,
1535 0xe6, 0x08, 0x40, 0x61, 0x10, 0xe1, 0x10, 0x06, 0x11, 0x0a, 0x61, 0x10,
1536 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x08, 0x30, 0x00, 0x00,
1537 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0, 0x03, 0x3a, 0x68, 0x83,
1538 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68, 0x83, 0x74, 0x78, 0x87,
1539 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80, 0x83, 0x0d, 0xb7, 0x51,
1540 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1541 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x7a, 0x80,
1542 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x78, 0xa0,
1543 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60,
1544 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0,
1545 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x60,
1546 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0,
1547 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
1548 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40,
1549 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x76, 0xa0,
1550 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20,
1551 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0,
1552 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30,
1553 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78, 0xa0, 0x07, 0x76, 0x40,
1554 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x60, 0x07, 0x74, 0xa0,
1555 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6, 0x90,
1556 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xa0, 0x07, 0x71, 0x20,
1557 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10,
1558 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x6d, 0x60,
1559 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xa0,
1560 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x75, 0x60,
1561 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60,
1562 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10,
1563 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x10,
1564 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71, 0x00, 0x07, 0x72, 0x40,
1565 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xd0, 0x06, 0xee, 0x80,
1566 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x43, 0x98,
1567 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x04,
1568 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xa6, 0x02, 0x02,
1569 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x73, 0x01, 0x01, 0x20,
1570 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xc9, 0x80, 0x00, 0x10, 0x00,
1571 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x6c, 0x08, 0x30, 0x0c, 0x00, 0x00,
1572 0x00, 0x01, 0x00, 0x0c, 0x61, 0x2a, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00,
1573 0x00, 0x00, 0x86, 0x30, 0x1d, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
1574 0x00, 0x43, 0x98, 0x0f, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80,
1575 0x21, 0x4c, 0x07, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10,
1576 0x86, 0x0c, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2,
1577 0x98, 0x01, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x20,
1578 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c,
1579 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x02, 0x47, 0x00, 0x4a,
1580 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80, 0x0a, 0x30, 0xa0, 0x0c,
1581 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c,
1582 0x68, 0x2d, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88, 0xc2, 0x28, 0x90, 0x42,
1583 0x29, 0x18, 0x42, 0xc7, 0x12, 0x24, 0x01, 0x00, 0x00, 0x79, 0x18, 0x00,
1584 0x00, 0xd9, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x10, 0x97, 0x29, 0xa2,
1585 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0xb7, 0x21, 0x06, 0x18,
1586 0x40, 0x67, 0x00, 0xa0, 0x41, 0x19, 0x50, 0xb9, 0x1b, 0x43, 0x0b, 0x93,
1587 0xfb, 0x9a, 0x4b, 0xd3, 0x2b, 0x1b, 0x62, 0x80, 0x41, 0x73, 0x06, 0x02,
1588 0x18, 0x38, 0x8c, 0x83, 0x20, 0x38, 0x38, 0xb6, 0x32, 0x90, 0xb6, 0x32,
1589 0xba, 0x30, 0x36, 0x10, 0xbb, 0x32, 0xb9, 0xb9, 0xb4, 0x37, 0x37, 0x90,
1590 0x19, 0x19, 0x18, 0x99, 0x19, 0x17, 0x1a, 0x18, 0x1a, 0x10, 0x94, 0xb6,
1591 0x32, 0xba, 0x30, 0x36, 0xb3, 0xb2, 0x96, 0x19, 0x19, 0x18, 0x99, 0x19,
1592 0x17, 0x1a, 0x18, 0x9a, 0x94, 0x21, 0xc2, 0x19, 0x10, 0x43, 0x0c, 0x30,
1593 0x68, 0xc0, 0x20, 0x02, 0x03, 0x86, 0x45, 0x53, 0x19, 0x5d, 0x18, 0xdb,
1594 0x10, 0xe4, 0x0c, 0x0e, 0x30, 0x68, 0xc0, 0xa0, 0x01, 0x03, 0x86, 0x5b,
1595 0x58, 0x9a, 0x9c, 0xcb, 0xd8, 0x5b, 0x1b, 0x5c, 0x1a, 0x5b, 0x99, 0x0b,
1596 0x59, 0x99, 0xdb, 0x9b, 0x5c, 0xdb, 0xdc, 0x17, 0x59, 0xda, 0x5c, 0x98,
1597 0x18, 0x5b, 0xd9, 0x10, 0xe1, 0x0c, 0x12, 0x72, 0x61, 0x69, 0x72, 0x2e,
1598 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74,
1599 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
1600 0x43, 0x84, 0x33, 0x58, 0x48, 0x06, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f,
1601 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62,
1602 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f,
1603 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x84, 0x33, 0x68, 0x18, 0x85,
1604 0xa5, 0xc9, 0xb9, 0xc8, 0x95, 0xb9, 0x91, 0x95, 0xc9, 0x7d, 0xd1, 0x85,
1605 0xc9, 0x9d, 0x95, 0xd1, 0x31, 0x0a, 0x4b, 0x93, 0x73, 0x09, 0x93, 0x3b,
1606 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x72, 0x0b, 0x6b, 0x2b, 0xa3, 0x61,
1607 0xc6, 0xf6, 0x16, 0x46, 0x47, 0x33, 0x04, 0x39, 0x83, 0x07, 0x0c, 0x98,
1608 0x33, 0x80, 0xce, 0x20, 0x1a, 0x22, 0x9c, 0x81, 0x44, 0x26, 0x2c, 0x4d,
1609 0xce, 0x05, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x8d, 0x4a, 0x58,
1610 0x9a, 0x9c, 0xcb, 0x58, 0x99, 0x1b, 0x5d, 0x99, 0x1c, 0xa5, 0xb0, 0x34,
1611 0x39, 0x17, 0xb7, 0xb7, 0x2f, 0xb8, 0x32, 0xb9, 0x39, 0xb8, 0xb2, 0x31,
1612 0xba, 0x34, 0xbb, 0x32, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67,
1613 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x44, 0xe0, 0xde, 0xe6, 0xd2, 0xe8, 0xd2,
1614 0xde, 0xdc, 0x86, 0x40, 0x60, 0xc0, 0x9c, 0x01, 0x75, 0x06, 0xd5, 0x19,
1615 0x58, 0x67, 0x00, 0x9d, 0x41, 0x74, 0x06, 0xd7, 0x19, 0x60, 0x94, 0xc2,
1616 0xd2, 0xe4, 0x5c, 0xcc, 0xe4, 0xc2, 0xce, 0xda, 0xca, 0xdc, 0xe8, 0xbe,
1617 0xd2, 0xdc, 0xe0, 0xea, 0xe8, 0x68, 0x9d, 0x95, 0xb9, 0x95, 0xc9, 0x85,
1618 0xd1, 0x95, 0x91, 0xa1, 0xd4, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x11, 0xd9,
1619 0xd1, 0x7c, 0x99, 0xa5, 0xf0, 0x09, 0x4b, 0x93, 0x73, 0x81, 0x2b, 0x93,
1620 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b, 0x63, 0x31, 0xf6, 0xc6,
1621 0xf6, 0x26, 0x37, 0x44, 0x02, 0x83, 0xe6, 0x0c, 0xb4, 0x33, 0xd8, 0xce,
1622 0xa0, 0x3a, 0x03, 0xee, 0x0c, 0xa0, 0x33, 0x88, 0xce, 0xe0, 0x3a, 0x83,
1623 0x8e, 0xd9, 0x59, 0x99, 0x5b, 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a,
1624 0x0e, 0x5d, 0x19, 0xde, 0xd8, 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc,
1625 0x97, 0x59, 0x0a, 0x0d, 0x33, 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74,
1626 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x43, 0x24, 0x30, 0x80, 0xce,
1627 0x40, 0x3b, 0x83, 0xef, 0x0c, 0xaa, 0x33, 0xe0, 0xce, 0x00, 0x3a, 0x03,
1628 0x30, 0x38, 0x83, 0xeb, 0x0c, 0xc2, 0x80, 0x4a, 0x58, 0x9a, 0x9c, 0x8b,
1629 0x58, 0x9d, 0x99, 0x59, 0x99, 0x1c, 0x9f, 0xb0, 0x34, 0x39, 0x17, 0xb1,
1630 0x3a, 0x33, 0xb3, 0x32, 0xb9, 0xaf, 0xb9, 0x34, 0xbd, 0x32, 0x4a, 0x61,
1631 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
1632 0x69, 0x6e, 0x64, 0x65, 0x78, 0x44, 0xc2, 0xd2, 0xe4, 0x5c, 0xe4, 0xca,
1633 0xc2, 0xc8, 0x48, 0x85, 0xa5, 0xc9, 0xb9, 0xcc, 0xd1, 0xc9, 0xd5, 0x8d,
1634 0xd1, 0x7d, 0xd1, 0xe5, 0xc1, 0x95, 0x7d, 0xa5, 0xb9, 0x99, 0xbd, 0xb1,
1635 0x30, 0x63, 0x7b, 0x0b, 0xa3, 0x23, 0x33, 0x37, 0x26, 0x75, 0x24, 0xf4,
1636 0xf5, 0x56, 0x47, 0x07, 0x57, 0x47, 0x47, 0x86, 0xae, 0x0c, 0x8f, 0xae,
1637 0x4e, 0xae, 0xec, 0x8b, 0x2e, 0x0f, 0xae, 0x8c, 0x4a, 0x9a, 0x1b, 0x5c,
1638 0x1d, 0xdd, 0x17, 0x5d, 0x1e, 0x5c, 0x19, 0x97, 0xb1, 0x37, 0xb6, 0x37,
1639 0xb9, 0xaf, 0xb9, 0xb1, 0x30, 0xb6, 0x32, 0x3a, 0x74, 0x6f, 0x6e, 0x65,
1640 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x7c, 0xe8,
1641 0xde, 0xdc, 0xca, 0xda, 0xc2, 0xe0, 0xbe, 0xcc, 0xc2, 0xc6, 0xe8, 0xde,
1642 0xe4, 0x62, 0xf8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0x99,
1643 0x85, 0x8d, 0xd1, 0xbd, 0xc9, 0xc9, 0xf0, 0x99, 0x23, 0x93, 0xfb, 0xba,
1644 0x43, 0x4b, 0xa3, 0x2b, 0xfb, 0x82, 0x7b, 0x4b, 0x73, 0xa3, 0x1b, 0x02,
1645 0x0b, 0x60, 0xc0, 0x80, 0x81, 0x03, 0x06, 0xcc, 0x19, 0xa0, 0xc1, 0x19,
1646 0xa4, 0x01, 0x18, 0x38, 0x60, 0xe0, 0x80, 0x01, 0x73, 0x06, 0x68, 0x70,
1647 0x06, 0x6a, 0x00, 0x06, 0x11, 0x18, 0x38, 0x60, 0xc0, 0x9c, 0x01, 0x1a,
1648 0x9c, 0xc1, 0x1a, 0x80, 0x41, 0x05, 0x06, 0x0e, 0x18, 0x30, 0x67, 0x80,
1649 0x06, 0x67, 0xc0, 0x06, 0x60, 0xf0, 0x80, 0x81, 0x03, 0x06, 0xcc, 0x19,
1650 0xa0, 0xc1, 0x19, 0xb4, 0x01, 0x18, 0x58, 0x60, 0xe0, 0x80, 0x01, 0x73,
1651 0x06, 0x68, 0x70, 0x06, 0x6e, 0x00, 0x06, 0x17, 0x18, 0x38, 0x60, 0xc0,
1652 0x9c, 0x01, 0x1a, 0x9c, 0xc1, 0x1b, 0x80, 0x01, 0x06, 0x06, 0x0e, 0x18,
1653 0x30, 0x67, 0x80, 0x06, 0x67, 0x00, 0x07, 0x8c, 0xc2, 0xd2, 0xe4, 0x5c,
1654 0xc2, 0xe4, 0xce, 0xbe, 0xe8, 0xf2, 0xe0, 0xca, 0xbe, 0xe6, 0xd2, 0xf4,
1655 0xca, 0x78, 0x85, 0xa5, 0xc9, 0xb9, 0x84, 0xc9, 0x9d, 0x7d, 0xd1, 0xe5,
1656 0xc1, 0x95, 0x7d, 0x85, 0xb1, 0xa5, 0x9d, 0xb9, 0x7d, 0xcd, 0xa5, 0xe9,
1657 0x95, 0xf1, 0x99, 0x42, 0x0b, 0x23, 0x2b, 0x93, 0x1b, 0x7a, 0x73, 0x9b,
1658 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0x63, 0x30, 0x36, 0x84, 0x0c, 0xc0, 0x80,
1659 0x3a, 0x83, 0x31, 0x38, 0x03, 0x32, 0x00, 0x03, 0xe9, 0x0c, 0xca, 0x00,
1660 0x0c, 0x18, 0x30, 0x68, 0xce, 0xc0, 0x0c, 0xce, 0xe0, 0x0c, 0xce, 0x20,
1661 0x0e, 0xce, 0x40, 0x0e, 0xc0, 0x40, 0x3a, 0x83, 0x39, 0x00, 0x03, 0xe7,
1662 0x0c, 0xa0, 0x33, 0xa0, 0x83, 0x33, 0xb8, 0xce, 0xa0, 0x0e, 0x68, 0x98,
1663 0xb1, 0xbd, 0x85, 0xd1, 0xcd, 0xd0, 0x78, 0x33, 0x33, 0x9b, 0x2b, 0xa3,
1664 0x23, 0x62, 0xc6, 0xf6, 0x16, 0x46, 0x37, 0x83, 0x37, 0x43, 0xa3, 0x2d,
1665 0x8c, 0x4e, 0x2e, 0x0d, 0x6f, 0x08, 0x05, 0x06, 0x0c, 0x18, 0x3c, 0x60,
1666 0xc0, 0x9c, 0xc1, 0x1d, 0x9c, 0x01, 0x1e, 0x80, 0xc1, 0x03, 0x06, 0x19,
1667 0x18, 0x30, 0x67, 0x90, 0x07, 0x67, 0xa0, 0x07, 0x4c, 0xb2, 0xaa, 0xac,
1668 0x88, 0xca, 0xc6, 0xde, 0xc8, 0xca, 0x68, 0x90, 0x95, 0x8d, 0xbd, 0x91,
1669 0x95, 0x0d, 0x21, 0x03, 0x30, 0x70, 0xce, 0x60, 0x0c, 0xce, 0x80, 0x0c,
1670 0xc0, 0x60, 0x3a, 0x83, 0x32, 0x00, 0x83, 0x06, 0x0c, 0x9a, 0x33, 0x30,
1671 0x83, 0x33, 0x38, 0x83, 0x33, 0xd8, 0x83, 0x33, 0x90, 0x03, 0x30, 0x98,
1672 0xce, 0x60, 0x0e, 0xc0, 0xe0, 0x39, 0x03, 0xe8, 0x0c, 0xf8, 0xe0, 0x0c,
1673 0xae, 0x33, 0xe8, 0x03, 0x2e, 0x61, 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78,
1674 0x74, 0x75, 0x72, 0x65, 0x54, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6, 0xc2, 0xda,
1675 0xe0, 0xd8, 0xca, 0x88, 0xd1, 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xc9,
1676 0x90, 0xf1, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xb1, 0x80, 0xcc, 0x85, 0xb5,
1677 0xc1, 0xb1, 0x95, 0xf9, 0x90, 0xa0, 0x2b, 0xc3, 0xcb, 0x1a, 0x42, 0x81,
1678 0x81, 0x76, 0x06, 0x7f, 0x70, 0x06, 0x65, 0x00, 0x06, 0x0c, 0x18, 0x34,
1679 0x67, 0x00, 0x0a, 0x67, 0x00, 0x9d, 0x41, 0x28, 0x9c, 0xc1, 0x75, 0x06,
1680 0xa2, 0x40, 0x8f, 0xae, 0x0c, 0x8f, 0xae, 0x4e, 0xae, 0x4c, 0x86, 0xec,
1681 0x2b, 0x4c, 0x4e, 0x2e, 0x2c, 0x8f, 0xc7, 0x8c, 0xed, 0x2d, 0x8c, 0x8e,
1682 0x05, 0x64, 0x2e, 0xac, 0x0d, 0x8e, 0xad, 0xcc, 0x87, 0x05, 0x5d, 0x19,
1683 0x5e, 0x95, 0xd5, 0x10, 0x0a, 0x0c, 0xb6, 0x33, 0xf8, 0x83, 0x33, 0x28,
1684 0x03, 0x30, 0x68, 0xc0, 0xa0, 0x39, 0x03, 0x50, 0x38, 0x03, 0xe8, 0x0c,
1685 0x48, 0xe1, 0x0c, 0xae, 0x33, 0x28, 0x05, 0x2e, 0x61, 0x69, 0x72, 0x2e,
1686 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x3c, 0xe6, 0xc2, 0xda, 0xe0,
1687 0xd8, 0xca, 0xe4, 0x18, 0xcc, 0x0d, 0x91, 0xc0, 0x80, 0x3b, 0x83, 0x53,
1688 0x38, 0x83, 0x32, 0x00, 0x03, 0x06, 0x0c, 0x9a, 0x33, 0x80, 0xce, 0x00,
1689 0x15, 0xce, 0xe0, 0x3a, 0x83, 0x54, 0x18, 0x02, 0x9d, 0x41, 0x76, 0x06,
1690 0xde, 0x19, 0x88, 0xc1, 0x19, 0xd8, 0xc1, 0x19, 0xf8, 0xc1, 0x19, 0x8c,
1691 0xc2, 0x19, 0x98, 0xc2, 0x19, 0xa8, 0xc2, 0x10, 0x23, 0x02, 0xce, 0x60,
1692 0x3a, 0x83, 0x55, 0xa0, 0x18, 0x84, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5,
1693 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xcd, 0xa1, 0x4c, 0x11,
1694 0x31, 0x7d, 0x65, 0x55, 0x59, 0x7d, 0x99, 0xc9, 0x85, 0x9d, 0xb5, 0x95,
1695 0xb9, 0xd1, 0xa5, 0x0c, 0x21, 0xce, 0xc0, 0x15, 0xce, 0xa0, 0x15, 0x88,
1696 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d,
1697 0xbd, 0xc1, 0x95, 0xb5, 0xd0, 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xcd,
1698 0x0d, 0x31, 0xce, 0x00, 0x16, 0xce, 0xc0, 0x15, 0xce, 0xe0, 0x15, 0x88,
1699 0x85, 0xa5, 0xc9, 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d,
1700 0xbd, 0xc1, 0x95, 0xb5, 0xcc, 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xcd,
1701 0x0d, 0x31, 0xce, 0x40, 0x16, 0xce, 0xc0, 0x15, 0xce, 0x20, 0x16, 0x86,
1702 0x10, 0x67, 0x00, 0x0b, 0x67, 0x20, 0x0b, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a,
1703 0xc2, 0xd8, 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a,
1704 0xc2, 0xe4, 0xce, 0x50, 0x66, 0x52, 0x86, 0x18, 0x67, 0x50, 0x0b, 0x67,
1705 0xe0, 0x0a, 0x67, 0x40, 0x0b, 0xb4, 0xc2, 0xd2, 0xe4, 0x5a, 0xc2, 0xd8,
1706 0xd2, 0xc2, 0xe6, 0x5a, 0xe6, 0xc6, 0xde, 0xe0, 0xca, 0x5a, 0xc2, 0xe4,
1707 0xce, 0x50, 0x68, 0x52, 0x86, 0x18, 0x67, 0x70, 0x0b, 0x67, 0xe0, 0x0a,
1708 0x67, 0x60, 0x0b, 0x43, 0x88, 0x33, 0xa8, 0x85, 0x33, 0xb8, 0x85, 0x21,
1709 0xc2, 0x19, 0xdc, 0xc2, 0x10, 0xe3, 0x0c, 0x6a, 0xe1, 0x0c, 0x60, 0xe1,
1710 0x0c, 0x64, 0x81, 0xd5, 0x97, 0x16, 0xd5, 0x54, 0x4c, 0xcd, 0x14, 0x5a,
1711 0x18, 0x59, 0x99, 0xdc, 0xd0, 0x9b, 0xdb, 0x1c, 0x5d, 0x98, 0x1b, 0xdd,
1712 0x1c, 0x9f, 0xb7, 0x36, 0xb7, 0x34, 0xb8, 0x37, 0xba, 0x32, 0x37, 0x3a,
1713 0x90, 0x31, 0xb4, 0x30, 0x39, 0x3e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65,
1714 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x43, 0x84, 0x33,
1715 0xe8, 0x85, 0x21, 0xc6, 0x19, 0xf0, 0xc2, 0x19, 0xf8, 0xc2, 0x1a, 0x78,
1716 0x43, 0x8c, 0x33, 0x40, 0x83, 0x33, 0xf8, 0x85, 0x35, 0xf0, 0x86, 0x88,
1717 0xc1, 0x19, 0xec, 0xc2, 0x19, 0x80, 0xc3, 0x1a, 0x78, 0x67, 0x00, 0x0e,
1718 0x6b, 0xf0, 0x9d, 0x01, 0x38, 0xac, 0x01, 0x18, 0x9c, 0x01, 0x38, 0xac,
1719 0x41, 0x18, 0x9c, 0x01, 0x38, 0xac, 0x81, 0x18, 0x9c, 0x01, 0x38, 0xac,
1720 0xc1, 0x18, 0x9c, 0x01, 0x38, 0xac, 0x01, 0x19, 0x9c, 0x01, 0x38, 0xac,
1721 0x41, 0x37, 0xc4, 0x38, 0x83, 0x70, 0x38, 0x03, 0x70, 0x58, 0x03, 0x30,
1722 0x18, 0x62, 0x9c, 0x41, 0x38, 0x9c, 0x01, 0x38, 0xac, 0x41, 0x37, 0xc4,
1723 0x38, 0x83, 0x70, 0x38, 0x03, 0x70, 0x58, 0x03, 0x31, 0x18, 0x62, 0x9c,
1724 0x41, 0x38, 0x9c, 0x01, 0x38, 0xac, 0xc1, 0x18, 0x0c, 0x31, 0xce, 0x20,
1725 0x1c, 0xce, 0x00, 0x1c, 0xd6, 0x80, 0x0c, 0x86, 0x18, 0x67, 0x10, 0x0e,
1726 0x67, 0x00, 0x0e, 0x6b, 0xf0, 0x0d, 0x31, 0xce, 0x20, 0x1c, 0xce, 0x00,
1727 0x1c, 0xd6, 0x20, 0x0c, 0x86, 0x18, 0x67, 0x10, 0x0e, 0x67, 0x00, 0x0e,
1728 0x6b, 0xe0, 0x8d, 0x88, 0xd8, 0x81, 0x1d, 0xec, 0xa1, 0x1d, 0xdc, 0xa0,
1729 0x1d, 0xde, 0x81, 0x1c, 0xea, 0x81, 0x1d, 0xca, 0xc1, 0x0d, 0xcc, 0x81,
1730 0x1d, 0xc2, 0xe1, 0x1c, 0xe6, 0x61, 0x8a, 0x10, 0x0c, 0x23, 0x14, 0x76,
1731 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x48, 0x07, 0x72, 0x28, 0x07, 0x77,
1732 0xa0, 0x87, 0x29, 0x41, 0x31, 0x62, 0x09, 0x87, 0x74, 0x90, 0x07, 0x37,
1733 0xb0, 0x87, 0x72, 0x90, 0x87, 0x79, 0x48, 0x87, 0x77, 0x70, 0x87, 0x29,
1734 0x81, 0x31, 0x82, 0x0a, 0x87, 0x74, 0x90, 0x07, 0x37, 0x60, 0x87, 0x70,
1735 0x70, 0x87, 0x73, 0xa8, 0x87, 0x70, 0x38, 0x87, 0x72, 0xf8, 0x05, 0x7b,
1736 0x28, 0x07, 0x79, 0x98, 0x87, 0x74, 0x78, 0x07, 0x77, 0x98, 0x12, 0x20,
1737 0x23, 0xa6, 0x70, 0x48, 0x07, 0x79, 0x70, 0x83, 0x71, 0x78, 0x87, 0x76,
1738 0x80, 0x87, 0x74, 0x60, 0x87, 0x72, 0xf8, 0x85, 0x77, 0x80, 0x07, 0x7a,
1739 0x48, 0x87, 0x77, 0x70, 0x87, 0x79, 0x98, 0x32, 0x28, 0x8c, 0x33, 0x82,
1740 0x09, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x07, 0x79, 0x08, 0x87, 0x73,
1741 0x68, 0x87, 0x72, 0x70, 0x07, 0x7a, 0x98, 0x12, 0xb0, 0x02, 0x00, 0x00,
1742 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
1743 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
1744 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
1745 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
1746 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
1747 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
1748 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
1749 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
1750 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
1751 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
1752 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
1753 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
1754 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
1755 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
1756 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
1757 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
1758 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
1759 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
1760 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
1761 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
1762 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
1763 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
1764 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70,
1765 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74,
1766 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f,
1767 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e,
1768 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41,
1769 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1,
1770 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c,
1771 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37,
1772 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f,
1773 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21,
1774 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21,
1775 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0,
1776 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88,
1777 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77,
1778 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c,
1779 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23,
1780 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01,
1781 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84,
1782 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8,
1783 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76,
1784 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e,
1785 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f,
1786 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e,
1787 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e,
1788 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1,
1789 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21,
1790 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8,
1791 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77,
1792 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19,
1793 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e,
1794 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30,
1795 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71,
1796 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77,
1797 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
1798 0x00, 0x35, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf,
1799 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45,
1800 0x51, 0x14, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05,
1801 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x01, 0x14, 0x80, 0x44, 0x7e,
1802 0x01, 0x48, 0xd3, 0x2f, 0x2c, 0x00, 0xf3, 0xf8, 0xd5, 0x5d, 0xdc, 0xb6,
1803 0x09, 0x40, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xff, 0xe3, 0x58, 0x7e,
1804 0x71, 0xdb, 0x36, 0x10, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05,
1805 0x10, 0x48, 0x7e, 0x71, 0xdb, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80,
1806 0x34, 0xfd, 0x8f, 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x84, 0x01,
1807 0x80, 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13, 0x71, 0x4d, 0x54,
1808 0x44, 0xfc, 0xf6, 0xf0, 0x03, 0x51, 0x04, 0x60, 0x7e, 0x85, 0x17, 0xb7,
1809 0x6d, 0x04, 0x0d, 0x80, 0x44, 0xfe, 0xe0, 0x4c, 0x7e, 0x75, 0x17, 0xb7,
1810 0x6d, 0x0b, 0x1b, 0x80, 0x44, 0xbe, 0x04, 0x30, 0xcf, 0x42, 0xfc, 0x13,
1811 0x71, 0x4d, 0x54, 0x44, 0xfc, 0xf6, 0xe0, 0x57, 0x78, 0x71, 0xdb, 0x86,
1812 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05, 0x10, 0x48, 0x7e,
1813 0x75, 0x17, 0xb7, 0x6d, 0x00, 0x10, 0xdb, 0x95, 0xbf, 0xec, 0xbe, 0x7f,
1814 0x11, 0x01, 0x06, 0x43, 0x34, 0x93, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05,
1815 0x20, 0x4d, 0x7f, 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00,
1816 0x00, 0x61, 0x20, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e,
1817 0x10, 0x0b, 0x04, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x14, 0x8f, 0x45,
1818 0x00, 0x81, 0x70, 0xcc, 0x41, 0x30, 0x0d, 0x84, 0x07, 0xb4, 0x16, 0x41,
1819 0x09, 0x50, 0x3a, 0xc7, 0xc0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c, 0x35,
1820 0x00, 0x81, 0x40, 0xe2, 0x08, 0x00, 0x85, 0x23, 0x00, 0x35, 0x40, 0xe0,
1821 0x0c, 0x00, 0x01, 0x63, 0x04, 0xef, 0x9e, 0x96, 0xf7, 0x37, 0x46, 0xa0,
1822 0xb3, 0xe6, 0x1c, 0x82, 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x09, 0x06,
1823 0x63, 0x04, 0x20, 0x08, 0x82, 0x20, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03,
1824 0x30, 0x03, 0x30, 0x07, 0x21, 0x0b, 0xb2, 0x20, 0x0b, 0xb3, 0x30, 0x07,
1825 0x31, 0x0b, 0xb9, 0x30, 0x0b, 0x7d, 0x40, 0xc5, 0x0c, 0xc0, 0x08, 0xc0,
1826 0x0c, 0xc0, 0x58, 0x03, 0x08, 0x82, 0x20, 0xfe, 0x81, 0x20, 0x08, 0xe2,
1827 0x1f, 0x08, 0x82, 0x20, 0xfe, 0x8d, 0x35, 0xb0, 0xed, 0xfc, 0x93, 0x1e,
1828 0xdb, 0xce, 0x3f, 0xe9, 0xb1, 0xed, 0xfc, 0x93, 0xde, 0x58, 0x03, 0x08,
1829 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8,
1830 0xd6, 0xbf, 0x30, 0xd6, 0x00, 0x82, 0xe0, 0x9a, 0x83, 0x01, 0x08, 0x82,
1831 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x8c, 0x35, 0x80, 0x20,
1832 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d,
1833 0x0e, 0x06, 0x63, 0x0d, 0xeb, 0x88, 0xc7, 0x2c, 0x18, 0xac, 0x23, 0x1e,
1834 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x58, 0x03, 0x08, 0xc2,
1835 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87,
1836 0x63, 0x30, 0xd6, 0x20, 0xe6, 0x62, 0xda, 0x7f, 0x60, 0xc9, 0xb3, 0xf1,
1837 0x2f, 0x8c, 0xe9, 0xaa, 0xe6, 0xbe, 0x30, 0xd6, 0xf0, 0xcf, 0xa4, 0xff,
1838 0xfb, 0x02, 0x5d, 0x83, 0x62, 0xfe, 0xb5, 0x70, 0x1c, 0x83, 0xbe, 0x30,
1839 0xd6, 0x30, 0xf7, 0x6d, 0x9a, 0xfa, 0x42, 0xeb, 0x86, 0x3c, 0xef, 0x0b,
1840 0x7c, 0xce, 0xfa, 0xf8, 0x47, 0xc0, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed,
1841 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0x79, 0xaf, 0xab,
1842 0xec, 0xcd, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81,
1843 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba, 0xf8, 0x37,
1844 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8, 0xf6, 0x34,
1845 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00, 0x00, 0x00,
1846 0x00, 0x23, 0x06, 0x4a, 0x11, 0xbc, 0xc2, 0x1b, 0xb4, 0x81, 0x1c, 0x8c,
1847 0x41, 0x19, 0x90, 0x41, 0x30, 0x62, 0xb0, 0x14, 0x41, 0x2c, 0xbc, 0x81,
1848 0x1b, 0xcc, 0xc1, 0x2b, 0x90, 0x81, 0x19, 0x94, 0x81, 0x30, 0x86, 0x10,
1849 0xc0, 0xc2, 0x20, 0xc3, 0xe0, 0xad, 0xc1, 0x1c, 0x43, 0x20, 0xc4, 0xc2,
1850 0x88, 0xc1, 0x52, 0x04, 0xb5, 0x30, 0x07, 0x72, 0x70, 0x07, 0xb2, 0x80,
1851 0x06, 0x6a, 0x90, 0x06, 0xc6, 0x18, 0x42, 0x40, 0x0b, 0x73, 0x0c, 0x43,
1852 0x10, 0x0b, 0x87, 0x07, 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x33, 0x80,
1853 0x03, 0x23, 0x02, 0xf8, 0x8c, 0x37, 0xf0, 0x01, 0x2a, 0xe4, 0xc2, 0x05,
1854 0xea, 0x52, 0x50, 0x06, 0x19, 0x82, 0x35, 0xa8, 0x83, 0x11, 0x83, 0xc2,
1855 0x08, 0xcc, 0xa1, 0x08, 0xc6, 0x2b, 0x42, 0xa1, 0x15, 0x7c, 0xe1, 0x17,
1856 0xf4, 0xe0, 0x02, 0x75, 0x29, 0x28, 0x83, 0x0c, 0x01, 0x1c, 0xe8, 0xc1,
1857 0x88, 0x41, 0x61, 0x04, 0xeb, 0xa0, 0x04, 0xe3, 0x15, 0xa6, 0x20, 0x0b,
1858 0xe3, 0x40, 0x0e, 0xa0, 0x70, 0x81, 0xba, 0x14, 0x94, 0x41, 0x86, 0xa0,
1859 0x0e, 0xfe, 0x60, 0xc4, 0xa0, 0x30, 0x02, 0x78, 0x78, 0x82, 0x39, 0x86,
1860 0x3a, 0x58, 0xd2, 0x61, 0x8e, 0x21, 0x38, 0xd2, 0x61, 0x8e, 0x21, 0x18,
1861 0xce, 0x61, 0xbc, 0xe1, 0x15, 0x74, 0x01, 0x1d, 0x28, 0x18, 0xc3, 0x0d,
1862 0xc1, 0x1f, 0x04, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0x10, 0x7d, 0x70,
1863 0x0a, 0xe3, 0x0d, 0xb3, 0xe0, 0x0b, 0xe0, 0x40, 0xc1, 0x18, 0x31, 0x20,
1864 0x8c, 0xc0, 0x1e, 0x86, 0x11, 0x83, 0xc2, 0x08, 0xf0, 0x21, 0xc8, 0x03,
1865 0x0b, 0xf2, 0x00, 0x3e, 0x23, 0x06, 0x85, 0x11, 0xe0, 0x43, 0xe0, 0x07,
1866 0x36, 0xe8, 0x81, 0x7c, 0x4c, 0x0f, 0x82, 0xf8, 0xd8, 0x10, 0xd0, 0x67,
1867 0xc4, 0x80, 0x30, 0x82, 0x7e, 0x08, 0x46, 0x0c, 0x0a, 0x23, 0xf8, 0x87,
1868 0x80, 0x0f, 0x2c, 0xe0, 0x03, 0xf9, 0xcc, 0x31, 0x98, 0xc2, 0xc2, 0x0f,
1869 0x83, 0x0c, 0xc1, 0x29, 0xd8, 0x82, 0x0d, 0x01, 0x7d, 0x06, 0x19, 0x82,
1870 0x54, 0xe0, 0x85, 0x41, 0x86, 0xa0, 0xf2, 0x85, 0x59, 0x02, 0x61, 0xa0,
1871 0x22, 0x10, 0x02, 0x36, 0x00, 0xc6, 0x1b, 0xca, 0x01, 0x1e, 0x40, 0x82,
1872 0x82, 0x31, 0xdc, 0x10, 0xdc, 0x81, 0x33, 0xcb, 0x30, 0x10, 0xc1, 0x20,
1873 0x03, 0x31, 0x0b, 0xbd, 0x30, 0xde, 0x90, 0x0e, 0xf4, 0x80, 0x0f, 0x14,
1874 0x8c, 0xf1, 0x86, 0x75, 0xb0, 0x87, 0x7c, 0xa0, 0x60, 0x8c, 0x18, 0x20,
1875 0x47, 0x14, 0x13, 0x45, 0x77, 0x0c, 0xc1, 0x20, 0x43, 0x50, 0x0b, 0xe8,
1876 0x30, 0xc8, 0x10, 0x2c, 0xea, 0x30, 0x4b, 0x40, 0x0c, 0x54, 0x04, 0xc2,
1877 0x80, 0x09, 0xc3, 0x0d, 0x61, 0x70, 0x0a, 0xc1, 0x2c, 0x43, 0x31, 0x05,
1878 0xe3, 0x0d, 0xf2, 0xd0, 0x0f, 0x2e, 0x41, 0xc1, 0x18, 0x6e, 0x08, 0x54,
1879 0x21, 0x98, 0x65, 0x30, 0x8e, 0x60, 0x90, 0xa1, 0x00, 0x07, 0x75, 0x18,
1880 0x6f, 0xb0, 0x87, 0x90, 0x58, 0x09, 0x0a, 0xc6, 0x1c, 0xc3, 0x2f, 0x04,
1881 0x35, 0x31, 0xc8, 0x10, 0x80, 0xc3, 0x3b, 0x58, 0x50, 0xc8, 0x67, 0x90,
1882 0x21, 0x10, 0x87, 0x7a, 0x98, 0x25, 0x68, 0x83, 0xf1, 0x06, 0x7e, 0x38,
1883 0x89, 0x9c, 0xa0, 0x60, 0x8c, 0x37, 0xf8, 0x43, 0x4a, 0xcc, 0x04, 0x05,
1884 0x63, 0x90, 0x01, 0x5a, 0x07, 0x7d, 0x18, 0x6e, 0x20, 0x62, 0xc1, 0x99,
1885 0x65, 0x40, 0xa4, 0x60, 0x0c, 0x41, 0xfa, 0x89, 0xe1, 0x86, 0x60, 0x17,
1886 0x94, 0x59, 0x06, 0x25, 0x09, 0x4c, 0xe8, 0x05, 0xf9, 0xcc, 0x12, 0x2c,
1887 0x36, 0xfc, 0x02, 0x7c, 0x46, 0x0c, 0x08, 0x23, 0x60, 0x8b, 0xc0, 0x82,
1888 0x7b, 0x90, 0xcf, 0x88, 0x41, 0x61, 0x04, 0x6f, 0x11, 0xdc, 0xc3, 0x2c,
1889 0xc1, 0x32, 0x50, 0x01, 0x28, 0x89, 0xa0, 0xcc, 0x31, 0xd0, 0x43, 0x70,
1890 0x16, 0x63, 0x08, 0xdb, 0x59, 0x0c, 0x37, 0x04, 0xe4, 0xa0, 0xcc, 0x32,
1891 0x34, 0x4c, 0x60, 0x82, 0x39, 0xc8, 0x67, 0x96, 0xc0, 0xb1, 0x01, 0x1d,
1892 0xe0, 0x33, 0x62, 0x40, 0x18, 0x41, 0x5d, 0x04, 0x16, 0x80, 0x84, 0x7c,
1893 0x46, 0x0c, 0x0a, 0x23, 0xc0, 0x8b, 0x00, 0x24, 0x66, 0x09, 0x9c, 0x81,
1894 0x0a, 0x40, 0x61, 0x84, 0x66, 0x8e, 0x21, 0x09, 0xde, 0x62, 0x0c, 0x81,
1895 0x0c, 0xda, 0x62, 0xb8, 0x21, 0x68, 0x07, 0x65, 0x96, 0x01, 0x7a, 0x02,
1896 0x13, 0xde, 0x41, 0x3e, 0xb3, 0x04, 0x91, 0x0d, 0xf1, 0x00, 0x9f, 0x11,
1897 0x03, 0xc2, 0x08, 0xfc, 0x22, 0xb0, 0x20, 0x25, 0xe4, 0x33, 0x62, 0x50,
1898 0x18, 0x41, 0x68, 0x04, 0x29, 0x31, 0x4b, 0x10, 0x0d, 0x54, 0x00, 0xca,
1899 0x23, 0x40, 0x73, 0x0c, 0x49, 0x50, 0x17, 0xb3, 0x04, 0xd2, 0x40, 0x45,
1900 0x20, 0x44, 0x7a, 0x70, 0x0c, 0x32, 0x04, 0x29, 0x31, 0x13, 0x73, 0x0c,
1901 0x26, 0x01, 0x06, 0x7c, 0x31, 0xc8, 0x10, 0x9c, 0x84, 0x4d, 0xd8, 0x10,
1902 0xc8, 0x67, 0x90, 0x21, 0x48, 0x09, 0x9e, 0x98, 0x25, 0x68, 0x83, 0xe1,
1903 0x86, 0x59, 0x80, 0x89, 0x60, 0x96, 0x81, 0x02, 0x83, 0x60, 0x90, 0x81,
1904 0x0e, 0x5e, 0x22, 0x27, 0xc6, 0x1b, 0xca, 0x02, 0x2e, 0x44, 0x83, 0x82,
1905 0x31, 0xde, 0x70, 0x16, 0x72, 0xc1, 0x17, 0x14, 0x8c, 0x39, 0x06, 0x98,
1906 0x08, 0x4c, 0x63, 0x90, 0x21, 0x88, 0x09, 0xb0, 0xb0, 0xe0, 0x90, 0xcf,
1907 0x20, 0x43, 0x30, 0x13, 0x66, 0x31, 0xdc, 0x70, 0xf4, 0x83, 0x33, 0xcb,
1908 0xf0, 0x55, 0xc1, 0x18, 0xc2, 0xb0, 0x1a, 0xc3, 0x0d, 0x01, 0x48, 0x28,
1909 0xb3, 0x0c, 0x97, 0x15, 0x98, 0x20, 0x12, 0xf2, 0x99, 0x25, 0xc0, 0x46,
1910 0x0c, 0x08, 0x23, 0xb8, 0x8d, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0xdc, 0x08,
1911 0x4a, 0xc2, 0x82, 0x93, 0x90, 0x8f, 0x05, 0x29, 0x01, 0x9f, 0x59, 0x02,
1912 0x6c, 0xa0, 0x02, 0x50, 0x2c, 0xe1, 0x9a, 0x63, 0xd8, 0x89, 0x60, 0x36,
1913 0xc6, 0x10, 0x98, 0xd9, 0x18, 0x6e, 0x08, 0x52, 0x42, 0x99, 0x65, 0xd0,
1914 0xb2, 0xc0, 0x84, 0x95, 0x90, 0xcf, 0x2c, 0xc1, 0x36, 0x62, 0x40, 0x18,
1915 0x01, 0x78, 0x0c, 0x23, 0x06, 0x85, 0x11, 0x88, 0x47, 0xe0, 0x12, 0x16,
1916 0xc0, 0x84, 0x7c, 0x2c, 0x90, 0x09, 0xf8, 0xcc, 0x12, 0x6c, 0x03, 0x15,
1917 0x80, 0x92, 0x09, 0xda, 0x1c, 0x43, 0x12, 0xec, 0xc6, 0x18, 0x42, 0x95,
1918 0x1b, 0xc3, 0x0d, 0x81, 0x4c, 0x28, 0xb3, 0x0c, 0x1d, 0x17, 0x98, 0x40,
1919 0x13, 0xf2, 0x99, 0x25, 0xf0, 0x46, 0x0c, 0x08, 0x23, 0x48, 0x8f, 0x61,
1920 0xc4, 0xa0, 0x30, 0x82, 0xf5, 0x08, 0x6e, 0xc2, 0x82, 0x9c, 0x90, 0x8f,
1921 0x05, 0x3b, 0x01, 0x9f, 0x59, 0x02, 0x6f, 0xa0, 0x02, 0x50, 0x38, 0xa1,
1922 0x9b, 0x63, 0x48, 0x82, 0xf0, 0x18, 0x31, 0x30, 0x8c, 0x20, 0x3e, 0x82,
1923 0xb7, 0x68, 0x8b, 0x41, 0x86, 0x20, 0x2e, 0x48, 0x63, 0x96, 0xe0, 0x1b,
1924 0xa8, 0x08, 0xfc, 0x80, 0x12, 0xbc, 0x41, 0x86, 0xe0, 0x2e, 0x4c, 0x63,
1925 0x96, 0xa0, 0x0d, 0x66, 0x19, 0xc2, 0xa0, 0x0d, 0xf8, 0x61, 0x90, 0xa1,
1926 0x17, 0xf0, 0x42, 0x34, 0x46, 0x0c, 0x0a, 0x23, 0x98, 0x8f, 0x60, 0x2d,
1927 0xe6, 0x18, 0xe8, 0x22, 0x60, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xea, 0x63,
1928 0x60, 0x8b, 0x39, 0x06, 0x21, 0x68, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0xee,
1929 0xa3, 0x68, 0x8b, 0x39, 0x06, 0x21, 0x60, 0x8f, 0x41, 0x86, 0x60, 0x2f,
1930 0x5c, 0x63, 0x90, 0x21, 0x28, 0x07, 0xd8, 0x18, 0x6f, 0xb0, 0x8d, 0xf0,
1931 0x98, 0x0f, 0x0a, 0xc6, 0x78, 0x03, 0x6e, 0x8c, 0x47, 0x7b, 0x50, 0x30,
1932 0xe6, 0x18, 0x42, 0x23, 0xb8, 0x8f, 0x41, 0x86, 0x40, 0x34, 0x62, 0xc3,
1933 0x82, 0x44, 0x3e, 0x83, 0x0c, 0x01, 0x69, 0xdc, 0xc6, 0x70, 0xc3, 0xe1,
1934 0x16, 0xce, 0x2c, 0x03, 0x1b, 0x88, 0x41, 0x30, 0x86, 0x30, 0xf0, 0xc7,
1935 0x70, 0x43, 0x10, 0x17, 0xca, 0x2c, 0x03, 0x19, 0x8c, 0x41, 0x60, 0xc2,
1936 0x5c, 0xc8, 0x67, 0x96, 0xa0, 0x0c, 0x46, 0x0c, 0x08, 0x23, 0x40, 0x91,
1937 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x15, 0x09, 0xec, 0xc2, 0x02, 0xbc, 0x90,
1938 0x8f, 0x05, 0x7a, 0x01, 0x9f, 0x59, 0x82, 0x32, 0x18, 0xa8, 0x00, 0x94,
1939 0x31, 0x10, 0xc8, 0x60, 0x8e, 0x81, 0x35, 0x02, 0x12, 0x19, 0x43, 0x60,
1940 0x48, 0x64, 0xb8, 0x21, 0xd0, 0x0b, 0x65, 0x96, 0xe1, 0x0c, 0xcc, 0x20,
1941 0x30, 0x81, 0x2f, 0xe4, 0x33, 0x4b, 0x80, 0x06, 0x23, 0x06, 0x84, 0x11,
1942 0xc4, 0xc8, 0x30, 0x62, 0x50, 0x18, 0xc1, 0x8c, 0x04, 0x7f, 0x61, 0x41,
1943 0x68, 0xc8, 0xc7, 0x82, 0xd1, 0x80, 0xcf, 0x2c, 0x01, 0x1a, 0x0c, 0x54,
1944 0x00, 0x8a, 0x19, 0x08, 0x67, 0x30, 0xc7, 0x90, 0x04, 0x2c, 0x32, 0x86,
1945 0x50, 0xa9, 0xc8, 0x70, 0x43, 0x30, 0x1a, 0xca, 0x2c, 0x83, 0x1a, 0xa4,
1946 0x41, 0x60, 0x42, 0x69, 0xc8, 0x67, 0x96, 0x60, 0x0d, 0x46, 0x0c, 0x08,
1947 0x23, 0xd0, 0x91, 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x1e, 0x09, 0x50, 0xc3,
1948 0x02, 0xd5, 0x90, 0x8f, 0x05, 0xac, 0x01, 0x9f, 0x59, 0x82, 0x35, 0x18,
1949 0xa8, 0x00, 0x94, 0x34, 0x10, 0xd4, 0x60, 0x8e, 0x21, 0x09, 0x64, 0x64,
1950 0xc4, 0xc0, 0x30, 0x02, 0x31, 0x09, 0xc0, 0xc3, 0x37, 0x06, 0x19, 0x02,
1951 0xf1, 0xa8, 0x8f, 0x59, 0x02, 0x36, 0x18, 0xa8, 0x08, 0xfc, 0x20, 0x0c,
1952 0x84, 0x35, 0x18, 0x64, 0x08, 0xd0, 0xe3, 0x3e, 0x66, 0x09, 0xda, 0x60,
1953 0xa0, 0x25, 0xe0, 0x11, 0x83, 0x47, 0x24, 0x1e, 0xf9, 0x64, 0x81, 0x0d,
1954 0x78, 0x04, 0x0c, 0x06, 0x5a, 0x02, 0x14, 0x31, 0xf4, 0x42, 0x32, 0x87,
1955 0x8f, 0x60, 0x03, 0xd7, 0x01, 0x83, 0x41, 0x86, 0x40, 0xd8, 0x0f, 0x0b,
1956 0x46, 0x44, 0x3e, 0x19, 0x84, 0x03, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x00,
1957 0x00, 0xd7, 0xd2, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4,
1958 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d,
1959 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b,
1960 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71,
1961 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x1f, 0x00, 0x00,
1962 0x00, 0x5b, 0x0a, 0xe0, 0x98, 0x05, 0x04, 0x17, 0xb6, 0x14, 0xc1, 0x31,
1963 0x0b, 0x08, 0x2e, 0x6c, 0x29, 0x8a, 0x63, 0x16, 0x10, 0x5c, 0xd8, 0x52,
1964 0x24, 0x47, 0x2e, 0x20, 0xba, 0xb0, 0xa5, 0x70, 0x8e, 0x5c, 0x40, 0x74,
1965 0x61, 0x4b, 0x31, 0x1d, 0xb9, 0x80, 0xe8, 0xc2, 0x96, 0x02, 0x3b, 0x72,
1966 0x01, 0xd1, 0x85, 0x2d, 0xc3, 0x17, 0x88, 0xc3, 0x96, 0x81, 0x0c, 0x82,
1967 0x71, 0xd8, 0x32, 0xdc, 0x41, 0x40, 0x0e, 0x5b, 0x06, 0x3e, 0x08, 0xca,
1968 0x61, 0xcb, 0xe0, 0x07, 0x81, 0x39, 0x6c, 0x19, 0x4e, 0x21, 0x38, 0x87,
1969 0x2d, 0x03, 0x2b, 0x04, 0xe8, 0xb0, 0x65, 0x98, 0x85, 0x20, 0x1d, 0xb6,
1970 0x0c, 0xb5, 0x10, 0xa0, 0xc3, 0x96, 0x21, 0x25, 0x82, 0x74, 0xd8, 0x32,
1971 0xac, 0x44, 0x80, 0x0e, 0x5b, 0x86, 0xd3, 0x08, 0xd2, 0x61, 0xcb, 0x90,
1972 0x1a, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1973 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00,
1974 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0xcf, 0x41, 0x30, 0x0d, 0xe4, 0x06,
1975 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40, 0xe0, 0x0c, 0x00, 0x05,
1976 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0, 0xec, 0x19, 0xca, 0x1f,
1977 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce, 0xde, 0x58, 0x83, 0x5e,
1978 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf, 0xdb, 0xa7, 0xf4, 0xe8,
1979 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a, 0xc2, 0xe8, 0xee, 0xdd,
1980 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25,
1981 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f,
1982 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c,
1983 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2,
1984 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05, 0x33, 0x00, 0x04, 0x8c,
1985 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x46, 0x00, 0x82,
1986 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5, 0x02, 0x0d, 0x37, 0x50,
1987 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43, 0x43, 0xc5, 0xc1, 0x20,
1988 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64, 0x08, 0xa0, 0x6a, 0x96,
1989 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61, 0x48, 0x82, 0xe1, 0x86,
1990 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x0f,
1991 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4, 0xa0, 0x30, 0x82, 0x50,
1992 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11, 0x83, 0xc2, 0x08, 0x46,
1993 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83, 0x59, 0x82, 0x62, 0xa0,
1994 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc, 0x60, 0x0c, 0x41, 0xf0,
1995 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a, 0x23, 0x38, 0x05, 0x21,
1996 0x18, 0x31, 0x28, 0x8c, 0x00, 0x15, 0x88, 0x60, 0xb8, 0x21, 0xb8, 0x84,
1997 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c, 0x0c, 0x6c, 0x40, 0x03,
1998 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90, 0x8f, 0x05, 0x1a, 0x7c,
1999 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81, 0x2a, 0x0c, 0x32, 0x04,
2000 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64, 0x08, 0xd2, 0xc0, 0x0d,
2001 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4, 0xa0, 0x98, 0x65, 0x40,
2002 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18, 0x31, 0x28, 0x8c, 0x00,
2003 0x17, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20, 0x16, 0x46, 0x0c, 0x0a,
2004 0x23, 0xd0, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84, 0x40, 0x16, 0x46, 0x0c,
2005 0x0a, 0x23, 0xe0, 0x85, 0x42, 0x0d, 0xe6, 0x18, 0x84, 0x20, 0x16, 0x66,
2006 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57, 0x10, 0x04, 0x04, 0x3a,
2007 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
2008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2009 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
2010 0x00, 0x1c, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0,
2011 0xde, 0x21, 0x0c, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x0b, 0x82, 0x20,
2012 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
2013 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
2014 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45,
2015 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
2016 0x49, 0x0a, 0x32, 0x44, 0x24, 0x48, 0x0a, 0x90, 0x21, 0x23, 0xc4, 0x52,
2017 0x80, 0x0c, 0x19, 0x21, 0x72, 0x24, 0x07, 0xc8, 0x88, 0x11, 0x62, 0xa8,
2018 0xa0, 0xa8, 0x40, 0xc6, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x51, 0x18, 0x00,
2019 0x00, 0xf7, 0x00, 0x00, 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff,
2020 0xff, 0x01, 0x60, 0x00, 0x09, 0xa8, 0x88, 0x70, 0x80, 0x07, 0x78, 0x90,
2021 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0x68,
2022 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00,
2023 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xa2, 0x1d, 0xd2, 0xc1, 0x1d,
2024 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2, 0x81, 0x1d, 0xda, 0xc0, 0x1e,
2025 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0xa1, 0x0d, 0xee, 0x21, 0x1d,
2026 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03, 0x39, 0xc0, 0x03, 0x60, 0x70,
2027 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87, 0x74, 0x60, 0x07, 0x7a, 0x48,
2028 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x73, 0x90,
2029 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03, 0x78, 0x78, 0x87, 0x74, 0x70,
2030 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83, 0x72, 0x60, 0x87, 0x74, 0x68,
2031 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
2032 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e,
2033 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c,
2034 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc, 0xe1, 0x1d, 0xdc, 0xa1, 0x0d,
2035 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28,
2036 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x74, 0x70, 0x07, 0x73, 0x98,
2037 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40,
2038 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d,
2039 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e,
2040 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8,
2041 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x98, 0x87, 0x74, 0x38,
2042 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03, 0x7d, 0x28, 0x07, 0x79, 0x78,
2043 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0,
2044 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d,
2045 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0x01, 0x1e, 0xe0, 0x21, 0x1d,
2046 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0,
2047 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88, 0x79, 0xa0, 0x87, 0x70, 0x18,
2048 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87, 0x77, 0xa0, 0x87, 0x72, 0x18,
2049 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03, 0x71, 0xa8, 0x07, 0x73, 0x30,
2050 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87, 0x74, 0xd0, 0x87, 0x72, 0x00,
2051 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6, 0x21, 0x1c, 0xcc, 0xa1, 0x1c,
2052 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d,
2053 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x60, 0xc3, 0x26, 0x10, 0xc0,
2054 0x02, 0x54, 0x43, 0x38, 0xa4, 0x83, 0x3c, 0xb4, 0x81, 0x38, 0xd4, 0x83,
2055 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb4, 0x41,
2056 0x38, 0xb0, 0x43, 0x3a, 0x84, 0xc3, 0x3c, 0x00, 0x1b, 0xb6, 0xa1, 0x00,
2057 0x16, 0xa0, 0x1a, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e,
2058 0xcc, 0xc1, 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d,
2059 0xc2, 0x81, 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0xd8, 0x60, 0x10, 0x08,
2060 0xb0, 0x00, 0xd5, 0x06, 0xa3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90,
2061 0x00, 0x6a, 0x83, 0x8f, 0x18, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12,
2062 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d,
2063 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d,
2064 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43,
2065 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3,
2066 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3,
2067 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03,
2068 0x90, 0x07, 0x76, 0x00, 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5,
2069 0x90, 0x0e, 0xec, 0x40, 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee,
2070 0xf0, 0x0e, 0x6d, 0x60, 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d,
2071 0x00, 0x0f, 0xef, 0x90, 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d,
2072 0x50, 0x0e, 0xec, 0x90, 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43,
2073 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43,
2074 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43,
2075 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81,
2076 0x3b, 0xbc, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03,
2077 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d,
2078 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d,
2079 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43,
2080 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3,
2081 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03,
2082 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef,
2083 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d,
2084 0xa0, 0x0f, 0xe5, 0x20, 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0,
2085 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43,
2086 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43,
2087 0x38, 0xc0, 0x03, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43,
2088 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00,
2089 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2,
2090 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d,
2091 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3,
2092 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3,
2093 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41,
2094 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5,
2095 0x00, 0x6c, 0x40, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x90,
2096 0x80, 0x6a, 0x83, 0x81, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x44, 0x00,
2097 0x16, 0xa0, 0xda, 0x80, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x0c,
2098 0x20, 0x01, 0xd5, 0x06, 0x63, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90,
2099 0x00, 0x6a, 0xc3, 0xc4, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x28, 0x80,
2100 0x34, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03,
2101 0x3d, 0xa4, 0x83, 0x3b, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
2102 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x41,
2103 0x31, 0x21, 0x30, 0x26, 0x0c, 0x07, 0x92, 0x4c, 0x18, 0x14, 0x24, 0x99,
2104 0x10, 0x2c, 0x13, 0x02, 0x06, 0x89, 0x20, 0x00, 0x00, 0x43, 0x00, 0x00,
2105 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4,
2106 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c,
2107 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xb8, 0xc1, 0x0c, 0xc0, 0x30, 0x02,
2108 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3,
2109 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10,
2110 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18,
2111 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6,
2112 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4,
2113 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50,
2114 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21,
2115 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29,
2116 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1,
2117 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8, 0x48, 0x9a, 0x22, 0x4a,
2118 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f, 0x1a, 0x23, 0x00,
2119 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44, 0xb2, 0x2c, 0x0d,
2120 0x39, 0x85, 0x28, 0x8a, 0xa2, 0x20, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x54,
2121 0x04, 0x00, 0x20, 0xaa, 0x0c, 0x40, 0x51, 0x90, 0x55, 0x8c, 0xa2, 0x00,
2122 0x00, 0x00, 0x20, 0xac, 0x0c, 0x45, 0x51, 0x90, 0x56, 0x84, 0xa2, 0x20,
2123 0x6e, 0x8e, 0x20, 0x98, 0x23, 0x00, 0x83, 0x61, 0x04, 0xe1, 0x2b, 0x48,
2124 0xb0, 0x34, 0x82, 0x07, 0x7a, 0x00, 0x85, 0x03, 0x01, 0x29, 0xf0, 0xcd,
2125 0x11, 0x80, 0xc2, 0x20, 0x02, 0x20, 0x4c, 0x01, 0x8c, 0x00, 0x0c, 0x23,
2126 0x0c, 0xdf, 0x20, 0x42, 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21,
2127 0x0c, 0x23, 0x10, 0x1f, 0x00, 0x13, 0xa8, 0x70, 0x48, 0x07, 0x79, 0xb0,
2128 0x03, 0x3a, 0x68, 0x83, 0x70, 0x80, 0x07, 0x78, 0x60, 0x87, 0x72, 0x68,
2129 0x83, 0x74, 0x78, 0x87, 0x79, 0xc8, 0x03, 0x37, 0x80, 0x03, 0x37, 0x80,
2130 0x83, 0x0d, 0xb7, 0x51, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x60, 0x07, 0x74,
2131 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe9,
2132 0x10, 0x07, 0x7a, 0x80, 0x07, 0x7a, 0x80, 0x07, 0x6d, 0x90, 0x0e, 0x78,
2133 0xa0, 0x07, 0x78, 0xa0, 0x07, 0x78, 0xd0, 0x06, 0xe9, 0x10, 0x07, 0x76,
2134 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xd0, 0x06, 0xe9,
2135 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72,
2136 0xd0, 0x06, 0xe9, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a,
2137 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
2138 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74,
2139 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6,
2140 0x10, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x10, 0x07, 0x76,
2141 0xd0, 0x06, 0xf6, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x7a,
2142 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73,
2143 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xf6, 0x40, 0x07, 0x78,
2144 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xf6,
2145 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74,
2146 0xd0, 0x06, 0xf6, 0x90, 0x07, 0x76, 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78,
2147 0xa0, 0x07, 0x71, 0x20, 0x07, 0x78, 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x72,
2148 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x72,
2149 0x80, 0x07, 0x6d, 0x60, 0x0f, 0x71, 0x90, 0x07, 0x72, 0xa0, 0x07, 0x72,
2150 0x50, 0x07, 0x76, 0xa0, 0x07, 0x72, 0x50, 0x07, 0x76, 0xd0, 0x06, 0xf6,
2151 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a, 0x20, 0x07, 0x75, 0x60, 0x07, 0x7a,
2152 0x20, 0x07, 0x75, 0x60, 0x07, 0x6d, 0x60, 0x0f, 0x75, 0x10, 0x07, 0x72,
2153 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72, 0xa0, 0x07, 0x75, 0x10, 0x07, 0x72,
2154 0xd0, 0x06, 0xf6, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74, 0xa0, 0x07, 0x71,
2155 0x00, 0x07, 0x72, 0x40, 0x07, 0x7a, 0x10, 0x07, 0x70, 0x20, 0x07, 0x74,
2156 0xd0, 0x06, 0xee, 0x80, 0x07, 0x7a, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73,
2157 0x20, 0x07, 0x43, 0x98, 0x07, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
2158 0x80, 0x21, 0x4c, 0x04, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
2159 0x10, 0x66, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08,
2160 0x53, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x84, 0xb9,
2161 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc2, 0x64, 0x08,
2162 0x30, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x61, 0x26, 0x20, 0x00,
2163 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x30, 0x1b, 0x10, 0x00, 0x02,
2164 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x98, 0x0e, 0x08, 0x00, 0x01, 0x00,
2165 0x00, 0x00, 0x00, 0x80, 0x21, 0xcc, 0x06, 0x04, 0x80, 0x00, 0x00, 0x00,
2166 0x00, 0x00, 0xc0, 0x10, 0x46, 0x0c, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00,
2167 0x00, 0x00, 0xc8, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
2168 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
2169 0xfa, 0x46, 0x00, 0x4a, 0xa0, 0x10, 0x0a, 0xa4, 0x08, 0x0a, 0xa2, 0x80,
2170 0x0a, 0x30, 0xa0, 0x0c, 0x0a, 0xa3, 0x50, 0x0a, 0xa6, 0x70, 0x0a, 0xac,
2171 0x14, 0x8a, 0xa1, 0x1c, 0xa8, 0x2c, 0x9c, 0x11, 0x80, 0x42, 0x28, 0x88,
2172 0xc2, 0x28, 0x90, 0x42, 0x29, 0x18, 0x22, 0xc7, 0x12, 0x24, 0x01, 0x00,
2173 0x00, 0x79, 0x18, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0x1a, 0x03, 0x4c,
2174 0x10, 0x97, 0x29, 0xa2, 0x25, 0x10, 0xab, 0x32, 0xb9, 0xb9, 0xb4, 0x37,
2175 0xb7, 0x21, 0xc6, 0xf7, 0x8c, 0x01, 0x40, 0x06, 0x64, 0x40, 0xe5, 0x6e,
2176 0x0c, 0x2d, 0x4c, 0xee, 0x6b, 0x2e, 0x4d, 0xaf, 0x6c, 0x88, 0xf1, 0x31,
2177 0x63, 0x20, 0x7c, 0x0d, 0xe3, 0x20, 0x08, 0x0e, 0x8e, 0xad, 0x0c, 0xa4,
2178 0xad, 0x8c, 0x2e, 0x8c, 0x0d, 0xc4, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd,
2179 0x0d, 0x64, 0x46, 0x06, 0x46, 0x66, 0xc6, 0x85, 0x06, 0x86, 0x06, 0x04,
2180 0xa5, 0xad, 0x8c, 0x2e, 0x8c, 0xcd, 0xac, 0xac, 0x65, 0x46, 0x06, 0x46,
2181 0x66, 0xc6, 0x85, 0x06, 0x86, 0x26, 0x65, 0x88, 0x30, 0x06, 0xc4, 0x10,
2182 0xe3, 0x63, 0x3e, 0xe8, 0x5b, 0x58, 0x34, 0x95, 0xd1, 0x85, 0xb1, 0x0d,
2183 0x41, 0xc6, 0xe0, 0xf8, 0x98, 0x8f, 0xf9, 0x16, 0x6e, 0x61, 0x69, 0x72,
2184 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e,
2185 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
2186 0x43, 0x84, 0x31, 0x48, 0xc8, 0x85, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5,
2187 0xc1, 0xa5, 0xb1, 0x95, 0xb9, 0x98, 0x85, 0xcd, 0xd1, 0x7d, 0xb5, 0x85,
2188 0xd1, 0xa1, 0x7d, 0x95, 0xb9, 0x85, 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6,
2189 0x60, 0x21, 0x19, 0x84, 0xa5, 0xc9, 0xb9, 0x8c, 0xbd, 0xb5, 0xc1, 0xa5,
2190 0xb1, 0x95, 0xb9, 0x98, 0xc9, 0x85, 0xb5, 0x95, 0x89, 0xd5, 0x99, 0x99,
2191 0x95, 0xc9, 0x7d, 0x99, 0x95, 0xd1, 0x8d, 0xa1, 0x7d, 0x95, 0xb9, 0x85,
2192 0x89, 0xb1, 0x95, 0x0d, 0x11, 0xc6, 0xa0, 0x61, 0x14, 0x96, 0x26, 0xe7,
2193 0x22, 0x57, 0xe6, 0x46, 0x56, 0x26, 0xf7, 0x45, 0x17, 0x26, 0x77, 0x56,
2194 0x46, 0xc7, 0x28, 0x2c, 0x4d, 0xce, 0x25, 0x4c, 0xee, 0xec, 0x8b, 0x2e,
2195 0x0f, 0xae, 0xec, 0xcb, 0x2d, 0xac, 0xad, 0x8c, 0x86, 0x19, 0xdb, 0x5b,
2196 0x18, 0x1d, 0xcd, 0x10, 0x64, 0x0c, 0x9e, 0x6f, 0x19, 0x03, 0x68, 0x0c,
2197 0xa2, 0x21, 0xc2, 0x18, 0x48, 0x64, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xde,
2198 0xe6, 0xd2, 0xe8, 0xd2, 0xde, 0xdc, 0xa8, 0x84, 0xa5, 0xc9, 0xb9, 0x8c,
2199 0x95, 0xb9, 0xd1, 0x95, 0xc9, 0x51, 0x0a, 0x4b, 0x93, 0x73, 0x71, 0x7b,
2200 0xfb, 0x82, 0x2b, 0x93, 0x9b, 0x83, 0x2b, 0x1b, 0xa3, 0x4b, 0xb3, 0x2b,
2201 0x23, 0x13, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0xe5, 0x16, 0xd6,
2202 0x56, 0x46, 0x04, 0xee, 0x6d, 0x2e, 0x8d, 0x2e, 0xed, 0xcd, 0x6d, 0x08,
2203 0xf4, 0x2d, 0x63, 0x40, 0x8d, 0x41, 0x35, 0x06, 0xd6, 0x18, 0x40, 0x63,
2204 0x10, 0x8d, 0xc1, 0x35, 0x06, 0x18, 0xa5, 0xb0, 0x34, 0x39, 0x17, 0x33,
2205 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0xaf, 0x34, 0x37, 0xb8, 0x3a,
2206 0x3a, 0x5a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28,
2207 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29,
2208 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe0, 0xca, 0xe4, 0xe6, 0xe0, 0xca, 0xc6,
2209 0xe8, 0xd2, 0xec, 0xca, 0x58, 0x8c, 0xbd, 0xb1, 0xbd, 0xc9, 0x0d, 0x91,
2210 0x3e, 0x66, 0x0c, 0xb4, 0x31, 0xd8, 0xc6, 0xa0, 0x1a, 0x03, 0x6e, 0x0c,
2211 0xa0, 0x31, 0x88, 0xc6, 0xe0, 0x1a, 0x83, 0x8e, 0xd9, 0x59, 0x99, 0x5b,
2212 0x99, 0x5c, 0x18, 0x5d, 0x19, 0x19, 0x0a, 0x0e, 0x5d, 0x19, 0xde, 0xd8,
2213 0xdb, 0x9b, 0x1c, 0x19, 0x91, 0x9d, 0xcc, 0x97, 0x59, 0x0a, 0x0d, 0x33,
2214 0xb6, 0xb7, 0x30, 0x3a, 0x19, 0x22, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f,
2215 0x72, 0x64, 0x43, 0xa4, 0xef, 0x19, 0x03, 0x6d, 0x0c, 0xbe, 0x31, 0xa8,
2216 0xc6, 0x80, 0x1b, 0x03, 0x68, 0x0c, 0xc0, 0x60, 0x0c, 0xae, 0x31, 0x08,
2217 0x03, 0x2a, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
2218 0x7c, 0xc2, 0xd2, 0xe4, 0x5c, 0xc4, 0xea, 0xcc, 0xcc, 0xca, 0xe4, 0xbe,
2219 0xe6, 0xd2, 0xf4, 0xca, 0x28, 0x85, 0xa5, 0xc9, 0xb9, 0xb0, 0xbd, 0x8d,
2220 0x85, 0xd1, 0xa5, 0xbd, 0xb9, 0x7d, 0xa5, 0xb9, 0x91, 0x95, 0xe1, 0x11,
2221 0x09, 0x4b, 0x93, 0x73, 0x91, 0x2b, 0x0b, 0x23, 0x23, 0x15, 0x96, 0x26,
2222 0xe7, 0x32, 0x47, 0x27, 0x57, 0x37, 0x46, 0xf7, 0x45, 0x97, 0x07, 0x57,
2223 0xf6, 0x95, 0xe6, 0x66, 0xf6, 0xc6, 0xc2, 0x8c, 0xed, 0x2d, 0x8c, 0x8e,
2224 0xcc, 0xdc, 0x98, 0xd4, 0x91, 0xd0, 0xd7, 0x5b, 0x1d, 0x1d, 0x5c, 0x1d,
2225 0x1d, 0x19, 0xba, 0x32, 0x3c, 0xba, 0x3a, 0xb9, 0xb2, 0x2f, 0xba, 0x3c,
2226 0xb8, 0x32, 0x2a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70,
2227 0x65, 0x5c, 0xc6, 0xde, 0xd8, 0xde, 0xe4, 0xbe, 0xe6, 0xc6, 0xc2, 0xd8,
2228 0xca, 0xe8, 0xd0, 0xbd, 0xb9, 0x95, 0xb5, 0x85, 0xc1, 0x7d, 0xb5, 0x95,
2229 0xd1, 0xa1, 0xbd, 0x91, 0xf1, 0xa1, 0x7b, 0x73, 0x2b, 0x6b, 0x0b, 0x83,
2230 0xfb, 0x32, 0x0b, 0x1b, 0xa3, 0x7b, 0x93, 0x8b, 0xe1, 0x43, 0xf7, 0xe6,
2231 0x56, 0xd6, 0x16, 0x06, 0xf7, 0x65, 0x16, 0x36, 0x46, 0xf7, 0x26, 0x27,
2232 0xc3, 0x67, 0x8e, 0x4c, 0xee, 0xeb, 0x0e, 0x2d, 0x8d, 0xae, 0xec, 0x0b,
2233 0xee, 0x2d, 0xcd, 0x8d, 0x6e, 0x08, 0x2c, 0x7c, 0xcb, 0xd7, 0x7c, 0xcb,
2234 0x18, 0xa0, 0xc1, 0x18, 0xa4, 0xc1, 0xd7, 0x7c, 0xcd, 0xb7, 0x8c, 0x01,
2235 0x1a, 0x8c, 0x81, 0x1a, 0x7c, 0xd0, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1,
2236 0x18, 0xac, 0xc1, 0x47, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01,
2237 0x1b, 0x7c, 0xce, 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xb4, 0xc1,
2238 0x57, 0x7d, 0xcd, 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x81, 0x1b, 0x7c, 0xd6,
2239 0xd7, 0x7c, 0xcb, 0x18, 0xa0, 0xc1, 0x18, 0xbc, 0xc1, 0x77, 0x7d, 0xcd,
2240 0xb7, 0x8c, 0x01, 0x1a, 0x8c, 0x01, 0x1c, 0x30, 0x0a, 0x4b, 0x93, 0x73,
2241 0x09, 0x93, 0x3b, 0xfb, 0xa2, 0xcb, 0x83, 0x2b, 0xfb, 0x9a, 0x4b, 0xd3,
2242 0x2b, 0xe3, 0x15, 0x96, 0x26, 0xe7, 0x12, 0x26, 0x77, 0xf6, 0x45, 0x97,
2243 0x07, 0x57, 0xf6, 0x15, 0xc6, 0x96, 0x76, 0xe6, 0xf6, 0x35, 0x97, 0xa6,
2244 0x57, 0xc6, 0x67, 0x0a, 0x2d, 0x8c, 0xac, 0x4c, 0x6e, 0xe8, 0xcd, 0x6d,
2245 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x8e, 0xc1, 0xd8, 0x10, 0x32, 0xf8, 0xa6,
2246 0x31, 0x18, 0x83, 0x31, 0x20, 0x83, 0x2f, 0x1a, 0x83, 0x32, 0xf8, 0x96,
2247 0x8f, 0x19, 0x03, 0x33, 0x18, 0x83, 0x33, 0x18, 0x83, 0x38, 0x18, 0x03,
2248 0x39, 0xf8, 0xa2, 0x31, 0x98, 0x83, 0xaf, 0x19, 0x03, 0x68, 0x0c, 0xe8,
2249 0x60, 0x0c, 0xae, 0x31, 0xa8, 0x03, 0x1a, 0x66, 0x6c, 0x6f, 0x61, 0x74,
2250 0x33, 0x34, 0xde, 0xcc, 0xcc, 0xe6, 0xca, 0xe8, 0x88, 0x98, 0xb1, 0xbd,
2251 0x85, 0xd1, 0xcd, 0xe0, 0xcd, 0xd0, 0x68, 0x0b, 0xa3, 0x93, 0x4b, 0xc3,
2252 0x1b, 0x42, 0x7d, 0xcb, 0xe7, 0x7c, 0xcb, 0x18, 0xdc, 0xc1, 0x18, 0xe0,
2253 0xc1, 0xe7, 0x7c, 0xd8, 0xb7, 0x8c, 0x41, 0x1e, 0x8c, 0x81, 0x1e, 0x30,
2254 0xc9, 0xaa, 0xb2, 0x22, 0x2a, 0x1b, 0x7b, 0x23, 0x2b, 0xa3, 0x41, 0x56,
2255 0x36, 0xf6, 0x46, 0x56, 0x36, 0x84, 0x0c, 0xbe, 0x66, 0x0c, 0xc6, 0x60,
2256 0x0c, 0xc8, 0xe0, 0x93, 0xc6, 0xa0, 0x0c, 0x3e, 0xe6, 0x63, 0xc6, 0xc0,
2257 0x0c, 0xc6, 0xe0, 0x0c, 0xc6, 0x60, 0x0f, 0xc6, 0x40, 0x0e, 0x3e, 0x69,
2258 0x0c, 0xe6, 0xe0, 0x73, 0xc6, 0x00, 0x1a, 0x03, 0x3e, 0x18, 0x83, 0x6b,
2259 0x0c, 0xfa, 0x80, 0x4b, 0x58, 0x9a, 0x9c, 0x0b, 0x5d, 0x19, 0x1e, 0x5d,
2260 0x9d, 0x5c, 0x19, 0x95, 0xb0, 0x34, 0x39, 0x97, 0xb9, 0xb0, 0x36, 0x38,
2261 0xb6, 0x32, 0x62, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64,
2262 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70,
2263 0x6c, 0x65, 0x3e, 0x24, 0xe8, 0xca, 0xf0, 0xb2, 0x86, 0x50, 0x5f, 0x36,
2264 0x06, 0x7f, 0x30, 0x06, 0x65, 0xf0, 0x2d, 0x1f, 0x33, 0x06, 0xa0, 0x30,
2265 0x06, 0xd0, 0x18, 0x84, 0xc2, 0x18, 0x5c, 0x63, 0x20, 0x0a, 0x2c, 0xe8,
2266 0xca, 0xf0, 0xaa, 0xac, 0x86, 0x50, 0x9f, 0x36, 0x06, 0x7f, 0x30, 0x06,
2267 0x65, 0xf0, 0x31, 0x1f, 0x33, 0x06, 0xa0, 0x30, 0x06, 0xd0, 0x18, 0x84,
2268 0xc2, 0x18, 0x5c, 0x63, 0x40, 0x0a, 0x5c, 0xc2, 0xd2, 0xe4, 0x5c, 0xe6,
2269 0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x78, 0xcc, 0x85, 0xb5, 0xc1, 0xb1,
2270 0x95, 0xc9, 0x31, 0x98, 0x1b, 0x22, 0x7d, 0xdb, 0x18, 0x98, 0xc2, 0x18,
2271 0x94, 0xc1, 0xb7, 0x7c, 0xcc, 0x18, 0x40, 0x63, 0x70, 0x0a, 0x63, 0x70,
2272 0x8d, 0x01, 0x2a, 0x0c, 0x81, 0xc6, 0x20, 0x1b, 0x03, 0x6f, 0x0c, 0xc4,
2273 0x60, 0x0c, 0xec, 0x60, 0x0c, 0xfc, 0x60, 0x0c, 0x46, 0x61, 0x0c, 0x4a,
2274 0x61, 0x0c, 0x52, 0x61, 0x88, 0xf1, 0x00, 0x63, 0x30, 0x8d, 0x81, 0x2a,
2275 0xb0, 0xfa, 0xd2, 0xa2, 0x9a, 0x8a, 0xa9, 0x99, 0x42, 0x0b, 0x23, 0x2b,
2276 0x93, 0x1b, 0x7a, 0x73, 0x9b, 0xa3, 0x0b, 0x73, 0xa3, 0x9b, 0xe3, 0xf3,
2277 0xd6, 0xe6, 0x96, 0x06, 0xf7, 0x46, 0x57, 0xe6, 0x46, 0x07, 0x32, 0x86,
2278 0x16, 0x26, 0xc7, 0x67, 0x2a, 0xad, 0x0d, 0x8e, 0xad, 0x0c, 0x64, 0x68,
2279 0x65, 0x05, 0x84, 0x4a, 0x28, 0x28, 0x68, 0x88, 0x30, 0x06, 0xae, 0x30,
2280 0xc4, 0x18, 0x83, 0x56, 0x18, 0x83, 0x57, 0x28, 0x83, 0x6e, 0x88, 0x31,
2281 0x06, 0x68, 0x30, 0x06, 0xb0, 0x50, 0x06, 0xdd, 0x10, 0x31, 0x18, 0x03,
2282 0x56, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6e, 0x0c, 0x62, 0xa1, 0x0c, 0xbc,
2283 0x31, 0x88, 0x85, 0x32, 0xf8, 0xc6, 0x20, 0x16, 0xca, 0x00, 0x0c, 0xc6,
2284 0x20, 0x16, 0xca, 0x20, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x40, 0x0c, 0xc6,
2285 0x20, 0x16, 0xca, 0x60, 0x0c, 0xc6, 0x20, 0x16, 0xca, 0x80, 0x1b, 0x62,
2286 0x8c, 0x81, 0x2c, 0x8c, 0x41, 0x2c, 0x94, 0x81, 0xc7, 0x31, 0x08, 0x4b,
2287 0x93, 0x6b, 0x09, 0x63, 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83,
2288 0x2b, 0x9b, 0x43, 0x99, 0x22, 0x62, 0xfa, 0x72, 0xb2, 0x8a, 0x91, 0xf9,
2289 0x32, 0x93, 0x0b, 0x3b, 0x6b, 0x2b, 0x73, 0xa3, 0x4b, 0x19, 0x42, 0x8c,
2290 0x41, 0x2d, 0x8c, 0x01, 0x2d, 0xd0, 0x0a, 0x4b, 0x93, 0x6b, 0x09, 0x63,
2291 0x4b, 0x0b, 0x9b, 0x6b, 0x99, 0x1b, 0x7b, 0x83, 0x2b, 0x6b, 0x09, 0x93,
2292 0x3b, 0x43, 0x99, 0x49, 0x19, 0x62, 0x8c, 0xc1, 0x2d, 0x8c, 0x41, 0x2d,
2293 0x8c, 0x81, 0x2d, 0x0c, 0x11, 0xc6, 0xe0, 0x16, 0x68, 0x85, 0xa5, 0xc9,
2294 0xb5, 0x84, 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95,
2295 0xb5, 0x84, 0xc9, 0x9d, 0xa1, 0xd0, 0xa4, 0x0c, 0x31, 0xc6, 0x40, 0x17,
2296 0xc6, 0xa0, 0x16, 0xc6, 0x20, 0x17, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84,
2297 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xd0,
2298 0x95, 0xe1, 0xd1, 0xd5, 0xc9, 0x95, 0xcd, 0x0d, 0x31, 0xc6, 0x80, 0x17,
2299 0xc6, 0xa0, 0x16, 0xc6, 0x60, 0x17, 0x88, 0x85, 0xa5, 0xc9, 0xb5, 0x84,
2300 0xb1, 0xa5, 0x85, 0xcd, 0xb5, 0xcc, 0x8d, 0xbd, 0xc1, 0x95, 0xb5, 0xcc,
2301 0x85, 0xb5, 0xc1, 0xb1, 0x95, 0xc9, 0xcd, 0x0d, 0x31, 0xc6, 0xc0, 0x17,
2302 0xc6, 0xa0, 0x16, 0xc6, 0xa0, 0x17, 0x86, 0x18, 0x63, 0xa0, 0x0b, 0x63,
2303 0xc0, 0x0b, 0x63, 0xe0, 0x0b, 0x43, 0x88, 0x31, 0xe0, 0x85, 0x31, 0xf0,
2304 0x85, 0x21, 0xc4, 0x18, 0xdc, 0xc2, 0x18, 0xe8, 0xc2, 0x10, 0x61, 0x0c,
2305 0x74, 0x61, 0x88, 0x31, 0x06, 0xb7, 0x30, 0x06, 0xbc, 0x30, 0x06, 0xbe,
2306 0x30, 0xc4, 0x18, 0x03, 0x59, 0x18, 0x83, 0x58, 0x28, 0x83, 0x6f, 0x88,
2307 0x31, 0x06, 0xb2, 0x30, 0x06, 0xb1, 0x50, 0x06, 0xdc, 0x10, 0x63, 0x0c,
2308 0x64, 0x61, 0x0c, 0x62, 0xa1, 0x0c, 0xc2, 0x60, 0x88, 0x31, 0x06, 0xb2,
2309 0x30, 0x06, 0xb1, 0x50, 0x06, 0x62, 0x30, 0xc4, 0x18, 0x03, 0x59, 0x18,
2310 0x83, 0x58, 0x28, 0x83, 0x31, 0x18, 0x62, 0x8c, 0x81, 0x2c, 0x8c, 0x41,
2311 0x2c, 0x94, 0x01, 0x18, 0x0c, 0x31, 0xc6, 0x40, 0x16, 0xc6, 0x20, 0x16,
2312 0xca, 0xa0, 0x1b, 0x11, 0xb1, 0x03, 0x3b, 0xd8, 0x43, 0x3b, 0xb8, 0x41,
2313 0x3b, 0xbc, 0x03, 0x39, 0xd4, 0x03, 0x3b, 0x94, 0x83, 0x1b, 0x98, 0x03,
2314 0x3b, 0x84, 0xc3, 0x39, 0xcc, 0xc3, 0x14, 0x21, 0x18, 0x46, 0x28, 0xec,
2315 0xc0, 0x0e, 0xf6, 0xd0, 0x0e, 0x6e, 0x90, 0x0e, 0xe4, 0x50, 0x0e, 0xee,
2316 0x40, 0x0f, 0x53, 0x82, 0x62, 0xc4, 0x12, 0x0e, 0xe9, 0x20, 0x0f, 0x6e,
2317 0x60, 0x0f, 0xe5, 0x20, 0x0f, 0xf3, 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0x53,
2318 0x02, 0x63, 0x04, 0x15, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0xc0, 0x0e, 0xe1,
2319 0xe0, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x70, 0x0e, 0xe5, 0xf0, 0x0b, 0xf6,
2320 0x50, 0x0e, 0xf2, 0x30, 0x0f, 0xe9, 0xf0, 0x0e, 0xee, 0x30, 0x25, 0x40,
2321 0x46, 0x4c, 0xe1, 0x90, 0x0e, 0xf2, 0xe0, 0x06, 0xe3, 0xf0, 0x0e, 0xed,
2322 0x00, 0x0f, 0xe9, 0xc0, 0x0e, 0xe5, 0xf0, 0x0b, 0xef, 0x00, 0x0f, 0xf4,
2323 0x90, 0x0e, 0xef, 0xe0, 0x0e, 0xf3, 0x30, 0x65, 0x50, 0x18, 0x67, 0x04,
2324 0x13, 0x0e, 0xe9, 0x20, 0x0f, 0x6e, 0x60, 0x0e, 0xf2, 0x10, 0x0e, 0xe7,
2325 0xd0, 0x0e, 0xe5, 0xe0, 0x0e, 0xf4, 0x30, 0x25, 0x58, 0x05, 0x00, 0x00,
2326 0x00, 0x79, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
2327 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
2328 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
2329 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
2330 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
2331 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
2332 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
2333 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
2334 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
2335 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
2336 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
2337 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
2338 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
2339 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
2340 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
2341 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
2342 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
2343 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
2344 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
2345 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
2346 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
2347 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
2348 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70,
2349 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74,
2350 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f,
2351 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e,
2352 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41,
2353 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1,
2354 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c,
2355 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37,
2356 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f,
2357 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21,
2358 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21,
2359 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0,
2360 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88,
2361 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77,
2362 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c,
2363 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23,
2364 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01,
2365 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84,
2366 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8,
2367 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76,
2368 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e,
2369 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f,
2370 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e,
2371 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e,
2372 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1,
2373 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21,
2374 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8,
2375 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77,
2376 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19,
2377 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e,
2378 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30,
2379 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71,
2380 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77,
2381 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
2382 0x00, 0x2e, 0x00, 0x00, 0x00, 0x56, 0x90, 0xfd, 0x73, 0x6d, 0x6b, 0xcf,
2383 0xb3, 0x60, 0xad, 0xd3, 0x10, 0x0c, 0xf0, 0x74, 0xd5, 0xfd, 0x17, 0x45,
2384 0x51, 0x14, 0x76, 0x20, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x8f,
2385 0x63, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x11, 0x34, 0x00, 0x12, 0xf9, 0x83,
2386 0x33, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x29, 0x6c, 0x00, 0x12, 0xf9, 0x12,
2387 0xc0, 0x3c, 0x0b, 0xf1, 0x4f, 0xc4, 0x35, 0x51, 0x11, 0xf1, 0xdb, 0x83,
2388 0x5f, 0xe1, 0xc5, 0x6d, 0x1b, 0xc2, 0x04, 0x20, 0x91, 0x5f, 0x00, 0xd2,
2389 0xf4, 0x17, 0x40, 0x20, 0xf9, 0xd5, 0x5d, 0xdc, 0xb6, 0x05, 0x50, 0x00,
2390 0x12, 0xf9, 0x05, 0x20, 0x4d, 0xbf, 0xb0, 0x00, 0xcc, 0xe3, 0x57, 0x77,
2391 0x71, 0xdb, 0x96, 0x30, 0x01, 0x48, 0xe4, 0x17, 0x80, 0x34, 0xfd, 0x05,
2392 0x03, 0x5c, 0x7e, 0x75, 0x17, 0xb7, 0x6d, 0x02, 0x10, 0x80, 0x44, 0x7e,
2393 0x01, 0x48, 0xd3, 0xff, 0x38, 0x96, 0x5f, 0xdc, 0xb6, 0x01, 0x44, 0x6c,
2394 0x57, 0xfe, 0xe7, 0x5b, 0xdb, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0x93,
2395 0x0d, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f, 0x01, 0x04, 0x92,
2396 0x5f, 0xdc, 0xb6, 0x19, 0x44, 0x00, 0x12, 0xf9, 0x05, 0x20, 0x4d, 0x7f,
2397 0xc1, 0x00, 0x97, 0x5f, 0xdc, 0x36, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
2398 0x00, 0x12, 0x02, 0x00, 0x00, 0x13, 0x04, 0x72, 0x10, 0x0b, 0x04, 0x00,
2399 0x00, 0x56, 0x00, 0x00, 0x00, 0xd4, 0x8e, 0x45, 0x00, 0x81, 0x70, 0xcc,
2400 0x41, 0x2c, 0xcc, 0x83, 0x07, 0x94, 0x8e, 0x35, 0x00, 0x03, 0x31, 0xc7,
2401 0xb0, 0x30, 0x78, 0x30, 0xc7, 0xb0, 0xe0, 0x01, 0x1e, 0x8c, 0x00, 0x8c,
2402 0x35, 0x00, 0x81, 0x40, 0x65, 0x11, 0x94, 0x00, 0x81, 0x63, 0x09, 0x01,
2403 0x30, 0x02, 0x40, 0xdf, 0x0c, 0x00, 0x79, 0x23, 0x00, 0x35, 0x40, 0xc0,
2404 0x0c, 0x00, 0x05, 0x33, 0x00, 0x33, 0x00, 0x73, 0x10, 0xb4, 0xa0, 0x0b,
2405 0xb4, 0xb0, 0x07, 0x24, 0xcc, 0x00, 0x50, 0x31, 0x03, 0x30, 0x02, 0x30,
2406 0x03, 0x30, 0xd6, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8,
2407 0x07, 0x82, 0x20, 0x88, 0x7f, 0x63, 0x0d, 0x6c, 0x3b, 0xff, 0xa4, 0xc7,
2408 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0x37, 0xd6, 0x00, 0x82,
2409 0x20, 0x5b, 0xff, 0x02, 0x08, 0x82, 0x6c, 0xfd, 0x0b, 0x20, 0x08, 0xb2,
2410 0xf5, 0x2f, 0x8c, 0x35, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x00, 0x82, 0xe0,
2411 0x9a, 0x83, 0x01, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x63, 0x0d, 0x20, 0x48,
2412 0xb7, 0x39, 0x18, 0x80, 0x20, 0xdd, 0xe6, 0x60, 0x00, 0x82, 0x74, 0x9b,
2413 0x83, 0xc1, 0x58, 0xc3, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0xeb, 0x88, 0xc7,
2414 0x2c, 0x18, 0xac, 0x23, 0x1e, 0xb3, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x30,
2415 0x1e, 0x8e, 0x01, 0x08, 0xc2, 0x78, 0x38, 0x06, 0x20, 0x08, 0xe3, 0xe1,
2416 0x18, 0x8c, 0x35, 0x88, 0xb9, 0x98, 0xf6, 0x1f, 0x58, 0xf2, 0x6c, 0xfc,
2417 0x0b, 0x63, 0xba, 0xaa, 0xb9, 0x2f, 0x8c, 0x35, 0xfc, 0x33, 0xe9, 0xff,
2418 0xbe, 0x40, 0xd7, 0xa0, 0x98, 0x7f, 0x2d, 0x1c, 0xc7, 0xa0, 0x2f, 0x8c,
2419 0x35, 0xcc, 0x7d, 0x9b, 0xa6, 0xbe, 0xd0, 0xba, 0x21, 0xcf, 0xfb, 0x02,
2420 0x9f, 0xb3, 0x3e, 0xfe, 0x11, 0x30, 0x46, 0x00, 0x82, 0x20, 0x48, 0x82,
2421 0xc1, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63, 0x04, 0x3a, 0x6b,
2422 0xce, 0x21, 0x18, 0x8c, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81,
2423 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18,
2424 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf,
2425 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x0b, 0x63, 0x04, 0x7d, 0x2c, 0xba,
2426 0xf8, 0x37, 0x46, 0x50, 0xab, 0xb5, 0xda, 0x7e, 0x63, 0x04, 0xb2, 0xe8,
2427 0xf6, 0x34, 0x18, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x08, 0x00,
2428 0x00, 0xe3, 0x0d, 0x73, 0xe0, 0x07, 0xaf, 0x40, 0xc1, 0x18, 0x6e, 0x08,
2429 0x9e, 0x60, 0x96, 0x21, 0x10, 0x82, 0x11, 0x03, 0xa5, 0x08, 0x68, 0x81,
2430 0x0e, 0xe4, 0xe0, 0x0e, 0xc8, 0xe0, 0x0c, 0xca, 0x80, 0x18, 0x31, 0x50,
2431 0x8a, 0xa0, 0x16, 0xe8, 0x60, 0x0e, 0xf0, 0xa0, 0x0c, 0xd0, 0xc0, 0x0c,
2432 0x8a, 0x41, 0x06, 0x61, 0x0c, 0xde, 0x60, 0x90, 0x41, 0x28, 0x83, 0x38,
2433 0x18, 0x64, 0x10, 0x82, 0x39, 0x38, 0x3d, 0x50, 0x97, 0x82, 0x32, 0xc8,
2434 0x10, 0xa4, 0x81, 0x1c, 0x18, 0x11, 0xc0, 0x67, 0xbc, 0xc1, 0x0f, 0x54,
2435 0x61, 0x17, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, 0x10, 0xb8, 0xc1, 0x1d,
2436 0x8c, 0x18, 0x14, 0x46, 0x70, 0x0e, 0x45, 0x30, 0xc7, 0xf0, 0x06, 0x41,
2437 0x38, 0x8c, 0x57, 0x90, 0x02, 0x2c, 0x84, 0x83, 0x38, 0xe0, 0xc1, 0x05,
2438 0xea, 0x52, 0x50, 0x06, 0x19, 0x02, 0x3a, 0xe8, 0x83, 0x11, 0x83, 0xc2,
2439 0x08, 0xda, 0x61, 0x09, 0xe6, 0x18, 0x8c, 0xc0, 0x1c, 0xc6, 0x2b, 0x54,
2440 0xc1, 0x16, 0xce, 0x01, 0x1d, 0xfe, 0xe0, 0x02, 0x75, 0x29, 0x28, 0x83,
2441 0x0c, 0x81, 0x1e, 0x8c, 0xc2, 0x88, 0x41, 0x61, 0x04, 0xf3, 0x10, 0x05,
2442 0x73, 0x0c, 0x46, 0x90, 0x0e, 0xb3, 0x04, 0xc4, 0x70, 0x43, 0xc7, 0x06,
2443 0xc1, 0x2c, 0xc3, 0x40, 0x04, 0x23, 0x06, 0x4a, 0x11, 0xc0, 0x03, 0x2c,
2444 0xb8, 0xc2, 0x2c, 0x80, 0xc2, 0x28, 0x84, 0x02, 0x18, 0x8c, 0x18, 0x28,
2445 0x45, 0x10, 0x0f, 0xb0, 0xf0, 0x0a, 0xb4, 0x10, 0x0a, 0xa4, 0x20, 0x0a,
2446 0x61, 0x30, 0xc8, 0x10, 0x80, 0x82, 0x29, 0x0c, 0x32, 0x0c, 0xa0, 0xc0,
2447 0x0a, 0x83, 0x0c, 0xc2, 0x1f, 0xb8, 0xc2, 0x20, 0x83, 0x10, 0xc0, 0xc2,
2448 0xdd, 0x82, 0xba, 0x14, 0x94, 0x41, 0x86, 0xc0, 0x14, 0x5e, 0xc1, 0x88,
2449 0x00, 0x3e, 0xe3, 0x0d, 0xbb, 0x70, 0x0e, 0xf8, 0x70, 0x81, 0xba, 0x14,
2450 0x94, 0x41, 0x86, 0x60, 0x15, 0x68, 0x61, 0xc4, 0xa0, 0x30, 0x02, 0x92,
2451 0x28, 0x82, 0x39, 0x06, 0x56, 0x08, 0xfc, 0x61, 0xbc, 0x22, 0x1c, 0xda,
2452 0xc1, 0x1f, 0xfe, 0xa1, 0x16, 0x2e, 0x50, 0x97, 0x82, 0x32, 0xc8, 0x10,
2453 0xc4, 0x82, 0x2e, 0x8c, 0x18, 0x14, 0x46, 0xa0, 0x12, 0x4b, 0x30, 0xc7,
2454 0x60, 0x04, 0x23, 0x31, 0x5e, 0x71, 0x0e, 0xf3, 0x40, 0x12, 0x25, 0xc1,
2455 0x0b, 0x17, 0xa8, 0x4b, 0x41, 0x19, 0x64, 0x08, 0x6e, 0x01, 0x1c, 0x46,
2456 0x0c, 0x0a, 0x23, 0x80, 0x89, 0x28, 0x98, 0x63, 0x30, 0x02, 0x93, 0x98,
2457 0x25, 0x20, 0x06, 0x3a, 0x02, 0x3e, 0x08, 0x84, 0x01, 0x2e, 0x84, 0x39,
2458 0x86, 0x60, 0x14, 0x48, 0x62, 0xbc, 0x01, 0x1e, 0xf6, 0x21, 0x25, 0x28,
2459 0x18, 0xc3, 0x0d, 0x41, 0x2b, 0x04, 0xb3, 0x0c, 0x85, 0x11, 0x0c, 0x32,
2460 0x10, 0xbf, 0x80, 0x0e, 0xe3, 0x0d, 0xf4, 0xf0, 0x0f, 0x21, 0x41, 0xc1,
2461 0x18, 0x31, 0x20, 0x8c, 0xc0, 0x26, 0x86, 0x11, 0x83, 0xc2, 0x08, 0x70,
2462 0x22, 0xd8, 0x05, 0x0b, 0x76, 0x01, 0x3e, 0x23, 0x06, 0x85, 0x11, 0xe0,
2463 0x44, 0x00, 0x0e, 0x36, 0xf0, 0x82, 0x7c, 0x8c, 0x17, 0x82, 0xf8, 0xd8,
2464 0x10, 0xd0, 0x67, 0xc4, 0x80, 0x30, 0x82, 0x9e, 0x08, 0x46, 0x0c, 0x0a,
2465 0x23, 0xf8, 0x89, 0xc0, 0x17, 0x2c, 0xf0, 0x05, 0xf9, 0xcc, 0x31, 0xa0,
2466 0xc3, 0xd2, 0x13, 0x83, 0x0c, 0x41, 0x3a, 0xdc, 0x83, 0x0d, 0x01, 0x7d,
2467 0x06, 0x19, 0x82, 0x75, 0xe8, 0x87, 0x41, 0x86, 0xa0, 0xfa, 0x87, 0x59,
2468 0x02, 0x63, 0xa0, 0x22, 0x10, 0x0a, 0x36, 0x20, 0xc6, 0x1b, 0x4c, 0x22,
2469 0x26, 0xc2, 0x82, 0x82, 0x31, 0xdc, 0x10, 0xd8, 0x82, 0x33, 0xcb, 0x70,
2470 0x20, 0xc1, 0x20, 0x03, 0x51, 0x0f, 0xfe, 0x30, 0xde, 0xa0, 0x12, 0x35,
2471 0x91, 0x13, 0x14, 0x8c, 0xf1, 0x06, 0x96, 0xb8, 0x09, 0x9d, 0xa0, 0x60,
2472 0x8c, 0x18, 0x20, 0x47, 0x14, 0x17, 0x45, 0x77, 0x0c, 0xc1, 0x20, 0x43,
2473 0x70, 0x0f, 0x29, 0x31, 0xc8, 0x10, 0x2c, 0x2b, 0x31, 0x4b, 0x80, 0x0c,
2474 0x54, 0x04, 0xc2, 0x81, 0x19, 0xc3, 0x0d, 0x61, 0x60, 0x0e, 0xc1, 0x2c,
2475 0x43, 0x72, 0x05, 0xe3, 0x0d, 0x33, 0xe1, 0x13, 0x6f, 0x41, 0xc1, 0x18,
2476 0x6e, 0x08, 0xd2, 0x21, 0x98, 0x65, 0x50, 0x96, 0x60, 0x90, 0xa1, 0x10,
2477 0x89, 0x95, 0x18, 0x6f, 0xb8, 0x09, 0xb1, 0x60, 0x0b, 0x0a, 0xc6, 0x1c,
2478 0x43, 0x48, 0x04, 0x76, 0x31, 0xc8, 0x10, 0x88, 0x04, 0x4c, 0x58, 0x50,
2479 0xc8, 0x67, 0x90, 0x21, 0x20, 0x09, 0x9b, 0x98, 0x25, 0x88, 0x83, 0xf1,
2480 0x86, 0x9e, 0x40, 0x0b, 0xbd, 0xa0, 0x60, 0x8c, 0x37, 0xfc, 0x84, 0x5a,
2481 0xd0, 0x05, 0x05, 0x63, 0x90, 0x01, 0x6a, 0x89, 0x9d, 0x18, 0x6e, 0x20,
2482 0xe0, 0xc1, 0x99, 0x65, 0x60, 0xac, 0x60, 0x0c, 0x41, 0x02, 0x8d, 0xe1,
2483 0x86, 0x20, 0x1f, 0x94, 0x59, 0x06, 0xa7, 0x09, 0x4c, 0xd8, 0x07, 0xf9,
2484 0xcc, 0x12, 0x3c, 0x36, 0xf4, 0x03, 0x7c, 0x46, 0x0c, 0x08, 0x23, 0x60,
2485 0x8d, 0xc0, 0x02, 0x90, 0x90, 0xcf, 0x88, 0x41, 0x61, 0x04, 0xaf, 0x11,
2486 0x88, 0xc4, 0x2c, 0xc1, 0x33, 0x50, 0x01, 0x28, 0x8d, 0xe0, 0xcc, 0x31,
2487 0xd8, 0x44, 0x80, 0x1a, 0x63, 0x08, 0x1b, 0x6a, 0x0c, 0x37, 0x04, 0x22,
2488 0xa1, 0xcc, 0x32, 0x44, 0x50, 0x60, 0x02, 0x49, 0xc8, 0x67, 0x96, 0x40,
2489 0xb2, 0xc1, 0x24, 0xe0, 0x33, 0x62, 0x40, 0x18, 0x41, 0x6d, 0x04, 0x16,
2490 0xa4, 0x84, 0x7c, 0x46, 0x0c, 0x0a, 0x23, 0xc0, 0x8d, 0x60, 0x25, 0x66,
2491 0x09, 0xa4, 0x81, 0x0a, 0x40, 0x81, 0x84, 0x68, 0x8e, 0x21, 0x09, 0x60,
2492 0x63, 0x0c, 0x81, 0x0c, 0x5c, 0x63, 0xb8, 0x21, 0x58, 0x09, 0x65, 0x96,
2493 0x81, 0x9a, 0x02, 0x13, 0x5a, 0x42, 0x3e, 0xb3, 0x04, 0x95, 0x0d, 0x2f,
2494 0x01, 0x9f, 0x11, 0x03, 0xc2, 0x08, 0x7c, 0x23, 0xb0, 0x40, 0x26, 0xe4,
2495 0x33, 0x62, 0x50, 0x18, 0x41, 0x78, 0x04, 0x34, 0x31, 0x4b, 0x50, 0x0d,
2496 0x54, 0x00, 0xca, 0x24, 0x50, 0x73, 0x0c, 0x49, 0x60, 0x1b, 0xb3, 0x04,
2497 0xd6, 0x40, 0x45, 0x20, 0x54, 0x7a, 0xb0, 0x0c, 0x32, 0x04, 0x6b, 0x41,
2498 0x17, 0x73, 0x0c, 0x68, 0x01, 0x06, 0xbd, 0x31, 0xc8, 0x10, 0xa4, 0xc5,
2499 0x5d, 0xd8, 0x10, 0xc8, 0x67, 0x90, 0x21, 0x58, 0x8b, 0xbe, 0x98, 0x25,
2500 0x88, 0x83, 0xe1, 0x86, 0x59, 0xf0, 0x89, 0x60, 0x96, 0x01, 0x23, 0x83,
2501 0x60, 0x90, 0x81, 0x0e, 0xe2, 0x42, 0x2f, 0xc6, 0x1b, 0x4c, 0x23, 0x36,
2502 0xc6, 0x83, 0x82, 0x31, 0xde, 0x80, 0x1a, 0xb3, 0xd1, 0x1b, 0x14, 0x8c,
2503 0x39, 0x06, 0xb9, 0x08, 0xce, 0x63, 0x90, 0x21, 0x98, 0x8b, 0xd0, 0xb0,
2504 0xe0, 0x90, 0xcf, 0x20, 0x43, 0x50, 0x17, 0xa7, 0x31, 0xdc, 0x70, 0xf0,
2505 0x84, 0x33, 0xcb, 0x30, 0x06, 0x59, 0x30, 0x86, 0x30, 0xb0, 0xc7, 0x70,
2506 0x43, 0xf0, 0x13, 0xca, 0x2c, 0xc3, 0xa6, 0x05, 0x26, 0x84, 0x85, 0x7c,
2507 0x66, 0x09, 0xb8, 0x11, 0x03, 0xc2, 0x08, 0xee, 0x63, 0x18, 0x31, 0x28,
2508 0x8c, 0x20, 0x3f, 0x02, 0xb2, 0xb0, 0xc0, 0x2c, 0xe4, 0x63, 0x01, 0x5a,
2509 0xc0, 0x67, 0x96, 0x80, 0x1b, 0xa8, 0x00, 0x14, 0x4d, 0xd8, 0xe6, 0x18,
2510 0xfa, 0x22, 0xa0, 0x8f, 0x31, 0x04, 0x86, 0x3e, 0x86, 0x1b, 0x02, 0xb4,
2511 0x50, 0x66, 0x19, 0xbc, 0x2e, 0x30, 0x41, 0x2d, 0xe4, 0x33, 0x4b, 0xf0,
2512 0x8d, 0x18, 0x10, 0x46, 0x00, 0x22, 0xc3, 0x88, 0x41, 0x61, 0x04, 0x22,
2513 0x12, 0xb4, 0x85, 0x05, 0x6f, 0x21, 0x1f, 0x0b, 0xe2, 0x02, 0x3e, 0xb3,
2514 0x04, 0xdf, 0x40, 0x05, 0xa0, 0x74, 0x82, 0x37, 0xc7, 0x90, 0x04, 0xfc,
2515 0x31, 0x86, 0x50, 0xe9, 0xc7, 0x70, 0x43, 0x10, 0x17, 0xca, 0x2c, 0x43,
2516 0x18, 0x80, 0x41, 0x60, 0xc2, 0x5c, 0xc8, 0x67, 0x96, 0x40, 0x0c, 0x46,
2517 0x0c, 0x08, 0x23, 0x48, 0x91, 0x61, 0xc4, 0xa0, 0x30, 0x82, 0x15, 0x09,
2518 0xec, 0xc2, 0x02, 0xbc, 0x90, 0x8f, 0x05, 0x7a, 0x01, 0x9f, 0x59, 0x02,
2519 0x31, 0x18, 0xa8, 0x00, 0x14, 0x30, 0x10, 0xc2, 0x60, 0x8e, 0x21, 0x09,
2520 0x44, 0x64, 0xc4, 0xc0, 0x30, 0x82, 0x18, 0x09, 0x62, 0xe3, 0x35, 0x06,
2521 0x19, 0x82, 0xd9, 0x28, 0x8f, 0x59, 0x82, 0x31, 0x18, 0xa8, 0x08, 0xfc,
2522 0x00, 0x13, 0xc4, 0x60, 0x90, 0x21, 0xc8, 0x8d, 0xf3, 0x98, 0x25, 0x88,
2523 0x83, 0x59, 0x86, 0x32, 0x88, 0x03, 0x7e, 0x18, 0x64, 0xe8, 0x05, 0xdd,
2524 0x18, 0x8f, 0x11, 0x83, 0xc2, 0x08, 0x66, 0x24, 0x68, 0x8d, 0x39, 0x06,
2525 0xdb, 0x08, 0x5a, 0x64, 0xc4, 0xa0, 0x30, 0x82, 0x1a, 0x19, 0x5c, 0x63,
2526 0x8e, 0x41, 0x08, 0x5c, 0x64, 0xc4, 0xa0, 0x30, 0x82, 0x1b, 0x29, 0x5e,
2527 0x63, 0x8e, 0x41, 0x08, 0x5a, 0x64, 0x90, 0x21, 0xe8, 0x8d, 0xf7, 0x18,
2528 0x64, 0x08, 0xca, 0x21, 0x3e, 0xc6, 0x1b, 0xee, 0x43, 0x44, 0x68, 0x84,
2529 0x82, 0x31, 0xde, 0x90, 0x1f, 0x24, 0xe2, 0x22, 0x14, 0x8c, 0x39, 0x86,
2530 0xf1, 0x08, 0x70, 0x64, 0x90, 0x21, 0x20, 0x0f, 0xf9, 0xb0, 0x20, 0x91,
2531 0xcf, 0x20, 0x43, 0x60, 0x1e, 0xf8, 0x31, 0xdc, 0x70, 0xb4, 0x86, 0x33,
2532 0xcb, 0x00, 0x07, 0x66, 0x10, 0x8c, 0x21, 0x0c, 0x3d, 0x32, 0xdc, 0x10,
2533 0xc0, 0x86, 0x32, 0xcb, 0x80, 0x06, 0x67, 0x10, 0x98, 0x20, 0x1b, 0xf2,
2534 0x99, 0x25, 0x48, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xd0, 0x64, 0x18, 0x31,
2535 0x28, 0x8c, 0x40, 0x4d, 0x82, 0xda, 0xb0, 0xe0, 0x36, 0xe4, 0x63, 0x41,
2536 0x6e, 0xc0, 0x67, 0x96, 0x20, 0x0d, 0x06, 0x2a, 0x00, 0xe5, 0x0c, 0x04,
2537 0x34, 0x98, 0x63, 0x70, 0x8f, 0xa0, 0x4c, 0xc6, 0x10, 0x98, 0x32, 0x19,
2538 0x6e, 0x08, 0x72, 0x43, 0x99, 0x65, 0x58, 0x03, 0x35, 0x08, 0x4c, 0xd8,
2539 0x0d, 0xf9, 0xcc, 0x12, 0xb0, 0xc1, 0x88, 0x01, 0x61, 0x04, 0x71, 0x32,
2540 0x8c, 0x18, 0x14, 0x46, 0x30, 0x27, 0x81, 0x6f, 0x58, 0x00, 0x1e, 0xf2,
2541 0xb1, 0x40, 0x3c, 0xe0, 0x33, 0x4b, 0xc0, 0x06, 0x03, 0x15, 0x80, 0xa2,
2542 0x06, 0xc2, 0x1a, 0xcc, 0x31, 0x24, 0x41, 0x9b, 0x8c, 0x21, 0x54, 0x6b,
2543 0x32, 0xdc, 0x10, 0x88, 0x87, 0x32, 0xcb, 0xe0, 0x06, 0x6d, 0x10, 0x98,
2544 0x40, 0x1e, 0xf2, 0x99, 0x25, 0x78, 0x83, 0x11, 0x03, 0xc2, 0x08, 0xf4,
2545 0x64, 0x18, 0x31, 0x28, 0x8c, 0x80, 0x4f, 0x82, 0xf3, 0xb0, 0x20, 0x3d,
2546 0xe4, 0x63, 0xc1, 0x7a, 0xc0, 0x67, 0x96, 0xe0, 0x0d, 0x06, 0x2a, 0x00,
2547 0xa5, 0x0d, 0x04, 0x37, 0x98, 0x63, 0x48, 0x82, 0x39, 0x19, 0x31, 0x30,
2548 0x8c, 0x40, 0x54, 0x02, 0x11, 0x01, 0x91, 0x41, 0x86, 0x80, 0x44, 0x6c,
2549 0x64, 0x96, 0x00, 0x0e, 0x06, 0x2a, 0x02, 0x3f, 0x28, 0x03, 0xe1, 0x0d,
2550 0x06, 0x19, 0x02, 0x15, 0xc1, 0x91, 0x59, 0x82, 0x38, 0x18, 0x68, 0x09,
2551 0x78, 0x44, 0xe1, 0x11, 0x8b, 0x47, 0xc6, 0x40, 0x16, 0xe0, 0x80, 0x47,
2552 0xc8, 0x60, 0xa0, 0x25, 0x40, 0x11, 0x45, 0x2f, 0x2c, 0x73, 0x18, 0x03,
2553 0x02, 0x0e, 0x68, 0x88, 0x0c, 0x06, 0x19, 0x02, 0x81, 0x47, 0x2c, 0x20,
2554 0x13, 0xf9, 0x64, 0x10, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
2555 0x00, 0x17, 0xd3, 0x07, 0xff, 0x5c, 0xe3, 0x20, 0x31, 0xa1, 0xd4, 0xf4,
2556 0x50, 0x13, 0xe7, 0x2c, 0x4e, 0xd4, 0x55, 0xf8, 0x5f, 0xac, 0x6e, 0x5d,
2557 0x9b, 0x6d, 0x29, 0x38, 0x8d, 0x34, 0x01, 0xcd, 0x44, 0xd6, 0x39, 0x7b,
2558 0x00, 0x03, 0x11, 0x71, 0x4e, 0x23, 0x4d, 0x40, 0x33, 0x49, 0x3e, 0x71,
2559 0x21, 0x13, 0x00, 0x00, 0x00, 0x01, 0x31, 0x00, 0x00, 0x2c, 0x00, 0x00,
2560 0x00, 0x5b, 0x8e, 0x20, 0x98, 0x85, 0x03, 0x17, 0x90, 0x5f, 0xd8, 0x52,
2561 0x10, 0x07, 0x38, 0x20, 0xe1, 0xb0, 0xa5, 0x28, 0x0e, 0x70, 0x40, 0xc2,
2562 0x61, 0x4b, 0xa1, 0x1c, 0xe2, 0x80, 0x8c, 0xc3, 0x96, 0xe2, 0x39, 0xc4,
2563 0x01, 0x19, 0x87, 0x2d, 0x45, 0x75, 0x88, 0x03, 0x32, 0x0e, 0x5b, 0x8a,
2564 0xed, 0x10, 0x07, 0x64, 0x1c, 0xb6, 0x14, 0x62, 0x70, 0x80, 0x03, 0x12,
2565 0x0e, 0x5b, 0x8a, 0x31, 0x38, 0xc0, 0x01, 0x09, 0x87, 0x2d, 0x45, 0x1a,
2566 0x1c, 0xe2, 0x80, 0x8c, 0xc3, 0x96, 0xc2, 0x0d, 0x0e, 0x71, 0x40, 0xc6,
2567 0x61, 0x4b, 0x41, 0x07, 0x87, 0x38, 0x20, 0xe3, 0xb0, 0xa5, 0xd0, 0x83,
2568 0x43, 0x1c, 0x90, 0x71, 0xd8, 0x32, 0x88, 0x42, 0x40, 0x0e, 0x5b, 0x86,
2569 0x53, 0x08, 0xca, 0x61, 0xcb, 0xa0, 0x0b, 0x81, 0x39, 0x6c, 0x19, 0x7e,
2570 0x21, 0x38, 0x87, 0x2d, 0x43, 0x38, 0x04, 0xe8, 0xb0, 0x65, 0x50, 0x87,
2571 0x60, 0x16, 0xb6, 0x0c, 0xef, 0x10, 0xa4, 0xc3, 0x96, 0xc1, 0x1e, 0x02,
2572 0x75, 0xd8, 0x32, 0xe0, 0x43, 0x90, 0x0e, 0x5b, 0x06, 0xb6, 0x08, 0xd4,
2573 0x61, 0xcb, 0xe0, 0x16, 0x41, 0x3a, 0x6c, 0x19, 0xd4, 0x23, 0x50, 0x87,
2574 0x2d, 0x03, 0x7b, 0x04, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2575 0x00, 0x61, 0x20, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a,
2576 0x2c, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xd4, 0xce, 0x41,
2577 0x2c, 0xcc, 0xd3, 0x06, 0x94, 0x8e, 0x00, 0x8c, 0x35, 0x00, 0x81, 0x40,
2578 0xdf, 0x0c, 0x00, 0x05, 0x33, 0x00, 0x54, 0xcc, 0x00, 0x8c, 0x35, 0xb0,
2579 0xec, 0x19, 0xca, 0x1f, 0xea, 0x97, 0xb1, 0xfa, 0xe5, 0xa7, 0x2e, 0xce,
2580 0xde, 0x58, 0x83, 0x5e, 0x83, 0x3b, 0xee, 0xa9, 0x78, 0x6e, 0xdb, 0xdf,
2581 0xdb, 0xa7, 0xf4, 0xe8, 0x8d, 0x35, 0xac, 0x73, 0xcc, 0xa2, 0x5e, 0x1a,
2582 0xc2, 0xe8, 0xee, 0xdd, 0x6d, 0xac, 0xda, 0xdf, 0x58, 0x83, 0x98, 0x8b,
2583 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb,
2584 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9,
2585 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea,
2586 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x05,
2587 0x33, 0x00, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60,
2588 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x00, 0x00, 0x83, 0x0c, 0xd5,
2589 0x02, 0x0d, 0x37, 0x50, 0x42, 0x30, 0xcb, 0x10, 0x08, 0xc1, 0x1c, 0x43,
2590 0x43, 0xc5, 0xc1, 0x20, 0x43, 0xe0, 0x48, 0x16, 0x64, 0xf2, 0x19, 0x64,
2591 0x08, 0xa0, 0x6a, 0x96, 0x20, 0x19, 0x6e, 0xc8, 0x90, 0x60, 0x96, 0x61,
2592 0x48, 0x82, 0xe1, 0x86, 0x2d, 0x09, 0x66, 0x19, 0x88, 0x22, 0x18, 0x31,
2593 0x28, 0x8c, 0xc0, 0x0f, 0x3a, 0x69, 0x8e, 0xa1, 0x0a, 0xf0, 0x60, 0xc4,
2594 0xa0, 0x30, 0x02, 0x50, 0xf8, 0xa6, 0x39, 0x06, 0x21, 0xc8, 0x83, 0x11,
2595 0x83, 0xc2, 0x08, 0x44, 0x21, 0x0c, 0xa8, 0x39, 0x06, 0x21, 0xc0, 0x83,
2596 0x59, 0x82, 0x62, 0xa0, 0x22, 0x10, 0x08, 0x6e, 0x18, 0x43, 0x08, 0xfc,
2597 0x60, 0x0c, 0x41, 0xf0, 0x83, 0x31, 0x84, 0x81, 0x0f, 0x46, 0x0c, 0x0a,
2598 0x23, 0x30, 0x05, 0x21, 0x18, 0x31, 0x28, 0x8c, 0xe0, 0x14, 0x88, 0x60,
2599 0xb8, 0x21, 0xb8, 0x84, 0x59, 0x06, 0xe3, 0x08, 0x06, 0x19, 0x8e, 0x6c,
2600 0x0c, 0x6c, 0x40, 0x03, 0xf9, 0x58, 0x80, 0xc1, 0xc7, 0x8a, 0x34, 0x90,
2601 0x8f, 0x05, 0x1a, 0x7c, 0x6c, 0x08, 0xe8, 0x33, 0xc7, 0x60, 0x06, 0x81,
2602 0x2a, 0x0c, 0x32, 0x04, 0x67, 0xb0, 0x06, 0x16, 0x20, 0xf2, 0x19, 0x64,
2603 0x08, 0xd2, 0xc0, 0x0d, 0x66, 0x09, 0x8e, 0x81, 0x8a, 0x40, 0x30, 0xc4,
2604 0xa0, 0x98, 0x65, 0x40, 0x92, 0x6c, 0x90, 0x21, 0x20, 0x03, 0x37, 0x18,
2605 0x31, 0x28, 0x8c, 0xe0, 0x16, 0x02, 0x34, 0x98, 0x63, 0x70, 0x83, 0x20,
2606 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xc8, 0x85, 0x21, 0x0d, 0xe6, 0x18, 0x84,
2607 0x40, 0x16, 0x46, 0x0c, 0x0a, 0x23, 0xd8, 0x85, 0x42, 0x0d, 0xe6, 0x18,
2608 0x84, 0x20, 0x16, 0x66, 0x09, 0x92, 0x81, 0x92, 0x80, 0x14, 0x02, 0x57,
2609 0x10, 0x04, 0x04, 0x3a, 0x06, 0x19, 0x02, 0x36, 0xb0, 0x83, 0x0c, 0x00,
2610 0x00, 0x00, 0x00, 0x00, 0x00
2611};
2612const unsigned int sdl_metallib_len = 31301;
diff --git a/SDL-3.2.8/src/render/metal/SDL_shaders_metal_tvsimulator.h b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_tvsimulator.h
new file mode 100644
index 0000000..f152da3
--- /dev/null
+++ b/SDL-3.2.8/src/render/metal/SDL_shaders_metal_tvsimulator.h
@@ -0,0 +1,3155 @@
1const unsigned char sdl_metallib[] = {
2 0x4d, 0x54, 0x4c, 0x42, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00,
3 0x00, 0x00, 0x00, 0x00, 0xbd, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00,
5 0x00, 0x00, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00,
7 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0x3d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8f, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00,
10 0x4e, 0x41, 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f,
11 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x54,
12 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00,
13 0x15, 0xf9, 0x4d, 0x6f, 0xe5, 0x9c, 0xb5, 0x9e, 0xfb, 0x24, 0xc0, 0x2a,
14 0x04, 0x12, 0xb6, 0x3d, 0xce, 0x01, 0xe2, 0xef, 0x83, 0xef, 0x5c, 0xac,
15 0x5a, 0xb2, 0xc9, 0xf0, 0xc8, 0xba, 0xc9, 0x2b, 0x4d, 0x44, 0x53, 0x5a,
16 0x08, 0x00, 0xa0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46,
17 0x46, 0x54, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
18 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00,
20 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x85, 0x00,
21 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, 0x53, 0x44, 0x4c, 0x5f,
22 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00,
23 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x20,
24 0x00, 0x52, 0xb6, 0xb7, 0xe5, 0x86, 0x26, 0xb7, 0x1a, 0x21, 0xaf, 0xe3,
25 0x79, 0x7a, 0x10, 0xe2, 0x0b, 0xc0, 0x31, 0xb4, 0x53, 0x24, 0xfd, 0x59,
26 0xdf, 0x13, 0x54, 0xe6, 0x9f, 0x33, 0x99, 0x7a, 0x96, 0x4d, 0x44, 0x53,
27 0x5a, 0x08, 0x00, 0xb0, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f,
28 0x46, 0x46, 0x54, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
29 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0e, 0x00,
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02,
31 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x88,
32 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x13, 0x00, 0x53, 0x44, 0x4c,
33 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d,
34 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48,
35 0x41, 0x53, 0x48, 0x20, 0x00, 0x52, 0x06, 0xe9, 0x1b, 0x32, 0x0a, 0xb5,
36 0xca, 0xb9, 0x78, 0x6c, 0x25, 0x2c, 0xfe, 0x03, 0x5b, 0x15, 0xc9, 0x22,
37 0xfe, 0xf9, 0x65, 0x38, 0x46, 0x53, 0x98, 0xa9, 0x8a, 0xea, 0xbd, 0x05,
38 0x56, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x00,
39 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00, 0x66, 0x00, 0x00,
40 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41 0x00, 0x50, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52,
42 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45,
43 0x4e, 0x44, 0x54, 0x87, 0x00, 0x00, 0x00, 0x4e, 0x41, 0x4d, 0x45, 0x12,
44 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72,
45 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50, 0x45, 0x01,
46 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0x35, 0x0e, 0x3c, 0xe0,
47 0xce, 0x53, 0x67, 0x6e, 0xfb, 0xaf, 0x12, 0x13, 0x2f, 0x9a, 0x35, 0x08,
48 0x2a, 0x4e, 0xd6, 0xe8, 0xa9, 0xff, 0xce, 0xe6, 0x90, 0x33, 0xa6, 0x4b,
49 0xb3, 0xc1, 0x2d, 0x79, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00, 0x50, 0x1f,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54, 0x18, 0x00,
51 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x60, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00,
54 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x86, 0x00, 0x00, 0x00, 0x4e, 0x41,
55 0x4d, 0x45, 0x11, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f,
56 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x54, 0x59, 0x50,
57 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20, 0x00, 0xa7, 0x01,
58 0x7b, 0x12, 0xea, 0xf0, 0xa5, 0x6a, 0x6b, 0x4f, 0xc0, 0x6d, 0xb6, 0xea,
59 0x5f, 0xd2, 0x67, 0xf6, 0x0d, 0xb4, 0x84, 0x9a, 0x83, 0xef, 0xdf, 0x35,
60 0x42, 0x30, 0xb3, 0x5b, 0x2f, 0x4a, 0x4d, 0x44, 0x53, 0x5a, 0x08, 0x00,
61 0x10, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x46, 0x46, 0x54,
62 0x18, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x4a, 0x00, 0x00, 0x00, 0x00,
64 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00,
65 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x87, 0x00, 0x00, 0x00,
66 0x4e, 0x41, 0x4d, 0x45, 0x12, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56,
67 0x31, 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x00,
68 0x54, 0x59, 0x50, 0x45, 0x01, 0x00, 0x01, 0x48, 0x41, 0x53, 0x48, 0x20,
69 0x00, 0x01, 0x40, 0xa0, 0xf0, 0xd1, 0x67, 0x2d, 0x43, 0x1e, 0xf0, 0x7f,
70 0xf2, 0x38, 0xda, 0xd8, 0x27, 0x85, 0xad, 0x09, 0xbf, 0x29, 0x25, 0x29,
71 0x69, 0xde, 0x09, 0xb7, 0x80, 0xe9, 0x50, 0xc7, 0x35, 0x4d, 0x44, 0x53,
72 0x5a, 0x08, 0x00, 0xc0, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f,
73 0x46, 0x46, 0x54, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x6c, 0x00,
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x45, 0x52, 0x53, 0x08, 0x00, 0x02,
76 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x45,
77 0x4e, 0x44, 0x54, 0x29, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x15,
78 0x00, 0x02, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00,
79 0x00, 0x80, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x56, 0x41,
80 0x54, 0x59, 0x04, 0x00, 0x02, 0x00, 0x04, 0x06, 0x45, 0x4e, 0x44, 0x54,
81 0x35, 0x00, 0x00, 0x00, 0x56, 0x41, 0x54, 0x54, 0x20, 0x00, 0x03, 0x00,
82 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x80, 0x63,
83 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x01, 0x80, 0x74, 0x65, 0x78, 0x63, 0x6f,
84 0x6f, 0x72, 0x64, 0x00, 0x02, 0x80, 0x56, 0x41, 0x54, 0x59, 0x05, 0x00,
85 0x03, 0x00, 0x04, 0x06, 0x04, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
86 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
87 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
88 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
89 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
90 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44,
91 0x54, 0x04, 0x00, 0x00, 0x00, 0x45, 0x4e, 0x44, 0x54, 0x04, 0x00, 0x00,
92 0x00, 0x45, 0x4e, 0x44, 0x54, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
93 0x00, 0x14, 0x00, 0x00, 0x00, 0x8c, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xff,
94 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00,
95 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00,
96 0x00, 0x21, 0x0c, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21,
97 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
98 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
99 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
100 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
101 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88,
102 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4,
103 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46,
104 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24,
105 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78,
106 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77,
107 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a,
108 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21,
109 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1,
110 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0,
111 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c,
112 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76,
113 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
114 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
115 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
116 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
117 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1,
118 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1,
119 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1,
120 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79,
121 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77,
122 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
123 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
124 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0,
125 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
126 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79,
127 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72,
128 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
129 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
130 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01,
131 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
132 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a,
133 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a,
134 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
135 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d,
136 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1,
137 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
138 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x78,
139 0xc2, 0x00, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, 0x0c, 0xe1, 0x90, 0x0e,
140 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f,
141 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, 0x0e, 0xe9, 0x10, 0x0e,
142 0xf3, 0x00, 0x6c, 0xf0, 0x06, 0x02, 0x58, 0x80, 0x2a, 0x48, 0x03, 0x50,
143 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1,
144 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81,
145 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
146 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
147 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
148 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
149 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
150 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x60, 0x87, 0x10, 0xc0,
151 0x30, 0x82, 0x00, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
152 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
153 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
154 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x52, 0x88,
155 0x11, 0x8c, 0xa1, 0x33, 0x10, 0x30, 0x47, 0x00, 0x06, 0x29, 0xa0, 0xe6,
156 0x08, 0x40, 0x61, 0x10, 0x21, 0x10, 0x86, 0x11, 0x08, 0x65, 0x04, 0x00,
157 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda,
158 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec,
159 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0,
160 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8,
161 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e,
162 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
163 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b,
164 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a,
165 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d,
166 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e,
167 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d,
168 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c,
169 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39,
170 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
171 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e,
172 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c,
173 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c,
174 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d,
175 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
176 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e,
177 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c,
178 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d,
179 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e,
180 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c,
181 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d,
182 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d,
183 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d,
184 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d,
185 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d,
186 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c,
187 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d,
188 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x42, 0x6c, 0x57, 0xfe,
189 0xac, 0xb3, 0x20, 0xc3, 0x5f, 0x11, 0xd1, 0x44, 0x5c, 0x43, 0x22, 0x00,
190 0x3a, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40,
191 0x62, 0x83, 0x40, 0x51, 0xb4, 0x01, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00,
192 0x00, 0x0a, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c,
193 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02,
194 0x85, 0x30, 0x02, 0x50, 0x80, 0x01, 0x05, 0x52, 0x06, 0xc4, 0x46, 0x00,
195 0x68, 0x8d, 0x25, 0x48, 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00,
196 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
197 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
198 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
199 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
200 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
201 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
202 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
203 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
204 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
205 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
206 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
207 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
208 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
209 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
210 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
211 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
212 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
213 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
214 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
215 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
216 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
217 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
218 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
219 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
220 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
221 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
222 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
223 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
224 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
225 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
226 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
227 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
228 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
229 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
230 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
231 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
232 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
233 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
234 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
235 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
236 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
237 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
238 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
239 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
240 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
241 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
242 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
243 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
244 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
245 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
246 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
247 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
248 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
249 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
250 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
251 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0xd1, 0x00, 0x00,
252 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8,
253 0x11, 0x32, 0x64, 0xd4, 0x3c, 0xec, 0x7c, 0x00, 0x00, 0x8b, 0x12, 0x07,
254 0xc5, 0xc6, 0x91, 0x01, 0x13, 0x19, 0x0c, 0x12, 0x59, 0x85, 0x53, 0x24,
255 0x90, 0xe4, 0x19, 0xca, 0x83, 0x44, 0x17, 0xa2, 0x24, 0x53, 0x44, 0x4b,
256 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61,
257 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20,
258 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
259 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20,
260 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30,
261 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c,
262 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e,
263 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61,
264 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
265 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68,
266 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63,
267 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65,
268 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68,
269 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70,
270 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61,
271 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
272 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72,
273 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
274 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78,
275 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72,
276 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44,
277 0x76, 0x34, 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x69,
278 0x72, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65,
279 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69,
280 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78,
281 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f,
282 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78,
283 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f,
284 0x61, 0x69, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c,
285 0x64, 0x65, 0x72, 0x5f, 0x5f, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32,
286 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69,
287 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a,
288 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72,
289 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73, 0x69,
290 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79,
291 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69, 0x7a,
292 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72, 0x6f,
293 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73,
294 0x66, 0x6f, 0x72, 0x6d, 0x00, 0xc4, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00,
295 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08,
296 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82,
297 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5f,
298 0x00, 0x06, 0x33, 0x0c, 0x61, 0x20, 0x88, 0xc1, 0x0c, 0xc1, 0x30, 0xc3,
299 0xf0, 0x7d, 0x63, 0x30, 0x03, 0x41, 0x84, 0x41, 0x18, 0x8c, 0xc1, 0x0c,
300 0x41, 0x31, 0x43, 0x60, 0xcc, 0x10, 0x1c, 0x33, 0x14, 0x48, 0xa2, 0x2c,
301 0xcc, 0x0c, 0x46, 0xe3, 0x24, 0xca, 0xf2, 0xcc, 0x50, 0x40, 0x49, 0xb4,
302 0x48, 0x33, 0x0c, 0x70, 0x10, 0x07, 0x72, 0x30, 0x83, 0x32, 0x06, 0x13,
303 0x35, 0x06, 0x61, 0x50, 0x25, 0xd6, 0xc2, 0xcc, 0xa0, 0x84, 0xc1, 0x44,
304 0x85, 0x41, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, 0x40, 0xdf, 0x85, 0x95,
305 0x01, 0xf5, 0x85, 0x41, 0xa6, 0x95, 0xc1, 0x66, 0x06, 0x09, 0xb7, 0x74,
306 0x33, 0x40, 0x67, 0x70, 0x61, 0x65, 0x40, 0x9d, 0x41, 0x18, 0x64, 0x5a,
307 0x19, 0x6c, 0x66, 0x90, 0x70, 0x8b, 0x37, 0x03, 0x41, 0x07, 0x75, 0x60,
308 0x07, 0x77, 0x30, 0xc3, 0x40, 0x06, 0x73, 0x80, 0x07, 0xb5, 0x01, 0x1c,
309 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0x1a, 0xb8, 0x81, 0x85, 0x06, 0x7a,
310 0x60, 0x59, 0x96, 0x1b, 0xd0, 0x81, 0x1b, 0xd0, 0x81, 0x2f, 0xf8, 0x02,
311 0x4a, 0xd0, 0x04, 0x28, 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62, 0x63, 0xb3,
312 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31, 0x63, 0x0b,
313 0x3b, 0x9b, 0x1b, 0x45, 0x38, 0x03, 0x34, 0x38, 0x85, 0x8d, 0xcd, 0xae,
314 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, 0x20, 0x0d, 0x6e, 0x09,
315 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25,
316 0x50, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc, 0xce, 0xea,
317 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde, 0xdc, 0x46,
318 0x09, 0xd6, 0xe0, 0xa6, 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7, 0x36, 0xb8,
319 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7, 0xb9, 0x51,
320 0x06, 0x36, 0x68, 0x03, 0x37, 0x38, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae,
321 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, 0x00, 0x0f, 0x00, 0xa9, 0x18, 0x00,
322 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80,
323 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43,
324 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e,
325 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
326 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4,
327 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81,
328 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08,
329 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01,
330 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c,
331 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c,
332 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c,
333 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1,
334 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00,
335 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c,
336 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90,
337 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x8c, 0x00, 0x00,
338 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00,
339 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc, 0x08, 0xc0, 0x58, 0x44,
340 0x10, 0x04, 0xc1, 0x58, 0x84, 0x20, 0x08, 0xc2, 0x58, 0xc4, 0x30, 0x0c,
341 0x03, 0x81, 0x31, 0x02, 0x10, 0x04, 0x41, 0xfc, 0xa3, 0x30, 0x03, 0x30,
342 0x03, 0x40, 0x62, 0x06, 0x80, 0xc6, 0x0c, 0x00, 0x00, 0xf1, 0x30, 0x00,
343 0x00, 0x2c, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x08,
344 0x3d, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x23, 0x06, 0x96, 0x05, 0x00, 0x00,
345 0x00, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20,
346 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43,
347 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61,
348 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28,
349 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76, 0x65,
350 0x72, 0x74, 0x65, 0x78, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69,
351 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67,
352 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73,
353 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x32,
354 0x29, 0x13, 0x04, 0x06, 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42,
355 0x01, 0x14, 0xfa, 0x60, 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82,
356 0x3d, 0xd8, 0x30, 0xe8, 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48,
357 0xe1, 0x0f, 0x36, 0x04, 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00,
358 0x00, 0xbb, 0x10, 0x8d, 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0x01, 0x51,
359 0x18, 0x45, 0x41, 0x28, 0x83, 0x0c, 0xc3, 0xd1, 0x98, 0x10, 0x88, 0xff,
360 0x2e, 0x04, 0x85, 0x71, 0x12, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0x0c, 0x64,
361 0x42, 0x20, 0xfe, 0x16, 0x14, 0xe0, 0xbf, 0x0b, 0x91, 0x75, 0x61, 0x50,
362 0x51, 0x10, 0xca, 0x20, 0x03, 0x13, 0x51, 0x26, 0x04, 0xe2, 0x6f, 0x45,
363 0x00, 0xfe, 0xbb, 0x10, 0x9e, 0x18, 0x98, 0xc1, 0x46, 0x41, 0x28, 0x83,
364 0x0c, 0x91, 0x85, 0x99, 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42,
365 0x88, 0xc1, 0x19, 0xac, 0x41, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0,
366 0x81, 0x81, 0x05, 0x95, 0xf8, 0x0f, 0x32, 0x0c, 0x5d, 0x18, 0x58, 0x30,
367 0x89, 0xbf, 0x0d, 0x01, 0xf8, 0x0f, 0x32, 0x18, 0x60, 0x30, 0x06, 0x16,
368 0x44, 0xe2, 0x6f, 0x43, 0x00, 0xfe, 0x83, 0x0c, 0xc9, 0x18, 0x94, 0x81,
369 0x05, 0x8f, 0xf8, 0xdb, 0x10, 0x80, 0xff, 0x2e, 0xc4, 0x1b, 0xd0, 0x01,
370 0x1e, 0xb4, 0x01, 0x05, 0xa1, 0x0c, 0x32, 0x04, 0x67, 0xd0, 0x06, 0x16,
371 0x88, 0x81, 0xf8, 0x0f, 0x32, 0x0c, 0x6a, 0xe0, 0x06, 0x16, 0x80, 0x81,
372 0xf8, 0x0f, 0x32, 0x14, 0x6c, 0xf0, 0x06, 0x16, 0x74, 0xe2, 0x3f, 0xc8,
373 0x70, 0xb8, 0x01, 0x1c, 0x58, 0xa0, 0x89, 0xff, 0x20, 0x03, 0x1f, 0xb4,
374 0x41, 0x1d, 0x58, 0x16, 0x88, 0xff, 0x20, 0x83, 0x1f, 0xbc, 0x81, 0x1d,
375 0x98, 0x13, 0x88, 0xbf, 0x25, 0x03, 0xf8, 0x5b, 0xc0, 0x80, 0xbf, 0x05,
376 0x09, 0xf8, 0x5b, 0x80, 0x80, 0xbf, 0x05, 0x05, 0xf8, 0xcf, 0x36, 0xdc,
377 0x41, 0x00, 0xcc, 0x36, 0x04, 0xa5, 0x10, 0xcc, 0x36, 0x04, 0x7c, 0x20,
378 0x64, 0x10, 0x10, 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20,
379 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c,
380 0xa6, 0x80, 0x94, 0xc2, 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4,
381 0x14, 0xb6, 0x1c, 0x4c, 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5,
382 0x88, 0x02, 0x52, 0x38, 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90,
383 0xc2, 0x51, 0x0a, 0x88, 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3,
384 0x14, 0x10, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
385 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xda,
386 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00,
387 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00,
388 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
389 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
390 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
391 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00,
392 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
393 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
397 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00,
398 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x79, 0x00, 0x00, 0x00,
399 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x76,
400 0x65, 0x72, 0x74, 0x65, 0x78, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34,
401 0x30, 0x34, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c,
402 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30,
403 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00,
404 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
405 0x00, 0x14, 0x00, 0x00, 0x00, 0x90, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xff,
406 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00,
407 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00,
408 0x00, 0x21, 0x0c, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x0b, 0x02, 0x21,
409 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
410 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
411 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x14, 0x45,
412 0x02, 0x42, 0x92, 0x0b, 0x42, 0xa4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
413 0x4b, 0x0a, 0x32, 0x52, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88,
414 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x91, 0x22, 0xc4,
415 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x29, 0x46,
416 0x06, 0x51, 0x18, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1b, 0x7e, 0x24,
417 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x80, 0x8a, 0x08, 0x07, 0x78,
418 0x80, 0x07, 0x79, 0x78, 0x07, 0x7c, 0x68, 0x03, 0x73, 0xa8, 0x07, 0x77,
419 0x18, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a,
420 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xda, 0x21,
421 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xce, 0x21, 0x1c, 0xd8, 0xa1,
422 0x0d, 0xec, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0xe0,
423 0x1e, 0xd2, 0x81, 0x1c, 0xe8, 0x01, 0x1d, 0x80, 0x38, 0x90, 0x03, 0x3c,
424 0x00, 0x06, 0x77, 0x78, 0x87, 0x36, 0x10, 0x87, 0x7a, 0x48, 0x07, 0x76,
425 0xa0, 0x87, 0x74, 0x70, 0x87, 0x79, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
426 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
427 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
428 0x48, 0x87, 0x76, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
429 0x1d, 0xde, 0xa1, 0x0d, 0xcc, 0x41, 0x1e, 0xc2, 0xa1, 0x1d, 0xca, 0xa1,
430 0x0d, 0xe0, 0xe1, 0x1d, 0xd2, 0xc1, 0x1d, 0xe8, 0xa1, 0x1c, 0xe4, 0xa1,
431 0x0d, 0xca, 0x81, 0x1d, 0xd2, 0xa1, 0x1d, 0xda, 0xc0, 0x1d, 0xde, 0xc1,
432 0x1d, 0xda, 0x80, 0x1d, 0xca, 0x21, 0x1c, 0xcc, 0x01, 0xa0, 0x07, 0x79,
433 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x48, 0x07, 0x77,
434 0x30, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70,
435 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2,
436 0x1d, 0xde, 0xa1, 0x0d, 0xdc, 0x21, 0x1c, 0xdc, 0x61, 0x1e, 0xda, 0xc0,
437 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
438 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83, 0x79,
439 0x48, 0x87, 0x73, 0x70, 0x87, 0x72, 0x20, 0x87, 0x36, 0xd0, 0x87, 0x72,
440 0x90, 0x87, 0x77, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
441 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
442 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x80, 0x1e, 0xe4, 0x21, 0x1c, 0xe0, 0x01,
443 0x1e, 0xd2, 0xc1, 0x1d, 0xce, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
444 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x98, 0x07, 0x7a,
445 0x08, 0x87, 0x71, 0x58, 0x87, 0x36, 0x80, 0x07, 0x79, 0x78, 0x07, 0x7a,
446 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
447 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x83, 0x79, 0x48, 0x07, 0x7d,
448 0x28, 0x07, 0x00, 0x0f, 0x00, 0xa2, 0x1e, 0xdc, 0x61, 0x1e, 0xc2, 0xc1,
449 0x1c, 0xca, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81,
450 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x36, 0x78,
451 0x02, 0x01, 0x2c, 0x40, 0x15, 0xa4, 0x01, 0x28, 0x0c, 0xe1, 0x90, 0x0e,
452 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f,
453 0x6d, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe1, 0xc0, 0x0e, 0xe9, 0x10, 0x0e,
454 0xf3, 0x00, 0x6c, 0xf0, 0x86, 0x02, 0x58, 0x80, 0x2a, 0x48, 0x03, 0x50,
455 0x18, 0xc2, 0x21, 0x1d, 0xe4, 0xa1, 0x0d, 0xc4, 0xa1, 0x1e, 0xcc, 0xc1,
456 0x1c, 0xca, 0x41, 0x1e, 0xda, 0xc0, 0x1d, 0xde, 0xa1, 0x0d, 0xc2, 0x81,
457 0x1d, 0xd2, 0x21, 0x1c, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00,
458 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x86, 0x40, 0x18, 0x00, 0x00, 0x00,
459 0x00, 0x89, 0x20, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, 0x22, 0x48,
460 0x09, 0x20, 0x64, 0x85, 0x04, 0x93, 0x22, 0xa4, 0x84, 0x04, 0x93, 0x22,
461 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8a, 0x8c, 0x0b, 0x84, 0xa4,
462 0x4c, 0x10, 0x40, 0x33, 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00,
463 0x76, 0x08, 0x41, 0x24, 0x41, 0x98, 0xc9, 0x9a, 0x07, 0x7a, 0x90, 0x87,
464 0x7a, 0x18, 0x07, 0x7a, 0x70, 0x83, 0x76, 0x28, 0x07, 0x7a, 0x08, 0x07,
465 0x76, 0xd0, 0x03, 0x3d, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x79, 0x48, 0x07,
466 0x7c, 0x70, 0x03, 0x38, 0x40, 0x01, 0x19, 0x44, 0x28, 0x84, 0x62, 0x0c,
467 0x11, 0x84, 0x31, 0x74, 0x06, 0x02, 0xe6, 0x08, 0xc0, 0x20, 0x05, 0xd4,
468 0x1c, 0x01, 0x28, 0x0c, 0x22, 0x04, 0xc2, 0x30, 0x02, 0xa1, 0x8c, 0x00,
469 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda,
470 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec,
471 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0,
472 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8,
473 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e,
474 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
475 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b,
476 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a,
477 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d,
478 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e,
479 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d,
480 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c,
481 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39,
482 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
483 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e,
484 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c,
485 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c,
486 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d,
487 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
488 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e,
489 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c,
490 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d,
491 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e,
492 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c,
493 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d,
494 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d,
495 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d,
496 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d,
497 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d,
498 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c,
499 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d,
500 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x3e, 0x6c, 0x57, 0xfe,
501 0x9c, 0xf3, 0x60, 0x7f, 0x45, 0x44, 0x13, 0x71, 0x0d, 0x89, 0x80, 0xe7,
502 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x89,
503 0x0d, 0x02, 0x45, 0xd5, 0x06, 0x00, 0x00, 0xb2, 0x40, 0x0a, 0x00, 0x00,
504 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
505 0x47, 0xc6, 0x04, 0x43, 0x52, 0x45, 0x50, 0x02, 0x85, 0x30, 0x02, 0x50,
506 0x06, 0x05, 0x18, 0x50, 0x20, 0xc4, 0x46, 0x00, 0x68, 0x8d, 0x25, 0x48,
507 0x02, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
508 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
509 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
510 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
511 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
512 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
513 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
514 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
515 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
516 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
517 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
518 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
519 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
520 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
521 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
522 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
523 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
524 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
525 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
526 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
527 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
528 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
529 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
530 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
531 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
532 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
533 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
534 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
535 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
536 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
537 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
538 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
539 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
540 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
541 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
542 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
543 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
544 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
545 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
546 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
547 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
548 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
549 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
550 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
551 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
552 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
553 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
554 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
555 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
556 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
557 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
558 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
559 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
560 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
561 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
562 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
563 0x00, 0x79, 0x20, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08,
564 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4,
565 0x3a, 0x8c, 0x7d, 0x00, 0x00, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x01,
566 0x13, 0x19, 0x0c, 0x12, 0x59, 0x45, 0x66, 0x20, 0x90, 0xe4, 0x29, 0x0f,
567 0x12, 0x5d, 0x88, 0x92, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72,
568 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69,
569 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61,
570 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32,
571 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74,
572 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34,
573 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e,
574 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f,
575 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61,
576 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66,
577 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61,
578 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
579 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66,
580 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61,
581 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74,
582 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74,
583 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61,
584 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61,
585 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69,
586 0x72, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x6f, 0x75, 0x74,
587 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
588 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66,
589 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
590 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72,
591 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61, 0x74,
592 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69, 0x72,
593 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x5f, 0x69, 0x6e, 0x70, 0x75,
594 0x74, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
595 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x67, 0x65, 0x6e, 0x65, 0x72,
596 0x61, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x5f, 0x61, 0x69, 0x72, 0x5f, 0x70,
597 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x5f,
598 0x29, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61,
599 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69,
600 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69,
601 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73,
602 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74,
603 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69,
604 0x7a, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x70, 0x72,
605 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e,
606 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x04, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00,
607 0x00, 0x30, 0x82, 0xa0, 0x04, 0x23, 0x08, 0x4b, 0x32, 0x82, 0xa0, 0x08,
608 0x23, 0x08, 0xca, 0x30, 0x82, 0xa0, 0x10, 0x23, 0x08, 0x08, 0x30, 0x82,
609 0xa0, 0x14, 0x23, 0x08, 0x8a, 0x31, 0x82, 0xa0, 0x1c, 0x33, 0x0c, 0x5e,
610 0xf0, 0xcd, 0x30, 0x80, 0x81, 0x10, 0x06, 0x33, 0x04, 0xc3, 0x0c, 0x83,
611 0xe7, 0x89, 0xc1, 0x0c, 0x04, 0x01, 0x06, 0x60, 0x20, 0x06, 0x33, 0x04,
612 0xc5, 0x0c, 0x81, 0x31, 0x43, 0x70, 0xcc, 0x50, 0x20, 0x89, 0xb2, 0x30,
613 0x33, 0x18, 0x8d, 0x93, 0x28, 0xcb, 0x33, 0x83, 0xd1, 0x40, 0x49, 0xb4,
614 0x48, 0x33, 0x0c, 0x6f, 0x00, 0x07, 0x71, 0x30, 0x83, 0x22, 0x06, 0x13,
615 0x25, 0x06, 0x60, 0x50, 0x25, 0xd1, 0xc2, 0xcc, 0xa0, 0x80, 0xc1, 0x44,
616 0x81, 0x01, 0x18, 0x54, 0x89, 0xb2, 0x3c, 0x33, 0x28, 0xde, 0x44, 0x79,
617 0x60, 0x50, 0x25, 0xd1, 0x22, 0xcd, 0x00, 0x91, 0x81, 0x75, 0x95, 0x01,
618 0xe5, 0x81, 0x01, 0x96, 0x95, 0x81, 0x66, 0x06, 0xc9, 0xb6, 0x70, 0x33,
619 0x40, 0x61, 0x60, 0x5d, 0x65, 0x40, 0x91, 0x01, 0x18, 0x60, 0x59, 0x19,
620 0x68, 0x66, 0x90, 0x6c, 0x4b, 0x37, 0x43, 0x31, 0x07, 0x74, 0x50, 0x07,
621 0x76, 0x70, 0x07, 0x33, 0x0c, 0x63, 0x20, 0x07, 0x78, 0x50, 0x1c, 0xc0,
622 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x89, 0x81, 0x1b, 0x58, 0x68, 0xa0,
623 0x07, 0x96, 0x65, 0xb9, 0x01, 0x1d, 0xd0, 0x01, 0x1d, 0xf8, 0x82, 0x2f,
624 0xc8, 0x82, 0x4b, 0xd0, 0x04, 0x2b, 0xc8, 0x48, 0x60, 0x82, 0x2e, 0x62,
625 0x63, 0xb3, 0x6b, 0x73, 0x69, 0x7b, 0x23, 0xab, 0x63, 0x2b, 0x73, 0x31,
626 0x63, 0x0b, 0x3b, 0x9b, 0x1b, 0x45, 0x30, 0x83, 0x33, 0x38, 0x85, 0x8d,
627 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x94, 0x00, 0x0d,
628 0x6e, 0x09, 0x4b, 0x93, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73,
629 0x1b, 0x25, 0x48, 0x83, 0xa3, 0xc2, 0xd2, 0xe4, 0x5c, 0xd8, 0xc2, 0xdc,
630 0xce, 0xea, 0xc2, 0xce, 0xca, 0xbe, 0xec, 0xca, 0xe4, 0xe6, 0xd2, 0xde,
631 0xdc, 0x46, 0x09, 0xd4, 0xe0, 0xa6, 0xb0, 0x34, 0x39, 0x97, 0xb1, 0xb7,
632 0x36, 0xb8, 0x34, 0xb6, 0xb2, 0xaf, 0x37, 0x38, 0xba, 0xb4, 0x37, 0xb7,
633 0xb9, 0x51, 0x86, 0x35, 0x60, 0x83, 0x36, 0x38, 0x25, 0x2c, 0x4d, 0xce,
634 0xc5, 0xae, 0x4c, 0x8e, 0xae, 0x0c, 0x6f, 0x94, 0x00, 0x0f, 0x00, 0x00,
635 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72,
636 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8,
637 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1,
638 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21,
639 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f,
640 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e,
641 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76,
642 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c,
643 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b,
644 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61,
645 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1,
646 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f,
647 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00,
648 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c,
649 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c,
650 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
651 0x00, 0x8a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00,
652 0x00, 0x09, 0x00, 0x00, 0x00, 0xc4, 0x4a, 0xa0, 0x0c, 0x8a, 0x80, 0xdc,
653 0x08, 0xc0, 0x58, 0x44, 0x10, 0x04, 0xc1, 0x58, 0x84, 0x20, 0x08, 0xc2,
654 0x58, 0xc4, 0x30, 0x0c, 0x03, 0x85, 0x19, 0x80, 0x19, 0x00, 0x12, 0x33,
655 0x00, 0x34, 0x66, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x2c, 0x00, 0x00,
656 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, 0x3c, 0x00, 0x00, 0x00,
657 0x00, 0xcf, 0x13, 0x06, 0x96, 0x05, 0x00, 0x00, 0x00, 0x6f, 0x6d, 0x6e,
658 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72,
659 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54,
660 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73,
661 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f,
662 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x29,
663 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
664 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34, 0x29, 0x61, 0x69,
665 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70,
666 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x13, 0x04, 0x06,
667 0x59, 0x21, 0x80, 0x02, 0x1f, 0xac, 0x18, 0x42, 0x01, 0x14, 0xfa, 0x60,
668 0xc5, 0x20, 0x0a, 0xa0, 0xe0, 0x07, 0x1b, 0x82, 0x3d, 0xd8, 0x30, 0xe8,
669 0xc1, 0x28, 0xfc, 0xc1, 0x86, 0x81, 0x14, 0x48, 0xe1, 0x0f, 0x36, 0x04,
670 0xa1, 0xb0, 0x21, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x10, 0x8c,
671 0x64, 0x49, 0x14, 0x84, 0xb2, 0x0b, 0xf1, 0x50, 0x18, 0x45, 0x41, 0x28,
672 0x83, 0x0c, 0xc3, 0xc1, 0x98, 0x10, 0x88, 0xff, 0x2e, 0xc4, 0x84, 0x71,
673 0x11, 0x05, 0xa1, 0x0c, 0x32, 0x1c, 0xcc, 0x63, 0x42, 0x20, 0xfe, 0x16,
674 0x14, 0xe0, 0xbf, 0x0b, 0x81, 0x75, 0x61, 0x40, 0x51, 0x10, 0xca, 0x20,
675 0x03, 0x13, 0x4d, 0x26, 0x04, 0xe2, 0x6f, 0x45, 0x00, 0xfe, 0xbb, 0x10,
676 0x9d, 0x18, 0x98, 0x81, 0x46, 0x41, 0x28, 0x83, 0x0c, 0x91, 0x75, 0x99,
677 0x10, 0x88, 0xbf, 0x15, 0x01, 0xf8, 0xef, 0x42, 0x84, 0xc1, 0x19, 0xac,
678 0x01, 0x18, 0x50, 0x10, 0xca, 0x20, 0x43, 0xa0, 0x7d, 0x16, 0x54, 0xe2,
679 0x3f, 0xc8, 0x30, 0x74, 0x60, 0x60, 0xc1, 0x24, 0xfe, 0x36, 0x04, 0xe0,
680 0x3f, 0xc8, 0x60, 0x80, 0x81, 0x18, 0x58, 0x10, 0x89, 0xbf, 0x0d, 0x01,
681 0xf8, 0x0f, 0x32, 0x24, 0x63, 0x40, 0x06, 0x16, 0x3c, 0xe2, 0x6f, 0x43,
682 0x00, 0xfe, 0xbb, 0x10, 0x6e, 0x40, 0x07, 0x78, 0xc0, 0x06, 0x14, 0x84,
683 0x32, 0xc8, 0x10, 0x9c, 0x01, 0x1b, 0x58, 0x20, 0x06, 0xe2, 0x3f, 0xc8,
684 0x30, 0xa8, 0x41, 0x1b, 0x58, 0x00, 0x06, 0xe2, 0x3f, 0xc8, 0x50, 0xb0,
685 0x81, 0x1b, 0x58, 0xd0, 0x89, 0xff, 0x20, 0xc3, 0xe1, 0x06, 0x6f, 0x60,
686 0x81, 0x26, 0xfe, 0x83, 0x0c, 0x7c, 0xe0, 0x06, 0x74, 0x60, 0x59, 0x20,
687 0xfe, 0x83, 0x0c, 0x7e, 0x00, 0x07, 0x75, 0x60, 0x4e, 0x20, 0xfe, 0x96,
688 0x0c, 0xe0, 0x6f, 0x01, 0x03, 0xfe, 0x16, 0x24, 0xe0, 0x6f, 0x01, 0x02,
689 0xfe, 0x16, 0x14, 0xe0, 0x3f, 0xdb, 0x60, 0x07, 0x01, 0x30, 0xdb, 0x10,
690 0x94, 0x42, 0x30, 0xdb, 0x10, 0x94, 0x82, 0x90, 0x41, 0x40, 0x0c, 0x00,
691 0x00, 0x11, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20, 0x20, 0x85, 0xa3, 0x14,
692 0x10, 0x53, 0xd8, 0x72, 0x0c, 0x01, 0x29, 0x1c, 0xa6, 0x80, 0x94, 0xc2,
693 0x96, 0xe3, 0x08, 0x48, 0xe1, 0x30, 0x05, 0xa4, 0x14, 0xb6, 0x1c, 0x4c,
694 0x40, 0x0a, 0x87, 0x29, 0x20, 0xa5, 0xb0, 0xe5, 0x88, 0x02, 0x52, 0x38,
695 0x4c, 0x01, 0x29, 0x85, 0x2d, 0x87, 0x15, 0x90, 0xc2, 0x51, 0x0a, 0x88,
696 0x29, 0x6c, 0x39, 0xc6, 0x20, 0x20, 0x85, 0xa3, 0x14, 0x10, 0x53, 0x00,
697 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00,
698 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xde, 0x05, 0x00, 0x00, 0x00,
699 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x00,
700 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
701 0x00, 0x0f, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00,
702 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
704 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
705 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
706 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
707 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
708 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
709 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00,
710 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x11, 0x00, 0x00,
711 0x00, 0x12, 0x03, 0x94, 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c,
712 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78,
713 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72,
714 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f,
715 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75,
716 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17,
718 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf8, 0x0d, 0x00,
719 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00,
720 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05,
721 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x41, 0x03, 0x00,
722 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
723 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
724 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
725 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32,
726 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14,
727 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e,
728 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
729 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x71, 0x00, 0x00,
730 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0x03,
731 0x40, 0x02, 0x28, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0,
732 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0,
733 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
734 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87,
735 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07,
736 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07,
737 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda,
738 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6,
739 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda,
740 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca,
741 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07,
742 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07,
743 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07,
744 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87,
745 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87,
746 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc,
747 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc,
748 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07,
749 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87,
750 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87,
751 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
752 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca,
753 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda,
754 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00,
755 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03,
756 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87,
757 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
758 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda,
759 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde,
760 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
761 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88,
762 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07,
763 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4,
764 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x03, 0xb0, 0x00, 0x55, 0x90,
765 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d,
766 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b,
767 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0x00, 0x49, 0x18, 0x00,
768 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, 0x00, 0x89, 0x20, 0x00,
769 0x00, 0x18, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85,
770 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90,
771 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x3c, 0x33,
772 0x00, 0xc3, 0x08, 0x04, 0x30, 0x8c, 0x20, 0x00, 0x67, 0x49, 0x53, 0x44,
773 0x09, 0x93, 0xcf, 0x1e, 0xc0, 0x40, 0x44, 0x9c, 0xd3, 0x48, 0x13, 0xd0,
774 0x4c, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x06, 0xa1, 0x10,
775 0x21, 0x41, 0x54, 0x03, 0x01, 0x73, 0x04, 0x60, 0x90, 0x02, 0x38, 0x47,
776 0x00, 0x0a, 0x83, 0x08, 0x80, 0x30, 0x8c, 0x30, 0x00, 0xc3, 0x08, 0x04,
777 0x32, 0x02, 0x00, 0x00, 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e,
778 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c,
779 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d,
780 0xe0, 0xc0, 0x0d, 0xe0, 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e,
781 0xd8, 0x21, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43,
782 0x1b, 0xc0, 0x83, 0x1e, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81,
783 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81,
784 0x1e, 0xe0, 0x41, 0x1b, 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01,
785 0x1e, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81,
786 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1,
787 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01,
788 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81,
789 0x39, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81,
790 0x1c, 0xb4, 0x81, 0x39, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81,
791 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41,
792 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01,
793 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81,
794 0x3d, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81,
795 0x1c, 0xb4, 0x81, 0x3d, 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81,
796 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81,
797 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81,
798 0x1d, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01,
799 0x1e, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81,
800 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43,
801 0x1c, 0xe4, 0x81, 0x1c, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81,
802 0x1c, 0xd4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81,
803 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41,
804 0x1b, 0xd8, 0x43, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81,
805 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01,
806 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81,
807 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81,
808 0x1e, 0xc4, 0x81, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43,
809 0x4a, 0x6c, 0x57, 0xfe, 0xac, 0xb3, 0x20, 0xc3, 0x5f, 0x44, 0x80, 0xc1,
810 0x10, 0xcd, 0x34, 0x24, 0x02, 0xa4, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00,
811 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x36, 0x08, 0x14, 0x1d, 0x1a, 0x00,
812 0x00, 0xc8, 0x02, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
813 0x14, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
814 0xc2, 0x22, 0x28, 0x81, 0x42, 0x18, 0x01, 0x28, 0xa0, 0x82, 0x28, 0x8c,
815 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0xd2, 0x11, 0x80, 0x42, 0x28, 0x88,
816 0xc2, 0x28, 0x90, 0x42, 0x29, 0x98, 0xc2, 0xa1, 0x1c, 0x4b, 0x90, 0x04,
817 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80,
818 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84,
819 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c,
820 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42,
821 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88,
822 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c,
823 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79,
824 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70,
825 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f,
826 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4,
827 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30,
828 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc,
829 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b,
830 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70,
831 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76,
832 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72,
833 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e,
834 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1,
835 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21,
836 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8,
837 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94,
838 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc,
839 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70,
840 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74,
841 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f,
842 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e,
843 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41,
844 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1,
845 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c,
846 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37,
847 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f,
848 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21,
849 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21,
850 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0,
851 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88,
852 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77,
853 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c,
854 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23,
855 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01,
856 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84,
857 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8,
858 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76,
859 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e,
860 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f,
861 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e,
862 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e,
863 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1,
864 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21,
865 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8,
866 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77,
867 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19,
868 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e,
869 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30,
870 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71,
871 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77,
872 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00,
873 0x00, 0xf6, 0x00, 0x00, 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c,
874 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4, 0xca, 0x00, 0x0c, 0x66,
875 0x09, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x52, 0xa6,
876 0x3c, 0x06, 0x83, 0x58, 0x85, 0xf2, 0x48, 0x08, 0x55, 0x30, 0x8c, 0xb2,
877 0x38, 0xcf, 0xf3, 0x44, 0xd7, 0x13, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b,
878 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61,
879 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20,
880 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
881 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20,
882 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30,
883 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c,
884 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e,
885 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61,
886 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
887 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68,
888 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63,
889 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65,
890 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68,
891 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72,
892 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
893 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65,
894 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61,
895 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
896 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
897 0x65, 0x64, 0x28, 0x38, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
898 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x65,
899 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73,
900 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74,
901 0x32, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d,
902 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x67, 0x65, 0x6e,
903 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f,
904 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
905 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69,
906 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a,
907 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
908 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72,
909 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63,
910 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66,
911 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75,
912 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f,
913 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79,
914 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c,
915 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74,
916 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66,
917 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61,
918 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72,
919 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74,
920 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65,
921 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67,
922 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f,
923 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f,
924 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x00, 0x44, 0x64, 0x00,
925 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x80, 0x04, 0x23, 0x08, 0x09,
926 0x35, 0x82, 0x80, 0x08, 0x23, 0x08, 0xc8, 0x30, 0x82, 0x80, 0x10, 0x23,
927 0x08, 0x06, 0x30, 0x82, 0x80, 0x14, 0x23, 0x08, 0x88, 0x31, 0x82, 0x80,
928 0x1c, 0x23, 0x08, 0x08, 0x32, 0x82, 0x80, 0x24, 0x23, 0x08, 0x88, 0x32,
929 0x82, 0x80, 0x2c, 0x33, 0x0c, 0x66, 0x10, 0x9c, 0xc1, 0x0c, 0x03, 0x1a,
930 0x08, 0x69, 0x30, 0x43, 0x30, 0xcc, 0x30, 0x98, 0x81, 0x19, 0xa8, 0xc1,
931 0x0c, 0x04, 0x81, 0x06, 0x68, 0xa0, 0x06, 0x33, 0x04, 0xc5, 0x0c, 0x81,
932 0x31, 0x43, 0x70, 0xcc, 0x50, 0x20, 0x6a, 0xa0, 0x06, 0x89, 0x32, 0x43,
933 0xb0, 0x07, 0x33, 0x24, 0x6a, 0xb0, 0x30, 0x8d, 0x93, 0x3c, 0x50, 0x34,
934 0x43, 0x82, 0x06, 0x8b, 0xd4, 0x38, 0x89, 0x02, 0x4d, 0x33, 0xa0, 0x81,
935 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5a, 0x1a, 0xa4, 0x81, 0x1a, 0x64, 0x5b,
936 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0x9c, 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0xdd,
937 0x1b, 0xa4, 0x81, 0x1a, 0x64, 0x1e, 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x5f,
938 0x1c, 0xa4, 0x81, 0x1a, 0x64, 0x60, 0x20, 0x07, 0x69, 0xa0, 0x06, 0x59,
939 0x18, 0xcc, 0x20, 0x99, 0x01, 0x55, 0xb1, 0x81, 0xa5, 0x06, 0x68, 0x70,
940 0x61, 0x7f, 0x20, 0x06, 0x6c, 0x30, 0x06, 0x69, 0x90, 0x90, 0x01, 0x54,
941 0x06, 0x33, 0x0c, 0x7d, 0xe0, 0x07, 0xa0, 0x30, 0xc3, 0xb0, 0x06, 0x7c,
942 0x10, 0x0a, 0xd5, 0x01, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0x1c, 0xc7,
943 0x71, 0x9c, 0x1b, 0xb8, 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e,
944 0x70, 0xac, 0xc0, 0x0a, 0x62, 0xe3, 0x17, 0x74, 0x20, 0x23, 0x81, 0x09,
945 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, 0xad,
946 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0x41, 0x0e, 0xe6, 0xe0,
947 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x51,
948 0x02, 0x3a, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, 0x2e,
949 0xed, 0xcd, 0x6d, 0x94, 0xa0, 0x0e, 0x8e, 0x0a, 0x4b, 0x93, 0x73, 0x61,
950 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, 0x9b,
951 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0xb0, 0x83, 0x9b, 0xc2, 0xd2, 0xe4, 0x5c,
952 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, 0xd2,
953 0xde, 0xdc, 0xe6, 0x46, 0x19, 0xee, 0x00, 0x0f, 0xf2, 0xe0, 0x98, 0xb0,
954 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0x51,
955 0x82, 0x50, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00,
956 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70,
957 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82,
958 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6,
959 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60,
960 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20,
961 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87,
962 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07,
963 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d,
964 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc,
965 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2,
966 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8,
967 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80,
968 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00,
969 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03,
970 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00,
971 0x00, 0x61, 0x20, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41,
972 0x2c, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x84, 0x65, 0x30,
973 0x03, 0x40, 0x5a, 0x06, 0xd4, 0x73, 0x10, 0x04, 0x41, 0x64, 0x04, 0x63,
974 0x04, 0x20, 0x08, 0x82, 0xf8, 0x47, 0x3c, 0x03, 0x00, 0xf1, 0x30, 0x00,
975 0x00, 0x38, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0x48,
976 0x3d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x90, 0x81, 0x05, 0x00, 0x00,
977 0x00, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65,
978 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d,
979 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61,
980 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20,
981 0x54, 0x42, 0x41, 0x41, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61,
982 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c,
983 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d,
984 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61,
985 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28,
986 0x32, 0x29, 0x00, 0x00, 0x00, 0x13, 0x04, 0x85, 0x99, 0x20, 0x28, 0xcd,
987 0x04, 0x41, 0x71, 0x26, 0x08, 0xca, 0x33, 0x41, 0x50, 0xa0, 0x09, 0x82,
988 0x12, 0x4d, 0x10, 0x14, 0x69, 0x82, 0xa0, 0x4c, 0x2b, 0x04, 0x58, 0x30,
989 0x85, 0x15, 0x43, 0x2c, 0xc0, 0xc2, 0x29, 0x6c, 0x08, 0x4a, 0x61, 0xc3,
990 0x40, 0x0a, 0xb2, 0x80, 0x0a, 0x1b, 0x86, 0x6c, 0x16, 0x50, 0x61, 0x43,
991 0x34, 0x0a, 0xb4, 0x80, 0x0a, 0xb4, 0x90, 0x0a, 0xb4, 0xa0, 0x0a, 0xb4,
992 0xb0, 0x0a, 0xb4, 0xc0, 0x0a, 0xb4, 0xd0, 0x0a, 0xb4, 0xe0, 0x0a, 0xb4,
993 0xf0, 0x0a, 0x1b, 0x86, 0x5a, 0xa0, 0x85, 0x55, 0xd8, 0x10, 0xc4, 0x02,
994 0x00, 0x7b, 0x86, 0x43, 0x32, 0x28, 0x80, 0x31, 0xc7, 0x30, 0x04, 0xd4,
995 0x20, 0x43, 0x40, 0x18, 0x73, 0x0c, 0x81, 0x81, 0x58, 0xd0, 0x88, 0x7f,
996 0x06, 0x01, 0x31, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x8a, 0x20,
997 0xa8, 0x85, 0xc3, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00,
998 0x00, 0x03, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xf3,
999 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00,
1000 0x00, 0x1f, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xf0, 0x00, 0x00, 0x00,
1001 0x00, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
1002 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
1003 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1004 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00,
1005 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
1006 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
1007 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1010 0xff, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00,
1011 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x7b, 0x00, 0x00, 0x00,
1012 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x53, 0x6f, 0x6c, 0x69, 0x64, 0x5f, 0x66,
1013 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x33, 0x32, 0x30, 0x32, 0x33,
1014 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70,
1015 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30,
1016 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72,
1017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17,
1018 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0x1f, 0x00,
1019 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00,
1020 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05,
1021 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x04, 0x07, 0x00,
1022 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
1023 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
1024 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
1025 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32,
1026 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14,
1027 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e,
1028 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
1029 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x64, 0x01, 0x00,
1030 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03,
1031 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0,
1032 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0,
1033 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
1034 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87,
1035 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07,
1036 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07,
1037 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda,
1038 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6,
1039 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda,
1040 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca,
1041 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07,
1042 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07,
1043 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07,
1044 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87,
1045 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87,
1046 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc,
1047 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc,
1048 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07,
1049 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87,
1050 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87,
1051 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
1052 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca,
1053 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda,
1054 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00,
1055 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03,
1056 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87,
1057 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
1058 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda,
1059 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde,
1060 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
1061 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88,
1062 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07,
1063 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4,
1064 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90,
1065 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d,
1066 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b,
1067 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x18, 0x0a,
1068 0x60, 0x01, 0xaa, 0x0d, 0x06, 0x61, 0x00, 0x0b, 0x50, 0x6d, 0x08, 0x93,
1069 0xe2, 0xff, 0xff, 0xff, 0xff, 0x07, 0x60, 0x0d, 0x00, 0x09, 0xa8, 0x88,
1070 0x70, 0x80, 0x07, 0x78, 0x90, 0x87, 0x77, 0xc0, 0x87, 0x36, 0x30, 0x87,
1071 0x7a, 0x70, 0x87, 0x71, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87,
1072 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
1073 0xa2, 0x1d, 0xd2, 0xc1, 0x1d, 0xda, 0x80, 0x1d, 0xca, 0xe1, 0x1c, 0xc2,
1074 0x81, 0x1d, 0xda, 0xc0, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4,
1075 0xa1, 0x0d, 0xee, 0x21, 0x1d, 0xc8, 0x81, 0x1e, 0xd0, 0x01, 0x88, 0x03,
1076 0x39, 0xc0, 0x03, 0x60, 0x70, 0x87, 0x77, 0x68, 0x03, 0x71, 0xa8, 0x87,
1077 0x74, 0x60, 0x07, 0x7a, 0x48, 0x07, 0x77, 0x98, 0x07, 0x80, 0x70, 0x87,
1078 0x77, 0x68, 0x03, 0x73, 0x90, 0x87, 0x70, 0x68, 0x87, 0x72, 0x68, 0x03,
1079 0x78, 0x78, 0x87, 0x74, 0x70, 0x07, 0x7a, 0x28, 0x07, 0x79, 0x68, 0x83,
1080 0x72, 0x60, 0x87, 0x74, 0x68, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca,
1081 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda,
1082 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca,
1083 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0xa1, 0x0d, 0xdc,
1084 0xe1, 0x1d, 0xdc, 0xa1, 0x0d, 0xd8, 0xa1, 0x1c, 0xc2, 0xc1, 0x1c, 0x00,
1085 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x83,
1086 0x74, 0x70, 0x07, 0x73, 0x98, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83,
1087 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca,
1088 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1d, 0xc2, 0xc1, 0x1d, 0xe6,
1089 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0,
1090 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87,
1091 0x36, 0x98, 0x87, 0x74, 0x38, 0x07, 0x77, 0x28, 0x07, 0x72, 0x68, 0x03,
1092 0x7d, 0x28, 0x07, 0x79, 0x78, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87,
1093 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
1094 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe8, 0x41, 0x1e, 0xc2,
1095 0x01, 0x1e, 0xe0, 0x21, 0x1d, 0xdc, 0xe1, 0x1c, 0xda, 0xa0, 0x1d, 0xc2,
1096 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x88,
1097 0x79, 0xa0, 0x87, 0x70, 0x18, 0x87, 0x75, 0x68, 0x03, 0x78, 0x90, 0x87,
1098 0x77, 0xa0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x03,
1099 0x71, 0xa8, 0x07, 0x73, 0x30, 0x87, 0x72, 0x90, 0x87, 0x36, 0x98, 0x87,
1100 0x74, 0xd0, 0x87, 0x72, 0x00, 0xf0, 0x00, 0x20, 0xea, 0xc1, 0x1d, 0xe6,
1101 0x21, 0x1c, 0xcc, 0xa1, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda,
1102 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07,
1103 0x60, 0x43, 0x62, 0x08, 0xc0, 0x02, 0x54, 0x41, 0x1a, 0x80, 0xc1, 0x06,
1104 0xe3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x00, 0x6a, 0x83, 0x8f,
1105 0x20, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00,
1106 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80, 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0,
1107 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40,
1108 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b,
1109 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b, 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b,
1110 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b,
1111 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d, 0xa0, 0x03, 0x90, 0x07, 0x76, 0x00,
1112 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0e, 0xf5, 0x90, 0x0e, 0xec, 0x40,
1113 0x0f, 0xe9, 0xe0, 0x0e, 0xf3, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x60,
1114 0x0e, 0xf2, 0x10, 0x0e, 0xed, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0xef, 0x90,
1115 0x0e, 0xee, 0x40, 0x0f, 0xe5, 0x20, 0x0f, 0x6d, 0x50, 0x0e, 0xec, 0x90,
1116 0x0e, 0xed, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b,
1117 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b,
1118 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b,
1119 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0xb4, 0x81, 0x3b, 0xbc, 0x83, 0x3b,
1120 0xb4, 0x01, 0x3b, 0x94, 0x43, 0x38, 0x98, 0x03, 0x40, 0x0f, 0xf2, 0x50,
1121 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60,
1122 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40,
1123 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b,
1124 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39,
1125 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20,
1126 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xf3, 0x90,
1127 0x0e, 0xe7, 0xe0, 0x0e, 0xe5, 0x40, 0x0e, 0x6d, 0xa0, 0x0f, 0xe5, 0x20,
1128 0x0f, 0xef, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10,
1129 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40,
1130 0xb8, 0xc3, 0x3b, 0xb4, 0x01, 0x3d, 0xc8, 0x43, 0x38, 0xc0, 0x03, 0x3c,
1131 0xa4, 0x83, 0x3b, 0x9c, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a,
1132 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10,
1133 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50,
1134 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60,
1135 0x0e, 0xe6, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50,
1136 0x0e, 0x00, 0x1e, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39,
1137 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d,
1138 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x6c, 0x50, 0x92,
1139 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x36, 0x00, 0xd6, 0x00, 0x90, 0x80,
1140 0x6a, 0x83, 0xa1, 0x04, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x45, 0x00, 0x16,
1141 0xa0, 0xda, 0xa0, 0x30, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00,
1142 0xac, 0x01, 0x20, 0x01, 0xd5, 0x86, 0xa9, 0xf9, 0xff, 0xff, 0xff, 0xff,
1143 0x01, 0x58, 0x03, 0x40, 0x19, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea,
1144 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0xd8, 0x50,
1145 0x38, 0x42, 0x90, 0x06, 0x60, 0xb0, 0xc1, 0x78, 0xfe, 0xff, 0xff, 0xff,
1146 0x7f, 0x00, 0x24, 0x80, 0xda, 0x10, 0x41, 0xff, 0xff, 0xff, 0xff, 0x3f,
1147 0x00, 0xca, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe9, 0xc0,
1148 0x0e, 0xf4, 0x90, 0x0e, 0xee, 0x30, 0x0f, 0x00, 0x00, 0x49, 0x18, 0x00,
1149 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x42,
1150 0x61, 0x4c, 0x08, 0x8e, 0x09, 0x01, 0x32, 0x61, 0x48, 0x94, 0x65, 0xc2,
1151 0xc0, 0x28, 0xcb, 0x04, 0xa1, 0x71, 0x26, 0x04, 0xcf, 0x84, 0x00, 0x02,
1152 0x00, 0x89, 0x20, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88,
1153 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23,
1154 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4,
1155 0x4c, 0x10, 0xb4, 0xc1, 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08,
1156 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11,
1157 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00,
1158 0x00, 0x80, 0x41, 0x84, 0x41, 0x38, 0x4a, 0x9a, 0x22, 0x4a, 0x98, 0xfc,
1159 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0xfe, 0x69, 0x8c, 0x00,
1160 0x18, 0x44, 0x28, 0x82, 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x25,
1161 0x80, 0x79, 0x16, 0x22, 0xfa, 0xa7, 0x31, 0x02, 0x60, 0x10, 0xe1, 0x10,
1162 0xca, 0x11, 0x04, 0x81, 0x40, 0x18, 0x08, 0x25, 0x65, 0x08, 0x02, 0x82,
1163 0x96, 0x61, 0x84, 0x01, 0x28, 0x44, 0xd3, 0x34, 0x0d, 0x39, 0x65, 0x00,
1164 0x00, 0x80, 0xa0, 0x22, 0x00, 0x00, 0x49, 0x73, 0x04, 0x41, 0x11, 0x28,
1165 0x80, 0xaa, 0x32, 0x00, 0x4d, 0x43, 0x57, 0x31, 0x9a, 0x06, 0x00, 0x00,
1166 0x80, 0xb2, 0x32, 0x34, 0x4d, 0x43, 0x5b, 0x11, 0x9a, 0x86, 0xba, 0x39,
1167 0x02, 0xc4, 0x08, 0xc1, 0x37, 0x47, 0x00, 0x06, 0xc3, 0x08, 0x42, 0x18,
1168 0x14, 0x05, 0x34, 0x10, 0x81, 0x12, 0x29, 0x00, 0x08, 0x69, 0x1c, 0x08,
1169 0x48, 0x81, 0x70, 0x04, 0x60, 0x8e, 0x00, 0x14, 0x06, 0x11, 0x00, 0x61,
1170 0x0a, 0x60, 0x18, 0x61, 0x08, 0x83, 0x61, 0x04, 0x22, 0x0c, 0x00, 0x00,
1171 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda,
1172 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec,
1173 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0,
1174 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8,
1175 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e,
1176 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
1177 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b,
1178 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a,
1179 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d,
1180 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e,
1181 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d,
1182 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c,
1183 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39,
1184 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
1185 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e,
1186 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c,
1187 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c,
1188 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d,
1189 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
1190 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e,
1191 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c,
1192 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d,
1193 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e,
1194 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c,
1195 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d,
1196 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d,
1197 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d,
1198 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d,
1199 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d,
1200 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c,
1201 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d,
1202 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x46, 0x6c, 0x57, 0xfe,
1203 0x9c, 0xf3, 0x60, 0x7f, 0x11, 0x01, 0x06, 0x43, 0x34, 0xd3, 0x90, 0x08,
1204 0x88, 0x12, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
1205 0x18, 0x12, 0x45, 0x78, 0xb0, 0x20, 0xc0, 0x20, 0x00, 0x00, 0x00, 0x04,
1206 0x00, 0x00, 0x00, 0xc0, 0x90, 0x28, 0x15, 0x28, 0x07, 0x08, 0x80, 0x01,
1207 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44, 0xbd, 0x00, 0x41,
1208 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x24,
1209 0x6a, 0x87, 0x48, 0x02, 0x02, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
1210 0x00, 0x80, 0x21, 0x91, 0x3f, 0x58, 0x15, 0x10, 0x00, 0x03, 0x00, 0x00,
1211 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, 0x68, 0xa2, 0xb9, 0x80, 0x00,
1212 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x48, 0x14, 0x16,
1213 0x59, 0x86, 0x00, 0x03, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
1214 0x43, 0x22, 0xbd, 0x88, 0x20, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01,
1215 0x00, 0x00, 0x00, 0x18, 0x12, 0xad, 0x86, 0xb4, 0x01, 0x01, 0x30, 0x00,
1216 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x90, 0xa8, 0x37, 0xa6, 0x0e,
1217 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86, 0x44,
1218 0xf0, 0x31, 0x6d, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
1219 0x00, 0x30, 0x24, 0x1a, 0x91, 0x6d, 0x0c, 0x80, 0x00, 0x28, 0x00, 0x00,
1220 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x62, 0x83, 0x40, 0xd1, 0x82, 0x03,
1221 0x00, 0x80, 0x2c, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98,
1222 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43,
1223 0x0a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20,
1224 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7, 0x14, 0x08, 0x1d, 0x01,
1225 0x28, 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x32,
1226 0xc7, 0x12, 0x24, 0x01, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
1227 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
1228 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
1229 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
1230 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
1231 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
1232 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
1233 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
1234 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
1235 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
1236 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
1237 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
1238 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
1239 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
1240 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
1241 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
1242 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
1243 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
1244 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
1245 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
1246 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
1247 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
1248 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
1249 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
1250 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
1251 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
1252 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
1253 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
1254 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
1255 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
1256 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
1257 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
1258 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
1259 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
1260 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
1261 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
1262 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
1263 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
1264 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
1265 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
1266 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
1267 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
1268 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
1269 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
1270 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
1271 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
1272 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
1273 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
1274 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
1275 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
1276 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
1277 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
1278 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
1279 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
1280 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
1281 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
1282 0x00, 0x79, 0x20, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08,
1283 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4,
1284 0xde, 0x00, 0x0d, 0x48, 0x0b, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41,
1285 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca,
1286 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f,
1287 0xb0, 0x28, 0xd8, 0xb0, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b,
1288 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61,
1289 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20,
1290 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
1291 0x6e, 0x20, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20,
1292 0x28, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30,
1293 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c,
1294 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e,
1295 0x64, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61,
1296 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
1297 0x6c, 0x65, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68,
1298 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63,
1299 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65,
1300 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68,
1301 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72,
1302 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
1303 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65,
1304 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61,
1305 0x69, 0x72, 0x2e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61,
1306 0x69, 0x72, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72,
1307 0x2e, 0x6e, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74,
1308 0x69, 0x76, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e,
1309 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61,
1310 0x69, 0x72, 0x2e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
1311 0x69, 0x6e, 0x70, 0x75, 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
1312 0x65, 0x64, 0x28, 0x35, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34,
1313 0x5f, 0x66, 0x29, 0x61, 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70,
1314 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67,
1315 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65,
1316 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29,
1317 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f,
1318 0x72, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
1319 0x61, 0x69, 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73,
1320 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74,
1321 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72,
1322 0x2e, 0x72, 0x65, 0x61, 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72,
1323 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66,
1324 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f,
1325 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72,
1326 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f,
1327 0x74, 0x79, 0x70, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63,
1328 0x61, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d,
1329 0x65, 0x74, 0x68, 0x6f, 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70,
1330 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65,
1331 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73,
1332 0x64, 0x72, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69,
1333 0x6e, 0x74, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79,
1334 0x70, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61,
1335 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67,
1336 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72,
1337 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x61, 0x69,
1338 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69, 0x72,
1339 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74, 0x75,
1340 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20,
1341 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x61, 0x69,
1342 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d,
1343 0x70, 0x6c, 0x65, 0x72, 0x73, 0x24, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00,
1344 0x00, 0x30, 0x82, 0x10, 0x06, 0xcd, 0x08, 0x82, 0x19, 0x88, 0xc1, 0x08,
1345 0x42, 0x18, 0x38, 0x23, 0x08, 0x61, 0xf0, 0x8c, 0x20, 0x84, 0x01, 0x34,
1346 0x82, 0xa0, 0x00, 0x23, 0x08, 0x61, 0x10, 0x8d, 0x20, 0x84, 0x81, 0x34,
1347 0x82, 0x10, 0x06, 0xd3, 0x08, 0x42, 0x18, 0x50, 0x23, 0x08, 0x61, 0x50,
1348 0x8d, 0x20, 0x84, 0x81, 0x35, 0x82, 0x10, 0x06, 0xd7, 0x08, 0x42, 0x18,
1349 0x60, 0x23, 0x08, 0x61, 0x90, 0xcd, 0x30, 0xc0, 0x41, 0x10, 0x07, 0x33,
1350 0x0c, 0x72, 0x20, 0xcc, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0x00, 0x07, 0x70,
1351 0x40, 0x07, 0x33, 0x10, 0x84, 0x1c, 0xc8, 0x01, 0x1d, 0xcc, 0x10, 0x14,
1352 0x33, 0x04, 0xc6, 0x0c, 0xc1, 0x31, 0x43, 0x81, 0xd0, 0x01, 0x1d, 0x24,
1353 0xca, 0x0c, 0xc1, 0x29, 0xcc, 0x80, 0xd0, 0xc1, 0xc2, 0x34, 0x89, 0xe2,
1354 0x3c, 0x33, 0x24, 0x72, 0x00, 0x45, 0x8c, 0x94, 0x28, 0xce, 0x34, 0x43,
1355 0x02, 0x07, 0x10, 0xc5, 0x48, 0x49, 0xe5, 0x58, 0x33, 0xa0, 0x01, 0x1d,
1356 0xcc, 0x01, 0x1d, 0x70, 0xdd, 0x1c, 0xcc, 0x01, 0x1d, 0x70, 0x1e, 0x1e,
1357 0xcc, 0x01, 0x1d, 0x70, 0x5f, 0x1e, 0xcc, 0x01, 0x1d, 0x70, 0x60, 0xa0,
1358 0x07, 0x73, 0x40, 0x07, 0x5c, 0x18, 0xec, 0xc1, 0x1c, 0xd0, 0x01, 0x27,
1359 0x06, 0x7c, 0x30, 0x07, 0x74, 0xc0, 0x8d, 0x41, 0x1f, 0xcc, 0x01, 0x1d,
1360 0x70, 0x64, 0x30, 0x83, 0x64, 0x07, 0x17, 0x76, 0x07, 0x19, 0x1d, 0xc8,
1361 0x81, 0xb6, 0xb1, 0x42, 0x19, 0xdc, 0x81, 0x19, 0xcc, 0x41, 0x72, 0x06,
1362 0x0e, 0x1a, 0xcc, 0xa0, 0xcc, 0x41, 0x1a, 0x64, 0x74, 0x20, 0x07, 0x6a,
1363 0x90, 0xac, 0x81, 0xc3, 0x06, 0x33, 0x24, 0x7e, 0xd0, 0x06, 0x19, 0x1d,
1364 0xc8, 0x41, 0xe2, 0x06, 0xce, 0x1b, 0xcc, 0x60, 0xa4, 0x82, 0x2a, 0xac,
1365 0x42, 0x2b, 0xb8, 0xc2, 0x2b, 0xcc, 0x30, 0xd4, 0x01, 0x2a, 0xc0, 0x42,
1366 0x89, 0x01, 0x20, 0x06, 0x68, 0x20, 0x06, 0x62, 0x20, 0x06, 0x9c, 0x18,
1367 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18,
1368 0xb8, 0x81, 0x1b, 0x58, 0x74, 0xa0, 0x07, 0x96, 0x65, 0xe9, 0x01, 0x67,
1369 0x0a, 0xac, 0xc0, 0x0a, 0x74, 0xe3, 0x17, 0xf6, 0xa0, 0x0e, 0xb8, 0x20,
1370 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d,
1371 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0xc1,
1372 0x0f, 0xfe, 0xe0, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32,
1373 0x37, 0xba, 0x51, 0x02, 0x50, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae,
1374 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0x20, 0x14, 0x8e, 0x0a, 0x4b,
1375 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2,
1376 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0x10, 0x85, 0x9b, 0xc2,
1377 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde,
1378 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x46, 0x81, 0x14, 0x4a,
1379 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32,
1380 0x37, 0xba, 0x51, 0x02, 0x58, 0x00, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00,
1381 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80,
1382 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43,
1383 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e,
1384 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
1385 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4,
1386 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81,
1387 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08,
1388 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01,
1389 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c,
1390 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c,
1391 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c,
1392 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1,
1393 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00,
1394 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c,
1395 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90,
1396 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x3e, 0x00, 0x00,
1397 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
1398 0x00, 0x44, 0xd5, 0xc0, 0x08, 0x00, 0x89, 0x23, 0x00, 0x04, 0x8c, 0x00,
1399 0x00, 0xf1, 0x30, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8,
1400 0x90, 0x51, 0x12, 0x44, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x63, 0x80, 0x61,
1401 0x16, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73,
1402 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f,
1403 0x70, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29,
1404 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
1405 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73,
1406 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
1407 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73,
1408 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63,
1409 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00, 0x00,
1410 0x00, 0x2b, 0x04, 0x5b, 0x90, 0x85, 0x15, 0xc3, 0x2d, 0xd8, 0xc2, 0x2c,
1411 0xac, 0x18, 0x70, 0xc1, 0x16, 0x68, 0x61, 0xc5, 0x90, 0x0b, 0xb6, 0x50,
1412 0x0b, 0x1b, 0x04, 0x5c, 0xb8, 0x85, 0x0d, 0x41, 0x2e, 0x00, 0x00, 0x00,
1413 0x00, 0x23, 0x06, 0x8d, 0x11, 0x82, 0x60, 0x30, 0x06, 0x61, 0x60, 0x14,
1414 0x08, 0x21, 0x0c, 0x41, 0xd0, 0x8d, 0x26, 0x04, 0xc0, 0x88, 0xc1, 0x71,
1415 0xc4, 0x20, 0x58, 0xf8, 0xc7, 0xe2, 0x06, 0x41, 0x62, 0x01, 0x23, 0xfe,
1416 0x19, 0x04, 0xc4, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0,
1417 0xc8, 0x05, 0x44, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
1418 0x00, 0xe3, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00,
1419 0x00, 0x4f, 0x00, 0x00, 0x00, 0x14, 0x96, 0xc3, 0x0c, 0x40, 0x31, 0x10,
1420 0x5a, 0x02, 0x45, 0x40, 0xeb, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0xc4,
1421 0xce, 0x41, 0x40, 0x4e, 0x63, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c, 0x04,
1422 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba, 0x3d,
1423 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0, 0xc7,
1424 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c, 0x11,
1425 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec, 0x8d,
1426 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2, 0xed,
1427 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a, 0x73,
1428 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0x8c,
1429 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x03, 0x40, 0xc1, 0x0c, 0xc0,
1430 0x0c, 0xc0, 0x1c, 0xc4, 0x1c, 0xe4, 0xc1, 0x1c, 0xf0, 0x01, 0x35, 0x33,
1431 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8, 0x07,
1432 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0, 0xb6,
1433 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f, 0x7a,
1434 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6, 0xbf,
1435 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b, 0x0e,
1436 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60, 0x30,
1437 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e, 0x06,
1438 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3, 0x60,
1439 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06, 0x63,
1440 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63, 0x00,
1441 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff, 0x81,
1442 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58, 0xc3,
1443 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2, 0x71,
1444 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad, 0x1b,
1445 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0xf1, 0x30, 0x00,
1446 0x00, 0x32, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x0e, 0xc4,
1447 0x1d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x00, 0x00, 0x5f, 0x5a, 0x54,
1448 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e,
1449 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e, 0x69, 0x70, 0x6f,
1450 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x53, 0x69, 0x6d,
1451 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54, 0x42, 0x41, 0x41,
1452 0x00, 0x13, 0x04, 0x34, 0xd0, 0x26, 0x08, 0x68, 0xb0, 0x4d, 0x10, 0xd0,
1453 0x80, 0x9b, 0x20, 0xa0, 0x41, 0x37, 0x41, 0x40, 0x03, 0x6f, 0x82, 0x80,
1454 0x06, 0xdf, 0x04, 0x01, 0x0d, 0xc0, 0x60, 0x82, 0x80, 0x06, 0x61, 0xb0,
1455 0x21, 0xa0, 0x85, 0x0d, 0xc3, 0x2c, 0xf4, 0x42, 0x2d, 0x6c, 0x18, 0x38,
1456 0x5f, 0xa8, 0x85, 0x0d, 0x91, 0x2c, 0xfc, 0x42, 0x2d, 0xfc, 0x82, 0x2d,
1457 0xfc, 0xc2, 0x2d, 0xfc, 0x02, 0x2e, 0xfc, 0x42, 0x2e, 0xfc, 0x82, 0x2e,
1458 0xfc, 0xc2, 0x2e, 0xfc, 0x02, 0x2f, 0x6c, 0x18, 0xc0, 0xe1, 0x17, 0x6e,
1459 0x61, 0xc3, 0x00, 0x0e, 0xbf, 0xc0, 0x0b, 0x1b, 0x06, 0x70, 0xf8, 0x85,
1460 0x5c, 0xd8, 0x30, 0x80, 0xc3, 0x2f, 0xe8, 0xc2, 0x86, 0x01, 0x1c, 0x7e,
1461 0x61, 0x17, 0x36, 0x0c, 0xe0, 0xf0, 0x0b, 0xb6, 0xb0, 0x61, 0x00, 0x87,
1462 0x5f, 0xc0, 0x85, 0x0d, 0x03, 0x38, 0xfc, 0x42, 0x2d, 0x00, 0x00, 0x00,
1463 0x00, 0x7b, 0x18, 0xd2, 0x60, 0x0e, 0x40, 0x81, 0x02, 0x60, 0x0c, 0x47,
1464 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xb4, 0xc1,
1465 0x64, 0x06, 0x7b, 0x18, 0xda, 0xe0, 0x0e, 0xd8, 0x80, 0x02, 0x60, 0x8c,
1466 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xa9, 0x30, 0x8c, 0x18,
1467 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xab, 0x10, 0x40, 0x16, 0x40,
1468 0xe0, 0x3f, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xad, 0x42,
1469 0x50, 0xd9, 0x10, 0x89, 0xbf, 0x45, 0x41, 0xf8, 0xdb, 0x10, 0x90, 0xff,
1470 0x88, 0x81, 0x81, 0x84, 0x20, 0x58, 0xf8, 0x47, 0x07, 0x0b, 0xc1, 0x88,
1471 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0x26, 0x0b, 0xc1, 0x64, 0xc1,
1472 0x24, 0xfe, 0x73, 0x0c, 0xdd, 0x32, 0x0a, 0x83, 0x0c, 0x81, 0x37, 0x07,
1473 0x36, 0x04, 0xe4, 0x3f, 0xc8, 0x10, 0x80, 0x01, 0x1d, 0x0c, 0x32, 0x04,
1474 0x7e, 0x40, 0x07, 0xb3, 0x04, 0xc2, 0x40, 0x45, 0x20, 0x04, 0xfe, 0x00,
1475 0xec, 0x61, 0xf8, 0x83, 0x54, 0xa0, 0x05, 0x0a, 0x80, 0x31, 0x1c, 0x11,
1476 0xb0, 0x81, 0xe3, 0x1f, 0xb3, 0x0c, 0x03, 0x11, 0x0c, 0x32, 0x10, 0x69,
1477 0xc0, 0x07, 0x7b, 0x18, 0x46, 0xa1, 0x15, 0x5c, 0x81, 0x02, 0x60, 0xec,
1478 0x61, 0x28, 0x85, 0x57, 0x10, 0x05, 0x0a, 0x80, 0x31, 0x62, 0xa0, 0x24,
1479 0x31, 0x08, 0x16, 0xfe, 0x91, 0x91, 0x43, 0xd1, 0x1d, 0x43, 0x30, 0xc8,
1480 0x10, 0xb0, 0x01, 0x28, 0x0c, 0x32, 0x04, 0x0b, 0x28, 0xcc, 0x12, 0x10,
1481 0x03, 0x15, 0x81, 0x30, 0x60, 0xc2, 0x70, 0x44, 0x18, 0xf0, 0x41, 0xe0,
1482 0x1f, 0xb3, 0x0c, 0xc5, 0x14, 0xec, 0x61, 0x60, 0x05, 0x5b, 0x10, 0x07,
1483 0x0a, 0x80, 0x31, 0x1c, 0x11, 0xfc, 0x41, 0xe0, 0x1f, 0xb3, 0x0c, 0xc6,
1484 0x11, 0x0c, 0x32, 0x14, 0x76, 0x90, 0x0a, 0x7b, 0x18, 0x60, 0x41, 0x17,
1485 0xc6, 0x81, 0x02, 0x60, 0xcc, 0x31, 0xd8, 0x41, 0xc0, 0x0b, 0x83, 0x0c,
1486 0xc1, 0x1d, 0xb0, 0x82, 0x05, 0x85, 0xf8, 0x0f, 0x32, 0x04, 0x79, 0xd0,
1487 0x0a, 0xb3, 0x04, 0x6d, 0xb0, 0x87, 0xc1, 0x16, 0xc0, 0x41, 0x1d, 0x28,
1488 0x00, 0xc6, 0x1e, 0x06, 0x5c, 0x10, 0x87, 0x75, 0xa0, 0x00, 0x18, 0x83,
1489 0x0c, 0x50, 0x28, 0xc8, 0xc2, 0x88, 0x41, 0x81, 0x84, 0x20, 0x18, 0x54,
1490 0xfa, 0x40, 0xcc, 0x32, 0x20, 0x52, 0x30, 0x86, 0x20, 0x99, 0xc3, 0x70,
1491 0x44, 0xd0, 0x0a, 0x8a, 0x7f, 0xcc, 0x32, 0x28, 0x49, 0x60, 0x42, 0x2b,
1492 0x88, 0xff, 0x2c, 0xc1, 0x62, 0x43, 0x2b, 0x80, 0xff, 0x88, 0x81, 0x81,
1493 0x84, 0x20, 0x58, 0xf8, 0x87, 0x04, 0x12, 0x81, 0x05, 0xae, 0x20, 0xfe,
1494 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x48, 0x04, 0xae,
1495 0x30, 0x4b, 0xb0, 0x0c, 0x54, 0x00, 0x4a, 0x22, 0x28, 0x73, 0x0c, 0xaa,
1496 0x10, 0xb8, 0xc3, 0x18, 0xc2, 0x16, 0x0e, 0xc3, 0x11, 0x81, 0x2d, 0x28,
1497 0xfe, 0x31, 0xcb, 0xd0, 0x30, 0x81, 0x09, 0xb6, 0x20, 0xfe, 0xb3, 0x04,
1498 0x8e, 0x0d, 0xb6, 0x00, 0xfe, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1,
1499 0x1f, 0x52, 0x4a, 0x04, 0x16, 0xdc, 0x82, 0xf8, 0x8f, 0x18, 0x1c, 0x48,
1500 0x08, 0x82, 0x85, 0x7f, 0x40, 0x2c, 0x11, 0xdc, 0xc2, 0x2c, 0x81, 0x33,
1501 0x50, 0x01, 0x28, 0x8c, 0xd0, 0xcc, 0x31, 0x24, 0x41, 0x3a, 0x8c, 0x21,
1502 0x90, 0x41, 0x3a, 0x0c, 0x47, 0x04, 0xbf, 0xa0, 0xf8, 0xc7, 0x2c, 0x03,
1503 0xf4, 0x04, 0x26, 0xfc, 0x82, 0xf8, 0xcf, 0x12, 0x44, 0x36, 0xfc, 0x02,
1504 0xf8, 0x8f, 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x48, 0x32, 0x11,
1505 0x58, 0x00, 0x0e, 0xe2, 0x3f, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe,
1506 0x01, 0xd5, 0x44, 0x00, 0x0e, 0xb3, 0x04, 0xd1, 0x40, 0x05, 0xa0, 0x3c,
1507 0x02, 0x34, 0xc7, 0x90, 0x04, 0xf1, 0x30, 0x4b, 0x20, 0x0d, 0x54, 0x04,
1508 0x42, 0xa4, 0x07, 0xc7, 0x20, 0x43, 0xf0, 0x0b, 0xf2, 0x30, 0xc7, 0xd0,
1509 0x0b, 0x60, 0x30, 0x12, 0x83, 0x0c, 0x81, 0x2f, 0xcc, 0x83, 0x0d, 0x81,
1510 0xf8, 0x0f, 0x32, 0x04, 0xe0, 0x40, 0x0f, 0xb3, 0x04, 0x6d, 0x30, 0x1c,
1511 0x31, 0x0b, 0xe6, 0x10, 0xf8, 0xc7, 0x2c, 0x03, 0x05, 0x06, 0xc1, 0x20,
1512 0x03, 0x1d, 0x94, 0x03, 0x3e, 0xec, 0x61, 0xf8, 0x87, 0x94, 0x98, 0x09,
1513 0x0a, 0x80, 0xb1, 0x87, 0x21, 0x24, 0x56, 0x82, 0x26, 0x28, 0x00, 0xc6,
1514 0x1c, 0xc3, 0x39, 0x04, 0x2d, 0x31, 0xc8, 0x10, 0xa0, 0x43, 0x3f, 0x58,
1515 0x70, 0x88, 0xff, 0x20, 0x43, 0xa0, 0x0e, 0xfe, 0x30, 0x62, 0x50, 0x20,
1516 0x21, 0x08, 0x06, 0x95, 0x59, 0x1c, 0xb3, 0x0c, 0x5f, 0x15, 0x8c, 0x21,
1517 0x0c, 0x32, 0x31, 0x1c, 0x11, 0xfc, 0x83, 0xe2, 0x1f, 0xb3, 0x0c, 0x97,
1518 0x15, 0x98, 0xf0, 0x0f, 0xe2, 0x3f, 0x4b, 0x80, 0x8d, 0x18, 0x18, 0x48,
1519 0x08, 0x82, 0x85, 0x7f, 0x48, 0x6b, 0x31, 0x8c, 0x18, 0x1c, 0x48, 0x08,
1520 0x82, 0x85, 0x7f, 0x40, 0x6d, 0x11, 0x80, 0x84, 0x05, 0x20, 0x21, 0xfe,
1521 0x16, 0x80, 0x04, 0xf8, 0xcf, 0x12, 0x60, 0x03, 0x15, 0x80, 0x62, 0x09,
1522 0xd7, 0x1c, 0x83, 0x3c, 0x04, 0x3a, 0x31, 0x86, 0xc0, 0xb4, 0xc4, 0x70,
1523 0x44, 0x80, 0x12, 0x8a, 0x7f, 0xcc, 0x32, 0x68, 0x59, 0x60, 0x02, 0x4a,
1524 0x88, 0xff, 0x2c, 0xc1, 0x36, 0x62, 0x60, 0x20, 0x21, 0x08, 0x16, 0xfe,
1525 0x21, 0xd1, 0xc5, 0x30, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x01,
1526 0xd9, 0x45, 0x90, 0x12, 0x16, 0xa4, 0x84, 0xf8, 0x5b, 0x90, 0x12, 0xe0,
1527 0x3f, 0x4b, 0xb0, 0x0d, 0x54, 0x00, 0x4a, 0x26, 0x68, 0x73, 0x0c, 0x49,
1528 0x50, 0x13, 0x63, 0x08, 0x55, 0x4d, 0x0c, 0x47, 0x04, 0x31, 0xa1, 0xf8,
1529 0xc7, 0x2c, 0x43, 0xc7, 0x05, 0x26, 0xc4, 0x84, 0xf8, 0xcf, 0x12, 0x78,
1530 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x52, 0x5f, 0x0c, 0x23,
1531 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x5f, 0x04, 0x32, 0x61,
1532 0x81, 0x4c, 0x88, 0xbf, 0x05, 0x32, 0x01, 0xfe, 0xb3, 0x04, 0xde, 0x40,
1533 0x05, 0xa0, 0x70, 0x42, 0x37, 0xc7, 0x90, 0x04, 0x3d, 0x31, 0x62, 0x80,
1534 0x20, 0x21, 0x08, 0x16, 0xfe, 0xe1, 0x94, 0x46, 0x60, 0x12, 0x24, 0x31,
1535 0xc8, 0x10, 0xa0, 0x04, 0x4f, 0xcc, 0x12, 0x7c, 0x03, 0x15, 0x81, 0x1f,
1536 0x50, 0x82, 0x37, 0xc8, 0x10, 0xb4, 0x84, 0x4f, 0xcc, 0x12, 0xb4, 0xc1,
1537 0x2c, 0x43, 0x18, 0xb4, 0x01, 0x3f, 0x0c, 0x32, 0xf4, 0x82, 0x4b, 0x84,
1538 0xc5, 0x88, 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0x65, 0x1a, 0x81,
1539 0x48, 0xcc, 0x31, 0xac, 0x44, 0x30, 0x17, 0x23, 0x06, 0x07, 0x12, 0x82,
1540 0x60, 0xe1, 0x1f, 0x17, 0x6a, 0x0c, 0x23, 0x31, 0xc7, 0x20, 0x04, 0x67,
1541 0x31, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x71, 0xa9, 0x46, 0x41,
1542 0x12, 0x73, 0x0c, 0x42, 0x80, 0x16, 0x83, 0x0c, 0x81, 0x4c, 0x98, 0xc5,
1543 0x20, 0x43, 0x50, 0x0e, 0x66, 0xb1, 0x87, 0x01, 0x2e, 0xf4, 0x82, 0x34,
1544 0x28, 0x00, 0xc6, 0x1e, 0x06, 0xb9, 0xe0, 0x8b, 0xd2, 0xa0, 0x00, 0x18,
1545 0x73, 0x0c, 0x38, 0x11, 0xf8, 0xc5, 0x20, 0x43, 0x90, 0x13, 0x6e, 0x61,
1546 0x41, 0x22, 0xfe, 0x83, 0x0c, 0xc1, 0x4e, 0xbc, 0xc5, 0x88, 0x41, 0x81,
1547 0x84, 0x20, 0x18, 0x54, 0xb7, 0x71, 0xcc, 0x32, 0xb0, 0x81, 0x18, 0x04,
1548 0x63, 0x08, 0xc3, 0x68, 0x0c, 0x47, 0x04, 0x70, 0xa1, 0xf8, 0xc7, 0x2c,
1549 0x03, 0x19, 0x8c, 0x41, 0x60, 0x02, 0x5c, 0x88, 0xff, 0x2c, 0x41, 0x19,
1550 0x8c, 0x18, 0x18, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xbc, 0x31, 0x8c,
1551 0x18, 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x40, 0xbe, 0x11, 0xc4, 0x85,
1552 0x05, 0x71, 0x21, 0xfe, 0x16, 0xc4, 0x05, 0xf8, 0xcf, 0x12, 0x94, 0xc1,
1553 0x40, 0x05, 0xa0, 0x8c, 0x81, 0x40, 0x06, 0x73, 0x0c, 0x63, 0x11, 0xac,
1554 0xc6, 0x18, 0x02, 0xe3, 0x17, 0xc3, 0x11, 0x41, 0x5e, 0x28, 0xfe, 0x31,
1555 0xcb, 0x70, 0x06, 0x66, 0x10, 0x98, 0x90, 0x17, 0xe2, 0x3f, 0x4b, 0x80,
1556 0x06, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x52, 0x79, 0x0c,
1557 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0xd0, 0x79, 0x04, 0x7a,
1558 0x61, 0x81, 0x5e, 0x88, 0xbf, 0x05, 0x7a, 0x01, 0xfe, 0xb3, 0x04, 0x68,
1559 0x30, 0x50, 0x01, 0x28, 0x66, 0x20, 0x9c, 0xc1, 0x1c, 0x43, 0x12, 0x98,
1560 0xc6, 0x18, 0x42, 0x65, 0x1a, 0xc3, 0x11, 0x81, 0x68, 0x28, 0xfe, 0x31,
1561 0xcb, 0xa0, 0x06, 0x69, 0x10, 0x98, 0x20, 0x1a, 0xe2, 0x3f, 0x4b, 0xb0,
1562 0x06, 0x23, 0x06, 0x06, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x92, 0x7b, 0x0c,
1563 0x23, 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x10, 0x7c, 0x04, 0xa3,
1564 0x61, 0xc1, 0x68, 0x88, 0xbf, 0x05, 0xa3, 0x01, 0xfe, 0xb3, 0x04, 0x6b,
1565 0x30, 0x50, 0x01, 0x28, 0x69, 0x20, 0xa8, 0xc1, 0x1c, 0x43, 0x12, 0xb8,
1566 0xc6, 0x88, 0x01, 0x82, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x63, 0x1f, 0xc1,
1567 0x5d, 0xd4, 0xc5, 0x20, 0x43, 0x90, 0x17, 0xad, 0x31, 0x4b, 0xc0, 0x06,
1568 0x03, 0x15, 0x81, 0x1f, 0x84, 0x81, 0xb0, 0x06, 0x83, 0x0c, 0x81, 0x5f,
1569 0xbc, 0xc6, 0x2c, 0x41, 0x1b, 0x0c, 0xb4, 0x04, 0x3c, 0x62, 0xf0, 0x88,
1570 0xc4, 0x23, 0x9f, 0x2c, 0xb0, 0x01, 0x8f, 0x80, 0xc1, 0x40, 0x4b, 0x80,
1571 0x22, 0x86, 0x5e, 0x48, 0xe6, 0xf0, 0x11, 0x6c, 0xc0, 0x2f, 0x60, 0x30,
1572 0xc8, 0x10, 0x08, 0xb1, 0x91, 0x41, 0x40, 0x0c, 0x00, 0x12, 0x00, 0x00,
1573 0x00, 0x5b, 0x86, 0x20, 0x00, 0x87, 0x2d, 0x83, 0x11, 0x84, 0xc3, 0x96,
1574 0x21, 0x0b, 0xc4, 0x61, 0xcb, 0xe0, 0x05, 0xe3, 0xb0, 0x65, 0x00, 0x83,
1575 0x80, 0x1c, 0xb6, 0x0c, 0x69, 0x10, 0x94, 0xc3, 0x96, 0xc1, 0x0d, 0x02,
1576 0x73, 0xd8, 0x32, 0xd4, 0x41, 0x70, 0x0e, 0x5b, 0x86, 0x3b, 0x08, 0xcc,
1577 0x61, 0xcb, 0xb0, 0x0e, 0xc1, 0x39, 0x6c, 0x19, 0xda, 0x21, 0x30, 0x87,
1578 0x2d, 0x43, 0x5a, 0x04, 0xe7, 0xb0, 0x65, 0x58, 0x8b, 0xc0, 0x1c, 0x00,
1579 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x73, 0x00, 0x00,
1580 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00,
1581 0x00, 0x14, 0xce, 0x00, 0x10, 0x5a, 0x02, 0x45, 0x40, 0xeb, 0x58, 0x03,
1582 0x10, 0x08, 0x23, 0x00, 0xc4, 0xce, 0x41, 0x40, 0x4e, 0x83, 0x06, 0x04,
1583 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20,
1584 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x50, 0x33, 0x03,
1585 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8, 0x5f, 0xc6, 0xea, 0x97,
1586 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d, 0xee, 0xb8, 0xa7, 0xe2,
1587 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37, 0xd6, 0xb0, 0xce, 0x31,
1588 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7, 0xb1, 0x6a, 0x7f, 0x63,
1589 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98,
1590 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0,
1591 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73,
1592 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac,
1593 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7, 0xd1, 0x0c, 0x47, 0x58,
1594 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc, 0x31, 0x24, 0x96, 0x18,
1595 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe, 0x83, 0x0c, 0x01, 0x23,
1596 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8, 0xc7, 0x2c, 0xc3, 0x90,
1597 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c, 0x03, 0x51, 0x04, 0x23,
1598 0x06, 0x07, 0x12, 0x82, 0x60, 0xe1, 0x1f, 0x17, 0x1f, 0x7c, 0xce, 0x1c,
1599 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x81, 0x84, 0x20, 0x58, 0xf8, 0xc7,
1600 0xe5, 0x07, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01, 0x37, 0x62, 0x70, 0x20,
1601 0x21, 0x08, 0x16, 0xfe, 0x71, 0x81, 0xc2, 0x18, 0x40, 0x73, 0x0c, 0x42,
1602 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40, 0x70, 0xc3, 0x18, 0x42,
1603 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21, 0x0c, 0x61, 0x30, 0x62,
1604 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x01, 0x91, 0x82, 0x10, 0x8c, 0x18,
1605 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x40, 0xa5, 0x40, 0x04, 0xc3, 0x11,
1606 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x87, 0x47,
1607 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06, 0xe0, 0x6f, 0xc5, 0x1a,
1608 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04, 0xe4, 0x3f, 0xc7, 0x20,
1609 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0, 0x06, 0x16, 0x20, 0xe2,
1610 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12, 0x1c, 0x03, 0x15, 0x81,
1611 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9, 0x20, 0x43, 0x90, 0x06,
1612 0x6f, 0x30, 0x62, 0x70, 0x20, 0x21, 0x08, 0x16, 0xfe, 0x71, 0xd5, 0x42,
1613 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2, 0x88, 0xc1, 0x81, 0x84,
1614 0x20, 0x58, 0xf8, 0xc7, 0x75, 0x0b, 0x43, 0x19, 0xcc, 0x31, 0x08, 0x41,
1615 0x1d, 0x8c, 0x18, 0x1c, 0x48, 0x08, 0x82, 0x85, 0x7f, 0x5c, 0xb9, 0x50,
1616 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c, 0x41, 0x32, 0x50, 0x12,
1617 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7, 0x20, 0x43, 0x10, 0x07,
1618 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00,
1619 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xeb, 0x08, 0x18, 0xb0, 0x9a,
1620 0x80, 0x07, 0x90, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00,
1621 0x00, 0x67, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x30, 0x03, 0x00, 0x00,
1622 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00,
1623 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
1624 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
1625 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x01, 0x00,
1626 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
1627 0x00, 0x47, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00,
1628 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
1629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
1630 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1631 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
1632 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1633 0xff, 0x00, 0x30, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
1634 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1635 0xff, 0x08, 0x24, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
1636 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1637 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
1638 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1639 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
1640 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1641 0xff, 0x08, 0x24, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
1642 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1643 0xff, 0x08, 0x24, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00,
1644 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1645 0xff, 0x00, 0x30, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
1646 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1647 0xff, 0x08, 0x24, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
1648 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1649 0xff, 0x08, 0x24, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
1650 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1651 0xff, 0x08, 0x24, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
1652 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1653 0xff, 0x08, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00,
1654 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
1655 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00,
1656 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xa7, 0x02, 0x00, 0x00,
1657 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x43, 0x6f, 0x70, 0x79, 0x5f, 0x66, 0x72,
1658 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a, 0x31, 0x34, 0x47, 0x65,
1659 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
1660 0x44, 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c,
1661 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x4b, 0x31, 0x35, 0x53,
1662 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e,
1663 0x74, 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63,
1664 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69,
1665 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66,
1666 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66,
1667 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63,
1668 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e,
1669 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74,
1670 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, 0x31, 0x32, 0x41, 0x70,
1671 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x44, 0x76,
1672 0x33, 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, 0x69, 0x72, 0x2e, 0x66,
1673 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32,
1674 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77,
1675 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61,
1676 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33,
1677 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d,
1678 0x61, 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e,
1679 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75,
1680 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x33,
1681 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, 0x36,
1682 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73,
1683 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c,
1684 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17,
1686 0x0b, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xfc, 0x21, 0x00,
1687 0x00, 0xff, 0xff, 0xff, 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00,
1688 0x00, 0x03, 0x00, 0x00, 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05,
1689 0xc8, 0x14, 0x00, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0xa9, 0x07, 0x00,
1690 0x00, 0x0b, 0x02, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
1691 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32,
1692 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b,
1693 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32,
1694 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14,
1695 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e,
1696 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5,
1697 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x6e, 0x01, 0x00,
1698 0x00, 0x1b, 0xc2, 0x24, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03,
1699 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0,
1700 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0,
1701 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
1702 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87,
1703 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07,
1704 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07,
1705 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda,
1706 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6,
1707 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda,
1708 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca,
1709 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07,
1710 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07,
1711 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07,
1712 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87,
1713 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87,
1714 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc,
1715 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc,
1716 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07,
1717 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87,
1718 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87,
1719 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
1720 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca,
1721 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda,
1722 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00,
1723 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03,
1724 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87,
1725 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea,
1726 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda,
1727 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde,
1728 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4,
1729 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88,
1730 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07,
1731 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4,
1732 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90,
1733 0x06, 0x60, 0x30, 0x84, 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d,
1734 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b,
1735 0x84, 0x03, 0x3b, 0xa4, 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x1b, 0x0a,
1736 0x60, 0x01, 0xaa, 0x20, 0x0d, 0x40, 0x61, 0x08, 0x87, 0x74, 0x90, 0x87,
1737 0x36, 0x10, 0x87, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x03,
1738 0x77, 0x78, 0x87, 0x36, 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07,
1739 0x60, 0x83, 0x41, 0x18, 0xc0, 0x02, 0x54, 0x1b, 0x8c, 0x02, 0x01, 0x16,
1740 0xa0, 0xda, 0x10, 0x26, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xc0, 0x1a,
1741 0x00, 0x12, 0x50, 0x11, 0xe1, 0x00, 0x0f, 0xf0, 0x20, 0x0f, 0xef, 0x80,
1742 0x0f, 0x6d, 0x60, 0x0e, 0xf5, 0xe0, 0x0e, 0xe3, 0xd0, 0x06, 0xe6, 0x00,
1743 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c,
1744 0xd4, 0x43, 0x39, 0x00, 0x44, 0x3b, 0xa4, 0x83, 0x3b, 0xb4, 0x01, 0x3b,
1745 0x94, 0xc3, 0x39, 0x84, 0x03, 0x3b, 0xb4, 0x81, 0x3d, 0x94, 0xc3, 0x38,
1746 0xd0, 0xc3, 0x3b, 0xc8, 0x43, 0x1b, 0xdc, 0x43, 0x3a, 0x90, 0x03, 0x3d,
1747 0xa0, 0x03, 0x10, 0x07, 0x72, 0x80, 0x07, 0xc0, 0xe0, 0x0e, 0xef, 0xd0,
1748 0x06, 0xe2, 0x50, 0x0f, 0xe9, 0xc0, 0x0e, 0xf4, 0x90, 0x0e, 0xee, 0x30,
1749 0x0f, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe6, 0x20, 0x0f, 0xe1, 0xd0,
1750 0x0e, 0xe5, 0xd0, 0x06, 0xf0, 0xf0, 0x0e, 0xe9, 0xe0, 0x0e, 0xf4, 0x50,
1751 0x0e, 0xf2, 0xd0, 0x06, 0xe5, 0xc0, 0x0e, 0xe9, 0xd0, 0x0e, 0x00, 0x3d,
1752 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x39,
1753 0xc8, 0x43, 0x38, 0xb4, 0x43, 0x39, 0xb4, 0x01, 0x3c, 0xbc, 0x43, 0x3a,
1754 0xb8, 0x03, 0x3d, 0x94, 0x83, 0x3c, 0xb4, 0x41, 0x39, 0xb0, 0x43, 0x3a,
1755 0xb4, 0x43, 0x1b, 0xb8, 0xc3, 0x3b, 0xb8, 0x43, 0x1b, 0xb0, 0x43, 0x39,
1756 0x84, 0x83, 0x39, 0x00, 0xf4, 0x20, 0x0f, 0xf5, 0x50, 0x0e, 0x00, 0xe1,
1757 0x0e, 0xef, 0xd0, 0x06, 0xe9, 0xe0, 0x0e, 0xe6, 0x30, 0x0f, 0x6d, 0x60,
1758 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d,
1759 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x3b,
1760 0x84, 0x83, 0x3b, 0xcc, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b,
1761 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50, 0x0f, 0xe5, 0x00,
1762 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x30, 0x0f, 0xe9, 0x70, 0x0e, 0xee, 0x50,
1763 0x0e, 0xe4, 0xd0, 0x06, 0xfa, 0x50, 0x0e, 0xf2, 0xf0, 0x0e, 0xf3, 0xd0,
1764 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00,
1765 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b,
1766 0xd0, 0x83, 0x3c, 0x84, 0x03, 0x3c, 0xc0, 0x43, 0x3a, 0xb8, 0xc3, 0x39,
1767 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f, 0xf2, 0x50,
1768 0x0f, 0xe5, 0x00, 0x10, 0xf3, 0x40, 0x0f, 0xe1, 0x30, 0x0e, 0xeb, 0xd0,
1769 0x06, 0xf0, 0x20, 0x0f, 0xef, 0x40, 0x0f, 0xe5, 0x30, 0x0e, 0xf4, 0xf0,
1770 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20,
1771 0x0f, 0x6d, 0x30, 0x0f, 0xe9, 0xa0, 0x0f, 0xe5, 0x00, 0xe0, 0x01, 0x40,
1772 0xd4, 0x83, 0x3b, 0xcc, 0x43, 0x38, 0x98, 0x43, 0x39, 0xb4, 0x81, 0x39,
1773 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20,
1774 0x0f, 0xf5, 0x50, 0x0e, 0xc0, 0x86, 0xe4, 0x10, 0x80, 0x05, 0xa8, 0x82,
1775 0x34, 0x00, 0x83, 0x0d, 0x06, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20,
1776 0x01, 0xd4, 0x06, 0x1f, 0x49, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24,
1777 0xa0, 0x22, 0xc2, 0x01, 0x1e, 0xe0, 0x41, 0x1e, 0xde, 0x01, 0x1f, 0xda,
1778 0xc0, 0x1c, 0xea, 0xc1, 0x1d, 0xc6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda,
1779 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87,
1780 0x72, 0x00, 0x88, 0x76, 0x48, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87,
1781 0x73, 0x08, 0x07, 0x76, 0x68, 0x03, 0x7b, 0x28, 0x87, 0x71, 0xa0, 0x87,
1782 0x77, 0x90, 0x87, 0x36, 0xb8, 0x87, 0x74, 0x20, 0x07, 0x7a, 0x40, 0x07,
1783 0x20, 0x0f, 0xec, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea,
1784 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc,
1785 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda,
1786 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda,
1787 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87,
1788 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87,
1789 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87,
1790 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03,
1791 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07,
1792 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda,
1793 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda,
1794 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87,
1795 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87,
1796 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07,
1797 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde,
1798 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda,
1799 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0,
1800 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87,
1801 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87,
1802 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87,
1803 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00,
1804 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4,
1805 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda,
1806 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6,
1807 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87,
1808 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83,
1809 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca,
1810 0x01, 0xd8, 0xa0, 0x28, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6d, 0x00,
1811 0xac, 0x01, 0x20, 0x01, 0xd5, 0x06, 0x63, 0x09, 0x80, 0x05, 0xa8, 0x36,
1812 0x18, 0x8c, 0x00, 0x2c, 0x40, 0xb5, 0x41, 0x69, 0xfe, 0xff, 0xff, 0xff,
1813 0x7f, 0x00, 0xda, 0x00, 0x58, 0x03, 0x40, 0x02, 0xaa, 0x0d, 0x86, 0xf3,
1814 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x01, 0xd4, 0x86, 0xe9, 0xf9, 0xff,
1815 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x19, 0xdc, 0xe1, 0x1d, 0xda,
1816 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6,
1817 0x01, 0xd8, 0x50, 0x40, 0x42, 0x90, 0x06, 0x60, 0xb0, 0x21, 0x8a, 0xfe,
1818 0xff, 0xff, 0xff, 0x7f, 0x00, 0x94, 0xc1, 0x1d, 0xde, 0xa1, 0x0d, 0xc4,
1819 0xa1, 0x1e, 0xd2, 0x81, 0x1d, 0xe8, 0x21, 0x1d, 0xdc, 0x61, 0x1e, 0x00,
1820 0x00, 0x49, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, 0x8a, 0x40,
1821 0x18, 0x88, 0x62, 0x82, 0x60, 0x1c, 0x13, 0x02, 0x64, 0x42, 0x90, 0x4c,
1822 0x18, 0x94, 0x85, 0x99, 0x30, 0x34, 0x0b, 0x33, 0x21, 0x70, 0x26, 0x08,
1823 0x0f, 0x34, 0x21, 0x88, 0x00, 0x89, 0x20, 0x00, 0x00, 0x51, 0x00, 0x00,
1824 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4,
1825 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c,
1826 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xe0, 0xc1, 0x0c, 0xc0, 0x30, 0x02,
1827 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xb3,
1828 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x84, 0x10,
1829 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84, 0x41, 0x18, 0x46, 0x18,
1830 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e, 0xe4, 0xa1, 0x1e, 0xc6,
1831 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e, 0xc2, 0x81, 0x1d, 0xf4,
1832 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e, 0xd2, 0x01, 0x1f, 0x50,
1833 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe, 0xec, 0xbe, 0x1d, 0x21,
1834 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40, 0x84, 0xa3, 0xa4, 0x29,
1835 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8, 0x88, 0xf8, 0xed, 0xe1,
1836 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0x38, 0x4d, 0x9a, 0x22, 0x4a,
1837 0x98, 0xfc, 0x7f, 0x22, 0xae, 0x89, 0x8a, 0x88, 0xdf, 0x1e, 0x7e, 0x20,
1838 0x8a, 0x00, 0xec, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x26, 0xb8, 0x48,
1839 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2, 0x7f,
1840 0x1a, 0x23, 0x00, 0x06, 0x11, 0x1c, 0xa1, 0x24, 0x41, 0x10, 0x08, 0x44,
1841 0xb2, 0x34, 0x0f, 0x41, 0x65, 0x08, 0x02, 0x82, 0xa4, 0x42, 0x14, 0x45,
1842 0x51, 0x10, 0x55, 0x06, 0x00, 0x00, 0xc8, 0x2a, 0x02, 0x00, 0x10, 0x36,
1843 0x47, 0x10, 0x14, 0x41, 0x03, 0x68, 0x2b, 0x03, 0x50, 0x14, 0xd4, 0x15,
1844 0xa3, 0x28, 0x00, 0x00, 0x00, 0xe8, 0x2b, 0x43, 0x51, 0x14, 0x14, 0x16,
1845 0xa1, 0x28, 0x68, 0x9c, 0x23, 0x40, 0x8c, 0x10, 0x94, 0x73, 0x04, 0x60,
1846 0x30, 0x8c, 0x20, 0x9c, 0x41, 0x59, 0xcc, 0xe6, 0x11, 0x4e, 0x0d, 0xd5,
1847 0x00, 0xe0, 0xa4, 0xb4, 0x28, 0xe6, 0xf2, 0x08, 0x1a, 0xaa, 0x01, 0xc0,
1848 0x49, 0xeb, 0x40, 0x40, 0x0a, 0x9c, 0x73, 0x04, 0xa0, 0x30, 0x8c, 0x30,
1849 0x9c, 0xc1, 0x20, 0x42, 0x20, 0x0c, 0x22, 0x1c, 0xc2, 0x20, 0x42, 0x21,
1850 0x8c, 0x00, 0x0c, 0x22, 0x00, 0xc2, 0x14, 0xc0, 0x30, 0x02, 0x71, 0x06,
1851 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e, 0xec, 0x80, 0x0e, 0xda,
1852 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c, 0xda, 0x80, 0x1e, 0xec,
1853 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d, 0xe0, 0xc0, 0x0d, 0xe0,
1854 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e, 0xd8, 0x21, 0x1c, 0xe8,
1855 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43, 0x1b, 0xc0, 0x83, 0x1e,
1856 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
1857 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81, 0x1e, 0xe0, 0x41, 0x1b,
1858 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01, 0x1e, 0xb4, 0x41, 0x3a,
1859 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d,
1860 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e,
1861 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d,
1862 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x39, 0xcc, 0x81, 0x1c,
1863 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x39,
1864 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
1865 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81, 0x1e,
1866 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01, 0x1d, 0xe8, 0xc1, 0x1c,
1867 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xcc, 0x81, 0x1c,
1868 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81, 0x3d,
1869 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d,
1870 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e,
1871 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81, 0x1d, 0xe8, 0x41, 0x1c,
1872 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xb4, 0x81, 0x3d,
1873 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e,
1874 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43, 0x1c, 0xe4, 0x81, 0x1c,
1875 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d,
1876 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d,
1877 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41, 0x1b, 0xd8, 0x43, 0x1d,
1878 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d,
1879 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d,
1880 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81, 0x1e, 0xc4, 0x01, 0x1c,
1881 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1d,
1882 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43, 0x42, 0x6c, 0x57, 0xfe,
1883 0xb2, 0xfb, 0xfe, 0x45, 0x04, 0x18, 0x0c, 0xd1, 0x4c, 0x43, 0x22, 0x00,
1884 0x82, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60,
1885 0x48, 0x04, 0xe1, 0x81, 0x84, 0x00, 0x83, 0x00, 0x00, 0x00, 0x10, 0x00,
1886 0x00, 0x00, 0x00, 0x43, 0x22, 0x54, 0xa0, 0x28, 0x20, 0x00, 0x06, 0x00,
1887 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0xf1, 0x02, 0x64, 0x01,
1888 0x01, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x88,
1889 0x1d, 0x22, 0x0c, 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
1890 0x00, 0x86, 0x44, 0xfd, 0x60, 0x6d, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00,
1891 0x02, 0x00, 0x00, 0x00, 0x30, 0x24, 0x9a, 0x89, 0xa6, 0x03, 0x02, 0x60,
1892 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x11, 0x58, 0x64,
1893 0x1f, 0x02, 0x0c, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0c,
1894 0x89, 0xf2, 0x22, 0xb2, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00,
1895 0x00, 0x00, 0x60, 0x48, 0xa4, 0x1a, 0x52, 0x18, 0x00, 0x01, 0x30, 0x00,
1896 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x88, 0x37, 0xa6, 0x31,
1897 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21,
1898 0xd1, 0x7b, 0x4c, 0x61, 0x00, 0x04, 0xc0, 0x00, 0x00, 0x00, 0x20, 0x00,
1899 0x00, 0x00, 0x00, 0x43, 0x22, 0x11, 0x09, 0x83, 0x34, 0x00, 0x02, 0xa0,
1900 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0xd1, 0x98, 0x6c,
1901 0x6b, 0x00, 0x04, 0x40, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
1902 0x12, 0x1b, 0x04, 0x8a, 0xaa, 0x1e, 0x00, 0x00, 0x64, 0x81, 0x00, 0x00,
1903 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c,
1904 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x3a, 0x8b, 0xa0, 0x04,
1905 0x0a, 0x61, 0x04, 0xa0, 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a,
1906 0xa5, 0x60, 0x0a, 0xa7, 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c,
1907 0xe8, 0x1d, 0x01, 0x28, 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82,
1908 0x29, 0x1c, 0x72, 0xc7, 0x12, 0x24, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00,
1909 0x00, 0xa5, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c,
1910 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80,
1911 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed,
1912 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d,
1913 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83,
1914 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78,
1915 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70,
1916 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc,
1917 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3,
1918 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c,
1919 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83,
1920 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03,
1921 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68,
1922 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60,
1923 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80,
1924 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98,
1925 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec,
1926 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c,
1927 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d,
1928 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43,
1929 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03,
1930 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03,
1931 0x3b, 0xb0, 0xc3, 0x0c, 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70,
1932 0x83, 0x74, 0x68, 0x07, 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0,
1933 0x87, 0x19, 0xce, 0x53, 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4,
1934 0x90, 0x0e, 0xe3, 0x40, 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33,
1935 0x20, 0x28, 0x1d, 0xdc, 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c,
1936 0xdc, 0x81, 0x1e, 0xdc, 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e,
1937 0x66, 0x18, 0x51, 0x38, 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50,
1938 0x24, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78,
1939 0x07, 0x78, 0x98, 0x51, 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33,
1940 0x1e, 0x6a, 0x1e, 0xca, 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
1941 0x7e, 0x01, 0x1e, 0xe4, 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06,
1942 0x54, 0x85, 0x83, 0x38, 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43,
1943 0x39, 0xfc, 0xc2, 0x3c, 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3,
1944 0x8c, 0xc5, 0x0a, 0x87, 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08,
1945 0x07, 0x7a, 0x28, 0x07, 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec,
1946 0xc0, 0x0e, 0xe5, 0x50, 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e,
1947 0xe4, 0xe1, 0x17, 0xd8, 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19,
1948 0x3b, 0xb0, 0x83, 0x3d, 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43,
1949 0x39, 0xcc, 0xc3, 0x3c, 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03,
1950 0x3c, 0xcc, 0x48, 0xb4, 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08,
1951 0x87, 0x71, 0x58, 0x87, 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed,
1952 0xe0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6,
1953 0x50, 0x0e, 0x6e, 0x10, 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3,
1954 0xe0, 0x06, 0xe9, 0xe0, 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2,
1955 0xec, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d,
1956 0xe6, 0x21, 0x1d, 0xc4, 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f,
1957 0x66, 0x20, 0x9d, 0x3b, 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83,
1958 0x39, 0xcc, 0x58, 0xbc, 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08,
1959 0x07, 0x7a, 0x48, 0x87, 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5,
1960 0x10, 0x0e, 0xf0, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3,
1961 0x90, 0x0e, 0xf4, 0x50, 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90,
1962 0x07, 0x37, 0x30, 0x87, 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78,
1963 0x07, 0x77, 0xf8, 0x85, 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98,
1964 0x07, 0x00, 0x00, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0x50, 0x01, 0x00,
1965 0x00, 0x32, 0x9a, 0x08, 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8,
1966 0x11, 0x32, 0x64, 0xd4, 0xee, 0x80, 0x0d, 0x6a, 0x0c, 0x8b, 0x12, 0x07,
1967 0xc5, 0xc6, 0x91, 0x41, 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d,
1968 0x45, 0x66, 0x20, 0xca, 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c,
1969 0xcf, 0x13, 0x5d, 0x4f, 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11,
1970 0x5e, 0xb1, 0x1c, 0x01, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72,
1971 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69,
1972 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61,
1973 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32,
1974 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74,
1975 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34,
1976 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e,
1977 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f,
1978 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61,
1979 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66,
1980 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61,
1981 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
1982 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66,
1983 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61,
1984 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65,
1985 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e,
1986 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
1987 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70,
1988 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63,
1989 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f,
1990 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61,
1991 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70,
1992 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66,
1993 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75,
1994 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35,
1995 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61,
1996 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69,
1997 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72,
1998 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f,
1999 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61,
2000 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69,
2001 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e,
2002 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61,
2003 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
2004 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61,
2005 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f,
2006 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f,
2007 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70,
2008 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79,
2009 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65,
2010 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74,
2011 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,
2012 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63,
2013 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f,
2014 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77,
2015 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69,
2016 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73,
2017 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74,
2018 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69,
2019 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73,
2020 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
2021 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
2022 0x78, 0x33, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44,
2023 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61,
2024 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69,
2025 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74,
2026 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c,
2027 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59,
2028 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x64, 0x5f, 0x61, 0x72,
2029 0x72, 0x61, 0x79, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c, 0x20, 0x73,
2030 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x55, 0x56, 0x61,
2031 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61,
2032 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x00, 0x00, 0x00, 0xe4, 0xa8, 0x00,
2033 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x82, 0x70, 0x06, 0xce, 0x08, 0x82,
2034 0x1b, 0x9c, 0xc1, 0x08, 0xc2, 0x19, 0x3c, 0x23, 0x08, 0x67, 0x00, 0x8d,
2035 0x20, 0x9c, 0x41, 0x34, 0x82, 0x10, 0x01, 0x23, 0x08, 0x67, 0x20, 0x8d,
2036 0x20, 0x9c, 0xc1, 0x34, 0x82, 0x70, 0x06, 0xd4, 0x08, 0xc2, 0x19, 0x54,
2037 0x23, 0x08, 0x67, 0x60, 0x8d, 0x20, 0x9c, 0xc1, 0x35, 0x82, 0x70, 0x06,
2038 0xd8, 0x08, 0xc2, 0x19, 0x64, 0x23, 0x08, 0x67, 0xa0, 0x8d, 0x20, 0x9c,
2039 0xc1, 0x36, 0x82, 0x70, 0x06, 0xdc, 0x08, 0xc2, 0x19, 0x74, 0x23, 0x08,
2040 0x67, 0xe0, 0xcd, 0x30, 0xe0, 0x41, 0x90, 0x07, 0x33, 0x0c, 0x7a, 0x20,
2041 0xec, 0xc1, 0x0c, 0xc1, 0x30, 0xc3, 0x80, 0x07, 0x78, 0xc0, 0x07, 0x33,
2042 0x10, 0x84, 0x1e, 0xe8, 0x01, 0x1f, 0xcc, 0x10, 0x14, 0x33, 0x04, 0xc6,
2043 0x0c, 0xc1, 0x31, 0x43, 0x81, 0xf0, 0x01, 0x1f, 0x24, 0xca, 0x0c, 0xc1,
2044 0x2c, 0xcc, 0x80, 0xf0, 0xc1, 0xc2, 0x34, 0x89, 0xe2, 0x3c, 0x33, 0x24,
2045 0x7a, 0x00, 0x45, 0x8c, 0x94, 0x28, 0xce, 0x34, 0x43, 0x82, 0x07, 0x10,
2046 0xc5, 0x48, 0x49, 0xe5, 0x58, 0x33, 0xa0, 0x01, 0x1f, 0xec, 0x01, 0x1f,
2047 0x70, 0xdd, 0x1e, 0xec, 0x01, 0x1f, 0x70, 0x1e, 0x28, 0xec, 0x01, 0x1f,
2048 0x70, 0x5f, 0x28, 0xec, 0x01, 0x1f, 0x70, 0x60, 0x20, 0x0a, 0x7b, 0xc0,
2049 0x07, 0x5c, 0x18, 0x8c, 0xc2, 0x1e, 0xf0, 0x01, 0x27, 0x06, 0xa4, 0xb0,
2050 0x07, 0x7c, 0xc0, 0x8d, 0x41, 0x29, 0xec, 0x01, 0x1f, 0x70, 0x64, 0x30,
2051 0x83, 0xe4, 0x07, 0x17, 0xf6, 0x07, 0x19, 0x1f, 0xe8, 0x81, 0xb6, 0xe1,
2052 0x42, 0x19, 0xfc, 0x81, 0x19, 0xec, 0x41, 0x72, 0x06, 0x0e, 0x1a, 0xcc,
2053 0xa0, 0xf0, 0x81, 0x28, 0xf0, 0x41, 0x1a, 0xa8, 0x81, 0x28, 0x9c, 0x02,
2054 0x1f, 0xac, 0x01, 0x1b, 0xcc, 0x20, 0xed, 0xc1, 0x85, 0x99, 0x42, 0xa6,
2055 0x07, 0x7a, 0xa0, 0x6d, 0xba, 0x50, 0x06, 0xa6, 0x60, 0x06, 0xa2, 0x90,
2056 0xb4, 0x81, 0xe3, 0x06, 0x33, 0x28, 0xa8, 0xf0, 0x06, 0x19, 0x1f, 0xe8,
2057 0x01, 0x1c, 0x24, 0x71, 0xe0, 0xc8, 0xc1, 0x0c, 0x4a, 0x2a, 0xbc, 0x41,
2058 0xa6, 0x07, 0x7a, 0x00, 0x07, 0xc9, 0x1c, 0x38, 0x74, 0x30, 0x43, 0xa2,
2059 0x0a, 0x75, 0x90, 0xf1, 0x81, 0x1e, 0x24, 0x76, 0xe0, 0xdc, 0xc1, 0x0c,
2060 0x48, 0x2d, 0xd8, 0xc2, 0x2d, 0xe4, 0xc2, 0x2e, 0xf0, 0x42, 0x2f, 0xf8,
2061 0xc2, 0x0c, 0x43, 0x1f, 0xd0, 0xc2, 0x2f, 0x54, 0x1a, 0x00, 0x62, 0x80,
2062 0x06, 0x62, 0x20, 0x06, 0x62, 0xc0, 0x89, 0x81, 0x18, 0x88, 0x81, 0x18,
2063 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18, 0x88, 0x81, 0x18,
2064 0x88, 0x81, 0x1b, 0xb8, 0x81, 0x45, 0x07, 0x7a, 0x60, 0x59, 0x96, 0x1e,
2065 0x70, 0xa6, 0xc0, 0x0a, 0xac, 0x40, 0x37, 0x7e, 0x81, 0x12, 0x7e, 0x61,
2066 0x0f, 0xf6, 0xa0, 0x0e, 0xf0, 0x20, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d,
2067 0xcd, 0xae, 0xcd, 0xa5, 0xed, 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c,
2068 0x2d, 0xec, 0x6c, 0x6e, 0x14, 0x41, 0x15, 0x56, 0xe1, 0x14, 0x36, 0x36,
2069 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x51, 0x02, 0x56, 0xb8,
2070 0x25, 0x2c, 0x4d, 0xce, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d,
2071 0x94, 0xa0, 0x15, 0x8e, 0x0a, 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b,
2072 0xab, 0x0b, 0x3b, 0x2b, 0xfb, 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73,
2073 0x1b, 0x25, 0x70, 0x85, 0x9b, 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda,
2074 0xe0, 0xd2, 0xd8, 0xca, 0xbe, 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6,
2075 0x46, 0x19, 0x5e, 0x01, 0x16, 0x62, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17,
2076 0x33, 0xb9, 0xb0, 0xb3, 0xb6, 0x32, 0x37, 0xba, 0x51, 0x82, 0x5f, 0x00,
2077 0x00, 0xa9, 0x18, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72,
2078 0x28, 0x87, 0x77, 0x80, 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8,
2079 0xc3, 0x38, 0xb0, 0x43, 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1,
2080 0x0d, 0xe8, 0x41, 0x1e, 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21,
2081 0x1d, 0xde, 0xc1, 0x1d, 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f,
2082 0xe1, 0x20, 0x0f, 0xe4, 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e,
2083 0xf4, 0xb0, 0x80, 0x81, 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76,
2084 0x78, 0x87, 0x71, 0x08, 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c,
2085 0xc3, 0x38, 0xb4, 0x01, 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b,
2086 0x1c, 0xd8, 0x21, 0x1c, 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61,
2087 0x1c, 0xdc, 0x20, 0x1c, 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1,
2088 0x1c, 0xc8, 0x61, 0x1c, 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f,
2089 0xf4, 0x20, 0x0f, 0xe1, 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00,
2090 0x00, 0xd1, 0x10, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c,
2091 0xa4, 0x83, 0x3b, 0x9c, 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c,
2092 0x94, 0x43, 0x38, 0x90, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
2093 0x00, 0x8c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00,
2094 0x00, 0x0e, 0x00, 0x00, 0x00, 0xa4, 0xd5, 0xc0, 0x08, 0x00, 0x9d, 0x33,
2095 0x00, 0x84, 0x8e, 0x00, 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03,
2096 0x10, 0x08, 0x73, 0x0c, 0x91, 0x1c, 0xc8, 0x01, 0x01, 0x23, 0x00, 0x33,
2097 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0xf8, 0x47, 0xc1, 0x0c, 0xc0, 0x0c,
2098 0xc0, 0x1c, 0x44, 0x1e, 0xe4, 0x41, 0x1e, 0xe8, 0x01, 0x00, 0x00, 0x00,
2099 0x00, 0xf1, 0x30, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8,
2100 0x90, 0x51, 0x16, 0x88, 0x49, 0x00, 0x00, 0x00, 0x00, 0x62, 0x80, 0x61,
2101 0x96, 0x05, 0x00, 0x00, 0x00, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69,
2102 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x28, 0x53, 0x44,
2103 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65,
2104 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73,
2105 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61, 0x6d, 0x70, 0x6c,
2106 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73,
2107 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x75,
2108 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73,
2109 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x34,
2110 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73,
2111 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x00,
2112 0x00, 0x2b, 0x04, 0x73, 0x08, 0x87, 0x15, 0xc3, 0x39, 0x98, 0x83, 0x38,
2113 0xac, 0x18, 0xd0, 0xc1, 0x1c, 0xc6, 0x61, 0xc5, 0x90, 0x0e, 0xe6, 0x40,
2114 0x0e, 0x2b, 0x06, 0x75, 0x30, 0x87, 0x72, 0xd8, 0x20, 0xa0, 0xc3, 0x39,
2115 0x6c, 0x10, 0xd4, 0x21, 0x1d, 0x36, 0x04, 0xe9, 0xb0, 0x61, 0x50, 0x07,
2116 0x74, 0x38, 0x07, 0x00, 0x00, 0x23, 0x06, 0x8d, 0x11, 0x82, 0x60, 0xb0,
2117 0x06, 0x71, 0x10, 0x3d, 0x94, 0xb3, 0x34, 0x86, 0xd1, 0x06, 0xa3, 0x09,
2118 0x01, 0x30, 0x62, 0xe0, 0x18, 0x21, 0x08, 0x06, 0x69, 0x40, 0x07, 0x52,
2119 0x64, 0xbd, 0x01, 0xd4, 0x3c, 0x08, 0xf2, 0x06, 0xa3, 0x09, 0x01, 0x30,
2120 0x86, 0x10, 0x8c, 0xc1, 0x20, 0x03, 0x71, 0x30, 0x73, 0x0c, 0x81, 0x00,
2121 0x8d, 0x18, 0x38, 0x46, 0x08, 0x82, 0x41, 0x1a, 0xe4, 0xc1, 0x65, 0x6d,
2122 0x76, 0x50, 0x49, 0x54, 0xd3, 0xd0, 0xc1, 0x68, 0x42, 0x00, 0x8c, 0x21,
2123 0x04, 0x68, 0x30, 0xc7, 0x40, 0x04, 0xd3, 0x75, 0xf1, 0x52, 0x10, 0x94,
2124 0x41, 0x86, 0x00, 0xaa, 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0x43, 0x18, 0xb8,
2125 0x81, 0x1f, 0x5c, 0x10, 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x6d,
2126 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, 0xfc, 0xa3, 0x5b, 0x85, 0x22, 0xd8,
2127 0x48, 0x61, 0x06, 0x73, 0x30, 0x0a, 0xa1, 0xe0, 0x5d, 0x10, 0x2f, 0x05,
2128 0x41, 0x19, 0x64, 0x08, 0xb4, 0x6f, 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c,
2129 0xfc, 0xa3, 0x83, 0x05, 0x25, 0xd8, 0x48, 0xb1, 0x06, 0x78, 0x80, 0x0a,
2130 0xa6, 0x20, 0x06, 0x17, 0xc4, 0x4b, 0x41, 0x50, 0x06, 0x19, 0x82, 0x8f,
2131 0x0c, 0x46, 0x0c, 0x8e, 0x23, 0x04, 0xc1, 0xc2, 0x3f, 0xba, 0x5a, 0x78,
2132 0x82, 0x39, 0x86, 0x6f, 0xe9, 0x83, 0x39, 0x86, 0xe0, 0x48, 0x83, 0x39,
2133 0x86, 0x60, 0x48, 0x83, 0x11, 0x83, 0x03, 0x89, 0x41, 0xb0, 0xf0, 0x0f,
2134 0xc9, 0x17, 0x02, 0x3a, 0xb0, 0xe0, 0x0e, 0xc4, 0x3f, 0x83, 0x80, 0x18,
2135 0x00, 0x0d, 0x00, 0x00, 0x00, 0x5b, 0x0a, 0xe0, 0x50, 0x07, 0x64, 0x1d,
2136 0xb6, 0x14, 0xc2, 0xa1, 0x0e, 0xc8, 0x3a, 0x6c, 0x29, 0x8e, 0x43, 0x1d,
2137 0x90, 0x75, 0xd8, 0x52, 0x30, 0x07, 0x3b, 0x20, 0xed, 0xb0, 0xa5, 0x88,
2138 0x0e, 0x76, 0x40, 0xda, 0x61, 0x4b, 0x61, 0x1d, 0xec, 0x80, 0xb4, 0xc3,
2139 0x96, 0x62, 0x3b, 0xd8, 0x01, 0x69, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
2140 0x00, 0x61, 0x20, 0x00, 0x00, 0xe5, 0x01, 0x00, 0x00, 0x13, 0x04, 0x6e,
2141 0x10, 0x0b, 0x04, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x74, 0xce, 0x00,
2142 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00,
2143 0x74, 0xcf, 0x41, 0x44, 0x8f, 0xa3, 0x06, 0x63, 0x11, 0x40, 0x20, 0x1c,
2144 0x04, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd, 0x18, 0x81, 0x2c, 0xba,
2145 0x3d, 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab, 0xed, 0x37, 0x46, 0xd0,
2146 0xc7, 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f, 0x8b, 0xb6, 0x2f, 0x8c,
2147 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81, 0x79, 0xaf, 0xab, 0xec,
2148 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18, 0x81, 0xdb, 0xc7, 0xa2,
2149 0xed, 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf, 0x18, 0x81, 0xce, 0x9a,
2150 0x73, 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20, 0x08, 0x82, 0x24, 0x18,
2151 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30, 0x03, 0x40, 0xc1, 0x0c,
2152 0xc0, 0x0c, 0xc0, 0x1c, 0x84, 0x1d, 0xf0, 0x81, 0x1d, 0xfc, 0x01, 0x15,
2153 0x33, 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d, 0x20, 0x08, 0x82, 0xf8,
2154 0x07, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82, 0xf8, 0x37, 0xd6, 0xc0,
2155 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4, 0xc7, 0xb6, 0xf3, 0x4f,
2156 0x7a, 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f, 0x80, 0x20, 0xc8, 0xd6,
2157 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58, 0x03, 0x08, 0x82, 0x6b,
2158 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80, 0x20, 0xb8, 0xe6, 0x60,
2159 0x30, 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01, 0x08, 0xd2, 0x6d, 0x0e,
2160 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35, 0xac, 0x23, 0x1e, 0xb3,
2161 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a, 0xe2, 0x31, 0x0b, 0x06,
2162 0x63, 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80, 0x20, 0x8c, 0x87, 0x63,
2163 0x00, 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83, 0x98, 0x8b, 0x69, 0xff,
2164 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab, 0x9a, 0xfb, 0xc2, 0x58,
2165 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d, 0x8a, 0xf9, 0xd7, 0xc2,
2166 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7, 0x69, 0xea, 0x0b, 0xad,
2167 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3, 0x1f, 0x00, 0x00, 0x00,
2168 0x00, 0xf1, 0x30, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x22, 0x47, 0xc8,
2169 0x90, 0x51, 0x0e, 0xc4, 0x1d, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x00,
2170 0x00, 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65,
2171 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d,
2172 0x6e, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61,
2173 0x72, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20,
2174 0x54, 0x42, 0x41, 0x41, 0x00, 0x13, 0x84, 0x37, 0xf8, 0x26, 0x08, 0x6f,
2175 0x00, 0x06, 0x13, 0x84, 0x37, 0x08, 0x83, 0x09, 0xc2, 0x1b, 0x88, 0xc1,
2176 0x04, 0xe1, 0x0d, 0xc6, 0x60, 0x82, 0xf0, 0x06, 0x64, 0x30, 0x41, 0x78,
2177 0x83, 0x32, 0x98, 0x20, 0xbc, 0x81, 0x19, 0x6c, 0x08, 0xc6, 0x61, 0xc3,
2178 0x20, 0x0e, 0xec, 0x40, 0x0e, 0x1b, 0x06, 0xae, 0x1d, 0xc8, 0x61, 0x43,
2179 0x14, 0x0e, 0xee, 0x40, 0x0e, 0xee, 0x50, 0x0e, 0xee, 0x60, 0x0e, 0xee,
2180 0x70, 0x0e, 0xee, 0x80, 0x0e, 0xee, 0x90, 0x0e, 0xee, 0xa0, 0x0e, 0xee,
2181 0xb0, 0x0e, 0x1b, 0x86, 0x77, 0x70, 0x07, 0x73, 0xd8, 0x30, 0xbc, 0x83,
2182 0x3b, 0xac, 0xc3, 0x86, 0xe1, 0x1d, 0xdc, 0x01, 0x1d, 0x36, 0x0c, 0xef,
2183 0xe0, 0x0e, 0xe9, 0xb0, 0x61, 0x78, 0x07, 0x77, 0x50, 0x87, 0x0d, 0xc3,
2184 0x3b, 0xb8, 0x43, 0x39, 0x6c, 0x18, 0xde, 0xc1, 0x1d, 0xce, 0x61, 0xc3,
2185 0xf0, 0x0e, 0xee, 0x40, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x18, 0xce,
2186 0x20, 0x0e, 0x44, 0x81, 0x02, 0x60, 0x0c, 0x47, 0x04, 0x55, 0xe0, 0x1f,
2187 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xac, 0xc1, 0x64, 0x06, 0x7b, 0x18,
2188 0xd6, 0xa0, 0x0e, 0xec, 0x80, 0x02, 0x60, 0x8c, 0x18, 0x18, 0x47, 0x08,
2189 0x82, 0x85, 0x7f, 0x8c, 0x01, 0x2b, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82,
2190 0x60, 0xe1, 0x1f, 0x61, 0xe0, 0x0a, 0x01, 0x64, 0x01, 0x04, 0xfe, 0x23,
2191 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x61, 0xe0, 0x0a, 0x41, 0x65,
2192 0x43, 0x24, 0xfe, 0x16, 0x05, 0xe1, 0x6f, 0x43, 0x40, 0xfe, 0x23, 0x06,
2193 0xc6, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x63, 0x30, 0x0b, 0xc1, 0x88, 0xc1,
2194 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47, 0x18, 0xd4, 0x42, 0x30, 0x59, 0x30,
2195 0x89, 0xff, 0x1c, 0x43, 0xb7, 0x84, 0xc2, 0x20, 0x43, 0xe0, 0xcd, 0x81,
2196 0x0d, 0x01, 0xf9, 0x0f, 0x32, 0x04, 0x60, 0x40, 0x07, 0x83, 0x0c, 0x01,
2197 0x1f, 0xd0, 0xc1, 0x2c, 0x81, 0x30, 0x50, 0x11, 0x08, 0x81, 0x3e, 0x00,
2198 0x7b, 0x18, 0xfa, 0xe0, 0x14, 0x6c, 0x81, 0x02, 0x60, 0x0c, 0x47, 0x04,
2199 0x6c, 0xe0, 0xf8, 0xc7, 0x2c, 0xc3, 0x40, 0x04, 0x83, 0x0c, 0x44, 0x1a,
2200 0xf0, 0xc1, 0x1e, 0x86, 0x50, 0x58, 0x05, 0x57, 0xa0, 0x00, 0x18, 0x7b,
2201 0x18, 0x46, 0xa1, 0x15, 0x5e, 0x81, 0x02, 0x60, 0x8c, 0x18, 0x28, 0x49,
2202 0x0c, 0x82, 0x85, 0x7f, 0x7c, 0xe7, 0x50, 0x74, 0xc7, 0x10, 0x0c, 0x32,
2203 0x04, 0x6c, 0x00, 0x0a, 0x83, 0x0c, 0xc1, 0x02, 0x0a, 0xb3, 0x04, 0xc4,
2204 0x40, 0x45, 0x20, 0x0c, 0x98, 0x30, 0x1c, 0x11, 0x06, 0x7c, 0x10, 0xf8,
2205 0xc7, 0x2c, 0x43, 0x31, 0x05, 0x7b, 0x18, 0x54, 0x81, 0x16, 0xc8, 0x81,
2206 0x02, 0x60, 0x0c, 0x47, 0x04, 0x7f, 0x10, 0xf8, 0xc7, 0x2c, 0x83, 0x71,
2207 0x04, 0x83, 0x0c, 0x85, 0x1d, 0xa4, 0xc2, 0x1e, 0x06, 0x57, 0xc0, 0x85,
2208 0x72, 0xa0, 0x00, 0x18, 0x73, 0x0c, 0x76, 0x10, 0xe8, 0xc2, 0x20, 0x43,
2209 0x70, 0x07, 0xac, 0x60, 0x41, 0x21, 0xfe, 0x83, 0x0c, 0x41, 0x1e, 0xb4,
2210 0xc2, 0x2c, 0x41, 0x1b, 0xec, 0x61, 0xa0, 0x05, 0x5f, 0x60, 0x07, 0x0a,
2211 0x80, 0xb1, 0x87, 0xc1, 0x16, 0xc0, 0xa1, 0x1d, 0x28, 0x00, 0xc6, 0x20,
2212 0x03, 0x14, 0x0a, 0xb2, 0x30, 0x62, 0x50, 0x1c, 0x21, 0x08, 0x06, 0x5b,
2213 0x3f, 0x10, 0xb3, 0x0c, 0x88, 0x14, 0x8c, 0x21, 0x48, 0xe4, 0x30, 0x1c,
2214 0x11, 0xb4, 0x82, 0xe2, 0x1f, 0xb3, 0x0c, 0x4a, 0x12, 0x98, 0xd0, 0x0a,
2215 0xe2, 0x3f, 0x4b, 0xb0, 0xd8, 0xd0, 0x0a, 0xe0, 0x3f, 0x62, 0x60, 0x1c,
2216 0x21, 0x08, 0x16, 0xfe, 0x81, 0x8d, 0x44, 0x60, 0x81, 0x2b, 0x88, 0xff,
2217 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x65, 0x12, 0x81, 0x2b,
2218 0xcc, 0x12, 0x2c, 0x03, 0x15, 0x80, 0x92, 0x08, 0xca, 0x1c, 0x83, 0x2a,
2219 0x04, 0xec, 0x30, 0x86, 0xb0, 0x85, 0xc3, 0x70, 0x44, 0x60, 0x0b, 0x8a,
2220 0x7f, 0xcc, 0x32, 0x34, 0x4c, 0x60, 0x82, 0x2d, 0x88, 0xff, 0x2c, 0x81,
2221 0x63, 0x83, 0x2d, 0x80, 0xff, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8,
2222 0x07, 0xc6, 0x12, 0x81, 0x05, 0xb7, 0x20, 0xfe, 0x23, 0x06, 0xc7, 0x11,
2223 0x82, 0x60, 0xe1, 0x1f, 0xd6, 0x4b, 0x04, 0xb7, 0x30, 0x4b, 0xe0, 0x0c,
2224 0x54, 0x00, 0x0a, 0x23, 0x34, 0x73, 0x0c, 0x49, 0x90, 0x0e, 0x63, 0x08,
2225 0x64, 0x90, 0x0e, 0xc3, 0x11, 0xc1, 0x2f, 0x28, 0xfe, 0x31, 0xcb, 0x00,
2226 0x3d, 0x81, 0x09, 0xbf, 0x20, 0xfe, 0xb3, 0x04, 0x91, 0x0d, 0xbf, 0x00,
2227 0xfe, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x58, 0x4d, 0x04,
2228 0x16, 0x80, 0x83, 0xf8, 0x8f, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f,
2229 0x58, 0x38, 0x11, 0x80, 0xc3, 0x2c, 0x41, 0x34, 0x50, 0x01, 0x28, 0x8f,
2230 0x00, 0xcd, 0x31, 0x24, 0x41, 0x3c, 0xcc, 0x12, 0x48, 0x03, 0x15, 0x81,
2231 0x10, 0xe9, 0xc1, 0x31, 0xc8, 0x10, 0xfc, 0x82, 0x3c, 0xcc, 0x31, 0xf4,
2232 0x02, 0x18, 0x84, 0xc4, 0x20, 0x43, 0xe0, 0x0b, 0xf3, 0x60, 0x43, 0x20,
2233 0xfe, 0x83, 0x0c, 0x01, 0x38, 0xd0, 0xc3, 0x2c, 0x41, 0x1b, 0x0c, 0x47,
2234 0xcc, 0x82, 0x39, 0x04, 0xfe, 0x31, 0xcb, 0x40, 0x81, 0x41, 0x30, 0xc8,
2235 0x40, 0x07, 0xe5, 0x80, 0x0f, 0x7b, 0x18, 0xfa, 0xe1, 0x24, 0x6a, 0x82,
2236 0x02, 0x60, 0xec, 0x61, 0xf8, 0x87, 0x94, 0xb0, 0x09, 0x0a, 0x80, 0x31,
2237 0xc7, 0x70, 0x0e, 0xc1, 0x4a, 0x0c, 0x32, 0x04, 0xe8, 0xd0, 0x0f, 0x16,
2238 0x1c, 0xe2, 0x3f, 0xc8, 0x10, 0xa8, 0x83, 0x3f, 0x8c, 0x18, 0x14, 0x47,
2239 0x08, 0x82, 0xc1, 0x96, 0x16, 0xc7, 0x2c, 0xc3, 0x57, 0x05, 0x63, 0x08,
2240 0x03, 0x4c, 0x0c, 0x47, 0x04, 0xff, 0xa0, 0xf8, 0xc7, 0x2c, 0xc3, 0x65,
2241 0x05, 0x26, 0xfc, 0x83, 0xf8, 0xcf, 0x12, 0x60, 0x23, 0x06, 0xc6, 0x11,
2242 0x82, 0x60, 0xe1, 0x1f, 0x98, 0x5b, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82,
2243 0x60, 0xe1, 0x1f, 0x16, 0x5c, 0x04, 0x20, 0x61, 0x01, 0x48, 0x88, 0xbf,
2244 0x05, 0x20, 0x01, 0xfe, 0xb3, 0x04, 0xd8, 0x40, 0x05, 0xa0, 0x58, 0xc2,
2245 0x35, 0xc7, 0x20, 0x0f, 0x01, 0x4e, 0x8c, 0x21, 0x30, 0x2d, 0x31, 0x1c,
2246 0x11, 0xa0, 0x84, 0xe2, 0x1f, 0xb3, 0x0c, 0x5a, 0x16, 0x98, 0x80, 0x12,
2247 0xe2, 0x3f, 0x4b, 0xb0, 0x8d, 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f,
2248 0x60, 0x77, 0x31, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58,
2249 0x79, 0x11, 0xa4, 0x84, 0x05, 0x29, 0x21, 0xfe, 0x16, 0xa4, 0x04, 0xf8,
2250 0xcf, 0x12, 0x6c, 0x03, 0x15, 0x80, 0x92, 0x09, 0xda, 0x1c, 0x43, 0x12,
2251 0xd4, 0xc4, 0x18, 0x42, 0x55, 0x13, 0xc3, 0x11, 0x41, 0x4c, 0x28, 0xfe,
2252 0x31, 0xcb, 0xd0, 0x71, 0x81, 0x09, 0x31, 0x21, 0xfe, 0xb3, 0x04, 0xde,
2253 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x06, 0x1a, 0xc3, 0x88,
2254 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x25, 0x1a, 0x81, 0x4c, 0x58,
2255 0x20, 0x13, 0xe2, 0x6f, 0x81, 0x4c, 0x80, 0xff, 0x2c, 0x81, 0x37, 0x50,
2256 0x01, 0x28, 0x9c, 0xd0, 0xcd, 0x31, 0x24, 0x41, 0x4f, 0x8c, 0x18, 0x20,
2257 0x47, 0x08, 0x82, 0x85, 0x7f, 0x50, 0xa8, 0x11, 0x98, 0x04, 0x49, 0x0c,
2258 0x32, 0x04, 0x28, 0xc1, 0x13, 0xb3, 0x04, 0xdf, 0x40, 0x45, 0xe0, 0x07,
2259 0x94, 0xe0, 0x0d, 0x32, 0x04, 0x2d, 0xe1, 0x13, 0xb3, 0x04, 0x6d, 0x30,
2260 0xcb, 0x10, 0x06, 0x6d, 0xc0, 0x0f, 0x83, 0x0c, 0xbd, 0xe0, 0x12, 0x61,
2261 0x31, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xd1, 0xa5, 0x46, 0x20,
2262 0x12, 0x73, 0x0c, 0x2b, 0x11, 0xc4, 0xc5, 0x88, 0xc1, 0x71, 0x84, 0x20,
2263 0x58, 0xf8, 0x47, 0xb7, 0x1a, 0xc3, 0x48, 0xcc, 0x31, 0x08, 0xc1, 0x59,
2264 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xad, 0x51, 0x90,
2265 0xc4, 0x1c, 0x83, 0x10, 0xa0, 0xc5, 0x20, 0x43, 0x20, 0x13, 0x66, 0x31,
2266 0xc8, 0x10, 0x94, 0x83, 0x59, 0xec, 0x61, 0x70, 0x0b, 0xbc, 0x30, 0x0d,
2267 0x0a, 0x80, 0xb1, 0x87, 0x01, 0x2e, 0xf4, 0xe2, 0x34, 0x28, 0x00, 0xc6,
2268 0x1c, 0x03, 0x4e, 0x04, 0x7c, 0x31, 0xc8, 0x10, 0xe4, 0x84, 0x5b, 0x58,
2269 0x90, 0x88, 0xff, 0x20, 0x43, 0xb0, 0x13, 0x6f, 0x31, 0x62, 0x50, 0x1c,
2270 0x21, 0x08, 0x06, 0x9b, 0x6e, 0x1c, 0xb3, 0x0c, 0x6c, 0x20, 0x06, 0xc1,
2271 0x18, 0xc2, 0x10, 0x1a, 0xc3, 0x11, 0x01, 0x5c, 0x28, 0xfe, 0x31, 0xcb,
2272 0x40, 0x06, 0x63, 0x10, 0x98, 0x00, 0x17, 0xe2, 0x3f, 0x4b, 0x50, 0x06,
2273 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0xd8, 0x6f, 0x0c, 0x23,
2274 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x56, 0x78, 0x04, 0x71, 0x61,
2275 0x41, 0x5c, 0x88, 0xbf, 0x05, 0x71, 0x01, 0xfe, 0xb3, 0x04, 0x65, 0x30,
2276 0x50, 0x01, 0x28, 0x63, 0x20, 0x90, 0xc1, 0x1c, 0xc3, 0x58, 0x04, 0xa9,
2277 0x31, 0x86, 0xc0, 0xf8, 0xc5, 0x70, 0x44, 0x90, 0x17, 0x8a, 0x7f, 0xcc,
2278 0x32, 0x9c, 0x81, 0x19, 0x04, 0x26, 0xe4, 0x85, 0xf8, 0xcf, 0x12, 0xa0,
2279 0xc1, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x86, 0x1e, 0xc3,
2280 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xa5, 0x1e, 0x81, 0x5e,
2281 0x58, 0xa0, 0x17, 0xe2, 0x6f, 0x81, 0x5e, 0x80, 0xff, 0x2c, 0x01, 0x1a,
2282 0x0c, 0x54, 0x00, 0x8a, 0x19, 0x08, 0x67, 0x30, 0xc7, 0x90, 0x04, 0xa6,
2283 0x31, 0x86, 0x50, 0x99, 0xc6, 0x70, 0x44, 0x20, 0x1a, 0x8a, 0x7f, 0xcc,
2284 0x32, 0xa8, 0x41, 0x1a, 0x04, 0x26, 0x88, 0x86, 0xf8, 0xcf, 0x12, 0xac,
2285 0xc1, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x16, 0x1f, 0xc3,
2286 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x35, 0x1f, 0xc1, 0x68,
2287 0x58, 0x30, 0x1a, 0xe2, 0x6f, 0xc1, 0x68, 0x80, 0xff, 0x2c, 0xc1, 0x1a,
2288 0x0c, 0x54, 0x00, 0x4a, 0x1a, 0x08, 0x6a, 0x30, 0xc7, 0x90, 0x04, 0xae,
2289 0x31, 0x62, 0x80, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xe5, 0x47, 0x70,
2290 0x17, 0x75, 0x31, 0xc8, 0x10, 0xe4, 0x45, 0x6b, 0xcc, 0x12, 0xb0, 0xc1,
2291 0x40, 0x45, 0xe0, 0x07, 0x61, 0x20, 0xac, 0xc1, 0x20, 0x43, 0xe0, 0x17,
2292 0xaf, 0x31, 0x4b, 0xd0, 0x06, 0x03, 0x2d, 0x01, 0x8f, 0x18, 0x3c, 0x22,
2293 0xf1, 0xc8, 0x27, 0x0b, 0x6c, 0xc0, 0x23, 0x60, 0x30, 0xd0, 0x12, 0xa0,
2294 0x88, 0xa1, 0x17, 0x92, 0x39, 0x7c, 0x04, 0x1b, 0xf0, 0x0b, 0x18, 0x0c,
2295 0x32, 0x04, 0x42, 0x6c, 0x64, 0x10, 0x10, 0x03, 0x00, 0x12, 0x00, 0x00,
2296 0x00, 0x5b, 0x86, 0x20, 0x78, 0x87, 0x2d, 0x83, 0x11, 0xc0, 0xc3, 0x96,
2297 0x21, 0x0b, 0xe2, 0x61, 0xcb, 0xe0, 0x05, 0xf2, 0xb0, 0x65, 0x00, 0x83,
2298 0x60, 0x1e, 0xb6, 0x0c, 0x69, 0x10, 0xd0, 0xc3, 0x96, 0xc1, 0x0d, 0x82,
2299 0x7a, 0xd8, 0x32, 0xd4, 0x41, 0x60, 0x0f, 0x5b, 0x86, 0x3b, 0x08, 0xea,
2300 0x61, 0xcb, 0xb0, 0x0e, 0x81, 0x3d, 0x6c, 0x19, 0xda, 0x21, 0xa8, 0x87,
2301 0x2d, 0x43, 0x5a, 0x04, 0xf6, 0xb0, 0x65, 0x58, 0x8b, 0xa0, 0x1e, 0x00,
2302 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x73, 0x00, 0x00,
2303 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00,
2304 0x00, 0x74, 0xce, 0x00, 0xd0, 0x5b, 0x02, 0x45, 0x40, 0xf0, 0x58, 0x03,
2305 0x10, 0x08, 0x23, 0x00, 0x74, 0xcf, 0x41, 0x44, 0x8f, 0xd3, 0x06, 0x04,
2306 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20,
2307 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc, 0x00, 0x50, 0x31, 0x03,
2308 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8, 0x5f, 0xc6, 0xea, 0x97,
2309 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d, 0xee, 0xb8, 0xa7, 0xe2,
2310 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37, 0xd6, 0xb0, 0xce, 0x31,
2311 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7, 0xb1, 0x6a, 0x7f, 0x63,
2312 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c, 0x1b, 0xff, 0xc2, 0x98,
2313 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c, 0xfa, 0xbf, 0x2f, 0xd0,
2314 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8, 0x0b, 0x63, 0x0d, 0x73,
2315 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3, 0xbe, 0xc0, 0xe7, 0xac,
2316 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7, 0xd1, 0x0c, 0x47, 0x58,
2317 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc, 0x31, 0x24, 0x96, 0x18,
2318 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe, 0x83, 0x0c, 0x01, 0x23,
2319 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8, 0xc7, 0x2c, 0xc3, 0x90,
2320 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c, 0x03, 0x51, 0x04, 0x23,
2321 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x5d, 0x28, 0x7c, 0xce, 0x1c,
2322 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x47,
2323 0x37, 0x0a, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01, 0x37, 0x62, 0x70, 0x1c,
2324 0x21, 0x08, 0x16, 0xfe, 0xd1, 0x95, 0xc2, 0x18, 0x40, 0x73, 0x0c, 0x42,
2325 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40, 0x70, 0xc3, 0x18, 0x42,
2326 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21, 0x0c, 0x61, 0x30, 0x62,
2327 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xa5, 0x82, 0x10, 0x8c, 0x18,
2328 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0xaa, 0x40, 0x04, 0xc3, 0x11,
2329 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04, 0x83, 0x0c, 0x87, 0x47,
2330 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06, 0xe0, 0x6f, 0xc5, 0x1a,
2331 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04, 0xe4, 0x3f, 0xc7, 0x20,
2332 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0, 0x06, 0x16, 0x20, 0xe2,
2333 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12, 0x1c, 0x03, 0x15, 0x81,
2334 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9, 0x20, 0x43, 0x90, 0x06,
2335 0x6f, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xd1, 0xe9, 0x42,
2336 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2, 0x88, 0xc1, 0x71, 0x84,
2337 0x20, 0x58, 0xf8, 0x47, 0xc7, 0x0b, 0x43, 0x19, 0xcc, 0x31, 0x08, 0x41,
2338 0x1d, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x74, 0xbe, 0x50,
2339 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c, 0x41, 0x32, 0x50, 0x12,
2340 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7, 0x20, 0x43, 0x10, 0x07,
2341 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00,
2342 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xc0, 0x09, 0x18, 0xe0, 0xac,
2343 0x80, 0x07, 0xb5, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0c, 0x00,
2344 0x00, 0x6d, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0x68, 0x03, 0x00, 0x00,
2345 0x00, 0x03, 0x00, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00,
2346 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
2347 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
2348 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x01, 0x00,
2349 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
2350 0x00, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00,
2351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
2352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
2353 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2354 0xff, 0x00, 0x24, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
2355 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2356 0xff, 0x00, 0x30, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
2357 0x00, 0x48, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2358 0xff, 0x08, 0x24, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
2359 0x00, 0x5c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2360 0xff, 0x08, 0x24, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
2361 0x00, 0x6c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2362 0xff, 0x08, 0x24, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
2363 0x00, 0x7d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2364 0xff, 0x08, 0x24, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
2365 0x00, 0x93, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2366 0xff, 0x08, 0x24, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00,
2367 0x00, 0xa0, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2368 0xff, 0x00, 0x30, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
2369 0x00, 0xb9, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2370 0xff, 0x08, 0x24, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
2371 0x00, 0xca, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2372 0xff, 0x08, 0x24, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
2373 0x00, 0xdc, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2374 0xff, 0x08, 0x24, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
2375 0x00, 0xef, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2376 0xff, 0x08, 0x24, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00,
2377 0x00, 0x02, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2378 0xff, 0x08, 0x24, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00,
2379 0x00, 0x23, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
2380 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x0c, 0x00,
2381 0x00, 0x5d, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94, 0xe7, 0x02, 0x00, 0x00,
2382 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x59, 0x55, 0x56, 0x5f, 0x66, 0x72, 0x61,
2383 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a, 0x31, 0x34, 0x47, 0x65, 0x74,
2384 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x44,
2385 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31, 0x31, 0x4d, 0x54, 0x4c, 0x63,
2386 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x4b, 0x31, 0x35, 0x53, 0x68,
2387 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74,
2388 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c,
2389 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72,
2390 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x66, 0x33,
2391 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61,
2392 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f,
2393 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75, 0x2e, 0x69, 0x31, 0x2e, 0x66,
2394 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x64, 0x6f, 0x74, 0x2e,
2395 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a, 0x31, 0x32, 0x41, 0x70, 0x70,
2396 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x44, 0x76, 0x33,
2397 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61,
2398 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x66, 0x33, 0x32, 0x61,
2399 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x77, 0x2e,
2400 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73,
2401 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32,
2402 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61,
2403 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73,
2404 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72,
2405 0x65, 0x5f, 0x32, 0x64, 0x5f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x76,
2406 0x34, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70,
2407 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32,
2408 0x64, 0x2e, 0x76, 0x34, 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33,
2409 0x2e, 0x34, 0x30, 0x34, 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70,
2410 0x70, 0x6c, 0x65, 0x2d, 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30,
2411 0x2e, 0x30, 0x2d, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72,
2412 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xc0, 0x17, 0x0b, 0x00, 0x00, 0x00,
2413 0x00, 0x14, 0x00, 0x00, 0x00, 0xa4, 0x22, 0x00, 0x00, 0xff, 0xff, 0xff,
2414 0xff, 0x42, 0x43, 0xc0, 0xde, 0x35, 0x14, 0x00, 0x00, 0x03, 0x00, 0x00,
2415 0x00, 0x62, 0x0c, 0x30, 0x24, 0x80, 0x10, 0x05, 0xc8, 0x14, 0x00, 0x00,
2416 0x00, 0x21, 0x0c, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0x0b, 0x02, 0x21,
2417 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23,
2418 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84,
2419 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45,
2420 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18,
2421 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88,
2422 0xa5, 0x00, 0x19, 0x32, 0x42, 0x04, 0x49, 0x0e, 0x90, 0x11, 0x23, 0xc4,
2423 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46,
2424 0x06, 0x51, 0x18, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x1b, 0xc2, 0x24,
2425 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01, 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22,
2426 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1, 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1,
2427 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21,
2428 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80,
2429 0x68, 0x87, 0x74, 0x70, 0x87, 0x36, 0x60, 0x87, 0x72, 0x38, 0x87, 0x70,
2430 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79,
2431 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72, 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40,
2432 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1, 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21,
2433 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1, 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1,
2434 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21, 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00,
2435 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81, 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0,
2436 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72,
2437 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x30, 0x07, 0x79, 0x08, 0x87, 0x76,
2438 0x28, 0x87, 0x36, 0x80, 0x87, 0x77, 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72,
2439 0x90, 0x87, 0x36, 0x28, 0x07, 0x76, 0x48, 0x87, 0x76, 0x68, 0x03, 0x77,
2440 0x78, 0x07, 0x77, 0x68, 0x03, 0x76, 0x28, 0x87, 0x70, 0x30, 0x07, 0x80,
2441 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20,
2442 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1, 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0,
2443 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01, 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72,
2444 0x00, 0x08, 0x77, 0x78, 0x87, 0x36, 0x70, 0x87, 0x70, 0x70, 0x87, 0x79,
2445 0x68, 0x03, 0x73, 0x80, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74,
2446 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1,
2447 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1, 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40,
2448 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61, 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1,
2449 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a,
2450 0x28, 0x07, 0x80, 0x70, 0x87, 0x77, 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70,
2451 0x80, 0x07, 0x78, 0x48, 0x07, 0x77, 0x38, 0x87, 0x36, 0x68, 0x87, 0x70,
2452 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62,
2453 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61, 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1,
2454 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81, 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40,
2455 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21,
2456 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c, 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79,
2457 0x08, 0x07, 0x73, 0x28, 0x87, 0x36, 0x30, 0x07, 0x78, 0x68, 0x83, 0x76,
2458 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
2459 0xd8, 0xe0, 0x09, 0x04, 0xb0, 0x00, 0x55, 0x90, 0x06, 0x60, 0x30, 0x84,
2460 0x43, 0x3a, 0xc8, 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94,
2461 0x83, 0x3c, 0xb4, 0x81, 0x3b, 0xbc, 0x43, 0x1b, 0x84, 0x03, 0x3b, 0xa4,
2462 0x43, 0x38, 0xcc, 0x03, 0xb0, 0xc1, 0x1b, 0x0a, 0x60, 0x01, 0xaa, 0x20,
2463 0x0d, 0x40, 0x61, 0x08, 0x87, 0x74, 0x90, 0x87, 0x36, 0x10, 0x87, 0x7a,
2464 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0x68, 0x03, 0x77, 0x78, 0x87, 0x36,
2465 0x08, 0x07, 0x76, 0x48, 0x87, 0x70, 0x98, 0x07, 0x60, 0x83, 0x41, 0x20,
2466 0xc0, 0x02, 0x54, 0x1b, 0xc2, 0xa4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x01,
2467 0x58, 0x03, 0x40, 0x02, 0x2a, 0x22, 0x1c, 0xe0, 0x01, 0x1e, 0xe4, 0xe1,
2468 0x1d, 0xf0, 0xa1, 0x0d, 0xcc, 0xa1, 0x1e, 0xdc, 0x61, 0x1c, 0xda, 0xc0,
2469 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01, 0x1d, 0x00, 0x7a,
2470 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x68, 0x87, 0x74, 0x70, 0x87, 0x36,
2471 0x60, 0x87, 0x72, 0x38, 0x87, 0x70, 0x60, 0x87, 0x36, 0xb0, 0x87, 0x72,
2472 0x18, 0x07, 0x7a, 0x78, 0x07, 0x79, 0x68, 0x83, 0x7b, 0x48, 0x07, 0x72,
2473 0xa0, 0x07, 0x74, 0x00, 0xe2, 0x40, 0x0e, 0xf0, 0x00, 0x18, 0xdc, 0xe1,
2474 0x1d, 0xda, 0x40, 0x1c, 0xea, 0x21, 0x1d, 0xd8, 0x81, 0x1e, 0xd2, 0xc1,
2475 0x1d, 0xe6, 0x01, 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0xc0, 0x1c, 0xe4, 0x21,
2476 0x1c, 0xda, 0xa1, 0x1c, 0xda, 0x00, 0x1e, 0xde, 0x21, 0x1d, 0xdc, 0x81,
2477 0x1e, 0xca, 0x41, 0x1e, 0xda, 0xa0, 0x1c, 0xd8, 0x21, 0x1d, 0xda, 0x01,
2478 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
2479 0x30, 0x07, 0x79, 0x08, 0x87, 0x76, 0x28, 0x87, 0x36, 0x80, 0x87, 0x77,
2480 0x48, 0x07, 0x77, 0xa0, 0x87, 0x72, 0x90, 0x87, 0x36, 0x28, 0x07, 0x76,
2481 0x48, 0x87, 0x76, 0x68, 0x03, 0x77, 0x78, 0x07, 0x77, 0x68, 0x03, 0x76,
2482 0x28, 0x87, 0x70, 0x30, 0x07, 0x80, 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01,
2483 0x20, 0xdc, 0xe1, 0x1d, 0xda, 0x20, 0x1d, 0xdc, 0xc1, 0x1c, 0xe6, 0xa1,
2484 0x0d, 0xcc, 0x01, 0x1e, 0xda, 0xa0, 0x1d, 0xc2, 0x81, 0x1e, 0xd0, 0x01,
2485 0xa0, 0x07, 0x79, 0xa8, 0x87, 0x72, 0x00, 0x08, 0x77, 0x78, 0x87, 0x36,
2486 0x70, 0x87, 0x70, 0x70, 0x87, 0x79, 0x68, 0x03, 0x73, 0x80, 0x87, 0x36,
2487 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41, 0x1e, 0xea, 0xa1,
2488 0x1c, 0x00, 0xc2, 0x1d, 0xde, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xce, 0xc1,
2489 0x1d, 0xca, 0x81, 0x1c, 0xda, 0x40, 0x1f, 0xca, 0x41, 0x1e, 0xde, 0x61,
2490 0x1e, 0xda, 0xc0, 0x1c, 0xe0, 0xa1, 0x0d, 0xda, 0x21, 0x1c, 0xe8, 0x01,
2491 0x1d, 0x00, 0x7a, 0x90, 0x87, 0x7a, 0x28, 0x07, 0x80, 0x70, 0x87, 0x77,
2492 0x68, 0x03, 0x7a, 0x90, 0x87, 0x70, 0x80, 0x07, 0x78, 0x48, 0x07, 0x77,
2493 0x38, 0x87, 0x36, 0x68, 0x87, 0x70, 0xa0, 0x07, 0x74, 0x00, 0xe8, 0x41,
2494 0x1e, 0xea, 0xa1, 0x1c, 0x00, 0x62, 0x1e, 0xe8, 0x21, 0x1c, 0xc6, 0x61,
2495 0x1d, 0xda, 0x00, 0x1e, 0xe4, 0xe1, 0x1d, 0xe8, 0xa1, 0x1c, 0xc6, 0x81,
2496 0x1e, 0xde, 0x41, 0x1e, 0xda, 0x40, 0x1c, 0xea, 0xc1, 0x1c, 0xcc, 0xa1,
2497 0x1c, 0xe4, 0xa1, 0x0d, 0xe6, 0x21, 0x1d, 0xf4, 0xa1, 0x1c, 0x00, 0x3c,
2498 0x00, 0x88, 0x7a, 0x70, 0x87, 0x79, 0x08, 0x07, 0x73, 0x28, 0x87, 0x36,
2499 0x30, 0x07, 0x78, 0x68, 0x83, 0x76, 0x08, 0x07, 0x7a, 0x40, 0x07, 0x80,
2500 0x1e, 0xe4, 0xa1, 0x1e, 0xca, 0x01, 0xd8, 0x90, 0x18, 0x02, 0xb0, 0x00,
2501 0x55, 0x90, 0x06, 0x60, 0xb0, 0xc1, 0x38, 0xfe, 0xff, 0xff, 0xff, 0x7f,
2502 0x00, 0x24, 0x80, 0xda, 0xe0, 0x23, 0xc8, 0xff, 0xff, 0xff, 0xff, 0x0f,
2503 0x80, 0x04, 0x54, 0x44, 0x38, 0xc0, 0x03, 0x3c, 0xc8, 0xc3, 0x3b, 0xe0,
2504 0x43, 0x1b, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb4, 0x81, 0x39, 0xc0,
2505 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f,
2506 0xf5, 0x50, 0x0e, 0x00, 0xd1, 0x0e, 0xe9, 0xe0, 0x0e, 0x6d, 0xc0, 0x0e,
2507 0xe5, 0x70, 0x0e, 0xe1, 0xc0, 0x0e, 0x6d, 0x60, 0x0f, 0xe5, 0x30, 0x0e,
2508 0xf4, 0xf0, 0x0e, 0xf2, 0xd0, 0x06, 0xf7, 0x90, 0x0e, 0xe4, 0x40, 0x0f,
2509 0xe8, 0x00, 0xe4, 0x81, 0x1d, 0x00, 0x83, 0x3b, 0xbc, 0x43, 0x1b, 0x88,
2510 0x43, 0x3d, 0xa4, 0x03, 0x3b, 0xd0, 0x43, 0x3a, 0xb8, 0xc3, 0x3c, 0x00,
2511 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94,
2512 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8,
2513 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0x00, 0xf4, 0x20, 0x0f,
2514 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe6, 0x20, 0x0f,
2515 0xe1, 0xd0, 0x0e, 0xe5, 0xd0, 0x06, 0xf0, 0xf0, 0x0e, 0xe9, 0xe0, 0x0e,
2516 0xf4, 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xe5, 0xc0, 0x0e, 0xe9, 0xd0, 0x0e,
2517 0x6d, 0xe0, 0x0e, 0xef, 0xe0, 0x0e, 0x6d, 0xc0, 0x0e, 0xe5, 0x10, 0x0e,
2518 0xe6, 0x00, 0xd0, 0x83, 0x3c, 0xd4, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc,
2519 0x43, 0x1b, 0xa4, 0x83, 0x3b, 0x98, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0,
2520 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xf4, 0x20, 0x0f,
2521 0xf5, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xee, 0x10, 0x0e,
2522 0xee, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e,
2523 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94, 0x03, 0x40, 0xb8,
2524 0xc3, 0x3b, 0xb4, 0xc1, 0x3c, 0xa4, 0xc3, 0x39, 0xb8, 0x43, 0x39, 0x90,
2525 0x43, 0x1b, 0xe8, 0x43, 0x39, 0xc8, 0xc3, 0x3b, 0xcc, 0x43, 0x1b, 0x98,
2526 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x40, 0x0f,
2527 0xf2, 0x50, 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x40, 0x0f,
2528 0xf2, 0x10, 0x0e, 0xf0, 0x00, 0x0f, 0xe9, 0xe0, 0x0e, 0xe7, 0xd0, 0x06,
2529 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x00, 0x3d, 0xc8, 0x43, 0x3d, 0x94,
2530 0x03, 0x40, 0xcc, 0x03, 0x3d, 0x84, 0xc3, 0x38, 0xac, 0x43, 0x1b, 0xc0,
2531 0x83, 0x3c, 0xbc, 0x03, 0x3d, 0x94, 0xc3, 0x38, 0xd0, 0xc3, 0x3b, 0xc8,
2532 0x43, 0x1b, 0x88, 0x43, 0x3d, 0x98, 0x83, 0x39, 0x94, 0x83, 0x3c, 0xb4,
2533 0xc1, 0x3c, 0xa4, 0x83, 0x3e, 0x94, 0x03, 0x80, 0x07, 0x00, 0x51, 0x0f,
2534 0xee, 0x30, 0x0f, 0xe1, 0x60, 0x0e, 0xe5, 0xd0, 0x06, 0xe6, 0x00, 0x0f,
2535 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0xd0, 0x83, 0x3c, 0xd4,
2536 0x43, 0x39, 0x00, 0x1b, 0x94, 0xe4, 0xff, 0xff, 0xff, 0xff, 0x07, 0xa0,
2537 0x0d, 0x80, 0x35, 0x00, 0x24, 0xa0, 0xda, 0x60, 0x28, 0x01, 0xb0, 0x00,
2538 0xd5, 0x06, 0x63, 0x11, 0x80, 0x05, 0xa8, 0x36, 0x28, 0xcc, 0xff, 0xff,
2539 0xff, 0xff, 0x0f, 0x40, 0x1b, 0x00, 0x6b, 0x00, 0x48, 0x40, 0xb5, 0xc1,
2540 0x68, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x24, 0x80, 0xda, 0x30, 0x39,
2541 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x6b, 0x00, 0x28, 0x83, 0x3b, 0xbc,
2542 0x43, 0x1b, 0x88, 0x43, 0x3d, 0xa4, 0x03, 0x3b, 0xd0, 0x43, 0x3a, 0xb8,
2543 0xc3, 0x3c, 0x00, 0x1b, 0x8a, 0x47, 0x08, 0xd2, 0x00, 0x0c, 0x36, 0x44,
2544 0xd0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x32, 0xb8, 0xc3, 0x3b, 0xb4,
2545 0x81, 0x38, 0xd4, 0x43, 0x3a, 0xb0, 0x03, 0x3d, 0xa4, 0x83, 0x3b, 0xcc,
2546 0x03, 0x00, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00,
2547 0x00, 0x13, 0x88, 0x40, 0x18, 0x88, 0x09, 0x42, 0x61, 0x4c, 0x08, 0x8e,
2548 0x09, 0x01, 0x32, 0x61, 0x48, 0x94, 0x65, 0xc2, 0xc0, 0x28, 0xcb, 0x84,
2549 0xa0, 0x99, 0x20, 0x38, 0xcf, 0x84, 0x00, 0x02, 0x00, 0x89, 0x20, 0x00,
2550 0x00, 0x48, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, 0x20, 0x64, 0x85,
2551 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90,
2552 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xd0, 0xc1,
2553 0x0c, 0xc0, 0x30, 0x02, 0x01, 0x0c, 0x23, 0x08, 0xc0, 0x59, 0xd2, 0x14,
2554 0x51, 0xc2, 0xe4, 0xb3, 0x07, 0x30, 0x10, 0x11, 0xe7, 0x34, 0xd2, 0x04,
2555 0x34, 0x93, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x84,
2556 0x41, 0x18, 0x46, 0x18, 0x80, 0x1c, 0x28, 0x66, 0xa2, 0xe6, 0x81, 0x1e,
2557 0xe4, 0xa1, 0x1e, 0xc6, 0x81, 0x1e, 0xdc, 0xa0, 0x1d, 0xca, 0x81, 0x1e,
2558 0xc2, 0x81, 0x1d, 0xf4, 0x40, 0x0f, 0xda, 0x21, 0x1c, 0xe8, 0x41, 0x1e,
2559 0xd2, 0x01, 0x1f, 0x50, 0x60, 0x1c, 0x24, 0x4d, 0x11, 0x25, 0x4c, 0xbe,
2560 0xec, 0xbe, 0x1d, 0x21, 0x38, 0x03, 0x81, 0x84, 0xe2, 0x18, 0x44, 0x40,
2561 0x84, 0xa3, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0xff, 0x27, 0xe2, 0x9a, 0xa8,
2562 0x88, 0xf8, 0xed, 0xe1, 0x9f, 0xc6, 0x08, 0x80, 0x41, 0x04, 0x25, 0xb8,
2563 0x48, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x5f, 0x02, 0x98, 0x67, 0x21, 0xa2,
2564 0x7f, 0x1a, 0x23, 0x00, 0x06, 0x11, 0x18, 0xa1, 0x24, 0x41, 0x10, 0x08,
2565 0x44, 0xb2, 0x2c, 0x0d, 0x39, 0x65, 0x08, 0x02, 0x82, 0xa0, 0x42, 0x14,
2566 0x45, 0x51, 0x90, 0x54, 0x06, 0x00, 0x00, 0x88, 0x2a, 0x02, 0x00, 0x90,
2567 0x35, 0x47, 0x10, 0x14, 0x01, 0x03, 0x28, 0x2b, 0x03, 0x50, 0x14, 0xb4,
2568 0x15, 0xa3, 0x28, 0x00, 0x00, 0x00, 0xa8, 0x2b, 0x43, 0x51, 0x14, 0xf4,
2569 0x15, 0xa1, 0x28, 0x28, 0x9c, 0x23, 0x40, 0x8c, 0x10, 0x8c, 0x73, 0x04,
2570 0x60, 0x30, 0x8c, 0x20, 0x94, 0x41, 0x51, 0xc8, 0xa5, 0x11, 0x30, 0x13,
2571 0x03, 0x80, 0x92, 0xce, 0x81, 0x80, 0x14, 0x28, 0xe7, 0x08, 0x40, 0x61,
2572 0x10, 0x01, 0x10, 0xa6, 0x00, 0x46, 0x00, 0x86, 0x11, 0x86, 0x32, 0x18,
2573 0x44, 0x08, 0x84, 0x41, 0x84, 0x43, 0x18, 0x44, 0x28, 0x84, 0x61, 0x04,
2574 0xa2, 0x0c, 0x00, 0x00, 0x00, 0x13, 0xc0, 0x20, 0x1c, 0xd2, 0x41, 0x1e,
2575 0xec, 0x80, 0x0e, 0xda, 0x20, 0x1c, 0xe0, 0x01, 0x1e, 0xd8, 0xa1, 0x1c,
2576 0xda, 0x80, 0x1e, 0xec, 0xe1, 0x1d, 0xe6, 0x21, 0x0e, 0xe6, 0xc0, 0x0d,
2577 0xe0, 0xc0, 0x0d, 0xe0, 0xa0, 0x0d, 0xe6, 0x21, 0x1d, 0xda, 0xa1, 0x1e,
2578 0xd8, 0x21, 0x1c, 0xe8, 0xe1, 0x1d, 0xe4, 0x61, 0xc3, 0x6d, 0x94, 0x43,
2579 0x1b, 0xc0, 0x83, 0x1e, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81,
2580 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1e, 0xe0, 0x81,
2581 0x1e, 0xe0, 0x41, 0x1b, 0xa4, 0x03, 0x1e, 0xe8, 0x01, 0x1e, 0xe8, 0x01,
2582 0x1e, 0xb4, 0x41, 0x3a, 0xc4, 0x81, 0x1d, 0xe8, 0x41, 0x1c, 0xd8, 0x81,
2583 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x41, 0x3a, 0xcc, 0x81, 0x1c, 0xe8, 0xc1,
2584 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x41, 0x3a, 0xd8, 0x01,
2585 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81,
2586 0x39, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81,
2587 0x1c, 0xb4, 0x81, 0x39, 0xd8, 0x01, 0x1d, 0xe8, 0x81, 0x1d, 0xd0, 0x81,
2588 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1d, 0xe8, 0x41,
2589 0x1c, 0xd8, 0x81, 0x1e, 0xc4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x01,
2590 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81, 0x1c, 0xb4, 0x81,
2591 0x3d, 0xcc, 0x81, 0x1c, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x1e, 0xcc, 0x81,
2592 0x1c, 0xb4, 0x81, 0x3d, 0xd0, 0x01, 0x1e, 0xe8, 0x81, 0x1d, 0xd0, 0x81,
2593 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xd8, 0x01, 0x1d, 0xe8, 0x81,
2594 0x1d, 0xd0, 0x81, 0x1e, 0xd8, 0x01, 0x1d, 0xb4, 0x81, 0x3d, 0xe4, 0x81,
2595 0x1d, 0xe8, 0x41, 0x1c, 0xc8, 0x01, 0x1e, 0xe8, 0x41, 0x1c, 0xc8, 0x01,
2596 0x1e, 0xb4, 0x81, 0x3d, 0xc4, 0x81, 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81,
2597 0x1c, 0xe0, 0x81, 0x1e, 0xc4, 0x81, 0x1c, 0xe0, 0x41, 0x1b, 0xd8, 0x43,
2598 0x1c, 0xe4, 0x81, 0x1c, 0xe8, 0x81, 0x1c, 0xd4, 0x81, 0x1d, 0xe8, 0x81,
2599 0x1c, 0xd4, 0x81, 0x1d, 0xb4, 0x81, 0x3d, 0xc8, 0x41, 0x1d, 0xd8, 0x81,
2600 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x81, 0x1e, 0xc8, 0x41, 0x1d, 0xd8, 0x41,
2601 0x1b, 0xd8, 0x43, 0x1d, 0xc4, 0x81, 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81,
2602 0x1c, 0xe8, 0x41, 0x1d, 0xc4, 0x81, 0x1c, 0xb4, 0x81, 0x3d, 0xc4, 0x01,
2603 0x1c, 0xc8, 0x01, 0x1d, 0xe8, 0x41, 0x1c, 0xc0, 0x81, 0x1c, 0xd0, 0x81,
2604 0x1e, 0xc4, 0x01, 0x1c, 0xc8, 0x01, 0x1d, 0xb4, 0x81, 0x3b, 0xe0, 0x81,
2605 0x1e, 0xc4, 0x81, 0x1d, 0xe8, 0xc1, 0x1c, 0xc8, 0x81, 0x46, 0x08, 0x43,
2606 0x46, 0x6c, 0x57, 0xfe, 0xe7, 0x5b, 0xdb, 0x7f, 0x11, 0x01, 0x06, 0x43,
2607 0x34, 0xd3, 0x90, 0x08, 0x88, 0x1c, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
2608 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0x45, 0x78, 0x00, 0x21, 0xc0, 0x20,
2609 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x28, 0x15, 0x28,
2610 0x09, 0x08, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x86,
2611 0x44, 0xbd, 0x00, 0x51, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0x00,
2612 0x00, 0x00, 0x30, 0x24, 0x6a, 0x87, 0xc8, 0x02, 0x02, 0x60, 0x00, 0x00,
2613 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x21, 0x91, 0x3f, 0x58, 0x19, 0x10,
2614 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, 0x68,
2615 0xa2, 0xd9, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
2616 0x60, 0x48, 0x14, 0x16, 0x59, 0x87, 0x00, 0x03, 0x01, 0x00, 0x00, 0x10,
2617 0x00, 0x00, 0x00, 0x00, 0x43, 0x22, 0xbd, 0x88, 0x28, 0x20, 0x00, 0x06,
2618 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x12, 0xad, 0x86, 0xf4,
2619 0x01, 0x01, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xc0, 0x90,
2620 0xa8, 0x37, 0xa6, 0x30, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00,
2621 0x00, 0x00, 0x80, 0x21, 0x11, 0x7c, 0x4c, 0x1f, 0x10, 0x00, 0x03, 0x00,
2622 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x89, 0x46, 0x64, 0x3b, 0x03,
2623 0x20, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0xd8,
2624 0x20, 0x50, 0x54, 0xfc, 0x00, 0x00, 0x20, 0x0b, 0x04, 0x10, 0x00, 0x00,
2625 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26,
2626 0x47, 0xc6, 0x04, 0x43, 0x2a, 0x8b, 0xa0, 0x04, 0x0a, 0x61, 0x04, 0xa0,
2627 0x0c, 0x0a, 0xa8, 0x20, 0x0a, 0xa3, 0x40, 0x0a, 0xa5, 0x60, 0x0a, 0xa7,
2628 0x00, 0x03, 0x0a, 0xac, 0x14, 0x8a, 0xa1, 0x1c, 0x68, 0x1d, 0x01, 0x28,
2629 0x84, 0x82, 0x28, 0x8c, 0x02, 0x29, 0x94, 0x82, 0x29, 0x1c, 0x52, 0xc7,
2630 0x12, 0x24, 0x01, 0x00, 0x00, 0xb1, 0x18, 0x00, 0x00, 0xa5, 0x00, 0x00,
2631 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d,
2632 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07,
2633 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80,
2634 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66,
2635 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d,
2636 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07,
2637 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03,
2638 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90,
2639 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50,
2640 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2,
2641 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39,
2642 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14,
2643 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07,
2644 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07,
2645 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87,
2646 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0,
2647 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8,
2648 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc,
2649 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6,
2650 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39,
2651 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f,
2652 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c,
2653 0xc7, 0x69, 0x87, 0x70, 0x58, 0x87, 0x72, 0x70, 0x83, 0x74, 0x68, 0x07,
2654 0x78, 0x60, 0x87, 0x74, 0x18, 0x87, 0x74, 0xa0, 0x87, 0x19, 0xce, 0x53,
2655 0x0f, 0xee, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe4, 0x90, 0x0e, 0xe3, 0x40,
2656 0x0f, 0xe1, 0x20, 0x0e, 0xec, 0x50, 0x0e, 0x33, 0x20, 0x28, 0x1d, 0xdc,
2657 0xc1, 0x1e, 0xc2, 0x41, 0x1e, 0xd2, 0x21, 0x1c, 0xdc, 0x81, 0x1e, 0xdc,
2658 0xe0, 0x1c, 0xe4, 0xe1, 0x1d, 0xea, 0x01, 0x1e, 0x66, 0x18, 0x51, 0x38,
2659 0xb0, 0x43, 0x3a, 0x9c, 0x83, 0x3b, 0xcc, 0x50, 0x24, 0x76, 0x60, 0x07,
2660 0x7b, 0x68, 0x07, 0x37, 0x60, 0x87, 0x77, 0x78, 0x07, 0x78, 0x98, 0x51,
2661 0x4c, 0xf4, 0x90, 0x0f, 0xf0, 0x50, 0x0e, 0x33, 0x1e, 0x6a, 0x1e, 0xca,
2662 0x61, 0x1c, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d, 0x7e, 0x01, 0x1e, 0xe4,
2663 0xa1, 0x1c, 0xcc, 0x21, 0x1d, 0xf0, 0x61, 0x06, 0x54, 0x85, 0x83, 0x38,
2664 0xcc, 0xc3, 0x3b, 0xb0, 0x43, 0x3d, 0xd0, 0x43, 0x39, 0xfc, 0xc2, 0x3c,
2665 0xe4, 0x43, 0x3b, 0x88, 0xc3, 0x3b, 0xb0, 0xc3, 0x8c, 0xc5, 0x0a, 0x87,
2666 0x79, 0x98, 0x87, 0x77, 0x18, 0x87, 0x74, 0x08, 0x07, 0x7a, 0x28, 0x07,
2667 0x72, 0x98, 0x81, 0x5c, 0xe3, 0x10, 0x0e, 0xec, 0xc0, 0x0e, 0xe5, 0x50,
2668 0x0e, 0xf3, 0x30, 0x23, 0xc1, 0xd2, 0x41, 0x1e, 0xe4, 0xe1, 0x17, 0xd8,
2669 0xe1, 0x1d, 0xde, 0x01, 0x1e, 0x66, 0x48, 0x19, 0x3b, 0xb0, 0x83, 0x3d,
2670 0xb4, 0x83, 0x1b, 0x84, 0xc3, 0x38, 0x8c, 0x43, 0x39, 0xcc, 0xc3, 0x3c,
2671 0xb8, 0xc1, 0x39, 0xc8, 0xc3, 0x3b, 0xd4, 0x03, 0x3c, 0xcc, 0x48, 0xb4,
2672 0x71, 0x08, 0x07, 0x76, 0x60, 0x07, 0x71, 0x08, 0x87, 0x71, 0x58, 0x87,
2673 0x19, 0xdb, 0xc6, 0x0e, 0xec, 0x60, 0x0f, 0xed, 0xe0, 0x06, 0xf0, 0x20,
2674 0x0f, 0xe5, 0x30, 0x0f, 0xe5, 0x20, 0x0f, 0xf6, 0x50, 0x0e, 0x6e, 0x10,
2675 0x0e, 0xe3, 0x30, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, 0xe0, 0x06, 0xe9, 0xe0,
2676 0x0e, 0xe4, 0x50, 0x0e, 0xf8, 0x30, 0x23, 0xe2, 0xec, 0x61, 0x1c, 0xc2,
2677 0x81, 0x1d, 0xd8, 0xe1, 0x17, 0xec, 0x21, 0x1d, 0xe6, 0x21, 0x1d, 0xc4,
2678 0x21, 0x1d, 0xd8, 0x21, 0x1d, 0xe8, 0x21, 0x1f, 0x66, 0x20, 0x9d, 0x3b,
2679 0xbc, 0x43, 0x3d, 0xb8, 0x03, 0x39, 0x94, 0x83, 0x39, 0xcc, 0x58, 0xbc,
2680 0x70, 0x70, 0x07, 0x77, 0x78, 0x07, 0x7a, 0x08, 0x07, 0x7a, 0x48, 0x87,
2681 0x77, 0x70, 0x87, 0x19, 0xce, 0x87, 0x0e, 0xe5, 0x10, 0x0e, 0xf0, 0x10,
2682 0x0e, 0xec, 0xc0, 0x0e, 0xef, 0x30, 0x0e, 0xf3, 0x90, 0x0e, 0xf4, 0x50,
2683 0x0e, 0x33, 0x28, 0x30, 0x08, 0x87, 0x74, 0x90, 0x07, 0x37, 0x30, 0x87,
2684 0x7a, 0x70, 0x87, 0x71, 0xa0, 0x87, 0x74, 0x78, 0x07, 0x77, 0xf8, 0x85,
2685 0x73, 0x90, 0x87, 0x77, 0xa8, 0x07, 0x78, 0x98, 0x07, 0x00, 0x00, 0x00,
2686 0x00, 0x79, 0x20, 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x32, 0x9a, 0x08,
2687 0x14, 0x02, 0x85, 0x8c, 0x27, 0x46, 0x46, 0xc8, 0x11, 0x32, 0x64, 0xd4,
2688 0xf2, 0x00, 0x0e, 0xdc, 0x0c, 0x8b, 0x12, 0x07, 0xc5, 0xc6, 0x91, 0x41,
2689 0x14, 0x19, 0x8c, 0x22, 0x31, 0x88, 0x64, 0x3d, 0x45, 0x66, 0x20, 0xca,
2690 0x23, 0x21, 0x54, 0xc1, 0x30, 0xca, 0xe2, 0x3c, 0xcf, 0x13, 0x5d, 0x4f,
2691 0x60, 0x18, 0x88, 0x91, 0x18, 0x8b, 0x82, 0x11, 0xc5, 0x72, 0x04, 0xd5,
2692 0xf3, 0x00, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4b, 0x20, 0x56, 0x65, 0x72,
2693 0x73, 0x69, 0x6f, 0x6e, 0x77, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x69,
2694 0x7a, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61,
2695 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x33, 0x32,
2696 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34, 0x20, 0x28, 0x6d, 0x65, 0x74,
2697 0x61, 0x6c, 0x66, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34,
2698 0x30, 0x34, 0x29, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x61, 0x69, 0x72, 0x2e,
2699 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x64, 0x65, 0x6e, 0x6f,
2700 0x72, 0x6d, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x61,
2701 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66,
2702 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x61,
2703 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69,
2704 0x6c, 0x65, 0x2e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66,
2705 0x65, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61,
2706 0x62, 0x6c, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65,
2707 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x61, 0x69, 0x72, 0x2e,
2708 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
2709 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x61, 0x69, 0x72, 0x2e, 0x70,
2710 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x63,
2711 0x65, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e, 0x6e, 0x6f, 0x5f,
2712 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x61,
2713 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x70,
2714 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x69, 0x72, 0x2e, 0x66,
2715 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x70, 0x75,
2716 0x74, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x28, 0x35,
2717 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x29, 0x61,
2718 0x69, 0x72, 0x2e, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69,
2719 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x65, 0x6e, 0x65, 0x72,
2720 0x61, 0x74, 0x65, 0x64, 0x28, 0x38, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f,
2721 0x72, 0x64, 0x44, 0x76, 0x32, 0x5f, 0x66, 0x29, 0x66, 0x6c, 0x6f, 0x61,
2722 0x74, 0x32, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x61, 0x69,
2723 0x72, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x61, 0x69, 0x72, 0x2e,
2724 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x61,
2725 0x69, 0x72, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
2726 0x69, 0x6e, 0x64, 0x65, 0x78, 0x61, 0x69, 0x72, 0x2e, 0x72, 0x65, 0x61,
2727 0x64, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f,
2728 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x66, 0x6c, 0x6f,
2729 0x61, 0x74, 0x73, 0x63, 0x52, 0x47, 0x42, 0x5f, 0x6f, 0x75, 0x74, 0x70,
2730 0x75, 0x74, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x79,
2731 0x70, 0x65, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65,
2732 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x74,
2733 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f,
2734 0x64, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f, 0x66, 0x61, 0x63,
2735 0x74, 0x6f, 0x72, 0x31, 0x74, 0x6f, 0x6e, 0x65, 0x6d, 0x61, 0x70, 0x5f,
2736 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x73, 0x64, 0x72, 0x5f, 0x77,
2737 0x68, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x61, 0x69,
2738 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x73,
2739 0x69, 0x7a, 0x65, 0x61, 0x69, 0x72, 0x2e, 0x61, 0x72, 0x67, 0x5f, 0x74,
2740 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x5f, 0x73, 0x69,
2741 0x7a, 0x65, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73,
2742 0x74, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
2743 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33,
2744 0x78, 0x33, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x55, 0x56, 0x44,
2745 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x61,
2746 0x69, 0x72, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x61, 0x69,
2747 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x78, 0x74,
2748 0x75, 0x72, 0x65, 0x32, 0x64, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2c,
2749 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3e, 0x74, 0x65, 0x78, 0x59,
2750 0x74, 0x65, 0x78, 0x55, 0x56, 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d,
2751 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73,
2752 0x5f, 0x5a, 0x54, 0x53, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72,
2753 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x6d, 0x6e,
2754 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72,
2755 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x54,
2756 0x42, 0x41, 0x41, 0x00, 0x00, 0x04, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00,
2757 0x00, 0x30, 0x82, 0x50, 0x06, 0xcd, 0x08, 0x82, 0x1a, 0x98, 0xc1, 0x08,
2758 0x42, 0x19, 0x38, 0x23, 0x08, 0x65, 0xf0, 0x8c, 0x20, 0x94, 0x01, 0x34,
2759 0x82, 0xf0, 0x00, 0x23, 0x08, 0x65, 0x10, 0x8d, 0x20, 0x94, 0x81, 0x34,
2760 0x82, 0x50, 0x06, 0xd3, 0x08, 0x42, 0x19, 0x50, 0x23, 0x08, 0x65, 0x50,
2761 0x8d, 0x20, 0x94, 0x81, 0x35, 0x82, 0x50, 0x06, 0xd7, 0x08, 0x42, 0x19,
2762 0x60, 0x23, 0x08, 0x65, 0x90, 0x8d, 0x20, 0x94, 0x81, 0x36, 0x82, 0x50,
2763 0x06, 0xdb, 0x08, 0x42, 0x19, 0x70, 0x23, 0x08, 0x65, 0xd0, 0x8d, 0x20,
2764 0xac, 0x81, 0x37, 0x82, 0xb0, 0x06, 0xdf, 0x08, 0xc2, 0x1a, 0x80, 0xc1,
2765 0x08, 0xc2, 0x1a, 0x84, 0xc1, 0x08, 0xc2, 0x1a, 0x88, 0xc1, 0x08, 0xc2,
2766 0x1a, 0x8c, 0xc1, 0x08, 0xc2, 0x1a, 0x90, 0xc1, 0x08, 0xc2, 0x1a, 0x94,
2767 0xc1, 0x0c, 0x83, 0x1e, 0x04, 0x7b, 0x30, 0xc3, 0xc0, 0x07, 0x42, 0x1f,
2768 0xcc, 0x10, 0x0c, 0x33, 0x0c, 0x7a, 0xa0, 0x07, 0x7e, 0x30, 0x03, 0x41,
2769 0xf0, 0x01, 0x1f, 0xf8, 0xc1, 0x0c, 0x41, 0x31, 0x43, 0x60, 0xcc, 0x10,
2770 0x1c, 0x33, 0x14, 0x88, 0x1f, 0xf8, 0x41, 0xa2, 0xcc, 0x10, 0xf4, 0xc2,
2771 0x0c, 0x88, 0x1f, 0x2c, 0x4c, 0x93, 0x28, 0xce, 0x33, 0x43, 0xc2, 0x07,
2772 0x50, 0xc4, 0x48, 0x89, 0xe2, 0x4c, 0x33, 0x24, 0x7a, 0x00, 0x51, 0x8c,
2773 0x94, 0x54, 0x8e, 0x35, 0x03, 0x1a, 0xf8, 0x41, 0x1f, 0xf8, 0x01, 0xd7,
2774 0xf5, 0x41, 0x1f, 0xf8, 0x01, 0xe7, 0x89, 0x42, 0x1f, 0xf8, 0x01, 0xf7,
2775 0x8d, 0x42, 0x1f, 0xf8, 0x01, 0x07, 0x06, 0xa4, 0xd0, 0x07, 0x7e, 0xc0,
2776 0x85, 0x41, 0x29, 0xf4, 0x81, 0x1f, 0x70, 0x62, 0x60, 0x0a, 0x7d, 0xe0,
2777 0x07, 0xdc, 0x18, 0x9c, 0x42, 0x1f, 0xf8, 0x01, 0x47, 0x06, 0x33, 0x48,
2778 0xa0, 0x70, 0x61, 0xa1, 0x90, 0xf9, 0x01, 0x1f, 0x68, 0x9b, 0x38, 0x94,
2779 0x41, 0x28, 0x98, 0x41, 0x1f, 0x24, 0x67, 0xe0, 0xa0, 0xc1, 0x0c, 0x8a,
2780 0x1f, 0x90, 0x82, 0x1f, 0xa4, 0x81, 0x1a, 0x90, 0x42, 0x2a, 0xf8, 0xc1,
2781 0x1a, 0xb0, 0xc1, 0x0c, 0x52, 0x1f, 0x5c, 0x18, 0x2a, 0x64, 0x7c, 0xc0,
2782 0x07, 0xda, 0x46, 0x0e, 0x65, 0x80, 0x0a, 0x66, 0x40, 0x0a, 0x49, 0x1b,
2783 0x38, 0x6e, 0x30, 0x83, 0xa2, 0x0a, 0x6f, 0x90, 0xf9, 0x01, 0x1f, 0xc0,
2784 0x41, 0x12, 0x07, 0x8e, 0x1c, 0xcc, 0xa0, 0xac, 0xc2, 0x1b, 0x64, 0x7c,
2785 0xc0, 0x07, 0x70, 0x90, 0xc4, 0x81, 0x33, 0x07, 0x33, 0x24, 0xac, 0x40,
2786 0x07, 0x99, 0x1f, 0xf0, 0x41, 0x52, 0x07, 0x8e, 0x1d, 0xcc, 0x80, 0xfc,
2787 0x02, 0x38, 0x84, 0xc3, 0x38, 0x94, 0x83, 0x39, 0x9c, 0x03, 0x3a, 0xcc,
2788 0x30, 0xfc, 0x81, 0x2f, 0xa4, 0xc3, 0x0c, 0x41, 0x1e, 0xcc, 0x30, 0xe0,
2789 0xc1, 0x3a, 0xb4, 0xc2, 0x0c, 0x03, 0xc7, 0x0e, 0xad, 0x30, 0x43, 0x74,
2790 0x07, 0xed, 0xd0, 0x0a, 0xed, 0xe0, 0x0a, 0xed, 0xf0, 0x0a, 0xed, 0x00,
2791 0x0b, 0xed, 0x10, 0x0b, 0xed, 0x20, 0x0b, 0xed, 0x30, 0x0b, 0xed, 0x40,
2792 0x0b, 0x33, 0x0c, 0xee, 0xd0, 0x0e, 0xae, 0x50, 0x76, 0x00, 0x88, 0x01,
2793 0x1a, 0x88, 0x81, 0x18, 0x88, 0x01, 0x27, 0x06, 0x62, 0x20, 0x06, 0x62,
2794 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, 0x20, 0x06, 0x62, 0x20, 0x06, 0x62,
2795 0x20, 0x06, 0x62, 0x20, 0x06, 0x68, 0x80, 0x06, 0x68, 0x80, 0x06, 0x68,
2796 0x80, 0x06, 0x6e, 0xe0, 0x06, 0x16, 0x1d, 0xe8, 0x81, 0x65, 0x59, 0x7a,
2797 0xc0, 0x99, 0x02, 0x2b, 0xb0, 0x02, 0xdd, 0xf8, 0x05, 0x4a, 0xf8, 0x85,
2798 0x3d, 0xd8, 0x83, 0x3a, 0xc0, 0x03, 0x1d, 0x70, 0x74, 0xe0, 0x06, 0xbc,
2799 0x21, 0x23, 0x81, 0x09, 0xba, 0x88, 0x8d, 0xcd, 0xae, 0xcd, 0xa5, 0xed,
2800 0x8d, 0xac, 0x8e, 0xad, 0xcc, 0xc5, 0x8c, 0x2d, 0xec, 0x6c, 0x6e, 0x14,
2801 0x81, 0x16, 0x6a, 0xe1, 0x14, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2,
2802 0x32, 0x37, 0xba, 0x51, 0x02, 0x5b, 0xb8, 0x25, 0x2c, 0x4d, 0xce, 0xc5,
2803 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x94, 0xe0, 0x16, 0x8e, 0x0a,
2804 0x4b, 0x93, 0x73, 0x61, 0x0b, 0x73, 0x3b, 0xab, 0x0b, 0x3b, 0x2b, 0xfb,
2805 0xb2, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x1b, 0x25, 0xc0, 0x85, 0x9b,
2806 0xc2, 0xd2, 0xe4, 0x5c, 0xc6, 0xde, 0xda, 0xe0, 0xd2, 0xd8, 0xca, 0xbe,
2807 0xde, 0xe0, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0x46, 0x19, 0x72, 0x41, 0x17,
2808 0x76, 0xe1, 0x98, 0xb0, 0x34, 0x39, 0x17, 0x33, 0xb9, 0xb0, 0xb3, 0xb6,
2809 0x32, 0x37, 0xba, 0x51, 0x82, 0x74, 0x00, 0x00, 0x00, 0xa9, 0x18, 0x00,
2810 0x00, 0x25, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x72, 0x28, 0x87, 0x77, 0x80,
2811 0x07, 0x7a, 0x58, 0x70, 0x98, 0x43, 0x3d, 0xb8, 0xc3, 0x38, 0xb0, 0x43,
2812 0x39, 0xd0, 0xc3, 0x82, 0xe6, 0x1c, 0xc6, 0xa1, 0x0d, 0xe8, 0x41, 0x1e,
2813 0xc2, 0xc1, 0x1d, 0xe6, 0x21, 0x1d, 0xe8, 0x21, 0x1d, 0xde, 0xc1, 0x1d,
2814 0x16, 0x34, 0xe3, 0x60, 0x0e, 0xe7, 0x50, 0x0f, 0xe1, 0x20, 0x0f, 0xe4,
2815 0x40, 0x0f, 0xe1, 0x20, 0x0f, 0xe7, 0x50, 0x0e, 0xf4, 0xb0, 0x80, 0x81,
2816 0x07, 0x79, 0x28, 0x87, 0x70, 0x60, 0x07, 0x76, 0x78, 0x87, 0x71, 0x08,
2817 0x07, 0x7a, 0x28, 0x07, 0x72, 0x58, 0x70, 0x9c, 0xc3, 0x38, 0xb4, 0x01,
2818 0x3b, 0xa4, 0x83, 0x3d, 0x94, 0xc3, 0x02, 0x6b, 0x1c, 0xd8, 0x21, 0x1c,
2819 0xdc, 0xe1, 0x1c, 0xdc, 0x20, 0x1c, 0xe4, 0x61, 0x1c, 0xdc, 0x20, 0x1c,
2820 0xe8, 0x81, 0x1e, 0xc2, 0x61, 0x1c, 0xd0, 0xa1, 0x1c, 0xc8, 0x61, 0x1c,
2821 0xc2, 0x81, 0x1d, 0xd8, 0x61, 0xc1, 0x01, 0x0f, 0xf4, 0x20, 0x0f, 0xe1,
2822 0x50, 0x0f, 0xf4, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x10, 0x00,
2823 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0xcc, 0x3c, 0xa4, 0x83, 0x3b, 0x9c,
2824 0x03, 0x3b, 0x94, 0x03, 0x3d, 0xa0, 0x83, 0x3c, 0x94, 0x43, 0x38, 0x90,
2825 0xc3, 0x01, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xd9, 0x00, 0x00,
2826 0x00, 0x13, 0x04, 0x45, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
2827 0x00, 0x84, 0xd5, 0xc0, 0x08, 0x00, 0x95, 0x33, 0x00, 0x64, 0x8e, 0x00,
2828 0x8c, 0x25, 0x04, 0x00, 0xad, 0x25, 0x50, 0x04, 0x65, 0x40, 0xef, 0x58,
2829 0x03, 0x10, 0x08, 0x73, 0x0c, 0x50, 0x1c, 0xc4, 0xc1, 0x1c, 0x03, 0xe4,
2830 0xc4, 0xc1, 0x58, 0x03, 0x30, 0x10, 0x04, 0x8c, 0x00, 0x8c, 0x11, 0x80,
2831 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x63,
2832 0x04, 0x20, 0x08, 0x82, 0x24, 0x18, 0xcc, 0x00, 0x50, 0x30, 0x03, 0x30,
2833 0x03, 0x30, 0x07, 0xc1, 0x07, 0x7b, 0xc0, 0x07, 0x7f, 0x40, 0xc2, 0x0c,
2834 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x34, 0x00, 0x00,
2835 0x00, 0x22, 0x47, 0xc8, 0x90, 0x51, 0x16, 0xc8, 0x49, 0x00, 0x00, 0x00,
2836 0x00, 0x63, 0x60, 0x61, 0x98, 0x05, 0x00, 0x00, 0x00, 0x61, 0x69, 0x72,
2837 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65,
2838 0x73, 0x28, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, 0x31, 0x32, 0x5f, 0x66,
2839 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x61, 0x69, 0x72, 0x2d,
2840 0x61, 0x6c, 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d,
2841 0x61, 0x72, 0x67, 0x28, 0x33, 0x29, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c,
2842 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x73, 0x61,
2843 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c,
2844 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x74, 0x65,
2845 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x61, 0x69, 0x72, 0x2d, 0x61, 0x6c,
2846 0x69, 0x61, 0x73, 0x2d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2d, 0x61, 0x72,
2847 0x67, 0x28, 0x34, 0x29, 0x00, 0x2b, 0x84, 0x7a, 0x80, 0x87, 0x15, 0x83,
2848 0x3d, 0xd4, 0x43, 0x3c, 0xac, 0x18, 0xee, 0xa1, 0x1e, 0xe4, 0x61, 0xc5,
2849 0x80, 0x0f, 0xf5, 0x30, 0x0f, 0x2b, 0x86, 0x7c, 0xa8, 0x07, 0x7a, 0xd8,
2850 0x10, 0xd8, 0xc3, 0x86, 0x21, 0x1f, 0xf0, 0xe1, 0x1e, 0x36, 0x08, 0xf8,
2851 0x70, 0x0f, 0x1b, 0x04, 0x7b, 0xc8, 0x87, 0x0d, 0x41, 0x3e, 0x6c, 0x18,
2852 0xec, 0x01, 0x1f, 0xee, 0x01, 0x7b, 0x18, 0x34, 0x33, 0xb0, 0x03, 0x0a,
2853 0x80, 0x31, 0x1c, 0x11, 0x24, 0x81, 0x7f, 0xcc, 0x32, 0x04, 0x42, 0x30,
2854 0x62, 0xd0, 0x18, 0x21, 0x08, 0x06, 0x67, 0xb0, 0x07, 0x5b, 0xe6, 0x61,
2855 0xd5, 0xc5, 0x30, 0x77, 0x30, 0x9a, 0x10, 0x00, 0x23, 0x06, 0x8d, 0x11,
2856 0x82, 0x60, 0x70, 0x06, 0x7d, 0xc0, 0x6d, 0x60, 0xa0, 0x5d, 0x99, 0xe3,
2857 0xe4, 0xc1, 0x68, 0x42, 0x00, 0x0c, 0x32, 0x0c, 0xca, 0x34, 0xc8, 0x20,
2858 0x30, 0xd3, 0x20, 0x83, 0x10, 0x4c, 0x37, 0x06, 0xf0, 0x52, 0x10, 0x94,
2859 0x41, 0x86, 0x00, 0xca, 0x8c, 0x08, 0xc0, 0x7f, 0x23, 0xc3, 0x19, 0xd0,
2860 0x01, 0x29, 0x5c, 0x00, 0x2f, 0x05, 0x41, 0x19, 0x64, 0x08, 0x2a, 0x6f,
2861 0xc4, 0xe0, 0x38, 0x42, 0x10, 0x2c, 0xfc, 0x63, 0x83, 0x85, 0x22, 0x98,
2862 0x63, 0xb0, 0x82, 0x3c, 0xd8, 0x48, 0xd1, 0x06, 0x7a, 0xa0, 0x0a, 0xa8,
2863 0x40, 0x06, 0x17, 0xc0, 0x4b, 0x41, 0x50, 0x06, 0x19, 0x82, 0x8d, 0x0c,
2864 0x46, 0x0c, 0x8e, 0x23, 0x04, 0xc1, 0xc2, 0x3f, 0x36, 0x5b, 0x58, 0x82,
2865 0x39, 0x06, 0x23, 0x48, 0x83, 0x8d, 0x14, 0x73, 0x00, 0x0a, 0xb0, 0xe0,
2866 0x0a, 0x69, 0x70, 0x01, 0xbc, 0x14, 0x04, 0x65, 0x90, 0x21, 0x08, 0x03,
2867 0x35, 0x18, 0x31, 0x38, 0x8e, 0x10, 0x04, 0x0b, 0xff, 0xd8, 0x78, 0x21,
2868 0x0a, 0xe6, 0x18, 0x8c, 0xc0, 0x0d, 0x66, 0x09, 0x88, 0xe1, 0x88, 0xcf,
2869 0x0c, 0x02, 0xff, 0x98, 0x65, 0x18, 0x88, 0x60, 0xc4, 0xa0, 0x31, 0x42,
2870 0x10, 0x0c, 0xce, 0x20, 0x17, 0xf2, 0xe0, 0x0e, 0xf8, 0xc0, 0x0e, 0xe6,
2871 0xa0, 0x0e, 0xd4, 0x40, 0x0d, 0x6a, 0x61, 0x34, 0x21, 0x00, 0x46, 0x0c,
2872 0x1a, 0x23, 0x04, 0xc1, 0xe0, 0x0c, 0x76, 0x41, 0x0f, 0xf2, 0xc0, 0x0f,
2873 0xf0, 0xa0, 0x0e, 0xee, 0x80, 0x0d, 0xd8, 0xe0, 0x16, 0x46, 0x13, 0x02,
2874 0x60, 0x90, 0x21, 0x48, 0x03, 0x3b, 0x18, 0x64, 0x20, 0xd2, 0x40, 0x0e,
2875 0x06, 0x19, 0x04, 0x34, 0x90, 0x83, 0x41, 0x06, 0x21, 0x90, 0x83, 0x13,
2876 0x05, 0x78, 0x29, 0x08, 0xca, 0x20, 0x43, 0xf0, 0x06, 0x78, 0x60, 0x44,
2877 0x00, 0xfe, 0x1b, 0x19, 0x4c, 0x61, 0x16, 0xc6, 0xe1, 0x02, 0x78, 0x29,
2878 0x08, 0xca, 0x20, 0x43, 0x40, 0x07, 0x7d, 0x30, 0x62, 0x70, 0x1c, 0x21,
2879 0x08, 0x16, 0xfe, 0xb1, 0xbd, 0x43, 0x11, 0xcc, 0x31, 0xd4, 0x41, 0x80,
2880 0x0b, 0x1b, 0x29, 0x58, 0x21, 0x17, 0xd2, 0xe1, 0x1c, 0x46, 0xe1, 0x02,
2881 0x78, 0x29, 0x08, 0xca, 0x20, 0x43, 0xa0, 0x07, 0xa3, 0x30, 0x62, 0x70,
2882 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xd5, 0xc3, 0x12, 0xcc, 0x31, 0x18,
2883 0x01, 0x2a, 0x6c, 0xa4, 0x90, 0x85, 0x5f, 0x78, 0x87, 0x76, 0x40, 0x85,
2884 0x0b, 0xe0, 0xa5, 0x20, 0x28, 0x83, 0x0c, 0x01, 0x28, 0xa4, 0xc2, 0x88,
2885 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xb6, 0x0f, 0x51, 0x30, 0xc7,
2886 0x60, 0x04, 0xad, 0x30, 0x4b, 0x40, 0x0c, 0x74, 0x04, 0xa0, 0x10, 0x08,
2887 0x83, 0x48, 0x08, 0x73, 0x0c, 0x01, 0x2a, 0xb8, 0xc2, 0x88, 0xc1, 0x81,
2888 0xc4, 0x20, 0x58, 0xf8, 0x07, 0x44, 0x12, 0xc1, 0x2e, 0x58, 0xe0, 0x0b,
2889 0xe2, 0x9f, 0x41, 0x40, 0x0c, 0x19, 0x00, 0x00, 0x00, 0x5b, 0x8e, 0x20,
2890 0x70, 0x87, 0x23, 0x1f, 0x10, 0x7d, 0xd8, 0x52, 0x10, 0xc7, 0x3e, 0x20,
2891 0xfc, 0xb0, 0xa5, 0x30, 0x8e, 0x7d, 0x40, 0xf8, 0x61, 0x4b, 0xc1, 0x1c,
2892 0xfd, 0x80, 0xf8, 0xc3, 0x96, 0x22, 0x3a, 0xfa, 0x01, 0xf1, 0x87, 0x2d,
2893 0xc5, 0x75, 0xf4, 0x03, 0xe2, 0x0f, 0x5b, 0x8a, 0xee, 0xe8, 0x07, 0xc4,
2894 0x1f, 0xb6, 0x14, 0x64, 0x70, 0xec, 0x03, 0xc2, 0x0f, 0x5b, 0x0a, 0x33,
2895 0x38, 0xf6, 0x01, 0xe1, 0x87, 0x2d, 0x45, 0x1b, 0x1c, 0xfd, 0x80, 0xf8,
2896 0xc3, 0x96, 0x42, 0x0e, 0x8e, 0x7e, 0x40, 0xfc, 0x61, 0x4b, 0x81, 0x07,
2897 0x47, 0x3f, 0x20, 0xfe, 0xb0, 0xa5, 0xf0, 0x83, 0xa3, 0x1f, 0x10, 0x7f,
2898 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0xbe, 0x01, 0x00,
2899 0x00, 0x13, 0x04, 0x6e, 0x10, 0x0b, 0x04, 0x00, 0x00, 0x4f, 0x00, 0x00,
2900 0x00, 0x54, 0xce, 0x00, 0xd0, 0x5a, 0x02, 0x45, 0x40, 0xef, 0x58, 0x03,
2901 0x10, 0x08, 0x23, 0x00, 0x34, 0xcf, 0x41, 0x40, 0x4e, 0x93, 0x06, 0x63,
2902 0x11, 0x40, 0x20, 0x1c, 0x04, 0x8c, 0x11, 0xf0, 0xf0, 0xaa, 0xd3, 0xdd,
2903 0x18, 0x81, 0x2c, 0xba, 0x3d, 0x0d, 0x06, 0x63, 0x04, 0xb5, 0x5a, 0xab,
2904 0xed, 0x37, 0x46, 0xd0, 0xc7, 0xa2, 0x8b, 0x7f, 0x63, 0x04, 0x6e, 0x1f,
2905 0x8b, 0xb6, 0x2f, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18, 0x81,
2906 0x79, 0xaf, 0xab, 0xec, 0x8d, 0x11, 0xc4, 0x3c, 0xd8, 0xe7, 0xde, 0x18,
2907 0x81, 0xdb, 0xc7, 0xa2, 0xed, 0x8d, 0x11, 0xbc, 0x7b, 0x5a, 0xde, 0xdf,
2908 0x18, 0x81, 0xce, 0x9a, 0x73, 0x08, 0x06, 0x23, 0x00, 0x63, 0x04, 0x20,
2909 0x08, 0x82, 0x24, 0x18, 0x8c, 0x11, 0x80, 0x20, 0x08, 0x82, 0x60, 0x30,
2910 0x03, 0x40, 0xc1, 0x0c, 0xc0, 0x0c, 0xc0, 0x1c, 0x44, 0x1d, 0xec, 0x41,
2911 0x1d, 0xf8, 0x01, 0x15, 0x33, 0x00, 0x23, 0x00, 0x33, 0x00, 0x63, 0x0d,
2912 0x20, 0x08, 0x82, 0xf8, 0x07, 0x82, 0x20, 0x88, 0x7f, 0x20, 0x08, 0x82,
2913 0xf8, 0x37, 0xd6, 0xc0, 0xb6, 0xf3, 0x4f, 0x7a, 0x6c, 0x3b, 0xff, 0xa4,
2914 0xc7, 0xb6, 0xf3, 0x4f, 0x7a, 0x63, 0x0d, 0x20, 0x08, 0xb2, 0xf5, 0x2f,
2915 0x80, 0x20, 0xc8, 0xd6, 0xbf, 0x00, 0x82, 0x20, 0x5b, 0xff, 0xc2, 0x58,
2916 0x03, 0x08, 0x82, 0x6b, 0x0e, 0x06, 0x20, 0x08, 0xae, 0x39, 0x18, 0x80,
2917 0x20, 0xb8, 0xe6, 0x60, 0x30, 0xd6, 0x00, 0x82, 0x74, 0x9b, 0x83, 0x01,
2918 0x08, 0xd2, 0x6d, 0x0e, 0x06, 0x20, 0x48, 0xb7, 0x39, 0x18, 0x8c, 0x35,
2919 0xac, 0x23, 0x1e, 0xb3, 0x60, 0xb0, 0x8e, 0x78, 0xcc, 0x82, 0xc1, 0x3a,
2920 0xe2, 0x31, 0x0b, 0x06, 0x63, 0x0d, 0x20, 0x08, 0xe3, 0xe1, 0x18, 0x80,
2921 0x20, 0x8c, 0x87, 0x63, 0x00, 0x82, 0x30, 0x1e, 0x8e, 0xc1, 0x58, 0x83,
2922 0x98, 0x8b, 0x69, 0xff, 0x81, 0x25, 0xcf, 0xc6, 0xbf, 0x30, 0xa6, 0xab,
2923 0x9a, 0xfb, 0xc2, 0x58, 0xc3, 0x3f, 0x93, 0xfe, 0xef, 0x0b, 0x74, 0x0d,
2924 0x8a, 0xf9, 0xd7, 0xc2, 0x71, 0x0c, 0xfa, 0xc2, 0x58, 0xc3, 0xdc, 0xb7,
2925 0x69, 0xea, 0x0b, 0xad, 0x1b, 0xf2, 0xbc, 0x2f, 0xf0, 0x39, 0xeb, 0xe3,
2926 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00,
2927 0x00, 0x1b, 0x06, 0x77, 0x68, 0x87, 0x57, 0xd8, 0x30, 0xb8, 0x43, 0x3b,
2928 0xd0, 0xc2, 0x86, 0xc1, 0x1d, 0xda, 0x21, 0x16, 0x36, 0x0c, 0xee, 0xd0,
2929 0x0e, 0xb2, 0xb0, 0x61, 0x70, 0x87, 0x76, 0x98, 0x85, 0x0d, 0x83, 0x3b,
2930 0xb4, 0x03, 0x2c, 0x6c, 0x18, 0xdc, 0xa1, 0x1d, 0x5a, 0x01, 0x00, 0x00,
2931 0x00, 0x7b, 0x18, 0xce, 0x20, 0x0e, 0x44, 0x81, 0x02, 0x60, 0x0c, 0x47,
2932 0x04, 0x55, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0x0c, 0x32, 0xac, 0xc1,
2933 0x64, 0x06, 0x7b, 0x18, 0xd6, 0xa0, 0x0e, 0xec, 0x80, 0x02, 0x60, 0x8c,
2934 0x18, 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x84, 0xc1, 0x2a, 0x0c, 0x23,
2935 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x5f, 0x2b, 0x04, 0x90, 0x05,
2936 0x10, 0xf8, 0x8f, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x7c, 0xad,
2937 0x10, 0x54, 0x36, 0x44, 0xe2, 0x6f, 0x51, 0x10, 0xfe, 0x36, 0x04, 0xe4,
2938 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x11, 0x06, 0xb2, 0x10,
2939 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x7c, 0xb4, 0x10, 0x4c,
2940 0x16, 0x4c, 0xe2, 0x3f, 0xc7, 0xd0, 0x2d, 0xa1, 0x30, 0xc8, 0x10, 0x78,
2941 0x73, 0x60, 0x43, 0x40, 0xfe, 0x83, 0x0c, 0x01, 0x18, 0xd0, 0xc1, 0x20,
2942 0x43, 0xc0, 0x07, 0x74, 0x30, 0x4b, 0x20, 0x0c, 0x54, 0x04, 0x42, 0xa0,
2943 0x0f, 0xc0, 0x1e, 0x86, 0x3e, 0x38, 0x05, 0x5b, 0xa0, 0x00, 0x18, 0xc3,
2944 0x11, 0x01, 0x1b, 0x38, 0xfe, 0x31, 0xcb, 0x30, 0x10, 0xc1, 0x20, 0x03,
2945 0x91, 0x06, 0x7c, 0xb0, 0x87, 0x21, 0x14, 0x56, 0xc1, 0x15, 0x28, 0x00,
2946 0xc6, 0x1e, 0x86, 0x51, 0x68, 0x85, 0x57, 0xa0, 0x00, 0x18, 0x23, 0x06,
2947 0x4a, 0x12, 0x83, 0x60, 0xe1, 0x1f, 0x9d, 0x39, 0x14, 0xdd, 0x31, 0x04,
2948 0x83, 0x0c, 0x01, 0x1b, 0x80, 0xc2, 0x20, 0x43, 0xb0, 0x80, 0xc2, 0x2c,
2949 0x01, 0x31, 0x50, 0x11, 0x08, 0x03, 0x26, 0x0c, 0x47, 0x84, 0x01, 0x1f,
2950 0x04, 0xfe, 0x31, 0xcb, 0x50, 0x4c, 0xc1, 0x1e, 0x06, 0x55, 0xa0, 0x05,
2951 0x72, 0xa0, 0x00, 0x18, 0xc3, 0x11, 0xc1, 0x1f, 0x04, 0xfe, 0x31, 0xcb,
2952 0x60, 0x1c, 0xc1, 0x20, 0x43, 0x61, 0x07, 0xa9, 0xb0, 0x87, 0xc1, 0x15,
2953 0x70, 0xa1, 0x1c, 0x28, 0x00, 0xc6, 0x1c, 0x83, 0x1d, 0x04, 0xba, 0x30,
2954 0xc8, 0x10, 0xdc, 0x01, 0x2b, 0x58, 0x50, 0x88, 0xff, 0x20, 0x43, 0x90,
2955 0x07, 0xad, 0x30, 0x4b, 0xd0, 0x06, 0x7b, 0x18, 0x68, 0xc1, 0x17, 0xd8,
2956 0x81, 0x02, 0x60, 0xec, 0x61, 0xb0, 0x05, 0x70, 0x68, 0x07, 0x0a, 0x80,
2957 0x31, 0xc8, 0x00, 0x85, 0x82, 0x2c, 0x8c, 0x18, 0x14, 0x47, 0x08, 0x82,
2958 0x41, 0xc6, 0x0f, 0xc4, 0x2c, 0x03, 0x22, 0x05, 0x63, 0x08, 0x12, 0x39,
2959 0x0c, 0x47, 0x04, 0xad, 0xa0, 0xf8, 0xc7, 0x2c, 0x83, 0x92, 0x04, 0x26,
2960 0xb4, 0x82, 0xf8, 0xcf, 0x12, 0x2c, 0x36, 0xb4, 0x02, 0xf8, 0x8f, 0x18,
2961 0x18, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x58, 0x22, 0x11, 0x58, 0xe0, 0x0a,
2962 0xe2, 0x3f, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0x95, 0x44,
2963 0xe0, 0x0a, 0xb3, 0x04, 0xcb, 0x40, 0x05, 0xa0, 0x24, 0x82, 0x32, 0xc7,
2964 0xa0, 0x0a, 0x01, 0x3b, 0x8c, 0x21, 0x6c, 0xe1, 0x30, 0x1c, 0x11, 0xd8,
2965 0x82, 0xe2, 0x1f, 0xb3, 0x0c, 0x0d, 0x13, 0x98, 0x60, 0x0b, 0xe2, 0x3f,
2966 0x4b, 0xe0, 0xd8, 0x60, 0x0b, 0xe0, 0x3f, 0x62, 0x60, 0x1c, 0x21, 0x08,
2967 0x16, 0xfe, 0x61, 0xad, 0x44, 0x60, 0xc1, 0x2d, 0x88, 0xff, 0x88, 0xc1,
2968 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0xe5, 0x12, 0xc1, 0x2d, 0xcc, 0x12,
2969 0x38, 0x03, 0x15, 0x80, 0xc2, 0x08, 0xcd, 0x1c, 0x43, 0x12, 0xa4, 0xc3,
2970 0x18, 0x02, 0x19, 0xa4, 0xc3, 0x70, 0x44, 0xf0, 0x0b, 0x8a, 0x7f, 0xcc,
2971 0x32, 0x40, 0x4f, 0x60, 0xc2, 0x2f, 0x88, 0xff, 0x2c, 0x41, 0x64, 0xc3,
2972 0x2f, 0x80, 0xff, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0x45,
2973 0x13, 0x81, 0x05, 0xe0, 0x20, 0xfe, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60,
2974 0xe1, 0x1f, 0xd4, 0x4d, 0x04, 0xe0, 0x30, 0x4b, 0x10, 0x0d, 0x54, 0x00,
2975 0xca, 0x23, 0x40, 0x73, 0x0c, 0x49, 0x10, 0x0f, 0xb3, 0x04, 0xd2, 0x40,
2976 0x45, 0x20, 0x44, 0x7a, 0x70, 0x0c, 0x32, 0x04, 0xbf, 0x20, 0x0f, 0x73,
2977 0x0c, 0xbd, 0x00, 0x06, 0x21, 0x31, 0xc8, 0x10, 0xf8, 0xc2, 0x3c, 0xd8,
2978 0x10, 0x88, 0xff, 0x20, 0x43, 0x00, 0x0e, 0xf4, 0x30, 0x4b, 0xd0, 0x06,
2979 0xc3, 0x11, 0xb3, 0x60, 0x0e, 0x81, 0x7f, 0xcc, 0x32, 0x50, 0x60, 0x10,
2980 0x0c, 0x32, 0xd0, 0x41, 0x39, 0xe0, 0xc3, 0x1e, 0x86, 0x7e, 0x38, 0x89,
2981 0x9a, 0xa0, 0x00, 0x18, 0x7b, 0x18, 0xfe, 0x21, 0x25, 0x6c, 0x82, 0x02,
2982 0x60, 0xcc, 0x31, 0x9c, 0x43, 0xb0, 0x12, 0x83, 0x0c, 0x01, 0x3a, 0xf4,
2983 0x83, 0x05, 0x87, 0xf8, 0x0f, 0x32, 0x04, 0xea, 0xe0, 0x0f, 0x23, 0x06,
2984 0xc5, 0x11, 0x82, 0x60, 0x90, 0xa1, 0xc5, 0x31, 0xcb, 0xf0, 0x55, 0xc1,
2985 0x18, 0xc2, 0x00, 0x13, 0xc3, 0x11, 0xc1, 0x3f, 0x28, 0xfe, 0x31, 0xcb,
2986 0x70, 0x59, 0x81, 0x09, 0xff, 0x20, 0xfe, 0xb3, 0x04, 0xd8, 0x88, 0x81,
2987 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xd5, 0x16, 0xc3, 0x88, 0xc1, 0x71,
2988 0x84, 0x20, 0x58, 0xf8, 0x07, 0xf5, 0x16, 0x01, 0x48, 0x58, 0x00, 0x12,
2989 0xe2, 0x6f, 0x01, 0x48, 0x80, 0xff, 0x2c, 0x01, 0x36, 0x50, 0x01, 0x28,
2990 0x96, 0x70, 0xcd, 0x31, 0xc8, 0x43, 0x80, 0x13, 0x63, 0x08, 0x4c, 0x4b,
2991 0x0c, 0x47, 0x04, 0x28, 0xa1, 0xf8, 0xc7, 0x2c, 0x83, 0x96, 0x05, 0x26,
2992 0xa0, 0x84, 0xf8, 0xcf, 0x12, 0x6c, 0x23, 0x06, 0xc6, 0x11, 0x82, 0x60,
2993 0xe1, 0x1f, 0x96, 0x5d, 0x0c, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1,
2994 0x1f, 0x14, 0x5e, 0x04, 0x29, 0x61, 0x41, 0x4a, 0x88, 0xbf, 0x05, 0x29,
2995 0x01, 0xfe, 0xb3, 0x04, 0xdb, 0x40, 0x05, 0xa0, 0x64, 0x82, 0x36, 0xc7,
2996 0x90, 0x04, 0x35, 0x31, 0x86, 0x50, 0xd5, 0xc4, 0x70, 0x44, 0x10, 0x13,
2997 0x8a, 0x7f, 0xcc, 0x32, 0x74, 0x5c, 0x60, 0x42, 0x4c, 0x88, 0xff, 0x2c,
2998 0x81, 0x37, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xfd, 0xc5,
2999 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0x85, 0x46, 0x20,
3000 0x13, 0x16, 0xc8, 0x84, 0xf8, 0x5b, 0x20, 0x13, 0xe0, 0x3f, 0x4b, 0xe0,
3001 0x0d, 0x54, 0x00, 0x0a, 0x27, 0x74, 0x73, 0x0c, 0x49, 0xd0, 0x13, 0x23,
3002 0x06, 0xc8, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0xd2, 0x69, 0x04, 0x26, 0x41,
3003 0x12, 0x83, 0x0c, 0x01, 0x4a, 0xf0, 0xc4, 0x2c, 0xc1, 0x37, 0x50, 0x11,
3004 0xf8, 0x01, 0x25, 0x78, 0x83, 0x0c, 0x41, 0x4b, 0xf8, 0xc4, 0x2c, 0x41,
3005 0x1b, 0xcc, 0x32, 0x84, 0x41, 0x1b, 0xf0, 0xc3, 0x20, 0x43, 0x2f, 0xb8,
3006 0x44, 0x58, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x6c, 0xa8,
3007 0x11, 0x88, 0xc4, 0x1c, 0xc3, 0x4a, 0x04, 0x71, 0x31, 0x62, 0x70, 0x1c,
3008 0x21, 0x08, 0x16, 0xfe, 0xb1, 0xa9, 0xc6, 0x30, 0x12, 0x73, 0x0c, 0x42,
3009 0x70, 0x16, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x1b, 0x6b,
3010 0x14, 0x24, 0x31, 0xc7, 0x20, 0x04, 0x68, 0x31, 0xc8, 0x10, 0xc8, 0x84,
3011 0x59, 0x0c, 0x32, 0x04, 0xe5, 0x60, 0x16, 0x7b, 0x18, 0xdc, 0x02, 0x2f,
3012 0x4c, 0x83, 0x02, 0x60, 0xec, 0x61, 0x80, 0x0b, 0xbd, 0x38, 0x0d, 0x0a,
3013 0x80, 0x31, 0xc7, 0x80, 0x13, 0x01, 0x5f, 0x0c, 0x32, 0x04, 0x39, 0xe1,
3014 0x16, 0x16, 0x24, 0xe2, 0x3f, 0xc8, 0x10, 0xec, 0xc4, 0x5b, 0x8c, 0x18,
3015 0x14, 0x47, 0x08, 0x82, 0x41, 0x96, 0x1b, 0xc7, 0x2c, 0x03, 0x1b, 0x88,
3016 0x41, 0x30, 0x86, 0x30, 0x84, 0xc6, 0x70, 0x44, 0x00, 0x17, 0x8a, 0x7f,
3017 0xcc, 0x32, 0x90, 0xc1, 0x18, 0x04, 0x26, 0xc0, 0x85, 0xf8, 0xcf, 0x12,
3018 0x94, 0xc1, 0x88, 0x81, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x87, 0xe5, 0x1b,
3019 0xc3, 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0x07, 0x05, 0x1e, 0x41,
3020 0x5c, 0x58, 0x10, 0x17, 0xe2, 0x6f, 0x41, 0x5c, 0x80, 0xff, 0x2c, 0x41,
3021 0x19, 0x0c, 0x54, 0x00, 0xca, 0x18, 0x08, 0x64, 0x30, 0xc7, 0x30, 0x16,
3022 0x41, 0x6a, 0x8c, 0x21, 0x30, 0x7e, 0x31, 0x1c, 0x11, 0xe4, 0x85, 0xe2,
3023 0x1f, 0xb3, 0x0c, 0x67, 0x60, 0x06, 0x81, 0x09, 0x79, 0x21, 0xfe, 0xb3,
3024 0x04, 0x68, 0x30, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0x9d,
3025 0xc7, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xa5, 0x47,
3026 0xa0, 0x17, 0x16, 0xe8, 0x85, 0xf8, 0x5b, 0xa0, 0x17, 0xe0, 0x3f, 0x4b,
3027 0x80, 0x06, 0x03, 0x15, 0x80, 0x62, 0x06, 0xc2, 0x19, 0xcc, 0x31, 0x24,
3028 0x81, 0x69, 0x8c, 0x21, 0x54, 0xa6, 0x31, 0x1c, 0x11, 0x88, 0x86, 0xe2,
3029 0x1f, 0xb3, 0x0c, 0x6a, 0x90, 0x06, 0x81, 0x09, 0xa2, 0x21, 0xfe, 0xb3,
3030 0x04, 0x6b, 0x30, 0x62, 0x60, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x61, 0xc1,
3031 0xc7, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xc9, 0x47,
3032 0x30, 0x1a, 0x16, 0x8c, 0x86, 0xf8, 0x5b, 0x30, 0x1a, 0xe0, 0x3f, 0x4b,
3033 0xb0, 0x06, 0x03, 0x15, 0x80, 0x92, 0x06, 0x82, 0x1a, 0xcc, 0x31, 0x24,
3034 0x81, 0x6b, 0x8c, 0x18, 0x20, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x48, 0xf8,
3035 0x11, 0xdc, 0x45, 0x5d, 0x0c, 0x32, 0x04, 0x79, 0xd1, 0x1a, 0xb3, 0x04,
3036 0x6c, 0x30, 0x50, 0x11, 0xf8, 0x41, 0x18, 0x08, 0x6b, 0x30, 0xc8, 0x10,
3037 0xf8, 0xc5, 0x6b, 0xcc, 0x12, 0xb4, 0xc1, 0x40, 0x4b, 0xc0, 0x23, 0x06,
3038 0x8f, 0x48, 0x3c, 0xf2, 0xc9, 0x02, 0x1b, 0xf0, 0x08, 0x18, 0x0c, 0xb4,
3039 0x04, 0x28, 0x62, 0xe8, 0x85, 0x64, 0x0e, 0x1f, 0xc1, 0x06, 0xfc, 0x02,
3040 0x06, 0x83, 0x0c, 0x81, 0x10, 0x1b, 0x19, 0x04, 0xc4, 0x00, 0x00, 0x00,
3041 0x00, 0x12, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0x78, 0x87, 0x2d, 0x83,
3042 0x11, 0xc0, 0xc3, 0x96, 0x21, 0x0b, 0xe2, 0x61, 0xcb, 0xe0, 0x05, 0xf2,
3043 0xb0, 0x65, 0x00, 0x83, 0x60, 0x1e, 0xb6, 0x0c, 0x69, 0x10, 0xb8, 0xc3,
3044 0x96, 0xc1, 0x0d, 0x02, 0x7a, 0xd8, 0x32, 0xd4, 0x41, 0x50, 0x0f, 0x5b,
3045 0x86, 0x3b, 0x08, 0xe8, 0x61, 0xcb, 0xb0, 0x0e, 0x41, 0x3d, 0x6c, 0x19,
3046 0xda, 0x21, 0xa0, 0x87, 0x2d, 0x43, 0x5a, 0x04, 0xf5, 0xb0, 0x65, 0x58,
3047 0x8b, 0x80, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00,
3048 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x04, 0x4a, 0x2c, 0x10, 0x00, 0x00,
3049 0x00, 0x25, 0x00, 0x00, 0x00, 0x54, 0xce, 0x00, 0xd0, 0x5a, 0x02, 0x45,
3050 0x40, 0xef, 0x58, 0x03, 0x10, 0x08, 0x23, 0x00, 0x34, 0xcf, 0x41, 0x40,
3051 0x4e, 0xc3, 0x06, 0x04, 0x8c, 0x11, 0x80, 0x20, 0x08, 0xe2, 0xdf, 0x18,
3052 0x01, 0x08, 0x82, 0x20, 0x08, 0x06, 0x23, 0x00, 0x14, 0xcc, 0x00, 0xcc,
3053 0x00, 0x50, 0x31, 0x03, 0x30, 0xd6, 0xc0, 0xb2, 0x67, 0x28, 0x7f, 0xa8,
3054 0x5f, 0xc6, 0xea, 0x97, 0x9f, 0xba, 0x38, 0x7b, 0x63, 0x0d, 0x7a, 0x0d,
3055 0xee, 0xb8, 0xa7, 0xe2, 0xb9, 0x6d, 0x7f, 0x6f, 0x9f, 0xd2, 0xa3, 0x37,
3056 0xd6, 0xb0, 0xce, 0x31, 0x8b, 0x7a, 0x69, 0x08, 0xa3, 0xbb, 0x77, 0xb7,
3057 0xb1, 0x6a, 0x7f, 0x63, 0x0d, 0x62, 0x2e, 0xa6, 0xfd, 0x07, 0x96, 0x3c,
3058 0x1b, 0xff, 0xc2, 0x98, 0xae, 0x6a, 0xee, 0x0b, 0x63, 0x0d, 0xff, 0x4c,
3059 0xfa, 0xbf, 0x2f, 0xd0, 0x35, 0x28, 0xe6, 0x5f, 0x0b, 0xc7, 0x31, 0xe8,
3060 0x0b, 0x63, 0x0d, 0x73, 0xdf, 0xa6, 0xa9, 0x2f, 0xb4, 0x6e, 0xc8, 0xf3,
3061 0xbe, 0xc0, 0xe7, 0xac, 0x8f, 0x7f, 0x00, 0x00, 0x00, 0x83, 0x0c, 0xd7,
3062 0xd1, 0x0c, 0x47, 0x58, 0x4d, 0xe0, 0x1f, 0xb3, 0x0c, 0x81, 0x10, 0xcc,
3063 0x31, 0x24, 0x96, 0x18, 0x0c, 0x32, 0x04, 0x4a, 0x64, 0xc1, 0x26, 0xfe,
3064 0x83, 0x0c, 0x01, 0x23, 0xcd, 0x12, 0x24, 0xc3, 0x11, 0x5b, 0x14, 0xf8,
3065 0xc7, 0x2c, 0xc3, 0x90, 0x04, 0xc3, 0x11, 0x9d, 0x14, 0xf8, 0xc7, 0x2c,
3066 0x03, 0x51, 0x04, 0x23, 0x06, 0xc7, 0x11, 0x82, 0x60, 0xe1, 0x1f, 0x1b,
3067 0x28, 0x7c, 0xce, 0x1c, 0x43, 0x14, 0xa4, 0xc1, 0x88, 0xc1, 0x71, 0x84,
3068 0x20, 0x58, 0xf8, 0xc7, 0x26, 0x0a, 0x61, 0xf0, 0xcc, 0x31, 0x08, 0x01,
3069 0x37, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0xb1, 0x91, 0xc2, 0x18,
3070 0x40, 0x73, 0x0c, 0x42, 0xd0, 0xcd, 0x12, 0x14, 0x03, 0x15, 0x81, 0x40,
3071 0x70, 0xc3, 0x18, 0x42, 0xf0, 0x06, 0x63, 0x08, 0x42, 0x18, 0x8c, 0x21,
3072 0x0c, 0x61, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16, 0xfe, 0x41, 0xa1,
3073 0x82, 0x10, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85, 0x7f, 0x50, 0xa9,
3074 0x40, 0x04, 0xc3, 0x11, 0x81, 0x27, 0xf8, 0xc7, 0x2c, 0x83, 0x71, 0x04,
3075 0x83, 0x0c, 0x87, 0x47, 0x06, 0x36, 0xa8, 0x81, 0xf8, 0x5b, 0x30, 0x06,
3076 0xe0, 0x6f, 0xc5, 0x1a, 0x88, 0xbf, 0x05, 0x65, 0x00, 0xfe, 0x36, 0x04,
3077 0xe4, 0x3f, 0xc7, 0x20, 0x06, 0xc1, 0x1e, 0x0c, 0x32, 0x04, 0x63, 0xa0,
3078 0x06, 0x16, 0x20, 0xe2, 0x3f, 0xc8, 0x10, 0x94, 0xc1, 0x1a, 0xcc, 0x12,
3079 0x1c, 0x03, 0x15, 0x81, 0x60, 0x88, 0x41, 0x31, 0xcb, 0x80, 0x24, 0xd9,
3080 0x20, 0x43, 0x90, 0x06, 0x6f, 0x30, 0x62, 0x70, 0x1c, 0x21, 0x08, 0x16,
3081 0xfe, 0xb1, 0xe5, 0x42, 0x40, 0x06, 0x73, 0x0c, 0x6a, 0x10, 0x88, 0xc2,
3082 0x88, 0xc1, 0x71, 0x84, 0x20, 0x58, 0xf8, 0xc7, 0xb6, 0x0b, 0x43, 0x19,
3083 0xcc, 0x31, 0x08, 0x41, 0x1d, 0x8c, 0x18, 0x1c, 0x47, 0x08, 0x82, 0x85,
3084 0x7f, 0x6c, 0xbd, 0x50, 0x98, 0xc1, 0x1c, 0x83, 0x10, 0xd8, 0xc1, 0x2c,
3085 0x41, 0x32, 0x50, 0x12, 0x90, 0x42, 0xe0, 0x0a, 0x82, 0x80, 0x40, 0xc7,
3086 0x20, 0x43, 0x10, 0x07, 0x77, 0x90, 0x01, 0x00, 0x00, 0x71, 0x20, 0x00,
3087 0x00, 0x04, 0x00, 0x00, 0x00, 0x32, 0x0e, 0x10, 0x22, 0x84, 0x00, 0xd2,
3088 0x09, 0x18, 0xd0, 0xba, 0x80, 0x07, 0xed, 0x0e, 0x00, 0x00, 0x00, 0x00,
3089 0x00, 0x65, 0x0c, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94,
3090 0x30, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00,
3091 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
3092 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
3093 0x00, 0x0d, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
3094 0x00, 0x27, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3095 0x00, 0x11, 0x00, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
3096 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3097 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3098 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
3099 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x11, 0x00, 0x00,
3100 0x00, 0x38, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
3101 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0x49, 0x00, 0x00,
3102 0x00, 0x14, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00,
3103 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x5d, 0x00, 0x00,
3104 0x00, 0x10, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
3105 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x6d, 0x00, 0x00,
3106 0x00, 0x11, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
3107 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x7e, 0x00, 0x00,
3108 0x00, 0x16, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00,
3109 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x94, 0x00, 0x00,
3110 0x00, 0x0d, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00,
3111 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xa1, 0x00, 0x00,
3112 0x00, 0x19, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00,
3113 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x00, 0x00, 0xba, 0x00, 0x00,
3114 0x00, 0x11, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
3115 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xcb, 0x00, 0x00,
3116 0x00, 0x12, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
3117 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xdd, 0x00, 0x00,
3118 0x00, 0x13, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
3119 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0xf0, 0x00, 0x00,
3120 0x00, 0x13, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00,
3121 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x03, 0x01, 0x00,
3122 0x00, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x1b, 0x00, 0x00,
3123 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
3124 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x03, 0x94,
3125 0xa7, 0x02, 0x00, 0x00, 0x00, 0x53, 0x44, 0x4c, 0x5f, 0x4e, 0x56, 0x31,
3126 0x32, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x5a,
3127 0x31, 0x34, 0x47, 0x65, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43,
3128 0x6f, 0x6c, 0x6f, 0x72, 0x44, 0x76, 0x34, 0x5f, 0x66, 0x52, 0x55, 0x31,
3129 0x31, 0x4d, 0x54, 0x4c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74,
3130 0x4b, 0x31, 0x35, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e,
3131 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61,
3132 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x33, 0x66,
3133 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x70,
3134 0x6f, 0x77, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61,
3135 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e, 0x66, 0x33, 0x32, 0x61,
3136 0x69, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x2e, 0x75,
3137 0x2e, 0x69, 0x31, 0x2e, 0x66, 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72,
3138 0x2e, 0x64, 0x6f, 0x74, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x5f, 0x5a,
3139 0x31, 0x32, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x54, 0x6f, 0x6e, 0x65, 0x6d,
3140 0x61, 0x70, 0x44, 0x76, 0x33, 0x5f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61,
3141 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78,
3142 0x2e, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74,
3143 0x5f, 0x70, 0x6f, 0x77, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69,
3144 0x72, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x62, 0x73, 0x2e,
3145 0x76, 0x33, 0x66, 0x33, 0x32, 0x61, 0x69, 0x72, 0x2e, 0x66, 0x61, 0x73,
3146 0x74, 0x5f, 0x66, 0x6d, 0x61, 0x78, 0x2e, 0x76, 0x33, 0x66, 0x33, 0x32,
3147 0x61, 0x69, 0x72, 0x2e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74,
3148 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x32, 0x64, 0x2e, 0x76, 0x34,
3149 0x66, 0x33, 0x32, 0x33, 0x32, 0x30, 0x32, 0x33, 0x2e, 0x34, 0x30, 0x34,
3150 0x61, 0x69, 0x72, 0x36, 0x34, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d,
3151 0x74, 0x76, 0x6f, 0x73, 0x31, 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x73,
3152 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00,
3153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3154};
3155const unsigned int sdl_metallib_len = 37821;
diff --git a/SDL-3.2.8/src/render/metal/build-metal-shaders.sh b/SDL-3.2.8/src/render/metal/build-metal-shaders.sh
new file mode 100755
index 0000000..e00235c
--- /dev/null
+++ b/SDL-3.2.8/src/render/metal/build-metal-shaders.sh
@@ -0,0 +1,24 @@
1#!/bin/bash
2
3set -x
4set -e
5cd `dirname "$0"`
6
7generate_shaders()
8{
9 fileplatform=$1
10 compileplatform=$2
11 sdkplatform=$3
12 minversion=$4
13 xcrun -sdk $sdkplatform metal -c -std=$compileplatform-metal1.1 -m$sdkplatform-version-min=$minversion -Wall -O3 -o ./sdl.air ./SDL_shaders_metal.metal || exit $?
14 xcrun -sdk $sdkplatform metal-ar rc sdl.metalar sdl.air || exit $?
15 xcrun -sdk $sdkplatform metallib -o sdl.metallib sdl.metalar || exit $?
16 xxd -i sdl.metallib | perl -w -p -e 's/\Aunsigned /const unsigned /;' >./SDL_shaders_metal_$fileplatform.h
17 rm -f sdl.air sdl.metalar sdl.metallib
18}
19
20generate_shaders macos macos macosx 10.11
21generate_shaders ios ios iphoneos 8.0
22generate_shaders iphonesimulator ios iphonesimulator 8.0
23generate_shaders tvos ios appletvos 9.0
24generate_shaders tvsimulator ios appletvsimulator 9.0
diff --git a/SDL-3.2.8/src/render/opengl/SDL_glfuncs.h b/SDL-3.2.8/src/render/opengl/SDL_glfuncs.h
new file mode 100644
index 0000000..7e9f265
--- /dev/null
+++ b/SDL-3.2.8/src/render/opengl/SDL_glfuncs.h
@@ -0,0 +1,476 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22/* list of OpenGL functions sorted alphabetically
23 If you need to use a GL function from the SDL video subsystem,
24 change its entry from SDL_PROC_UNUSED to SDL_PROC and rebuild.
25*/
26#define SDL_PROC_UNUSED(ret, func, params)
27
28SDL_PROC_UNUSED(void, glAccum, (GLenum, GLfloat))
29SDL_PROC_UNUSED(void, glAlphaFunc, (GLenum, GLclampf))
30SDL_PROC_UNUSED(GLboolean, glAreTexturesResident,
31 (GLsizei, const GLuint *, GLboolean *))
32SDL_PROC_UNUSED(void, glArrayElement, (GLint))
33SDL_PROC(void, glBegin, (GLenum))
34SDL_PROC(void, glBindTexture, (GLenum, GLuint))
35SDL_PROC_UNUSED(void, glBitmap,
36 (GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat,
37 const GLubyte *))
38SDL_PROC(void, glBlendEquation, (GLenum))
39SDL_PROC_UNUSED(void, glBlendFunc, (GLenum, GLenum))
40SDL_PROC(void, glBlendFuncSeparate, (GLenum, GLenum, GLenum, GLenum))
41SDL_PROC_UNUSED(void, glCallList, (GLuint))
42SDL_PROC_UNUSED(void, glCallLists, (GLsizei, GLenum, const GLvoid *))
43SDL_PROC(void, glClear, (GLbitfield))
44SDL_PROC_UNUSED(void, glClearAccum, (GLfloat, GLfloat, GLfloat, GLfloat))
45SDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))
46SDL_PROC_UNUSED(void, glClearDepth, (GLclampd))
47SDL_PROC_UNUSED(void, glClearIndex, (GLfloat))
48SDL_PROC_UNUSED(void, glClearStencil, (GLint))
49SDL_PROC_UNUSED(void, glClipPlane, (GLenum, const GLdouble *))
50SDL_PROC_UNUSED(void, glColor3b, (GLbyte, GLbyte, GLbyte))
51SDL_PROC_UNUSED(void, glColor3bv, (const GLbyte *))
52SDL_PROC_UNUSED(void, glColor3d, (GLdouble, GLdouble, GLdouble))
53SDL_PROC_UNUSED(void, glColor3dv, (const GLdouble *))
54SDL_PROC_UNUSED(void, glColor3f, (GLfloat, GLfloat, GLfloat))
55SDL_PROC(void, glColor3fv, (const GLfloat *))
56SDL_PROC_UNUSED(void, glColor3i, (GLint, GLint, GLint))
57SDL_PROC_UNUSED(void, glColor3iv, (const GLint *))
58SDL_PROC_UNUSED(void, glColor3s, (GLshort, GLshort, GLshort))
59SDL_PROC_UNUSED(void, glColor3sv, (const GLshort *))
60SDL_PROC_UNUSED(void, glColor3ub, (GLubyte, GLubyte, GLubyte))
61SDL_PROC_UNUSED(void, glColor3ubv, (const GLubyte *))
62SDL_PROC_UNUSED(void, glColor3ui, (GLuint, GLuint, GLuint))
63SDL_PROC_UNUSED(void, glColor3uiv, (const GLuint *))
64SDL_PROC_UNUSED(void, glColor3us, (GLushort, GLushort, GLushort))
65SDL_PROC_UNUSED(void, glColor3usv, (const GLushort *))
66SDL_PROC_UNUSED(void, glColor4b, (GLbyte, GLbyte, GLbyte, GLbyte))
67SDL_PROC_UNUSED(void, glColor4bv, (const GLbyte *))
68SDL_PROC_UNUSED(void, glColor4d, (GLdouble, GLdouble, GLdouble, GLdouble))
69SDL_PROC_UNUSED(void, glColor4dv, (const GLdouble *))
70SDL_PROC(void, glColor4f, (GLfloat, GLfloat, GLfloat, GLfloat))
71SDL_PROC_UNUSED(void, glColor4fv, (const GLfloat *))
72SDL_PROC_UNUSED(void, glColor4i, (GLint, GLint, GLint, GLint))
73SDL_PROC_UNUSED(void, glColor4iv, (const GLint *))
74SDL_PROC_UNUSED(void, glColor4s, (GLshort, GLshort, GLshort, GLshort))
75SDL_PROC_UNUSED(void, glColor4sv, (const GLshort *))
76SDL_PROC(void, glColor4ub,
77 (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha))
78SDL_PROC_UNUSED(void, glColor4ubv, (const GLubyte *v))
79SDL_PROC_UNUSED(void, glColor4ui,
80 (GLuint red, GLuint green, GLuint blue, GLuint alpha))
81SDL_PROC_UNUSED(void, glColor4uiv, (const GLuint *v))
82SDL_PROC_UNUSED(void, glColor4us,
83 (GLushort red, GLushort green, GLushort blue, GLushort alpha))
84SDL_PROC_UNUSED(void, glColor4usv, (const GLushort *v))
85SDL_PROC_UNUSED(void, glColorMask,
86 (GLboolean red, GLboolean green, GLboolean blue,
87 GLboolean alpha))
88SDL_PROC_UNUSED(void, glColorMaterial, (GLenum face, GLenum mode))
89SDL_PROC(void, glColorPointer,
90 (GLint size, GLenum type, GLsizei stride,
91 const GLvoid *pointer))
92SDL_PROC_UNUSED(void, glCopyPixels,
93 (GLint x, GLint y, GLsizei width, GLsizei height,
94 GLenum type))
95SDL_PROC_UNUSED(void, glCopyTexImage1D,
96 (GLenum target, GLint level, GLenum internalFormat, GLint x,
97 GLint y, GLsizei width, GLint border))
98SDL_PROC_UNUSED(void, glCopyTexImage2D,
99 (GLenum target, GLint level, GLenum internalFormat, GLint x,
100 GLint y, GLsizei width, GLsizei height, GLint border))
101SDL_PROC_UNUSED(void, glCopyTexSubImage1D,
102 (GLenum target, GLint level, GLint xoffset, GLint x, GLint y,
103 GLsizei width))
104SDL_PROC_UNUSED(void, glCopyTexSubImage2D,
105 (GLenum target, GLint level, GLint xoffset, GLint yoffset,
106 GLint x, GLint y, GLsizei width, GLsizei height))
107SDL_PROC_UNUSED(void, glCullFace, (GLenum mode))
108SDL_PROC_UNUSED(void, glDeleteLists, (GLuint list, GLsizei range))
109SDL_PROC(void, glDeleteTextures, (GLsizei n, const GLuint *textures))
110SDL_PROC(void, glDepthFunc, (GLenum func))
111SDL_PROC_UNUSED(void, glDepthMask, (GLboolean flag))
112SDL_PROC_UNUSED(void, glDepthRange, (GLclampd zNear, GLclampd zFar))
113SDL_PROC(void, glDisable, (GLenum cap))
114SDL_PROC(void, glDisableClientState, (GLenum array))
115SDL_PROC(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count))
116SDL_PROC_UNUSED(void, glDrawBuffer, (GLenum mode))
117SDL_PROC_UNUSED(void, glDrawElements,
118 (GLenum mode, GLsizei count, GLenum type,
119 const GLvoid *indices))
120SDL_PROC(void, glDrawPixels,
121 (GLsizei width, GLsizei height, GLenum format, GLenum type,
122 const GLvoid *pixels))
123SDL_PROC_UNUSED(void, glEdgeFlag, (GLboolean flag))
124SDL_PROC_UNUSED(void, glEdgeFlagPointer,
125 (GLsizei stride, const GLvoid *pointer))
126SDL_PROC_UNUSED(void, glEdgeFlagv, (const GLboolean *flag))
127SDL_PROC(void, glEnable, (GLenum cap))
128SDL_PROC(void, glEnableClientState, (GLenum array))
129SDL_PROC(void, glEnd, (void))
130SDL_PROC_UNUSED(void, glEndList, (void))
131SDL_PROC_UNUSED(void, glEvalCoord1d, (GLdouble u))
132SDL_PROC_UNUSED(void, glEvalCoord1dv, (const GLdouble *u))
133SDL_PROC_UNUSED(void, glEvalCoord1f, (GLfloat u))
134SDL_PROC_UNUSED(void, glEvalCoord1fv, (const GLfloat *u))
135SDL_PROC_UNUSED(void, glEvalCoord2d, (GLdouble u, GLdouble v))
136SDL_PROC_UNUSED(void, glEvalCoord2dv, (const GLdouble *u))
137SDL_PROC_UNUSED(void, glEvalCoord2f, (GLfloat u, GLfloat v))
138SDL_PROC_UNUSED(void, glEvalCoord2fv, (const GLfloat *u))
139SDL_PROC_UNUSED(void, glEvalMesh1, (GLenum mode, GLint i1, GLint i2))
140SDL_PROC_UNUSED(void, glEvalMesh2,
141 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2))
142SDL_PROC_UNUSED(void, glEvalPoint1, (GLint i))
143SDL_PROC_UNUSED(void, glEvalPoint2, (GLint i, GLint j))
144SDL_PROC_UNUSED(void, glFeedbackBuffer,
145 (GLsizei size, GLenum type, GLfloat *buffer))
146SDL_PROC_UNUSED(void, glFinish, (void))
147SDL_PROC_UNUSED(void, glFlush, (void))
148SDL_PROC_UNUSED(void, glFogf, (GLenum pname, GLfloat param))
149SDL_PROC_UNUSED(void, glFogfv, (GLenum pname, const GLfloat *params))
150SDL_PROC_UNUSED(void, glFogi, (GLenum pname, GLint param))
151SDL_PROC_UNUSED(void, glFogiv, (GLenum pname, const GLint *params))
152SDL_PROC_UNUSED(void, glFrontFace, (GLenum mode))
153SDL_PROC_UNUSED(void, glFrustum,
154 (GLdouble left, GLdouble right, GLdouble bottom,
155 GLdouble top, GLdouble zNear, GLdouble zFar))
156SDL_PROC_UNUSED(GLuint, glGenLists, (GLsizei range))
157SDL_PROC(void, glGenTextures, (GLsizei n, GLuint *textures))
158SDL_PROC_UNUSED(void, glGetBooleanv, (GLenum pname, GLboolean *params))
159SDL_PROC_UNUSED(void, glGetClipPlane, (GLenum plane, GLdouble *equation))
160SDL_PROC_UNUSED(void, glGetDoublev, (GLenum pname, GLdouble *params))
161SDL_PROC(GLenum, glGetError, (void))
162SDL_PROC(void, glGetFloatv, (GLenum pname, GLfloat *params))
163SDL_PROC(void, glGetIntegerv, (GLenum pname, GLint *params))
164SDL_PROC_UNUSED(void, glGetLightfv,
165 (GLenum light, GLenum pname, GLfloat *params))
166SDL_PROC_UNUSED(void, glGetLightiv,
167 (GLenum light, GLenum pname, GLint *params))
168SDL_PROC_UNUSED(void, glGetMapdv, (GLenum target, GLenum query, GLdouble *v))
169SDL_PROC_UNUSED(void, glGetMapfv, (GLenum target, GLenum query, GLfloat *v))
170SDL_PROC_UNUSED(void, glGetMapiv, (GLenum target, GLenum query, GLint *v))
171SDL_PROC_UNUSED(void, glGetMaterialfv,
172 (GLenum face, GLenum pname, GLfloat *params))
173SDL_PROC_UNUSED(void, glGetMaterialiv,
174 (GLenum face, GLenum pname, GLint *params))
175SDL_PROC_UNUSED(void, glGetPixelMapfv, (GLenum map, GLfloat *values))
176SDL_PROC_UNUSED(void, glGetPixelMapuiv, (GLenum map, GLuint *values))
177SDL_PROC_UNUSED(void, glGetPixelMapusv, (GLenum map, GLushort *values))
178SDL_PROC(void, glGetPointerv, (GLenum pname, GLvoid **params))
179SDL_PROC_UNUSED(void, glGetPolygonStipple, (GLubyte * mask))
180SDL_PROC(const GLubyte *, glGetString, (GLenum name))
181SDL_PROC_UNUSED(void, glGetTexEnvfv,
182 (GLenum target, GLenum pname, GLfloat *params))
183SDL_PROC_UNUSED(void, glGetTexEnviv,
184 (GLenum target, GLenum pname, GLint *params))
185SDL_PROC_UNUSED(void, glGetTexGendv,
186 (GLenum coord, GLenum pname, GLdouble *params))
187SDL_PROC_UNUSED(void, glGetTexGenfv,
188 (GLenum coord, GLenum pname, GLfloat *params))
189SDL_PROC_UNUSED(void, glGetTexGeniv,
190 (GLenum coord, GLenum pname, GLint *params))
191SDL_PROC_UNUSED(void, glGetTexImage,
192 (GLenum target, GLint level, GLenum format, GLenum type,
193 GLvoid *pixels))
194SDL_PROC_UNUSED(void, glGetTexLevelParameterfv,
195 (GLenum target, GLint level, GLenum pname, GLfloat *params))
196SDL_PROC_UNUSED(void, glGetTexLevelParameteriv,
197 (GLenum target, GLint level, GLenum pname, GLint *params))
198SDL_PROC_UNUSED(void, glGetTexParameterfv,
199 (GLenum target, GLenum pname, GLfloat *params))
200SDL_PROC_UNUSED(void, glGetTexParameteriv,
201 (GLenum target, GLenum pname, GLint *params))
202SDL_PROC_UNUSED(void, glHint, (GLenum target, GLenum mode))
203SDL_PROC_UNUSED(void, glIndexMask, (GLuint mask))
204SDL_PROC_UNUSED(void, glIndexPointer,
205 (GLenum type, GLsizei stride, const GLvoid *pointer))
206SDL_PROC_UNUSED(void, glIndexd, (GLdouble c))
207SDL_PROC_UNUSED(void, glIndexdv, (const GLdouble *c))
208SDL_PROC_UNUSED(void, glIndexf, (GLfloat c))
209SDL_PROC_UNUSED(void, glIndexfv, (const GLfloat *c))
210SDL_PROC_UNUSED(void, glIndexi, (GLint c))
211SDL_PROC_UNUSED(void, glIndexiv, (const GLint *c))
212SDL_PROC_UNUSED(void, glIndexs, (GLshort c))
213SDL_PROC_UNUSED(void, glIndexsv, (const GLshort *c))
214SDL_PROC_UNUSED(void, glIndexub, (GLubyte c))
215SDL_PROC_UNUSED(void, glIndexubv, (const GLubyte *c))
216SDL_PROC_UNUSED(void, glInitNames, (void))
217SDL_PROC_UNUSED(void, glInterleavedArrays,
218 (GLenum format, GLsizei stride, const GLvoid *pointer))
219SDL_PROC_UNUSED(GLboolean, glIsEnabled, (GLenum cap))
220SDL_PROC_UNUSED(GLboolean, glIsList, (GLuint list))
221SDL_PROC_UNUSED(GLboolean, glIsTexture, (GLuint texture))
222SDL_PROC_UNUSED(void, glLightModelf, (GLenum pname, GLfloat param))
223SDL_PROC_UNUSED(void, glLightModelfv, (GLenum pname, const GLfloat *params))
224SDL_PROC_UNUSED(void, glLightModeli, (GLenum pname, GLint param))
225SDL_PROC_UNUSED(void, glLightModeliv, (GLenum pname, const GLint *params))
226SDL_PROC_UNUSED(void, glLightf, (GLenum light, GLenum pname, GLfloat param))
227SDL_PROC_UNUSED(void, glLightfv,
228 (GLenum light, GLenum pname, const GLfloat *params))
229SDL_PROC_UNUSED(void, glLighti, (GLenum light, GLenum pname, GLint param))
230SDL_PROC_UNUSED(void, glLightiv,
231 (GLenum light, GLenum pname, const GLint *params))
232SDL_PROC_UNUSED(void, glLineStipple, (GLint factor, GLushort pattern))
233SDL_PROC(void, glLineWidth, (GLfloat width))
234SDL_PROC_UNUSED(void, glListBase, (GLuint base))
235SDL_PROC(void, glLoadIdentity, (void))
236SDL_PROC_UNUSED(void, glLoadMatrixd, (const GLdouble *m))
237SDL_PROC_UNUSED(void, glLoadMatrixf, (const GLfloat *m))
238SDL_PROC_UNUSED(void, glLoadName, (GLuint name))
239SDL_PROC_UNUSED(void, glLogicOp, (GLenum opcode))
240SDL_PROC_UNUSED(void, glMap1d,
241 (GLenum target, GLdouble u1, GLdouble u2, GLint stride,
242 GLint order, const GLdouble *points))
243SDL_PROC_UNUSED(void, glMap1f,
244 (GLenum target, GLfloat u1, GLfloat u2, GLint stride,
245 GLint order, const GLfloat *points))
246SDL_PROC_UNUSED(void, glMap2d,
247 (GLenum target, GLdouble u1, GLdouble u2, GLint ustride,
248 GLint uorder, GLdouble v1, GLdouble v2, GLint vstride,
249 GLint vorder, const GLdouble *points))
250SDL_PROC_UNUSED(void, glMap2f,
251 (GLenum target, GLfloat u1, GLfloat u2, GLint ustride,
252 GLint uorder, GLfloat v1, GLfloat v2, GLint vstride,
253 GLint vorder, const GLfloat *points))
254SDL_PROC_UNUSED(void, glMapGrid1d, (GLint un, GLdouble u1, GLdouble u2))
255SDL_PROC_UNUSED(void, glMapGrid1f, (GLint un, GLfloat u1, GLfloat u2))
256SDL_PROC_UNUSED(void, glMapGrid2d,
257 (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1,
258 GLdouble v2))
259SDL_PROC_UNUSED(void, glMapGrid2f,
260 (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1,
261 GLfloat v2))
262SDL_PROC_UNUSED(void, glMaterialf, (GLenum face, GLenum pname, GLfloat param))
263SDL_PROC_UNUSED(void, glMaterialfv,
264 (GLenum face, GLenum pname, const GLfloat *params))
265SDL_PROC_UNUSED(void, glMateriali, (GLenum face, GLenum pname, GLint param))
266SDL_PROC_UNUSED(void, glMaterialiv,
267 (GLenum face, GLenum pname, const GLint *params))
268SDL_PROC(void, glMatrixMode, (GLenum mode))
269SDL_PROC_UNUSED(void, glMultMatrixd, (const GLdouble *m))
270SDL_PROC_UNUSED(void, glMultMatrixf, (const GLfloat *m))
271SDL_PROC_UNUSED(void, glNewList, (GLuint list, GLenum mode))
272SDL_PROC_UNUSED(void, glNormal3b, (GLbyte nx, GLbyte ny, GLbyte nz))
273SDL_PROC_UNUSED(void, glNormal3bv, (const GLbyte *v))
274SDL_PROC_UNUSED(void, glNormal3d, (GLdouble nx, GLdouble ny, GLdouble nz))
275SDL_PROC_UNUSED(void, glNormal3dv, (const GLdouble *v))
276SDL_PROC_UNUSED(void, glNormal3f, (GLfloat nx, GLfloat ny, GLfloat nz))
277SDL_PROC_UNUSED(void, glNormal3fv, (const GLfloat *v))
278SDL_PROC_UNUSED(void, glNormal3i, (GLint nx, GLint ny, GLint nz))
279SDL_PROC_UNUSED(void, glNormal3iv, (const GLint *v))
280SDL_PROC_UNUSED(void, glNormal3s, (GLshort nx, GLshort ny, GLshort nz))
281SDL_PROC_UNUSED(void, glNormal3sv, (const GLshort *v))
282SDL_PROC_UNUSED(void, glNormalPointer,
283 (GLenum type, GLsizei stride, const GLvoid *pointer))
284SDL_PROC(void, glOrtho,
285 (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top,
286 GLdouble zNear, GLdouble zFar))
287SDL_PROC_UNUSED(void, glPassThrough, (GLfloat token))
288SDL_PROC_UNUSED(void, glPixelMapfv,
289 (GLenum map, GLsizei mapsize, const GLfloat *values))
290SDL_PROC_UNUSED(void, glPixelMapuiv,
291 (GLenum map, GLsizei mapsize, const GLuint *values))
292SDL_PROC_UNUSED(void, glPixelMapusv,
293 (GLenum map, GLsizei mapsize, const GLushort *values))
294SDL_PROC_UNUSED(void, glPixelStoref, (GLenum pname, GLfloat param))
295SDL_PROC(void, glPixelStorei, (GLenum pname, GLint param))
296SDL_PROC_UNUSED(void, glPixelTransferf, (GLenum pname, GLfloat param))
297SDL_PROC_UNUSED(void, glPixelTransferi, (GLenum pname, GLint param))
298SDL_PROC_UNUSED(void, glPixelZoom, (GLfloat xfactor, GLfloat yfactor))
299SDL_PROC(void, glPointSize, (GLfloat size))
300SDL_PROC_UNUSED(void, glPolygonMode, (GLenum face, GLenum mode))
301SDL_PROC_UNUSED(void, glPolygonOffset, (GLfloat factor, GLfloat units))
302SDL_PROC_UNUSED(void, glPolygonStipple, (const GLubyte *mask))
303SDL_PROC_UNUSED(void, glPopAttrib, (void))
304SDL_PROC_UNUSED(void, glPopClientAttrib, (void))
305SDL_PROC_UNUSED(void, glPopMatrix, (void))
306SDL_PROC_UNUSED(void, glPopName, (void))
307SDL_PROC_UNUSED(void, glPrioritizeTextures,
308 (GLsizei n, const GLuint *textures,
309 const GLclampf *priorities))
310SDL_PROC_UNUSED(void, glPushAttrib, (GLbitfield mask))
311SDL_PROC_UNUSED(void, glPushClientAttrib, (GLbitfield mask))
312SDL_PROC_UNUSED(void, glPushMatrix, (void))
313SDL_PROC_UNUSED(void, glPushName, (GLuint name))
314SDL_PROC_UNUSED(void, glRasterPos2d, (GLdouble x, GLdouble y))
315SDL_PROC_UNUSED(void, glRasterPos2dv, (const GLdouble *v))
316SDL_PROC_UNUSED(void, glRasterPos2f, (GLfloat x, GLfloat y))
317SDL_PROC_UNUSED(void, glRasterPos2fv, (const GLfloat *v))
318SDL_PROC(void, glRasterPos2i, (GLint x, GLint y))
319SDL_PROC_UNUSED(void, glRasterPos2iv, (const GLint *v))
320SDL_PROC_UNUSED(void, glRasterPos2s, (GLshort x, GLshort y))
321SDL_PROC_UNUSED(void, glRasterPos2sv, (const GLshort *v))
322SDL_PROC_UNUSED(void, glRasterPos3d, (GLdouble x, GLdouble y, GLdouble z))
323SDL_PROC_UNUSED(void, glRasterPos3dv, (const GLdouble *v))
324SDL_PROC_UNUSED(void, glRasterPos3f, (GLfloat x, GLfloat y, GLfloat z))
325SDL_PROC_UNUSED(void, glRasterPos3fv, (const GLfloat *v))
326SDL_PROC_UNUSED(void, glRasterPos3i, (GLint x, GLint y, GLint z))
327SDL_PROC_UNUSED(void, glRasterPos3iv, (const GLint *v))
328SDL_PROC_UNUSED(void, glRasterPos3s, (GLshort x, GLshort y, GLshort z))
329SDL_PROC_UNUSED(void, glRasterPos3sv, (const GLshort *v))
330SDL_PROC_UNUSED(void, glRasterPos4d,
331 (GLdouble x, GLdouble y, GLdouble z, GLdouble w))
332SDL_PROC_UNUSED(void, glRasterPos4dv, (const GLdouble *v))
333SDL_PROC_UNUSED(void, glRasterPos4f,
334 (GLfloat x, GLfloat y, GLfloat z, GLfloat w))
335SDL_PROC_UNUSED(void, glRasterPos4fv, (const GLfloat *v))
336SDL_PROC_UNUSED(void, glRasterPos4i, (GLint x, GLint y, GLint z, GLint w))
337SDL_PROC_UNUSED(void, glRasterPos4iv, (const GLint *v))
338SDL_PROC_UNUSED(void, glRasterPos4s,
339 (GLshort x, GLshort y, GLshort z, GLshort w))
340SDL_PROC_UNUSED(void, glRasterPos4sv, (const GLshort *v))
341SDL_PROC(void, glReadBuffer, (GLenum mode))
342SDL_PROC(void, glReadPixels,
343 (GLint x, GLint y, GLsizei width, GLsizei height,
344 GLenum format, GLenum type, GLvoid *pixels))
345SDL_PROC_UNUSED(void, glRectd,
346 (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2))
347SDL_PROC_UNUSED(void, glRectdv, (const GLdouble *v1, const GLdouble *v2))
348SDL_PROC(void, glRectf,
349 (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2))
350SDL_PROC_UNUSED(void, glRectfv, (const GLfloat *v1, const GLfloat *v2))
351SDL_PROC_UNUSED(void, glRecti, (GLint x1, GLint y1, GLint x2, GLint y2))
352SDL_PROC_UNUSED(void, glRectiv, (const GLint *v1, const GLint *v2))
353SDL_PROC_UNUSED(void, glRects,
354 (GLshort x1, GLshort y1, GLshort x2, GLshort y2))
355SDL_PROC_UNUSED(void, glRectsv, (const GLshort *v1, const GLshort *v2))
356SDL_PROC_UNUSED(GLint, glRenderMode, (GLenum mode))
357SDL_PROC_UNUSED(void, glRotated,
358 (GLdouble angle, GLdouble x, GLdouble y, GLdouble z))
359SDL_PROC(void, glRotatef,
360 (GLfloat angle, GLfloat x, GLfloat y, GLfloat z))
361SDL_PROC_UNUSED(void, glScaled, (GLdouble x, GLdouble y, GLdouble z))
362SDL_PROC_UNUSED(void, glScalef, (GLfloat x, GLfloat y, GLfloat z))
363SDL_PROC(void, glScissor, (GLint x, GLint y, GLsizei width, GLsizei height))
364SDL_PROC_UNUSED(void, glSelectBuffer, (GLsizei size, GLuint *buffer))
365SDL_PROC(void, glShadeModel, (GLenum mode))
366SDL_PROC_UNUSED(void, glStencilFunc, (GLenum func, GLint ref, GLuint mask))
367SDL_PROC_UNUSED(void, glStencilMask, (GLuint mask))
368SDL_PROC_UNUSED(void, glStencilOp, (GLenum fail, GLenum zfail, GLenum zpass))
369SDL_PROC_UNUSED(void, glTexCoord1d, (GLdouble s))
370SDL_PROC_UNUSED(void, glTexCoord1dv, (const GLdouble *v))
371SDL_PROC_UNUSED(void, glTexCoord1f, (GLfloat s))
372SDL_PROC_UNUSED(void, glTexCoord1fv, (const GLfloat *v))
373SDL_PROC_UNUSED(void, glTexCoord1i, (GLint s))
374SDL_PROC_UNUSED(void, glTexCoord1iv, (const GLint *v))
375SDL_PROC_UNUSED(void, glTexCoord1s, (GLshort s))
376SDL_PROC_UNUSED(void, glTexCoord1sv, (const GLshort *v))
377SDL_PROC_UNUSED(void, glTexCoord2d, (GLdouble s, GLdouble t))
378SDL_PROC_UNUSED(void, glTexCoord2dv, (const GLdouble *v))
379SDL_PROC(void, glTexCoord2f, (GLfloat s, GLfloat t))
380SDL_PROC_UNUSED(void, glTexCoord2fv, (const GLfloat *v))
381SDL_PROC_UNUSED(void, glTexCoord2i, (GLint s, GLint t))
382SDL_PROC_UNUSED(void, glTexCoord2iv, (const GLint *v))
383SDL_PROC_UNUSED(void, glTexCoord2s, (GLshort s, GLshort t))
384SDL_PROC_UNUSED(void, glTexCoord2sv, (const GLshort *v))
385SDL_PROC_UNUSED(void, glTexCoord3d, (GLdouble s, GLdouble t, GLdouble r))
386SDL_PROC_UNUSED(void, glTexCoord3dv, (const GLdouble *v))
387SDL_PROC_UNUSED(void, glTexCoord3f, (GLfloat s, GLfloat t, GLfloat r))
388SDL_PROC_UNUSED(void, glTexCoord3fv, (const GLfloat *v))
389SDL_PROC_UNUSED(void, glTexCoord3i, (GLint s, GLint t, GLint r))
390SDL_PROC_UNUSED(void, glTexCoord3iv, (const GLint *v))
391SDL_PROC_UNUSED(void, glTexCoord3s, (GLshort s, GLshort t, GLshort r))
392SDL_PROC_UNUSED(void, glTexCoord3sv, (const GLshort *v))
393SDL_PROC_UNUSED(void, glTexCoord4d,
394 (GLdouble s, GLdouble t, GLdouble r, GLdouble q))
395SDL_PROC_UNUSED(void, glTexCoord4dv, (const GLdouble *v))
396SDL_PROC_UNUSED(void, glTexCoord4f,
397 (GLfloat s, GLfloat t, GLfloat r, GLfloat q))
398SDL_PROC_UNUSED(void, glTexCoord4fv, (const GLfloat *v))
399SDL_PROC_UNUSED(void, glTexCoord4i, (GLint s, GLint t, GLint r, GLint q))
400SDL_PROC_UNUSED(void, glTexCoord4iv, (const GLint *v))
401SDL_PROC_UNUSED(void, glTexCoord4s,
402 (GLshort s, GLshort t, GLshort r, GLshort q))
403SDL_PROC_UNUSED(void, glTexCoord4sv, (const GLshort *v))
404SDL_PROC(void, glTexCoordPointer,
405 (GLint size, GLenum type, GLsizei stride,
406 const GLvoid *pointer))
407SDL_PROC(void, glTexEnvf, (GLenum target, GLenum pname, GLfloat param))
408SDL_PROC_UNUSED(void, glTexEnvfv,
409 (GLenum target, GLenum pname, const GLfloat *params))
410SDL_PROC_UNUSED(void, glTexEnvi, (GLenum target, GLenum pname, GLint param))
411SDL_PROC_UNUSED(void, glTexEnviv,
412 (GLenum target, GLenum pname, const GLint *params))
413SDL_PROC_UNUSED(void, glTexGend, (GLenum coord, GLenum pname, GLdouble param))
414SDL_PROC_UNUSED(void, glTexGendv,
415 (GLenum coord, GLenum pname, const GLdouble *params))
416SDL_PROC_UNUSED(void, glTexGenf, (GLenum coord, GLenum pname, GLfloat param))
417SDL_PROC_UNUSED(void, glTexGenfv,
418 (GLenum coord, GLenum pname, const GLfloat *params))
419SDL_PROC_UNUSED(void, glTexGeni, (GLenum coord, GLenum pname, GLint param))
420SDL_PROC_UNUSED(void, glTexGeniv,
421 (GLenum coord, GLenum pname, const GLint *params))
422SDL_PROC_UNUSED(void, glTexImage1D,
423 (GLenum target, GLint level, GLint internalformat,
424 GLsizei width, GLint border, GLenum format, GLenum type,
425 const GLvoid *pixels))
426SDL_PROC(void, glTexImage2D,
427 (GLenum target, GLint level, GLint internalformat, GLsizei width,
428 GLsizei height, GLint border, GLenum format, GLenum type,
429 const GLvoid *pixels))
430SDL_PROC_UNUSED(void, glTexParameterf,
431 (GLenum target, GLenum pname, GLfloat param))
432SDL_PROC_UNUSED(void, glTexParameterfv,
433 (GLenum target, GLenum pname, const GLfloat *params))
434SDL_PROC(void, glTexParameteri, (GLenum target, GLenum pname, GLint param))
435SDL_PROC_UNUSED(void, glTexParameteriv,
436 (GLenum target, GLenum pname, const GLint *params))
437SDL_PROC_UNUSED(void, glTexSubImage1D,
438 (GLenum target, GLint level, GLint xoffset, GLsizei width,
439 GLenum format, GLenum type, const GLvoid *pixels))
440SDL_PROC(void, glTexSubImage2D,
441 (GLenum target, GLint level, GLint xoffset, GLint yoffset,
442 GLsizei width, GLsizei height, GLenum format, GLenum type,
443 const GLvoid *pixels))
444SDL_PROC_UNUSED(void, glTranslated, (GLdouble x, GLdouble y, GLdouble z))
445SDL_PROC_UNUSED(void, glTranslatef, (GLfloat x, GLfloat y, GLfloat z))
446SDL_PROC_UNUSED(void, glVertex2d, (GLdouble x, GLdouble y))
447SDL_PROC_UNUSED(void, glVertex2dv, (const GLdouble *v))
448SDL_PROC(void, glVertex2f, (GLfloat x, GLfloat y))
449SDL_PROC_UNUSED(void, glVertex2fv, (const GLfloat *v))
450SDL_PROC_UNUSED(void, glVertex2i, (GLint x, GLint y))
451SDL_PROC_UNUSED(void, glVertex2iv, (const GLint *v))
452SDL_PROC_UNUSED(void, glVertex2s, (GLshort x, GLshort y))
453SDL_PROC_UNUSED(void, glVertex2sv, (const GLshort *v))
454SDL_PROC_UNUSED(void, glVertex3d, (GLdouble x, GLdouble y, GLdouble z))
455SDL_PROC_UNUSED(void, glVertex3dv, (const GLdouble *v))
456SDL_PROC_UNUSED(void, glVertex3f, (GLfloat x, GLfloat y, GLfloat z))
457SDL_PROC(void, glVertex3fv, (const GLfloat *v))
458SDL_PROC_UNUSED(void, glVertex3i, (GLint x, GLint y, GLint z))
459SDL_PROC_UNUSED(void, glVertex3iv, (const GLint *v))
460SDL_PROC_UNUSED(void, glVertex3s, (GLshort x, GLshort y, GLshort z))
461SDL_PROC_UNUSED(void, glVertex3sv, (const GLshort *v))
462SDL_PROC_UNUSED(void, glVertex4d,
463 (GLdouble x, GLdouble y, GLdouble z, GLdouble w))
464SDL_PROC_UNUSED(void, glVertex4dv, (const GLdouble *v))
465SDL_PROC_UNUSED(void, glVertex4f,
466 (GLfloat x, GLfloat y, GLfloat z, GLfloat w))
467SDL_PROC_UNUSED(void, glVertex4fv, (const GLfloat *v))
468SDL_PROC_UNUSED(void, glVertex4i, (GLint x, GLint y, GLint z, GLint w))
469SDL_PROC_UNUSED(void, glVertex4iv, (const GLint *v))
470SDL_PROC_UNUSED(void, glVertex4s,
471 (GLshort x, GLshort y, GLshort z, GLshort w))
472SDL_PROC_UNUSED(void, glVertex4sv, (const GLshort *v))
473SDL_PROC(void, glVertexPointer,
474 (GLint size, GLenum type, GLsizei stride,
475 const GLvoid *pointer))
476SDL_PROC(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height))
diff --git a/SDL-3.2.8/src/render/opengl/SDL_render_gl.c b/SDL-3.2.8/src/render/opengl/SDL_render_gl.c
new file mode 100644
index 0000000..d534438
--- /dev/null
+++ b/SDL-3.2.8/src/render/opengl/SDL_render_gl.c
@@ -0,0 +1,1844 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_OGL
24#include "../../video/SDL_sysvideo.h" // For SDL_RecreateWindow
25#include <SDL3/SDL_opengl.h>
26#include "../SDL_sysrender.h"
27#include "SDL_shaders_gl.h"
28#include "../../video/SDL_pixels_c.h"
29
30#ifdef SDL_PLATFORM_MACOS
31#include <OpenGL/OpenGL.h>
32#endif
33
34#ifdef SDL_VIDEO_VITA_PVR_OGL
35#include <GL/gl.h>
36#include <GL/glext.h>
37#endif
38
39/* To prevent unnecessary window recreation,
40 * these should match the defaults selected in SDL_GL_ResetAttributes
41 */
42
43#define RENDERER_CONTEXT_MAJOR 2
44#define RENDERER_CONTEXT_MINOR 1
45
46// OpenGL renderer implementation
47
48/* Details on optimizing the texture path on macOS:
49 http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html
50*/
51
52typedef struct GL_FBOList GL_FBOList;
53
54struct GL_FBOList
55{
56 Uint32 w, h;
57 GLuint FBO;
58 GL_FBOList *next;
59};
60
61typedef struct
62{
63 bool viewport_dirty;
64 SDL_Rect viewport;
65 SDL_Texture *texture;
66 SDL_Texture *target;
67 int drawablew;
68 int drawableh;
69 SDL_BlendMode blend;
70 GL_Shader shader;
71 const float *shader_params;
72 bool cliprect_enabled_dirty;
73 bool cliprect_enabled;
74 bool cliprect_dirty;
75 SDL_Rect cliprect;
76 bool texturing;
77 bool texturing_dirty;
78 bool vertex_array;
79 bool color_array;
80 bool texture_array;
81 bool color_dirty;
82 SDL_FColor color;
83 bool clear_color_dirty;
84 SDL_FColor clear_color;
85} GL_DrawStateCache;
86
87typedef struct
88{
89 SDL_GLContext context;
90
91 bool debug_enabled;
92 bool GL_ARB_debug_output_supported;
93 int errors;
94 char **error_messages;
95 GLDEBUGPROCARB next_error_callback;
96 GLvoid *next_error_userparam;
97
98 GLenum textype;
99
100 bool GL_ARB_texture_non_power_of_two_supported;
101 bool GL_ARB_texture_rectangle_supported;
102 bool GL_EXT_framebuffer_object_supported;
103 GL_FBOList *framebuffers;
104
105 // OpenGL functions
106#define SDL_PROC(ret, func, params) ret (APIENTRY *func) params;
107#include "SDL_glfuncs.h"
108#undef SDL_PROC
109
110 // Multitexture support
111 bool GL_ARB_multitexture_supported;
112 PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
113 GLint num_texture_units;
114
115 PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
116 PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
117 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
118 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
119 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
120
121 // Shader support
122 GL_ShaderContext *shaders;
123
124 GL_DrawStateCache drawstate;
125} GL_RenderData;
126
127typedef struct
128{
129 GLuint texture;
130 bool texture_external;
131 GLfloat texw;
132 GLfloat texh;
133 GLenum format;
134 GLenum formattype;
135 GL_Shader shader;
136 const float *shader_params;
137 void *pixels;
138 int pitch;
139 SDL_Rect locked_rect;
140
141#ifdef SDL_HAVE_YUV
142 // YUV texture support
143 bool yuv;
144 bool nv12;
145 GLuint utexture;
146 bool utexture_external;
147 GLuint vtexture;
148 bool vtexture_external;
149#endif
150
151 GL_FBOList *fbo;
152} GL_TextureData;
153
154static const char *GL_TranslateError(GLenum error)
155{
156#define GL_ERROR_TRANSLATE(e) \
157 case e: \
158 return #e;
159 switch (error) {
160 GL_ERROR_TRANSLATE(GL_INVALID_ENUM)
161 GL_ERROR_TRANSLATE(GL_INVALID_VALUE)
162 GL_ERROR_TRANSLATE(GL_INVALID_OPERATION)
163 GL_ERROR_TRANSLATE(GL_OUT_OF_MEMORY)
164 GL_ERROR_TRANSLATE(GL_NO_ERROR)
165 GL_ERROR_TRANSLATE(GL_STACK_OVERFLOW)
166 GL_ERROR_TRANSLATE(GL_STACK_UNDERFLOW)
167 GL_ERROR_TRANSLATE(GL_TABLE_TOO_LARGE)
168 default:
169 return "UNKNOWN";
170 }
171#undef GL_ERROR_TRANSLATE
172}
173
174static void GL_ClearErrors(SDL_Renderer *renderer)
175{
176 GL_RenderData *data = (GL_RenderData *)renderer->internal;
177
178 if (!data->debug_enabled) {
179 return;
180 }
181 if (data->GL_ARB_debug_output_supported) {
182 if (data->errors) {
183 int i;
184 for (i = 0; i < data->errors; ++i) {
185 SDL_free(data->error_messages[i]);
186 }
187 SDL_free(data->error_messages);
188
189 data->errors = 0;
190 data->error_messages = NULL;
191 }
192 } else if (data->glGetError) {
193 while (data->glGetError() != GL_NO_ERROR) {
194 // continue;
195 }
196 }
197}
198
199static bool GL_CheckAllErrors(const char *prefix, SDL_Renderer *renderer, const char *file, int line, const char *function)
200{
201 GL_RenderData *data = (GL_RenderData *)renderer->internal;
202 bool result = true;
203
204 if (!data->debug_enabled) {
205 return true;
206 }
207 if (data->GL_ARB_debug_output_supported) {
208 if (data->errors) {
209 int i;
210 for (i = 0; i < data->errors; ++i) {
211 SDL_SetError("%s: %s (%d): %s %s", prefix, file, line, function, data->error_messages[i]);
212 result = false;
213 }
214 GL_ClearErrors(renderer);
215 }
216 } else {
217 // check gl errors (can return multiple errors)
218 for (;;) {
219 GLenum error = data->glGetError();
220 if (error != GL_NO_ERROR) {
221 if (prefix == NULL || prefix[0] == '\0') {
222 prefix = "generic";
223 }
224 SDL_SetError("%s: %s (%d): %s %s (0x%X)", prefix, file, line, function, GL_TranslateError(error), error);
225 result = false;
226 } else {
227 break;
228 }
229 }
230 }
231 return result;
232}
233
234#if 0
235#define GL_CheckError(prefix, renderer)
236#else
237#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, SDL_FILE, SDL_LINE, SDL_FUNCTION)
238#endif
239
240static bool GL_LoadFunctions(GL_RenderData *data)
241{
242#ifdef __SDL_NOGETPROCADDR__
243#define SDL_PROC(ret, func, params) data->func = func;
244#else
245 bool result = true;
246#define SDL_PROC(ret, func, params) \
247 do { \
248 data->func = (ret (APIENTRY *) params)SDL_GL_GetProcAddress(#func); \
249 if (!data->func) { \
250 result = SDL_SetError("Couldn't load GL function %s: %s", #func, SDL_GetError()); \
251 } \
252 } while (0);
253#endif // __SDL_NOGETPROCADDR__
254
255#include "SDL_glfuncs.h"
256#undef SDL_PROC
257 return result;
258}
259
260static bool GL_ActivateRenderer(SDL_Renderer *renderer)
261{
262 GL_RenderData *data = (GL_RenderData *)renderer->internal;
263
264 if (SDL_GL_GetCurrentContext() != data->context) {
265 if (!SDL_GL_MakeCurrent(renderer->window, data->context)) {
266 return false;
267 }
268 }
269
270 GL_ClearErrors(renderer);
271
272 return true;
273}
274
275static void APIENTRY GL_HandleDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char *message, const void *userParam)
276{
277 SDL_Renderer *renderer = (SDL_Renderer *)userParam;
278 GL_RenderData *data = (GL_RenderData *)renderer->internal;
279
280 if (type == GL_DEBUG_TYPE_ERROR_ARB) {
281 // Record this error
282 int errors = data->errors + 1;
283 char **error_messages = (char **)SDL_realloc(data->error_messages, errors * sizeof(*data->error_messages));
284 if (error_messages) {
285 data->errors = errors;
286 data->error_messages = error_messages;
287 data->error_messages[data->errors - 1] = SDL_strdup(message);
288 }
289 }
290
291 // If there's another error callback, pass it along, otherwise log it
292 if (data->next_error_callback) {
293 data->next_error_callback(source, type, id, severity, length, message, data->next_error_userparam);
294 } else {
295 if (type == GL_DEBUG_TYPE_ERROR_ARB) {
296 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s", message);
297 } else {
298 SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, "%s", message);
299 }
300 }
301}
302
303static GL_FBOList *GL_GetFBO(GL_RenderData *data, Uint32 w, Uint32 h)
304{
305 GL_FBOList *result = data->framebuffers;
306
307 while (result && ((result->w != w) || (result->h != h))) {
308 result = result->next;
309 }
310
311 if (!result) {
312 result = (GL_FBOList *)SDL_malloc(sizeof(GL_FBOList));
313 if (result) {
314 result->w = w;
315 result->h = h;
316 data->glGenFramebuffersEXT(1, &result->FBO);
317 result->next = data->framebuffers;
318 data->framebuffers = result;
319 }
320 }
321 return result;
322}
323
324static void GL_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
325{
326 /* If the window x/y/w/h changed at all, assume the viewport has been
327 * changed behind our backs. x/y changes might seem weird but viewport
328 * resets have been observed on macOS at minimum!
329 */
330 if (event->type == SDL_EVENT_WINDOW_RESIZED ||
331 event->type == SDL_EVENT_WINDOW_MOVED) {
332 GL_RenderData *data = (GL_RenderData *)renderer->internal;
333 data->drawstate.viewport_dirty = true;
334 }
335}
336
337static GLenum GetBlendFunc(SDL_BlendFactor factor)
338{
339 switch (factor) {
340 case SDL_BLENDFACTOR_ZERO:
341 return GL_ZERO;
342 case SDL_BLENDFACTOR_ONE:
343 return GL_ONE;
344 case SDL_BLENDFACTOR_SRC_COLOR:
345 return GL_SRC_COLOR;
346 case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
347 return GL_ONE_MINUS_SRC_COLOR;
348 case SDL_BLENDFACTOR_SRC_ALPHA:
349 return GL_SRC_ALPHA;
350 case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
351 return GL_ONE_MINUS_SRC_ALPHA;
352 case SDL_BLENDFACTOR_DST_COLOR:
353 return GL_DST_COLOR;
354 case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
355 return GL_ONE_MINUS_DST_COLOR;
356 case SDL_BLENDFACTOR_DST_ALPHA:
357 return GL_DST_ALPHA;
358 case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
359 return GL_ONE_MINUS_DST_ALPHA;
360 default:
361 return GL_INVALID_ENUM;
362 }
363}
364
365static GLenum GetBlendEquation(SDL_BlendOperation operation)
366{
367 switch (operation) {
368 case SDL_BLENDOPERATION_ADD:
369 return GL_FUNC_ADD;
370 case SDL_BLENDOPERATION_SUBTRACT:
371 return GL_FUNC_SUBTRACT;
372 case SDL_BLENDOPERATION_REV_SUBTRACT:
373 return GL_FUNC_REVERSE_SUBTRACT;
374 case SDL_BLENDOPERATION_MINIMUM:
375 return GL_MIN;
376 case SDL_BLENDOPERATION_MAXIMUM:
377 return GL_MAX;
378 default:
379 return GL_INVALID_ENUM;
380 }
381}
382
383static bool GL_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
384{
385 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
386 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
387 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
388 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
389 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
390 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
391
392 if (GetBlendFunc(srcColorFactor) == GL_INVALID_ENUM ||
393 GetBlendFunc(srcAlphaFactor) == GL_INVALID_ENUM ||
394 GetBlendEquation(colorOperation) == GL_INVALID_ENUM ||
395 GetBlendFunc(dstColorFactor) == GL_INVALID_ENUM ||
396 GetBlendFunc(dstAlphaFactor) == GL_INVALID_ENUM ||
397 GetBlendEquation(alphaOperation) == GL_INVALID_ENUM) {
398 return false;
399 }
400 if (colorOperation != alphaOperation) {
401 return false;
402 }
403 return true;
404}
405
406static bool convert_format(Uint32 pixel_format, GLint *internalFormat, GLenum *format, GLenum *type)
407{
408 switch (pixel_format) {
409 case SDL_PIXELFORMAT_ARGB8888:
410 case SDL_PIXELFORMAT_XRGB8888:
411 *internalFormat = GL_RGBA8;
412 *format = GL_BGRA;
413 *type = GL_UNSIGNED_BYTE; // previously GL_UNSIGNED_INT_8_8_8_8_REV, seeing if this is better in modern times.
414 break;
415 case SDL_PIXELFORMAT_ABGR8888:
416 case SDL_PIXELFORMAT_XBGR8888:
417 *internalFormat = GL_RGBA8;
418 *format = GL_RGBA;
419 *type = GL_UNSIGNED_BYTE; // previously GL_UNSIGNED_INT_8_8_8_8_REV, seeing if this is better in modern times.
420 break;
421 case SDL_PIXELFORMAT_YV12:
422 case SDL_PIXELFORMAT_IYUV:
423 case SDL_PIXELFORMAT_NV12:
424 case SDL_PIXELFORMAT_NV21:
425 *internalFormat = GL_LUMINANCE;
426 *format = GL_LUMINANCE;
427 *type = GL_UNSIGNED_BYTE;
428 break;
429#ifdef SDL_PLATFORM_MACOS
430 case SDL_PIXELFORMAT_UYVY:
431 *internalFormat = GL_RGB8;
432 *format = GL_YCBCR_422_APPLE;
433 *type = GL_UNSIGNED_SHORT_8_8_APPLE;
434 break;
435#endif
436 default:
437 return false;
438 }
439 return true;
440}
441
442static bool GL_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
443{
444 GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
445 const GLenum textype = renderdata->textype;
446 GL_TextureData *data;
447 GLint internalFormat;
448 GLenum format, type;
449 int texture_w, texture_h;
450 GLenum scaleMode;
451
452 GL_ActivateRenderer(renderer);
453
454 renderdata->drawstate.texture = NULL; // we trash this state.
455 renderdata->drawstate.texturing_dirty = true; // we trash this state.
456
457 if (texture->access == SDL_TEXTUREACCESS_TARGET &&
458 !renderdata->GL_EXT_framebuffer_object_supported) {
459 return SDL_SetError("Render targets not supported by OpenGL");
460 }
461
462 if (!convert_format(texture->format, &internalFormat, &format, &type)) {
463 return SDL_SetError("Texture format %s not supported by OpenGL",
464 SDL_GetPixelFormatName(texture->format));
465 }
466
467 data = (GL_TextureData *)SDL_calloc(1, sizeof(*data));
468 if (!data) {
469 return false;
470 }
471
472 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
473 size_t size;
474 data->pitch = texture->w * SDL_BYTESPERPIXEL(texture->format);
475 size = (size_t)texture->h * data->pitch;
476 if (texture->format == SDL_PIXELFORMAT_YV12 ||
477 texture->format == SDL_PIXELFORMAT_IYUV) {
478 // Need to add size for the U and V planes
479 size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
480 }
481 if (texture->format == SDL_PIXELFORMAT_NV12 ||
482 texture->format == SDL_PIXELFORMAT_NV21) {
483 // Need to add size for the U/V plane
484 size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
485 }
486 data->pixels = SDL_calloc(1, size);
487 if (!data->pixels) {
488 SDL_free(data);
489 return false;
490 }
491 }
492
493 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
494 data->fbo = GL_GetFBO(renderdata, texture->w, texture->h);
495 } else {
496 data->fbo = NULL;
497 }
498
499 data->texture = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER, 0);
500 if (data->texture) {
501 data->texture_external = true;
502 } else {
503 GL_CheckError("", renderer);
504 renderdata->glGenTextures(1, &data->texture);
505 if (!GL_CheckError("glGenTextures()", renderer)) {
506 if (data->pixels) {
507 SDL_free(data->pixels);
508 }
509 SDL_free(data);
510 return false;
511 }
512 }
513 texture->internal = data;
514
515 if (renderdata->GL_ARB_texture_non_power_of_two_supported) {
516 texture_w = texture->w;
517 texture_h = texture->h;
518 data->texw = 1.0f;
519 data->texh = 1.0f;
520 } else if (renderdata->GL_ARB_texture_rectangle_supported) {
521 texture_w = texture->w;
522 texture_h = texture->h;
523 data->texw = (GLfloat)texture_w;
524 data->texh = (GLfloat)texture_h;
525 } else {
526 texture_w = SDL_powerof2(texture->w);
527 texture_h = SDL_powerof2(texture->h);
528 data->texw = (GLfloat)(texture->w) / texture_w;
529 data->texh = (GLfloat)texture->h / texture_h;
530 }
531 SDL_PropertiesID props = SDL_GetTextureProperties(texture);
532 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER, data->texture);
533 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER, (Sint64) textype);
534 SDL_SetFloatProperty(props, SDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT, data->texw);
535 SDL_SetFloatProperty(props, SDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT, data->texh);
536
537 data->format = format;
538 data->formattype = type;
539 scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? GL_NEAREST : GL_LINEAR;
540 renderdata->glEnable(textype);
541 renderdata->glBindTexture(textype, data->texture);
542 renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, scaleMode);
543 renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, scaleMode);
544#ifdef SDL_PLATFORM_MACOS
545#ifndef GL_TEXTURE_STORAGE_HINT_APPLE
546#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
547#endif
548#ifndef STORAGE_CACHED_APPLE
549#define STORAGE_CACHED_APPLE 0x85BE
550#endif
551#ifndef STORAGE_SHARED_APPLE
552#define STORAGE_SHARED_APPLE 0x85BF
553#endif
554 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
555 renderdata->glTexParameteri(textype, GL_TEXTURE_STORAGE_HINT_APPLE,
556 GL_STORAGE_SHARED_APPLE);
557 } else {
558 renderdata->glTexParameteri(textype, GL_TEXTURE_STORAGE_HINT_APPLE,
559 GL_STORAGE_CACHED_APPLE);
560 }
561 if (texture->access == SDL_TEXTUREACCESS_STREAMING && texture->format == SDL_PIXELFORMAT_ARGB8888 && (texture->w % 8) == 0) {
562 renderdata->glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
563 renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
564 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH,
565 (data->pitch / SDL_BYTESPERPIXEL(texture->format)));
566 renderdata->glTexImage2D(textype, 0, internalFormat, texture_w,
567 texture_h, 0, format, type, data->pixels);
568 renderdata->glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);
569 } else
570#endif
571 {
572 renderdata->glTexImage2D(textype, 0, internalFormat, texture_w,
573 texture_h, 0, format, type, NULL);
574 }
575 renderdata->glDisable(textype);
576 if (!GL_CheckError("glTexImage2D()", renderer)) {
577 return false;
578 }
579
580#ifdef SDL_HAVE_YUV
581 if (texture->format == SDL_PIXELFORMAT_YV12 ||
582 texture->format == SDL_PIXELFORMAT_IYUV) {
583 data->yuv = true;
584
585 data->utexture = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER, 0);
586 if (data->utexture) {
587 data->utexture_external = true;
588 } else {
589 renderdata->glGenTextures(1, &data->utexture);
590 }
591 data->vtexture = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER, 0);
592 if (data->vtexture) {
593 data->vtexture_external = true;
594 } else {
595 renderdata->glGenTextures(1, &data->vtexture);
596 }
597
598 renderdata->glBindTexture(textype, data->utexture);
599 renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER,
600 scaleMode);
601 renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER,
602 scaleMode);
603 renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
604 (texture_h + 1) / 2, 0, format, type, NULL);
605 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER, data->utexture);
606
607 renderdata->glBindTexture(textype, data->vtexture);
608 renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER,
609 scaleMode);
610 renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER,
611 scaleMode);
612 renderdata->glTexImage2D(textype, 0, internalFormat, (texture_w + 1) / 2,
613 (texture_h + 1) / 2, 0, format, type, NULL);
614 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER, data->vtexture);
615 }
616
617 if (texture->format == SDL_PIXELFORMAT_NV12 ||
618 texture->format == SDL_PIXELFORMAT_NV21) {
619 data->nv12 = true;
620
621 data->utexture = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER, 0);
622 if (data->utexture) {
623 data->utexture_external = true;
624 } else {
625 renderdata->glGenTextures(1, &data->utexture);
626 }
627 renderdata->glBindTexture(textype, data->utexture);
628 renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER,
629 scaleMode);
630 renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER,
631 scaleMode);
632 renderdata->glTexImage2D(textype, 0, GL_LUMINANCE_ALPHA, (texture_w + 1) / 2,
633 (texture_h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
634 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER, data->utexture);
635 }
636#endif
637
638 if (texture->format == SDL_PIXELFORMAT_ABGR8888 || texture->format == SDL_PIXELFORMAT_ARGB8888) {
639 data->shader = SHADER_RGBA;
640 } else {
641 data->shader = SHADER_RGB;
642 }
643
644#ifdef SDL_HAVE_YUV
645 if (data->yuv || data->nv12) {
646 if (data->yuv) {
647 data->shader = SHADER_YUV;
648 } else if (texture->format == SDL_PIXELFORMAT_NV12) {
649 if (SDL_GetHintBoolean("SDL_RENDER_OPENGL_NV12_RG_SHADER", false)) {
650 data->shader = SHADER_NV12_RG;
651 } else {
652 data->shader = SHADER_NV12_RA;
653 }
654 } else {
655 if (SDL_GetHintBoolean("SDL_RENDER_OPENGL_NV12_RG_SHADER", false)) {
656 data->shader = SHADER_NV21_RG;
657 } else {
658 data->shader = SHADER_NV21_RA;
659 }
660 }
661 data->shader_params = SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8);
662 if (!data->shader_params) {
663 return SDL_SetError("Unsupported YUV colorspace");
664 }
665 }
666#endif // SDL_HAVE_YUV
667
668 return GL_CheckError("", renderer);
669}
670
671static bool GL_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
672 const SDL_Rect *rect, const void *pixels, int pitch)
673{
674 GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
675 const GLenum textype = renderdata->textype;
676 GL_TextureData *data = (GL_TextureData *)texture->internal;
677 const int texturebpp = SDL_BYTESPERPIXEL(texture->format);
678
679 SDL_assert_release(texturebpp != 0); // otherwise, division by zero later.
680
681 GL_ActivateRenderer(renderer);
682
683 renderdata->drawstate.texture = NULL; // we trash this state.
684
685 renderdata->glBindTexture(textype, data->texture);
686 renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
687 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / texturebpp));
688 renderdata->glTexSubImage2D(textype, 0, rect->x, rect->y, rect->w,
689 rect->h, data->format, data->formattype,
690 pixels);
691#ifdef SDL_HAVE_YUV
692 if (data->yuv) {
693 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, ((pitch + 1) / 2));
694
695 // Skip to the correct offset into the next texture
696 pixels = (const void *)((const Uint8 *)pixels + rect->h * pitch);
697 if (texture->format == SDL_PIXELFORMAT_YV12) {
698 renderdata->glBindTexture(textype, data->vtexture);
699 } else {
700 renderdata->glBindTexture(textype, data->utexture);
701 }
702 renderdata->glTexSubImage2D(textype, 0, rect->x / 2, rect->y / 2,
703 (rect->w + 1) / 2, (rect->h + 1) / 2,
704 data->format, data->formattype, pixels);
705
706 // Skip to the correct offset into the next texture
707 pixels = (const void *)((const Uint8 *)pixels + ((rect->h + 1) / 2) * ((pitch + 1) / 2));
708 if (texture->format == SDL_PIXELFORMAT_YV12) {
709 renderdata->glBindTexture(textype, data->utexture);
710 } else {
711 renderdata->glBindTexture(textype, data->vtexture);
712 }
713 renderdata->glTexSubImage2D(textype, 0, rect->x / 2, rect->y / 2,
714 (rect->w + 1) / 2, (rect->h + 1) / 2,
715 data->format, data->formattype, pixels);
716 }
717
718 if (data->nv12) {
719 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, ((pitch + 1) / 2));
720
721 // Skip to the correct offset into the next texture
722 pixels = (const void *)((const Uint8 *)pixels + rect->h * pitch);
723 renderdata->glBindTexture(textype, data->utexture);
724 renderdata->glTexSubImage2D(textype, 0, rect->x / 2, rect->y / 2,
725 (rect->w + 1) / 2, (rect->h + 1) / 2,
726 GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, pixels);
727 }
728#endif
729 return GL_CheckError("glTexSubImage2D()", renderer);
730}
731
732#ifdef SDL_HAVE_YUV
733static bool GL_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
734 const SDL_Rect *rect,
735 const Uint8 *Yplane, int Ypitch,
736 const Uint8 *Uplane, int Upitch,
737 const Uint8 *Vplane, int Vpitch)
738{
739 GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
740 const GLenum textype = renderdata->textype;
741 GL_TextureData *data = (GL_TextureData *)texture->internal;
742
743 GL_ActivateRenderer(renderer);
744
745 renderdata->drawstate.texture = NULL; // we trash this state.
746
747 renderdata->glBindTexture(textype, data->texture);
748 renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
749 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Ypitch);
750 renderdata->glTexSubImage2D(textype, 0, rect->x, rect->y, rect->w,
751 rect->h, data->format, data->formattype,
752 Yplane);
753
754 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Upitch);
755 renderdata->glBindTexture(textype, data->utexture);
756 renderdata->glTexSubImage2D(textype, 0, rect->x / 2, rect->y / 2,
757 (rect->w + 1) / 2, (rect->h + 1) / 2,
758 data->format, data->formattype, Uplane);
759
760 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Vpitch);
761 renderdata->glBindTexture(textype, data->vtexture);
762 renderdata->glTexSubImage2D(textype, 0, rect->x / 2, rect->y / 2,
763 (rect->w + 1) / 2, (rect->h + 1) / 2,
764 data->format, data->formattype, Vplane);
765
766 return GL_CheckError("glTexSubImage2D()", renderer);
767}
768
769static bool GL_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
770 const SDL_Rect *rect,
771 const Uint8 *Yplane, int Ypitch,
772 const Uint8 *UVplane, int UVpitch)
773{
774 GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
775 const GLenum textype = renderdata->textype;
776 GL_TextureData *data = (GL_TextureData *)texture->internal;
777
778 GL_ActivateRenderer(renderer);
779
780 renderdata->drawstate.texture = NULL; // we trash this state.
781
782 renderdata->glBindTexture(textype, data->texture);
783 renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
784 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, Ypitch);
785 renderdata->glTexSubImage2D(textype, 0, rect->x, rect->y, rect->w,
786 rect->h, data->format, data->formattype,
787 Yplane);
788
789 renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, UVpitch / 2);
790 renderdata->glBindTexture(textype, data->utexture);
791 renderdata->glTexSubImage2D(textype, 0, rect->x / 2, rect->y / 2,
792 (rect->w + 1) / 2, (rect->h + 1) / 2,
793 GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, UVplane);
794
795 return GL_CheckError("glTexSubImage2D()", renderer);
796}
797#endif
798
799static bool GL_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
800 const SDL_Rect *rect, void **pixels, int *pitch)
801{
802 GL_TextureData *data = (GL_TextureData *)texture->internal;
803
804 data->locked_rect = *rect;
805 *pixels =
806 (void *)((Uint8 *)data->pixels + rect->y * data->pitch +
807 rect->x * SDL_BYTESPERPIXEL(texture->format));
808 *pitch = data->pitch;
809 return true;
810}
811
812static void GL_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
813{
814 GL_TextureData *data = (GL_TextureData *)texture->internal;
815 const SDL_Rect *rect;
816 void *pixels;
817
818 rect = &data->locked_rect;
819 pixels =
820 (void *)((Uint8 *)data->pixels + rect->y * data->pitch +
821 rect->x * SDL_BYTESPERPIXEL(texture->format));
822 GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
823}
824
825static void GL_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
826{
827 GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
828 const GLenum textype = renderdata->textype;
829 GL_TextureData *data = (GL_TextureData *)texture->internal;
830 GLenum glScaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? GL_NEAREST : GL_LINEAR;
831
832 renderdata->glBindTexture(textype, data->texture);
833 renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, glScaleMode);
834 renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, glScaleMode);
835
836#ifdef SDL_HAVE_YUV
837 if (texture->format == SDL_PIXELFORMAT_YV12 ||
838 texture->format == SDL_PIXELFORMAT_IYUV) {
839 renderdata->glBindTexture(textype, data->utexture);
840 renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, glScaleMode);
841 renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, glScaleMode);
842
843 renderdata->glBindTexture(textype, data->vtexture);
844 renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, glScaleMode);
845 renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, glScaleMode);
846 }
847
848 if (texture->format == SDL_PIXELFORMAT_NV12 ||
849 texture->format == SDL_PIXELFORMAT_NV21) {
850 renderdata->glBindTexture(textype, data->utexture);
851 renderdata->glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, glScaleMode);
852 renderdata->glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, glScaleMode);
853 }
854#endif
855}
856
857static bool GL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
858{
859 GL_RenderData *data = (GL_RenderData *)renderer->internal;
860 GL_TextureData *texturedata;
861 GLenum status;
862
863 GL_ActivateRenderer(renderer);
864
865 if (!data->GL_EXT_framebuffer_object_supported) {
866 return SDL_SetError("Render targets not supported by OpenGL");
867 }
868
869 data->drawstate.viewport_dirty = true;
870
871 if (!texture) {
872 data->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
873 return true;
874 }
875
876 texturedata = (GL_TextureData *)texture->internal;
877 data->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, texturedata->fbo->FBO);
878 // TODO: check if texture pixel format allows this operation
879 data->glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, data->textype, texturedata->texture, 0);
880 // Check FBO status
881 status = data->glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
882 if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
883 return SDL_SetError("glFramebufferTexture2DEXT() failed");
884 }
885 return true;
886}
887
888/* !!! FIXME: all these Queue* calls set up the vertex buffer the way the immediate mode
889 !!! FIXME: renderer wants it, but this might want to operate differently if we move to
890 !!! FIXME: VBOs at some point. */
891static bool GL_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
892{
893 return true; // nothing to do in this backend.
894}
895
896static bool GL_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
897{
898 GLfloat *verts = (GLfloat *)SDL_AllocateRenderVertices(renderer, count * 2 * sizeof(GLfloat), 0, &cmd->data.draw.first);
899 int i;
900
901 if (!verts) {
902 return false;
903 }
904
905 cmd->data.draw.count = count;
906 for (i = 0; i < count; i++) {
907 *(verts++) = 0.5f + points[i].x;
908 *(verts++) = 0.5f + points[i].y;
909 }
910
911 return true;
912}
913
914static bool GL_QueueDrawLines(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
915{
916 int i;
917 GLfloat prevx, prevy;
918 const size_t vertlen = (sizeof(GLfloat) * 2) * count;
919 GLfloat *verts = (GLfloat *)SDL_AllocateRenderVertices(renderer, vertlen, 0, &cmd->data.draw.first);
920
921 if (!verts) {
922 return false;
923 }
924 cmd->data.draw.count = count;
925
926 // 0.5f offset to hit the center of the pixel.
927 prevx = 0.5f + points->x;
928 prevy = 0.5f + points->y;
929 *(verts++) = prevx;
930 *(verts++) = prevy;
931
932 /* bump the end of each line segment out a quarter of a pixel, to provoke
933 the diamond-exit rule. Without this, you won't just drop the last
934 pixel of the last line segment, but you might also drop pixels at the
935 edge of any given line segment along the way too. */
936 for (i = 1; i < count; i++) {
937 const GLfloat xstart = prevx;
938 const GLfloat ystart = prevy;
939 const GLfloat xend = points[i].x + 0.5f; // 0.5f to hit pixel center.
940 const GLfloat yend = points[i].y + 0.5f;
941 // bump a little in the direction we are moving in.
942 const GLfloat deltax = xend - xstart;
943 const GLfloat deltay = yend - ystart;
944 const GLfloat angle = SDL_atan2f(deltay, deltax);
945 prevx = xend + (SDL_cosf(angle) * 0.25f);
946 prevy = yend + (SDL_sinf(angle) * 0.25f);
947 *(verts++) = prevx;
948 *(verts++) = prevy;
949 }
950
951 return true;
952}
953
954static bool GL_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
955 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
956 int num_vertices, const void *indices, int num_indices, int size_indices,
957 float scale_x, float scale_y)
958{
959 GL_TextureData *texturedata = NULL;
960 int i;
961 int count = indices ? num_indices : num_vertices;
962 GLfloat *verts;
963 size_t sz = 2 * sizeof(GLfloat) + 4 * sizeof(GLfloat) + (texture ? 2 : 0) * sizeof(GLfloat);
964 const float color_scale = cmd->data.draw.color_scale;
965
966 verts = (GLfloat *)SDL_AllocateRenderVertices(renderer, count * sz, 0, &cmd->data.draw.first);
967 if (!verts) {
968 return false;
969 }
970
971 if (texture) {
972 texturedata = (GL_TextureData *)texture->internal;
973 }
974
975 cmd->data.draw.count = count;
976 size_indices = indices ? size_indices : 0;
977
978 for (i = 0; i < count; i++) {
979 int j;
980 float *xy_;
981 SDL_FColor *col_;
982 if (size_indices == 4) {
983 j = ((const Uint32 *)indices)[i];
984 } else if (size_indices == 2) {
985 j = ((const Uint16 *)indices)[i];
986 } else if (size_indices == 1) {
987 j = ((const Uint8 *)indices)[i];
988 } else {
989 j = i;
990 }
991
992 xy_ = (float *)((char *)xy + j * xy_stride);
993
994 *(verts++) = xy_[0] * scale_x;
995 *(verts++) = xy_[1] * scale_y;
996
997 col_ = (SDL_FColor *)((char *)color + j * color_stride);
998 *(verts++) = col_->r * color_scale;
999 *(verts++) = col_->g * color_scale;
1000 *(verts++) = col_->b * color_scale;
1001 *(verts++) = col_->a;
1002
1003 if (texture) {
1004 float *uv_ = (float *)((char *)uv + j * uv_stride);
1005 *(verts++) = uv_[0] * texturedata->texw;
1006 *(verts++) = uv_[1] * texturedata->texh;
1007 }
1008 }
1009 return true;
1010}
1011
1012static bool SetDrawState(GL_RenderData *data, const SDL_RenderCommand *cmd, const GL_Shader shader, const float *shader_params)
1013{
1014 const SDL_BlendMode blend = cmd->data.draw.blend;
1015 bool vertex_array;
1016 bool color_array;
1017 bool texture_array;
1018
1019 if (data->drawstate.viewport_dirty) {
1020 const bool istarget = data->drawstate.target != NULL;
1021 const SDL_Rect *viewport = &data->drawstate.viewport;
1022 data->glMatrixMode(GL_PROJECTION);
1023 data->glLoadIdentity();
1024 data->glViewport(viewport->x,
1025 istarget ? viewport->y : (data->drawstate.drawableh - viewport->y - viewport->h),
1026 viewport->w, viewport->h);
1027 if (viewport->w && viewport->h) {
1028 data->glOrtho((GLdouble)0, (GLdouble)viewport->w,
1029 (GLdouble)(istarget ? 0 : viewport->h),
1030 (GLdouble)(istarget ? viewport->h : 0),
1031 0.0, 1.0);
1032 }
1033 data->glMatrixMode(GL_MODELVIEW);
1034 data->drawstate.viewport_dirty = false;
1035 }
1036
1037 if (data->drawstate.cliprect_enabled_dirty) {
1038 if (!data->drawstate.cliprect_enabled) {
1039 data->glDisable(GL_SCISSOR_TEST);
1040 } else {
1041 data->glEnable(GL_SCISSOR_TEST);
1042 }
1043 data->drawstate.cliprect_enabled_dirty = false;
1044 }
1045
1046 if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) {
1047 const SDL_Rect *viewport = &data->drawstate.viewport;
1048 const SDL_Rect *rect = &data->drawstate.cliprect;
1049 data->glScissor(viewport->x + rect->x,
1050 data->drawstate.target ? viewport->y + rect->y : data->drawstate.drawableh - viewport->y - rect->y - rect->h,
1051 rect->w, rect->h);
1052 data->drawstate.cliprect_dirty = false;
1053 }
1054
1055 if (blend != data->drawstate.blend) {
1056 if (blend == SDL_BLENDMODE_NONE) {
1057 data->glDisable(GL_BLEND);
1058 } else {
1059 data->glEnable(GL_BLEND);
1060 data->glBlendFuncSeparate(GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blend)),
1061 GetBlendFunc(SDL_GetBlendModeDstColorFactor(blend)),
1062 GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blend)),
1063 GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blend)));
1064 data->glBlendEquation(GetBlendEquation(SDL_GetBlendModeColorOperation(blend)));
1065 }
1066 data->drawstate.blend = blend;
1067 }
1068
1069 if (data->shaders &&
1070 (shader != data->drawstate.shader || shader_params != data->drawstate.shader_params)) {
1071 GL_SelectShader(data->shaders, shader, shader_params);
1072 data->drawstate.shader = shader;
1073 data->drawstate.shader_params = shader_params;
1074 }
1075
1076 if (data->drawstate.texturing_dirty || ((cmd->data.draw.texture != NULL) != data->drawstate.texturing)) {
1077 if (!cmd->data.draw.texture) {
1078 data->glDisable(data->textype);
1079 data->drawstate.texturing = false;
1080 } else {
1081 data->glEnable(data->textype);
1082 data->drawstate.texturing = true;
1083 }
1084 data->drawstate.texturing_dirty = false;
1085 }
1086
1087 vertex_array = cmd->command == SDL_RENDERCMD_DRAW_POINTS || cmd->command == SDL_RENDERCMD_DRAW_LINES || cmd->command == SDL_RENDERCMD_GEOMETRY;
1088 color_array = cmd->command == SDL_RENDERCMD_GEOMETRY;
1089 texture_array = cmd->data.draw.texture != NULL;
1090
1091 if (vertex_array != data->drawstate.vertex_array) {
1092 if (vertex_array) {
1093 data->glEnableClientState(GL_VERTEX_ARRAY);
1094 } else {
1095 data->glDisableClientState(GL_VERTEX_ARRAY);
1096 }
1097 data->drawstate.vertex_array = vertex_array;
1098 }
1099
1100 if (color_array != data->drawstate.color_array) {
1101 if (color_array) {
1102 data->glEnableClientState(GL_COLOR_ARRAY);
1103 } else {
1104 data->glDisableClientState(GL_COLOR_ARRAY);
1105 }
1106 data->drawstate.color_array = color_array;
1107 }
1108
1109 /* This is a little awkward but should avoid texcoord arrays getting into
1110 a bad state if the application is manually binding textures */
1111 if (texture_array != data->drawstate.texture_array) {
1112 if (texture_array) {
1113 data->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1114 } else {
1115 data->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1116 }
1117 data->drawstate.texture_array = texture_array;
1118 }
1119
1120 return true;
1121}
1122
1123static bool SetTextureAddressMode(GL_RenderData *data, GLenum textype, SDL_TextureAddressMode addressMode)
1124{
1125 switch (addressMode) {
1126 case SDL_TEXTURE_ADDRESS_CLAMP:
1127 data->glTexParameteri(textype, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1128 data->glTexParameteri(textype, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1129 break;
1130 case SDL_TEXTURE_ADDRESS_WRAP:
1131 data->glTexParameteri(textype, GL_TEXTURE_WRAP_S, GL_REPEAT);
1132 data->glTexParameteri(textype, GL_TEXTURE_WRAP_T, GL_REPEAT);
1133 break;
1134 default:
1135 return SDL_SetError("Unknown texture address mode: %d", addressMode);
1136 }
1137 return true;
1138}
1139
1140static bool SetCopyState(GL_RenderData *data, const SDL_RenderCommand *cmd)
1141{
1142 SDL_Texture *texture = cmd->data.draw.texture;
1143 const GL_TextureData *texturedata = (GL_TextureData *)texture->internal;
1144
1145 SetDrawState(data, cmd, texturedata->shader, texturedata->shader_params);
1146
1147 if (texture != data->drawstate.texture) {
1148 const GLenum textype = data->textype;
1149#ifdef SDL_HAVE_YUV
1150 if (texturedata->yuv) {
1151 if (data->GL_ARB_multitexture_supported) {
1152 data->glActiveTextureARB(GL_TEXTURE2_ARB);
1153 }
1154 data->glBindTexture(textype, texturedata->vtexture);
1155
1156 if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
1157 return false;
1158 }
1159
1160 if (data->GL_ARB_multitexture_supported) {
1161 data->glActiveTextureARB(GL_TEXTURE1_ARB);
1162 }
1163 data->glBindTexture(textype, texturedata->utexture);
1164
1165 if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
1166 return false;
1167 }
1168 }
1169 if (texturedata->nv12) {
1170 if (data->GL_ARB_multitexture_supported) {
1171 data->glActiveTextureARB(GL_TEXTURE1_ARB);
1172 }
1173 data->glBindTexture(textype, texturedata->utexture);
1174
1175 if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
1176 return false;
1177 }
1178 }
1179#endif
1180 if (data->GL_ARB_multitexture_supported) {
1181 data->glActiveTextureARB(GL_TEXTURE0_ARB);
1182 }
1183 data->glBindTexture(textype, texturedata->texture);
1184
1185 if (!SetTextureAddressMode(data, textype, cmd->data.draw.texture_address_mode)) {
1186 return false;
1187 }
1188
1189 data->drawstate.texture = texture;
1190 }
1191
1192 return true;
1193}
1194
1195static void GL_InvalidateCachedState(SDL_Renderer *renderer)
1196{
1197 GL_DrawStateCache *cache = &((GL_RenderData *)renderer->internal)->drawstate;
1198 cache->viewport_dirty = true;
1199 cache->texture = NULL;
1200 cache->drawablew = 0;
1201 cache->drawableh = 0;
1202 cache->blend = SDL_BLENDMODE_INVALID;
1203 cache->shader = SHADER_INVALID;
1204 cache->cliprect_enabled_dirty = true;
1205 cache->cliprect_dirty = true;
1206 cache->texturing_dirty = true;
1207 cache->vertex_array = false; // !!! FIXME: this resets to false at the end of GL_RunCommandQueue, but we could cache this more aggressively.
1208 cache->color_array = false; // !!! FIXME: this resets to false at the end of GL_RunCommandQueue, but we could cache this more aggressively.
1209 cache->texture_array = false; // !!! FIXME: this resets to false at the end of GL_RunCommandQueue, but we could cache this more aggressively.
1210 cache->color_dirty = true;
1211 cache->clear_color_dirty = true;
1212}
1213
1214static bool GL_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
1215{
1216 // !!! FIXME: it'd be nice to use a vertex buffer instead of immediate mode...
1217 GL_RenderData *data = (GL_RenderData *)renderer->internal;
1218
1219 if (!GL_ActivateRenderer(renderer)) {
1220 return false;
1221 }
1222
1223 data->drawstate.target = renderer->target;
1224 if (!data->drawstate.target) {
1225 int w, h;
1226 SDL_GetWindowSizeInPixels(renderer->window, &w, &h);
1227 if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
1228 data->drawstate.viewport_dirty = true; // if the window dimensions changed, invalidate the current viewport, etc.
1229 data->drawstate.cliprect_dirty = true;
1230 data->drawstate.drawablew = w;
1231 data->drawstate.drawableh = h;
1232 }
1233 }
1234
1235#ifdef SDL_PLATFORM_MACOS
1236 // On macOS on older systems, the OpenGL view change and resize events aren't
1237 // necessarily synchronized, so just always reset it.
1238 // Workaround for: https://discourse.libsdl.org/t/sdl-2-0-22-prerelease/35306/6
1239 data->drawstate.viewport_dirty = true;
1240#endif
1241
1242 while (cmd) {
1243 switch (cmd->command) {
1244 case SDL_RENDERCMD_SETDRAWCOLOR:
1245 {
1246 const float r = cmd->data.color.color.r * cmd->data.color.color_scale;
1247 const float g = cmd->data.color.color.g * cmd->data.color.color_scale;
1248 const float b = cmd->data.color.color.b * cmd->data.color.color_scale;
1249 const float a = cmd->data.color.color.a;
1250 if (data->drawstate.color_dirty ||
1251 (r != data->drawstate.color.r) ||
1252 (g != data->drawstate.color.g) ||
1253 (b != data->drawstate.color.b) ||
1254 (a != data->drawstate.color.a)) {
1255 data->glColor4f(r, g, b, a);
1256 data->drawstate.color.r = r;
1257 data->drawstate.color.g = g;
1258 data->drawstate.color.b = b;
1259 data->drawstate.color.a = a;
1260 data->drawstate.color_dirty = false;
1261 }
1262 break;
1263 }
1264
1265 case SDL_RENDERCMD_SETVIEWPORT:
1266 {
1267 SDL_Rect *viewport = &data->drawstate.viewport;
1268 if (SDL_memcmp(viewport, &cmd->data.viewport.rect, sizeof(cmd->data.viewport.rect)) != 0) {
1269 SDL_copyp(viewport, &cmd->data.viewport.rect);
1270 data->drawstate.viewport_dirty = true;
1271 data->drawstate.cliprect_dirty = true;
1272 }
1273 break;
1274 }
1275
1276 case SDL_RENDERCMD_SETCLIPRECT:
1277 {
1278 const SDL_Rect *rect = &cmd->data.cliprect.rect;
1279 if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
1280 data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
1281 data->drawstate.cliprect_enabled_dirty = true;
1282 }
1283
1284 if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) {
1285 SDL_copyp(&data->drawstate.cliprect, rect);
1286 data->drawstate.cliprect_dirty = true;
1287 }
1288 break;
1289 }
1290
1291 case SDL_RENDERCMD_CLEAR:
1292 {
1293 const float r = cmd->data.color.color.r * cmd->data.color.color_scale;
1294 const float g = cmd->data.color.color.g * cmd->data.color.color_scale;
1295 const float b = cmd->data.color.color.b * cmd->data.color.color_scale;
1296 const float a = cmd->data.color.color.a;
1297 if (data->drawstate.clear_color_dirty ||
1298 (r != data->drawstate.clear_color.r) ||
1299 (g != data->drawstate.clear_color.g) ||
1300 (b != data->drawstate.clear_color.b) ||
1301 (a != data->drawstate.clear_color.a)) {
1302 data->glClearColor(r, g, b, a);
1303 data->drawstate.clear_color.r = r;
1304 data->drawstate.clear_color.g = g;
1305 data->drawstate.clear_color.b = b;
1306 data->drawstate.clear_color.a = a;
1307 data->drawstate.clear_color_dirty = false;
1308 }
1309
1310 if (data->drawstate.cliprect_enabled || data->drawstate.cliprect_enabled_dirty) {
1311 data->glDisable(GL_SCISSOR_TEST);
1312 data->drawstate.cliprect_enabled_dirty = data->drawstate.cliprect_enabled;
1313 }
1314
1315 data->glClear(GL_COLOR_BUFFER_BIT);
1316 break;
1317 }
1318
1319 case SDL_RENDERCMD_FILL_RECTS: // unused
1320 break;
1321
1322 case SDL_RENDERCMD_COPY: // unused
1323 break;
1324
1325 case SDL_RENDERCMD_COPY_EX: // unused
1326 break;
1327
1328 case SDL_RENDERCMD_DRAW_LINES:
1329 {
1330 if (SetDrawState(data, cmd, SHADER_SOLID, NULL)) {
1331 size_t count = cmd->data.draw.count;
1332 const GLfloat *verts = (GLfloat *)(((Uint8 *)vertices) + cmd->data.draw.first);
1333
1334 // SetDrawState handles glEnableClientState.
1335 data->glVertexPointer(2, GL_FLOAT, sizeof(float) * 2, verts);
1336
1337 if (count > 2) {
1338 // joined lines cannot be grouped
1339 data->glDrawArrays(GL_LINE_STRIP, 0, (GLsizei)count);
1340 } else {
1341 // let's group non joined lines
1342 SDL_RenderCommand *finalcmd = cmd;
1343 SDL_RenderCommand *nextcmd = cmd->next;
1344 SDL_BlendMode thisblend = cmd->data.draw.blend;
1345
1346 while (nextcmd) {
1347 const SDL_RenderCommandType nextcmdtype = nextcmd->command;
1348 if (nextcmdtype != SDL_RENDERCMD_DRAW_LINES) {
1349 break; // can't go any further on this draw call, different render command up next.
1350 } else if (nextcmd->data.draw.count != 2) {
1351 break; // can't go any further on this draw call, those are joined lines
1352 } else if (nextcmd->data.draw.blend != thisblend) {
1353 break; // can't go any further on this draw call, different blendmode copy up next.
1354 } else {
1355 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
1356 count += nextcmd->data.draw.count;
1357 }
1358 nextcmd = nextcmd->next;
1359 }
1360
1361 data->glDrawArrays(GL_LINES, 0, (GLsizei)count);
1362 cmd = finalcmd; // skip any copy commands we just combined in here.
1363 }
1364 }
1365 break;
1366 }
1367
1368 case SDL_RENDERCMD_DRAW_POINTS:
1369 case SDL_RENDERCMD_GEOMETRY:
1370 {
1371 /* as long as we have the same copy command in a row, with the
1372 same texture, we can combine them all into a single draw call. */
1373 SDL_Texture *thistexture = cmd->data.draw.texture;
1374 SDL_BlendMode thisblend = cmd->data.draw.blend;
1375 const SDL_RenderCommandType thiscmdtype = cmd->command;
1376 SDL_RenderCommand *finalcmd = cmd;
1377 SDL_RenderCommand *nextcmd = cmd->next;
1378 size_t count = cmd->data.draw.count;
1379 int ret;
1380 while (nextcmd) {
1381 const SDL_RenderCommandType nextcmdtype = nextcmd->command;
1382 if (nextcmdtype != thiscmdtype) {
1383 break; // can't go any further on this draw call, different render command up next.
1384 } else if (nextcmd->data.draw.texture != thistexture || nextcmd->data.draw.blend != thisblend) {
1385 break; // can't go any further on this draw call, different texture/blendmode copy up next.
1386 } else {
1387 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
1388 count += nextcmd->data.draw.count;
1389 }
1390 nextcmd = nextcmd->next;
1391 }
1392
1393 if (thistexture) {
1394 ret = SetCopyState(data, cmd);
1395 } else {
1396 ret = SetDrawState(data, cmd, SHADER_SOLID, NULL);
1397 }
1398
1399 if (ret) {
1400 const GLfloat *verts = (GLfloat *)(((Uint8 *)vertices) + cmd->data.draw.first);
1401 int op = GL_TRIANGLES; // SDL_RENDERCMD_GEOMETRY
1402 if (thiscmdtype == SDL_RENDERCMD_DRAW_POINTS) {
1403 op = GL_POINTS;
1404 }
1405
1406 if (thiscmdtype == SDL_RENDERCMD_DRAW_POINTS) {
1407 // SetDrawState handles glEnableClientState.
1408 data->glVertexPointer(2, GL_FLOAT, sizeof(float) * 2, verts);
1409 } else {
1410 // SetDrawState handles glEnableClientState.
1411 if (thistexture) {
1412 data->glVertexPointer(2, GL_FLOAT, sizeof(float) * 8, verts + 0);
1413 data->glColorPointer(4, GL_FLOAT, sizeof(float) * 8, verts + 2);
1414 data->glTexCoordPointer(2, GL_FLOAT, sizeof(float) * 8, verts + 6);
1415 } else {
1416 data->glVertexPointer(2, GL_FLOAT, sizeof(float) * 6, verts + 0);
1417 data->glColorPointer(4, GL_FLOAT, sizeof(float) * 6, verts + 2);
1418 }
1419 }
1420
1421 data->glDrawArrays(op, 0, (GLsizei)count);
1422
1423 // Restore previously set color when we're done.
1424 if (thiscmdtype != SDL_RENDERCMD_DRAW_POINTS) {
1425 const float r = data->drawstate.color.r;
1426 const float g = data->drawstate.color.g;
1427 const float b = data->drawstate.color.b;
1428 const float a = data->drawstate.color.a;
1429 data->glColor4f(r, g, b, a);
1430 }
1431 }
1432
1433 cmd = finalcmd; // skip any copy commands we just combined in here.
1434 break;
1435 }
1436
1437 case SDL_RENDERCMD_NO_OP:
1438 break;
1439 }
1440
1441 cmd = cmd->next;
1442 }
1443
1444 /* Turn off vertex array state when we're done, in case external code
1445 relies on it being off. */
1446 if (data->drawstate.vertex_array) {
1447 data->glDisableClientState(GL_VERTEX_ARRAY);
1448 data->drawstate.vertex_array = false;
1449 }
1450 if (data->drawstate.color_array) {
1451 data->glDisableClientState(GL_COLOR_ARRAY);
1452 data->drawstate.color_array = false;
1453 }
1454 if (data->drawstate.texture_array) {
1455 data->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1456 data->drawstate.texture_array = false;
1457 }
1458
1459 return GL_CheckError("", renderer);
1460}
1461
1462static SDL_Surface *GL_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
1463{
1464 GL_RenderData *data = (GL_RenderData *)renderer->internal;
1465 SDL_PixelFormat format = renderer->target ? renderer->target->format : SDL_PIXELFORMAT_ARGB8888;
1466 GLint internalFormat;
1467 GLenum targetFormat, type;
1468 SDL_Surface *surface;
1469
1470 GL_ActivateRenderer(renderer);
1471
1472 if (!convert_format(format, &internalFormat, &targetFormat, &type)) {
1473 SDL_SetError("Texture format %s not supported by OpenGL", SDL_GetPixelFormatName(format));
1474 return NULL;
1475 }
1476
1477 surface = SDL_CreateSurface(rect->w, rect->h, format);
1478 if (!surface) {
1479 return NULL;
1480 }
1481
1482 int y = rect->y;
1483 if (!renderer->target) {
1484 int w, h;
1485 SDL_GetRenderOutputSize(renderer, &w, &h);
1486 y = (h - y) - rect->h;
1487 }
1488
1489 data->glPixelStorei(GL_PACK_ALIGNMENT, 1);
1490 data->glPixelStorei(GL_PACK_ROW_LENGTH, (surface->pitch / SDL_BYTESPERPIXEL(format)));
1491 data->glReadPixels(rect->x, y, rect->w, rect->h, targetFormat, type, surface->pixels);
1492
1493 if (!GL_CheckError("glReadPixels()", renderer)) {
1494 SDL_DestroySurface(surface);
1495 return NULL;
1496 }
1497
1498 // Flip the rows to be top-down if necessary
1499 if (!renderer->target) {
1500 SDL_FlipSurface(surface, SDL_FLIP_VERTICAL);
1501 }
1502 return surface;
1503}
1504
1505static bool GL_RenderPresent(SDL_Renderer *renderer)
1506{
1507 GL_ActivateRenderer(renderer);
1508
1509 return SDL_GL_SwapWindow(renderer->window);
1510}
1511
1512static void GL_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1513{
1514 GL_RenderData *renderdata = (GL_RenderData *)renderer->internal;
1515 GL_TextureData *data = (GL_TextureData *)texture->internal;
1516
1517 GL_ActivateRenderer(renderer);
1518
1519 if (renderdata->drawstate.texture == texture) {
1520 renderdata->drawstate.texture = NULL;
1521 }
1522 if (renderdata->drawstate.target == texture) {
1523 renderdata->drawstate.target = NULL;
1524 }
1525
1526 if (!data) {
1527 return;
1528 }
1529 if (data->texture && !data->texture_external) {
1530 renderdata->glDeleteTextures(1, &data->texture);
1531 }
1532#ifdef SDL_HAVE_YUV
1533 if (data->yuv) {
1534 if (!data->utexture_external) {
1535 renderdata->glDeleteTextures(1, &data->utexture);
1536 }
1537 if (!data->vtexture_external) {
1538 renderdata->glDeleteTextures(1, &data->vtexture);
1539 }
1540 }
1541 if (data->nv12) {
1542 if (!data->utexture_external) {
1543 renderdata->glDeleteTextures(1, &data->utexture);
1544 }
1545 }
1546#endif
1547 SDL_free(data->pixels);
1548 SDL_free(data);
1549 texture->internal = NULL;
1550}
1551
1552static void GL_DestroyRenderer(SDL_Renderer *renderer)
1553{
1554 GL_RenderData *data = (GL_RenderData *)renderer->internal;
1555
1556 if (data) {
1557 if (data->context) {
1558 // make sure we delete the right resources!
1559 GL_ActivateRenderer(renderer);
1560 }
1561
1562 GL_ClearErrors(renderer);
1563 if (data->GL_ARB_debug_output_supported) {
1564 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)SDL_GL_GetProcAddress("glDebugMessageCallbackARB");
1565
1566 // Uh oh, we don't have a safe way of removing ourselves from the callback chain, if it changed after we set our callback.
1567 // For now, just always replace the callback with the original one
1568 glDebugMessageCallbackARBFunc(data->next_error_callback, data->next_error_userparam);
1569 }
1570 if (data->shaders) {
1571 GL_DestroyShaderContext(data->shaders);
1572 }
1573 if (data->context) {
1574 while (data->framebuffers) {
1575 GL_FBOList *nextnode = data->framebuffers->next;
1576 // delete the framebuffer object
1577 data->glDeleteFramebuffersEXT(1, &data->framebuffers->FBO);
1578 GL_CheckError("", renderer);
1579 SDL_free(data->framebuffers);
1580 data->framebuffers = nextnode;
1581 }
1582 SDL_GL_DestroyContext(data->context);
1583 }
1584 SDL_free(data);
1585 }
1586}
1587
1588static bool GL_SetVSync(SDL_Renderer *renderer, const int vsync)
1589{
1590 int interval = 0;
1591
1592 if (!SDL_GL_SetSwapInterval(vsync)) {
1593 return false;
1594 }
1595
1596 if (!SDL_GL_GetSwapInterval(&interval)) {
1597 return false;
1598 }
1599
1600 if (interval != vsync) {
1601 return SDL_Unsupported();
1602 }
1603 return true;
1604}
1605
1606static bool GL_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
1607{
1608 GL_RenderData *data = NULL;
1609 GLint value;
1610 SDL_WindowFlags window_flags;
1611 int profile_mask = 0, major = 0, minor = 0;
1612 bool changed_window = false;
1613 const char *hint;
1614 bool non_power_of_two_supported = false;
1615
1616 SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask);
1617 SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major);
1618 SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor);
1619
1620#ifndef SDL_VIDEO_VITA_PVR_OGL
1621 SDL_SyncWindow(window);
1622 window_flags = SDL_GetWindowFlags(window);
1623 if (!(window_flags & SDL_WINDOW_OPENGL) ||
1624 profile_mask == SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {
1625
1626 changed_window = true;
1627 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0);
1628 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);
1629 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);
1630
1631 if (!SDL_RecreateWindow(window, (window_flags & ~(SDL_WINDOW_VULKAN | SDL_WINDOW_METAL)) | SDL_WINDOW_OPENGL)) {
1632 goto error;
1633 }
1634 }
1635#endif
1636
1637 SDL_SetupRendererColorspace(renderer, create_props);
1638
1639 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
1640 SDL_SetError("Unsupported output colorspace");
1641 goto error;
1642 }
1643
1644 data = (GL_RenderData *)SDL_calloc(1, sizeof(*data));
1645 if (!data) {
1646 goto error;
1647 }
1648
1649 renderer->WindowEvent = GL_WindowEvent;
1650 renderer->SupportsBlendMode = GL_SupportsBlendMode;
1651 renderer->CreateTexture = GL_CreateTexture;
1652 renderer->UpdateTexture = GL_UpdateTexture;
1653#ifdef SDL_HAVE_YUV
1654 renderer->UpdateTextureYUV = GL_UpdateTextureYUV;
1655 renderer->UpdateTextureNV = GL_UpdateTextureNV;
1656#endif
1657 renderer->LockTexture = GL_LockTexture;
1658 renderer->UnlockTexture = GL_UnlockTexture;
1659 renderer->SetTextureScaleMode = GL_SetTextureScaleMode;
1660 renderer->SetRenderTarget = GL_SetRenderTarget;
1661 renderer->QueueSetViewport = GL_QueueNoOp;
1662 renderer->QueueSetDrawColor = GL_QueueNoOp;
1663 renderer->QueueDrawPoints = GL_QueueDrawPoints;
1664 renderer->QueueDrawLines = GL_QueueDrawLines;
1665 renderer->QueueGeometry = GL_QueueGeometry;
1666 renderer->InvalidateCachedState = GL_InvalidateCachedState;
1667 renderer->RunCommandQueue = GL_RunCommandQueue;
1668 renderer->RenderReadPixels = GL_RenderReadPixels;
1669 renderer->RenderPresent = GL_RenderPresent;
1670 renderer->DestroyTexture = GL_DestroyTexture;
1671 renderer->DestroyRenderer = GL_DestroyRenderer;
1672 renderer->SetVSync = GL_SetVSync;
1673 renderer->internal = data;
1674 GL_InvalidateCachedState(renderer);
1675 renderer->window = window;
1676
1677 renderer->name = GL_RenderDriver.name;
1678 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
1679 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
1680 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
1681 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR8888);
1682
1683 data->context = SDL_GL_CreateContext(window);
1684 if (!data->context) {
1685 goto error;
1686 }
1687 if (!SDL_GL_MakeCurrent(window, data->context)) {
1688 goto error;
1689 }
1690
1691 if (!GL_LoadFunctions(data)) {
1692 goto error;
1693 }
1694
1695#ifdef SDL_PLATFORM_MACOS
1696 // Enable multi-threaded rendering
1697 /* Disabled until Ryan finishes his VBO/PBO code...
1698 CGLEnable(CGLGetCurrentContext(), kCGLCEMPEngine);
1699 */
1700#endif
1701
1702 // Check for debug output support
1703 if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_FLAGS, &value) &&
1704 (value & SDL_GL_CONTEXT_DEBUG_FLAG)) {
1705 data->debug_enabled = true;
1706 }
1707 if (data->debug_enabled && SDL_GL_ExtensionSupported("GL_ARB_debug_output")) {
1708 PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARBFunc = (PFNGLDEBUGMESSAGECALLBACKARBPROC)SDL_GL_GetProcAddress("glDebugMessageCallbackARB");
1709
1710 data->GL_ARB_debug_output_supported = true;
1711 data->glGetPointerv(GL_DEBUG_CALLBACK_FUNCTION_ARB, (GLvoid **)(char *)&data->next_error_callback);
1712 data->glGetPointerv(GL_DEBUG_CALLBACK_USER_PARAM_ARB, &data->next_error_userparam);
1713 glDebugMessageCallbackARBFunc(GL_HandleDebugMessage, renderer);
1714
1715 // Make sure our callback is called when errors actually happen
1716 data->glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
1717 }
1718
1719 hint = SDL_GetHint("GL_ARB_texture_non_power_of_two");
1720 if (!hint || *hint != '0') {
1721 bool isGL2 = false;
1722 const char *verstr = (const char *)data->glGetString(GL_VERSION);
1723 if (verstr) {
1724 char verbuf[16];
1725 char *ptr;
1726 SDL_strlcpy(verbuf, verstr, sizeof(verbuf));
1727 ptr = SDL_strchr(verbuf, '.');
1728 if (ptr) {
1729 *ptr = '\0';
1730 if (SDL_atoi(verbuf) >= 2) {
1731 isGL2 = true;
1732 }
1733 }
1734 }
1735 if (isGL2 || SDL_GL_ExtensionSupported("GL_ARB_texture_non_power_of_two")) {
1736 non_power_of_two_supported = true;
1737 }
1738 }
1739
1740 data->textype = GL_TEXTURE_2D;
1741 if (non_power_of_two_supported) {
1742 data->GL_ARB_texture_non_power_of_two_supported = true;
1743 data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
1744 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, value);
1745 } else if (SDL_GL_ExtensionSupported("GL_ARB_texture_rectangle") ||
1746 SDL_GL_ExtensionSupported("GL_EXT_texture_rectangle")) {
1747 data->GL_ARB_texture_rectangle_supported = true;
1748 data->textype = GL_TEXTURE_RECTANGLE_ARB;
1749 data->glGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB, &value);
1750 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, value);
1751 } else {
1752 data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
1753 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, value);
1754 }
1755
1756 // Check for multitexture support
1757 if (SDL_GL_ExtensionSupported("GL_ARB_multitexture")) {
1758 data->glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)SDL_GL_GetProcAddress("glActiveTextureARB");
1759 if (data->glActiveTextureARB) {
1760 data->GL_ARB_multitexture_supported = true;
1761 data->glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &data->num_texture_units);
1762 }
1763 }
1764
1765 // Check for shader support
1766 data->shaders = GL_CreateShaderContext();
1767 SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL shaders: %s",
1768 data->shaders ? "ENABLED" : "DISABLED");
1769#ifdef SDL_HAVE_YUV
1770 // We support YV12 textures using 3 textures and a shader
1771 if (data->shaders && data->num_texture_units >= 3) {
1772 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
1773 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
1774 }
1775
1776 // We support NV12 textures using 2 textures and a shader
1777 if (data->shaders && data->num_texture_units >= 2) {
1778 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
1779 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
1780 }
1781#endif
1782#ifdef SDL_PLATFORM_MACOS
1783 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_UYVY);
1784#endif
1785
1786 if (SDL_GL_ExtensionSupported("GL_EXT_framebuffer_object")) {
1787 data->GL_EXT_framebuffer_object_supported = true;
1788 data->glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)
1789 SDL_GL_GetProcAddress("glGenFramebuffersEXT");
1790 data->glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
1791 SDL_GL_GetProcAddress("glDeleteFramebuffersEXT");
1792 data->glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
1793 SDL_GL_GetProcAddress("glFramebufferTexture2DEXT");
1794 data->glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)
1795 SDL_GL_GetProcAddress("glBindFramebufferEXT");
1796 data->glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
1797 SDL_GL_GetProcAddress("glCheckFramebufferStatusEXT");
1798 } else {
1799 SDL_SetError("Can't create render targets, GL_EXT_framebuffer_object not available");
1800 goto error;
1801 }
1802
1803 // Set up parameters for rendering
1804 data->glMatrixMode(GL_MODELVIEW);
1805 data->glLoadIdentity();
1806 data->glDisable(GL_DEPTH_TEST);
1807 data->glDisable(GL_CULL_FACE);
1808 data->glDisable(GL_SCISSOR_TEST);
1809 data->glDisable(data->textype);
1810 data->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
1811 data->glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
1812 // This ended up causing video discrepancies between OpenGL and Direct3D
1813 // data->glEnable(GL_LINE_SMOOTH);
1814
1815 data->drawstate.color.r = 1.0f;
1816 data->drawstate.color.g = 1.0f;
1817 data->drawstate.color.b = 1.0f;
1818 data->drawstate.color.a = 1.0f;
1819 data->drawstate.clear_color.r = 1.0f;
1820 data->drawstate.clear_color.g = 1.0f;
1821 data->drawstate.clear_color.b = 1.0f;
1822 data->drawstate.clear_color.a = 1.0f;
1823
1824 return true;
1825
1826error:
1827 if (changed_window) {
1828 // Uh oh, better try to put it back...
1829 char *error = SDL_strdup(SDL_GetError());
1830 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile_mask);
1831 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
1832 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
1833 SDL_RecreateWindow(window, window_flags);
1834 SDL_SetError("%s", error);
1835 SDL_free(error);
1836 }
1837 return false;
1838}
1839
1840SDL_RenderDriver GL_RenderDriver = {
1841 GL_CreateRenderer, "opengl"
1842};
1843
1844#endif // SDL_VIDEO_RENDER_OGL
diff --git a/SDL-3.2.8/src/render/opengl/SDL_shaders_gl.c b/SDL-3.2.8/src/render/opengl/SDL_shaders_gl.c
new file mode 100644
index 0000000..b09b12e
--- /dev/null
+++ b/SDL-3.2.8/src/render/opengl/SDL_shaders_gl.c
@@ -0,0 +1,545 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_OGL
24
25#include <SDL3/SDL_opengl.h>
26#include "SDL_shaders_gl.h"
27
28// OpenGL shader implementation
29
30// #define DEBUG_SHADERS
31
32typedef struct
33{
34 GLhandleARB program;
35 GLhandleARB vert_shader;
36 GLhandleARB frag_shader;
37} GL_ShaderData;
38
39struct GL_ShaderContext
40{
41 GLenum (*glGetError)(void);
42
43 PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
44 PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
45 PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
46 PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
47 PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
48 PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
49 PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
50 PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
51 PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
52 PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
53 PFNGLUNIFORM1IARBPROC glUniform1iARB;
54 PFNGLUNIFORM1FARBPROC glUniform1fARB;
55 PFNGLUNIFORM3FARBPROC glUniform3fARB;
56 PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
57
58 bool GL_ARB_texture_rectangle_supported;
59
60 GL_ShaderData shaders[NUM_SHADERS];
61 const float *shader_params[NUM_SHADERS];
62};
63
64/* *INDENT-OFF* */ // clang-format off
65
66#define COLOR_VERTEX_SHADER \
67"varying vec4 v_color;\n" \
68"\n" \
69"void main()\n" \
70"{\n" \
71" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" \
72" v_color = gl_Color;\n" \
73"}" \
74
75#define TEXTURE_VERTEX_SHADER \
76"varying vec4 v_color;\n" \
77"varying vec2 v_texCoord;\n" \
78"\n" \
79"void main()\n" \
80"{\n" \
81" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" \
82" v_color = gl_Color;\n" \
83" v_texCoord = vec2(gl_MultiTexCoord0);\n" \
84"}" \
85
86#define YUV_SHADER_PROLOGUE \
87"varying vec4 v_color;\n" \
88"varying vec2 v_texCoord;\n" \
89"uniform sampler2D tex0; // Y \n" \
90"uniform sampler2D tex1; // U \n" \
91"uniform sampler2D tex2; // V \n" \
92"uniform vec3 Yoffset;\n" \
93"uniform vec3 Rcoeff;\n" \
94"uniform vec3 Gcoeff;\n" \
95"uniform vec3 Bcoeff;\n" \
96"\n" \
97
98#define YUV_SHADER_BODY \
99"\n" \
100"void main()\n" \
101"{\n" \
102" vec2 tcoord;\n" \
103" vec3 yuv, rgb;\n" \
104"\n" \
105" // Get the Y value \n" \
106" tcoord = v_texCoord;\n" \
107" yuv.x = texture2D(tex0, tcoord).r;\n" \
108"\n" \
109" // Get the U and V values \n" \
110" tcoord *= UVCoordScale;\n" \
111" yuv.y = texture2D(tex1, tcoord).r;\n" \
112" yuv.z = texture2D(tex2, tcoord).r;\n" \
113"\n" \
114" // Do the color transform \n" \
115" yuv += Yoffset;\n" \
116" rgb.r = dot(yuv, Rcoeff);\n" \
117" rgb.g = dot(yuv, Gcoeff);\n" \
118" rgb.b = dot(yuv, Bcoeff);\n" \
119"\n" \
120" // That was easy. :) \n" \
121" gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
122"}" \
123
124#define NV12_SHADER_PROLOGUE \
125"varying vec4 v_color;\n" \
126"varying vec2 v_texCoord;\n" \
127"uniform sampler2D tex0; // Y \n" \
128"uniform sampler2D tex1; // U/V \n" \
129"uniform vec3 Yoffset;\n" \
130"uniform vec3 Rcoeff;\n" \
131"uniform vec3 Gcoeff;\n" \
132"uniform vec3 Bcoeff;\n" \
133"\n" \
134
135#define NV12_RA_SHADER_BODY \
136"\n" \
137"void main()\n" \
138"{\n" \
139" vec2 tcoord;\n" \
140" vec3 yuv, rgb;\n" \
141"\n" \
142" // Get the Y value \n" \
143" tcoord = v_texCoord;\n" \
144" yuv.x = texture2D(tex0, tcoord).r;\n" \
145"\n" \
146" // Get the U and V values \n" \
147" tcoord *= UVCoordScale;\n" \
148" yuv.yz = texture2D(tex1, tcoord).ra;\n" \
149"\n" \
150" // Do the color transform \n" \
151" yuv += Yoffset;\n" \
152" rgb.r = dot(yuv, Rcoeff);\n" \
153" rgb.g = dot(yuv, Gcoeff);\n" \
154" rgb.b = dot(yuv, Bcoeff);\n" \
155"\n" \
156" // That was easy. :) \n" \
157" gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
158"}" \
159
160#define NV12_RG_SHADER_BODY \
161"\n" \
162"void main()\n" \
163"{\n" \
164" vec2 tcoord;\n" \
165" vec3 yuv, rgb;\n" \
166"\n" \
167" // Get the Y value \n" \
168" tcoord = v_texCoord;\n" \
169" yuv.x = texture2D(tex0, tcoord).r;\n" \
170"\n" \
171" // Get the U and V values \n" \
172" tcoord *= UVCoordScale;\n" \
173" yuv.yz = texture2D(tex1, tcoord).rg;\n" \
174"\n" \
175" // Do the color transform \n" \
176" yuv += Yoffset;\n" \
177" rgb.r = dot(yuv, Rcoeff);\n" \
178" rgb.g = dot(yuv, Gcoeff);\n" \
179" rgb.b = dot(yuv, Bcoeff);\n" \
180"\n" \
181" // That was easy. :) \n" \
182" gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
183"}" \
184
185#define NV21_RA_SHADER_BODY \
186"\n" \
187"void main()\n" \
188"{\n" \
189" vec2 tcoord;\n" \
190" vec3 yuv, rgb;\n" \
191"\n" \
192" // Get the Y value \n" \
193" tcoord = v_texCoord;\n" \
194" yuv.x = texture2D(tex0, tcoord).r;\n" \
195"\n" \
196" // Get the U and V values \n" \
197" tcoord *= UVCoordScale;\n" \
198" yuv.yz = texture2D(tex1, tcoord).ar;\n" \
199"\n" \
200" // Do the color transform \n" \
201" yuv += Yoffset;\n" \
202" rgb.r = dot(yuv, Rcoeff);\n" \
203" rgb.g = dot(yuv, Gcoeff);\n" \
204" rgb.b = dot(yuv, Bcoeff);\n" \
205"\n" \
206" // That was easy. :) \n" \
207" gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
208"}" \
209
210#define NV21_RG_SHADER_BODY \
211"\n" \
212"void main()\n" \
213"{\n" \
214" vec2 tcoord;\n" \
215" vec3 yuv, rgb;\n" \
216"\n" \
217" // Get the Y value \n" \
218" tcoord = v_texCoord;\n" \
219" yuv.x = texture2D(tex0, tcoord).r;\n" \
220"\n" \
221" // Get the U and V values \n" \
222" tcoord *= UVCoordScale;\n" \
223" yuv.yz = texture2D(tex1, tcoord).gr;\n" \
224"\n" \
225" // Do the color transform \n" \
226" yuv += Yoffset;\n" \
227" rgb.r = dot(yuv, Rcoeff);\n" \
228" rgb.g = dot(yuv, Gcoeff);\n" \
229" rgb.b = dot(yuv, Bcoeff);\n" \
230"\n" \
231" // That was easy. :) \n" \
232" gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
233"}" \
234
235/*
236 * NOTE: Always use sampler2D, etc here. We'll #define them to the
237 * texture_rectangle versions if we choose to use that extension.
238 */
239static const char *shader_source[NUM_SHADERS][2] = {
240 // SHADER_NONE
241 { NULL, NULL },
242
243 // SHADER_SOLID
244 {
245 // vertex shader
246 COLOR_VERTEX_SHADER,
247 // fragment shader
248"varying vec4 v_color;\n"
249"\n"
250"void main()\n"
251"{\n"
252" gl_FragColor = v_color;\n"
253"}"
254 },
255
256 // SHADER_RGB
257 {
258 // vertex shader
259 TEXTURE_VERTEX_SHADER,
260 // fragment shader
261"varying vec4 v_color;\n"
262"varying vec2 v_texCoord;\n"
263"uniform sampler2D tex0;\n"
264"\n"
265"void main()\n"
266"{\n"
267" gl_FragColor = texture2D(tex0, v_texCoord);\n"
268" gl_FragColor.a = 1.0;\n"
269" gl_FragColor *= v_color;\n"
270"}"
271 },
272
273 // SHADER_RGBA
274 {
275 // vertex shader
276 TEXTURE_VERTEX_SHADER,
277 // fragment shader
278"varying vec4 v_color;\n"
279"varying vec2 v_texCoord;\n"
280"uniform sampler2D tex0;\n"
281"\n"
282"void main()\n"
283"{\n"
284" gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n"
285"}"
286 },
287#ifdef SDL_HAVE_YUV
288 // SHADER_YUV
289 {
290 // vertex shader
291 TEXTURE_VERTEX_SHADER,
292 // fragment shader
293 YUV_SHADER_PROLOGUE
294 YUV_SHADER_BODY
295 },
296 // SHADER_NV12_RA
297 {
298 // vertex shader
299 TEXTURE_VERTEX_SHADER,
300 // fragment shader
301 NV12_SHADER_PROLOGUE
302 NV12_RA_SHADER_BODY
303 },
304 // SHADER_NV12_RG
305 {
306 // vertex shader
307 TEXTURE_VERTEX_SHADER,
308 // fragment shader
309 NV12_SHADER_PROLOGUE
310 NV12_RG_SHADER_BODY
311 },
312 // SHADER_NV21_RA
313 {
314 // vertex shader
315 TEXTURE_VERTEX_SHADER,
316 // fragment shader
317 NV12_SHADER_PROLOGUE
318 NV21_RA_SHADER_BODY
319 },
320 // SHADER_NV21_RG
321 {
322 // vertex shader
323 TEXTURE_VERTEX_SHADER,
324 // fragment shader
325 NV12_SHADER_PROLOGUE
326 NV21_RG_SHADER_BODY
327 },
328#endif // SDL_HAVE_YUV
329};
330
331/* *INDENT-ON* */ // clang-format on
332
333static bool CompileShader(GL_ShaderContext *ctx, GLhandleARB shader, const char *defines, const char *source)
334{
335 GLint status;
336 const char *sources[2];
337
338 sources[0] = defines;
339 sources[1] = source;
340
341 ctx->glShaderSourceARB(shader, SDL_arraysize(sources), sources, NULL);
342 ctx->glCompileShaderARB(shader);
343 ctx->glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &status);
344 if (status == 0) {
345 bool isstack;
346 GLint length;
347 char *info;
348
349 ctx->glGetObjectParameterivARB(shader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
350 info = SDL_small_alloc(char, length + 1, &isstack);
351 if (info) {
352 ctx->glGetInfoLogARB(shader, length, NULL, info);
353 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Failed to compile shader:");
354 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s", defines);
355 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s", source);
356 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s", info);
357 SDL_small_free(info, isstack);
358 }
359 return false;
360 } else {
361 return true;
362 }
363}
364
365static bool CompileShaderProgram(GL_ShaderContext *ctx, int index, GL_ShaderData *data)
366{
367 const int num_tmus_bound = 4;
368 const char *vert_defines = "";
369 const char *frag_defines = "";
370 int i;
371 GLint location;
372
373 if (index == SHADER_NONE) {
374 return true;
375 }
376
377 ctx->glGetError();
378
379 // Make sure we use the correct sampler type for our texture type
380 if (ctx->GL_ARB_texture_rectangle_supported) {
381 frag_defines =
382 "#define sampler2D sampler2DRect\n"
383 "#define texture2D texture2DRect\n"
384 "#define UVCoordScale 0.5\n";
385 } else {
386 frag_defines =
387 "#define UVCoordScale 1.0\n";
388 }
389
390 // Create one program object to rule them all
391 data->program = ctx->glCreateProgramObjectARB();
392
393 // Create the vertex shader
394 data->vert_shader = ctx->glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
395 if (!CompileShader(ctx, data->vert_shader, vert_defines, shader_source[index][0])) {
396 return false;
397 }
398
399 // Create the fragment shader
400 data->frag_shader = ctx->glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
401 if (!CompileShader(ctx, data->frag_shader, frag_defines, shader_source[index][1])) {
402 return false;
403 }
404
405 // ... and in the darkness bind them
406 ctx->glAttachObjectARB(data->program, data->vert_shader);
407 ctx->glAttachObjectARB(data->program, data->frag_shader);
408 ctx->glLinkProgramARB(data->program);
409
410 // Set up some uniform variables
411 ctx->glUseProgramObjectARB(data->program);
412 for (i = 0; i < num_tmus_bound; ++i) {
413 char tex_name[10];
414 (void)SDL_snprintf(tex_name, SDL_arraysize(tex_name), "tex%d", i);
415 location = ctx->glGetUniformLocationARB(data->program, tex_name);
416 if (location >= 0) {
417 ctx->glUniform1iARB(location, i);
418 }
419 }
420 ctx->glUseProgramObjectARB(0);
421
422 return ctx->glGetError() == GL_NO_ERROR;
423}
424
425static void DestroyShaderProgram(GL_ShaderContext *ctx, GL_ShaderData *data)
426{
427 ctx->glDeleteObjectARB(data->vert_shader);
428 ctx->glDeleteObjectARB(data->frag_shader);
429 ctx->glDeleteObjectARB(data->program);
430}
431
432GL_ShaderContext *GL_CreateShaderContext(void)
433{
434 GL_ShaderContext *ctx;
435 bool shaders_supported;
436 int i;
437
438 ctx = (GL_ShaderContext *)SDL_calloc(1, sizeof(*ctx));
439 if (!ctx) {
440 return NULL;
441 }
442
443 if (!SDL_GL_ExtensionSupported("GL_ARB_texture_non_power_of_two") &&
444 (SDL_GL_ExtensionSupported("GL_ARB_texture_rectangle") ||
445 SDL_GL_ExtensionSupported("GL_EXT_texture_rectangle"))) {
446 ctx->GL_ARB_texture_rectangle_supported = true;
447 }
448
449 // Check for shader support
450 shaders_supported = false;
451 if (SDL_GL_ExtensionSupported("GL_ARB_shader_objects") &&
452 SDL_GL_ExtensionSupported("GL_ARB_shading_language_100") &&
453 SDL_GL_ExtensionSupported("GL_ARB_vertex_shader") &&
454 SDL_GL_ExtensionSupported("GL_ARB_fragment_shader")) {
455 ctx->glGetError = (GLenum(*)(void))SDL_GL_GetProcAddress("glGetError");
456 ctx->glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)SDL_GL_GetProcAddress("glAttachObjectARB");
457 ctx->glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)SDL_GL_GetProcAddress("glCompileShaderARB");
458 ctx->glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glCreateProgramObjectARB");
459 ctx->glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)SDL_GL_GetProcAddress("glCreateShaderObjectARB");
460 ctx->glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)SDL_GL_GetProcAddress("glDeleteObjectARB");
461 ctx->glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)SDL_GL_GetProcAddress("glGetInfoLogARB");
462 ctx->glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)SDL_GL_GetProcAddress("glGetObjectParameterivARB");
463 ctx->glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)SDL_GL_GetProcAddress("glGetUniformLocationARB");
464 ctx->glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)SDL_GL_GetProcAddress("glLinkProgramARB");
465 ctx->glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)SDL_GL_GetProcAddress("glShaderSourceARB");
466 ctx->glUniform1iARB = (PFNGLUNIFORM1IARBPROC)SDL_GL_GetProcAddress("glUniform1iARB");
467 ctx->glUniform1fARB = (PFNGLUNIFORM1FARBPROC)SDL_GL_GetProcAddress("glUniform1fARB");
468 ctx->glUniform3fARB = (PFNGLUNIFORM3FARBPROC)SDL_GL_GetProcAddress("glUniform3fARB");
469 ctx->glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glUseProgramObjectARB");
470 if (ctx->glGetError &&
471 ctx->glAttachObjectARB &&
472 ctx->glCompileShaderARB &&
473 ctx->glCreateProgramObjectARB &&
474 ctx->glCreateShaderObjectARB &&
475 ctx->glDeleteObjectARB &&
476 ctx->glGetInfoLogARB &&
477 ctx->glGetObjectParameterivARB &&
478 ctx->glGetUniformLocationARB &&
479 ctx->glLinkProgramARB &&
480 ctx->glShaderSourceARB &&
481 ctx->glUniform1iARB &&
482 ctx->glUniform1fARB &&
483 ctx->glUniform3fARB &&
484 ctx->glUseProgramObjectARB) {
485 shaders_supported = true;
486 }
487 }
488
489 if (!shaders_supported) {
490 SDL_free(ctx);
491 return NULL;
492 }
493
494 // Compile all the shaders
495 for (i = 0; i < NUM_SHADERS; ++i) {
496 if (!CompileShaderProgram(ctx, i, &ctx->shaders[i])) {
497 GL_DestroyShaderContext(ctx);
498 return NULL;
499 }
500 }
501
502 // We're done!
503 return ctx;
504}
505
506void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader, const float *shader_params)
507{
508 GLint location;
509 GLhandleARB program = ctx->shaders[shader].program;
510
511 ctx->glUseProgramObjectARB(program);
512
513 if (shader_params && shader_params != ctx->shader_params[shader]) {
514 // YUV shader params are Yoffset, 0, Rcoeff, 0, Gcoeff, 0, Bcoeff, 0
515 location = ctx->glGetUniformLocationARB(program, "Yoffset");
516 if (location >= 0) {
517 ctx->glUniform3fARB(location, shader_params[0], shader_params[1], shader_params[2]);
518 }
519 location = ctx->glGetUniformLocationARB(program, "Rcoeff");
520 if (location >= 0) {
521 ctx->glUniform3fARB(location, shader_params[4], shader_params[5], shader_params[6]);
522 }
523 location = ctx->glGetUniformLocationARB(program, "Gcoeff");
524 if (location >= 0) {
525 ctx->glUniform3fARB(location, shader_params[8], shader_params[9], shader_params[10]);
526 }
527 location = ctx->glGetUniformLocationARB(program, "Bcoeff");
528 if (location >= 0) {
529 ctx->glUniform3fARB(location, shader_params[12], shader_params[13], shader_params[14]);
530 }
531 ctx->shader_params[shader] = shader_params;
532 }
533}
534
535void GL_DestroyShaderContext(GL_ShaderContext *ctx)
536{
537 int i;
538
539 for (i = 0; i < NUM_SHADERS; ++i) {
540 DestroyShaderProgram(ctx, &ctx->shaders[i]);
541 }
542 SDL_free(ctx);
543}
544
545#endif // SDL_VIDEO_RENDER_OGL
diff --git a/SDL-3.2.8/src/render/opengl/SDL_shaders_gl.h b/SDL-3.2.8/src/render/opengl/SDL_shaders_gl.h
new file mode 100644
index 0000000..374940a
--- /dev/null
+++ b/SDL-3.2.8/src/render/opengl/SDL_shaders_gl.h
@@ -0,0 +1,52 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_shaders_gl_h_
23#define SDL_shaders_gl_h_
24
25#include "SDL_internal.h"
26
27// OpenGL shader implementation
28
29typedef enum
30{
31 SHADER_INVALID = -1,
32 SHADER_NONE,
33 SHADER_SOLID,
34 SHADER_RGB,
35 SHADER_RGBA,
36#ifdef SDL_HAVE_YUV
37 SHADER_YUV,
38 SHADER_NV12_RA,
39 SHADER_NV12_RG,
40 SHADER_NV21_RA,
41 SHADER_NV21_RG,
42#endif
43 NUM_SHADERS
44} GL_Shader;
45
46typedef struct GL_ShaderContext GL_ShaderContext;
47
48extern GL_ShaderContext *GL_CreateShaderContext(void);
49extern void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader, const float *shader_params);
50extern void GL_DestroyShaderContext(GL_ShaderContext *ctx);
51
52#endif // SDL_shaders_gl_h_
diff --git a/SDL-3.2.8/src/render/opengles2/SDL_gles2funcs.h b/SDL-3.2.8/src/render/opengles2/SDL_gles2funcs.h
new file mode 100644
index 0000000..bbc47a4
--- /dev/null
+++ b/SDL-3.2.8/src/render/opengles2/SDL_gles2funcs.h
@@ -0,0 +1,78 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22SDL_PROC(void, glActiveTexture, (GLenum))
23SDL_PROC(void, glAttachShader, (GLuint, GLuint))
24SDL_PROC(void, glBindAttribLocation, (GLuint, GLuint, const char *))
25SDL_PROC(void, glBindTexture, (GLenum, GLuint))
26SDL_PROC(void, glBlendEquationSeparate, (GLenum, GLenum))
27SDL_PROC(void, glBlendFuncSeparate, (GLenum, GLenum, GLenum, GLenum))
28SDL_PROC(void, glClear, (GLbitfield))
29SDL_PROC(void, glClearColor, (GLclampf, GLclampf, GLclampf, GLclampf))
30SDL_PROC(void, glCompileShader, (GLuint))
31SDL_PROC(GLuint, glCreateProgram, (void))
32SDL_PROC(GLuint, glCreateShader, (GLenum))
33SDL_PROC(void, glDeleteProgram, (GLuint))
34SDL_PROC(void, glDeleteShader, (GLuint))
35SDL_PROC(void, glDeleteTextures, (GLsizei, const GLuint *))
36SDL_PROC(void, glDisable, (GLenum))
37SDL_PROC(void, glDisableVertexAttribArray, (GLuint))
38SDL_PROC(void, glDrawArrays, (GLenum, GLint, GLsizei))
39SDL_PROC(void, glEnable, (GLenum))
40SDL_PROC(void, glEnableVertexAttribArray, (GLuint))
41SDL_PROC(void, glFinish, (void))
42SDL_PROC(void, glGenFramebuffers, (GLsizei, GLuint *))
43SDL_PROC(void, glGenTextures, (GLsizei, GLuint *))
44SDL_PROC(const GLubyte *, glGetString, (GLenum))
45SDL_PROC(GLenum, glGetError, (void))
46SDL_PROC(void, glGetIntegerv, (GLenum, GLint *))
47SDL_PROC(void, glGetProgramiv, (GLuint, GLenum, GLint *))
48SDL_PROC(void, glGetShaderInfoLog, (GLuint, GLsizei, GLsizei *, char *))
49SDL_PROC(void, glGetShaderiv, (GLuint, GLenum, GLint *))
50SDL_PROC(GLint, glGetUniformLocation, (GLuint, const char *))
51SDL_PROC(void, glLinkProgram, (GLuint))
52SDL_PROC(void, glPixelStorei, (GLenum, GLint))
53SDL_PROC(void, glReadPixels, (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid *))
54SDL_PROC(void, glScissor, (GLint, GLint, GLsizei, GLsizei))
55SDL_PROC(void, glShaderBinary, (GLsizei, const GLuint *, GLenum, const void *, GLsizei))
56SDL_PROC(void, glShaderSource, (GLuint, GLsizei, const GLchar *const *, const GLint *))
57SDL_PROC(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *))
58SDL_PROC(void, glTexParameteri, (GLenum, GLenum, GLint))
59SDL_PROC(void, glTexSubImage2D, (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *))
60SDL_PROC(void, glUniform1i, (GLint, GLint))
61SDL_PROC(void, glUniform3f, (GLint, GLfloat, GLfloat, GLfloat))
62SDL_PROC(void, glUniform4f, (GLint, GLfloat, GLfloat, GLfloat, GLfloat))
63SDL_PROC(void, glUniformMatrix3fv, (GLint, GLsizei, GLboolean, const GLfloat *))
64SDL_PROC(void, glUniformMatrix4fv, (GLint, GLsizei, GLboolean, const GLfloat *))
65SDL_PROC(void, glUseProgram, (GLuint))
66SDL_PROC(void, glVertexAttribPointer, (GLuint, GLint, GLenum, GLboolean, GLsizei, const void *))
67SDL_PROC(void, glViewport, (GLint, GLint, GLsizei, GLsizei))
68SDL_PROC(void, glBindFramebuffer, (GLenum, GLuint))
69SDL_PROC(void, glFramebufferTexture2D, (GLenum, GLenum, GLenum, GLuint, GLint))
70SDL_PROC(GLenum, glCheckFramebufferStatus, (GLenum))
71SDL_PROC(void, glDeleteFramebuffers, (GLsizei, const GLuint *))
72SDL_PROC(GLint, glGetAttribLocation, (GLuint, const GLchar *))
73SDL_PROC(void, glGetProgramInfoLog, (GLuint, GLsizei, GLsizei *, GLchar *))
74SDL_PROC(void, glGenBuffers, (GLsizei, GLuint *))
75SDL_PROC(void, glDeleteBuffers, (GLsizei, const GLuint *))
76SDL_PROC(void, glBindBuffer, (GLenum, GLuint))
77SDL_PROC(void, glBufferData, (GLenum, GLsizeiptr, const GLvoid *, GLenum))
78SDL_PROC(void, glBufferSubData, (GLenum, GLintptr, GLsizeiptr, const GLvoid *))
diff --git a/SDL-3.2.8/src/render/opengles2/SDL_render_gles2.c b/SDL-3.2.8/src/render/opengles2/SDL_render_gles2.c
new file mode 100644
index 0000000..0e142a7
--- /dev/null
+++ b/SDL-3.2.8/src/render/opengles2/SDL_render_gles2.c
@@ -0,0 +1,2226 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_OGL_ES2
24
25#include "../../video/SDL_sysvideo.h" // For SDL_RecreateWindow
26#include <SDL3/SDL_opengles2.h>
27#include "../SDL_sysrender.h"
28#include "../../video/SDL_pixels_c.h"
29#include "SDL_shaders_gles2.h"
30
31/* WebGL doesn't offer client-side arrays, so use Vertex Buffer Objects
32 on Emscripten, which converts GLES2 into WebGL calls.
33 In all other cases, attempt to use client-side arrays, as they tend to
34 be dramatically faster when not batching, and about the same when
35 we are. */
36#ifdef SDL_PLATFORM_EMSCRIPTEN
37#define USE_VERTEX_BUFFER_OBJECTS 1
38#else
39#define USE_VERTEX_BUFFER_OBJECTS 0
40#endif
41
42/* To prevent unnecessary window recreation,
43 * these should match the defaults selected in SDL_GL_ResetAttributes
44 */
45#define RENDERER_CONTEXT_MAJOR 2
46#define RENDERER_CONTEXT_MINOR 0
47
48/*************************************************************************************************
49 * Context structures *
50 *************************************************************************************************/
51
52typedef struct GLES2_FBOList GLES2_FBOList;
53
54struct GLES2_FBOList
55{
56 Uint32 w, h;
57 GLuint FBO;
58 GLES2_FBOList *next;
59};
60
61typedef struct GLES2_TextureData
62{
63 GLuint texture;
64 bool texture_external;
65 GLenum texture_type;
66 GLenum pixel_format;
67 GLenum pixel_type;
68 void *pixel_data;
69 int pitch;
70#ifdef SDL_HAVE_YUV
71 // YUV texture support
72 bool yuv;
73 bool nv12;
74 GLuint texture_v;
75 GLuint texture_v_external;
76 GLuint texture_u;
77 GLuint texture_u_external;
78#endif
79 GLES2_FBOList *fbo;
80} GLES2_TextureData;
81
82typedef enum
83{
84 GLES2_ATTRIBUTE_POSITION = 0,
85 GLES2_ATTRIBUTE_COLOR = 1,
86 GLES2_ATTRIBUTE_TEXCOORD = 2,
87} GLES2_Attribute;
88
89typedef enum
90{
91 GLES2_UNIFORM_PROJECTION,
92 GLES2_UNIFORM_TEXTURE,
93 GLES2_UNIFORM_TEXTURE_U,
94 GLES2_UNIFORM_TEXTURE_V,
95 GLES2_UNIFORM_OFFSET,
96 GLES2_UNIFORM_MATRIX,
97 NUM_GLES2_UNIFORMS
98} GLES2_Uniform;
99
100static const char *GLES2_UniformNames[] = {
101 "u_projection",
102 "u_texture",
103 "u_texture_u",
104 "u_texture_v",
105 "u_offset",
106 "u_matrix"
107};
108SDL_COMPILE_TIME_ASSERT(GLES2_UniformNames, SDL_arraysize(GLES2_UniformNames) == NUM_GLES2_UNIFORMS);
109
110typedef struct GLES2_ProgramCacheEntry
111{
112 GLuint id;
113 GLuint vertex_shader;
114 GLuint fragment_shader;
115 GLuint uniform_locations[NUM_GLES2_UNIFORMS];
116 GLfloat projection[4][4];
117 const float *shader_params;
118 struct GLES2_ProgramCacheEntry *prev;
119 struct GLES2_ProgramCacheEntry *next;
120} GLES2_ProgramCacheEntry;
121
122typedef struct GLES2_ProgramCache
123{
124 int count;
125 GLES2_ProgramCacheEntry *head;
126 GLES2_ProgramCacheEntry *tail;
127} GLES2_ProgramCache;
128
129typedef enum
130{
131 GLES2_IMAGESOURCE_INVALID,
132 GLES2_IMAGESOURCE_SOLID,
133 GLES2_IMAGESOURCE_TEXTURE_ABGR,
134 GLES2_IMAGESOURCE_TEXTURE_ARGB,
135 GLES2_IMAGESOURCE_TEXTURE_RGB,
136 GLES2_IMAGESOURCE_TEXTURE_BGR,
137 GLES2_IMAGESOURCE_TEXTURE_YUV,
138 GLES2_IMAGESOURCE_TEXTURE_NV12,
139 GLES2_IMAGESOURCE_TEXTURE_NV21,
140 GLES2_IMAGESOURCE_TEXTURE_EXTERNAL_OES
141} GLES2_ImageSource;
142
143typedef struct
144{
145 SDL_Rect viewport;
146 bool viewport_dirty;
147 SDL_Texture *texture;
148 SDL_Texture *target;
149 SDL_BlendMode blend;
150 bool cliprect_enabled_dirty;
151 bool cliprect_enabled;
152 bool cliprect_dirty;
153 SDL_Rect cliprect;
154 bool texturing;
155 bool texturing_dirty;
156 SDL_FColor clear_color;
157 bool clear_color_dirty;
158 int drawablew;
159 int drawableh;
160 GLES2_ProgramCacheEntry *program;
161 const float *shader_params;
162 GLfloat projection[4][4];
163} GLES2_DrawStateCache;
164
165typedef struct GLES2_RenderData
166{
167 SDL_GLContext context;
168
169 bool debug_enabled;
170
171 bool GL_EXT_blend_minmax_supported;
172
173#define SDL_PROC(ret, func, params) ret (APIENTRY *func) params;
174#include "SDL_gles2funcs.h"
175#undef SDL_PROC
176 GLES2_FBOList *framebuffers;
177 GLuint window_framebuffer;
178
179 GLuint shader_id_cache[GLES2_SHADER_COUNT];
180
181 GLES2_ProgramCache program_cache;
182 Uint8 clear_r, clear_g, clear_b, clear_a;
183
184#if USE_VERTEX_BUFFER_OBJECTS
185 GLuint vertex_buffers[8];
186 size_t vertex_buffer_size[8];
187 int current_vertex_buffer;
188#endif
189
190 GLES2_DrawStateCache drawstate;
191 GLES2_ShaderIncludeType texcoord_precision_hint;
192} GLES2_RenderData;
193
194#define GLES2_MAX_CACHED_PROGRAMS 8
195
196static const char *GL_TranslateError(GLenum error)
197{
198#define GL_ERROR_TRANSLATE(e) \
199 case e: \
200 return #e;
201 switch (error) {
202 GL_ERROR_TRANSLATE(GL_INVALID_ENUM)
203 GL_ERROR_TRANSLATE(GL_INVALID_VALUE)
204 GL_ERROR_TRANSLATE(GL_INVALID_OPERATION)
205 GL_ERROR_TRANSLATE(GL_OUT_OF_MEMORY)
206 GL_ERROR_TRANSLATE(GL_NO_ERROR)
207 default:
208 return "UNKNOWN";
209 }
210#undef GL_ERROR_TRANSLATE
211}
212
213static void GL_ClearErrors(SDL_Renderer *renderer)
214{
215 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
216
217 if (!data->debug_enabled) {
218 return;
219 }
220 while (data->glGetError() != GL_NO_ERROR) {
221 // continue;
222 }
223}
224
225static bool GL_CheckAllErrors(const char *prefix, SDL_Renderer *renderer, const char *file, int line, const char *function)
226{
227 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
228 bool result = true;
229
230 if (!data->debug_enabled) {
231 return true;
232 }
233 // check gl errors (can return multiple errors)
234 for (;;) {
235 GLenum error = data->glGetError();
236 if (error != GL_NO_ERROR) {
237 if (!prefix || prefix[0] == '\0') {
238 prefix = "generic";
239 }
240 SDL_SetError("%s: %s (%d): %s %s (0x%X)", prefix, file, line, function, GL_TranslateError(error), error);
241 result = false;
242 } else {
243 break;
244 }
245 }
246 return result;
247}
248
249#if 0
250#define GL_CheckError(prefix, renderer)
251#else
252#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, SDL_FILE, SDL_LINE, SDL_FUNCTION)
253#endif
254
255/*************************************************************************************************
256 * Renderer state APIs *
257 *************************************************************************************************/
258
259static bool GLES2_LoadFunctions(GLES2_RenderData *data)
260{
261#ifdef SDL_VIDEO_DRIVER_UIKIT
262#define __SDL_NOGETPROCADDR__
263#elif defined(SDL_VIDEO_DRIVER_ANDROID)
264#define __SDL_NOGETPROCADDR__
265#endif
266
267#if defined __SDL_NOGETPROCADDR__
268#define SDL_PROC(ret, func, params) data->func = func;
269#else
270#define SDL_PROC(ret, func, params) \
271 do { \
272 data->func = (ret (APIENTRY *) params)SDL_GL_GetProcAddress(#func); \
273 if (!data->func) { \
274 return SDL_SetError("Couldn't load GLES2 function %s: %s", #func, SDL_GetError()); \
275 } \
276 } while (0);
277#endif // __SDL_NOGETPROCADDR__
278
279#include "SDL_gles2funcs.h"
280#undef SDL_PROC
281 return true;
282}
283
284static GLES2_FBOList *GLES2_GetFBO(GLES2_RenderData *data, Uint32 w, Uint32 h)
285{
286 GLES2_FBOList *result = data->framebuffers;
287 while ((result) && ((result->w != w) || (result->h != h))) {
288 result = result->next;
289 }
290 if (!result) {
291 result = (GLES2_FBOList *)SDL_malloc(sizeof(GLES2_FBOList));
292 result->w = w;
293 result->h = h;
294 data->glGenFramebuffers(1, &result->FBO);
295 result->next = data->framebuffers;
296 data->framebuffers = result;
297 }
298 return result;
299}
300
301static bool GLES2_ActivateRenderer(SDL_Renderer *renderer)
302{
303 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
304
305 if (SDL_GL_GetCurrentContext() != data->context) {
306 // Null out the current program to ensure we set it again
307 data->drawstate.program = NULL;
308
309 if (!SDL_GL_MakeCurrent(renderer->window, data->context)) {
310 return false;
311 }
312 }
313
314 GL_ClearErrors(renderer);
315
316 return true;
317}
318
319static void GLES2_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
320{
321 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
322
323 if (event->type == SDL_EVENT_WINDOW_MINIMIZED) {
324 // According to Apple documentation, we need to finish drawing NOW!
325 data->glFinish();
326 }
327}
328
329static GLenum GetBlendFunc(SDL_BlendFactor factor)
330{
331 switch (factor) {
332 case SDL_BLENDFACTOR_ZERO:
333 return GL_ZERO;
334 case SDL_BLENDFACTOR_ONE:
335 return GL_ONE;
336 case SDL_BLENDFACTOR_SRC_COLOR:
337 return GL_SRC_COLOR;
338 case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
339 return GL_ONE_MINUS_SRC_COLOR;
340 case SDL_BLENDFACTOR_SRC_ALPHA:
341 return GL_SRC_ALPHA;
342 case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
343 return GL_ONE_MINUS_SRC_ALPHA;
344 case SDL_BLENDFACTOR_DST_COLOR:
345 return GL_DST_COLOR;
346 case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
347 return GL_ONE_MINUS_DST_COLOR;
348 case SDL_BLENDFACTOR_DST_ALPHA:
349 return GL_DST_ALPHA;
350 case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
351 return GL_ONE_MINUS_DST_ALPHA;
352 default:
353 return GL_INVALID_ENUM;
354 }
355}
356
357static GLenum GetBlendEquation(SDL_BlendOperation operation)
358{
359 switch (operation) {
360 case SDL_BLENDOPERATION_ADD:
361 return GL_FUNC_ADD;
362 case SDL_BLENDOPERATION_SUBTRACT:
363 return GL_FUNC_SUBTRACT;
364 case SDL_BLENDOPERATION_REV_SUBTRACT:
365 return GL_FUNC_REVERSE_SUBTRACT;
366 case SDL_BLENDOPERATION_MINIMUM:
367 return GL_MIN_EXT;
368 case SDL_BLENDOPERATION_MAXIMUM:
369 return GL_MAX_EXT;
370 default:
371 return GL_INVALID_ENUM;
372 }
373}
374
375static bool GLES2_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
376{
377 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
378
379 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
380 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
381 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
382 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
383 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
384 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
385
386 if (GetBlendFunc(srcColorFactor) == GL_INVALID_ENUM ||
387 GetBlendFunc(srcAlphaFactor) == GL_INVALID_ENUM ||
388 GetBlendEquation(colorOperation) == GL_INVALID_ENUM ||
389 GetBlendFunc(dstColorFactor) == GL_INVALID_ENUM ||
390 GetBlendFunc(dstAlphaFactor) == GL_INVALID_ENUM ||
391 GetBlendEquation(alphaOperation) == GL_INVALID_ENUM) {
392 return false;
393 }
394
395 if (colorOperation == SDL_BLENDOPERATION_MINIMUM && !data->GL_EXT_blend_minmax_supported) {
396 return false;
397 }
398 if (colorOperation == SDL_BLENDOPERATION_MAXIMUM && !data->GL_EXT_blend_minmax_supported) {
399 return false;
400 }
401
402 return true;
403}
404
405static GLES2_ProgramCacheEntry *GLES2_CacheProgram(GLES2_RenderData *data, GLuint vertex, GLuint fragment)
406{
407 GLES2_ProgramCacheEntry *entry;
408 GLint linkSuccessful;
409 int i;
410
411 // Check if we've already cached this program
412 entry = data->program_cache.head;
413 while (entry) {
414 if (entry->vertex_shader == vertex && entry->fragment_shader == fragment) {
415 break;
416 }
417 entry = entry->next;
418 }
419 if (entry) {
420 if (data->program_cache.head != entry) {
421 if (entry->next) {
422 entry->next->prev = entry->prev;
423 }
424 if (entry->prev) {
425 entry->prev->next = entry->next;
426 }
427 entry->prev = NULL;
428 entry->next = data->program_cache.head;
429 data->program_cache.head->prev = entry;
430 data->program_cache.head = entry;
431 }
432 return entry;
433 }
434
435 // Create a program cache entry
436 entry = (GLES2_ProgramCacheEntry *)SDL_calloc(1, sizeof(GLES2_ProgramCacheEntry));
437 if (!entry) {
438 return NULL;
439 }
440 entry->vertex_shader = vertex;
441 entry->fragment_shader = fragment;
442
443 // Create the program and link it
444 entry->id = data->glCreateProgram();
445 data->glAttachShader(entry->id, vertex);
446 data->glAttachShader(entry->id, fragment);
447 data->glBindAttribLocation(entry->id, GLES2_ATTRIBUTE_POSITION, "a_position");
448 data->glBindAttribLocation(entry->id, GLES2_ATTRIBUTE_COLOR, "a_color");
449 data->glBindAttribLocation(entry->id, GLES2_ATTRIBUTE_TEXCOORD, "a_texCoord");
450 data->glLinkProgram(entry->id);
451 data->glGetProgramiv(entry->id, GL_LINK_STATUS, &linkSuccessful);
452 if (!linkSuccessful) {
453 data->glDeleteProgram(entry->id);
454 SDL_free(entry);
455 SDL_SetError("Failed to link shader program");
456 return NULL;
457 }
458
459 // Predetermine locations of uniform variables
460 for (i = 0; i < NUM_GLES2_UNIFORMS; ++i) {
461 entry->uniform_locations[i] = data->glGetUniformLocation(entry->id, GLES2_UniformNames[i]);
462 }
463
464 data->glUseProgram(entry->id);
465 if (entry->uniform_locations[GLES2_UNIFORM_TEXTURE_V] != -1) {
466 data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_TEXTURE_V], 2); // always texture unit 2.
467 }
468 if (entry->uniform_locations[GLES2_UNIFORM_TEXTURE_U] != -1) {
469 data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_TEXTURE_U], 1); // always texture unit 1.
470 }
471 if (entry->uniform_locations[GLES2_UNIFORM_TEXTURE] != -1) {
472 data->glUniform1i(entry->uniform_locations[GLES2_UNIFORM_TEXTURE], 0); // always texture unit 0.
473 }
474 if (entry->uniform_locations[GLES2_UNIFORM_PROJECTION] != -1) {
475 data->glUniformMatrix4fv(entry->uniform_locations[GLES2_UNIFORM_PROJECTION], 1, GL_FALSE, (GLfloat *)entry->projection);
476 }
477
478 // Cache the linked program
479 if (data->program_cache.head) {
480 entry->next = data->program_cache.head;
481 data->program_cache.head->prev = entry;
482 } else {
483 data->program_cache.tail = entry;
484 }
485 data->program_cache.head = entry;
486 ++data->program_cache.count;
487
488 // Evict the last entry from the cache if we exceed the limit
489 if (data->program_cache.count > GLES2_MAX_CACHED_PROGRAMS) {
490 data->glDeleteProgram(data->program_cache.tail->id);
491 data->program_cache.tail = data->program_cache.tail->prev;
492 if (data->program_cache.tail) {
493 SDL_free(data->program_cache.tail->next);
494 data->program_cache.tail->next = NULL;
495 }
496 --data->program_cache.count;
497 }
498 return entry;
499}
500
501static GLuint GLES2_CacheShader(GLES2_RenderData *data, GLES2_ShaderType type, GLenum shader_type)
502{
503 GLuint id = 0;
504 GLint compileSuccessful = GL_FALSE;
505 int attempt, num_src;
506 const GLchar *shader_src_list[3];
507 const GLchar *shader_body = GLES2_GetShader(type);
508
509 if (!shader_body) {
510 SDL_SetError("No shader body src");
511 return true;
512 }
513
514 for (attempt = 0; attempt < 2 && !compileSuccessful; ++attempt) {
515 num_src = 0;
516
517 shader_src_list[num_src++] = GLES2_GetShaderPrologue(type);
518
519 if (shader_type == GL_FRAGMENT_SHADER) {
520 if (attempt == 0) {
521 shader_src_list[num_src++] = GLES2_GetShaderInclude(data->texcoord_precision_hint);
522 } else {
523 shader_src_list[num_src++] = GLES2_GetShaderInclude(GLES2_SHADER_FRAGMENT_INCLUDE_UNDEF_PRECISION);
524 }
525 }
526
527 shader_src_list[num_src++] = shader_body;
528
529 SDL_assert(num_src <= SDL_arraysize(shader_src_list));
530
531#ifdef DEBUG_PRINT_SHADERS
532 {
533 int i;
534 char *message = NULL;
535
536 SDL_asprintf(&message, "Compiling shader:\n");
537 for (i = 0; i < num_src; ++i) {
538 char *last_message = message;
539 SDL_asprintf(&message, "%s%s", last_message, shader_src_list[i]);
540 SDL_free(last_message);
541 }
542 SDL_Log("%s", message);
543 SDL_free(message);
544 }
545#endif
546
547 // Compile
548 id = data->glCreateShader(shader_type);
549 data->glShaderSource(id, num_src, shader_src_list, NULL);
550 data->glCompileShader(id);
551 data->glGetShaderiv(id, GL_COMPILE_STATUS, &compileSuccessful);
552 }
553
554 if (!compileSuccessful) {
555 char *info = NULL;
556 int length = 0;
557
558 data->glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);
559 if (length > 0) {
560 info = (char *)SDL_malloc(length);
561 if (info) {
562 data->glGetShaderInfoLog(id, length, &length, info);
563 }
564 }
565 if (info) {
566 SDL_SetError("Failed to load the shader %d: %s", type, info);
567 SDL_free(info);
568 } else {
569 SDL_SetError("Failed to load the shader %d", type);
570 }
571 data->glDeleteShader(id);
572 return true;
573 }
574
575 // Cache
576 data->shader_id_cache[(Uint32)type] = id;
577
578 return id;
579}
580
581static bool GLES2_CacheShaders(GLES2_RenderData *data)
582{
583 int shader;
584
585 data->texcoord_precision_hint = GLES2_GetTexCoordPrecisionEnumFromHint();
586
587 for (shader = 0; shader < GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES; ++shader) {
588 GLenum shader_type;
589
590 if (shader == GLES2_SHADER_VERTEX_DEFAULT) {
591 shader_type = GL_VERTEX_SHADER;
592 } else {
593 shader_type = GL_FRAGMENT_SHADER;
594 }
595 if (!GLES2_CacheShader(data, (GLES2_ShaderType)shader, shader_type)) {
596 return false;
597 }
598 }
599 return true;
600}
601
602static bool GLES2_SelectProgram(GLES2_RenderData *data, GLES2_ImageSource source, SDL_Colorspace colorspace)
603{
604 GLuint vertex;
605 GLuint fragment;
606 GLES2_ShaderType vtype, ftype;
607 GLES2_ProgramCacheEntry *program;
608 const float *shader_params = NULL;
609
610 // Select an appropriate shader pair for the specified modes
611 vtype = GLES2_SHADER_VERTEX_DEFAULT;
612 switch (source) {
613 case GLES2_IMAGESOURCE_SOLID:
614 ftype = GLES2_SHADER_FRAGMENT_SOLID;
615 break;
616 case GLES2_IMAGESOURCE_TEXTURE_ABGR:
617 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_ABGR;
618 break;
619 case GLES2_IMAGESOURCE_TEXTURE_ARGB:
620 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_ARGB;
621 break;
622 case GLES2_IMAGESOURCE_TEXTURE_RGB:
623 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_RGB;
624 break;
625 case GLES2_IMAGESOURCE_TEXTURE_BGR:
626 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_BGR;
627 break;
628#ifdef SDL_HAVE_YUV
629 case GLES2_IMAGESOURCE_TEXTURE_YUV:
630 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_YUV;
631 shader_params = SDL_GetYCbCRtoRGBConversionMatrix(colorspace, 0, 0, 8);
632 if (!shader_params) {
633 SDL_SetError("Unsupported YUV colorspace");
634 goto fault;
635 }
636 break;
637 case GLES2_IMAGESOURCE_TEXTURE_NV12:
638 if (SDL_GetHintBoolean("SDL_RENDER_OPENGL_NV12_RG_SHADER", false)) {
639 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RG;
640 } else {
641 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RA;
642 }
643 shader_params = SDL_GetYCbCRtoRGBConversionMatrix(colorspace, 0, 0, 8);
644 if (!shader_params) {
645 SDL_SetError("Unsupported YUV colorspace");
646 goto fault;
647 }
648 break;
649 case GLES2_IMAGESOURCE_TEXTURE_NV21:
650 if (SDL_GetHintBoolean("SDL_RENDER_OPENGL_NV12_RG_SHADER", false)) {
651 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_NV21_RG;
652 } else {
653 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_NV21_RA;
654 }
655 shader_params = SDL_GetYCbCRtoRGBConversionMatrix(colorspace, 0, 0, 8);
656 if (!shader_params) {
657 SDL_SetError("Unsupported YUV colorspace");
658 goto fault;
659 }
660 break;
661#endif // SDL_HAVE_YUV
662 case GLES2_IMAGESOURCE_TEXTURE_EXTERNAL_OES:
663 ftype = GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES;
664 break;
665 default:
666 goto fault;
667 }
668
669 // Load the requested shaders
670 vertex = data->shader_id_cache[(Uint32)vtype];
671 if (!vertex) {
672 vertex = GLES2_CacheShader(data, vtype, GL_VERTEX_SHADER);
673 if (!vertex) {
674 goto fault;
675 }
676 }
677
678 fragment = data->shader_id_cache[(Uint32)ftype];
679 if (!fragment) {
680 fragment = GLES2_CacheShader(data, ftype, GL_FRAGMENT_SHADER);
681 if (!fragment) {
682 goto fault;
683 }
684 }
685
686 // Check if we need to change programs at all
687 if (data->drawstate.program &&
688 data->drawstate.program->vertex_shader == vertex &&
689 data->drawstate.program->fragment_shader == fragment &&
690 data->drawstate.program->shader_params == shader_params) {
691 return true;
692 }
693
694 // Generate a matching program
695 program = GLES2_CacheProgram(data, vertex, fragment);
696 if (!program) {
697 goto fault;
698 }
699
700 // Select that program in OpenGL
701 data->glUseProgram(program->id);
702
703 if (shader_params && shader_params != program->shader_params) {
704 // YUV shader params are Yoffset, 0, Rcoeff, 0, Gcoeff, 0, Bcoeff, 0
705 if (program->uniform_locations[GLES2_UNIFORM_OFFSET] != -1) {
706 data->glUniform3f(program->uniform_locations[GLES2_UNIFORM_OFFSET], shader_params[0], shader_params[1], shader_params[2]);
707 }
708 if (program->uniform_locations[GLES2_UNIFORM_MATRIX] != -1) {
709 GLfloat matrix[3 * 3];
710
711 matrix[0 * 3 + 0] = shader_params[4];
712 matrix[0 * 3 + 1] = shader_params[5];
713 matrix[0 * 3 + 2] = shader_params[6];
714 matrix[1 * 3 + 0] = shader_params[8];
715 matrix[1 * 3 + 1] = shader_params[9];
716 matrix[1 * 3 + 2] = shader_params[10];
717 matrix[2 * 3 + 0] = shader_params[12];
718 matrix[2 * 3 + 1] = shader_params[13];
719 matrix[2 * 3 + 2] = shader_params[14];
720 data->glUniformMatrix3fv(program->uniform_locations[GLES2_UNIFORM_MATRIX], 1, GL_FALSE, matrix);
721 }
722 program->shader_params = shader_params;
723 }
724
725 // Set the current program
726 data->drawstate.program = program;
727
728 // Clean up and return
729 return true;
730fault:
731 data->drawstate.program = NULL;
732 return false;
733}
734
735static bool GLES2_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
736{
737 return true; // nothing to do in this backend.
738}
739
740static bool GLES2_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
741{
742 const bool colorswap = (renderer->target && (renderer->target->format == SDL_PIXELFORMAT_BGRA32 || renderer->target->format == SDL_PIXELFORMAT_BGRX32));
743 SDL_VertexSolid *verts = (SDL_VertexSolid *)SDL_AllocateRenderVertices(renderer, count * sizeof(*verts), 0, &cmd->data.draw.first);
744 int i;
745 SDL_FColor color = cmd->data.draw.color;
746 const float color_scale = cmd->data.draw.color_scale;
747
748 if (!verts) {
749 return false;
750 }
751
752 color.r *= color_scale;
753 color.g *= color_scale;
754 color.b *= color_scale;
755
756 if (colorswap) {
757 float r = color.r;
758 color.r = color.b;
759 color.b = r;
760 }
761
762 cmd->data.draw.count = count;
763 for (i = 0; i < count; i++) {
764 verts->position.x = 0.5f + points[i].x;
765 verts->position.y = 0.5f + points[i].y;
766 verts->color = color;
767 verts++;
768 }
769
770 return true;
771}
772
773static bool GLES2_QueueDrawLines(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
774{
775 const bool colorswap = (renderer->target && (renderer->target->format == SDL_PIXELFORMAT_BGRA32 || renderer->target->format == SDL_PIXELFORMAT_BGRX32));
776 int i;
777 GLfloat prevx, prevy;
778 SDL_VertexSolid *verts = (SDL_VertexSolid *)SDL_AllocateRenderVertices(renderer, count * sizeof(*verts), 0, &cmd->data.draw.first);
779 SDL_FColor color = cmd->data.draw.color;
780 const float color_scale = cmd->data.draw.color_scale;
781
782 if (!verts) {
783 return false;
784 }
785
786 color.r *= color_scale;
787 color.g *= color_scale;
788 color.b *= color_scale;
789
790 if (colorswap) {
791 float r = color.r;
792 color.r = color.b;
793 color.b = r;
794 }
795
796 cmd->data.draw.count = count;
797
798 // 0.5f offset to hit the center of the pixel.
799 prevx = 0.5f + points->x;
800 prevy = 0.5f + points->y;
801 verts->position.x = prevx;
802 verts->position.y = prevy;
803 verts->color = color;
804 verts++;
805
806 /* bump the end of each line segment out a quarter of a pixel, to provoke
807 the diamond-exit rule. Without this, you won't just drop the last
808 pixel of the last line segment, but you might also drop pixels at the
809 edge of any given line segment along the way too. */
810 for (i = 1; i < count; i++) {
811 const GLfloat xstart = prevx;
812 const GLfloat ystart = prevy;
813 const GLfloat xend = points[i].x + 0.5f; // 0.5f to hit pixel center.
814 const GLfloat yend = points[i].y + 0.5f;
815 // bump a little in the direction we are moving in.
816 const GLfloat deltax = xend - xstart;
817 const GLfloat deltay = yend - ystart;
818 const GLfloat angle = SDL_atan2f(deltay, deltax);
819 prevx = xend + (SDL_cosf(angle) * 0.25f);
820 prevy = yend + (SDL_sinf(angle) * 0.25f);
821 verts->position.x = prevx;
822 verts->position.y = prevy;
823 verts->color = color;
824 verts++;
825 }
826
827 return true;
828}
829
830static bool GLES2_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
831 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
832 int num_vertices, const void *indices, int num_indices, int size_indices,
833 float scale_x, float scale_y)
834{
835 int i;
836 const bool colorswap = (renderer->target && (renderer->target->format == SDL_PIXELFORMAT_BGRA32 || renderer->target->format == SDL_PIXELFORMAT_BGRX32));
837 int count = indices ? num_indices : num_vertices;
838 const float color_scale = cmd->data.draw.color_scale;
839
840 cmd->data.draw.count = count;
841 size_indices = indices ? size_indices : 0;
842
843 if (texture) {
844 SDL_Vertex *verts = (SDL_Vertex *)SDL_AllocateRenderVertices(renderer, count * sizeof(*verts), 0, &cmd->data.draw.first);
845 if (!verts) {
846 return false;
847 }
848
849 for (i = 0; i < count; i++) {
850 int j;
851 float *xy_;
852 SDL_FColor col_;
853 float *uv_;
854 if (size_indices == 4) {
855 j = ((const Uint32 *)indices)[i];
856 } else if (size_indices == 2) {
857 j = ((const Uint16 *)indices)[i];
858 } else if (size_indices == 1) {
859 j = ((const Uint8 *)indices)[i];
860 } else {
861 j = i;
862 }
863
864 xy_ = (float *)((char *)xy + j * xy_stride);
865 col_ = *(SDL_FColor *)((char *)color + j * color_stride);
866 uv_ = (float *)((char *)uv + j * uv_stride);
867
868 verts->position.x = xy_[0] * scale_x;
869 verts->position.y = xy_[1] * scale_y;
870
871 col_.r *= color_scale;
872 col_.g *= color_scale;
873 col_.b *= color_scale;
874
875 if (colorswap) {
876 float r = col_.r;
877 col_.r = col_.b;
878 col_.b = r;
879 }
880
881 verts->color = col_;
882 verts->tex_coord.x = uv_[0];
883 verts->tex_coord.y = uv_[1];
884 verts++;
885 }
886
887 } else {
888 SDL_VertexSolid *verts = (SDL_VertexSolid *)SDL_AllocateRenderVertices(renderer, count * sizeof(*verts), 0, &cmd->data.draw.first);
889 if (!verts) {
890 return false;
891 }
892
893 for (i = 0; i < count; i++) {
894 int j;
895 float *xy_;
896 SDL_FColor col_;
897
898 if (size_indices == 4) {
899 j = ((const Uint32 *)indices)[i];
900 } else if (size_indices == 2) {
901 j = ((const Uint16 *)indices)[i];
902 } else if (size_indices == 1) {
903 j = ((const Uint8 *)indices)[i];
904 } else {
905 j = i;
906 }
907
908 xy_ = (float *)((char *)xy + j * xy_stride);
909 col_ = *(SDL_FColor *)((char *)color + j * color_stride);
910
911 verts->position.x = xy_[0] * scale_x;
912 verts->position.y = xy_[1] * scale_y;
913
914 col_.r *= color_scale;
915 col_.g *= color_scale;
916 col_.b *= color_scale;
917
918 if (colorswap) {
919 float r = col_.r;
920 col_.r = col_.b;
921 col_.b = r;
922 }
923
924 verts->color = col_;
925 verts++;
926 }
927 }
928
929 return true;
930}
931
932static bool SetDrawState(GLES2_RenderData *data, const SDL_RenderCommand *cmd, const GLES2_ImageSource imgsrc, void *vertices)
933{
934 SDL_Texture *texture = cmd->data.draw.texture;
935 const SDL_BlendMode blend = cmd->data.draw.blend;
936 GLES2_ProgramCacheEntry *program;
937 int stride;
938
939 SDL_assert((texture != NULL) == (imgsrc != GLES2_IMAGESOURCE_SOLID));
940
941 if (data->drawstate.viewport_dirty) {
942 const SDL_Rect *viewport = &data->drawstate.viewport;
943 data->glViewport(viewport->x,
944 data->drawstate.target ? viewport->y : (data->drawstate.drawableh - viewport->y - viewport->h),
945 viewport->w, viewport->h);
946 if (viewport->w && viewport->h) {
947 data->drawstate.projection[0][0] = 2.0f / viewport->w;
948 data->drawstate.projection[1][1] = (data->drawstate.target ? 2.0f : -2.0f) / viewport->h;
949 data->drawstate.projection[3][1] = data->drawstate.target ? -1.0f : 1.0f;
950 }
951 data->drawstate.viewport_dirty = false;
952 }
953
954 if (data->drawstate.cliprect_enabled_dirty) {
955 if (!data->drawstate.cliprect_enabled) {
956 data->glDisable(GL_SCISSOR_TEST);
957 } else {
958 data->glEnable(GL_SCISSOR_TEST);
959 }
960 data->drawstate.cliprect_enabled_dirty = false;
961 }
962
963 if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) {
964 const SDL_Rect *viewport = &data->drawstate.viewport;
965 const SDL_Rect *rect = &data->drawstate.cliprect;
966 data->glScissor(viewport->x + rect->x,
967 data->drawstate.target ? viewport->y + rect->y : data->drawstate.drawableh - viewport->y - rect->y - rect->h,
968 rect->w, rect->h);
969 data->drawstate.cliprect_dirty = false;
970 }
971
972 if (data->drawstate.texturing_dirty || ((texture != NULL) != data->drawstate.texturing)) {
973 if (!texture) {
974 data->glDisableVertexAttribArray((GLenum)GLES2_ATTRIBUTE_TEXCOORD);
975 data->drawstate.texturing = false;
976 } else {
977 data->glEnableVertexAttribArray((GLenum)GLES2_ATTRIBUTE_TEXCOORD);
978 data->drawstate.texturing = true;
979 }
980 data->drawstate.texturing_dirty = false;
981 }
982
983 if (texture) {
984 stride = sizeof(SDL_Vertex);
985 } else {
986 stride = sizeof(SDL_VertexSolid);
987 }
988
989 if (texture) {
990 SDL_Vertex *verts = (SDL_Vertex *)(((Uint8 *)vertices) + cmd->data.draw.first);
991 data->glVertexAttribPointer(GLES2_ATTRIBUTE_TEXCOORD, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)&verts->tex_coord);
992 }
993
994 if (!GLES2_SelectProgram(data, imgsrc, texture ? texture->colorspace : SDL_COLORSPACE_SRGB)) {
995 return false;
996 }
997
998 program = data->drawstate.program;
999
1000 if (program->uniform_locations[GLES2_UNIFORM_PROJECTION] != -1) {
1001 if (SDL_memcmp(program->projection, data->drawstate.projection, sizeof(data->drawstate.projection)) != 0) {
1002 data->glUniformMatrix4fv(program->uniform_locations[GLES2_UNIFORM_PROJECTION], 1, GL_FALSE, (GLfloat *)data->drawstate.projection);
1003 SDL_memcpy(program->projection, data->drawstate.projection, sizeof(data->drawstate.projection));
1004 }
1005 }
1006
1007 if (blend != data->drawstate.blend) {
1008 if (blend == SDL_BLENDMODE_NONE) {
1009 data->glDisable(GL_BLEND);
1010 } else {
1011 data->glEnable(GL_BLEND);
1012 data->glBlendFuncSeparate(GetBlendFunc(SDL_GetBlendModeSrcColorFactor(blend)),
1013 GetBlendFunc(SDL_GetBlendModeDstColorFactor(blend)),
1014 GetBlendFunc(SDL_GetBlendModeSrcAlphaFactor(blend)),
1015 GetBlendFunc(SDL_GetBlendModeDstAlphaFactor(blend)));
1016 data->glBlendEquationSeparate(GetBlendEquation(SDL_GetBlendModeColorOperation(blend)),
1017 GetBlendEquation(SDL_GetBlendModeAlphaOperation(blend)));
1018 }
1019 data->drawstate.blend = blend;
1020 }
1021
1022 // all drawing commands use this
1023 {
1024 SDL_VertexSolid *verts = (SDL_VertexSolid *)(((Uint8 *)vertices) + cmd->data.draw.first);
1025 data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)&verts->position);
1026 data->glVertexAttribPointer(GLES2_ATTRIBUTE_COLOR, 4, GL_FLOAT, GL_TRUE /* Normalized */, stride, (const GLvoid *)&verts->color);
1027 }
1028
1029 return true;
1030}
1031
1032static bool SetTextureAddressMode(GLES2_RenderData *data, GLenum textype, SDL_TextureAddressMode addressMode)
1033{
1034 switch (addressMode) {
1035 case SDL_TEXTURE_ADDRESS_CLAMP:
1036 data->glTexParameteri(textype, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1037 data->glTexParameteri(textype, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1038 break;
1039 case SDL_TEXTURE_ADDRESS_WRAP:
1040 data->glTexParameteri(textype, GL_TEXTURE_WRAP_S, GL_REPEAT);
1041 data->glTexParameteri(textype, GL_TEXTURE_WRAP_T, GL_REPEAT);
1042 break;
1043 default:
1044 return SDL_SetError("Unknown texture address mode: %d", addressMode);
1045 }
1046 return true;
1047}
1048
1049static bool SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, void *vertices)
1050{
1051 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1052 GLES2_ImageSource sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;
1053 SDL_Texture *texture = cmd->data.draw.texture;
1054 int ret;
1055
1056 // Pick an appropriate shader
1057 if (renderer->target) {
1058 // Check if we need to do color mapping between the source and render target textures
1059 if (renderer->target->format != texture->format) {
1060 switch (texture->format) {
1061 case SDL_PIXELFORMAT_BGRA32:
1062 switch (renderer->target->format) {
1063 case SDL_PIXELFORMAT_RGBA32:
1064 case SDL_PIXELFORMAT_RGBX32:
1065 sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;
1066 break;
1067 case SDL_PIXELFORMAT_BGRX32:
1068 sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;
1069 break;
1070 default:
1071 break;
1072 }
1073 break;
1074 case SDL_PIXELFORMAT_RGBA32:
1075 switch (renderer->target->format) {
1076 case SDL_PIXELFORMAT_BGRA32:
1077 case SDL_PIXELFORMAT_BGRX32:
1078 sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;
1079 break;
1080 case SDL_PIXELFORMAT_RGBX32:
1081 sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;
1082 break;
1083 default:
1084 break;
1085 }
1086 break;
1087 case SDL_PIXELFORMAT_BGRX32:
1088 switch (renderer->target->format) {
1089 case SDL_PIXELFORMAT_RGBA32:
1090 sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;
1091 break;
1092 case SDL_PIXELFORMAT_BGRA32:
1093 sourceType = GLES2_IMAGESOURCE_TEXTURE_BGR;
1094 break;
1095 case SDL_PIXELFORMAT_RGBX32:
1096 sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;
1097 break;
1098 default:
1099 break;
1100 }
1101 break;
1102 case SDL_PIXELFORMAT_RGBX32:
1103 switch (renderer->target->format) {
1104 case SDL_PIXELFORMAT_RGBA32:
1105 sourceType = GLES2_IMAGESOURCE_TEXTURE_BGR;
1106 break;
1107 case SDL_PIXELFORMAT_BGRA32:
1108 sourceType = GLES2_IMAGESOURCE_TEXTURE_RGB;
1109 break;
1110 case SDL_PIXELFORMAT_BGRX32:
1111 sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;
1112 break;
1113 default:
1114 break;
1115 }
1116 break;
1117#ifdef SDL_HAVE_YUV
1118 case SDL_PIXELFORMAT_IYUV:
1119 case SDL_PIXELFORMAT_YV12:
1120 sourceType = GLES2_IMAGESOURCE_TEXTURE_YUV;
1121 break;
1122 case SDL_PIXELFORMAT_NV12:
1123 sourceType = GLES2_IMAGESOURCE_TEXTURE_NV12;
1124 break;
1125 case SDL_PIXELFORMAT_NV21:
1126 sourceType = GLES2_IMAGESOURCE_TEXTURE_NV21;
1127 break;
1128#endif
1129 case SDL_PIXELFORMAT_EXTERNAL_OES:
1130 sourceType = GLES2_IMAGESOURCE_TEXTURE_EXTERNAL_OES;
1131 break;
1132 default:
1133 return SDL_SetError("Unsupported texture format");
1134 }
1135 } else {
1136 sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR; // Texture formats match, use the non color mapping shader (even if the formats are not ABGR)
1137 }
1138 } else {
1139 switch (texture->format) {
1140 case SDL_PIXELFORMAT_BGRA32:
1141 sourceType = GLES2_IMAGESOURCE_TEXTURE_ARGB;
1142 break;
1143 case SDL_PIXELFORMAT_RGBA32:
1144 sourceType = GLES2_IMAGESOURCE_TEXTURE_ABGR;
1145 break;
1146 case SDL_PIXELFORMAT_BGRX32:
1147 sourceType = GLES2_IMAGESOURCE_TEXTURE_RGB;
1148 break;
1149 case SDL_PIXELFORMAT_RGBX32:
1150 sourceType = GLES2_IMAGESOURCE_TEXTURE_BGR;
1151 break;
1152#ifdef SDL_HAVE_YUV
1153 case SDL_PIXELFORMAT_IYUV:
1154 case SDL_PIXELFORMAT_YV12:
1155 sourceType = GLES2_IMAGESOURCE_TEXTURE_YUV;
1156 break;
1157 case SDL_PIXELFORMAT_NV12:
1158 sourceType = GLES2_IMAGESOURCE_TEXTURE_NV12;
1159 break;
1160 case SDL_PIXELFORMAT_NV21:
1161 sourceType = GLES2_IMAGESOURCE_TEXTURE_NV21;
1162 break;
1163#endif
1164 case SDL_PIXELFORMAT_EXTERNAL_OES:
1165 sourceType = GLES2_IMAGESOURCE_TEXTURE_EXTERNAL_OES;
1166 break;
1167 default:
1168 return SDL_SetError("Unsupported texture format");
1169 }
1170 }
1171
1172 ret = SetDrawState(data, cmd, sourceType, vertices);
1173
1174 if (texture != data->drawstate.texture) {
1175 GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
1176#ifdef SDL_HAVE_YUV
1177 if (tdata->yuv) {
1178 data->glActiveTexture(GL_TEXTURE2);
1179 data->glBindTexture(tdata->texture_type, tdata->texture_v);
1180
1181 if (!SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode)) {
1182 return false;
1183 }
1184
1185 data->glActiveTexture(GL_TEXTURE1);
1186 data->glBindTexture(tdata->texture_type, tdata->texture_u);
1187
1188 if (!SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode)) {
1189 return false;
1190 }
1191
1192 data->glActiveTexture(GL_TEXTURE0);
1193 } else if (tdata->nv12) {
1194 data->glActiveTexture(GL_TEXTURE1);
1195 data->glBindTexture(tdata->texture_type, tdata->texture_u);
1196
1197 if (!SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode)) {
1198 return false;
1199 }
1200
1201 data->glActiveTexture(GL_TEXTURE0);
1202 }
1203#endif
1204 data->glBindTexture(tdata->texture_type, tdata->texture);
1205
1206 if (!SetTextureAddressMode(data, tdata->texture_type, cmd->data.draw.texture_address_mode)) {
1207 return false;
1208 }
1209
1210 data->drawstate.texture = texture;
1211 }
1212
1213 return ret;
1214}
1215
1216static void GLES2_InvalidateCachedState(SDL_Renderer *renderer)
1217{
1218 GLES2_DrawStateCache *cache = &((GLES2_RenderData *)renderer->internal)->drawstate;
1219 cache->viewport_dirty = true;
1220 cache->texture = NULL;
1221 cache->blend = SDL_BLENDMODE_INVALID;
1222 cache->cliprect_enabled_dirty = true;
1223 cache->cliprect_dirty = true;
1224 cache->texturing_dirty = true;
1225 cache->clear_color_dirty = true;
1226 cache->drawablew = 0;
1227 cache->drawableh = 0;
1228 cache->program = NULL;
1229}
1230
1231static bool GLES2_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
1232{
1233 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1234 const bool colorswap = (renderer->target && (renderer->target->format == SDL_PIXELFORMAT_BGRA32 || renderer->target->format == SDL_PIXELFORMAT_BGRX32));
1235
1236#if USE_VERTEX_BUFFER_OBJECTS
1237 const int vboidx = data->current_vertex_buffer;
1238 const GLuint vbo = data->vertex_buffers[vboidx];
1239#endif
1240
1241 if (!GLES2_ActivateRenderer(renderer)) {
1242 return false;
1243 }
1244
1245 data->drawstate.target = renderer->target;
1246 if (!data->drawstate.target) {
1247 int w, h;
1248 SDL_GetWindowSizeInPixels(renderer->window, &w, &h);
1249 if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
1250 data->drawstate.viewport_dirty = true; // if the window dimensions changed, invalidate the current viewport, etc.
1251 data->drawstate.cliprect_dirty = true;
1252 data->drawstate.drawablew = w;
1253 data->drawstate.drawableh = h;
1254 }
1255 }
1256
1257#if USE_VERTEX_BUFFER_OBJECTS
1258 // upload the new VBO data for this set of commands.
1259 data->glBindBuffer(GL_ARRAY_BUFFER, vbo);
1260 if (data->vertex_buffer_size[vboidx] < vertsize) {
1261 data->glBufferData(GL_ARRAY_BUFFER, vertsize, vertices, GL_STREAM_DRAW);
1262 data->vertex_buffer_size[vboidx] = vertsize;
1263 } else {
1264 data->glBufferSubData(GL_ARRAY_BUFFER, 0, vertsize, vertices);
1265 }
1266
1267 // cycle through a few VBOs so the GL has some time with the data before we replace it.
1268 data->current_vertex_buffer++;
1269 if (data->current_vertex_buffer >= SDL_arraysize(data->vertex_buffers)) {
1270 data->current_vertex_buffer = 0;
1271 }
1272 vertices = NULL; // attrib pointers will be offsets into the VBO.
1273#endif
1274
1275 while (cmd) {
1276 switch (cmd->command) {
1277 case SDL_RENDERCMD_SETDRAWCOLOR:
1278 {
1279 break;
1280 }
1281
1282 case SDL_RENDERCMD_SETVIEWPORT:
1283 {
1284 SDL_Rect *viewport = &data->drawstate.viewport;
1285 if (SDL_memcmp(viewport, &cmd->data.viewport.rect, sizeof(cmd->data.viewport.rect)) != 0) {
1286 SDL_copyp(viewport, &cmd->data.viewport.rect);
1287 data->drawstate.viewport_dirty = true;
1288 data->drawstate.cliprect_dirty = true;
1289 }
1290 break;
1291 }
1292
1293 case SDL_RENDERCMD_SETCLIPRECT:
1294 {
1295 const SDL_Rect *rect = &cmd->data.cliprect.rect;
1296 if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
1297 data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
1298 data->drawstate.cliprect_enabled_dirty = true;
1299 }
1300
1301 if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) {
1302 SDL_copyp(&data->drawstate.cliprect, rect);
1303 data->drawstate.cliprect_dirty = true;
1304 }
1305 break;
1306 }
1307
1308 case SDL_RENDERCMD_CLEAR:
1309 {
1310 const float r = (colorswap ? cmd->data.color.color.b : cmd->data.color.color.r) * cmd->data.color.color_scale;
1311 const float g = cmd->data.color.color.g * cmd->data.color.color_scale;
1312 const float b = (colorswap ? cmd->data.color.color.r : cmd->data.color.color.b) * cmd->data.color.color_scale;
1313 const float a = cmd->data.color.color.a;
1314 if (data->drawstate.clear_color_dirty ||
1315 (r != data->drawstate.clear_color.r) ||
1316 (g != data->drawstate.clear_color.g) ||
1317 (b != data->drawstate.clear_color.b) ||
1318 (a != data->drawstate.clear_color.a)) {
1319 data->glClearColor(r, g, b, a);
1320 data->drawstate.clear_color.r = r;
1321 data->drawstate.clear_color.g = g;
1322 data->drawstate.clear_color.b = b;
1323 data->drawstate.clear_color.a = a;
1324 data->drawstate.clear_color_dirty = false;
1325 }
1326
1327 if (data->drawstate.cliprect_enabled || data->drawstate.cliprect_enabled_dirty) {
1328 data->glDisable(GL_SCISSOR_TEST);
1329 data->drawstate.cliprect_enabled_dirty = data->drawstate.cliprect_enabled;
1330 }
1331
1332 data->glClear(GL_COLOR_BUFFER_BIT);
1333 break;
1334 }
1335
1336 case SDL_RENDERCMD_FILL_RECTS: // unused
1337 break;
1338
1339 case SDL_RENDERCMD_COPY: // unused
1340 break;
1341
1342 case SDL_RENDERCMD_COPY_EX: // unused
1343 break;
1344
1345 case SDL_RENDERCMD_DRAW_LINES:
1346 {
1347 if (SetDrawState(data, cmd, GLES2_IMAGESOURCE_SOLID, vertices)) {
1348 size_t count = cmd->data.draw.count;
1349 if (count > 2) {
1350 // joined lines cannot be grouped
1351 data->glDrawArrays(GL_LINE_STRIP, 0, (GLsizei)count);
1352 } else {
1353 // let's group non joined lines
1354 SDL_RenderCommand *finalcmd = cmd;
1355 SDL_RenderCommand *nextcmd = cmd->next;
1356 SDL_BlendMode thisblend = cmd->data.draw.blend;
1357
1358 while (nextcmd) {
1359 const SDL_RenderCommandType nextcmdtype = nextcmd->command;
1360 if (nextcmdtype != SDL_RENDERCMD_DRAW_LINES) {
1361 break; // can't go any further on this draw call, different render command up next.
1362 } else if (nextcmd->data.draw.count != 2) {
1363 break; // can't go any further on this draw call, those are joined lines
1364 } else if (nextcmd->data.draw.blend != thisblend) {
1365 break; // can't go any further on this draw call, different blendmode copy up next.
1366 } else {
1367 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
1368 count += nextcmd->data.draw.count;
1369 }
1370 nextcmd = nextcmd->next;
1371 }
1372
1373 data->glDrawArrays(GL_LINES, 0, (GLsizei)count);
1374 cmd = finalcmd; // skip any copy commands we just combined in here.
1375 }
1376 }
1377 break;
1378 }
1379
1380 case SDL_RENDERCMD_DRAW_POINTS:
1381 case SDL_RENDERCMD_GEOMETRY:
1382 {
1383 /* as long as we have the same copy command in a row, with the
1384 same texture, we can combine them all into a single draw call. */
1385 SDL_Texture *thistexture = cmd->data.draw.texture;
1386 SDL_BlendMode thisblend = cmd->data.draw.blend;
1387 const SDL_RenderCommandType thiscmdtype = cmd->command;
1388 SDL_RenderCommand *finalcmd = cmd;
1389 SDL_RenderCommand *nextcmd = cmd->next;
1390 size_t count = cmd->data.draw.count;
1391 int ret;
1392 while (nextcmd) {
1393 const SDL_RenderCommandType nextcmdtype = nextcmd->command;
1394 if (nextcmdtype != thiscmdtype) {
1395 break; // can't go any further on this draw call, different render command up next.
1396 } else if (nextcmd->data.draw.texture != thistexture || nextcmd->data.draw.blend != thisblend) {
1397 break; // can't go any further on this draw call, different texture/blendmode copy up next.
1398 } else {
1399 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
1400 count += nextcmd->data.draw.count;
1401 }
1402 nextcmd = nextcmd->next;
1403 }
1404
1405 if (thistexture) {
1406 ret = SetCopyState(renderer, cmd, vertices);
1407 } else {
1408 ret = SetDrawState(data, cmd, GLES2_IMAGESOURCE_SOLID, vertices);
1409 }
1410
1411 if (ret) {
1412 int op = GL_TRIANGLES; // SDL_RENDERCMD_GEOMETRY
1413 if (thiscmdtype == SDL_RENDERCMD_DRAW_POINTS) {
1414 op = GL_POINTS;
1415 }
1416 data->glDrawArrays(op, 0, (GLsizei)count);
1417 }
1418
1419 cmd = finalcmd; // skip any copy commands we just combined in here.
1420 break;
1421 }
1422
1423 case SDL_RENDERCMD_NO_OP:
1424 break;
1425 }
1426
1427 cmd = cmd->next;
1428 }
1429
1430 return GL_CheckError("", renderer);
1431}
1432
1433static void GLES2_DestroyRenderer(SDL_Renderer *renderer)
1434{
1435 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1436
1437 // Deallocate everything
1438 if (data) {
1439 GLES2_ActivateRenderer(renderer);
1440
1441 {
1442 int i;
1443 for (i = 0; i < GLES2_SHADER_COUNT; i++) {
1444 GLuint id = data->shader_id_cache[i];
1445 if (id) {
1446 data->glDeleteShader(id);
1447 }
1448 }
1449 }
1450 {
1451 GLES2_ProgramCacheEntry *entry;
1452 GLES2_ProgramCacheEntry *next;
1453 entry = data->program_cache.head;
1454 while (entry) {
1455 data->glDeleteProgram(entry->id);
1456 next = entry->next;
1457 SDL_free(entry);
1458 entry = next;
1459 }
1460 }
1461
1462 if (data->context) {
1463 while (data->framebuffers) {
1464 GLES2_FBOList *nextnode = data->framebuffers->next;
1465 data->glDeleteFramebuffers(1, &data->framebuffers->FBO);
1466 GL_CheckError("", renderer);
1467 SDL_free(data->framebuffers);
1468 data->framebuffers = nextnode;
1469 }
1470
1471#if USE_VERTEX_BUFFER_OBJECTS
1472 data->glDeleteBuffers(SDL_arraysize(data->vertex_buffers), data->vertex_buffers);
1473 GL_CheckError("", renderer);
1474#endif
1475
1476 SDL_GL_DestroyContext(data->context);
1477 }
1478
1479 SDL_free(data);
1480 }
1481}
1482
1483static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
1484{
1485 GLES2_RenderData *renderdata = (GLES2_RenderData *)renderer->internal;
1486 GLES2_TextureData *data;
1487 GLenum format;
1488 GLenum type;
1489 GLenum scaleMode;
1490
1491 GLES2_ActivateRenderer(renderer);
1492
1493 renderdata->drawstate.texture = NULL; // we trash this state.
1494
1495 // Determine the corresponding GLES texture format params
1496 switch (texture->format) {
1497 case SDL_PIXELFORMAT_BGRA32:
1498 case SDL_PIXELFORMAT_RGBA32:
1499 case SDL_PIXELFORMAT_BGRX32:
1500 case SDL_PIXELFORMAT_RGBX32:
1501 format = GL_RGBA;
1502 type = GL_UNSIGNED_BYTE;
1503 break;
1504#ifdef SDL_HAVE_YUV
1505 case SDL_PIXELFORMAT_IYUV:
1506 case SDL_PIXELFORMAT_YV12:
1507 case SDL_PIXELFORMAT_NV12:
1508 case SDL_PIXELFORMAT_NV21:
1509 format = GL_LUMINANCE;
1510 type = GL_UNSIGNED_BYTE;
1511 break;
1512#endif
1513#ifdef GL_TEXTURE_EXTERNAL_OES
1514 case SDL_PIXELFORMAT_EXTERNAL_OES:
1515 format = GL_NONE;
1516 type = GL_NONE;
1517 break;
1518#endif
1519 default:
1520 return SDL_SetError("Texture format not supported");
1521 }
1522
1523 if (texture->format == SDL_PIXELFORMAT_EXTERNAL_OES &&
1524 texture->access != SDL_TEXTUREACCESS_STATIC) {
1525 return SDL_SetError("Unsupported texture access for SDL_PIXELFORMAT_EXTERNAL_OES");
1526 }
1527
1528 // Allocate a texture struct
1529 data = (GLES2_TextureData *)SDL_calloc(1, sizeof(GLES2_TextureData));
1530 if (!data) {
1531 return false;
1532 }
1533 data->texture = 0;
1534#ifdef GL_TEXTURE_EXTERNAL_OES
1535 data->texture_type = (texture->format == SDL_PIXELFORMAT_EXTERNAL_OES) ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D;
1536#else
1537 data->texture_type = GL_TEXTURE_2D;
1538#endif
1539 data->pixel_format = format;
1540 data->pixel_type = type;
1541#ifdef SDL_HAVE_YUV
1542 data->yuv = ((texture->format == SDL_PIXELFORMAT_IYUV) || (texture->format == SDL_PIXELFORMAT_YV12));
1543 data->nv12 = ((texture->format == SDL_PIXELFORMAT_NV12) || (texture->format == SDL_PIXELFORMAT_NV21));
1544 data->texture_u = 0;
1545 data->texture_v = 0;
1546#endif
1547 scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? GL_NEAREST : GL_LINEAR;
1548
1549 // Allocate a blob for image renderdata
1550 if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
1551 size_t size;
1552 data->pitch = texture->w * SDL_BYTESPERPIXEL(texture->format);
1553 size = (size_t)texture->h * data->pitch;
1554#ifdef SDL_HAVE_YUV
1555 if (data->yuv) {
1556 // Need to add size for the U and V planes
1557 size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
1558 } else if (data->nv12) {
1559 // Need to add size for the U/V plane
1560 size += 2 * ((texture->h + 1) / 2) * ((data->pitch + 1) / 2);
1561 }
1562#endif
1563 data->pixel_data = SDL_calloc(1, size);
1564 if (!data->pixel_data) {
1565 SDL_free(data);
1566 return false;
1567 }
1568 }
1569
1570 // Allocate the texture
1571 GL_CheckError("", renderer);
1572
1573#ifdef SDL_HAVE_YUV
1574 if (data->yuv) {
1575 data->texture_v = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER, 0);
1576 if (data->texture_v) {
1577 data->texture_v_external = true;
1578 } else {
1579 renderdata->glGenTextures(1, &data->texture_v);
1580 if (!GL_CheckError("glGenTexures()", renderer)) {
1581 return false;
1582 }
1583 }
1584 renderdata->glActiveTexture(GL_TEXTURE2);
1585 renderdata->glBindTexture(data->texture_type, data->texture_v);
1586 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);
1587 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
1588 renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
1589 SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER, data->texture_v);
1590
1591 data->texture_u = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER, 0);
1592 if (data->texture_u) {
1593 data->texture_u_external = true;
1594 } else {
1595 renderdata->glGenTextures(1, &data->texture_u);
1596 if (!GL_CheckError("glGenTexures()", renderer)) {
1597 return false;
1598 }
1599 }
1600 renderdata->glActiveTexture(GL_TEXTURE1);
1601 renderdata->glBindTexture(data->texture_type, data->texture_u);
1602 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);
1603 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
1604 renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
1605 if (!GL_CheckError("glTexImage2D()", renderer)) {
1606 return false;
1607 }
1608 SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER, data->texture_u);
1609
1610 if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
1611 return SDL_SetError("Unsupported YUV colorspace");
1612 }
1613 } else if (data->nv12) {
1614 data->texture_u = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER, 0);
1615 if (data->texture_u) {
1616 data->texture_u_external = true;
1617 } else {
1618 renderdata->glGenTextures(1, &data->texture_u);
1619 if (!GL_CheckError("glGenTexures()", renderer)) {
1620 return false;
1621 }
1622 }
1623 renderdata->glActiveTexture(GL_TEXTURE1);
1624 renderdata->glBindTexture(data->texture_type, data->texture_u);
1625 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);
1626 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
1627 renderdata->glTexImage2D(data->texture_type, 0, GL_LUMINANCE_ALPHA, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
1628 if (!GL_CheckError("glTexImage2D()", renderer)) {
1629 return false;
1630 }
1631 SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER, data->texture_u);
1632
1633 if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
1634 return SDL_SetError("Unsupported YUV colorspace");
1635 }
1636 }
1637#endif
1638
1639 data->texture = (GLuint)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER, 0);
1640 if (data->texture) {
1641 data->texture_external = true;
1642 } else {
1643 renderdata->glGenTextures(1, &data->texture);
1644 if (!GL_CheckError("glGenTexures()", renderer)) {
1645 return false;
1646 }
1647 }
1648 texture->internal = data;
1649 renderdata->glActiveTexture(GL_TEXTURE0);
1650 renderdata->glBindTexture(data->texture_type, data->texture);
1651 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, scaleMode);
1652 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, scaleMode);
1653 if (texture->format != SDL_PIXELFORMAT_EXTERNAL_OES) {
1654 renderdata->glTexImage2D(data->texture_type, 0, format, texture->w, texture->h, 0, format, type, NULL);
1655 if (!GL_CheckError("glTexImage2D()", renderer)) {
1656 return false;
1657 }
1658 }
1659 SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER, data->texture);
1660 SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER, data->texture_type);
1661
1662 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
1663 data->fbo = GLES2_GetFBO((GLES2_RenderData *)renderer->internal, texture->w, texture->h);
1664 } else {
1665 data->fbo = NULL;
1666 }
1667
1668 return GL_CheckError("", renderer);
1669}
1670
1671static bool GLES2_TexSubImage2D(GLES2_RenderData *data, GLenum target, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels, GLint pitch, GLint bpp)
1672{
1673 Uint8 *blob = NULL;
1674 Uint8 *src;
1675 size_t src_pitch;
1676 int y;
1677
1678 if ((width == 0) || (height == 0) || (bpp == 0)) {
1679 return true; // nothing to do
1680 }
1681
1682 // Reformat the texture data into a tightly packed array
1683 src_pitch = (size_t)width * bpp;
1684 src = (Uint8 *)pixels;
1685 if ((size_t)pitch != src_pitch) {
1686 blob = (Uint8 *)SDL_malloc(src_pitch * height);
1687 if (!blob) {
1688 return false;
1689 }
1690 src = blob;
1691 for (y = 0; y < height; ++y) {
1692 SDL_memcpy(src, pixels, src_pitch);
1693 src += src_pitch;
1694 pixels = (Uint8 *)pixels + pitch;
1695 }
1696 src = blob;
1697 }
1698
1699 data->glTexSubImage2D(target, 0, xoffset, yoffset, width, height, format, type, src);
1700 if (blob) {
1701 SDL_free(blob);
1702 }
1703 return true;
1704}
1705
1706static bool GLES2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect,
1707 const void *pixels, int pitch)
1708{
1709 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1710 GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
1711
1712 GLES2_ActivateRenderer(renderer);
1713
1714 // Bail out if we're supposed to update an empty rectangle
1715 if (rect->w <= 0 || rect->h <= 0) {
1716 return true;
1717 }
1718
1719 data->drawstate.texture = NULL; // we trash this state.
1720
1721 // Create a texture subimage with the supplied data
1722 data->glBindTexture(tdata->texture_type, tdata->texture);
1723 GLES2_TexSubImage2D(data, tdata->texture_type,
1724 rect->x,
1725 rect->y,
1726 rect->w,
1727 rect->h,
1728 tdata->pixel_format,
1729 tdata->pixel_type,
1730 pixels, pitch, SDL_BYTESPERPIXEL(texture->format));
1731
1732#ifdef SDL_HAVE_YUV
1733 if (tdata->yuv) {
1734 // Skip to the correct offset into the next texture
1735 pixels = (const void *)((const Uint8 *)pixels + rect->h * pitch);
1736 if (texture->format == SDL_PIXELFORMAT_YV12) {
1737 data->glBindTexture(tdata->texture_type, tdata->texture_v);
1738 } else {
1739 data->glBindTexture(tdata->texture_type, tdata->texture_u);
1740 }
1741 GLES2_TexSubImage2D(data, tdata->texture_type,
1742 rect->x / 2,
1743 rect->y / 2,
1744 (rect->w + 1) / 2,
1745 (rect->h + 1) / 2,
1746 tdata->pixel_format,
1747 tdata->pixel_type,
1748 pixels, (pitch + 1) / 2, 1);
1749
1750 // Skip to the correct offset into the next texture
1751 pixels = (const void *)((const Uint8 *)pixels + ((rect->h + 1) / 2) * ((pitch + 1) / 2));
1752 if (texture->format == SDL_PIXELFORMAT_YV12) {
1753 data->glBindTexture(tdata->texture_type, tdata->texture_u);
1754 } else {
1755 data->glBindTexture(tdata->texture_type, tdata->texture_v);
1756 }
1757 GLES2_TexSubImage2D(data, tdata->texture_type,
1758 rect->x / 2,
1759 rect->y / 2,
1760 (rect->w + 1) / 2,
1761 (rect->h + 1) / 2,
1762 tdata->pixel_format,
1763 tdata->pixel_type,
1764 pixels, (pitch + 1) / 2, 1);
1765 } else if (tdata->nv12) {
1766 // Skip to the correct offset into the next texture
1767 pixels = (const void *)((const Uint8 *)pixels + rect->h * pitch);
1768 data->glBindTexture(tdata->texture_type, tdata->texture_u);
1769 GLES2_TexSubImage2D(data, tdata->texture_type,
1770 rect->x / 2,
1771 rect->y / 2,
1772 (rect->w + 1) / 2,
1773 (rect->h + 1) / 2,
1774 GL_LUMINANCE_ALPHA,
1775 GL_UNSIGNED_BYTE,
1776 pixels, 2 * ((pitch + 1) / 2), 2);
1777 }
1778#endif
1779
1780 return GL_CheckError("glTexSubImage2D()", renderer);
1781}
1782
1783#ifdef SDL_HAVE_YUV
1784static bool GLES2_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
1785 const SDL_Rect *rect,
1786 const Uint8 *Yplane, int Ypitch,
1787 const Uint8 *Uplane, int Upitch,
1788 const Uint8 *Vplane, int Vpitch)
1789{
1790 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1791 GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
1792
1793 GLES2_ActivateRenderer(renderer);
1794
1795 // Bail out if we're supposed to update an empty rectangle
1796 if (rect->w <= 0 || rect->h <= 0) {
1797 return true;
1798 }
1799
1800 data->drawstate.texture = NULL; // we trash this state.
1801
1802 data->glBindTexture(tdata->texture_type, tdata->texture_v);
1803 GLES2_TexSubImage2D(data, tdata->texture_type,
1804 rect->x / 2,
1805 rect->y / 2,
1806 (rect->w + 1) / 2,
1807 (rect->h + 1) / 2,
1808 tdata->pixel_format,
1809 tdata->pixel_type,
1810 Vplane, Vpitch, 1);
1811
1812 data->glBindTexture(tdata->texture_type, tdata->texture_u);
1813 GLES2_TexSubImage2D(data, tdata->texture_type,
1814 rect->x / 2,
1815 rect->y / 2,
1816 (rect->w + 1) / 2,
1817 (rect->h + 1) / 2,
1818 tdata->pixel_format,
1819 tdata->pixel_type,
1820 Uplane, Upitch, 1);
1821
1822 data->glBindTexture(tdata->texture_type, tdata->texture);
1823 GLES2_TexSubImage2D(data, tdata->texture_type,
1824 rect->x,
1825 rect->y,
1826 rect->w,
1827 rect->h,
1828 tdata->pixel_format,
1829 tdata->pixel_type,
1830 Yplane, Ypitch, 1);
1831
1832 return GL_CheckError("glTexSubImage2D()", renderer);
1833}
1834
1835static bool GLES2_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
1836 const SDL_Rect *rect,
1837 const Uint8 *Yplane, int Ypitch,
1838 const Uint8 *UVplane, int UVpitch)
1839{
1840 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1841 GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
1842
1843 GLES2_ActivateRenderer(renderer);
1844
1845 // Bail out if we're supposed to update an empty rectangle
1846 if (rect->w <= 0 || rect->h <= 0) {
1847 return true;
1848 }
1849
1850 data->drawstate.texture = NULL; // we trash this state.
1851
1852 data->glBindTexture(tdata->texture_type, tdata->texture_u);
1853 GLES2_TexSubImage2D(data, tdata->texture_type,
1854 rect->x / 2,
1855 rect->y / 2,
1856 (rect->w + 1) / 2,
1857 (rect->h + 1) / 2,
1858 GL_LUMINANCE_ALPHA,
1859 GL_UNSIGNED_BYTE,
1860 UVplane, UVpitch, 2);
1861
1862 data->glBindTexture(tdata->texture_type, tdata->texture);
1863 GLES2_TexSubImage2D(data, tdata->texture_type,
1864 rect->x,
1865 rect->y,
1866 rect->w,
1867 rect->h,
1868 tdata->pixel_format,
1869 tdata->pixel_type,
1870 Yplane, Ypitch, 1);
1871
1872 return GL_CheckError("glTexSubImage2D()", renderer);
1873}
1874#endif
1875
1876static bool GLES2_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect,
1877 void **pixels, int *pitch)
1878{
1879 GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
1880
1881 // Retrieve the buffer/pitch for the specified region
1882 *pixels = (Uint8 *)tdata->pixel_data +
1883 (tdata->pitch * rect->y) +
1884 (rect->x * SDL_BYTESPERPIXEL(texture->format));
1885 *pitch = tdata->pitch;
1886
1887 return true;
1888}
1889
1890static void GLES2_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1891{
1892 GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
1893 SDL_Rect rect;
1894
1895 // We do whole texture updates, at least for now
1896 rect.x = 0;
1897 rect.y = 0;
1898 rect.w = texture->w;
1899 rect.h = texture->h;
1900 GLES2_UpdateTexture(renderer, texture, &rect, tdata->pixel_data, tdata->pitch);
1901}
1902
1903static void GLES2_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
1904{
1905 GLES2_RenderData *renderdata = (GLES2_RenderData *)renderer->internal;
1906 GLES2_TextureData *data = (GLES2_TextureData *)texture->internal;
1907 GLenum glScaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? GL_NEAREST : GL_LINEAR;
1908
1909#ifdef SDL_HAVE_YUV
1910 if (data->yuv) {
1911 renderdata->glActiveTexture(GL_TEXTURE2);
1912 renderdata->glBindTexture(data->texture_type, data->texture_v);
1913 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, glScaleMode);
1914 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, glScaleMode);
1915
1916 renderdata->glActiveTexture(GL_TEXTURE1);
1917 renderdata->glBindTexture(data->texture_type, data->texture_u);
1918 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, glScaleMode);
1919 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, glScaleMode);
1920 } else if (data->nv12) {
1921 renderdata->glActiveTexture(GL_TEXTURE1);
1922 renderdata->glBindTexture(data->texture_type, data->texture_u);
1923 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, glScaleMode);
1924 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, glScaleMode);
1925 }
1926#endif
1927
1928 renderdata->glActiveTexture(GL_TEXTURE0);
1929 renderdata->glBindTexture(data->texture_type, data->texture);
1930 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MIN_FILTER, glScaleMode);
1931 renderdata->glTexParameteri(data->texture_type, GL_TEXTURE_MAG_FILTER, glScaleMode);
1932}
1933
1934static bool GLES2_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
1935{
1936 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1937 GLES2_TextureData *texturedata = NULL;
1938 GLenum status;
1939
1940 data->drawstate.viewport_dirty = true;
1941
1942 if (!texture) {
1943 data->glBindFramebuffer(GL_FRAMEBUFFER, data->window_framebuffer);
1944 } else {
1945 texturedata = (GLES2_TextureData *)texture->internal;
1946 data->glBindFramebuffer(GL_FRAMEBUFFER, texturedata->fbo->FBO);
1947 // TODO: check if texture pixel format allows this operation
1948 data->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texturedata->texture_type, texturedata->texture, 0);
1949 // Check FBO status
1950 status = data->glCheckFramebufferStatus(GL_FRAMEBUFFER);
1951 if (status != GL_FRAMEBUFFER_COMPLETE) {
1952 return SDL_SetError("glFramebufferTexture2D() failed");
1953 }
1954 }
1955 return true;
1956}
1957
1958static void GLES2_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1959{
1960 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1961 GLES2_TextureData *tdata = (GLES2_TextureData *)texture->internal;
1962
1963 GLES2_ActivateRenderer(renderer);
1964
1965 if (data->drawstate.texture == texture) {
1966 data->drawstate.texture = NULL;
1967 }
1968 if (data->drawstate.target == texture) {
1969 data->drawstate.target = NULL;
1970 }
1971
1972 // Destroy the texture
1973 if (tdata) {
1974 if (tdata->texture && !tdata->texture_external) {
1975 data->glDeleteTextures(1, &tdata->texture);
1976 }
1977#ifdef SDL_HAVE_YUV
1978 if (tdata->texture_v && !tdata->texture_v_external) {
1979 data->glDeleteTextures(1, &tdata->texture_v);
1980 }
1981 if (tdata->texture_u && !tdata->texture_u_external) {
1982 data->glDeleteTextures(1, &tdata->texture_u);
1983 }
1984#endif
1985 SDL_free(tdata->pixel_data);
1986 SDL_free(tdata);
1987 texture->internal = NULL;
1988 }
1989}
1990
1991static SDL_Surface *GLES2_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
1992{
1993 GLES2_RenderData *data = (GLES2_RenderData *)renderer->internal;
1994 SDL_PixelFormat format = renderer->target ? renderer->target->format : SDL_PIXELFORMAT_RGBA32;
1995 SDL_Surface *surface;
1996
1997 surface = SDL_CreateSurface(rect->w, rect->h, format);
1998 if (!surface) {
1999 return NULL;
2000 }
2001
2002 int y = rect->y;
2003 if (!renderer->target) {
2004 int w, h;
2005 SDL_GetRenderOutputSize(renderer, &w, &h);
2006 y = (h - y) - rect->h;
2007 }
2008
2009 data->glReadPixels(rect->x, y, rect->w, rect->h, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);
2010 if (!GL_CheckError("glReadPixels()", renderer)) {
2011 SDL_DestroySurface(surface);
2012 return NULL;
2013 }
2014
2015 // Flip the rows to be top-down if necessary
2016 if (!renderer->target) {
2017 SDL_FlipSurface(surface, SDL_FLIP_VERTICAL);
2018 }
2019 return surface;
2020}
2021
2022static bool GLES2_RenderPresent(SDL_Renderer *renderer)
2023{
2024 // Tell the video driver to swap buffers
2025 return SDL_GL_SwapWindow(renderer->window);
2026}
2027
2028static bool GLES2_SetVSync(SDL_Renderer *renderer, const int vsync)
2029{
2030 int interval = 0;
2031
2032 if (!SDL_GL_SetSwapInterval(vsync)) {
2033 return false;
2034 }
2035
2036 if (!SDL_GL_GetSwapInterval(&interval)) {
2037 return false;
2038 }
2039
2040 if (interval != vsync) {
2041 return SDL_Unsupported();
2042 }
2043 return true;
2044}
2045
2046/*************************************************************************************************
2047 * Renderer instantiation *
2048 *************************************************************************************************/
2049
2050static bool GLES2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
2051{
2052 GLES2_RenderData *data = NULL;
2053 SDL_WindowFlags window_flags = 0; // -Wconditional-uninitialized
2054 GLint window_framebuffer;
2055 GLint value;
2056 int profile_mask = 0, major = 0, minor = 0;
2057 bool changed_window = false;
2058
2059 if (!SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profile_mask)) {
2060 goto error;
2061 }
2062 if (!SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major)) {
2063 goto error;
2064 }
2065 if (!SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor)) {
2066 goto error;
2067 }
2068
2069 SDL_SyncWindow(window);
2070 window_flags = SDL_GetWindowFlags(window);
2071
2072 // OpenGL ES 3.0 is a superset of OpenGL ES 2.0
2073 if (!(window_flags & SDL_WINDOW_OPENGL) ||
2074 profile_mask != SDL_GL_CONTEXT_PROFILE_ES || major < RENDERER_CONTEXT_MAJOR) {
2075
2076 changed_window = true;
2077 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
2078 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);
2079 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);
2080
2081 if (!SDL_RecreateWindow(window, (window_flags & ~(SDL_WINDOW_VULKAN | SDL_WINDOW_METAL)) | SDL_WINDOW_OPENGL)) {
2082 goto error;
2083 }
2084 }
2085
2086 SDL_SetupRendererColorspace(renderer, create_props);
2087
2088 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
2089 SDL_SetError("Unsupported output colorspace");
2090 goto error;
2091 }
2092
2093 data = (GLES2_RenderData *)SDL_calloc(1, sizeof(GLES2_RenderData));
2094 if (!data) {
2095 goto error;
2096 }
2097 renderer->internal = data;
2098 GLES2_InvalidateCachedState(renderer);
2099 renderer->window = window;
2100
2101 renderer->name = GLES2_RenderDriver.name;
2102 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA32);
2103 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA32);
2104 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX32);
2105 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX32);
2106
2107 // Create an OpenGL ES 2.0 context
2108 data->context = SDL_GL_CreateContext(window);
2109 if (!data->context) {
2110 goto error;
2111 }
2112 if (!SDL_GL_MakeCurrent(window, data->context)) {
2113 goto error;
2114 }
2115
2116 if (!GLES2_LoadFunctions(data)) {
2117 goto error;
2118 }
2119
2120 if (!GLES2_CacheShaders(data)) {
2121 goto error;
2122 }
2123
2124 // Check for debug output support
2125 if (SDL_GL_GetAttribute(SDL_GL_CONTEXT_FLAGS, &value) &&
2126 (value & SDL_GL_CONTEXT_DEBUG_FLAG)) {
2127 data->debug_enabled = true;
2128 }
2129
2130 value = 0;
2131 data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
2132 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, value);
2133
2134#if USE_VERTEX_BUFFER_OBJECTS
2135 // we keep a few of these and cycle through them, so data can live for a few frames.
2136 data->glGenBuffers(SDL_arraysize(data->vertex_buffers), data->vertex_buffers);
2137#endif
2138
2139 data->framebuffers = NULL;
2140 data->glGetIntegerv(GL_FRAMEBUFFER_BINDING, &window_framebuffer);
2141 data->window_framebuffer = (GLuint)window_framebuffer;
2142
2143 // Populate the function pointers for the module
2144 renderer->WindowEvent = GLES2_WindowEvent;
2145 renderer->SupportsBlendMode = GLES2_SupportsBlendMode;
2146 renderer->CreateTexture = GLES2_CreateTexture;
2147 renderer->UpdateTexture = GLES2_UpdateTexture;
2148#ifdef SDL_HAVE_YUV
2149 renderer->UpdateTextureYUV = GLES2_UpdateTextureYUV;
2150 renderer->UpdateTextureNV = GLES2_UpdateTextureNV;
2151#endif
2152 renderer->LockTexture = GLES2_LockTexture;
2153 renderer->UnlockTexture = GLES2_UnlockTexture;
2154 renderer->SetTextureScaleMode = GLES2_SetTextureScaleMode;
2155 renderer->SetRenderTarget = GLES2_SetRenderTarget;
2156 renderer->QueueSetViewport = GLES2_QueueNoOp;
2157 renderer->QueueSetDrawColor = GLES2_QueueNoOp;
2158 renderer->QueueDrawPoints = GLES2_QueueDrawPoints;
2159 renderer->QueueDrawLines = GLES2_QueueDrawLines;
2160 renderer->QueueGeometry = GLES2_QueueGeometry;
2161 renderer->InvalidateCachedState = GLES2_InvalidateCachedState;
2162 renderer->RunCommandQueue = GLES2_RunCommandQueue;
2163 renderer->RenderReadPixels = GLES2_RenderReadPixels;
2164 renderer->RenderPresent = GLES2_RenderPresent;
2165 renderer->DestroyTexture = GLES2_DestroyTexture;
2166 renderer->DestroyRenderer = GLES2_DestroyRenderer;
2167 renderer->SetVSync = GLES2_SetVSync;
2168#ifdef SDL_HAVE_YUV
2169 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
2170 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
2171 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
2172 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
2173#endif
2174#ifdef GL_TEXTURE_EXTERNAL_OES
2175 if (GLES2_CacheShader(data, GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES, GL_FRAGMENT_SHADER)) {
2176 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_EXTERNAL_OES);
2177 }
2178#endif
2179
2180 if (SDL_GL_ExtensionSupported("GL_EXT_blend_minmax")) {
2181 data->GL_EXT_blend_minmax_supported = true;
2182 }
2183
2184 // Set up parameters for rendering
2185 data->glDisable(GL_DEPTH_TEST);
2186 data->glDisable(GL_CULL_FACE);
2187 data->glActiveTexture(GL_TEXTURE0);
2188 data->glPixelStorei(GL_PACK_ALIGNMENT, 1);
2189 data->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
2190
2191 data->glEnableVertexAttribArray(GLES2_ATTRIBUTE_POSITION);
2192 data->glEnableVertexAttribArray(GLES2_ATTRIBUTE_COLOR);
2193 data->glDisableVertexAttribArray(GLES2_ATTRIBUTE_TEXCOORD);
2194
2195 data->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
2196
2197 data->drawstate.clear_color.r = 1.0f;
2198 data->drawstate.clear_color.g = 1.0f;
2199 data->drawstate.clear_color.b = 1.0f;
2200 data->drawstate.clear_color.a = 1.0f;
2201 data->drawstate.projection[3][0] = -1.0f;
2202 data->drawstate.projection[3][3] = 1.0f;
2203
2204 GL_CheckError("", renderer);
2205
2206 return true;
2207
2208error:
2209 if (changed_window) {
2210 // Uh oh, better try to put it back...
2211 char *error = SDL_strdup(SDL_GetError());
2212 SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profile_mask);
2213 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
2214 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
2215 SDL_RecreateWindow(window, window_flags);
2216 SDL_SetError("%s", error);
2217 SDL_free(error);
2218 }
2219 return false;
2220}
2221
2222SDL_RenderDriver GLES2_RenderDriver = {
2223 GLES2_CreateRenderer, "opengles2"
2224};
2225
2226#endif // SDL_VIDEO_RENDER_OGL_ES2
diff --git a/SDL-3.2.8/src/render/opengles2/SDL_shaders_gles2.c b/SDL-3.2.8/src/render/opengles2/SDL_shaders_gles2.c
new file mode 100644
index 0000000..1387968
--- /dev/null
+++ b/SDL-3.2.8/src/render/opengles2/SDL_shaders_gles2.c
@@ -0,0 +1,387 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_OGL_ES2
24
25#include <SDL3/SDL_opengles2.h>
26#include "SDL_shaders_gles2.h"
27
28/* *INDENT-OFF* */ // clang-format off
29
30/*************************************************************************************************
31 * Vertex/fragment shader source *
32 *************************************************************************************************/
33
34static const char GLES2_Fragment_Include_Best_Texture_Precision[] = \
35"#ifdef GL_FRAGMENT_PRECISION_HIGH\n" \
36"#define SDL_TEXCOORD_PRECISION highp\n" \
37"#else\n" \
38"#define SDL_TEXCOORD_PRECISION mediump\n" \
39"#endif\n" \
40"\n" \
41"precision mediump float;\n" \
42"\n" \
43;
44
45static const char GLES2_Fragment_Include_Medium_Texture_Precision[] = \
46"#define SDL_TEXCOORD_PRECISION mediump\n" \
47"precision mediump float;\n" \
48"\n" \
49;
50
51static const char GLES2_Fragment_Include_High_Texture_Precision[] = \
52"#define SDL_TEXCOORD_PRECISION highp\n" \
53"precision mediump float;\n" \
54"\n" \
55;
56
57static const char GLES2_Fragment_Include_Undef_Precision[] = \
58"#define mediump\n" \
59"#define highp\n" \
60"#define lowp\n" \
61"#define SDL_TEXCOORD_PRECISION\n" \
62"\n" \
63;
64
65static const char GLES2_Vertex_Default[] = \
66"uniform mat4 u_projection;\n" \
67"attribute vec2 a_position;\n" \
68"attribute vec4 a_color;\n" \
69"attribute vec2 a_texCoord;\n" \
70"varying vec2 v_texCoord;\n" \
71"varying vec4 v_color;\n" \
72"\n" \
73"void main()\n" \
74"{\n" \
75" v_texCoord = a_texCoord;\n" \
76" gl_Position = u_projection * vec4(a_position, 0.0, 1.0);\n" \
77" gl_PointSize = 1.0;\n" \
78" v_color = a_color;\n" \
79"}\n" \
80;
81
82static const char GLES2_Fragment_Solid[] = \
83"varying mediump vec4 v_color;\n" \
84"\n" \
85"void main()\n" \
86"{\n" \
87" gl_FragColor = v_color;\n" \
88"}\n" \
89;
90
91static const char GLES2_Fragment_TextureABGR[] = \
92"uniform sampler2D u_texture;\n" \
93"varying mediump vec4 v_color;\n" \
94"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
95"\n" \
96"void main()\n" \
97"{\n" \
98" gl_FragColor = texture2D(u_texture, v_texCoord);\n" \
99" gl_FragColor *= v_color;\n" \
100"}\n" \
101;
102
103// ARGB to ABGR conversion
104static const char GLES2_Fragment_TextureARGB[] = \
105"uniform sampler2D u_texture;\n" \
106"varying mediump vec4 v_color;\n" \
107"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
108"\n" \
109"void main()\n" \
110"{\n" \
111" mediump vec4 abgr = texture2D(u_texture, v_texCoord);\n" \
112" gl_FragColor = abgr;\n" \
113" gl_FragColor.r = abgr.b;\n" \
114" gl_FragColor.b = abgr.r;\n" \
115" gl_FragColor *= v_color;\n" \
116"}\n" \
117;
118
119// RGB to ABGR conversion
120static const char GLES2_Fragment_TextureRGB[] = \
121"uniform sampler2D u_texture;\n" \
122"varying mediump vec4 v_color;\n" \
123"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
124"\n" \
125"void main()\n" \
126"{\n" \
127" mediump vec4 abgr = texture2D(u_texture, v_texCoord);\n" \
128" gl_FragColor = abgr;\n" \
129" gl_FragColor.r = abgr.b;\n" \
130" gl_FragColor.b = abgr.r;\n" \
131" gl_FragColor.a = 1.0;\n" \
132" gl_FragColor *= v_color;\n" \
133"}\n" \
134;
135
136// BGR to ABGR conversion
137static const char GLES2_Fragment_TextureBGR[] = \
138"uniform sampler2D u_texture;\n" \
139"varying mediump vec4 v_color;\n" \
140"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
141"\n" \
142"void main()\n" \
143"{\n" \
144" mediump vec4 abgr = texture2D(u_texture, v_texCoord);\n" \
145" gl_FragColor = abgr;\n" \
146" gl_FragColor.a = 1.0;\n" \
147" gl_FragColor *= v_color;\n" \
148"}\n" \
149;
150
151#ifdef SDL_HAVE_YUV
152
153#define YUV_SHADER_PROLOGUE \
154"uniform sampler2D u_texture;\n" \
155"uniform sampler2D u_texture_u;\n" \
156"uniform sampler2D u_texture_v;\n" \
157"uniform vec3 u_offset;\n" \
158"uniform mat3 u_matrix;\n" \
159"varying mediump vec4 v_color;\n" \
160"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
161"\n" \
162
163#define YUV_SHADER_BODY \
164"void main()\n" \
165"{\n" \
166" mediump vec3 yuv;\n" \
167" lowp vec3 rgb;\n" \
168"\n" \
169" // Get the YUV values \n" \
170" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \
171" yuv.y = texture2D(u_texture_u, v_texCoord).r;\n" \
172" yuv.z = texture2D(u_texture_v, v_texCoord).r;\n" \
173"\n" \
174" // Do the color transform \n" \
175" yuv += u_offset;\n" \
176" rgb = yuv * u_matrix;\n" \
177"\n" \
178" // That was easy. :) \n" \
179" gl_FragColor = vec4(rgb, 1);\n" \
180" gl_FragColor *= v_color;\n" \
181"}" \
182
183#define NV12_RA_SHADER_BODY \
184"void main()\n" \
185"{\n" \
186" mediump vec3 yuv;\n" \
187" lowp vec3 rgb;\n" \
188"\n" \
189" // Get the YUV values \n" \
190" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \
191" yuv.yz = texture2D(u_texture_u, v_texCoord).ra;\n" \
192"\n" \
193" // Do the color transform \n" \
194" yuv += u_offset;\n" \
195" rgb = yuv * u_matrix;\n" \
196"\n" \
197" // That was easy. :) \n" \
198" gl_FragColor = vec4(rgb, 1);\n" \
199" gl_FragColor *= v_color;\n" \
200"}" \
201
202#define NV12_RG_SHADER_BODY \
203"void main()\n" \
204"{\n" \
205" mediump vec3 yuv;\n" \
206" lowp vec3 rgb;\n" \
207"\n" \
208" // Get the YUV values \n" \
209" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \
210" yuv.yz = texture2D(u_texture_u, v_texCoord).rg;\n" \
211"\n" \
212" // Do the color transform \n" \
213" yuv += u_offset;\n" \
214" rgb = yuv * u_matrix;\n" \
215"\n" \
216" // That was easy. :) \n" \
217" gl_FragColor = vec4(rgb, 1);\n" \
218" gl_FragColor *= v_color;\n" \
219"}" \
220
221#define NV21_RA_SHADER_BODY \
222"void main()\n" \
223"{\n" \
224" mediump vec3 yuv;\n" \
225" lowp vec3 rgb;\n" \
226"\n" \
227" // Get the YUV values \n" \
228" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \
229" yuv.yz = texture2D(u_texture_u, v_texCoord).ar;\n" \
230"\n" \
231" // Do the color transform \n" \
232" yuv += u_offset;\n" \
233" rgb = yuv * u_matrix;\n" \
234"\n" \
235" // That was easy. :) \n" \
236" gl_FragColor = vec4(rgb, 1);\n" \
237" gl_FragColor *= v_color;\n" \
238"}" \
239
240#define NV21_RG_SHADER_BODY \
241"void main()\n" \
242"{\n" \
243" mediump vec3 yuv;\n" \
244" lowp vec3 rgb;\n" \
245"\n" \
246" // Get the YUV values \n" \
247" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \
248" yuv.yz = texture2D(u_texture_u, v_texCoord).gr;\n" \
249"\n" \
250" // Do the color transform \n" \
251" yuv += u_offset;\n" \
252" rgb = yuv * u_matrix;\n" \
253"\n" \
254" // That was easy. :) \n" \
255" gl_FragColor = vec4(rgb, 1);\n" \
256" gl_FragColor *= v_color;\n" \
257"}" \
258
259// YUV to ABGR conversion
260static const char GLES2_Fragment_TextureYUV[] = \
261 YUV_SHADER_PROLOGUE \
262 YUV_SHADER_BODY \
263;
264
265// NV12 to ABGR conversion
266static const char GLES2_Fragment_TextureNV12_RA[] = \
267 YUV_SHADER_PROLOGUE \
268 NV12_RA_SHADER_BODY \
269;
270static const char GLES2_Fragment_TextureNV12_RG[] = \
271 YUV_SHADER_PROLOGUE \
272 NV12_RG_SHADER_BODY \
273;
274
275// NV21 to ABGR conversion
276static const char GLES2_Fragment_TextureNV21_RA[] = \
277 YUV_SHADER_PROLOGUE \
278 NV21_RA_SHADER_BODY \
279;
280static const char GLES2_Fragment_TextureNV21_RG[] = \
281 YUV_SHADER_PROLOGUE \
282 NV21_RG_SHADER_BODY \
283;
284#endif
285
286// Custom Android video format texture
287static const char GLES2_Fragment_TextureExternalOES_Prologue[] = \
288"#extension GL_OES_EGL_image_external : require\n" \
289"\n" \
290;
291static const char GLES2_Fragment_TextureExternalOES[] = \
292"uniform samplerExternalOES u_texture;\n" \
293"varying mediump vec4 v_color;\n" \
294"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \
295"\n" \
296"void main()\n" \
297"{\n" \
298" gl_FragColor = texture2D(u_texture, v_texCoord);\n" \
299" gl_FragColor *= v_color;\n" \
300"}\n" \
301;
302
303/* *INDENT-ON* */ // clang-format on
304
305/*************************************************************************************************
306 * Shader selector *
307 *************************************************************************************************/
308
309const char *GLES2_GetShaderPrologue(GLES2_ShaderType type)
310{
311 switch (type) {
312 case GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES:
313 return GLES2_Fragment_TextureExternalOES_Prologue;
314 default:
315 return "";
316 }
317}
318
319const char *GLES2_GetShaderInclude(GLES2_ShaderIncludeType type)
320{
321 switch (type) {
322 case GLES2_SHADER_FRAGMENT_INCLUDE_UNDEF_PRECISION:
323 return GLES2_Fragment_Include_Undef_Precision;
324 case GLES2_SHADER_FRAGMENT_INCLUDE_BEST_TEXCOORD_PRECISION:
325 return GLES2_Fragment_Include_Best_Texture_Precision;
326 case GLES2_SHADER_FRAGMENT_INCLUDE_MEDIUM_TEXCOORD_PRECISION:
327 return GLES2_Fragment_Include_Medium_Texture_Precision;
328 case GLES2_SHADER_FRAGMENT_INCLUDE_HIGH_TEXCOORD_PRECISION:
329 return GLES2_Fragment_Include_High_Texture_Precision;
330 default:
331 return "";
332 }
333}
334
335GLES2_ShaderIncludeType GLES2_GetTexCoordPrecisionEnumFromHint(void)
336{
337 const char *texcoord_hint = SDL_GetHint("SDL_RENDER_OPENGLES2_TEXCOORD_PRECISION");
338 GLES2_ShaderIncludeType value = GLES2_SHADER_FRAGMENT_INCLUDE_BEST_TEXCOORD_PRECISION;
339 if (texcoord_hint) {
340 if (SDL_strcmp(texcoord_hint, "undefined") == 0) {
341 return GLES2_SHADER_FRAGMENT_INCLUDE_UNDEF_PRECISION;
342 }
343 if (SDL_strcmp(texcoord_hint, "high") == 0) {
344 return GLES2_SHADER_FRAGMENT_INCLUDE_HIGH_TEXCOORD_PRECISION;
345 }
346 if (SDL_strcmp(texcoord_hint, "medium") == 0) {
347 return GLES2_SHADER_FRAGMENT_INCLUDE_MEDIUM_TEXCOORD_PRECISION;
348 }
349 }
350 return value;
351}
352
353const char *GLES2_GetShader(GLES2_ShaderType type)
354{
355 switch (type) {
356 case GLES2_SHADER_VERTEX_DEFAULT:
357 return GLES2_Vertex_Default;
358 case GLES2_SHADER_FRAGMENT_SOLID:
359 return GLES2_Fragment_Solid;
360 case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR:
361 return GLES2_Fragment_TextureABGR;
362 case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB:
363 return GLES2_Fragment_TextureARGB;
364 case GLES2_SHADER_FRAGMENT_TEXTURE_RGB:
365 return GLES2_Fragment_TextureRGB;
366 case GLES2_SHADER_FRAGMENT_TEXTURE_BGR:
367 return GLES2_Fragment_TextureBGR;
368#ifdef SDL_HAVE_YUV
369 case GLES2_SHADER_FRAGMENT_TEXTURE_YUV:
370 return GLES2_Fragment_TextureYUV;
371 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RA:
372 return GLES2_Fragment_TextureNV12_RA;
373 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RG:
374 return GLES2_Fragment_TextureNV12_RG;
375 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_RA:
376 return GLES2_Fragment_TextureNV21_RA;
377 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_RG:
378 return GLES2_Fragment_TextureNV21_RG;
379#endif
380 case GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES:
381 return GLES2_Fragment_TextureExternalOES;
382 default:
383 return NULL;
384 }
385}
386
387#endif // SDL_VIDEO_RENDER_OGL_ES2
diff --git a/SDL-3.2.8/src/render/opengles2/SDL_shaders_gles2.h b/SDL-3.2.8/src/render/opengles2/SDL_shaders_gles2.h
new file mode 100644
index 0000000..e71f8ce
--- /dev/null
+++ b/SDL-3.2.8/src/render/opengles2/SDL_shaders_gles2.h
@@ -0,0 +1,65 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifndef SDL_shaders_gles2_h_
24#define SDL_shaders_gles2_h_
25
26#ifdef SDL_VIDEO_RENDER_OGL_ES2
27
28typedef enum
29{
30 GLES2_SHADER_FRAGMENT_INCLUDE_NONE = 0,
31 GLES2_SHADER_FRAGMENT_INCLUDE_BEST_TEXCOORD_PRECISION,
32 GLES2_SHADER_FRAGMENT_INCLUDE_MEDIUM_TEXCOORD_PRECISION,
33 GLES2_SHADER_FRAGMENT_INCLUDE_HIGH_TEXCOORD_PRECISION,
34 GLES2_SHADER_FRAGMENT_INCLUDE_UNDEF_PRECISION,
35 GLES2_SHADER_FRAGMENT_INCLUDE_COUNT
36} GLES2_ShaderIncludeType;
37
38typedef enum
39{
40 GLES2_SHADER_VERTEX_DEFAULT = 0,
41 GLES2_SHADER_FRAGMENT_SOLID,
42 GLES2_SHADER_FRAGMENT_TEXTURE_ABGR,
43 GLES2_SHADER_FRAGMENT_TEXTURE_ARGB,
44 GLES2_SHADER_FRAGMENT_TEXTURE_BGR,
45 GLES2_SHADER_FRAGMENT_TEXTURE_RGB,
46#ifdef SDL_HAVE_YUV
47 GLES2_SHADER_FRAGMENT_TEXTURE_YUV,
48 GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RA,
49 GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RG,
50 GLES2_SHADER_FRAGMENT_TEXTURE_NV21_RA,
51 GLES2_SHADER_FRAGMENT_TEXTURE_NV21_RG,
52#endif
53 // Shaders beyond this point are optional and not cached at render creation
54 GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES,
55 GLES2_SHADER_COUNT
56} GLES2_ShaderType;
57
58extern const char *GLES2_GetShaderPrologue(GLES2_ShaderType type);
59extern const char *GLES2_GetShaderInclude(GLES2_ShaderIncludeType type);
60extern const char *GLES2_GetShader(GLES2_ShaderType type);
61extern GLES2_ShaderIncludeType GLES2_GetTexCoordPrecisionEnumFromHint(void);
62
63#endif // SDL_VIDEO_RENDER_OGL_ES2
64
65#endif // SDL_shaders_gles2_h_
diff --git a/SDL-3.2.8/src/render/ps2/SDL_render_ps2.c b/SDL-3.2.8/src/render/ps2/SDL_render_ps2.c
new file mode 100644
index 0000000..ddcab9e
--- /dev/null
+++ b/SDL-3.2.8/src/render/ps2/SDL_render_ps2.c
@@ -0,0 +1,727 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_PS2
24
25#include "../SDL_sysrender.h"
26
27#include <kernel.h>
28#include <malloc.h>
29#include <gsKit.h>
30#include <dmaKit.h>
31#include <gsToolkit.h>
32
33#ifdef HAVE_GCC_DIAGNOSTIC_PRAGMA
34#pragma GCC diagnostic push
35#pragma GCC diagnostic ignored "-Wdeclaration-after-statement"
36#endif
37
38#include <gsInline.h>
39
40#ifdef HAVE_GCC_DIAGNOSTIC_PRAGMA
41#pragma GCC diagnostic pop
42#endif
43
44// turn black GS Screen
45#define GS_BLACK GS_SETREG_RGBA(0x00, 0x00, 0x00, 0x80)
46// Size of Persistent drawbuffer (Single Buffered)
47#define RENDER_QUEUE_PER_POOLSIZE 1024 * 256 // 256K of persistent renderqueue
48/* Size of Oneshot drawbuffer (Double Buffered, so it uses this size * 2) */
49#define RENDER_QUEUE_OS_POOLSIZE 1024 * 1024 * 2 // 2048K of oneshot renderqueue
50
51typedef struct
52{
53 GSGLOBAL *gsGlobal;
54 uint64_t drawColor;
55 SDL_Rect *viewport;
56 int32_t vsync_callback_id;
57 int vsync; // 0 (Disabled), 1 (Enabled), -1 (Dynamic)
58} PS2_RenderData;
59
60static int vsync_sema_id = 0;
61
62// PRIVATE METHODS
63static int vsync_handler(void)
64{
65 iSignalSema(vsync_sema_id);
66
67 ExitHandler();
68 return 0;
69}
70
71// Copy of gsKit_sync_flip, but without the 'flip'
72static void gsKit_sync(GSGLOBAL *gsGlobal)
73{
74 if (!gsGlobal->FirstFrame) {
75 WaitSema(vsync_sema_id);
76 }
77 while (PollSema(vsync_sema_id) >= 0)
78 ;
79}
80
81// Copy of gsKit_sync_flip, but without the 'sync'
82static void gsKit_flip(GSGLOBAL *gsGlobal)
83{
84 if (!gsGlobal->FirstFrame) {
85 if (gsGlobal->DoubleBuffering == GS_SETTING_ON) {
86 GS_SET_DISPFB2(gsGlobal->ScreenBuffer[gsGlobal->ActiveBuffer & 1] / 8192,
87 gsGlobal->Width / 64, gsGlobal->PSM, 0, 0);
88
89 gsGlobal->ActiveBuffer ^= 1;
90 }
91 }
92
93 gsKit_setactive(gsGlobal);
94}
95
96static int PixelFormatToPS2PSM(Uint32 format)
97{
98 switch (format) {
99 case SDL_PIXELFORMAT_ABGR1555:
100 return GS_PSM_CT16;
101 default:
102 return GS_PSM_CT32;
103 }
104}
105
106static gs_rgbaq float_color_to_RGBAQ(const SDL_FColor *color, float color_scale)
107{
108 uint8_t colorR = (uint8_t)SDL_roundf(SDL_clamp(color->r * color_scale, 0.0f, 1.0f) * 255.0f);
109 uint8_t colorG = (uint8_t)SDL_roundf(SDL_clamp(color->g * color_scale, 0.0f, 1.0f) * 255.0f);
110 uint8_t colorB = (uint8_t)SDL_roundf(SDL_clamp(color->b * color_scale, 0.0f, 1.0f) * 255.0f);
111 uint8_t colorA = (uint8_t)SDL_roundf(SDL_clamp(color->a, 0.0f, 1.0f) * 255.0f);
112
113 return color_to_RGBAQ(colorR, colorG, colorB, colorA, 0x00);
114}
115
116static uint64_t float_GS_SETREG_RGBAQ(const SDL_FColor *color, float color_scale)
117{
118 uint8_t colorR = (uint8_t)SDL_roundf(SDL_clamp(color->r * color_scale, 0.0f, 1.0f) * 255.0f);
119 uint8_t colorG = (uint8_t)SDL_roundf(SDL_clamp(color->g * color_scale, 0.0f, 1.0f) * 255.0f);
120 uint8_t colorB = (uint8_t)SDL_roundf(SDL_clamp(color->b * color_scale, 0.0f, 1.0f) * 255.0f);
121 uint8_t colorA = (uint8_t)SDL_roundf(SDL_clamp(color->a, 0.0f, 1.0f) * 255.0f);
122
123 return GS_SETREG_RGBAQ(colorR, colorG, colorB, colorA, 0x00);
124}
125
126static void PS2_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
127{
128}
129
130static bool PS2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
131{
132 GSTEXTURE *ps2_tex = (GSTEXTURE *)SDL_calloc(1, sizeof(GSTEXTURE));
133
134 if (!ps2_tex) {
135 return false;
136 }
137
138 ps2_tex->Width = texture->w;
139 ps2_tex->Height = texture->h;
140 ps2_tex->PSM = PixelFormatToPS2PSM(texture->format);
141 ps2_tex->Mem = SDL_aligned_alloc(128, gsKit_texture_size_ee(ps2_tex->Width, ps2_tex->Height, ps2_tex->PSM));
142
143 if (!ps2_tex->Mem) {
144 SDL_free(ps2_tex);
145 return false;
146 }
147
148 texture->internal = ps2_tex;
149
150 return true;
151}
152
153static bool PS2_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
154 const SDL_Rect *rect, void **pixels, int *pitch)
155{
156 GSTEXTURE *ps2_texture = (GSTEXTURE *)texture->internal;
157
158 *pixels =
159 (void *)((Uint8 *)ps2_texture->Mem + rect->y * ps2_texture->Width * SDL_BYTESPERPIXEL(texture->format) +
160 rect->x * SDL_BYTESPERPIXEL(texture->format));
161 *pitch = ps2_texture->Width * SDL_BYTESPERPIXEL(texture->format);
162 return true;
163}
164
165static void PS2_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
166{
167 GSTEXTURE *ps2_texture = (GSTEXTURE *)texture->internal;
168 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
169
170 gsKit_TexManager_invalidate(data->gsGlobal, ps2_texture);
171}
172
173static bool PS2_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
174 const SDL_Rect *rect, const void *pixels, int pitch)
175{
176 const Uint8 *src;
177 Uint8 *dst;
178 int row, length, dpitch;
179 src = pixels;
180
181 PS2_LockTexture(renderer, texture, rect, (void **)&dst, &dpitch);
182 length = rect->w * SDL_BYTESPERPIXEL(texture->format);
183 if (length == pitch && length == dpitch) {
184 SDL_memcpy(dst, src, length * rect->h);
185 } else {
186 for (row = 0; row < rect->h; ++row) {
187 SDL_memcpy(dst, src, length);
188 src += pitch;
189 dst += dpitch;
190 }
191 }
192
193 PS2_UnlockTexture(renderer, texture);
194
195 return true;
196}
197
198static void PS2_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
199{
200 GSTEXTURE *ps2_texture = (GSTEXTURE *)texture->internal;
201 /*
202 set texture filtering according to scaleMode
203 supported hint values are nearest (0, default) or linear (1)
204 gskit scale mode is either GS_FILTER_NEAREST (good for tile-map)
205 or GS_FILTER_LINEAR (good for scaling)
206 */
207 uint32_t gsKitScaleMode = (scaleMode == SDL_SCALEMODE_NEAREST
208 ? GS_FILTER_NEAREST
209 : GS_FILTER_LINEAR);
210 ps2_texture->Filter = gsKitScaleMode;
211}
212
213static bool PS2_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
214{
215 return true;
216}
217
218static bool PS2_QueueSetViewport(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
219{
220 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
221 const SDL_Rect *viewport = &cmd->data.viewport.rect;
222 data->viewport = (SDL_Rect *)viewport;
223
224 data->gsGlobal->OffsetX = (int)((2048.0f + (float)viewport->x) * 16.0f);
225 data->gsGlobal->OffsetY = (int)((2048.0f + (float)viewport->y) * 16.0f);
226 gsKit_set_scissor(data->gsGlobal, GS_SETREG_SCISSOR(viewport->x, viewport->x + viewport->w, viewport->y, viewport->y + viewport->h));
227
228 return true;
229}
230
231static bool PS2_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
232{
233 return true; // nothing to do in this backend.
234}
235
236static bool PS2_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
237{
238 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
239 GSPRIMPOINT *vertices = (GSPRIMPOINT *)SDL_AllocateRenderVertices(renderer, count * sizeof(GSPRIMPOINT), 4, &cmd->data.draw.first);
240 gs_rgbaq rgbaq;
241 int i;
242
243 if (!vertices) {
244 return false;
245 }
246
247 cmd->data.draw.count = count;
248
249 rgbaq = float_color_to_RGBAQ(&cmd->data.draw.color, cmd->data.draw.color_scale);
250
251 for (i = 0; i < count; i++, vertices++, points++) {
252 vertices->xyz2 = vertex_to_XYZ2(data->gsGlobal, points->x, points->y, 0);
253 vertices->rgbaq = rgbaq;
254 }
255 return true;
256}
257
258static bool PS2_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
259 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
260 int num_vertices, const void *indices, int num_indices, int size_indices,
261 float scale_x, float scale_y)
262{
263 int i;
264 int count = indices ? num_indices : num_vertices;
265 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
266 const float color_scale = cmd->data.draw.color_scale;
267
268 cmd->data.draw.count = count;
269 size_indices = indices ? size_indices : 0;
270
271 if (texture) {
272 GSPRIMUVPOINT *vertices = (GSPRIMUVPOINT *) SDL_AllocateRenderVertices(renderer, count * sizeof(GSPRIMUVPOINT), 4, &cmd->data.draw.first);
273 GSTEXTURE *ps2_tex = (GSTEXTURE *) texture->internal;
274
275 if (!vertices) {
276 return false;
277 }
278
279 for (i = 0; i < count; i++) {
280 int j;
281 float *xy_;
282 float *uv_;
283 SDL_FColor *col_;
284 if (size_indices == 4) {
285 j = ((const Uint32 *)indices)[i];
286 } else if (size_indices == 2) {
287 j = ((const Uint16 *)indices)[i];
288 } else if (size_indices == 1) {
289 j = ((const Uint8 *)indices)[i];
290 } else {
291 j = i;
292 }
293
294 xy_ = (float *)((char *)xy + j * xy_stride);
295 col_ = (SDL_FColor *)((char *)color + j * color_stride);
296 uv_ = (float *)((char *)uv + j * uv_stride);
297
298 vertices->xyz2 = vertex_to_XYZ2(data->gsGlobal, xy_[0] * scale_x, xy_[1] * scale_y, 0);
299 vertices->rgbaq = float_color_to_RGBAQ(col_, color_scale);
300 vertices->uv = vertex_to_UV(ps2_tex, uv_[0] * ps2_tex->Width, uv_[1] * ps2_tex->Height);
301
302 vertices++;
303 }
304
305 } else {
306 GSPRIMPOINT *vertices = (GSPRIMPOINT *)SDL_AllocateRenderVertices(renderer, count * sizeof(GSPRIMPOINT), 4, &cmd->data.draw.first);
307
308 if (!vertices) {
309 return false;
310 }
311
312 for (i = 0; i < count; i++) {
313 int j;
314 float *xy_;
315 SDL_FColor *col_;
316 if (size_indices == 4) {
317 j = ((const Uint32 *)indices)[i];
318 } else if (size_indices == 2) {
319 j = ((const Uint16 *)indices)[i];
320 } else if (size_indices == 1) {
321 j = ((const Uint8 *)indices)[i];
322 } else {
323 j = i;
324 }
325
326 xy_ = (float *)((char *)xy + j * xy_stride);
327 col_ = (SDL_FColor *)((char *)color + j * color_stride);
328
329 vertices->xyz2 = vertex_to_XYZ2(data->gsGlobal, xy_[0] * scale_x, xy_[1] * scale_y, 0);
330 vertices->rgbaq = float_color_to_RGBAQ(col_, color_scale);
331
332 vertices++;
333 }
334 }
335
336 return true;
337}
338
339static bool PS2_RenderSetViewPort(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
340{
341 return true; // nothing to do in this backend.
342}
343
344static bool PS2_RenderSetClipRect(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
345{
346 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
347 SDL_Rect *viewport = data->viewport;
348
349 const SDL_Rect *rect = &cmd->data.cliprect.rect;
350
351 if (cmd->data.cliprect.enabled) {
352 // We need to do it relative to saved viewport
353 viewport->x += rect->x;
354 viewport->y += rect->y;
355 viewport->w = SDL_min(viewport->w, rect->w);
356 viewport->h = SDL_min(viewport->h, rect->h);
357 }
358 gsKit_set_scissor(data->gsGlobal, GS_SETREG_SCISSOR(viewport->x, viewport->x + viewport->w, viewport->y, viewport->y + viewport->h));
359
360 return true;
361}
362
363static bool PS2_RenderSetDrawColor(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
364{
365 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
366
367 data->drawColor = float_GS_SETREG_RGBAQ(&cmd->data.color.color, cmd->data.color.color_scale);
368 return true;
369}
370
371static bool PS2_RenderClear(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
372{
373 int offsetX, offsetY;
374 SDL_Rect *viewport;
375
376 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
377
378 // Clear the screen, so let's put default viewport
379 gsKit_set_scissor(data->gsGlobal, GS_SCISSOR_RESET);
380 // Put back original offset
381 offsetX = data->gsGlobal->OffsetX;
382 offsetY = data->gsGlobal->OffsetY;
383 data->gsGlobal->OffsetX = (int)(2048.0f * 16.0f);
384 data->gsGlobal->OffsetY = (int)(2048.0f * 16.0f);
385 gsKit_clear(data->gsGlobal, float_GS_SETREG_RGBAQ(&cmd->data.color.color, cmd->data.color.color_scale));
386
387 // Put back original offset
388 data->gsGlobal->OffsetX = offsetX;
389 data->gsGlobal->OffsetY = offsetY;
390
391 // // Put back view port
392 viewport = data->viewport;
393 gsKit_set_scissor(data->gsGlobal, GS_SETREG_SCISSOR(viewport->x, viewport->x + viewport->w, viewport->y, viewport->y + viewport->h));
394
395 return true;
396}
397
398static void PS2_SetBlendMode(PS2_RenderData *data, int blendMode)
399{
400#define A_COLOR_SOURCE 0
401#define A_COLOR_DEST 1
402#define A_COLOR_NULL 2
403#define A_ALPHA_SOURCE 0
404#define A_ALPHA_DEST 1
405#define A_ALPHA_FIX 2
406
407 switch (blendMode) {
408 case SDL_BLENDMODE_NONE:
409 {
410 data->gsGlobal->PrimAlphaEnable = GS_SETTING_OFF;
411 break;
412 }
413 case SDL_BLENDMODE_BLEND:
414 {
415 gsKit_set_primalpha(data->gsGlobal, GS_SETREG_ALPHA(A_COLOR_SOURCE, A_COLOR_DEST, A_ALPHA_SOURCE, A_COLOR_DEST, 0), 0);
416 data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON;
417 break;
418 }
419 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
420 {
421 // FIXME: What are the settings for this?
422 gsKit_set_primalpha(data->gsGlobal, GS_SETREG_ALPHA(A_COLOR_SOURCE, A_COLOR_DEST, A_ALPHA_SOURCE, A_COLOR_DEST, 0), 0);
423 data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON;
424 break;
425 }
426 case SDL_BLENDMODE_ADD:
427 {
428 gsKit_set_primalpha(data->gsGlobal, GS_SETREG_ALPHA(A_COLOR_SOURCE, A_COLOR_NULL, A_ALPHA_FIX, A_COLOR_DEST, 0x80), 0);
429 data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON;
430 break;
431 }
432 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
433 {
434 // FIXME: What are the settings for this?
435 gsKit_set_primalpha(data->gsGlobal, GS_SETREG_ALPHA(A_COLOR_SOURCE, A_COLOR_NULL, A_ALPHA_FIX, A_COLOR_DEST, 0x80), 0);
436 data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON;
437 break;
438 }
439 case SDL_BLENDMODE_MUL:
440 case SDL_BLENDMODE_MOD:
441 {
442 // We don't fully support MOD and MUL, however this is the best we can do
443 gsKit_set_primalpha(data->gsGlobal, GS_SETREG_ALPHA(A_COLOR_DEST, A_COLOR_NULL, A_ALPHA_SOURCE, A_COLOR_SOURCE, 0x80), 0);
444 data->gsGlobal->PrimAlphaEnable = GS_SETTING_ON;
445 break;
446 }
447 }
448}
449
450static bool PS2_RenderGeometry(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *cmd)
451{
452 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
453 const size_t count = cmd->data.draw.count;
454
455 PS2_SetBlendMode(data, cmd->data.draw.blend);
456
457 if (cmd->data.draw.texture) {
458 const GSPRIMUVPOINT *verts = (GSPRIMUVPOINT *) (vertices + cmd->data.draw.first);
459 GSTEXTURE *ps2_tex = (GSTEXTURE *)cmd->data.draw.texture->internal;
460
461 gsKit_TexManager_bind(data->gsGlobal, ps2_tex);
462 gsKit_prim_list_triangle_goraud_texture_uv_3d(data->gsGlobal, ps2_tex, count, verts);
463 } else {
464 const GSPRIMPOINT *verts = (GSPRIMPOINT *)(vertices + cmd->data.draw.first);
465 gsKit_prim_list_triangle_gouraud_3d(data->gsGlobal, count, verts);
466 }
467
468 return true;
469}
470
471static bool PS2_RenderLines(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *cmd)
472{
473 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
474 const size_t count = cmd->data.draw.count;
475 const GSPRIMPOINT *verts = (GSPRIMPOINT *)(vertices + cmd->data.draw.first);
476
477 PS2_SetBlendMode(data, cmd->data.draw.blend);
478 gsKit_prim_list_line_goraud_3d(data->gsGlobal, count, verts);
479
480 // We're done!
481 return true;
482}
483
484static bool PS2_RenderPoints(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *cmd)
485{
486 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
487 const size_t count = cmd->data.draw.count;
488 const GSPRIMPOINT *verts = (GSPRIMPOINT *)(vertices + cmd->data.draw.first);
489
490 PS2_SetBlendMode(data, cmd->data.draw.blend);
491 gsKit_prim_list_points(data->gsGlobal, count, verts);
492
493 // We're done!
494 return true;
495}
496
497static void PS2_InvalidateCachedState(SDL_Renderer *renderer)
498{
499 // currently this doesn't do anything. If this needs to do something (and someone is mixing their own rendering calls in!), update this.
500}
501
502static bool PS2_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
503{
504 while (cmd) {
505 switch (cmd->command) {
506 case SDL_RENDERCMD_SETVIEWPORT:
507 {
508 PS2_RenderSetViewPort(renderer, cmd);
509 // FIXME: We need to update the clip rect too, see https://github.com/libsdl-org/SDL/issues/9094
510 break;
511 }
512 case SDL_RENDERCMD_SETCLIPRECT:
513 {
514 PS2_RenderSetClipRect(renderer, cmd);
515 break;
516 }
517 case SDL_RENDERCMD_SETDRAWCOLOR:
518 {
519 PS2_RenderSetDrawColor(renderer, cmd);
520 break;
521 }
522 case SDL_RENDERCMD_CLEAR:
523 {
524 PS2_RenderClear(renderer, cmd);
525 break;
526 }
527 case SDL_RENDERCMD_DRAW_POINTS:
528 {
529 PS2_RenderPoints(renderer, vertices, cmd);
530 break;
531 }
532 case SDL_RENDERCMD_DRAW_LINES:
533 {
534 PS2_RenderLines(renderer, vertices, cmd);
535 break;
536 }
537 case SDL_RENDERCMD_FILL_RECTS: // unused
538 break;
539 case SDL_RENDERCMD_COPY: // unused
540 break;
541 case SDL_RENDERCMD_COPY_EX: // unused
542 break;
543 case SDL_RENDERCMD_GEOMETRY:
544 {
545 PS2_RenderGeometry(renderer, vertices, cmd);
546 break;
547 }
548 case SDL_RENDERCMD_NO_OP:
549 break;
550 }
551 cmd = cmd->next;
552 }
553 return true;
554}
555
556static bool PS2_RenderPresent(SDL_Renderer *renderer)
557{
558 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
559
560 if (data->gsGlobal->DoubleBuffering == GS_SETTING_OFF) {
561 if (data->vsync == -1) { // Dynamic
562 gsKit_sync(data->gsGlobal);
563 } else if (data->vsync == 1) {
564 gsKit_vsync_wait();
565 }
566 gsKit_queue_exec(data->gsGlobal);
567 } else {
568 gsKit_queue_exec(data->gsGlobal);
569 gsKit_finish();
570 if (data->vsync == -1) { // Dynamic
571 gsKit_sync(data->gsGlobal);
572 } else if (data->vsync == 1) {
573 gsKit_vsync_wait();
574 }
575 gsKit_flip(data->gsGlobal);
576 }
577 gsKit_TexManager_nextFrame(data->gsGlobal);
578 gsKit_clear(data->gsGlobal, GS_BLACK);
579 return true;
580}
581
582static void PS2_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
583{
584 GSTEXTURE *ps2_texture = (GSTEXTURE *)texture->internal;
585 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
586
587 if (!data) {
588 return;
589 }
590
591 if (!ps2_texture) {
592 return;
593 }
594
595 // Free from vram
596 gsKit_TexManager_free(data->gsGlobal, ps2_texture);
597
598 SDL_aligned_free(ps2_texture->Mem);
599 SDL_free(ps2_texture);
600 texture->internal = NULL;
601}
602
603static void PS2_DestroyRenderer(SDL_Renderer *renderer)
604{
605 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
606
607 if (data) {
608 gsKit_clear(data->gsGlobal, GS_BLACK);
609 gsKit_vram_clear(data->gsGlobal);
610 gsKit_deinit_global(data->gsGlobal);
611 gsKit_remove_vsync_handler(data->vsync_callback_id);
612
613 SDL_free(data);
614 }
615
616 if (vsync_sema_id >= 0) {
617 DeleteSema(vsync_sema_id);
618 }
619}
620
621static bool PS2_SetVSync(SDL_Renderer *renderer, const int vsync)
622{
623 PS2_RenderData *data = (PS2_RenderData *)renderer->internal;
624 switch (vsync) {
625 case -1:
626 case 0:
627 case 1:
628 // Supported
629 break;
630 default:
631 return SDL_Unsupported();
632 }
633 data->vsync = vsync;
634 return true;
635}
636
637static bool PS2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
638{
639 PS2_RenderData *data;
640 GSGLOBAL *gsGlobal;
641 ee_sema_t sema;
642
643 SDL_SetupRendererColorspace(renderer, create_props);
644
645 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
646 return SDL_SetError("Unsupported output colorspace");
647 }
648
649 data = (PS2_RenderData *)SDL_calloc(1, sizeof(*data));
650 if (!data) {
651 return false;
652 }
653
654 // Specific gsKit init
655 sema.init_count = 0;
656 sema.max_count = 1;
657 sema.option = 0;
658 vsync_sema_id = CreateSema(&sema);
659
660 gsGlobal = gsKit_init_global_custom(RENDER_QUEUE_OS_POOLSIZE, RENDER_QUEUE_PER_POOLSIZE);
661
662 gsGlobal->Mode = GS_MODE_NTSC;
663 gsGlobal->Height = 448;
664
665 gsGlobal->PSM = GS_PSM_CT24;
666 gsGlobal->PSMZ = GS_PSMZ_16S;
667 gsGlobal->ZBuffering = GS_SETTING_OFF;
668 gsGlobal->DoubleBuffering = GS_SETTING_ON;
669 gsGlobal->PrimAlphaEnable = GS_SETTING_ON;
670 gsGlobal->Dithering = GS_SETTING_OFF;
671
672 gsKit_set_primalpha(gsGlobal, GS_SETREG_ALPHA(0, 1, 0, 1, 0), 0);
673
674 dmaKit_init(D_CTRL_RELE_OFF, D_CTRL_MFD_OFF, D_CTRL_STS_UNSPEC, D_CTRL_STD_OFF, D_CTRL_RCYC_8, 1 << DMA_CHANNEL_GIF);
675 dmaKit_chan_init(DMA_CHANNEL_GIF);
676
677 gsKit_set_clamp(gsGlobal, GS_CMODE_REPEAT);
678
679 gsKit_vram_clear(gsGlobal);
680
681 gsKit_init_screen(gsGlobal);
682
683 gsKit_TexManager_init(gsGlobal);
684
685 data->vsync_callback_id = gsKit_add_vsync_handler(vsync_handler);
686
687 gsKit_mode_switch(gsGlobal, GS_ONESHOT);
688
689 gsKit_clear(gsGlobal, GS_BLACK);
690
691 data->gsGlobal = gsGlobal;
692
693 renderer->WindowEvent = PS2_WindowEvent;
694 renderer->CreateTexture = PS2_CreateTexture;
695 renderer->UpdateTexture = PS2_UpdateTexture;
696 renderer->LockTexture = PS2_LockTexture;
697 renderer->UnlockTexture = PS2_UnlockTexture;
698 renderer->SetTextureScaleMode = PS2_SetTextureScaleMode;
699 renderer->SetRenderTarget = PS2_SetRenderTarget;
700 renderer->QueueSetViewport = PS2_QueueSetViewport;
701 renderer->QueueSetDrawColor = PS2_QueueNoOp;
702 renderer->QueueDrawPoints = PS2_QueueDrawPoints;
703 renderer->QueueDrawLines = PS2_QueueDrawPoints;
704 renderer->QueueGeometry = PS2_QueueGeometry;
705 renderer->InvalidateCachedState = PS2_InvalidateCachedState;
706 renderer->RunCommandQueue = PS2_RunCommandQueue;
707 renderer->RenderPresent = PS2_RenderPresent;
708 renderer->DestroyTexture = PS2_DestroyTexture;
709 renderer->DestroyRenderer = PS2_DestroyRenderer;
710 renderer->SetVSync = PS2_SetVSync;
711 renderer->internal = data;
712 PS2_InvalidateCachedState(renderer);
713 renderer->window = window;
714
715 renderer->name = PS2_RenderDriver.name;
716 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR1555);
717 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
718 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 1024);
719
720 return true;
721}
722
723SDL_RenderDriver PS2_RenderDriver = {
724 PS2_CreateRenderer, "PS2 gsKit"
725};
726
727#endif // SDL_VIDEO_RENDER_PS2
diff --git a/SDL-3.2.8/src/render/psp/SDL_render_psp.c b/SDL-3.2.8/src/render/psp/SDL_render_psp.c
new file mode 100644
index 0000000..3ce5036
--- /dev/null
+++ b/SDL-3.2.8/src/render/psp/SDL_render_psp.c
@@ -0,0 +1,1400 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_PSP
24
25#include "../SDL_sysrender.h"
26
27#include "SDL_render_psp_c.h"
28
29#include <pspkernel.h>
30#include <pspdisplay.h>
31#include <pspgu.h>
32#include <pspgum.h>
33#include <stdio.h>
34#include <string.h>
35#include <math.h>
36#include <pspge.h>
37#include <stdarg.h>
38#include <stdlib.h>
39#include <vram.h>
40
41// PSP renderer implementation, based on the PGE
42
43static unsigned int __attribute__((aligned(16))) DisplayList[262144];
44
45#define COL5650(r, g, b, a) ((r >> 3) | ((g >> 2) << 5) | ((b >> 3) << 11))
46#define COL5551(r, g, b, a) ((r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10) | (a > 0 ? 0x7000 : 0))
47#define COL4444(r, g, b, a) ((r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8) | ((a >> 4) << 12))
48#define COL8888(r, g, b, a) ((r) | ((g) << 8) | ((b) << 16) | ((a) << 24))
49
50/**
51 * Holds psp specific texture data
52 *
53 * Part of a hot-list of textures that are used as render targets
54 * When short of vram we spill Least-Recently-Used render targets to system memory
55 */
56typedef struct PSP_TextureData
57{
58 void *data; /**< Image data. */
59 unsigned int size; /**< Size of data in bytes. */
60 unsigned int width; /**< Image width. */
61 unsigned int height; /**< Image height. */
62 unsigned int textureWidth; /**< Texture width (power of two). */
63 unsigned int textureHeight; /**< Texture height (power of two). */
64 unsigned int bits; /**< Image bits per pixel. */
65 unsigned int format; /**< Image format - one of ::pgePixelFormat. */
66 unsigned int pitch;
67 bool swizzled; /**< Is image swizzled. */
68 struct PSP_TextureData *prevhotw; /**< More recently used render target */
69 struct PSP_TextureData *nexthotw; /**< Less recently used render target */
70} PSP_TextureData;
71
72typedef struct
73{
74 SDL_BlendMode mode;
75 unsigned int color;
76 int shadeModel;
77 SDL_Texture *texture;
78} PSP_BlendState;
79
80typedef struct
81{
82 unsigned int color;
83} PSP_DrawStateCache;
84
85typedef struct
86{
87 void *frontbuffer; /**< main screen buffer */
88 void *backbuffer; /**< buffer presented to display */
89 SDL_Texture *boundTarget; /**< currently bound rendertarget */
90 bool initialized; /**< is driver initialized */
91 bool displayListAvail; /**< is the display list already initialized for this frame */
92 unsigned int psm; /**< format of the display buffers */
93 unsigned int bpp; /**< bits per pixel of the main display */
94
95 bool vsync; /**< whether we do vsync */
96 PSP_BlendState blendState; /**< current blend mode */
97 PSP_TextureData *most_recent_target; /**< start of render target LRU double linked list */
98 PSP_TextureData *least_recent_target; /**< end of the LRU list */
99
100 bool vblank_not_reached; /**< whether vblank wasn't reached */
101} PSP_RenderData;
102
103typedef struct
104{
105 float x, y, z;
106} VertV;
107
108typedef struct
109{
110 float u, v;
111 float x, y, z;
112} VertTV;
113
114typedef struct
115{
116 SDL_Color col;
117 float x, y, z;
118} VertCV;
119
120typedef struct
121{
122 float u, v;
123 SDL_Color col;
124 float x, y, z;
125} VertTCV;
126
127#define radToDeg(x) ((x)*180.f / SDL_PI_F)
128#define degToRad(x) ((x)*SDL_PI_F / 180.f)
129
130static float MathAbs(float x)
131{
132 float result;
133
134 __asm__ volatile(
135 "mtv %1, S000\n"
136 "vabs.s S000, S000\n"
137 "mfv %0, S000\n"
138 : "=r"(result)
139 : "r"(x));
140
141 return result;
142}
143
144static void MathSincos(float r, float *s, float *c)
145{
146 __asm__ volatile(
147 "mtv %2, S002\n"
148 "vcst.s S003, VFPU_2_PI\n"
149 "vmul.s S002, S002, S003\n"
150 "vrot.p C000, S002, [s, c]\n"
151 "mfv %0, S000\n"
152 "mfv %1, S001\n"
153 : "=r"(*s), "=r"(*c)
154 : "r"(r));
155}
156
157static void Swap(float *a, float *b)
158{
159 float n = *a;
160 *a = *b;
161 *b = n;
162}
163
164static inline int InVram(void *data)
165{
166 return data < (void *)0x04200000;
167}
168
169// Return next power of 2
170static int TextureNextPow2(unsigned int w)
171{
172 unsigned int n = 2;
173 if (w == 0) {
174 return 0;
175 }
176
177 while (w > n) {
178 n <<= 1;
179 }
180
181 return n;
182}
183
184static void psp_on_vblank(u32 sub, PSP_RenderData *data)
185{
186 if (data) {
187 data->vblank_not_reached = false;
188 }
189}
190
191static int PixelFormatToPSPFMT(SDL_PixelFormat format)
192{
193 switch (format) {
194 case SDL_PIXELFORMAT_BGR565:
195 return GU_PSM_5650;
196 case SDL_PIXELFORMAT_ABGR1555:
197 return GU_PSM_5551;
198 case SDL_PIXELFORMAT_ABGR4444:
199 return GU_PSM_4444;
200 case SDL_PIXELFORMAT_ABGR8888:
201 return GU_PSM_8888;
202 default:
203 return GU_PSM_8888;
204 }
205}
206
207/// SECTION render target LRU management
208static void LRUTargetRelink(PSP_TextureData *psp_texture)
209{
210 if (psp_texture->prevhotw) {
211 psp_texture->prevhotw->nexthotw = psp_texture->nexthotw;
212 }
213 if (psp_texture->nexthotw) {
214 psp_texture->nexthotw->prevhotw = psp_texture->prevhotw;
215 }
216}
217
218static void LRUTargetPushFront(PSP_RenderData *data, PSP_TextureData *psp_texture)
219{
220 psp_texture->nexthotw = data->most_recent_target;
221 if (data->most_recent_target) {
222 data->most_recent_target->prevhotw = psp_texture;
223 }
224 data->most_recent_target = psp_texture;
225 if (!data->least_recent_target) {
226 data->least_recent_target = psp_texture;
227 }
228}
229
230static void LRUTargetRemove(PSP_RenderData *data, PSP_TextureData *psp_texture)
231{
232 LRUTargetRelink(psp_texture);
233 if (data->most_recent_target == psp_texture) {
234 data->most_recent_target = psp_texture->nexthotw;
235 }
236 if (data->least_recent_target == psp_texture) {
237 data->least_recent_target = psp_texture->prevhotw;
238 }
239 psp_texture->prevhotw = NULL;
240 psp_texture->nexthotw = NULL;
241}
242
243static void LRUTargetBringFront(PSP_RenderData *data, PSP_TextureData *psp_texture)
244{
245 if (data->most_recent_target == psp_texture) {
246 return; // nothing to do
247 }
248 LRUTargetRemove(data, psp_texture);
249 LRUTargetPushFront(data, psp_texture);
250}
251
252static void TextureStorageFree(void *storage)
253{
254 if (InVram(storage)) {
255 vfree(storage);
256 } else {
257 SDL_free(storage);
258 }
259}
260
261static bool TextureSwizzle(PSP_TextureData *psp_texture, void *dst)
262{
263 int bytewidth, height;
264 int rowblocks, rowblocksadd;
265 int i, j;
266 unsigned int blockaddress = 0;
267 unsigned int *src = NULL;
268 unsigned char *data = NULL;
269
270 if (psp_texture->swizzled) {
271 return true;
272 }
273
274 bytewidth = psp_texture->textureWidth * (psp_texture->bits >> 3);
275 height = psp_texture->size / bytewidth;
276
277 rowblocks = (bytewidth >> 4);
278 rowblocksadd = (rowblocks - 1) << 7;
279
280 src = (unsigned int *)psp_texture->data;
281
282 data = dst;
283 if (!data) {
284 data = SDL_malloc(psp_texture->size);
285 }
286
287 if (!data) {
288 return false;
289 }
290
291 for (j = 0; j < height; j++, blockaddress += 16) {
292 unsigned int *block;
293
294 block = (unsigned int *)&data[blockaddress];
295
296 for (i = 0; i < rowblocks; i++) {
297 *block++ = *src++;
298 *block++ = *src++;
299 *block++ = *src++;
300 *block++ = *src++;
301 block += 28;
302 }
303
304 if ((j & 0x7) == 0x7) {
305 blockaddress += rowblocksadd;
306 }
307 }
308
309 TextureStorageFree(psp_texture->data);
310 psp_texture->data = data;
311 psp_texture->swizzled = true;
312
313 sceKernelDcacheWritebackRange(psp_texture->data, psp_texture->size);
314 return true;
315}
316
317static bool TextureUnswizzle(PSP_TextureData *psp_texture, void *dst)
318{
319 int bytewidth, height;
320 int widthblocks, heightblocks;
321 int dstpitch, dstrow;
322 int blockx, blocky;
323 int j;
324 unsigned int *src = NULL;
325 unsigned char *data = NULL;
326 unsigned char *ydst = NULL;
327
328 if (!psp_texture->swizzled) {
329 return true;
330 }
331
332 bytewidth = psp_texture->textureWidth * (psp_texture->bits >> 3);
333 height = psp_texture->size / bytewidth;
334
335 widthblocks = bytewidth / 16;
336 heightblocks = height / 8;
337
338 dstpitch = (bytewidth - 16) / 4;
339 dstrow = bytewidth * 8;
340
341 src = (unsigned int *)psp_texture->data;
342
343 data = dst;
344
345 if (!data) {
346 data = SDL_malloc(psp_texture->size);
347 }
348
349 if (!data) {
350 return false;
351 }
352
353 ydst = (unsigned char *)data;
354
355 for (blocky = 0; blocky < heightblocks; ++blocky) {
356 unsigned char *xdst = ydst;
357
358 for (blockx = 0; blockx < widthblocks; ++blockx) {
359 unsigned int *block;
360
361 block = (unsigned int *)xdst;
362
363 for (j = 0; j < 8; ++j) {
364 *(block++) = *(src++);
365 *(block++) = *(src++);
366 *(block++) = *(src++);
367 *(block++) = *(src++);
368 block += dstpitch;
369 }
370
371 xdst += 16;
372 }
373
374 ydst += dstrow;
375 }
376
377 TextureStorageFree(psp_texture->data);
378
379 psp_texture->data = data;
380
381 psp_texture->swizzled = false;
382
383 sceKernelDcacheWritebackRange(psp_texture->data, psp_texture->size);
384 return true;
385}
386
387static bool TextureSpillToSram(PSP_RenderData *data, PSP_TextureData *psp_texture)
388{
389 // Assumes the texture is in VRAM
390 if (psp_texture->swizzled) {
391 // Texture was swizzled in vram, just copy to system memory
392 void *sdata = SDL_malloc(psp_texture->size);
393 if (!sdata) {
394 return false;
395 }
396
397 SDL_memcpy(sdata, psp_texture->data, psp_texture->size);
398 vfree(psp_texture->data);
399 psp_texture->data = sdata;
400 return true;
401 } else {
402 return TextureSwizzle(psp_texture, NULL); // Will realloc in sysram
403 }
404}
405
406static bool TexturePromoteToVram(PSP_RenderData *data, PSP_TextureData *psp_texture, bool target)
407{
408 // Assumes texture in sram and a large enough continuous block in vram
409 void *tdata = vramalloc(psp_texture->size);
410 if (psp_texture->swizzled && target) {
411 return TextureUnswizzle(psp_texture, tdata);
412 } else {
413 SDL_memcpy(tdata, psp_texture->data, psp_texture->size);
414 SDL_free(psp_texture->data);
415 psp_texture->data = tdata;
416 return true;
417 }
418}
419
420static bool TextureSpillLRU(PSP_RenderData *data, size_t wanted)
421{
422 PSP_TextureData *lru = data->least_recent_target;
423 if (lru) {
424 if (!TextureSpillToSram(data, lru)) {
425 return false;
426 }
427 LRUTargetRemove(data, lru);
428 } else {
429 // Asked to spill but there nothing to spill
430 return SDL_SetError("Could not spill more VRAM to system memory. VRAM : %dKB,(%dKB), wanted %dKB", vmemavail() / 1024, vlargestblock() / 1024, wanted / 1024);
431 }
432 return true;
433}
434
435static bool TextureSpillTargetsForSpace(PSP_RenderData *data, size_t size)
436{
437 while (vlargestblock() < size) {
438 if (!TextureSpillLRU(data, size)) {
439 return false;
440 }
441 }
442 return true;
443}
444
445static bool TextureBindAsTarget(PSP_RenderData *data, PSP_TextureData *psp_texture)
446{
447 unsigned int dstFormat;
448
449 if (!InVram(psp_texture->data)) {
450 // Bring back the texture in vram
451 if (!TextureSpillTargetsForSpace(data, psp_texture->size)) {
452 return false;
453 }
454 if (!TexturePromoteToVram(data, psp_texture, true)) {
455 return false;
456 }
457 }
458 LRUTargetBringFront(data, psp_texture);
459 sceGuDrawBufferList(psp_texture->format, vrelptr(psp_texture->data), psp_texture->textureWidth);
460
461 // Stencil alpha dst hack
462 dstFormat = psp_texture->format;
463 if (dstFormat == GU_PSM_5551) {
464 sceGuEnable(GU_STENCIL_TEST);
465 sceGuStencilOp(GU_REPLACE, GU_REPLACE, GU_REPLACE);
466 sceGuStencilFunc(GU_GEQUAL, 0xff, 0xff);
467 sceGuEnable(GU_ALPHA_TEST);
468 sceGuAlphaFunc(GU_GREATER, 0x00, 0xff);
469 } else {
470 sceGuDisable(GU_STENCIL_TEST);
471 sceGuDisable(GU_ALPHA_TEST);
472 }
473 return true;
474}
475
476static void PSP_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
477{
478}
479
480static bool PSP_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
481{
482 PSP_RenderData *data = renderer->internal;
483 PSP_TextureData *psp_texture = (PSP_TextureData *)SDL_calloc(1, sizeof(*psp_texture));
484
485 if (!psp_texture) {
486 return false;
487 }
488
489 psp_texture->swizzled = false;
490 psp_texture->width = texture->w;
491 psp_texture->height = texture->h;
492 psp_texture->textureHeight = TextureNextPow2(texture->h);
493 psp_texture->textureWidth = TextureNextPow2(texture->w);
494 psp_texture->format = PixelFormatToPSPFMT(texture->format);
495
496 switch (psp_texture->format) {
497 case GU_PSM_5650:
498 case GU_PSM_5551:
499 case GU_PSM_4444:
500 psp_texture->bits = 16;
501 break;
502
503 case GU_PSM_8888:
504 psp_texture->bits = 32;
505 break;
506
507 default:
508 SDL_free(psp_texture);
509 return false;
510 }
511
512 psp_texture->pitch = psp_texture->textureWidth * SDL_BYTESPERPIXEL(texture->format);
513 psp_texture->size = psp_texture->textureHeight * psp_texture->pitch;
514 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
515 if (!TextureSpillTargetsForSpace(renderer->internal, psp_texture->size)) {
516 SDL_free(psp_texture);
517 return false;
518 }
519 psp_texture->data = vramalloc(psp_texture->size);
520 if (psp_texture->data) {
521 LRUTargetPushFront(data, psp_texture);
522 }
523 } else {
524 psp_texture->data = SDL_calloc(1, psp_texture->size);
525 }
526
527 if (!psp_texture->data) {
528 SDL_free(psp_texture);
529 return false;
530 }
531 texture->internal = psp_texture;
532
533 return true;
534}
535
536static bool TextureShouldSwizzle(PSP_TextureData *psp_texture, SDL_Texture *texture)
537{
538 return !((texture->access == SDL_TEXTUREACCESS_TARGET) && InVram(psp_texture->data)) && texture->access != SDL_TEXTUREACCESS_STREAMING && (texture->w >= 16 || texture->h >= 16);
539}
540
541static void TextureActivate(SDL_Texture *texture)
542{
543 PSP_TextureData *psp_texture = (PSP_TextureData *)texture->internal;
544 int scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? GU_NEAREST : GU_LINEAR;
545
546 // Swizzling is useless with small textures.
547 if (TextureShouldSwizzle(psp_texture, texture)) {
548 TextureSwizzle(psp_texture, NULL);
549 }
550
551 sceGuTexWrap(GU_REPEAT, GU_REPEAT);
552 sceGuTexMode(psp_texture->format, 0, 0, psp_texture->swizzled);
553 sceGuTexFilter(scaleMode, scaleMode); // GU_NEAREST good for tile-map
554 // GU_LINEAR good for scaling
555 sceGuTexImage(0, psp_texture->textureWidth, psp_texture->textureHeight, psp_texture->textureWidth, psp_texture->data);
556}
557
558static bool PSP_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
559 const SDL_Rect *rect, void **pixels, int *pitch);
560
561static bool PSP_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
562 const SDL_Rect *rect, const void *pixels, int pitch)
563{
564 /* PSP_TextureData *psp_texture = (PSP_TextureData *) texture->internal; */
565 const Uint8 *src;
566 Uint8 *dst;
567 int row, length, dpitch;
568 src = pixels;
569
570 PSP_LockTexture(renderer, texture, rect, (void **)&dst, &dpitch);
571 length = rect->w * SDL_BYTESPERPIXEL(texture->format);
572 if (length == pitch && length == dpitch) {
573 SDL_memcpy(dst, src, length * rect->h);
574 } else {
575 for (row = 0; row < rect->h; ++row) {
576 SDL_memcpy(dst, src, length);
577 src += pitch;
578 dst += dpitch;
579 }
580 }
581
582 sceKernelDcacheWritebackAll();
583 return true;
584}
585
586static bool PSP_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
587 const SDL_Rect *rect, void **pixels, int *pitch)
588{
589 PSP_TextureData *psp_texture = (PSP_TextureData *)texture->internal;
590
591 *pixels =
592 (void *)((Uint8 *)psp_texture->data + rect->y * psp_texture->pitch +
593 rect->x * SDL_BYTESPERPIXEL(texture->format));
594 *pitch = psp_texture->pitch;
595 return true;
596}
597
598static void PSP_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
599{
600 PSP_TextureData *psp_texture = (PSP_TextureData *)texture->internal;
601 SDL_Rect rect;
602
603 // We do whole texture updates, at least for now
604 rect.x = 0;
605 rect.y = 0;
606 rect.w = texture->w;
607 rect.h = texture->h;
608 PSP_UpdateTexture(renderer, texture, &rect, psp_texture->data, psp_texture->pitch);
609}
610
611static void PSP_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
612{
613 // Nothing to do because TextureActivate takes care of it
614}
615
616static bool PSP_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
617{
618 return true;
619}
620
621static bool PSP_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
622{
623 return true; // nothing to do in this backend.
624}
625
626static bool PSP_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
627{
628 VertV *verts = (VertV *)SDL_AllocateRenderVertices(renderer, count * sizeof(VertV), 4, &cmd->data.draw.first);
629 int i;
630
631 if (!verts) {
632 return false;
633 }
634
635 cmd->data.draw.count = count;
636
637 for (i = 0; i < count; i++, verts++, points++) {
638 verts->x = points->x;
639 verts->y = points->y;
640 verts->z = 0.0f;
641 }
642
643 return true;
644}
645
646static bool PSP_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
647 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
648 int num_vertices, const void *indices, int num_indices, int size_indices,
649 float scale_x, float scale_y)
650{
651 int i;
652 int count = indices ? num_indices : num_vertices;
653 const float color_scale = cmd->data.draw.color_scale;
654
655 cmd->data.draw.count = count;
656 size_indices = indices ? size_indices : 0;
657
658 if (!texture) {
659 VertCV *verts;
660 verts = (VertCV *)SDL_AllocateRenderVertices(renderer, count * sizeof(VertCV), 4, &cmd->data.draw.first);
661 if (!verts) {
662 return false;
663 }
664
665 for (i = 0; i < count; i++) {
666 int j;
667 float *xy_;
668 SDL_FColor *col_;
669 if (size_indices == 4) {
670 j = ((const Uint32 *)indices)[i];
671 } else if (size_indices == 2) {
672 j = ((const Uint16 *)indices)[i];
673 } else if (size_indices == 1) {
674 j = ((const Uint8 *)indices)[i];
675 } else {
676 j = i;
677 }
678
679 xy_ = (float *)((char *)xy + j * xy_stride);
680 col_ = (SDL_FColor *)((char *)color + j * color_stride);
681
682 verts->x = xy_[0] * scale_x;
683 verts->y = xy_[1] * scale_y;
684 verts->z = 0;
685
686 verts->col.r = (Uint8)SDL_roundf(SDL_clamp(col_->r * color_scale, 0.0f, 1.0f) * 255.0f);
687 verts->col.g = (Uint8)SDL_roundf(SDL_clamp(col_->g * color_scale, 0.0f, 1.0f) * 255.0f);
688 verts->col.b = (Uint8)SDL_roundf(SDL_clamp(col_->b * color_scale, 0.0f, 1.0f) * 255.0f);
689 verts->col.a = (Uint8)SDL_roundf(SDL_clamp(col_->a, 0.0f, 1.0f) * 255.0f);
690
691 verts++;
692 }
693 } else {
694 PSP_TextureData *psp_texture = (PSP_TextureData *)texture->internal;
695 VertTCV *verts;
696 verts = (VertTCV *)SDL_AllocateRenderVertices(renderer, count * sizeof(VertTCV), 4, &cmd->data.draw.first);
697 if (!verts) {
698 return false;
699 }
700
701 for (i = 0; i < count; i++) {
702 int j;
703 float *xy_;
704 SDL_FColor *col_;
705 float *uv_;
706
707 if (size_indices == 4) {
708 j = ((const Uint32 *)indices)[i];
709 } else if (size_indices == 2) {
710 j = ((const Uint16 *)indices)[i];
711 } else if (size_indices == 1) {
712 j = ((const Uint8 *)indices)[i];
713 } else {
714 j = i;
715 }
716
717 xy_ = (float *)((char *)xy + j * xy_stride);
718 col_ = (SDL_FColor *)((char *)color + j * color_stride);
719 uv_ = (float *)((char *)uv + j * uv_stride);
720
721 verts->x = xy_[0] * scale_x;
722 verts->y = xy_[1] * scale_y;
723 verts->z = 0;
724
725 verts->col.r = (Uint8)SDL_roundf(SDL_clamp(col_->r * color_scale, 0.0f, 1.0f) * 255.0f);
726 verts->col.g = (Uint8)SDL_roundf(SDL_clamp(col_->g * color_scale, 0.0f, 1.0f) * 255.0f);
727 verts->col.b = (Uint8)SDL_roundf(SDL_clamp(col_->b * color_scale, 0.0f, 1.0f) * 255.0f);
728 verts->col.a = (Uint8)SDL_roundf(SDL_clamp(col_->a, 0.0f, 1.0f) * 255.0f);
729
730 verts->u = uv_[0] * psp_texture->textureWidth;
731 verts->v = uv_[1] * psp_texture->textureHeight;
732
733 verts++;
734 }
735 }
736
737 return true;
738}
739
740static bool PSP_QueueFillRects(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
741{
742 VertV *verts = (VertV *)SDL_AllocateRenderVertices(renderer, count * 2 * sizeof(VertV), 4, &cmd->data.draw.first);
743 int i;
744
745 if (!verts) {
746 return false;
747 }
748
749 cmd->data.draw.count = count;
750 for (i = 0; i < count; i++, rects++) {
751 verts->x = rects->x;
752 verts->y = rects->y;
753 verts->z = 0.0f;
754 verts++;
755
756 verts->x = rects->x + rects->w + 0.5f;
757 verts->y = rects->y + rects->h + 0.5f;
758 verts->z = 0.0f;
759 verts++;
760 }
761
762 return true;
763}
764
765static bool PSP_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
766 const SDL_FRect *srcrect, const SDL_FRect *dstrect)
767{
768 VertTV *verts;
769 const float x = dstrect->x;
770 const float y = dstrect->y;
771 const float width = dstrect->w;
772 const float height = dstrect->h;
773
774 const float u0 = srcrect->x;
775 const float v0 = srcrect->y;
776 const float u1 = srcrect->x + srcrect->w;
777 const float v1 = srcrect->y + srcrect->h;
778
779 if ((MathAbs(u1) - MathAbs(u0)) < 64.0f) {
780 verts = (VertTV *)SDL_AllocateRenderVertices(renderer, 2 * sizeof(VertTV), 4, &cmd->data.draw.first);
781 if (!verts) {
782 return false;
783 }
784
785 cmd->data.draw.count = 1;
786
787 verts->u = u0;
788 verts->v = v0;
789 verts->x = x;
790 verts->y = y;
791 verts->z = 0;
792 verts++;
793
794 verts->u = u1;
795 verts->v = v1;
796 verts->x = x + width;
797 verts->y = y + height;
798 verts->z = 0;
799 verts++;
800 } else {
801 float start, end;
802 float curU = u0;
803 float curX = x;
804 const float endX = x + width;
805 const float slice = 64.0f;
806 const size_t count = (size_t)SDL_ceilf(width / slice);
807 size_t i;
808 float ustep = (u1 - u0) / width * slice;
809
810 if (ustep < 0.0f) {
811 ustep = -ustep;
812 }
813
814 cmd->data.draw.count = count;
815
816 verts = (VertTV *)SDL_AllocateRenderVertices(renderer, count * 2 * sizeof(VertTV), 4, &cmd->data.draw.first);
817 if (!verts) {
818 return false;
819 }
820
821 for (i = 0, start = 0, end = width; i < count; i++, start += slice) {
822 const float polyWidth = ((curX + slice) > endX) ? (endX - curX) : slice;
823 const float sourceWidth = ((curU + ustep) > u1) ? (u1 - curU) : ustep;
824
825 SDL_assert(start < end);
826
827 verts->u = curU;
828 verts->v = v0;
829 verts->x = curX;
830 verts->y = y;
831 verts->z = 0;
832 verts++;
833
834 curU += sourceWidth;
835 curX += polyWidth;
836
837 verts->u = curU;
838 verts->v = v1;
839 verts->x = curX;
840 verts->y = (y + height);
841 verts->z = 0;
842 verts++;
843 }
844 }
845
846 return true;
847}
848
849static bool PSP_QueueCopyEx(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
850 const SDL_FRect *srcrect, const SDL_FRect *dstrect,
851 const double angle, const SDL_FPoint *center, const SDL_FlipMode flip, float scale_x, float scale_y)
852{
853 VertTV *verts = (VertTV *)SDL_AllocateRenderVertices(renderer, 4 * sizeof(VertTV), 4, &cmd->data.draw.first);
854 const float centerx = center->x;
855 const float centery = center->y;
856 const float x = dstrect->x + centerx;
857 const float y = dstrect->y + centery;
858 const float width = dstrect->w - centerx;
859 const float height = dstrect->h - centery;
860 float s, c;
861 float cw1, sw1, ch1, sh1, cw2, sw2, ch2, sh2;
862
863 float u0 = srcrect->x;
864 float v0 = srcrect->y;
865 float u1 = srcrect->x + srcrect->w;
866 float v1 = srcrect->y + srcrect->h;
867
868 if (!verts) {
869 return false;
870 }
871
872 cmd->data.draw.count = 1;
873
874 MathSincos(degToRad((float)(360 - angle)), &s, &c);
875
876 cw1 = c * -centerx;
877 sw1 = s * -centerx;
878 ch1 = c * -centery;
879 sh1 = s * -centery;
880 cw2 = c * width;
881 sw2 = s * width;
882 ch2 = c * height;
883 sh2 = s * height;
884
885 if (flip & SDL_FLIP_VERTICAL) {
886 Swap(&v0, &v1);
887 }
888
889 if (flip & SDL_FLIP_HORIZONTAL) {
890 Swap(&u0, &u1);
891 }
892
893 verts->u = u0;
894 verts->v = v0;
895 verts->x = x + cw1 + sh1;
896 verts->y = y - sw1 + ch1;
897 verts->z = 0;
898 verts++;
899
900 verts->u = u0;
901 verts->v = v1;
902 verts->x = x + cw1 + sh2;
903 verts->y = y - sw1 + ch2;
904 verts->z = 0;
905 verts++;
906
907 verts->u = u1;
908 verts->v = v1;
909 verts->x = x + cw2 + sh2;
910 verts->y = y - sw2 + ch2;
911 verts->z = 0;
912 verts++;
913
914 verts->u = u1;
915 verts->v = v0;
916 verts->x = x + cw2 + sh1;
917 verts->y = y - sw2 + ch1;
918 verts->z = 0;
919
920 if (scale_x != 1.0f || scale_y != 1.0f) {
921 verts->x *= scale_x;
922 verts->y *= scale_y;
923 verts--;
924 verts->x *= scale_x;
925 verts->y *= scale_y;
926 verts--;
927 verts->x *= scale_x;
928 verts->y *= scale_y;
929 verts--;
930 verts->x *= scale_x;
931 verts->y *= scale_y;
932 }
933
934 return true;
935}
936
937static void ResetBlendState(PSP_BlendState *state)
938{
939 sceGuColor(0xffffffff);
940 state->color = 0xffffffff;
941 state->mode = SDL_BLENDMODE_INVALID;
942 state->texture = NULL;
943 sceGuDisable(GU_TEXTURE_2D);
944 sceGuShadeModel(GU_SMOOTH);
945 state->shadeModel = GU_SMOOTH;
946}
947
948static void StartDrawing(SDL_Renderer *renderer)
949{
950 PSP_RenderData *data = (PSP_RenderData *)renderer->internal;
951
952 // Check if we need to start GU displaylist
953 if (!data->displayListAvail) {
954 sceGuStart(GU_DIRECT, DisplayList);
955 data->displayListAvail = true;
956 // ResetBlendState(&data->blendState);
957 }
958
959 // Check if we need a draw buffer change
960 if (renderer->target != data->boundTarget) {
961 SDL_Texture *texture = renderer->target;
962 if (texture) {
963 PSP_TextureData *psp_texture = (PSP_TextureData *)texture->internal;
964 // Set target, registering LRU
965 TextureBindAsTarget(data, psp_texture);
966 } else {
967 // Set target back to screen
968 sceGuDrawBufferList(data->psm, vrelptr(data->frontbuffer), PSP_FRAME_BUFFER_WIDTH);
969 }
970 data->boundTarget = texture;
971 }
972}
973
974static void PSP_SetBlendState(PSP_RenderData *data, PSP_BlendState *state)
975{
976 PSP_BlendState *current = &data->blendState;
977
978 if (state->mode != current->mode) {
979 switch (state->mode) {
980 case SDL_BLENDMODE_NONE:
981 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
982 sceGuDisable(GU_BLEND);
983 break;
984 case SDL_BLENDMODE_BLEND:
985 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
986 sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
987 sceGuEnable(GU_BLEND);
988 break;
989 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
990 sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);
991 sceGuBlendFunc(GU_ADD, GU_FIX, GU_ONE_MINUS_SRC_ALPHA, 0x00FFFFFF, 0 );
992 sceGuEnable(GU_BLEND);
993 break;
994 case SDL_BLENDMODE_ADD:
995 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
996 sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_FIX, 0, 0x00FFFFFF);
997 sceGuEnable(GU_BLEND);
998 break;
999 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
1000 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
1001 sceGuBlendFunc(GU_ADD, GU_FIX, GU_FIX, 0, 0x00FFFFFF);
1002 sceGuEnable(GU_BLEND);
1003 break;
1004 case SDL_BLENDMODE_MOD:
1005 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
1006 sceGuBlendFunc(GU_ADD, GU_FIX, GU_SRC_COLOR, 0, 0);
1007 sceGuEnable(GU_BLEND);
1008 break;
1009 case SDL_BLENDMODE_MUL:
1010 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
1011 // FIXME SDL_BLENDMODE_MUL is simplified, and dstA is in fact un-changed.
1012 sceGuBlendFunc(GU_ADD, GU_DST_COLOR, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
1013 sceGuEnable(GU_BLEND);
1014 break;
1015 case SDL_BLENDMODE_INVALID:
1016 break;
1017 }
1018 }
1019
1020 if (state->color != current->color) {
1021 sceGuColor(state->color);
1022 }
1023
1024 if (state->shadeModel != current->shadeModel) {
1025 sceGuShadeModel(state->shadeModel);
1026 }
1027
1028 if (state->texture != current->texture) {
1029 if (state->texture) {
1030 TextureActivate(state->texture);
1031 sceGuEnable(GU_TEXTURE_2D);
1032 } else {
1033 sceGuDisable(GU_TEXTURE_2D);
1034 }
1035 }
1036
1037 *current = *state;
1038}
1039
1040static void PSP_InvalidateCachedState(SDL_Renderer *renderer)
1041{
1042 // currently this doesn't do anything. If this needs to do something (and someone is mixing their own rendering calls in!), update this.
1043}
1044
1045static bool PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
1046{
1047 PSP_RenderData *data = (PSP_RenderData *)renderer->internal;
1048 Uint8 *gpumem = NULL;
1049 PSP_DrawStateCache drawstate;
1050
1051 drawstate.color = 0;
1052
1053 StartDrawing(renderer);
1054
1055 /* note that before the renderer interface change, this would do extremely small
1056 batches with sceGuGetMemory()--a few vertices at a time--and it's not clear that
1057 this won't fail if you try to push 100,000 draw calls in a single batch.
1058 I don't know what the limits on PSP hardware are. It might be useful to have
1059 rendering backends report a reasonable maximum, so the higher level can flush
1060 if we appear to be exceeding that. */
1061 gpumem = (Uint8 *)sceGuGetMemory(vertsize);
1062 if (!gpumem) {
1063 return SDL_SetError("Couldn't obtain a %d-byte vertex buffer!", (int)vertsize);
1064 }
1065 SDL_memcpy(gpumem, vertices, vertsize);
1066
1067 while (cmd) {
1068 switch (cmd->command) {
1069 case SDL_RENDERCMD_SETDRAWCOLOR:
1070 {
1071 const Uint8 r = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.r * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
1072 const Uint8 g = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.g * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
1073 const Uint8 b = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.b * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
1074 const Uint8 a = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.a, 0.0f, 1.0f) * 255.0f);
1075 drawstate.color = GU_RGBA(r, g, b, a);
1076 break;
1077 }
1078
1079 case SDL_RENDERCMD_SETVIEWPORT:
1080 {
1081 SDL_Rect *viewport = &cmd->data.viewport.rect;
1082 sceGuOffset(2048 - (viewport->w >> 1), 2048 - (viewport->h >> 1));
1083 sceGuViewport(2048, 2048, viewport->w, viewport->h);
1084 sceGuScissor(viewport->x, viewport->y, viewport->w, viewport->h);
1085 // FIXME: We need to update the clip rect too, see https://github.com/libsdl-org/SDL/issues/9094
1086 break;
1087 }
1088
1089 case SDL_RENDERCMD_SETCLIPRECT:
1090 {
1091 const SDL_Rect *rect = &cmd->data.cliprect.rect;
1092 if (cmd->data.cliprect.enabled) {
1093 sceGuEnable(GU_SCISSOR_TEST);
1094 sceGuScissor(rect->x, rect->y, rect->w, rect->h);
1095 } else {
1096 sceGuDisable(GU_SCISSOR_TEST);
1097 }
1098 break;
1099 }
1100
1101 case SDL_RENDERCMD_CLEAR:
1102 {
1103 const Uint8 r = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.r * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
1104 const Uint8 g = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.g * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
1105 const Uint8 b = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.b * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
1106 const Uint8 a = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.a, 0.0f, 1.0f) * 255.0f);
1107 sceGuClearColor(GU_RGBA(r, g, b, a));
1108 sceGuClearStencil(a);
1109 sceGuClear(GU_COLOR_BUFFER_BIT | GU_STENCIL_BUFFER_BIT);
1110 break;
1111 }
1112
1113 case SDL_RENDERCMD_DRAW_POINTS:
1114 {
1115 const size_t count = cmd->data.draw.count;
1116 const VertV *verts = (VertV *)(gpumem + cmd->data.draw.first);
1117 PSP_BlendState state = {
1118 .color = drawstate.color,
1119 .texture = NULL,
1120 .mode = cmd->data.draw.blend,
1121 .shadeModel = GU_FLAT
1122 };
1123 PSP_SetBlendState(data, &state);
1124 sceGuDrawArray(GU_POINTS, GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
1125 break;
1126 }
1127
1128 case SDL_RENDERCMD_DRAW_LINES:
1129 {
1130 const size_t count = cmd->data.draw.count;
1131 const VertV *verts = (VertV *)(gpumem + cmd->data.draw.first);
1132 PSP_BlendState state = {
1133 .color = drawstate.color,
1134 .texture = NULL,
1135 .mode = cmd->data.draw.blend,
1136 .shadeModel = GU_FLAT
1137 };
1138 PSP_SetBlendState(data, &state);
1139 sceGuDrawArray(GU_LINE_STRIP, GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
1140 break;
1141 }
1142
1143 case SDL_RENDERCMD_FILL_RECTS:
1144 {
1145 const size_t count = cmd->data.draw.count;
1146 const VertV *verts = (VertV *)(gpumem + cmd->data.draw.first);
1147 PSP_BlendState state = {
1148 .color = drawstate.color,
1149 .texture = NULL,
1150 .mode = cmd->data.draw.blend,
1151 .shadeModel = GU_FLAT
1152 };
1153 PSP_SetBlendState(data, &state);
1154 sceGuDrawArray(GU_SPRITES, GU_VERTEX_32BITF | GU_TRANSFORM_2D, 2 * count, 0, verts);
1155 break;
1156 }
1157
1158 case SDL_RENDERCMD_COPY:
1159 {
1160 const size_t count = cmd->data.draw.count;
1161 const VertTV *verts = (VertTV *)(gpumem + cmd->data.draw.first);
1162 PSP_BlendState state = {
1163 .color = drawstate.color,
1164 .texture = cmd->data.draw.texture,
1165 .mode = cmd->data.draw.blend,
1166 .shadeModel = GU_SMOOTH
1167 };
1168 PSP_SetBlendState(data, &state);
1169 sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF | GU_VERTEX_32BITF | GU_TRANSFORM_2D, 2 * count, 0, verts);
1170 break;
1171 }
1172
1173 case SDL_RENDERCMD_COPY_EX:
1174 {
1175 const VertTV *verts = (VertTV *)(gpumem + cmd->data.draw.first);
1176 PSP_BlendState state = {
1177 .color = drawstate.color,
1178 .texture = cmd->data.draw.texture,
1179 .mode = cmd->data.draw.blend,
1180 .shadeModel = GU_SMOOTH
1181 };
1182 PSP_SetBlendState(data, &state);
1183 sceGuDrawArray(GU_TRIANGLE_FAN, GU_TEXTURE_32BITF | GU_VERTEX_32BITF | GU_TRANSFORM_2D, 4, 0, verts);
1184 break;
1185 }
1186
1187 case SDL_RENDERCMD_GEOMETRY:
1188 {
1189 const size_t count = cmd->data.draw.count;
1190 if (!cmd->data.draw.texture) {
1191 const VertCV *verts = (VertCV *)(gpumem + cmd->data.draw.first);
1192 sceGuDisable(GU_TEXTURE_2D);
1193 // In GU_SMOOTH mode
1194 sceGuDrawArray(GU_TRIANGLES, GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
1195 sceGuEnable(GU_TEXTURE_2D);
1196 } else {
1197 const VertTCV *verts = (VertTCV *)(gpumem + cmd->data.draw.first);
1198 PSP_BlendState state = {
1199 .color = drawstate.color,
1200 .texture = NULL,
1201 .mode = cmd->data.draw.blend,
1202 .shadeModel = GU_FLAT
1203 };
1204 TextureActivate(cmd->data.draw.texture);
1205 PSP_SetBlendState(data, &state);
1206 sceGuDrawArray(GU_TRIANGLES, GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
1207 }
1208 break;
1209 }
1210
1211 case SDL_RENDERCMD_NO_OP:
1212 break;
1213 }
1214
1215 cmd = cmd->next;
1216 }
1217
1218 return true;
1219}
1220
1221static bool PSP_RenderPresent(SDL_Renderer *renderer)
1222{
1223 PSP_RenderData *data = (PSP_RenderData *)renderer->internal;
1224 if (!data->displayListAvail) {
1225 return false;
1226 }
1227
1228 data->displayListAvail = false;
1229 sceGuFinish();
1230 sceGuSync(0, 0);
1231
1232 if ((data->vsync) && (data->vblank_not_reached)) {
1233 sceDisplayWaitVblankStart();
1234 }
1235 data->vblank_not_reached = true;
1236
1237 data->backbuffer = data->frontbuffer;
1238 data->frontbuffer = vabsptr(sceGuSwapBuffers());
1239
1240 return true;
1241}
1242
1243static void PSP_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1244{
1245 PSP_RenderData *renderdata = (PSP_RenderData *)renderer->internal;
1246 PSP_TextureData *psp_texture = (PSP_TextureData *)texture->internal;
1247
1248 if (!renderdata) {
1249 return;
1250 }
1251
1252 if (!psp_texture) {
1253 return;
1254 }
1255
1256 LRUTargetRemove(renderdata, psp_texture);
1257 TextureStorageFree(psp_texture->data);
1258 SDL_free(psp_texture);
1259 texture->internal = NULL;
1260}
1261
1262static void PSP_DestroyRenderer(SDL_Renderer *renderer)
1263{
1264 PSP_RenderData *data = (PSP_RenderData *)renderer->internal;
1265 if (data) {
1266 if (!data->initialized) {
1267 return;
1268 }
1269
1270 sceKernelDisableSubIntr(PSP_VBLANK_INT, 0);
1271 sceKernelReleaseSubIntrHandler(PSP_VBLANK_INT, 0);
1272 sceDisplayWaitVblankStart();
1273 sceGuDisplay(GU_FALSE);
1274 sceGuTerm();
1275 vfree(data->backbuffer);
1276 vfree(data->frontbuffer);
1277
1278 data->initialized = false;
1279 data->displayListAvail = false;
1280 SDL_free(data);
1281 }
1282}
1283
1284static bool PSP_SetVSync(SDL_Renderer *renderer, const int vsync)
1285{
1286 PSP_RenderData *data = renderer->internal;
1287 data->vsync = vsync;
1288 return true;
1289}
1290
1291static bool PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
1292{
1293 PSP_RenderData *data;
1294 int pixelformat;
1295 void *doublebuffer = NULL;
1296
1297 SDL_SetupRendererColorspace(renderer, create_props);
1298
1299 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
1300 return SDL_SetError("Unsupported output colorspace");
1301 }
1302
1303 data = (PSP_RenderData *)SDL_calloc(1, sizeof(*data));
1304 if (!data) {
1305 return false;
1306 }
1307
1308 renderer->WindowEvent = PSP_WindowEvent;
1309 renderer->CreateTexture = PSP_CreateTexture;
1310 renderer->UpdateTexture = PSP_UpdateTexture;
1311 renderer->LockTexture = PSP_LockTexture;
1312 renderer->UnlockTexture = PSP_UnlockTexture;
1313 renderer->SetTextureScaleMode = PSP_SetTextureScaleMode;
1314 renderer->SetRenderTarget = PSP_SetRenderTarget;
1315 renderer->QueueSetViewport = PSP_QueueNoOp;
1316 renderer->QueueSetDrawColor = PSP_QueueNoOp;
1317 renderer->QueueDrawPoints = PSP_QueueDrawPoints;
1318 renderer->QueueDrawLines = PSP_QueueDrawPoints; // lines and points queue vertices the same way.
1319 renderer->QueueGeometry = PSP_QueueGeometry;
1320 renderer->QueueFillRects = PSP_QueueFillRects;
1321 renderer->QueueCopy = PSP_QueueCopy;
1322 renderer->QueueCopyEx = PSP_QueueCopyEx;
1323 renderer->InvalidateCachedState = PSP_InvalidateCachedState;
1324 renderer->RunCommandQueue = PSP_RunCommandQueue;
1325 renderer->RenderPresent = PSP_RenderPresent;
1326 renderer->DestroyTexture = PSP_DestroyTexture;
1327 renderer->DestroyRenderer = PSP_DestroyRenderer;
1328 renderer->SetVSync = PSP_SetVSync;
1329 renderer->internal = data;
1330 PSP_InvalidateCachedState(renderer);
1331 renderer->window = window;
1332
1333 renderer->name = PSP_RenderDriver.name;
1334 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGR565);
1335 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR1555);
1336 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR4444);
1337 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
1338 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 512);
1339
1340 data->initialized = true;
1341 data->most_recent_target = NULL;
1342 data->least_recent_target = NULL;
1343
1344 pixelformat = PixelFormatToPSPFMT(SDL_GetWindowPixelFormat(window));
1345 switch (pixelformat) {
1346 case GU_PSM_4444:
1347 case GU_PSM_5650:
1348 case GU_PSM_5551:
1349 data->bpp = 2;
1350 data->psm = pixelformat;
1351 break;
1352 default:
1353 data->bpp = 4;
1354 data->psm = GU_PSM_8888;
1355 break;
1356 }
1357
1358 doublebuffer = vramalloc(PSP_FRAME_BUFFER_SIZE * data->bpp * 2);
1359 data->backbuffer = doublebuffer;
1360 data->frontbuffer = ((uint8_t *)doublebuffer) + PSP_FRAME_BUFFER_SIZE * data->bpp;
1361
1362 sceGuInit();
1363 // setup GU
1364 sceGuStart(GU_DIRECT, DisplayList);
1365 sceGuDrawBuffer(data->psm, vrelptr(data->frontbuffer), PSP_FRAME_BUFFER_WIDTH);
1366 sceGuDispBuffer(PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT, vrelptr(data->backbuffer), PSP_FRAME_BUFFER_WIDTH);
1367
1368 sceGuOffset(2048 - (PSP_SCREEN_WIDTH >> 1), 2048 - (PSP_SCREEN_HEIGHT >> 1));
1369 sceGuViewport(2048, 2048, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
1370
1371 sceGuDisable(GU_DEPTH_TEST);
1372
1373 // Scissoring
1374 sceGuScissor(0, 0, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
1375 sceGuEnable(GU_SCISSOR_TEST);
1376
1377 // Backface culling
1378 sceGuDisable(GU_CULL_FACE);
1379
1380 // Setup initial blend state
1381 ResetBlendState(&data->blendState);
1382
1383 sceGuFinish();
1384 sceGuSync(0, 0);
1385 sceDisplayWaitVblankStartCB();
1386 sceGuDisplay(GU_TRUE);
1387
1388 // Improve performance when VSYC is enabled and it is not reaching the 60 FPS
1389 data->vblank_not_reached = true;
1390 sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0, psp_on_vblank, data);
1391 sceKernelEnableSubIntr(PSP_VBLANK_INT, 0);
1392
1393 return true;
1394}
1395
1396SDL_RenderDriver PSP_RenderDriver = {
1397 PSP_CreateRenderer, "PSP"
1398};
1399
1400#endif // SDL_VIDEO_RENDER_PSP
diff --git a/SDL-3.2.8/src/render/psp/SDL_render_psp_c.h b/SDL-3.2.8/src/render/psp/SDL_render_psp_c.h
new file mode 100644
index 0000000..4d60847
--- /dev/null
+++ b/SDL-3.2.8/src/render/psp/SDL_render_psp_c.h
@@ -0,0 +1,30 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#ifndef SDL_VIDEO_RENDER_PSP_C_H
22#define SDL_VIDEO_RENDER_PSP_C_H
23
24#define PSP_SCREEN_WIDTH 480
25#define PSP_SCREEN_HEIGHT 272
26
27#define PSP_FRAME_BUFFER_WIDTH 512
28#define PSP_FRAME_BUFFER_SIZE (PSP_FRAME_BUFFER_WIDTH * PSP_SCREEN_HEIGHT)
29
30#endif // SDL_VIDEO_RENDER_PSP_C_H
diff --git a/SDL-3.2.8/src/render/software/SDL_blendfillrect.c b/SDL-3.2.8/src/render/software/SDL_blendfillrect.c
new file mode 100644
index 0000000..4e5c7f8
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_blendfillrect.c
@@ -0,0 +1,371 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_SW
24
25#include "SDL_draw.h"
26#include "SDL_blendfillrect.h"
27
28static bool SDL_BlendFillRect_RGB555(SDL_Surface *dst, const SDL_Rect *rect,
29 SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
30{
31 unsigned inva = 0xff - a;
32
33 switch (blendMode) {
34 case SDL_BLENDMODE_BLEND:
35 FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB555);
36 break;
37 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
38 FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555);
39 break;
40 case SDL_BLENDMODE_ADD:
41 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
42 FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB555);
43 break;
44 case SDL_BLENDMODE_MOD:
45 FILLRECT(Uint16, DRAW_SETPIXEL_MOD_RGB555);
46 break;
47 case SDL_BLENDMODE_MUL:
48 FILLRECT(Uint16, DRAW_SETPIXEL_MUL_RGB555);
49 break;
50 default:
51 FILLRECT(Uint16, DRAW_SETPIXEL_RGB555);
52 break;
53 }
54 return true;
55}
56
57static bool SDL_BlendFillRect_RGB565(SDL_Surface *dst, const SDL_Rect *rect,
58 SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
59{
60 unsigned inva = 0xff - a;
61
62 switch (blendMode) {
63 case SDL_BLENDMODE_BLEND:
64 FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB565);
65 break;
66 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
67 FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565);
68 break;
69 case SDL_BLENDMODE_ADD:
70 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
71 FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB565);
72 break;
73 case SDL_BLENDMODE_MOD:
74 FILLRECT(Uint16, DRAW_SETPIXEL_MOD_RGB565);
75 break;
76 case SDL_BLENDMODE_MUL:
77 FILLRECT(Uint16, DRAW_SETPIXEL_MUL_RGB565);
78 break;
79 default:
80 FILLRECT(Uint16, DRAW_SETPIXEL_RGB565);
81 break;
82 }
83 return true;
84}
85
86static bool SDL_BlendFillRect_XRGB8888(SDL_Surface *dst, const SDL_Rect *rect,
87 SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
88{
89 unsigned inva = 0xff - a;
90
91 switch (blendMode) {
92 case SDL_BLENDMODE_BLEND:
93 FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_XRGB8888);
94 break;
95 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
96 FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888);
97 break;
98 case SDL_BLENDMODE_ADD:
99 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
100 FILLRECT(Uint32, DRAW_SETPIXEL_ADD_XRGB8888);
101 break;
102 case SDL_BLENDMODE_MOD:
103 FILLRECT(Uint32, DRAW_SETPIXEL_MOD_XRGB8888);
104 break;
105 case SDL_BLENDMODE_MUL:
106 FILLRECT(Uint32, DRAW_SETPIXEL_MUL_XRGB8888);
107 break;
108 default:
109 FILLRECT(Uint32, DRAW_SETPIXEL_XRGB8888);
110 break;
111 }
112 return true;
113}
114
115static bool SDL_BlendFillRect_ARGB8888(SDL_Surface *dst, const SDL_Rect *rect,
116 SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
117{
118 unsigned inva = 0xff - a;
119
120 switch (blendMode) {
121 case SDL_BLENDMODE_BLEND:
122 FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888);
123 break;
124 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
125 FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888);
126 break;
127 case SDL_BLENDMODE_ADD:
128 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
129 FILLRECT(Uint32, DRAW_SETPIXEL_ADD_ARGB8888);
130 break;
131 case SDL_BLENDMODE_MOD:
132 FILLRECT(Uint32, DRAW_SETPIXEL_MOD_ARGB8888);
133 break;
134 case SDL_BLENDMODE_MUL:
135 FILLRECT(Uint32, DRAW_SETPIXEL_MUL_ARGB8888);
136 break;
137 default:
138 FILLRECT(Uint32, DRAW_SETPIXEL_ARGB8888);
139 break;
140 }
141 return true;
142}
143
144static bool SDL_BlendFillRect_RGB(SDL_Surface *dst, const SDL_Rect *rect,
145 SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
146{
147 const SDL_PixelFormatDetails *fmt = dst->fmt;
148 unsigned inva = 0xff - a;
149
150 switch (fmt->bytes_per_pixel) {
151 case 2:
152 switch (blendMode) {
153 case SDL_BLENDMODE_BLEND:
154 FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_RGB);
155 break;
156 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
157 FILLRECT(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB);
158 break;
159 case SDL_BLENDMODE_ADD:
160 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
161 FILLRECT(Uint16, DRAW_SETPIXEL_ADD_RGB);
162 break;
163 case SDL_BLENDMODE_MOD:
164 FILLRECT(Uint16, DRAW_SETPIXEL_MOD_RGB);
165 break;
166 case SDL_BLENDMODE_MUL:
167 FILLRECT(Uint16, DRAW_SETPIXEL_MUL_RGB);
168 break;
169 default:
170 FILLRECT(Uint16, DRAW_SETPIXEL_RGB);
171 break;
172 }
173 return true;
174 case 4:
175 switch (blendMode) {
176 case SDL_BLENDMODE_BLEND:
177 FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_RGB);
178 break;
179 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
180 FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGB);
181 break;
182 case SDL_BLENDMODE_ADD:
183 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
184 FILLRECT(Uint32, DRAW_SETPIXEL_ADD_RGB);
185 break;
186 case SDL_BLENDMODE_MOD:
187 FILLRECT(Uint32, DRAW_SETPIXEL_MOD_RGB);
188 break;
189 case SDL_BLENDMODE_MUL:
190 FILLRECT(Uint32, DRAW_SETPIXEL_MUL_RGB);
191 break;
192 default:
193 FILLRECT(Uint32, DRAW_SETPIXEL_RGB);
194 break;
195 }
196 return true;
197 default:
198 return SDL_Unsupported();
199 }
200}
201
202static bool SDL_BlendFillRect_RGBA(SDL_Surface *dst, const SDL_Rect *rect,
203 SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
204{
205 const SDL_PixelFormatDetails *fmt = dst->fmt;
206 unsigned inva = 0xff - a;
207
208 switch (fmt->bytes_per_pixel) {
209 case 4:
210 switch (blendMode) {
211 case SDL_BLENDMODE_BLEND:
212 FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_RGBA);
213 break;
214 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
215 FILLRECT(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA);
216 break;
217 case SDL_BLENDMODE_ADD:
218 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
219 FILLRECT(Uint32, DRAW_SETPIXEL_ADD_RGBA);
220 break;
221 case SDL_BLENDMODE_MOD:
222 FILLRECT(Uint32, DRAW_SETPIXEL_MOD_RGBA);
223 break;
224 case SDL_BLENDMODE_MUL:
225 FILLRECT(Uint32, DRAW_SETPIXEL_MUL_RGBA);
226 break;
227 default:
228 FILLRECT(Uint32, DRAW_SETPIXEL_RGBA);
229 break;
230 }
231 return true;
232 default:
233 return SDL_Unsupported();
234 }
235}
236
237bool SDL_BlendFillRect(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
238{
239 SDL_Rect clipped;
240
241 if (!SDL_SurfaceValid(dst)) {
242 return SDL_InvalidParamError("SDL_BlendFillRect(): dst");
243 }
244
245 // This function doesn't work on surfaces < 8 bpp
246 if (SDL_BITSPERPIXEL(dst->format) < 8) {
247 return SDL_SetError("SDL_BlendFillRect(): Unsupported surface format");
248 }
249
250 // If 'rect' == NULL, then fill the whole surface
251 if (rect) {
252 // Perform clipping
253 if (!SDL_GetRectIntersection(rect, &dst->clip_rect, &clipped)) {
254 return true;
255 }
256 rect = &clipped;
257 } else {
258 rect = &dst->clip_rect;
259 }
260
261 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
262 r = DRAW_MUL(r, a);
263 g = DRAW_MUL(g, a);
264 b = DRAW_MUL(b, a);
265 }
266
267 switch (dst->fmt->bits_per_pixel) {
268 case 15:
269 switch (dst->fmt->Rmask) {
270 case 0x7C00:
271 return SDL_BlendFillRect_RGB555(dst, rect, blendMode, r, g, b, a);
272 }
273 break;
274 case 16:
275 switch (dst->fmt->Rmask) {
276 case 0xF800:
277 return SDL_BlendFillRect_RGB565(dst, rect, blendMode, r, g, b, a);
278 }
279 break;
280 case 32:
281 switch (dst->fmt->Rmask) {
282 case 0x00FF0000:
283 if (!dst->fmt->Amask) {
284 return SDL_BlendFillRect_XRGB8888(dst, rect, blendMode, r, g, b, a);
285 } else {
286 return SDL_BlendFillRect_ARGB8888(dst, rect, blendMode, r, g, b, a);
287 }
288 // break; -Wunreachable-code-break
289 }
290 break;
291 default:
292 break;
293 }
294
295 if (!dst->fmt->Amask) {
296 return SDL_BlendFillRect_RGB(dst, rect, blendMode, r, g, b, a);
297 } else {
298 return SDL_BlendFillRect_RGBA(dst, rect, blendMode, r, g, b, a);
299 }
300}
301
302bool SDL_BlendFillRects(SDL_Surface *dst, const SDL_Rect *rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
303{
304 SDL_Rect rect;
305 int i;
306 bool (*func)(SDL_Surface * dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) = NULL;
307 bool result = true;
308
309 if (!SDL_SurfaceValid(dst)) {
310 return SDL_InvalidParamError("SDL_BlendFillRects(): dst");
311 }
312
313 // This function doesn't work on surfaces < 8 bpp
314 if (dst->fmt->bits_per_pixel < 8) {
315 return SDL_SetError("SDL_BlendFillRects(): Unsupported surface format");
316 }
317
318 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
319 r = DRAW_MUL(r, a);
320 g = DRAW_MUL(g, a);
321 b = DRAW_MUL(b, a);
322 }
323
324 // FIXME: Does this function pointer slow things down significantly?
325 switch (dst->fmt->bits_per_pixel) {
326 case 15:
327 switch (dst->fmt->Rmask) {
328 case 0x7C00:
329 func = SDL_BlendFillRect_RGB555;
330 }
331 break;
332 case 16:
333 switch (dst->fmt->Rmask) {
334 case 0xF800:
335 func = SDL_BlendFillRect_RGB565;
336 }
337 break;
338 case 32:
339 switch (dst->fmt->Rmask) {
340 case 0x00FF0000:
341 if (!dst->fmt->Amask) {
342 func = SDL_BlendFillRect_XRGB8888;
343 } else {
344 func = SDL_BlendFillRect_ARGB8888;
345 }
346 break;
347 }
348 break;
349 default:
350 break;
351 }
352
353 if (!func) {
354 if (!dst->fmt->Amask) {
355 func = SDL_BlendFillRect_RGB;
356 } else {
357 func = SDL_BlendFillRect_RGBA;
358 }
359 }
360
361 for (i = 0; i < count; ++i) {
362 // Perform clipping
363 if (!SDL_GetRectIntersection(&rects[i], &dst->clip_rect, &rect)) {
364 continue;
365 }
366 result = func(dst, &rect, blendMode, r, g, b, a);
367 }
368 return result;
369}
370
371#endif // SDL_VIDEO_RENDER_SW
diff --git a/SDL-3.2.8/src/render/software/SDL_blendfillrect.h b/SDL-3.2.8/src/render/software/SDL_blendfillrect.h
new file mode 100644
index 0000000..c1ff439
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_blendfillrect.h
@@ -0,0 +1,30 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_blendfillrect_h_
23#define SDL_blendfillrect_h_
24
25#include "SDL_internal.h"
26
27extern bool SDL_BlendFillRect(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
28extern bool SDL_BlendFillRects(SDL_Surface *dst, const SDL_Rect *rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
29
30#endif // SDL_blendfillrect_h_
diff --git a/SDL-3.2.8/src/render/software/SDL_blendline.c b/SDL-3.2.8/src/render/software/SDL_blendline.c
new file mode 100644
index 0000000..53be2f1
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_blendline.c
@@ -0,0 +1,986 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_SW
24
25#include "SDL_draw.h"
26#include "SDL_blendline.h"
27#include "SDL_blendpoint.h"
28
29static void SDL_BlendLine_RGB2(SDL_Surface *dst, int x1, int y1, int x2, int y2,
30 SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
31 bool draw_end)
32{
33 const SDL_PixelFormatDetails *fmt = dst->fmt;
34 unsigned r, g, b, a, inva;
35
36 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
37 r = DRAW_MUL(_r, _a);
38 g = DRAW_MUL(_g, _a);
39 b = DRAW_MUL(_b, _a);
40 a = _a;
41 } else {
42 r = _r;
43 g = _g;
44 b = _b;
45 a = _a;
46 }
47 inva = (a ^ 0xff);
48
49 if (y1 == y2) {
50 switch (blendMode) {
51 case SDL_BLENDMODE_BLEND:
52 HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);
53 break;
54 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
55 HLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end);
56 break;
57 case SDL_BLENDMODE_ADD:
58 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
59 HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);
60 break;
61 case SDL_BLENDMODE_MOD:
62 HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);
63 break;
64 case SDL_BLENDMODE_MUL:
65 HLINE(Uint16, DRAW_SETPIXEL_MUL_RGB, draw_end);
66 break;
67 default:
68 HLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);
69 break;
70 }
71 } else if (x1 == x2) {
72 switch (blendMode) {
73 case SDL_BLENDMODE_BLEND:
74 VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);
75 break;
76 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
77 VLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end);
78 break;
79 case SDL_BLENDMODE_ADD:
80 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
81 VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);
82 break;
83 case SDL_BLENDMODE_MOD:
84 VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);
85 break;
86 case SDL_BLENDMODE_MUL:
87 VLINE(Uint16, DRAW_SETPIXEL_MUL_RGB, draw_end);
88 break;
89 default:
90 VLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);
91 break;
92 }
93 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
94 switch (blendMode) {
95 case SDL_BLENDMODE_BLEND:
96 DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);
97 break;
98 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
99 DLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end);
100 break;
101 case SDL_BLENDMODE_ADD:
102 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
103 DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);
104 break;
105 case SDL_BLENDMODE_MOD:
106 DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);
107 break;
108 case SDL_BLENDMODE_MUL:
109 DLINE(Uint16, DRAW_SETPIXEL_MUL_RGB, draw_end);
110 break;
111 default:
112 DLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);
113 break;
114 }
115 } else {
116 switch (blendMode) {
117 case SDL_BLENDMODE_BLEND:
118 AALINE(x1, y1, x2, y2,
119 DRAW_SETPIXELXY2_BLEND_RGB, DRAW_SETPIXELXY2_BLEND_RGB,
120 draw_end);
121 break;
122 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
123 AALINE(x1, y1, x2, y2,
124 DRAW_SETPIXELXY2_BLEND_CLAMPED_RGB, DRAW_SETPIXELXY2_BLEND_CLAMPED_RGB,
125 draw_end);
126 break;
127 case SDL_BLENDMODE_ADD:
128 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
129 AALINE(x1, y1, x2, y2,
130 DRAW_SETPIXELXY2_ADD_RGB, DRAW_SETPIXELXY2_ADD_RGB,
131 draw_end);
132 break;
133 case SDL_BLENDMODE_MOD:
134 AALINE(x1, y1, x2, y2,
135 DRAW_SETPIXELXY2_MOD_RGB, DRAW_SETPIXELXY2_MOD_RGB,
136 draw_end);
137 break;
138 case SDL_BLENDMODE_MUL:
139 AALINE(x1, y1, x2, y2,
140 DRAW_SETPIXELXY2_MUL_RGB, DRAW_SETPIXELXY2_MUL_RGB,
141 draw_end);
142 break;
143 default:
144 AALINE(x1, y1, x2, y2,
145 DRAW_SETPIXELXY2_RGB, DRAW_SETPIXELXY2_BLEND_RGB,
146 draw_end);
147 break;
148 }
149 }
150}
151
152static void SDL_BlendLine_RGB555(SDL_Surface *dst, int x1, int y1, int x2, int y2,
153 SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
154 bool draw_end)
155{
156 unsigned r, g, b, a, inva;
157
158 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
159 r = DRAW_MUL(_r, _a);
160 g = DRAW_MUL(_g, _a);
161 b = DRAW_MUL(_b, _a);
162 a = _a;
163 } else {
164 r = _r;
165 g = _g;
166 b = _b;
167 a = _a;
168 }
169 inva = (a ^ 0xff);
170
171 if (y1 == y2) {
172 switch (blendMode) {
173 case SDL_BLENDMODE_BLEND:
174 HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);
175 break;
176 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
177 HLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555, draw_end);
178 break;
179 case SDL_BLENDMODE_ADD:
180 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
181 HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);
182 break;
183 case SDL_BLENDMODE_MOD:
184 HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);
185 break;
186 case SDL_BLENDMODE_MUL:
187 HLINE(Uint16, DRAW_SETPIXEL_MUL_RGB555, draw_end);
188 break;
189 default:
190 HLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);
191 break;
192 }
193 } else if (x1 == x2) {
194 switch (blendMode) {
195 case SDL_BLENDMODE_BLEND:
196 VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);
197 break;
198 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
199 VLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555, draw_end);
200 break;
201 case SDL_BLENDMODE_ADD:
202 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
203 VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);
204 break;
205 case SDL_BLENDMODE_MOD:
206 VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);
207 break;
208 case SDL_BLENDMODE_MUL:
209 VLINE(Uint16, DRAW_SETPIXEL_MUL_RGB555, draw_end);
210 break;
211 default:
212 VLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);
213 break;
214 }
215 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
216 switch (blendMode) {
217 case SDL_BLENDMODE_BLEND:
218 DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);
219 break;
220 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
221 DLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555, draw_end);
222 break;
223 case SDL_BLENDMODE_ADD:
224 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
225 DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);
226 break;
227 case SDL_BLENDMODE_MOD:
228 DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);
229 break;
230 case SDL_BLENDMODE_MUL:
231 DLINE(Uint16, DRAW_SETPIXEL_MUL_RGB555, draw_end);
232 break;
233 default:
234 DLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);
235 break;
236 }
237 } else {
238 switch (blendMode) {
239 case SDL_BLENDMODE_BLEND:
240 AALINE(x1, y1, x2, y2,
241 DRAW_SETPIXELXY_BLEND_RGB555, DRAW_SETPIXELXY_BLEND_RGB555,
242 draw_end);
243 break;
244 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
245 AALINE(x1, y1, x2, y2,
246 DRAW_SETPIXELXY_BLEND_CLAMPED_RGB555, DRAW_SETPIXELXY_BLEND_CLAMPED_RGB555,
247 draw_end);
248 break;
249 case SDL_BLENDMODE_ADD:
250 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
251 AALINE(x1, y1, x2, y2,
252 DRAW_SETPIXELXY_ADD_RGB555, DRAW_SETPIXELXY_ADD_RGB555,
253 draw_end);
254 break;
255 case SDL_BLENDMODE_MOD:
256 AALINE(x1, y1, x2, y2,
257 DRAW_SETPIXELXY_MOD_RGB555, DRAW_SETPIXELXY_MOD_RGB555,
258 draw_end);
259 break;
260 case SDL_BLENDMODE_MUL:
261 AALINE(x1, y1, x2, y2,
262 DRAW_SETPIXELXY_MUL_RGB555, DRAW_SETPIXELXY_MUL_RGB555,
263 draw_end);
264 break;
265 default:
266 AALINE(x1, y1, x2, y2,
267 DRAW_SETPIXELXY_RGB555, DRAW_SETPIXELXY_BLEND_RGB555,
268 draw_end);
269 break;
270 }
271 }
272}
273
274static void SDL_BlendLine_RGB565(SDL_Surface *dst, int x1, int y1, int x2, int y2,
275 SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
276 bool draw_end)
277{
278 unsigned r, g, b, a, inva;
279
280 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
281 r = DRAW_MUL(_r, _a);
282 g = DRAW_MUL(_g, _a);
283 b = DRAW_MUL(_b, _a);
284 a = _a;
285 } else {
286 r = _r;
287 g = _g;
288 b = _b;
289 a = _a;
290 }
291 inva = (a ^ 0xff);
292
293 if (y1 == y2) {
294 switch (blendMode) {
295 case SDL_BLENDMODE_BLEND:
296 HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);
297 break;
298 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
299 HLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565, draw_end);
300 break;
301 case SDL_BLENDMODE_ADD:
302 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
303 HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);
304 break;
305 case SDL_BLENDMODE_MOD:
306 HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);
307 break;
308 case SDL_BLENDMODE_MUL:
309 HLINE(Uint16, DRAW_SETPIXEL_MUL_RGB565, draw_end);
310 break;
311 default:
312 HLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);
313 break;
314 }
315 } else if (x1 == x2) {
316 switch (blendMode) {
317 case SDL_BLENDMODE_BLEND:
318 VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);
319 break;
320 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
321 VLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565, draw_end);
322 break;
323 case SDL_BLENDMODE_ADD:
324 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
325 VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);
326 break;
327 case SDL_BLENDMODE_MOD:
328 VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);
329 break;
330 case SDL_BLENDMODE_MUL:
331 VLINE(Uint16, DRAW_SETPIXEL_MUL_RGB565, draw_end);
332 break;
333 default:
334 VLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);
335 break;
336 }
337 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
338 switch (blendMode) {
339 case SDL_BLENDMODE_BLEND:
340 DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);
341 break;
342 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
343 DLINE(Uint16, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565, draw_end);
344 break;
345 case SDL_BLENDMODE_ADD:
346 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
347 DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);
348 break;
349 case SDL_BLENDMODE_MOD:
350 DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);
351 break;
352 case SDL_BLENDMODE_MUL:
353 DLINE(Uint16, DRAW_SETPIXEL_MUL_RGB565, draw_end);
354 break;
355 default:
356 DLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);
357 break;
358 }
359 } else {
360 switch (blendMode) {
361 case SDL_BLENDMODE_BLEND:
362 AALINE(x1, y1, x2, y2,
363 DRAW_SETPIXELXY_BLEND_RGB565, DRAW_SETPIXELXY_BLEND_RGB565,
364 draw_end);
365 break;
366 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
367 AALINE(x1, y1, x2, y2,
368 DRAW_SETPIXELXY_BLEND_CLAMPED_RGB565, DRAW_SETPIXELXY_BLEND_CLAMPED_RGB565,
369 draw_end);
370 break;
371 case SDL_BLENDMODE_ADD:
372 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
373 AALINE(x1, y1, x2, y2,
374 DRAW_SETPIXELXY_ADD_RGB565, DRAW_SETPIXELXY_ADD_RGB565,
375 draw_end);
376 break;
377 case SDL_BLENDMODE_MOD:
378 AALINE(x1, y1, x2, y2,
379 DRAW_SETPIXELXY_MOD_RGB565, DRAW_SETPIXELXY_MOD_RGB565,
380 draw_end);
381 break;
382 case SDL_BLENDMODE_MUL:
383 AALINE(x1, y1, x2, y2,
384 DRAW_SETPIXELXY_MUL_RGB565, DRAW_SETPIXELXY_MUL_RGB565,
385 draw_end);
386 break;
387 default:
388 AALINE(x1, y1, x2, y2,
389 DRAW_SETPIXELXY_RGB565, DRAW_SETPIXELXY_BLEND_RGB565,
390 draw_end);
391 break;
392 }
393 }
394}
395
396static void SDL_BlendLine_RGB4(SDL_Surface *dst, int x1, int y1, int x2, int y2,
397 SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
398 bool draw_end)
399{
400 const SDL_PixelFormatDetails *fmt = dst->fmt;
401 unsigned r, g, b, a, inva;
402
403 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
404 r = DRAW_MUL(_r, _a);
405 g = DRAW_MUL(_g, _a);
406 b = DRAW_MUL(_b, _a);
407 a = _a;
408 } else {
409 r = _r;
410 g = _g;
411 b = _b;
412 a = _a;
413 }
414 inva = (a ^ 0xff);
415
416 if (y1 == y2) {
417 switch (blendMode) {
418 case SDL_BLENDMODE_BLEND:
419 HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);
420 break;
421 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
422 HLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end);
423 break;
424 case SDL_BLENDMODE_ADD:
425 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
426 HLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);
427 break;
428 case SDL_BLENDMODE_MOD:
429 HLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);
430 break;
431 case SDL_BLENDMODE_MUL:
432 HLINE(Uint32, DRAW_SETPIXEL_MUL_RGB, draw_end);
433 break;
434 default:
435 HLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);
436 break;
437 }
438 } else if (x1 == x2) {
439 switch (blendMode) {
440 case SDL_BLENDMODE_BLEND:
441 VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);
442 break;
443 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
444 VLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end);
445 break;
446 case SDL_BLENDMODE_ADD:
447 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
448 VLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);
449 break;
450 case SDL_BLENDMODE_MOD:
451 VLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);
452 break;
453 case SDL_BLENDMODE_MUL:
454 VLINE(Uint32, DRAW_SETPIXEL_MUL_RGB, draw_end);
455 break;
456 default:
457 VLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);
458 break;
459 }
460 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
461 switch (blendMode) {
462 case SDL_BLENDMODE_BLEND:
463 DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);
464 break;
465 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
466 DLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGB, draw_end);
467 break;
468 case SDL_BLENDMODE_ADD:
469 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
470 DLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);
471 break;
472 case SDL_BLENDMODE_MOD:
473 DLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);
474 break;
475 case SDL_BLENDMODE_MUL:
476 DLINE(Uint32, DRAW_SETPIXEL_MUL_RGB, draw_end);
477 break;
478 default:
479 DLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);
480 break;
481 }
482 } else {
483 switch (blendMode) {
484 case SDL_BLENDMODE_BLEND:
485 AALINE(x1, y1, x2, y2,
486 DRAW_SETPIXELXY4_BLEND_RGB, DRAW_SETPIXELXY4_BLEND_RGB,
487 draw_end);
488 break;
489 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
490 AALINE(x1, y1, x2, y2,
491 DRAW_SETPIXELXY4_BLEND_CLAMPED_RGB, DRAW_SETPIXELXY4_BLEND_CLAMPED_RGB,
492 draw_end);
493 break;
494 case SDL_BLENDMODE_ADD:
495 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
496 AALINE(x1, y1, x2, y2,
497 DRAW_SETPIXELXY4_ADD_RGB, DRAW_SETPIXELXY4_ADD_RGB,
498 draw_end);
499 break;
500 case SDL_BLENDMODE_MOD:
501 AALINE(x1, y1, x2, y2,
502 DRAW_SETPIXELXY4_MOD_RGB, DRAW_SETPIXELXY4_MOD_RGB,
503 draw_end);
504 break;
505 case SDL_BLENDMODE_MUL:
506 AALINE(x1, y1, x2, y2,
507 DRAW_SETPIXELXY4_MUL_RGB, DRAW_SETPIXELXY4_MUL_RGB,
508 draw_end);
509 break;
510 default:
511 AALINE(x1, y1, x2, y2,
512 DRAW_SETPIXELXY4_RGB, DRAW_SETPIXELXY4_BLEND_RGB,
513 draw_end);
514 break;
515 }
516 }
517}
518
519static void SDL_BlendLine_RGBA4(SDL_Surface *dst, int x1, int y1, int x2, int y2,
520 SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
521 bool draw_end)
522{
523 const SDL_PixelFormatDetails *fmt = dst->fmt;
524 unsigned r, g, b, a, inva;
525
526 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
527 r = DRAW_MUL(_r, _a);
528 g = DRAW_MUL(_g, _a);
529 b = DRAW_MUL(_b, _a);
530 a = _a;
531 } else {
532 r = _r;
533 g = _g;
534 b = _b;
535 a = _a;
536 }
537 inva = (a ^ 0xff);
538
539 if (y1 == y2) {
540 switch (blendMode) {
541 case SDL_BLENDMODE_BLEND:
542 HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);
543 break;
544 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
545 HLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA, draw_end);
546 break;
547 case SDL_BLENDMODE_ADD:
548 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
549 HLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);
550 break;
551 case SDL_BLENDMODE_MOD:
552 HLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);
553 break;
554 case SDL_BLENDMODE_MUL:
555 HLINE(Uint32, DRAW_SETPIXEL_MUL_RGBA, draw_end);
556 break;
557 default:
558 HLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);
559 break;
560 }
561 } else if (x1 == x2) {
562 switch (blendMode) {
563 case SDL_BLENDMODE_BLEND:
564 VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);
565 break;
566 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
567 VLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA, draw_end);
568 break;
569 case SDL_BLENDMODE_ADD:
570 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
571 VLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);
572 break;
573 case SDL_BLENDMODE_MOD:
574 VLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);
575 break;
576 case SDL_BLENDMODE_MUL:
577 VLINE(Uint32, DRAW_SETPIXEL_MUL_RGBA, draw_end);
578 break;
579 default:
580 VLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);
581 break;
582 }
583 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
584 switch (blendMode) {
585 case SDL_BLENDMODE_BLEND:
586 DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);
587 break;
588 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
589 DLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA, draw_end);
590 break;
591 case SDL_BLENDMODE_ADD:
592 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
593 DLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);
594 break;
595 case SDL_BLENDMODE_MOD:
596 DLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);
597 break;
598 case SDL_BLENDMODE_MUL:
599 DLINE(Uint32, DRAW_SETPIXEL_MUL_RGBA, draw_end);
600 break;
601 default:
602 DLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);
603 break;
604 }
605 } else {
606 switch (blendMode) {
607 case SDL_BLENDMODE_BLEND:
608 AALINE(x1, y1, x2, y2,
609 DRAW_SETPIXELXY4_BLEND_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA,
610 draw_end);
611 break;
612 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
613 AALINE(x1, y1, x2, y2,
614 DRAW_SETPIXELXY4_BLEND_CLAMPED_RGBA, DRAW_SETPIXELXY4_BLEND_CLAMPED_RGBA,
615 draw_end);
616 break;
617 case SDL_BLENDMODE_ADD:
618 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
619 AALINE(x1, y1, x2, y2,
620 DRAW_SETPIXELXY4_ADD_RGBA, DRAW_SETPIXELXY4_ADD_RGBA,
621 draw_end);
622 break;
623 case SDL_BLENDMODE_MOD:
624 AALINE(x1, y1, x2, y2,
625 DRAW_SETPIXELXY4_MOD_RGBA, DRAW_SETPIXELXY4_MOD_RGBA,
626 draw_end);
627 break;
628 case SDL_BLENDMODE_MUL:
629 AALINE(x1, y1, x2, y2,
630 DRAW_SETPIXELXY4_MUL_RGBA, DRAW_SETPIXELXY4_MUL_RGBA,
631 draw_end);
632 break;
633 default:
634 AALINE(x1, y1, x2, y2,
635 DRAW_SETPIXELXY4_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA,
636 draw_end);
637 break;
638 }
639 }
640}
641
642static void SDL_BlendLine_XRGB8888(SDL_Surface *dst, int x1, int y1, int x2, int y2,
643 SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
644 bool draw_end)
645{
646 unsigned r, g, b, a, inva;
647
648 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
649 r = DRAW_MUL(_r, _a);
650 g = DRAW_MUL(_g, _a);
651 b = DRAW_MUL(_b, _a);
652 a = _a;
653 } else {
654 r = _r;
655 g = _g;
656 b = _b;
657 a = _a;
658 }
659 inva = (a ^ 0xff);
660
661 if (y1 == y2) {
662 switch (blendMode) {
663 case SDL_BLENDMODE_BLEND:
664 HLINE(Uint32, DRAW_SETPIXEL_BLEND_XRGB8888, draw_end);
665 break;
666 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
667 HLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888, draw_end);
668 break;
669 case SDL_BLENDMODE_ADD:
670 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
671 HLINE(Uint32, DRAW_SETPIXEL_ADD_XRGB8888, draw_end);
672 break;
673 case SDL_BLENDMODE_MOD:
674 HLINE(Uint32, DRAW_SETPIXEL_MOD_XRGB8888, draw_end);
675 break;
676 case SDL_BLENDMODE_MUL:
677 HLINE(Uint32, DRAW_SETPIXEL_MUL_XRGB8888, draw_end);
678 break;
679 default:
680 HLINE(Uint32, DRAW_SETPIXEL_XRGB8888, draw_end);
681 break;
682 }
683 } else if (x1 == x2) {
684 switch (blendMode) {
685 case SDL_BLENDMODE_BLEND:
686 VLINE(Uint32, DRAW_SETPIXEL_BLEND_XRGB8888, draw_end);
687 break;
688 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
689 VLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888, draw_end);
690 break;
691 case SDL_BLENDMODE_ADD:
692 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
693 VLINE(Uint32, DRAW_SETPIXEL_ADD_XRGB8888, draw_end);
694 break;
695 case SDL_BLENDMODE_MOD:
696 VLINE(Uint32, DRAW_SETPIXEL_MOD_XRGB8888, draw_end);
697 break;
698 case SDL_BLENDMODE_MUL:
699 VLINE(Uint32, DRAW_SETPIXEL_MUL_XRGB8888, draw_end);
700 break;
701 default:
702 VLINE(Uint32, DRAW_SETPIXEL_XRGB8888, draw_end);
703 break;
704 }
705 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
706 switch (blendMode) {
707 case SDL_BLENDMODE_BLEND:
708 DLINE(Uint32, DRAW_SETPIXEL_BLEND_XRGB8888, draw_end);
709 break;
710 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
711 DLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888, draw_end);
712 break;
713 case SDL_BLENDMODE_ADD:
714 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
715 DLINE(Uint32, DRAW_SETPIXEL_ADD_XRGB8888, draw_end);
716 break;
717 case SDL_BLENDMODE_MOD:
718 DLINE(Uint32, DRAW_SETPIXEL_MOD_XRGB8888, draw_end);
719 break;
720 case SDL_BLENDMODE_MUL:
721 DLINE(Uint32, DRAW_SETPIXEL_MUL_XRGB8888, draw_end);
722 break;
723 default:
724 DLINE(Uint32, DRAW_SETPIXEL_XRGB8888, draw_end);
725 break;
726 }
727 } else {
728 switch (blendMode) {
729 case SDL_BLENDMODE_BLEND:
730 AALINE(x1, y1, x2, y2,
731 DRAW_SETPIXELXY_BLEND_XRGB8888, DRAW_SETPIXELXY_BLEND_XRGB8888,
732 draw_end);
733 break;
734 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
735 AALINE(x1, y1, x2, y2,
736 DRAW_SETPIXELXY_BLEND_CLAMPED_XRGB8888, DRAW_SETPIXELXY_BLEND_CLAMPED_XRGB8888,
737 draw_end);
738 break;
739 case SDL_BLENDMODE_ADD:
740 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
741 AALINE(x1, y1, x2, y2,
742 DRAW_SETPIXELXY_ADD_XRGB8888, DRAW_SETPIXELXY_ADD_XRGB8888,
743 draw_end);
744 break;
745 case SDL_BLENDMODE_MOD:
746 AALINE(x1, y1, x2, y2,
747 DRAW_SETPIXELXY_MOD_XRGB8888, DRAW_SETPIXELXY_MOD_XRGB8888,
748 draw_end);
749 break;
750 case SDL_BLENDMODE_MUL:
751 AALINE(x1, y1, x2, y2,
752 DRAW_SETPIXELXY_MUL_XRGB8888, DRAW_SETPIXELXY_MUL_XRGB8888,
753 draw_end);
754 break;
755 default:
756 AALINE(x1, y1, x2, y2,
757 DRAW_SETPIXELXY_XRGB8888, DRAW_SETPIXELXY_BLEND_XRGB8888,
758 draw_end);
759 break;
760 }
761 }
762}
763
764static void SDL_BlendLine_ARGB8888(SDL_Surface *dst, int x1, int y1, int x2, int y2,
765 SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
766 bool draw_end)
767{
768 unsigned r, g, b, a, inva;
769
770 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
771 r = DRAW_MUL(_r, _a);
772 g = DRAW_MUL(_g, _a);
773 b = DRAW_MUL(_b, _a);
774 a = _a;
775 } else {
776 r = _r;
777 g = _g;
778 b = _b;
779 a = _a;
780 }
781 inva = (a ^ 0xff);
782
783 if (y1 == y2) {
784 switch (blendMode) {
785 case SDL_BLENDMODE_BLEND:
786 HLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);
787 break;
788 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
789 HLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888, draw_end);
790 break;
791 case SDL_BLENDMODE_ADD:
792 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
793 HLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);
794 break;
795 case SDL_BLENDMODE_MOD:
796 HLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);
797 break;
798 case SDL_BLENDMODE_MUL:
799 HLINE(Uint32, DRAW_SETPIXEL_MUL_ARGB8888, draw_end);
800 break;
801 default:
802 HLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);
803 break;
804 }
805 } else if (x1 == x2) {
806 switch (blendMode) {
807 case SDL_BLENDMODE_BLEND:
808 VLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);
809 break;
810 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
811 VLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888, draw_end);
812 break;
813 case SDL_BLENDMODE_ADD:
814 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
815 VLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);
816 break;
817 case SDL_BLENDMODE_MOD:
818 VLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);
819 break;
820 case SDL_BLENDMODE_MUL:
821 VLINE(Uint32, DRAW_SETPIXEL_MUL_ARGB8888, draw_end);
822 break;
823 default:
824 VLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);
825 break;
826 }
827 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
828 switch (blendMode) {
829 case SDL_BLENDMODE_BLEND:
830 DLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);
831 break;
832 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
833 DLINE(Uint32, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888, draw_end);
834 break;
835 case SDL_BLENDMODE_ADD:
836 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
837 DLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);
838 break;
839 case SDL_BLENDMODE_MOD:
840 DLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);
841 break;
842 case SDL_BLENDMODE_MUL:
843 DLINE(Uint32, DRAW_SETPIXEL_MUL_ARGB8888, draw_end);
844 break;
845 default:
846 DLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);
847 break;
848 }
849 } else {
850 switch (blendMode) {
851 case SDL_BLENDMODE_BLEND:
852 AALINE(x1, y1, x2, y2,
853 DRAW_SETPIXELXY_BLEND_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888,
854 draw_end);
855 break;
856 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
857 AALINE(x1, y1, x2, y2,
858 DRAW_SETPIXELXY_BLEND_CLAMPED_ARGB8888, DRAW_SETPIXELXY_BLEND_CLAMPED_ARGB8888,
859 draw_end);
860 break;
861 case SDL_BLENDMODE_ADD:
862 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
863 AALINE(x1, y1, x2, y2,
864 DRAW_SETPIXELXY_ADD_ARGB8888, DRAW_SETPIXELXY_ADD_ARGB8888,
865 draw_end);
866 break;
867 case SDL_BLENDMODE_MOD:
868 AALINE(x1, y1, x2, y2,
869 DRAW_SETPIXELXY_MOD_ARGB8888, DRAW_SETPIXELXY_MOD_ARGB8888,
870 draw_end);
871 break;
872 case SDL_BLENDMODE_MUL:
873 AALINE(x1, y1, x2, y2,
874 DRAW_SETPIXELXY_MUL_ARGB8888, DRAW_SETPIXELXY_MUL_ARGB8888,
875 draw_end);
876 break;
877 default:
878 AALINE(x1, y1, x2, y2,
879 DRAW_SETPIXELXY_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888,
880 draw_end);
881 break;
882 }
883 }
884}
885
886typedef void (*BlendLineFunc)(SDL_Surface *dst,
887 int x1, int y1, int x2, int y2,
888 SDL_BlendMode blendMode,
889 Uint8 r, Uint8 g, Uint8 b, Uint8 a,
890 bool draw_end);
891
892static BlendLineFunc SDL_CalculateBlendLineFunc(const SDL_PixelFormatDetails *fmt)
893{
894 switch (fmt->bytes_per_pixel) {
895 case 2:
896 if (fmt->Rmask == 0x7C00) {
897 return SDL_BlendLine_RGB555;
898 } else if (fmt->Rmask == 0xF800) {
899 return SDL_BlendLine_RGB565;
900 } else {
901 return SDL_BlendLine_RGB2;
902 }
903 // break; -Wunreachable-code-break
904 case 4:
905 if (fmt->Rmask == 0x00FF0000) {
906 if (fmt->Amask) {
907 return SDL_BlendLine_ARGB8888;
908 } else {
909 return SDL_BlendLine_XRGB8888;
910 }
911 } else {
912 if (fmt->Amask) {
913 return SDL_BlendLine_RGBA4;
914 } else {
915 return SDL_BlendLine_RGB4;
916 }
917 }
918 }
919 return NULL;
920}
921
922bool SDL_BlendLine(SDL_Surface *dst, int x1, int y1, int x2, int y2, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
923{
924 BlendLineFunc func;
925
926 if (!SDL_SurfaceValid(dst)) {
927 return SDL_InvalidParamError("SDL_BlendLine(): dst");
928 }
929
930 func = SDL_CalculateBlendLineFunc(dst->fmt);
931 if (!func) {
932 return SDL_SetError("SDL_BlendLine(): Unsupported surface format");
933 }
934
935 // Perform clipping
936 // FIXME: We don't actually want to clip, as it may change line slope
937 if (!SDL_GetRectAndLineIntersection(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
938 return true;
939 }
940
941 func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, true);
942 return true;
943}
944
945bool SDL_BlendLines(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
946{
947 int i;
948 int x1, y1;
949 int x2, y2;
950 bool draw_end;
951 BlendLineFunc func;
952
953 if (!SDL_SurfaceValid(dst)) {
954 return SDL_SetError("SDL_BlendLines(): Passed NULL destination surface");
955 }
956
957 func = SDL_CalculateBlendLineFunc(dst->fmt);
958 if (!func) {
959 return SDL_SetError("SDL_BlendLines(): Unsupported surface format");
960 }
961
962 for (i = 1; i < count; ++i) {
963 x1 = points[i - 1].x;
964 y1 = points[i - 1].y;
965 x2 = points[i].x;
966 y2 = points[i].y;
967
968 // Perform clipping
969 // FIXME: We don't actually want to clip, as it may change line slope
970 if (!SDL_GetRectAndLineIntersection(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
971 continue;
972 }
973
974 // Draw the end if it was clipped
975 draw_end = (x2 != points[i].x || y2 != points[i].y);
976
977 func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, draw_end);
978 }
979 if (points[0].x != points[count - 1].x || points[0].y != points[count - 1].y) {
980 SDL_BlendPoint(dst, points[count - 1].x, points[count - 1].y,
981 blendMode, r, g, b, a);
982 }
983 return true;
984}
985
986#endif // SDL_VIDEO_RENDER_SW
diff --git a/SDL-3.2.8/src/render/software/SDL_blendline.h b/SDL-3.2.8/src/render/software/SDL_blendline.h
new file mode 100644
index 0000000..c9a8b20
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_blendline.h
@@ -0,0 +1,30 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_blendline_h_
23#define SDL_blendline_h_
24
25#include "SDL_internal.h"
26
27extern bool SDL_BlendLine(SDL_Surface *dst, int x1, int y1, int x2, int y2, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
28extern bool SDL_BlendLines(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
29
30#endif // SDL_blendline_h_
diff --git a/SDL-3.2.8/src/render/software/SDL_blendpoint.c b/SDL-3.2.8/src/render/software/SDL_blendpoint.c
new file mode 100644
index 0000000..e408453
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_blendpoint.c
@@ -0,0 +1,376 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_SW
24
25#include "SDL_draw.h"
26#include "SDL_blendpoint.h"
27
28static bool SDL_BlendPoint_RGB555(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,
29 Uint8 g, Uint8 b, Uint8 a)
30{
31 unsigned inva = 0xff - a;
32
33 switch (blendMode) {
34 case SDL_BLENDMODE_BLEND:
35 DRAW_SETPIXELXY_BLEND_RGB555(x, y);
36 break;
37 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
38 DRAW_SETPIXELXY_BLEND_CLAMPED_RGB555(x, y);
39 break;
40 case SDL_BLENDMODE_ADD:
41 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
42 DRAW_SETPIXELXY_ADD_RGB555(x, y);
43 break;
44 case SDL_BLENDMODE_MOD:
45 DRAW_SETPIXELXY_MOD_RGB555(x, y);
46 break;
47 case SDL_BLENDMODE_MUL:
48 DRAW_SETPIXELXY_MUL_RGB555(x, y);
49 break;
50 default:
51 DRAW_SETPIXELXY_RGB555(x, y);
52 break;
53 }
54 return true;
55}
56
57static bool SDL_BlendPoint_RGB565(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,
58 Uint8 g, Uint8 b, Uint8 a)
59{
60 unsigned inva = 0xff - a;
61
62 switch (blendMode) {
63 case SDL_BLENDMODE_BLEND:
64 DRAW_SETPIXELXY_BLEND_RGB565(x, y);
65 break;
66 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
67 DRAW_SETPIXELXY_BLEND_CLAMPED_RGB565(x, y);
68 break;
69 case SDL_BLENDMODE_ADD:
70 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
71 DRAW_SETPIXELXY_ADD_RGB565(x, y);
72 break;
73 case SDL_BLENDMODE_MOD:
74 DRAW_SETPIXELXY_MOD_RGB565(x, y);
75 break;
76 case SDL_BLENDMODE_MUL:
77 DRAW_SETPIXELXY_MUL_RGB565(x, y);
78 break;
79 default:
80 DRAW_SETPIXELXY_RGB565(x, y);
81 break;
82 }
83 return true;
84}
85
86static bool SDL_BlendPoint_XRGB8888(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,
87 Uint8 g, Uint8 b, Uint8 a)
88{
89 unsigned inva = 0xff - a;
90
91 switch (blendMode) {
92 case SDL_BLENDMODE_BLEND:
93 DRAW_SETPIXELXY_BLEND_XRGB8888(x, y);
94 break;
95 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
96 DRAW_SETPIXELXY_BLEND_CLAMPED_XRGB8888(x, y);
97 break;
98 case SDL_BLENDMODE_ADD:
99 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
100 DRAW_SETPIXELXY_ADD_XRGB8888(x, y);
101 break;
102 case SDL_BLENDMODE_MOD:
103 DRAW_SETPIXELXY_MOD_XRGB8888(x, y);
104 break;
105 case SDL_BLENDMODE_MUL:
106 DRAW_SETPIXELXY_MUL_XRGB8888(x, y);
107 break;
108 default:
109 DRAW_SETPIXELXY_XRGB8888(x, y);
110 break;
111 }
112 return true;
113}
114
115static bool SDL_BlendPoint_ARGB8888(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode,
116 Uint8 r, Uint8 g, Uint8 b, Uint8 a)
117{
118 unsigned inva = 0xff - a;
119
120 switch (blendMode) {
121 case SDL_BLENDMODE_BLEND:
122 DRAW_SETPIXELXY_BLEND_ARGB8888(x, y);
123 break;
124 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
125 DRAW_SETPIXELXY_BLEND_CLAMPED_ARGB8888(x, y);
126 break;
127 case SDL_BLENDMODE_ADD:
128 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
129 DRAW_SETPIXELXY_ADD_ARGB8888(x, y);
130 break;
131 case SDL_BLENDMODE_MOD:
132 DRAW_SETPIXELXY_MOD_ARGB8888(x, y);
133 break;
134 case SDL_BLENDMODE_MUL:
135 DRAW_SETPIXELXY_MUL_ARGB8888(x, y);
136 break;
137 default:
138 DRAW_SETPIXELXY_ARGB8888(x, y);
139 break;
140 }
141 return true;
142}
143
144static bool SDL_BlendPoint_RGB(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,
145 Uint8 g, Uint8 b, Uint8 a)
146{
147 const SDL_PixelFormatDetails *fmt = dst->fmt;
148 unsigned inva = 0xff - a;
149
150 switch (fmt->bytes_per_pixel) {
151 case 2:
152 switch (blendMode) {
153 case SDL_BLENDMODE_BLEND:
154 DRAW_SETPIXELXY2_BLEND_RGB(x, y);
155 break;
156 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
157 DRAW_SETPIXELXY2_BLEND_CLAMPED_RGB(x, y);
158 break;
159 case SDL_BLENDMODE_ADD:
160 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
161 DRAW_SETPIXELXY2_ADD_RGB(x, y);
162 break;
163 case SDL_BLENDMODE_MOD:
164 DRAW_SETPIXELXY2_MOD_RGB(x, y);
165 break;
166 case SDL_BLENDMODE_MUL:
167 DRAW_SETPIXELXY2_MUL_RGB(x, y);
168 break;
169 default:
170 DRAW_SETPIXELXY2_RGB(x, y);
171 break;
172 }
173 return true;
174 case 4:
175 switch (blendMode) {
176 case SDL_BLENDMODE_BLEND:
177 DRAW_SETPIXELXY4_BLEND_RGB(x, y);
178 break;
179 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
180 DRAW_SETPIXELXY4_BLEND_CLAMPED_RGB(x, y);
181 break;
182 case SDL_BLENDMODE_ADD:
183 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
184 DRAW_SETPIXELXY4_ADD_RGB(x, y);
185 break;
186 case SDL_BLENDMODE_MOD:
187 DRAW_SETPIXELXY4_MOD_RGB(x, y);
188 break;
189 case SDL_BLENDMODE_MUL:
190 DRAW_SETPIXELXY4_MUL_RGB(x, y);
191 break;
192 default:
193 DRAW_SETPIXELXY4_RGB(x, y);
194 break;
195 }
196 return true;
197 default:
198 return SDL_Unsupported();
199 }
200}
201
202static bool SDL_BlendPoint_RGBA(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r,
203 Uint8 g, Uint8 b, Uint8 a)
204{
205 const SDL_PixelFormatDetails *fmt = dst->fmt;
206 unsigned inva = 0xff - a;
207
208 switch (fmt->bytes_per_pixel) {
209 case 4:
210 switch (blendMode) {
211 case SDL_BLENDMODE_BLEND:
212 DRAW_SETPIXELXY4_BLEND_RGBA(x, y);
213 break;
214 case SDL_BLENDMODE_BLEND_PREMULTIPLIED:
215 DRAW_SETPIXELXY4_BLEND_CLAMPED_RGBA(x, y);
216 break;
217 case SDL_BLENDMODE_ADD:
218 case SDL_BLENDMODE_ADD_PREMULTIPLIED:
219 DRAW_SETPIXELXY4_ADD_RGBA(x, y);
220 break;
221 case SDL_BLENDMODE_MOD:
222 DRAW_SETPIXELXY4_MOD_RGBA(x, y);
223 break;
224 case SDL_BLENDMODE_MUL:
225 DRAW_SETPIXELXY4_MUL_RGBA(x, y);
226 break;
227 default:
228 DRAW_SETPIXELXY4_RGBA(x, y);
229 break;
230 }
231 return true;
232 default:
233 return SDL_Unsupported();
234 }
235}
236
237bool SDL_BlendPoint(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
238{
239 if (!SDL_SurfaceValid(dst)) {
240 return SDL_InvalidParamError("SDL_BlendPoint(): dst");
241 }
242
243 // This function doesn't work on surfaces < 8 bpp
244 if (SDL_BITSPERPIXEL(dst->format) < 8) {
245 return SDL_SetError("SDL_BlendPoint(): Unsupported surface format");
246 }
247
248 // Perform clipping
249 if (x < dst->clip_rect.x || y < dst->clip_rect.y ||
250 x >= (dst->clip_rect.x + dst->clip_rect.w) ||
251 y >= (dst->clip_rect.y + dst->clip_rect.h)) {
252 return true;
253 }
254
255 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
256 r = DRAW_MUL(r, a);
257 g = DRAW_MUL(g, a);
258 b = DRAW_MUL(b, a);
259 }
260
261 switch (dst->fmt->bits_per_pixel) {
262 case 15:
263 switch (dst->fmt->Rmask) {
264 case 0x7C00:
265 return SDL_BlendPoint_RGB555(dst, x, y, blendMode, r, g, b, a);
266 }
267 break;
268 case 16:
269 switch (dst->fmt->Rmask) {
270 case 0xF800:
271 return SDL_BlendPoint_RGB565(dst, x, y, blendMode, r, g, b, a);
272 }
273 break;
274 case 32:
275 switch (dst->fmt->Rmask) {
276 case 0x00FF0000:
277 if (!dst->fmt->Amask) {
278 return SDL_BlendPoint_XRGB8888(dst, x, y, blendMode, r, g, b, a);
279 } else {
280 return SDL_BlendPoint_ARGB8888(dst, x, y, blendMode, r, g, b, a);
281 }
282 // break; -Wunreachable-code-break
283 }
284 break;
285 default:
286 break;
287 }
288
289 if (!dst->fmt->Amask) {
290 return SDL_BlendPoint_RGB(dst, x, y, blendMode, r, g, b, a);
291 } else {
292 return SDL_BlendPoint_RGBA(dst, x, y, blendMode, r, g, b, a);
293 }
294}
295
296bool SDL_BlendPoints(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
297{
298 int minx, miny;
299 int maxx, maxy;
300 int i;
301 int x, y;
302 bool (*func)(SDL_Surface * dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) = NULL;
303 bool result = true;
304
305 if (!SDL_SurfaceValid(dst)) {
306 return SDL_InvalidParamError("SDL_BlendPoints(): dst");
307 }
308
309 // This function doesn't work on surfaces < 8 bpp
310 if (dst->fmt->bits_per_pixel < 8) {
311 return SDL_SetError("SDL_BlendPoints(): Unsupported surface format");
312 }
313
314 if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
315 r = DRAW_MUL(r, a);
316 g = DRAW_MUL(g, a);
317 b = DRAW_MUL(b, a);
318 }
319
320 // FIXME: Does this function pointer slow things down significantly?
321 switch (dst->fmt->bits_per_pixel) {
322 case 15:
323 switch (dst->fmt->Rmask) {
324 case 0x7C00:
325 func = SDL_BlendPoint_RGB555;
326 break;
327 }
328 break;
329 case 16:
330 switch (dst->fmt->Rmask) {
331 case 0xF800:
332 func = SDL_BlendPoint_RGB565;
333 break;
334 }
335 break;
336 case 32:
337 switch (dst->fmt->Rmask) {
338 case 0x00FF0000:
339 if (!dst->fmt->Amask) {
340 func = SDL_BlendPoint_XRGB8888;
341 } else {
342 func = SDL_BlendPoint_ARGB8888;
343 }
344 break;
345 }
346 break;
347 default:
348 break;
349 }
350
351 if (!func) {
352 if (!dst->fmt->Amask) {
353 func = SDL_BlendPoint_RGB;
354 } else {
355 func = SDL_BlendPoint_RGBA;
356 }
357 }
358
359 minx = dst->clip_rect.x;
360 maxx = dst->clip_rect.x + dst->clip_rect.w - 1;
361 miny = dst->clip_rect.y;
362 maxy = dst->clip_rect.y + dst->clip_rect.h - 1;
363
364 for (i = 0; i < count; ++i) {
365 x = points[i].x;
366 y = points[i].y;
367
368 if (x < minx || x > maxx || y < miny || y > maxy) {
369 continue;
370 }
371 result = func(dst, x, y, blendMode, r, g, b, a);
372 }
373 return result;
374}
375
376#endif // SDL_VIDEO_RENDER_SW
diff --git a/SDL-3.2.8/src/render/software/SDL_blendpoint.h b/SDL-3.2.8/src/render/software/SDL_blendpoint.h
new file mode 100644
index 0000000..6dfe49a
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_blendpoint.h
@@ -0,0 +1,30 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_blendpoint_h_
23#define SDL_blendpoint_h_
24
25#include "SDL_internal.h"
26
27extern bool SDL_BlendPoint(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
28extern bool SDL_BlendPoints(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
29
30#endif // SDL_blendpoint_h_
diff --git a/SDL-3.2.8/src/render/software/SDL_draw.h b/SDL-3.2.8/src/render/software/SDL_draw.h
new file mode 100644
index 0000000..ec77527
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_draw.h
@@ -0,0 +1,723 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#include "../../video/SDL_surface_c.h"
24
25/* This code assumes that r, g, b, a are the source color,
26 * and in the blend and add case, the RGB values are premultiplied by a.
27 */
28
29#define DRAW_MUL(_a, _b) (((unsigned)(_a) * (_b)) / 255)
30
31#define DRAW_FASTSETPIXEL(type) \
32 *pixel = (type)color
33
34#define DRAW_FASTSETPIXEL1 DRAW_FASTSETPIXEL(Uint8)
35#define DRAW_FASTSETPIXEL2 DRAW_FASTSETPIXEL(Uint16)
36#define DRAW_FASTSETPIXEL4 DRAW_FASTSETPIXEL(Uint32)
37
38#define DRAW_FASTSETPIXELXY(x, y, type, bpp, color) \
39 *(type *)((Uint8 *)dst->pixels + (y)*dst->pitch + (x)*bpp) = (type)color
40
41#define DRAW_FASTSETPIXELXY1(x, y) DRAW_FASTSETPIXELXY(x, y, Uint8, 1, color)
42#define DRAW_FASTSETPIXELXY2(x, y) DRAW_FASTSETPIXELXY(x, y, Uint16, 2, color)
43#define DRAW_FASTSETPIXELXY4(x, y) DRAW_FASTSETPIXELXY(x, y, Uint32, 4, color)
44
45#define DRAW_SETPIXEL(setpixel) \
46 do { \
47 unsigned sr = r, sg = g, sb = b, sa = a; \
48 (void)sa; \
49 setpixel; \
50 } while (0)
51
52#define DRAW_SETPIXEL_BLEND(getpixel, setpixel) \
53 do { \
54 unsigned sr, sg, sb, sa = 0xFF; \
55 getpixel; \
56 sr = DRAW_MUL(inva, sr) + r; \
57 sg = DRAW_MUL(inva, sg) + g; \
58 sb = DRAW_MUL(inva, sb) + b; \
59 sa = DRAW_MUL(inva, sa) + a; \
60 setpixel; \
61 } while (0)
62
63#define DRAW_SETPIXEL_BLEND_CLAMPED(getpixel, setpixel) \
64 do { \
65 unsigned sr, sg, sb, sa = 0xFF; \
66 getpixel; \
67 sr = DRAW_MUL(inva, sr) + r; \
68 if (sr > 0xff) \
69 sr = 0xff; \
70 sg = DRAW_MUL(inva, sg) + g; \
71 if (sg > 0xff) \
72 sg = 0xff; \
73 sb = DRAW_MUL(inva, sb) + b; \
74 if (sb > 0xff) \
75 sb = 0xff; \
76 sa = DRAW_MUL(inva, sa) + a; \
77 if (sa > 0xff) \
78 sa = 0xff; \
79 setpixel; \
80 } while (0)
81
82#define DRAW_SETPIXEL_ADD(getpixel, setpixel) \
83 do { \
84 unsigned sr, sg, sb, sa; \
85 (void)sa; \
86 getpixel; \
87 sr += r; \
88 if (sr > 0xff) \
89 sr = 0xff; \
90 sg += g; \
91 if (sg > 0xff) \
92 sg = 0xff; \
93 sb += b; \
94 if (sb > 0xff) \
95 sb = 0xff; \
96 setpixel; \
97 } while (0)
98
99#define DRAW_SETPIXEL_MOD(getpixel, setpixel) \
100 do { \
101 unsigned sr, sg, sb, sa; \
102 (void)sa; \
103 getpixel; \
104 sr = DRAW_MUL(sr, r); \
105 sg = DRAW_MUL(sg, g); \
106 sb = DRAW_MUL(sb, b); \
107 setpixel; \
108 } while (0)
109
110#define DRAW_SETPIXEL_MUL(getpixel, setpixel) \
111 do { \
112 unsigned sr, sg, sb, sa; \
113 (void)sa; \
114 getpixel; \
115 sr = DRAW_MUL(sr, r) + DRAW_MUL(inva, sr); \
116 if (sr > 0xff) \
117 sr = 0xff; \
118 sg = DRAW_MUL(sg, g) + DRAW_MUL(inva, sg); \
119 if (sg > 0xff) \
120 sg = 0xff; \
121 sb = DRAW_MUL(sb, b) + DRAW_MUL(inva, sb); \
122 if (sb > 0xff) \
123 sb = 0xff; \
124 setpixel; \
125 } while (0)
126
127#define DRAW_SETPIXELXY(x, y, type, bpp, op) \
128 do { \
129 type *pixel = (type *)((Uint8 *)dst->pixels + (y)*dst->pitch + (x)*bpp); \
130 op; \
131 } while (0)
132
133/*
134 * Define draw operators for RGB555
135 */
136
137#define DRAW_SETPIXEL_RGB555 \
138 DRAW_SETPIXEL(RGB555_FROM_RGB(*pixel, sr, sg, sb))
139
140#define DRAW_SETPIXEL_BLEND_RGB555 \
141 DRAW_SETPIXEL_BLEND(RGB_FROM_RGB555(*pixel, sr, sg, sb), \
142 RGB555_FROM_RGB(*pixel, sr, sg, sb))
143
144#define DRAW_SETPIXEL_BLEND_CLAMPED_RGB555 \
145 DRAW_SETPIXEL_BLEND_CLAMPED(RGB_FROM_RGB555(*pixel, sr, sg, sb), \
146 RGB555_FROM_RGB(*pixel, sr, sg, sb))
147
148#define DRAW_SETPIXEL_ADD_RGB555 \
149 DRAW_SETPIXEL_ADD(RGB_FROM_RGB555(*pixel, sr, sg, sb), \
150 RGB555_FROM_RGB(*pixel, sr, sg, sb))
151
152#define DRAW_SETPIXEL_MOD_RGB555 \
153 DRAW_SETPIXEL_MOD(RGB_FROM_RGB555(*pixel, sr, sg, sb), \
154 RGB555_FROM_RGB(*pixel, sr, sg, sb))
155
156#define DRAW_SETPIXEL_MUL_RGB555 \
157 DRAW_SETPIXEL_MUL(RGB_FROM_RGB555(*pixel, sr, sg, sb), \
158 RGB555_FROM_RGB(*pixel, sr, sg, sb))
159
160#define DRAW_SETPIXELXY_RGB555(x, y) \
161 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB555)
162
163#define DRAW_SETPIXELXY_BLEND_RGB555(x, y) \
164 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB555)
165
166#define DRAW_SETPIXELXY_BLEND_CLAMPED_RGB555(x, y) \
167 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_CLAMPED_RGB555)
168
169#define DRAW_SETPIXELXY_ADD_RGB555(x, y) \
170 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB555)
171
172#define DRAW_SETPIXELXY_MOD_RGB555(x, y) \
173 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB555)
174
175#define DRAW_SETPIXELXY_MUL_RGB555(x, y) \
176 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MUL_RGB555)
177
178/*
179 * Define draw operators for RGB565
180 */
181
182#define DRAW_SETPIXEL_RGB565 \
183 DRAW_SETPIXEL(RGB565_FROM_RGB(*pixel, sr, sg, sb))
184
185#define DRAW_SETPIXEL_BLEND_RGB565 \
186 DRAW_SETPIXEL_BLEND(RGB_FROM_RGB565(*pixel, sr, sg, sb), \
187 RGB565_FROM_RGB(*pixel, sr, sg, sb))
188
189#define DRAW_SETPIXEL_BLEND_CLAMPED_RGB565 \
190 DRAW_SETPIXEL_BLEND_CLAMPED(RGB_FROM_RGB565(*pixel, sr, sg, sb), \
191 RGB565_FROM_RGB(*pixel, sr, sg, sb))
192
193#define DRAW_SETPIXEL_ADD_RGB565 \
194 DRAW_SETPIXEL_ADD(RGB_FROM_RGB565(*pixel, sr, sg, sb), \
195 RGB565_FROM_RGB(*pixel, sr, sg, sb))
196
197#define DRAW_SETPIXEL_MOD_RGB565 \
198 DRAW_SETPIXEL_MOD(RGB_FROM_RGB565(*pixel, sr, sg, sb), \
199 RGB565_FROM_RGB(*pixel, sr, sg, sb))
200
201#define DRAW_SETPIXEL_MUL_RGB565 \
202 DRAW_SETPIXEL_MUL(RGB_FROM_RGB565(*pixel, sr, sg, sb), \
203 RGB565_FROM_RGB(*pixel, sr, sg, sb))
204
205#define DRAW_SETPIXELXY_RGB565(x, y) \
206 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB565)
207
208#define DRAW_SETPIXELXY_BLEND_RGB565(x, y) \
209 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB565)
210
211#define DRAW_SETPIXELXY_BLEND_CLAMPED_RGB565(x, y) \
212 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_CLAMPED_RGB565)
213
214#define DRAW_SETPIXELXY_ADD_RGB565(x, y) \
215 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB565)
216
217#define DRAW_SETPIXELXY_MOD_RGB565(x, y) \
218 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB565)
219
220#define DRAW_SETPIXELXY_MUL_RGB565(x, y) \
221 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MUL_RGB565)
222
223/*
224 * Define draw operators for RGB888
225 */
226
227#define DRAW_SETPIXEL_XRGB8888 \
228 DRAW_SETPIXEL(XRGB8888_FROM_RGB(*pixel, sr, sg, sb))
229
230#define DRAW_SETPIXEL_BLEND_XRGB8888 \
231 DRAW_SETPIXEL_BLEND(RGB_FROM_XRGB8888(*pixel, sr, sg, sb), \
232 XRGB8888_FROM_RGB(*pixel, sr, sg, sb))
233
234#define DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888 \
235 DRAW_SETPIXEL_BLEND_CLAMPED(RGB_FROM_XRGB8888(*pixel, sr, sg, sb), \
236 XRGB8888_FROM_RGB(*pixel, sr, sg, sb))
237
238#define DRAW_SETPIXEL_ADD_XRGB8888 \
239 DRAW_SETPIXEL_ADD(RGB_FROM_XRGB8888(*pixel, sr, sg, sb), \
240 XRGB8888_FROM_RGB(*pixel, sr, sg, sb))
241
242#define DRAW_SETPIXEL_MOD_XRGB8888 \
243 DRAW_SETPIXEL_MOD(RGB_FROM_XRGB8888(*pixel, sr, sg, sb), \
244 XRGB8888_FROM_RGB(*pixel, sr, sg, sb))
245
246#define DRAW_SETPIXEL_MUL_XRGB8888 \
247 DRAW_SETPIXEL_MUL(RGB_FROM_XRGB8888(*pixel, sr, sg, sb), \
248 XRGB8888_FROM_RGB(*pixel, sr, sg, sb))
249
250#define DRAW_SETPIXELXY_XRGB8888(x, y) \
251 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_XRGB8888)
252
253#define DRAW_SETPIXELXY_BLEND_XRGB8888(x, y) \
254 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_XRGB8888)
255
256#define DRAW_SETPIXELXY_BLEND_CLAMPED_XRGB8888(x, y) \
257 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_CLAMPED_XRGB8888)
258
259#define DRAW_SETPIXELXY_ADD_XRGB8888(x, y) \
260 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_XRGB8888)
261
262#define DRAW_SETPIXELXY_MOD_XRGB8888(x, y) \
263 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_XRGB8888)
264
265#define DRAW_SETPIXELXY_MUL_XRGB8888(x, y) \
266 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MUL_XRGB8888)
267
268/*
269 * Define draw operators for ARGB8888
270 */
271
272#define DRAW_SETPIXEL_ARGB8888 \
273 DRAW_SETPIXEL(ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
274
275#define DRAW_SETPIXEL_BLEND_ARGB8888 \
276 DRAW_SETPIXEL_BLEND(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \
277 ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
278
279#define DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888 \
280 DRAW_SETPIXEL_BLEND_CLAMPED(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \
281 ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
282
283#define DRAW_SETPIXEL_ADD_ARGB8888 \
284 DRAW_SETPIXEL_ADD(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \
285 ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
286
287#define DRAW_SETPIXEL_MOD_ARGB8888 \
288 DRAW_SETPIXEL_MOD(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \
289 ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
290
291#define DRAW_SETPIXEL_MUL_ARGB8888 \
292 DRAW_SETPIXEL_MUL(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \
293 ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
294
295#define DRAW_SETPIXELXY_ARGB8888(x, y) \
296 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ARGB8888)
297
298#define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y) \
299 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_ARGB8888)
300
301#define DRAW_SETPIXELXY_BLEND_CLAMPED_ARGB8888(x, y) \
302 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_CLAMPED_ARGB8888)
303
304#define DRAW_SETPIXELXY_ADD_ARGB8888(x, y) \
305 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_ARGB8888)
306
307#define DRAW_SETPIXELXY_MOD_ARGB8888(x, y) \
308 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_ARGB8888)
309
310#define DRAW_SETPIXELXY_MUL_ARGB8888(x, y) \
311 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MUL_ARGB8888)
312
313/*
314 * Define draw operators for general RGB
315 */
316
317#define DRAW_SETPIXEL_RGB \
318 DRAW_SETPIXEL(PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
319
320#define DRAW_SETPIXEL_BLEND_RGB \
321 DRAW_SETPIXEL_BLEND(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \
322 PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
323
324#define DRAW_SETPIXEL_BLEND_CLAMPED_RGB \
325 DRAW_SETPIXEL_BLEND_CLAMPED(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \
326 PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
327
328#define DRAW_SETPIXEL_ADD_RGB \
329 DRAW_SETPIXEL_ADD(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \
330 PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
331
332#define DRAW_SETPIXEL_MOD_RGB \
333 DRAW_SETPIXEL_MOD(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \
334 PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
335
336#define DRAW_SETPIXEL_MUL_RGB \
337 DRAW_SETPIXEL_MUL(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \
338 PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
339
340#define DRAW_SETPIXELXY2_RGB(x, y) \
341 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB)
342
343#define DRAW_SETPIXELXY4_RGB(x, y) \
344 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_RGB)
345
346#define DRAW_SETPIXELXY2_BLEND_RGB(x, y) \
347 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB)
348
349#define DRAW_SETPIXELXY2_BLEND_CLAMPED_RGB(x, y) \
350 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_CLAMPED_RGB)
351
352#define DRAW_SETPIXELXY4_BLEND_RGB(x, y) \
353 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGB)
354
355#define DRAW_SETPIXELXY4_BLEND_CLAMPED_RGB(x, y) \
356 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_CLAMPED_RGB)
357
358#define DRAW_SETPIXELXY2_ADD_RGB(x, y) \
359 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB)
360
361#define DRAW_SETPIXELXY4_ADD_RGB(x, y) \
362 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGB)
363
364#define DRAW_SETPIXELXY2_MOD_RGB(x, y) \
365 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB)
366
367#define DRAW_SETPIXELXY4_MOD_RGB(x, y) \
368 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_RGB)
369
370#define DRAW_SETPIXELXY2_MUL_RGB(x, y) \
371 DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MUL_RGB)
372
373#define DRAW_SETPIXELXY4_MUL_RGB(x, y) \
374 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MUL_RGB)
375
376/*
377 * Define draw operators for general RGBA
378 */
379
380#define DRAW_SETPIXEL_RGBA \
381 DRAW_SETPIXEL(PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
382
383#define DRAW_SETPIXEL_BLEND_RGBA \
384 DRAW_SETPIXEL_BLEND(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \
385 PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
386
387#define DRAW_SETPIXEL_BLEND_CLAMPED_RGBA \
388 DRAW_SETPIXEL_BLEND_CLAMPED(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \
389 PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
390
391#define DRAW_SETPIXEL_ADD_RGBA \
392 DRAW_SETPIXEL_ADD(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \
393 PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
394
395#define DRAW_SETPIXEL_MOD_RGBA \
396 DRAW_SETPIXEL_MOD(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \
397 PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
398
399#define DRAW_SETPIXEL_MUL_RGBA \
400 DRAW_SETPIXEL_MUL(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \
401 PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
402
403#define DRAW_SETPIXELXY4_RGBA(x, y) \
404 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_RGBA)
405
406#define DRAW_SETPIXELXY4_BLEND_RGBA(x, y) \
407 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGBA)
408
409#define DRAW_SETPIXELXY4_BLEND_CLAMPED_RGBA(x, y) \
410 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_CLAMPED_RGBA)
411
412#define DRAW_SETPIXELXY4_ADD_RGBA(x, y) \
413 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGBA)
414
415#define DRAW_SETPIXELXY4_MOD_RGBA(x, y) \
416 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_RGBA)
417
418#define DRAW_SETPIXELXY4_MUL_RGBA(x, y) \
419 DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MUL_RGBA)
420
421/*
422 * Define line drawing macro
423 */
424
425#define ABS(_x) ((_x) < 0 ? -(_x) : (_x))
426
427// Horizontal line
428#define HLINE(type, op, draw_end) \
429 { \
430 int length; \
431 int pitch = (dst->pitch / dst->fmt->bytes_per_pixel); \
432 type *pixel; \
433 if (x1 <= x2) { \
434 pixel = (type *)dst->pixels + y1 * pitch + x1; \
435 length = draw_end ? (x2 - x1 + 1) : (x2 - x1); \
436 } else { \
437 pixel = (type *)dst->pixels + y1 * pitch + x2; \
438 if (!draw_end) { \
439 ++pixel; \
440 } \
441 length = draw_end ? (x1 - x2 + 1) : (x1 - x2); \
442 } \
443 while (length--) { \
444 op; \
445 ++pixel; \
446 } \
447 }
448
449// Vertical line
450#define VLINE(type, op, draw_end) \
451 { \
452 int length; \
453 int pitch = (dst->pitch / dst->fmt->bytes_per_pixel); \
454 type *pixel; \
455 if (y1 <= y2) { \
456 pixel = (type *)dst->pixels + y1 * pitch + x1; \
457 length = draw_end ? (y2 - y1 + 1) : (y2 - y1); \
458 } else { \
459 pixel = (type *)dst->pixels + y2 * pitch + x1; \
460 if (!draw_end) { \
461 pixel += pitch; \
462 } \
463 length = draw_end ? (y1 - y2 + 1) : (y1 - y2); \
464 } \
465 while (length--) { \
466 op; \
467 pixel += pitch; \
468 } \
469 }
470
471// Diagonal line
472#define DLINE(type, op, draw_end) \
473 { \
474 int length; \
475 int pitch = (dst->pitch / dst->fmt->bytes_per_pixel); \
476 type *pixel; \
477 if (y1 <= y2) { \
478 pixel = (type *)dst->pixels + y1 * pitch + x1; \
479 if (x1 <= x2) { \
480 ++pitch; \
481 } else { \
482 --pitch; \
483 } \
484 length = (y2 - y1); \
485 } else { \
486 pixel = (type *)dst->pixels + y2 * pitch + x2; \
487 if (x2 <= x1) { \
488 ++pitch; \
489 } else { \
490 --pitch; \
491 } \
492 if (!draw_end) { \
493 pixel += pitch; \
494 } \
495 length = (y1 - y2); \
496 } \
497 if (draw_end) { \
498 ++length; \
499 } \
500 while (length--) { \
501 op; \
502 pixel += pitch; \
503 } \
504 }
505
506// Bresenham's line algorithm
507#define BLINE(x1, y1, x2, y2, op, draw_end) \
508 { \
509 int i, deltax, deltay, numpixels; \
510 int d, dinc1, dinc2; \
511 int x, xinc1, xinc2; \
512 int y, yinc1, yinc2; \
513 \
514 deltax = ABS(x2 - x1); \
515 deltay = ABS(y2 - y1); \
516 \
517 if (deltax >= deltay) { \
518 numpixels = deltax + 1; \
519 d = (2 * deltay) - deltax; \
520 dinc1 = deltay * 2; \
521 dinc2 = (deltay - deltax) * 2; \
522 xinc1 = 1; \
523 xinc2 = 1; \
524 yinc1 = 0; \
525 yinc2 = 1; \
526 } else { \
527 numpixels = deltay + 1; \
528 d = (2 * deltax) - deltay; \
529 dinc1 = deltax * 2; \
530 dinc2 = (deltax - deltay) * 2; \
531 xinc1 = 0; \
532 xinc2 = 1; \
533 yinc1 = 1; \
534 yinc2 = 1; \
535 } \
536 \
537 if (x1 > x2) { \
538 xinc1 = -xinc1; \
539 xinc2 = -xinc2; \
540 } \
541 if (y1 > y2) { \
542 yinc1 = -yinc1; \
543 yinc2 = -yinc2; \
544 } \
545 \
546 x = x1; \
547 y = y1; \
548 \
549 if (!draw_end) { \
550 --numpixels; \
551 } \
552 for (i = 0; i < numpixels; ++i) { \
553 op(x, y); \
554 if (d < 0) { \
555 d += dinc1; \
556 x += xinc1; \
557 y += yinc1; \
558 } else { \
559 d += dinc2; \
560 x += xinc2; \
561 y += yinc2; \
562 } \
563 } \
564 }
565
566// Xiaolin Wu's line algorithm, based on Michael Abrash's implementation
567#define WULINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \
568 { \
569 Uint16 ErrorAdj, ErrorAcc; \
570 Uint16 ErrorAccTemp, Weighting; \
571 int DeltaX, DeltaY, Temp, XDir; \
572 unsigned r, g, b, a, inva; \
573 \
574 /* Draw the initial pixel, which is always exactly intersected by \
575 the line and so needs no weighting */ \
576 opaque_op(x1, y1); \
577 \
578 /* Draw the final pixel, which is always exactly intersected by the line \
579 and so needs no weighting */ \
580 if (draw_end) { \
581 opaque_op(x2, y2); \
582 } \
583 \
584 /* Make sure the line runs top to bottom */ \
585 if (y1 > y2) { \
586 Temp = y1; \
587 y1 = y2; \
588 y2 = Temp; \
589 Temp = x1; \
590 x1 = x2; \
591 x2 = Temp; \
592 } \
593 DeltaY = y2 - y1; \
594 \
595 if ((DeltaX = x2 - x1) >= 0) { \
596 XDir = 1; \
597 } else { \
598 XDir = -1; \
599 DeltaX = -DeltaX; /* make DeltaX positive */ \
600 } \
601 \
602 /* line is not horizontal, diagonal, or vertical */ \
603 ErrorAcc = 0; /* initialize the line error accumulator to 0 */ \
604 \
605 /* Is this an X-major or Y-major line? */ \
606 if (DeltaY > DeltaX) { \
607 /* Y-major line; calculate 16-bit fixed-point fractional part of a \
608 pixel that X advances each time Y advances 1 pixel, truncating the \
609 result so that we won't overrun the endpoint along the X axis */ \
610 ErrorAdj = ((unsigned long)DeltaX << 16) / (unsigned long)DeltaY; \
611 /* Draw all pixels other than the first and last */ \
612 while (--DeltaY) { \
613 ErrorAccTemp = ErrorAcc; /* remember current accumulated error */ \
614 ErrorAcc += ErrorAdj; /* calculate error for next pixel */ \
615 if (ErrorAcc <= ErrorAccTemp) { \
616 /* The error accumulator turned over, so advance the X coord */ \
617 x1 += XDir; \
618 } \
619 y1++; /* Y-major, so always advance Y */ \
620 /* The IntensityBits most significant bits of ErrorAcc give us the \
621 intensity weighting for this pixel, and the complement of the \
622 weighting for the paired pixel */ \
623 Weighting = ErrorAcc >> 8; \
624 { \
625 a = DRAW_MUL(_a, (Weighting ^ 255)); \
626 r = DRAW_MUL(_r, a); \
627 g = DRAW_MUL(_g, a); \
628 b = DRAW_MUL(_b, a); \
629 inva = (a ^ 0xFF); \
630 blend_op(x1, y1); \
631 } \
632 { \
633 a = DRAW_MUL(_a, Weighting); \
634 r = DRAW_MUL(_r, a); \
635 g = DRAW_MUL(_g, a); \
636 b = DRAW_MUL(_b, a); \
637 inva = (a ^ 0xFF); \
638 blend_op(x1 + XDir, y1); \
639 } \
640 } \
641 } else { \
642 /* X-major line; calculate 16-bit fixed-point fractional part of a \
643 pixel that Y advances each time X advances 1 pixel, truncating the \
644 result to avoid overrunning the endpoint along the X axis */ \
645 ErrorAdj = ((unsigned long)DeltaY << 16) / (unsigned long)DeltaX; \
646 /* Draw all pixels other than the first and last */ \
647 while (--DeltaX) { \
648 ErrorAccTemp = ErrorAcc; /* remember current accumulated error */ \
649 ErrorAcc += ErrorAdj; /* calculate error for next pixel */ \
650 if (ErrorAcc <= ErrorAccTemp) { \
651 /* The error accumulator turned over, so advance the Y coord */ \
652 y1++; \
653 } \
654 x1 += XDir; /* X-major, so always advance X */ \
655 /* The IntensityBits most significant bits of ErrorAcc give us the \
656 intensity weighting for this pixel, and the complement of the \
657 weighting for the paired pixel */ \
658 Weighting = ErrorAcc >> 8; \
659 { \
660 a = DRAW_MUL(_a, (Weighting ^ 255)); \
661 r = DRAW_MUL(_r, a); \
662 g = DRAW_MUL(_g, a); \
663 b = DRAW_MUL(_b, a); \
664 inva = (a ^ 0xFF); \
665 blend_op(x1, y1); \
666 } \
667 { \
668 a = DRAW_MUL(_a, Weighting); \
669 r = DRAW_MUL(_r, a); \
670 g = DRAW_MUL(_g, a); \
671 b = DRAW_MUL(_b, a); \
672 inva = (a ^ 0xFF); \
673 blend_op(x1, y1 + 1); \
674 } \
675 } \
676 } \
677 }
678
679#ifdef AA_LINES
680#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \
681 WULINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end)
682#else
683#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \
684 BLINE(x1, y1, x2, y2, opaque_op, draw_end)
685#endif
686
687/*
688 * Define fill rect macro
689 */
690
691#define FILLRECT(type, op) \
692 do { \
693 int width = rect->w; \
694 int height = rect->h; \
695 int pitch = (dst->pitch / dst->fmt->bytes_per_pixel); \
696 int skip = pitch - width; \
697 type *pixel = (type *)dst->pixels + rect->y * pitch + rect->x; \
698 while (height--) { \
699 { \
700 int n = (width + 3) / 4; \
701 switch (width & 3) { \
702 case 0: \
703 do { \
704 op; \
705 pixel++; \
706 SDL_FALLTHROUGH; \
707 case 3: \
708 op; \
709 pixel++; \
710 SDL_FALLTHROUGH; \
711 case 2: \
712 op; \
713 pixel++; \
714 SDL_FALLTHROUGH; \
715 case 1: \
716 op; \
717 pixel++; \
718 } while (--n > 0); \
719 } \
720 } \
721 pixel += skip; \
722 } \
723 } while (0)
diff --git a/SDL-3.2.8/src/render/software/SDL_drawline.c b/SDL-3.2.8/src/render/software/SDL_drawline.c
new file mode 100644
index 0000000..59ba268
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_drawline.c
@@ -0,0 +1,199 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_SW
24
25#include "SDL_draw.h"
26#include "SDL_drawline.h"
27#include "SDL_drawpoint.h"
28
29static void SDL_DrawLine1(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color,
30 bool draw_end)
31{
32 if (y1 == y2) {
33 int length;
34 int pitch = (dst->pitch / dst->fmt->bytes_per_pixel);
35 Uint8 *pixel;
36 if (x1 <= x2) {
37 pixel = (Uint8 *)dst->pixels + y1 * pitch + x1;
38 length = draw_end ? (x2 - x1 + 1) : (x2 - x1);
39 } else {
40 pixel = (Uint8 *)dst->pixels + y1 * pitch + x2;
41 if (!draw_end) {
42 ++pixel;
43 }
44 length = draw_end ? (x1 - x2 + 1) : (x1 - x2);
45 }
46 SDL_memset(pixel, color, length);
47 } else if (x1 == x2) {
48 VLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end);
49 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
50 DLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end);
51 } else {
52 BLINE(x1, y1, x2, y2, DRAW_FASTSETPIXELXY1, draw_end);
53 }
54}
55
56static void SDL_DrawLine2(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color,
57 bool draw_end)
58{
59 if (y1 == y2) {
60 HLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
61 } else if (x1 == x2) {
62 VLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
63 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
64 DLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end);
65 } else {
66 Uint8 _r, _g, _b, _a;
67 const SDL_PixelFormatDetails *fmt = dst->fmt;
68 SDL_GetRGBA(color, fmt, dst->palette, &_r, &_g, &_b, &_a);
69 if (fmt->Rmask == 0x7C00) {
70 AALINE(x1, y1, x2, y2,
71 DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY_BLEND_RGB555,
72 draw_end);
73 } else if (fmt->Rmask == 0xF800) {
74 AALINE(x1, y1, x2, y2,
75 DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY_BLEND_RGB565,
76 draw_end);
77 } else {
78 AALINE(x1, y1, x2, y2,
79 DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY2_BLEND_RGB,
80 draw_end);
81 }
82 }
83}
84
85static void SDL_DrawLine4(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color,
86 bool draw_end)
87{
88 if (y1 == y2) {
89 HLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
90 } else if (x1 == x2) {
91 VLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
92 } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
93 DLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end);
94 } else {
95 Uint8 _r, _g, _b, _a;
96 const SDL_PixelFormatDetails *fmt = dst->fmt;
97 SDL_GetRGBA(color, fmt, dst->palette, &_r, &_g, &_b, &_a);
98 if (fmt->Rmask == 0x00FF0000) {
99 if (!fmt->Amask) {
100 AALINE(x1, y1, x2, y2,
101 DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_XRGB8888,
102 draw_end);
103 } else {
104 AALINE(x1, y1, x2, y2,
105 DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_ARGB8888,
106 draw_end);
107 }
108 } else {
109 AALINE(x1, y1, x2, y2,
110 DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY4_BLEND_RGB,
111 draw_end);
112 }
113 }
114}
115
116typedef void (*DrawLineFunc)(SDL_Surface *dst,
117 int x1, int y1, int x2, int y2,
118 Uint32 color, bool draw_end);
119
120static DrawLineFunc SDL_CalculateDrawLineFunc(const SDL_PixelFormatDetails *fmt)
121{
122 switch (fmt->bytes_per_pixel) {
123 case 1:
124 if (fmt->bits_per_pixel < 8) {
125 break;
126 }
127 return SDL_DrawLine1;
128 case 2:
129 return SDL_DrawLine2;
130 case 4:
131 return SDL_DrawLine4;
132 }
133 return NULL;
134}
135
136bool SDL_DrawLine(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color)
137{
138 DrawLineFunc func;
139
140 if (!SDL_SurfaceValid(dst)) {
141 return SDL_InvalidParamError("SDL_DrawLine(): dst");
142 }
143
144 func = SDL_CalculateDrawLineFunc(dst->fmt);
145 if (!func) {
146 return SDL_SetError("SDL_DrawLine(): Unsupported surface format");
147 }
148
149 // Perform clipping
150 // FIXME: We don't actually want to clip, as it may change line slope
151 if (!SDL_GetRectAndLineIntersection(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
152 return true;
153 }
154
155 func(dst, x1, y1, x2, y2, color, true);
156 return true;
157}
158
159bool SDL_DrawLines(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
160{
161 int i;
162 int x1, y1;
163 int x2, y2;
164 bool draw_end;
165 DrawLineFunc func;
166
167 if (!SDL_SurfaceValid(dst)) {
168 return SDL_InvalidParamError("SDL_DrawLines(): dst");
169 }
170
171 func = SDL_CalculateDrawLineFunc(dst->fmt);
172 if (!func) {
173 return SDL_SetError("SDL_DrawLines(): Unsupported surface format");
174 }
175
176 for (i = 1; i < count; ++i) {
177 x1 = points[i - 1].x;
178 y1 = points[i - 1].y;
179 x2 = points[i].x;
180 y2 = points[i].y;
181
182 // Perform clipping
183 // FIXME: We don't actually want to clip, as it may change line slope
184 if (!SDL_GetRectAndLineIntersection(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
185 continue;
186 }
187
188 // Draw the end if the whole line is a single point or it was clipped
189 draw_end = ((x1 == x2) && (y1 == y2)) || (x2 != points[i].x || y2 != points[i].y);
190
191 func(dst, x1, y1, x2, y2, color, draw_end);
192 }
193 if (points[0].x != points[count - 1].x || points[0].y != points[count - 1].y) {
194 SDL_DrawPoint(dst, points[count - 1].x, points[count - 1].y, color);
195 }
196 return true;
197}
198
199#endif // SDL_VIDEO_RENDER_SW
diff --git a/SDL-3.2.8/src/render/software/SDL_drawline.h b/SDL-3.2.8/src/render/software/SDL_drawline.h
new file mode 100644
index 0000000..e88b2c3
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_drawline.h
@@ -0,0 +1,30 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_drawline_h_
23#define SDL_drawline_h_
24
25#include "SDL_internal.h"
26
27extern bool SDL_DrawLine(SDL_Surface *dst, int x1, int y1, int x2, int y2, Uint32 color);
28extern bool SDL_DrawLines(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color);
29
30#endif // SDL_drawline_h_
diff --git a/SDL-3.2.8/src/render/software/SDL_drawpoint.c b/SDL-3.2.8/src/render/software/SDL_drawpoint.c
new file mode 100644
index 0000000..5aa28b3
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_drawpoint.c
@@ -0,0 +1,108 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_SW
24
25#include "SDL_draw.h"
26#include "SDL_drawpoint.h"
27
28bool SDL_DrawPoint(SDL_Surface *dst, int x, int y, Uint32 color)
29{
30 if (!SDL_SurfaceValid(dst)) {
31 return SDL_InvalidParamError("SDL_DrawPoint(): dst");
32 }
33
34 // This function doesn't work on surfaces < 8 bpp
35 if (dst->fmt->bits_per_pixel < 8) {
36 return SDL_SetError("SDL_DrawPoint(): Unsupported surface format");
37 }
38
39 // Perform clipping
40 if (x < dst->clip_rect.x || y < dst->clip_rect.y ||
41 x >= (dst->clip_rect.x + dst->clip_rect.w) ||
42 y >= (dst->clip_rect.y + dst->clip_rect.h)) {
43 return true;
44 }
45
46 switch (dst->fmt->bytes_per_pixel) {
47 case 1:
48 DRAW_FASTSETPIXELXY1(x, y);
49 break;
50 case 2:
51 DRAW_FASTSETPIXELXY2(x, y);
52 break;
53 case 3:
54 return SDL_Unsupported();
55 case 4:
56 DRAW_FASTSETPIXELXY4(x, y);
57 break;
58 }
59 return true;
60}
61
62bool SDL_DrawPoints(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
63{
64 int minx, miny;
65 int maxx, maxy;
66 int i;
67 int x, y;
68
69 if (!SDL_SurfaceValid(dst)) {
70 return SDL_InvalidParamError("SDL_DrawPoints(): dst");
71 }
72
73 // This function doesn't work on surfaces < 8 bpp
74 if (dst->fmt->bits_per_pixel < 8) {
75 return SDL_SetError("SDL_DrawPoints(): Unsupported surface format");
76 }
77
78 minx = dst->clip_rect.x;
79 maxx = dst->clip_rect.x + dst->clip_rect.w - 1;
80 miny = dst->clip_rect.y;
81 maxy = dst->clip_rect.y + dst->clip_rect.h - 1;
82
83 for (i = 0; i < count; ++i) {
84 x = points[i].x;
85 y = points[i].y;
86
87 if (x < minx || x > maxx || y < miny || y > maxy) {
88 continue;
89 }
90
91 switch (dst->fmt->bytes_per_pixel) {
92 case 1:
93 DRAW_FASTSETPIXELXY1(x, y);
94 break;
95 case 2:
96 DRAW_FASTSETPIXELXY2(x, y);
97 break;
98 case 3:
99 return SDL_Unsupported();
100 case 4:
101 DRAW_FASTSETPIXELXY4(x, y);
102 break;
103 }
104 }
105 return true;
106}
107
108#endif // SDL_VIDEO_RENDER_SW
diff --git a/SDL-3.2.8/src/render/software/SDL_drawpoint.h b/SDL-3.2.8/src/render/software/SDL_drawpoint.h
new file mode 100644
index 0000000..631e7aa
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_drawpoint.h
@@ -0,0 +1,30 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_drawpoint_h_
23#define SDL_drawpoint_h_
24
25#include "SDL_internal.h"
26
27extern bool SDL_DrawPoint(SDL_Surface *dst, int x, int y, Uint32 color);
28extern bool SDL_DrawPoints(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color);
29
30#endif // SDL_drawpoint_h_
diff --git a/SDL-3.2.8/src/render/software/SDL_render_sw.c b/SDL-3.2.8/src/render/software/SDL_render_sw.c
new file mode 100644
index 0000000..2231724
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_render_sw.c
@@ -0,0 +1,1202 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_SW
24
25#include "../SDL_sysrender.h"
26#include "SDL_render_sw_c.h"
27
28#include "SDL_draw.h"
29#include "SDL_blendfillrect.h"
30#include "SDL_blendline.h"
31#include "SDL_blendpoint.h"
32#include "SDL_drawline.h"
33#include "SDL_drawpoint.h"
34#include "SDL_rotate.h"
35#include "SDL_triangle.h"
36#include "../../video/SDL_pixels_c.h"
37
38// SDL surface based renderer implementation
39
40typedef struct
41{
42 const SDL_Rect *viewport;
43 const SDL_Rect *cliprect;
44 bool surface_cliprect_dirty;
45 SDL_Color color;
46} SW_DrawStateCache;
47
48typedef struct
49{
50 SDL_Surface *surface;
51 SDL_Surface *window;
52} SW_RenderData;
53
54static SDL_Surface *SW_ActivateRenderer(SDL_Renderer *renderer)
55{
56 SW_RenderData *data = (SW_RenderData *)renderer->internal;
57
58 if (!data->surface) {
59 data->surface = data->window;
60 }
61 if (!data->surface) {
62 SDL_Surface *surface = SDL_GetWindowSurface(renderer->window);
63 if (surface) {
64 data->surface = data->window = surface;
65 }
66 }
67 return data->surface;
68}
69
70static void SW_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
71{
72 SW_RenderData *data = (SW_RenderData *)renderer->internal;
73
74 if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
75 data->surface = NULL;
76 data->window = NULL;
77 }
78}
79
80static bool SW_GetOutputSize(SDL_Renderer *renderer, int *w, int *h)
81{
82 SW_RenderData *data = (SW_RenderData *)renderer->internal;
83
84 if (data->surface) {
85 if (w) {
86 *w = data->surface->w;
87 }
88 if (h) {
89 *h = data->surface->h;
90 }
91 return true;
92 }
93
94 if (renderer->window) {
95 SDL_GetWindowSizeInPixels(renderer->window, w, h);
96 return true;
97 }
98
99 return SDL_SetError("Software renderer doesn't have an output surface");
100}
101
102static bool SW_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
103{
104 SDL_Surface *surface = SDL_CreateSurface(texture->w, texture->h, texture->format);
105 Uint8 r, g, b, a;
106
107 if (!SDL_SurfaceValid(surface)) {
108 return SDL_SetError("Cannot create surface");
109 }
110 texture->internal = surface;
111 r = (Uint8)SDL_roundf(SDL_clamp(texture->color.r, 0.0f, 1.0f) * 255.0f);
112 g = (Uint8)SDL_roundf(SDL_clamp(texture->color.g, 0.0f, 1.0f) * 255.0f);
113 b = (Uint8)SDL_roundf(SDL_clamp(texture->color.b, 0.0f, 1.0f) * 255.0f);
114 a = (Uint8)SDL_roundf(SDL_clamp(texture->color.a, 0.0f, 1.0f) * 255.0f);
115 SDL_SetSurfaceColorMod(surface, r, g, b);
116 SDL_SetSurfaceAlphaMod(surface, a);
117 SDL_SetSurfaceBlendMode(surface, texture->blendMode);
118
119 /* Only RLE encode textures without an alpha channel since the RLE coder
120 * discards the color values of pixels with an alpha value of zero.
121 */
122 if (texture->access == SDL_TEXTUREACCESS_STATIC && !SDL_ISPIXELFORMAT_ALPHA(surface->format)) {
123 SDL_SetSurfaceRLE(surface, 1);
124 }
125
126 return true;
127}
128
129static bool SW_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
130 const SDL_Rect *rect, const void *pixels, int pitch)
131{
132 SDL_Surface *surface = (SDL_Surface *)texture->internal;
133 Uint8 *src, *dst;
134 int row;
135 size_t length;
136
137 if (SDL_MUSTLOCK(surface)) {
138 if (!SDL_LockSurface(surface)) {
139 return false;
140 }
141 }
142 src = (Uint8 *)pixels;
143 dst = (Uint8 *)surface->pixels +
144 rect->y * surface->pitch +
145 rect->x * surface->fmt->bytes_per_pixel;
146 length = (size_t)rect->w * surface->fmt->bytes_per_pixel;
147 for (row = 0; row < rect->h; ++row) {
148 SDL_memcpy(dst, src, length);
149 src += pitch;
150 dst += surface->pitch;
151 }
152 if (SDL_MUSTLOCK(surface)) {
153 SDL_UnlockSurface(surface);
154 }
155 return true;
156}
157
158static bool SW_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
159 const SDL_Rect *rect, void **pixels, int *pitch)
160{
161 SDL_Surface *surface = (SDL_Surface *)texture->internal;
162
163 *pixels =
164 (void *)((Uint8 *)surface->pixels + rect->y * surface->pitch +
165 rect->x * surface->fmt->bytes_per_pixel);
166 *pitch = surface->pitch;
167 return true;
168}
169
170static void SW_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
171{
172}
173
174static void SW_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
175{
176}
177
178static bool SW_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
179{
180 SW_RenderData *data = (SW_RenderData *)renderer->internal;
181
182 if (texture) {
183 data->surface = (SDL_Surface *)texture->internal;
184 } else {
185 data->surface = data->window;
186 }
187 return true;
188}
189
190static bool SW_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
191{
192 return true; // nothing to do in this backend.
193}
194
195static bool SW_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
196{
197 SDL_Point *verts = (SDL_Point *)SDL_AllocateRenderVertices(renderer, count * sizeof(SDL_Point), 0, &cmd->data.draw.first);
198 int i;
199
200 if (!verts) {
201 return false;
202 }
203
204 cmd->data.draw.count = count;
205
206 for (i = 0; i < count; i++, verts++, points++) {
207 verts->x = (int)points->x;
208 verts->y = (int)points->y;
209 }
210
211 return true;
212}
213
214static bool SW_QueueFillRects(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
215{
216 SDL_Rect *verts = (SDL_Rect *)SDL_AllocateRenderVertices(renderer, count * sizeof(SDL_Rect), 0, &cmd->data.draw.first);
217 int i;
218
219 if (!verts) {
220 return false;
221 }
222
223 cmd->data.draw.count = count;
224
225 for (i = 0; i < count; i++, verts++, rects++) {
226 verts->x = (int)rects->x;
227 verts->y = (int)rects->y;
228 verts->w = SDL_max((int)rects->w, 1);
229 verts->h = SDL_max((int)rects->h, 1);
230 }
231
232 return true;
233}
234
235static bool SW_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
236 const SDL_FRect *srcrect, const SDL_FRect *dstrect)
237{
238 SDL_Rect *verts = (SDL_Rect *)SDL_AllocateRenderVertices(renderer, 2 * sizeof(SDL_Rect), 0, &cmd->data.draw.first);
239
240 if (!verts) {
241 return false;
242 }
243
244 cmd->data.draw.count = 1;
245
246 verts->x = (int)srcrect->x;
247 verts->y = (int)srcrect->y;
248 verts->w = (int)srcrect->w;
249 verts->h = (int)srcrect->h;
250 verts++;
251
252 verts->x = (int)dstrect->x;
253 verts->y = (int)dstrect->y;
254 verts->w = (int)dstrect->w;
255 verts->h = (int)dstrect->h;
256
257 return true;
258}
259
260typedef struct CopyExData
261{
262 SDL_Rect srcrect;
263 SDL_Rect dstrect;
264 double angle;
265 SDL_FPoint center;
266 SDL_FlipMode flip;
267 float scale_x;
268 float scale_y;
269} CopyExData;
270
271static bool SW_QueueCopyEx(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
272 const SDL_FRect *srcrect, const SDL_FRect *dstrect,
273 const double angle, const SDL_FPoint *center, const SDL_FlipMode flip, float scale_x, float scale_y)
274{
275 CopyExData *verts = (CopyExData *)SDL_AllocateRenderVertices(renderer, sizeof(CopyExData), 0, &cmd->data.draw.first);
276
277 if (!verts) {
278 return false;
279 }
280
281 cmd->data.draw.count = 1;
282
283 verts->srcrect.x = (int)srcrect->x;
284 verts->srcrect.y = (int)srcrect->y;
285 verts->srcrect.w = (int)srcrect->w;
286 verts->srcrect.h = (int)srcrect->h;
287 verts->dstrect.x = (int)dstrect->x;
288 verts->dstrect.y = (int)dstrect->y;
289 verts->dstrect.w = (int)dstrect->w;
290 verts->dstrect.h = (int)dstrect->h;
291 verts->angle = angle;
292 SDL_copyp(&verts->center, center);
293 verts->flip = flip;
294 verts->scale_x = scale_x;
295 verts->scale_y = scale_y;
296
297 return true;
298}
299
300static bool Blit_to_Screen(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *surface, SDL_Rect *dstrect,
301 float scale_x, float scale_y, SDL_ScaleMode scaleMode)
302{
303 bool result;
304 // Renderer scaling, if needed
305 if (scale_x != 1.0f || scale_y != 1.0f) {
306 SDL_Rect r;
307 r.x = (int)((float)dstrect->x * scale_x);
308 r.y = (int)((float)dstrect->y * scale_y);
309 r.w = (int)((float)dstrect->w * scale_x);
310 r.h = (int)((float)dstrect->h * scale_y);
311 result = SDL_BlitSurfaceScaled(src, srcrect, surface, &r, scaleMode);
312 } else {
313 result = SDL_BlitSurface(src, srcrect, surface, dstrect);
314 }
315 return result;
316}
317
318static bool SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Texture *texture,
319 const SDL_Rect *srcrect, const SDL_Rect *final_rect,
320 const double angle, const SDL_FPoint *center, const SDL_FlipMode flip, float scale_x, float scale_y)
321{
322 SDL_Surface *src = (SDL_Surface *)texture->internal;
323 SDL_Rect tmp_rect;
324 SDL_Surface *src_clone, *src_rotated, *src_scaled;
325 SDL_Surface *mask = NULL, *mask_rotated = NULL;
326 bool result = true;
327 SDL_BlendMode blendmode;
328 Uint8 alphaMod, rMod, gMod, bMod;
329 int applyModulation = false;
330 int blitRequired = false;
331 int isOpaque = false;
332
333 if (!SDL_SurfaceValid(surface)) {
334 return false;
335 }
336
337 tmp_rect.x = 0;
338 tmp_rect.y = 0;
339 tmp_rect.w = final_rect->w;
340 tmp_rect.h = final_rect->h;
341
342 /* It is possible to encounter an RLE encoded surface here and locking it is
343 * necessary because this code is going to access the pixel buffer directly.
344 */
345 if (SDL_MUSTLOCK(src)) {
346 if (!SDL_LockSurface(src)) {
347 return false;
348 }
349 }
350
351 /* Clone the source surface but use its pixel buffer directly.
352 * The original source surface must be treated as read-only.
353 */
354 src_clone = SDL_CreateSurfaceFrom(src->w, src->h, src->format, src->pixels, src->pitch);
355 if (!src_clone) {
356 if (SDL_MUSTLOCK(src)) {
357 SDL_UnlockSurface(src);
358 }
359 return false;
360 }
361
362 SDL_GetSurfaceBlendMode(src, &blendmode);
363 SDL_GetSurfaceAlphaMod(src, &alphaMod);
364 SDL_GetSurfaceColorMod(src, &rMod, &gMod, &bMod);
365
366 // SDLgfx_rotateSurface only accepts 32-bit surfaces with a 8888 layout. Everything else has to be converted.
367 if (src->fmt->bits_per_pixel != 32 || SDL_PIXELLAYOUT(src->format) != SDL_PACKEDLAYOUT_8888 || !SDL_ISPIXELFORMAT_ALPHA(src->format)) {
368 blitRequired = true;
369 }
370
371 // If scaling and cropping is necessary, it has to be taken care of before the rotation.
372 if (!(srcrect->w == final_rect->w && srcrect->h == final_rect->h && srcrect->x == 0 && srcrect->y == 0)) {
373 blitRequired = true;
374 }
375
376 // srcrect is not selecting the whole src surface, so cropping is needed
377 if (!(srcrect->w == src->w && srcrect->h == src->h && srcrect->x == 0 && srcrect->y == 0)) {
378 blitRequired = true;
379 }
380
381 // The color and alpha modulation has to be applied before the rotation when using the NONE, MOD or MUL blend modes.
382 if ((blendmode == SDL_BLENDMODE_NONE || blendmode == SDL_BLENDMODE_MOD || blendmode == SDL_BLENDMODE_MUL) && (alphaMod & rMod & gMod & bMod) != 255) {
383 applyModulation = true;
384 SDL_SetSurfaceAlphaMod(src_clone, alphaMod);
385 SDL_SetSurfaceColorMod(src_clone, rMod, gMod, bMod);
386 }
387
388 // Opaque surfaces are much easier to handle with the NONE blend mode.
389 if (blendmode == SDL_BLENDMODE_NONE && !SDL_ISPIXELFORMAT_ALPHA(src->format) && alphaMod == 255) {
390 isOpaque = true;
391 }
392
393 /* The NONE blend mode requires a mask for non-opaque surfaces. This mask will be used
394 * to clear the pixels in the destination surface. The other steps are explained below.
395 */
396 if (blendmode == SDL_BLENDMODE_NONE && !isOpaque) {
397 mask = SDL_CreateSurface(final_rect->w, final_rect->h, SDL_PIXELFORMAT_ARGB8888);
398 if (!mask) {
399 result = false;
400 } else {
401 SDL_SetSurfaceBlendMode(mask, SDL_BLENDMODE_MOD);
402 }
403 }
404
405 /* Create a new surface should there be a format mismatch or if scaling, cropping,
406 * or modulation is required. It's possible to use the source surface directly otherwise.
407 */
408 if (result && (blitRequired || applyModulation)) {
409 SDL_Rect scale_rect = tmp_rect;
410 src_scaled = SDL_CreateSurface(final_rect->w, final_rect->h, SDL_PIXELFORMAT_ARGB8888);
411 if (!src_scaled) {
412 result = false;
413 } else {
414 SDL_SetSurfaceBlendMode(src_clone, SDL_BLENDMODE_NONE);
415 result = SDL_BlitSurfaceScaled(src_clone, srcrect, src_scaled, &scale_rect, texture->scaleMode);
416 SDL_DestroySurface(src_clone);
417 src_clone = src_scaled;
418 src_scaled = NULL;
419 }
420 }
421
422 // SDLgfx_rotateSurface is going to make decisions depending on the blend mode.
423 SDL_SetSurfaceBlendMode(src_clone, blendmode);
424
425 if (result) {
426 SDL_Rect rect_dest;
427 double cangle, sangle;
428
429 SDLgfx_rotozoomSurfaceSizeTrig(tmp_rect.w, tmp_rect.h, angle, center,
430 &rect_dest, &cangle, &sangle);
431 src_rotated = SDLgfx_rotateSurface(src_clone, angle,
432 (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? 0 : 1, flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL,
433 &rect_dest, cangle, sangle, center);
434 if (!src_rotated) {
435 result = false;
436 }
437 if (result && mask) {
438 // The mask needed for the NONE blend mode gets rotated with the same parameters.
439 mask_rotated = SDLgfx_rotateSurface(mask, angle,
440 false, 0, 0,
441 &rect_dest, cangle, sangle, center);
442 if (!mask_rotated) {
443 result = false;
444 }
445 }
446 if (result) {
447
448 tmp_rect.x = final_rect->x + rect_dest.x;
449 tmp_rect.y = final_rect->y + rect_dest.y;
450 tmp_rect.w = rect_dest.w;
451 tmp_rect.h = rect_dest.h;
452
453 /* The NONE blend mode needs some special care with non-opaque surfaces.
454 * Other blend modes or opaque surfaces can be blitted directly.
455 */
456 if (blendmode != SDL_BLENDMODE_NONE || isOpaque) {
457 if (applyModulation == false) {
458 // If the modulation wasn't already applied, make it happen now.
459 SDL_SetSurfaceAlphaMod(src_rotated, alphaMod);
460 SDL_SetSurfaceColorMod(src_rotated, rMod, gMod, bMod);
461 }
462 // Renderer scaling, if needed
463 result = Blit_to_Screen(src_rotated, NULL, surface, &tmp_rect, scale_x, scale_y, texture->scaleMode);
464 } else {
465 /* The NONE blend mode requires three steps to get the pixels onto the destination surface.
466 * First, the area where the rotated pixels will be blitted to get set to zero.
467 * This is accomplished by simply blitting a mask with the NONE blend mode.
468 * The colorkey set by the rotate function will discard the correct pixels.
469 */
470 SDL_Rect mask_rect = tmp_rect;
471 SDL_SetSurfaceBlendMode(mask_rotated, SDL_BLENDMODE_NONE);
472 // Renderer scaling, if needed
473 result = Blit_to_Screen(mask_rotated, NULL, surface, &mask_rect, scale_x, scale_y, texture->scaleMode);
474 if (result) {
475 /* The next step copies the alpha value. This is done with the BLEND blend mode and
476 * by modulating the source colors with 0. Since the destination is all zeros, this
477 * will effectively set the destination alpha to the source alpha.
478 */
479 SDL_SetSurfaceColorMod(src_rotated, 0, 0, 0);
480 mask_rect = tmp_rect;
481 // Renderer scaling, if needed
482 result = Blit_to_Screen(src_rotated, NULL, surface, &mask_rect, scale_x, scale_y, texture->scaleMode);
483 if (result) {
484 /* The last step gets the color values in place. The ADD blend mode simply adds them to
485 * the destination (where the color values are all zero). However, because the ADD blend
486 * mode modulates the colors with the alpha channel, a surface without an alpha mask needs
487 * to be created. This makes all source pixels opaque and the colors get copied correctly.
488 */
489 SDL_Surface *src_rotated_rgb = SDL_CreateSurfaceFrom(src_rotated->w, src_rotated->h, src_rotated->format, src_rotated->pixels, src_rotated->pitch);
490 if (!src_rotated_rgb) {
491 result = false;
492 } else {
493 SDL_SetSurfaceBlendMode(src_rotated_rgb, SDL_BLENDMODE_ADD);
494 // Renderer scaling, if needed
495 result = Blit_to_Screen(src_rotated_rgb, NULL, surface, &tmp_rect, scale_x, scale_y, texture->scaleMode);
496 SDL_DestroySurface(src_rotated_rgb);
497 }
498 }
499 }
500 SDL_DestroySurface(mask_rotated);
501 }
502 if (src_rotated) {
503 SDL_DestroySurface(src_rotated);
504 }
505 }
506 }
507
508 if (SDL_MUSTLOCK(src)) {
509 SDL_UnlockSurface(src);
510 }
511 if (mask) {
512 SDL_DestroySurface(mask);
513 }
514 if (src_clone) {
515 SDL_DestroySurface(src_clone);
516 }
517 return result;
518}
519
520typedef struct GeometryFillData
521{
522 SDL_Point dst;
523 SDL_Color color;
524} GeometryFillData;
525
526typedef struct GeometryCopyData
527{
528 SDL_Point src;
529 SDL_Point dst;
530 SDL_Color color;
531} GeometryCopyData;
532
533static bool SW_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
534 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
535 int num_vertices, const void *indices, int num_indices, int size_indices,
536 float scale_x, float scale_y)
537{
538 int i;
539 int count = indices ? num_indices : num_vertices;
540 void *verts;
541 size_t sz = texture ? sizeof(GeometryCopyData) : sizeof(GeometryFillData);
542 const float color_scale = cmd->data.draw.color_scale;
543
544 verts = SDL_AllocateRenderVertices(renderer, count * sz, 0, &cmd->data.draw.first);
545 if (!verts) {
546 return false;
547 }
548
549 cmd->data.draw.count = count;
550 size_indices = indices ? size_indices : 0;
551
552 if (texture) {
553 GeometryCopyData *ptr = (GeometryCopyData *)verts;
554 for (i = 0; i < count; i++) {
555 int j;
556 float *xy_;
557 SDL_FColor col_;
558 float *uv_;
559 if (size_indices == 4) {
560 j = ((const Uint32 *)indices)[i];
561 } else if (size_indices == 2) {
562 j = ((const Uint16 *)indices)[i];
563 } else if (size_indices == 1) {
564 j = ((const Uint8 *)indices)[i];
565 } else {
566 j = i;
567 }
568
569 xy_ = (float *)((char *)xy + j * xy_stride);
570 col_ = *(SDL_FColor *)((char *)color + j * color_stride);
571
572 uv_ = (float *)((char *)uv + j * uv_stride);
573
574 ptr->src.x = (int)(uv_[0] * texture->w);
575 ptr->src.y = (int)(uv_[1] * texture->h);
576
577 ptr->dst.x = (int)(xy_[0] * scale_x);
578 ptr->dst.y = (int)(xy_[1] * scale_y);
579 trianglepoint_2_fixedpoint(&ptr->dst);
580
581 ptr->color.r = (Uint8)SDL_roundf(SDL_clamp(col_.r * color_scale, 0.0f, 1.0f) * 255.0f);
582 ptr->color.g = (Uint8)SDL_roundf(SDL_clamp(col_.g * color_scale, 0.0f, 1.0f) * 255.0f);
583 ptr->color.b = (Uint8)SDL_roundf(SDL_clamp(col_.b * color_scale, 0.0f, 1.0f) * 255.0f);
584 ptr->color.a = (Uint8)SDL_roundf(SDL_clamp(col_.a, 0.0f, 1.0f) * 255.0f);
585
586 ptr++;
587 }
588 } else {
589 GeometryFillData *ptr = (GeometryFillData *)verts;
590
591 for (i = 0; i < count; i++) {
592 int j;
593 float *xy_;
594 SDL_FColor col_;
595 if (size_indices == 4) {
596 j = ((const Uint32 *)indices)[i];
597 } else if (size_indices == 2) {
598 j = ((const Uint16 *)indices)[i];
599 } else if (size_indices == 1) {
600 j = ((const Uint8 *)indices)[i];
601 } else {
602 j = i;
603 }
604
605 xy_ = (float *)((char *)xy + j * xy_stride);
606 col_ = *(SDL_FColor *)((char *)color + j * color_stride);
607
608 ptr->dst.x = (int)(xy_[0] * scale_x);
609 ptr->dst.y = (int)(xy_[1] * scale_y);
610 trianglepoint_2_fixedpoint(&ptr->dst);
611
612 ptr->color.r = (Uint8)SDL_roundf(SDL_clamp(col_.r * color_scale, 0.0f, 1.0f) * 255.0f);
613 ptr->color.g = (Uint8)SDL_roundf(SDL_clamp(col_.g * color_scale, 0.0f, 1.0f) * 255.0f);
614 ptr->color.b = (Uint8)SDL_roundf(SDL_clamp(col_.b * color_scale, 0.0f, 1.0f) * 255.0f);
615 ptr->color.a = (Uint8)SDL_roundf(SDL_clamp(col_.a, 0.0f, 1.0f) * 255.0f);
616
617 ptr++;
618 }
619 }
620 return true;
621}
622
623static void PrepTextureForCopy(const SDL_RenderCommand *cmd, SW_DrawStateCache *drawstate)
624{
625 const Uint8 r = drawstate->color.r;
626 const Uint8 g = drawstate->color.g;
627 const Uint8 b = drawstate->color.b;
628 const Uint8 a = drawstate->color.a;
629 const SDL_BlendMode blend = cmd->data.draw.blend;
630 SDL_Texture *texture = cmd->data.draw.texture;
631 SDL_Surface *surface = (SDL_Surface *)texture->internal;
632 const bool colormod = ((r & g & b) != 0xFF);
633 const bool alphamod = (a != 0xFF);
634 const bool blending = ((blend == SDL_BLENDMODE_ADD) || (blend == SDL_BLENDMODE_MOD) || (blend == SDL_BLENDMODE_MUL));
635
636 if (colormod || alphamod || blending) {
637 SDL_SetSurfaceRLE(surface, 0);
638 }
639
640 // !!! FIXME: we can probably avoid some of these calls.
641 SDL_SetSurfaceColorMod(surface, r, g, b);
642 SDL_SetSurfaceAlphaMod(surface, a);
643 SDL_SetSurfaceBlendMode(surface, blend);
644}
645
646static void SetDrawState(SDL_Surface *surface, SW_DrawStateCache *drawstate)
647{
648 if (drawstate->surface_cliprect_dirty) {
649 const SDL_Rect *viewport = drawstate->viewport;
650 const SDL_Rect *cliprect = drawstate->cliprect;
651 SDL_assert_release(viewport != NULL); // the higher level should have forced a SDL_RENDERCMD_SETVIEWPORT
652
653 if (cliprect && viewport) {
654 SDL_Rect clip_rect;
655 clip_rect.x = cliprect->x + viewport->x;
656 clip_rect.y = cliprect->y + viewport->y;
657 clip_rect.w = cliprect->w;
658 clip_rect.h = cliprect->h;
659 SDL_GetRectIntersection(viewport, &clip_rect, &clip_rect);
660 SDL_SetSurfaceClipRect(surface, &clip_rect);
661 } else {
662 SDL_SetSurfaceClipRect(surface, drawstate->viewport);
663 }
664 drawstate->surface_cliprect_dirty = false;
665 }
666}
667
668static void SW_InvalidateCachedState(SDL_Renderer *renderer)
669{
670 // SW_DrawStateCache only lives during SW_RunCommandQueue, so nothing to do here!
671}
672
673
674static bool SW_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
675{
676 SDL_Surface *surface = SW_ActivateRenderer(renderer);
677 SW_DrawStateCache drawstate;
678
679 if (!SDL_SurfaceValid(surface)) {
680 return false;
681 }
682
683 drawstate.viewport = NULL;
684 drawstate.cliprect = NULL;
685 drawstate.surface_cliprect_dirty = true;
686 drawstate.color.r = 0;
687 drawstate.color.g = 0;
688 drawstate.color.b = 0;
689 drawstate.color.a = 0;
690
691 while (cmd) {
692 switch (cmd->command) {
693 case SDL_RENDERCMD_SETDRAWCOLOR:
694 {
695 drawstate.color.r = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.r * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
696 drawstate.color.g = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.g * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
697 drawstate.color.b = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.b * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
698 drawstate.color.a = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.a, 0.0f, 1.0f) * 255.0f);
699 break;
700 }
701
702 case SDL_RENDERCMD_SETVIEWPORT:
703 {
704 drawstate.viewport = &cmd->data.viewport.rect;
705 drawstate.surface_cliprect_dirty = true;
706 break;
707 }
708
709 case SDL_RENDERCMD_SETCLIPRECT:
710 {
711 drawstate.cliprect = cmd->data.cliprect.enabled ? &cmd->data.cliprect.rect : NULL;
712 drawstate.surface_cliprect_dirty = true;
713 break;
714 }
715
716 case SDL_RENDERCMD_CLEAR:
717 {
718 const Uint8 r = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.r * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
719 const Uint8 g = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.g * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
720 const Uint8 b = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.b * cmd->data.color.color_scale, 0.0f, 1.0f) * 255.0f);
721 const Uint8 a = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.a, 0.0f, 1.0f) * 255.0f);
722 // By definition the clear ignores the clip rect
723 SDL_SetSurfaceClipRect(surface, NULL);
724 SDL_FillSurfaceRect(surface, NULL, SDL_MapSurfaceRGBA(surface, r, g, b, a));
725 drawstate.surface_cliprect_dirty = true;
726 break;
727 }
728
729 case SDL_RENDERCMD_DRAW_POINTS:
730 {
731 const Uint8 r = drawstate.color.r;
732 const Uint8 g = drawstate.color.g;
733 const Uint8 b = drawstate.color.b;
734 const Uint8 a = drawstate.color.a;
735 const int count = (int)cmd->data.draw.count;
736 SDL_Point *verts = (SDL_Point *)(((Uint8 *)vertices) + cmd->data.draw.first);
737 const SDL_BlendMode blend = cmd->data.draw.blend;
738 SetDrawState(surface, &drawstate);
739
740 // Apply viewport
741 if (drawstate.viewport && (drawstate.viewport->x || drawstate.viewport->y)) {
742 int i;
743 for (i = 0; i < count; i++) {
744 verts[i].x += drawstate.viewport->x;
745 verts[i].y += drawstate.viewport->y;
746 }
747 }
748
749 if (blend == SDL_BLENDMODE_NONE) {
750 SDL_DrawPoints(surface, verts, count, SDL_MapSurfaceRGBA(surface, r, g, b, a));
751 } else {
752 SDL_BlendPoints(surface, verts, count, blend, r, g, b, a);
753 }
754 break;
755 }
756
757 case SDL_RENDERCMD_DRAW_LINES:
758 {
759 const Uint8 r = drawstate.color.r;
760 const Uint8 g = drawstate.color.g;
761 const Uint8 b = drawstate.color.b;
762 const Uint8 a = drawstate.color.a;
763 const int count = (int)cmd->data.draw.count;
764 SDL_Point *verts = (SDL_Point *)(((Uint8 *)vertices) + cmd->data.draw.first);
765 const SDL_BlendMode blend = cmd->data.draw.blend;
766 SetDrawState(surface, &drawstate);
767
768 // Apply viewport
769 if (drawstate.viewport && (drawstate.viewport->x || drawstate.viewport->y)) {
770 int i;
771 for (i = 0; i < count; i++) {
772 verts[i].x += drawstate.viewport->x;
773 verts[i].y += drawstate.viewport->y;
774 }
775 }
776
777 if (blend == SDL_BLENDMODE_NONE) {
778 SDL_DrawLines(surface, verts, count, SDL_MapSurfaceRGBA(surface, r, g, b, a));
779 } else {
780 SDL_BlendLines(surface, verts, count, blend, r, g, b, a);
781 }
782 break;
783 }
784
785 case SDL_RENDERCMD_FILL_RECTS:
786 {
787 const Uint8 r = drawstate.color.r;
788 const Uint8 g = drawstate.color.g;
789 const Uint8 b = drawstate.color.b;
790 const Uint8 a = drawstate.color.a;
791 const int count = (int)cmd->data.draw.count;
792 SDL_Rect *verts = (SDL_Rect *)(((Uint8 *)vertices) + cmd->data.draw.first);
793 const SDL_BlendMode blend = cmd->data.draw.blend;
794 SetDrawState(surface, &drawstate);
795
796 // Apply viewport
797 if (drawstate.viewport && (drawstate.viewport->x || drawstate.viewport->y)) {
798 int i;
799 for (i = 0; i < count; i++) {
800 verts[i].x += drawstate.viewport->x;
801 verts[i].y += drawstate.viewport->y;
802 }
803 }
804
805 if (blend == SDL_BLENDMODE_NONE) {
806 SDL_FillSurfaceRects(surface, verts, count, SDL_MapSurfaceRGBA(surface, r, g, b, a));
807 } else {
808 SDL_BlendFillRects(surface, verts, count, blend, r, g, b, a);
809 }
810 break;
811 }
812
813 case SDL_RENDERCMD_COPY:
814 {
815 SDL_Rect *verts = (SDL_Rect *)(((Uint8 *)vertices) + cmd->data.draw.first);
816 const SDL_Rect *srcrect = verts;
817 SDL_Rect *dstrect = verts + 1;
818 SDL_Texture *texture = cmd->data.draw.texture;
819 SDL_Surface *src = (SDL_Surface *)texture->internal;
820
821 SetDrawState(surface, &drawstate);
822
823 PrepTextureForCopy(cmd, &drawstate);
824
825 // Apply viewport
826 if (drawstate.viewport && (drawstate.viewport->x || drawstate.viewport->y)) {
827 dstrect->x += drawstate.viewport->x;
828 dstrect->y += drawstate.viewport->y;
829 }
830
831 if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) {
832 SDL_BlitSurface(src, srcrect, surface, dstrect);
833 } else {
834 /* If scaling is ever done, permanently disable RLE (which doesn't support scaling)
835 * to avoid potentially frequent RLE encoding/decoding.
836 */
837 SDL_SetSurfaceRLE(surface, 0);
838
839 // Prevent to do scaling + clipping on viewport boundaries as it may lose proportion
840 if (dstrect->x < 0 || dstrect->y < 0 || dstrect->x + dstrect->w > surface->w || dstrect->y + dstrect->h > surface->h) {
841 SDL_Surface *tmp = SDL_CreateSurface(dstrect->w, dstrect->h, src->format);
842 // Scale to an intermediate surface, then blit
843 if (tmp) {
844 SDL_Rect r;
845 SDL_BlendMode blendmode;
846 Uint8 alphaMod, rMod, gMod, bMod;
847
848 SDL_GetSurfaceBlendMode(src, &blendmode);
849 SDL_GetSurfaceAlphaMod(src, &alphaMod);
850 SDL_GetSurfaceColorMod(src, &rMod, &gMod, &bMod);
851
852 r.x = 0;
853 r.y = 0;
854 r.w = dstrect->w;
855 r.h = dstrect->h;
856
857 SDL_SetSurfaceBlendMode(src, SDL_BLENDMODE_NONE);
858 SDL_SetSurfaceColorMod(src, 255, 255, 255);
859 SDL_SetSurfaceAlphaMod(src, 255);
860
861 SDL_BlitSurfaceScaled(src, srcrect, tmp, &r, texture->scaleMode);
862
863 SDL_SetSurfaceColorMod(tmp, rMod, gMod, bMod);
864 SDL_SetSurfaceAlphaMod(tmp, alphaMod);
865 SDL_SetSurfaceBlendMode(tmp, blendmode);
866
867 SDL_BlitSurface(tmp, NULL, surface, dstrect);
868 SDL_DestroySurface(tmp);
869 // No need to set back r/g/b/a/blendmode to 'src' since it's done in PrepTextureForCopy()
870 }
871 } else {
872 SDL_BlitSurfaceScaled(src, srcrect, surface, dstrect, texture->scaleMode);
873 }
874 }
875 break;
876 }
877
878 case SDL_RENDERCMD_COPY_EX:
879 {
880 CopyExData *copydata = (CopyExData *)(((Uint8 *)vertices) + cmd->data.draw.first);
881 SetDrawState(surface, &drawstate);
882 PrepTextureForCopy(cmd, &drawstate);
883
884 // Apply viewport
885 if (drawstate.viewport && (drawstate.viewport->x || drawstate.viewport->y)) {
886 copydata->dstrect.x += drawstate.viewport->x;
887 copydata->dstrect.y += drawstate.viewport->y;
888 }
889
890 SW_RenderCopyEx(renderer, surface, cmd->data.draw.texture, &copydata->srcrect,
891 &copydata->dstrect, copydata->angle, &copydata->center, copydata->flip,
892 copydata->scale_x, copydata->scale_y);
893 break;
894 }
895
896 case SDL_RENDERCMD_GEOMETRY:
897 {
898 int i;
899 SDL_Rect *verts = (SDL_Rect *)(((Uint8 *)vertices) + cmd->data.draw.first);
900 const int count = (int)cmd->data.draw.count;
901 SDL_Texture *texture = cmd->data.draw.texture;
902 const SDL_BlendMode blend = cmd->data.draw.blend;
903
904 SetDrawState(surface, &drawstate);
905
906 if (texture) {
907 SDL_Surface *src = (SDL_Surface *)texture->internal;
908
909 GeometryCopyData *ptr = (GeometryCopyData *)verts;
910
911 PrepTextureForCopy(cmd, &drawstate);
912
913 // Apply viewport
914 if (drawstate.viewport && (drawstate.viewport->x || drawstate.viewport->y)) {
915 SDL_Point vp;
916 vp.x = drawstate.viewport->x;
917 vp.y = drawstate.viewport->y;
918 trianglepoint_2_fixedpoint(&vp);
919 for (i = 0; i < count; i++) {
920 ptr[i].dst.x += vp.x;
921 ptr[i].dst.y += vp.y;
922 }
923 }
924
925 for (i = 0; i < count; i += 3, ptr += 3) {
926 SDL_SW_BlitTriangle(
927 src,
928 &(ptr[0].src), &(ptr[1].src), &(ptr[2].src),
929 surface,
930 &(ptr[0].dst), &(ptr[1].dst), &(ptr[2].dst),
931 ptr[0].color, ptr[1].color, ptr[2].color,
932 cmd->data.draw.texture_address_mode);
933 }
934 } else {
935 GeometryFillData *ptr = (GeometryFillData *)verts;
936
937 // Apply viewport
938 if (drawstate.viewport && (drawstate.viewport->x || drawstate.viewport->y)) {
939 SDL_Point vp;
940 vp.x = drawstate.viewport->x;
941 vp.y = drawstate.viewport->y;
942 trianglepoint_2_fixedpoint(&vp);
943 for (i = 0; i < count; i++) {
944 ptr[i].dst.x += vp.x;
945 ptr[i].dst.y += vp.y;
946 }
947 }
948
949 for (i = 0; i < count; i += 3, ptr += 3) {
950 SDL_SW_FillTriangle(surface, &(ptr[0].dst), &(ptr[1].dst), &(ptr[2].dst), blend, ptr[0].color, ptr[1].color, ptr[2].color);
951 }
952 }
953 break;
954 }
955
956 case SDL_RENDERCMD_NO_OP:
957 break;
958 }
959
960 cmd = cmd->next;
961 }
962
963 return true;
964}
965
966static SDL_Surface *SW_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
967{
968 SDL_Surface *surface = SW_ActivateRenderer(renderer);
969 void *pixels;
970
971 if (!SDL_SurfaceValid(surface)) {
972 return NULL;
973 }
974
975 /* NOTE: The rect is already adjusted according to the viewport by
976 * SDL_RenderReadPixels.
977 */
978
979 if (rect->x < 0 || rect->x + rect->w > surface->w ||
980 rect->y < 0 || rect->y + rect->h > surface->h) {
981 SDL_SetError("Tried to read outside of surface bounds");
982 return NULL;
983 }
984
985 pixels = (void *)((Uint8 *)surface->pixels +
986 rect->y * surface->pitch +
987 rect->x * surface->fmt->bytes_per_pixel);
988
989 return SDL_DuplicatePixels(rect->w, rect->h, surface->format, SDL_COLORSPACE_SRGB, pixels, surface->pitch);
990}
991
992static bool SW_RenderPresent(SDL_Renderer *renderer)
993{
994 SDL_Window *window = renderer->window;
995
996 if (!window) {
997 return false;
998 }
999 return SDL_UpdateWindowSurface(window);
1000}
1001
1002static void SW_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1003{
1004 SDL_Surface *surface = (SDL_Surface *)texture->internal;
1005
1006 SDL_DestroySurface(surface);
1007}
1008
1009static void SW_DestroyRenderer(SDL_Renderer *renderer)
1010{
1011 SDL_Window *window = renderer->window;
1012 SW_RenderData *data = (SW_RenderData *)renderer->internal;
1013
1014 if (window) {
1015 SDL_DestroyWindowSurface(window);
1016 }
1017 SDL_free(data);
1018}
1019
1020static void SW_SelectBestFormats(SDL_Renderer *renderer, SDL_PixelFormat format)
1021{
1022 // Prefer the format used by the framebuffer by default.
1023 SDL_AddSupportedTextureFormat(renderer, format);
1024
1025 switch (format) {
1026 case SDL_PIXELFORMAT_XRGB4444:
1027 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB4444);
1028 break;
1029 case SDL_PIXELFORMAT_XBGR4444:
1030 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR4444);
1031 break;
1032 case SDL_PIXELFORMAT_ARGB4444:
1033 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB4444);
1034 break;
1035 case SDL_PIXELFORMAT_ABGR4444:
1036 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR4444);
1037 break;
1038
1039 case SDL_PIXELFORMAT_XRGB1555:
1040 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB1555);
1041 break;
1042 case SDL_PIXELFORMAT_XBGR1555:
1043 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR1555);
1044 break;
1045 case SDL_PIXELFORMAT_ARGB1555:
1046 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB1555);
1047 break;
1048 case SDL_PIXELFORMAT_ABGR1555:
1049 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR1555);
1050 break;
1051
1052 case SDL_PIXELFORMAT_XRGB8888:
1053 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
1054 break;
1055 case SDL_PIXELFORMAT_RGBX8888:
1056 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA8888);
1057 break;
1058 case SDL_PIXELFORMAT_XBGR8888:
1059 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
1060 break;
1061 case SDL_PIXELFORMAT_BGRX8888:
1062 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA8888);
1063 break;
1064 case SDL_PIXELFORMAT_ARGB8888:
1065 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
1066 break;
1067 case SDL_PIXELFORMAT_RGBA8888:
1068 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX8888);
1069 break;
1070 case SDL_PIXELFORMAT_ABGR8888:
1071 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR8888);
1072 break;
1073 case SDL_PIXELFORMAT_BGRA8888:
1074 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX8888);
1075 break;
1076 default:
1077 break;
1078 }
1079
1080 /* Ensure that we always have a SDL_PACKEDLAYOUT_8888 format. Having a matching component order increases the
1081 * chances of getting a fast path for blitting.
1082 */
1083 if (SDL_ISPIXELFORMAT_PACKED(format)) {
1084 if (SDL_PIXELLAYOUT(format) != SDL_PACKEDLAYOUT_8888) {
1085 switch (SDL_PIXELORDER(format)) {
1086 case SDL_PACKEDORDER_BGRX:
1087 case SDL_PACKEDORDER_BGRA:
1088 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRX8888);
1089 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGRA8888);
1090 break;
1091 case SDL_PACKEDORDER_RGBX:
1092 case SDL_PACKEDORDER_RGBA:
1093 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBX8888);
1094 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA8888);
1095 break;
1096 case SDL_PACKEDORDER_XBGR:
1097 case SDL_PACKEDORDER_ABGR:
1098 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XBGR8888);
1099 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
1100 break;
1101 case SDL_PACKEDORDER_XRGB:
1102 case SDL_PACKEDORDER_ARGB:
1103 default:
1104 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
1105 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
1106 break;
1107 }
1108 }
1109 } else {
1110 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_XRGB8888);
1111 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
1112 }
1113}
1114
1115bool SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, SDL_PropertiesID create_props)
1116{
1117 SW_RenderData *data;
1118
1119 if (!SDL_SurfaceValid(surface)) {
1120 return SDL_InvalidParamError("surface");
1121 }
1122
1123 renderer->software = true;
1124
1125 data = (SW_RenderData *)SDL_calloc(1, sizeof(*data));
1126 if (!data) {
1127 return false;
1128 }
1129 data->surface = surface;
1130 data->window = surface;
1131
1132 renderer->WindowEvent = SW_WindowEvent;
1133 renderer->GetOutputSize = SW_GetOutputSize;
1134 renderer->CreateTexture = SW_CreateTexture;
1135 renderer->UpdateTexture = SW_UpdateTexture;
1136 renderer->LockTexture = SW_LockTexture;
1137 renderer->UnlockTexture = SW_UnlockTexture;
1138 renderer->SetTextureScaleMode = SW_SetTextureScaleMode;
1139 renderer->SetRenderTarget = SW_SetRenderTarget;
1140 renderer->QueueSetViewport = SW_QueueNoOp;
1141 renderer->QueueSetDrawColor = SW_QueueNoOp;
1142 renderer->QueueDrawPoints = SW_QueueDrawPoints;
1143 renderer->QueueDrawLines = SW_QueueDrawPoints; // lines and points queue vertices the same way.
1144 renderer->QueueFillRects = SW_QueueFillRects;
1145 renderer->QueueCopy = SW_QueueCopy;
1146 renderer->QueueCopyEx = SW_QueueCopyEx;
1147 renderer->QueueGeometry = SW_QueueGeometry;
1148 renderer->InvalidateCachedState = SW_InvalidateCachedState;
1149 renderer->RunCommandQueue = SW_RunCommandQueue;
1150 renderer->RenderReadPixels = SW_RenderReadPixels;
1151 renderer->RenderPresent = SW_RenderPresent;
1152 renderer->DestroyTexture = SW_DestroyTexture;
1153 renderer->DestroyRenderer = SW_DestroyRenderer;
1154 renderer->internal = data;
1155 SW_InvalidateCachedState(renderer);
1156
1157 renderer->name = SW_RenderDriver.name;
1158
1159 SW_SelectBestFormats(renderer, surface->format);
1160
1161 SDL_SetupRendererColorspace(renderer, create_props);
1162
1163 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
1164 return SDL_SetError("Unsupported output colorspace");
1165 }
1166
1167 return true;
1168}
1169
1170static bool SW_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
1171{
1172 // Set the vsync hint based on our flags, if it's not already set
1173 const char *hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC);
1174 const bool no_hint_set = (!hint || !*hint);
1175
1176 if (no_hint_set) {
1177 if (SDL_GetBooleanProperty(create_props, SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER, 0)) {
1178 SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1");
1179 } else {
1180 SDL_SetHint(SDL_HINT_RENDER_VSYNC, "0");
1181 }
1182 }
1183
1184 SDL_Surface *surface = SDL_GetWindowSurface(window);
1185
1186 // Reset the vsync hint if we set it above
1187 if (no_hint_set) {
1188 SDL_SetHint(SDL_HINT_RENDER_VSYNC, "");
1189 }
1190
1191 if (!SDL_SurfaceValid(surface)) {
1192 return false;
1193 }
1194
1195 return SW_CreateRendererForSurface(renderer, surface, create_props);
1196}
1197
1198SDL_RenderDriver SW_RenderDriver = {
1199 SW_CreateRenderer, SDL_SOFTWARE_RENDERER
1200};
1201
1202#endif // SDL_VIDEO_RENDER_SW
diff --git a/SDL-3.2.8/src/render/software/SDL_render_sw_c.h b/SDL-3.2.8/src/render/software/SDL_render_sw_c.h
new file mode 100644
index 0000000..40d3c3a
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_render_sw_c.h
@@ -0,0 +1,27 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_render_sw_c_h_
23#define SDL_render_sw_c_h_
24
25extern bool SW_CreateRendererForSurface(SDL_Renderer *renderer, SDL_Surface *surface, SDL_PropertiesID create_props);
26
27#endif // SDL_render_sw_c_h_
diff --git a/SDL-3.2.8/src/render/software/SDL_rotate.c b/SDL-3.2.8/src/render/software/SDL_rotate.c
new file mode 100644
index 0000000..516ba8a
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_rotate.c
@@ -0,0 +1,612 @@
1/*
2
3SDL_rotate.c: rotates 32bit or 8bit surfaces
4
5Shamelessly stolen from SDL_gfx by Andreas Schiffler. Original copyright follows:
6
7Copyright (C) 2001-2011 Andreas Schiffler
8
9This software is provided 'as-is', without any express or implied
10warranty. In no event will the authors be held liable for any damages
11arising from the use of this software.
12
13Permission is granted to anyone to use this software for any purpose,
14including commercial applications, and to alter it and redistribute it
15freely, subject to the following restrictions:
16
17 1. The origin of this software must not be misrepresented; you must not
18 claim that you wrote the original software. If you use this software
19 in a product, an acknowledgment in the product documentation would be
20 appreciated but is not required.
21
22 2. Altered source versions must be plainly marked as such, and must not be
23 misrepresented as being the original software.
24
25 3. This notice may not be removed or altered from any source
26 distribution.
27
28Andreas Schiffler -- aschiffler at ferzkopp dot net
29
30*/
31#include "SDL_internal.h"
32
33#ifdef SDL_VIDEO_RENDER_SW
34
35#if defined(SDL_PLATFORM_WINDOWS)
36#include "../../core/windows/SDL_windows.h"
37#endif
38
39#include "SDL_rotate.h"
40
41#include "../../video/SDL_surface_c.h"
42
43// ---- Internally used structures
44
45/**
46A 32 bit RGBA pixel.
47*/
48typedef struct tColorRGBA
49{
50 Uint8 r;
51 Uint8 g;
52 Uint8 b;
53 Uint8 a;
54} tColorRGBA;
55
56/**
57A 8bit Y/palette pixel.
58*/
59typedef struct tColorY
60{
61 Uint8 y;
62} tColorY;
63
64/**
65Number of guard rows added to destination surfaces.
66
67This is a simple but effective workaround for observed issues.
68These rows allocate extra memory and are then hidden from the surface.
69Rows are added to the end of destination surfaces when they are allocated.
70This catches any potential overflows which seem to happen with
71just the right src image dimensions and scale/rotation and can lead
72to a situation where the program can segfault.
73*/
74#define GUARD_ROWS (2)
75
76/**
77Returns colorkey info for a surface
78*/
79static Uint32 get_colorkey(SDL_Surface *src)
80{
81 Uint32 key = 0;
82 if (SDL_SurfaceHasColorKey(src)) {
83 SDL_GetSurfaceColorKey(src, &key);
84 }
85 return key;
86}
87
88// rotate (sx, sy) by (angle, center) into (dx, dy)
89static void rotate(double sx, double sy, double sinangle, double cosangle, const SDL_FPoint *center, double *dx, double *dy)
90{
91 sx -= center->x;
92 sy -= center->y;
93
94 *dx = cosangle * sx - sinangle * sy;
95 *dy = sinangle * sx + cosangle * sy;
96
97 *dx += center->x;
98 *dy += center->y;
99}
100
101/**
102Internal target surface sizing function for rotations with trig result return.
103
104\param width The source surface width.
105\param height The source surface height.
106\param angle The angle to rotate in degrees.
107\param center The center of ratation
108\param rect_dest Bounding box of rotated rectangle
109\param cangle The sine of the angle
110\param sangle The cosine of the angle
111
112*/
113void SDLgfx_rotozoomSurfaceSizeTrig(int width, int height, double angle, const SDL_FPoint *center,
114 SDL_Rect *rect_dest, double *cangle, double *sangle)
115{
116 int minx, maxx, miny, maxy;
117 double radangle;
118 double x0, x1, x2, x3;
119 double y0, y1, y2, y3;
120 double sinangle;
121 double cosangle;
122
123 radangle = angle * (SDL_PI_D / 180.0);
124 sinangle = SDL_sin(radangle);
125 cosangle = SDL_cos(radangle);
126
127 /*
128 * Determine destination width and height by rotating a source box, at pixel center
129 */
130 rotate(0.5, 0.5, sinangle, cosangle, center, &x0, &y0);
131 rotate(width - 0.5, 0.5, sinangle, cosangle, center, &x1, &y1);
132 rotate(0.5, height - 0.5, sinangle, cosangle, center, &x2, &y2);
133 rotate(width - 0.5, height - 0.5, sinangle, cosangle, center, &x3, &y3);
134
135 minx = (int)SDL_floor(SDL_min(SDL_min(x0, x1), SDL_min(x2, x3)));
136 maxx = (int)SDL_ceil(SDL_max(SDL_max(x0, x1), SDL_max(x2, x3)));
137
138 miny = (int)SDL_floor(SDL_min(SDL_min(y0, y1), SDL_min(y2, y3)));
139 maxy = (int)SDL_ceil(SDL_max(SDL_max(y0, y1), SDL_max(y2, y3)));
140
141 rect_dest->w = maxx - minx;
142 rect_dest->h = maxy - miny;
143 rect_dest->x = minx;
144 rect_dest->y = miny;
145
146 // reverse the angle because our rotations are clockwise
147 *sangle = -sinangle;
148 *cangle = cosangle;
149
150 {
151 // The trig code below gets the wrong size (due to FP inaccuracy?) when angle is a multiple of 90 degrees
152 int angle90 = (int)(angle / 90);
153 if (angle90 == angle / 90) { // if the angle is a multiple of 90 degrees
154 angle90 %= 4;
155 if (angle90 < 0) {
156 angle90 += 4; // 0:0 deg, 1:90 deg, 2:180 deg, 3:270 deg
157 }
158
159 if (angle90 & 1) {
160 rect_dest->w = height;
161 rect_dest->h = width;
162 *cangle = 0;
163 *sangle = angle90 == 1 ? -1 : 1; // reversed because our rotations are clockwise
164 } else {
165 rect_dest->w = width;
166 rect_dest->h = height;
167 *cangle = angle90 == 0 ? 1 : -1;
168 *sangle = 0;
169 }
170 }
171 }
172}
173
174// Computes source pointer X/Y increments for a rotation that's a multiple of 90 degrees.
175static void computeSourceIncrements90(SDL_Surface *src, int bpp, int angle, int flipx, int flipy,
176 int *sincx, int *sincy, int *signx, int *signy)
177{
178 int pitch = flipy ? -src->pitch : src->pitch;
179 if (flipx) {
180 bpp = -bpp;
181 }
182 switch (angle) { // 0:0 deg, 1:90 deg, 2:180 deg, 3:270 deg
183 case 0:
184 *sincx = bpp;
185 *sincy = pitch - src->w * *sincx;
186 *signx = *signy = 1;
187 break;
188 case 1:
189 *sincx = -pitch;
190 *sincy = bpp - *sincx * src->h;
191 *signx = 1;
192 *signy = -1;
193 break;
194 case 2:
195 *sincx = -bpp;
196 *sincy = -src->w * *sincx - pitch;
197 *signx = *signy = -1;
198 break;
199 case 3:
200 default:
201 *sincx = pitch;
202 *sincy = -*sincx * src->h - bpp;
203 *signx = -1;
204 *signy = 1;
205 break;
206 }
207 if (flipx) {
208 *signx = -*signx;
209 }
210 if (flipy) {
211 *signy = -*signy;
212 }
213}
214
215// Performs a relatively fast rotation/flip when the angle is a multiple of 90 degrees.
216#define TRANSFORM_SURFACE_90(pixelType) \
217 int dy, dincy = dst->pitch - dst->w * sizeof(pixelType), sincx, sincy, signx, signy; \
218 Uint8 *sp = (Uint8 *)src->pixels, *dp = (Uint8 *)dst->pixels, *de; \
219 \
220 computeSourceIncrements90(src, sizeof(pixelType), angle, flipx, flipy, &sincx, &sincy, &signx, &signy); \
221 if (signx < 0) \
222 sp += (src->w - 1) * sizeof(pixelType); \
223 if (signy < 0) \
224 sp += (src->h - 1) * src->pitch; \
225 \
226 for (dy = 0; dy < dst->h; sp += sincy, dp += dincy, dy++) { \
227 if (sincx == sizeof(pixelType)) { /* if advancing src and dest equally, use SDL_memcpy */ \
228 SDL_memcpy(dp, sp, dst->w * sizeof(pixelType)); \
229 sp += dst->w * sizeof(pixelType); \
230 dp += dst->w * sizeof(pixelType); \
231 } else { \
232 for (de = dp + dst->w * sizeof(pixelType); dp != de; sp += sincx, dp += sizeof(pixelType)) { \
233 *(pixelType *)dp = *(pixelType *)sp; \
234 } \
235 } \
236 }
237
238static void transformSurfaceRGBA90(SDL_Surface *src, SDL_Surface *dst, int angle, int flipx, int flipy)
239{
240 TRANSFORM_SURFACE_90(tColorRGBA);
241}
242
243static void transformSurfaceY90(SDL_Surface *src, SDL_Surface *dst, int angle, int flipx, int flipy)
244{
245 TRANSFORM_SURFACE_90(tColorY);
246}
247
248#undef TRANSFORM_SURFACE_90
249
250/**
251Internal 32 bit rotozoomer with optional anti-aliasing.
252
253Rotates and zooms 32 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control
254parameters by scanning the destination surface and applying optionally anti-aliasing
255by bilinear interpolation.
256Assumes src and dst surfaces are of 32 bit depth.
257Assumes dst surface was allocated with the correct dimensions.
258
259\param src Source surface.
260\param dst Destination surface.
261\param isin Integer version of sine of angle.
262\param icos Integer version of cosine of angle.
263\param flipx Flag indicating horizontal mirroring should be applied.
264\param flipy Flag indicating vertical mirroring should be applied.
265\param smooth Flag indicating anti-aliasing should be used.
266\param rect_dest destination coordinates
267\param center true center.
268*/
269static void transformSurfaceRGBA(SDL_Surface *src, SDL_Surface *dst, int isin, int icos,
270 int flipx, int flipy, int smooth,
271 const SDL_Rect *rect_dest,
272 const SDL_FPoint *center)
273{
274 int sw, sh;
275 int cx, cy;
276 tColorRGBA c00, c01, c10, c11, cswap;
277 tColorRGBA *pc, *sp;
278 int gap;
279 const int fp_half = (1 << 15);
280
281 /*
282 * Variable setup
283 */
284 sw = src->w - 1;
285 sh = src->h - 1;
286 pc = (tColorRGBA *)dst->pixels;
287 gap = dst->pitch - dst->w * 4;
288 cx = (int)(center->x * 65536.0);
289 cy = (int)(center->y * 65536.0);
290
291 /*
292 * Switch between interpolating and non-interpolating code
293 */
294 if (smooth) {
295 int y;
296 for (y = 0; y < dst->h; y++) {
297 int x;
298 double src_x = ((double)rect_dest->x + 0 + 0.5 - center->x);
299 double src_y = ((double)rect_dest->y + y + 0.5 - center->y);
300 int sdx = (int)((icos * src_x - isin * src_y) + cx - fp_half);
301 int sdy = (int)((isin * src_x + icos * src_y) + cy - fp_half);
302 for (x = 0; x < dst->w; x++) {
303 int dx = (sdx >> 16);
304 int dy = (sdy >> 16);
305 if (flipx) {
306 dx = sw - dx;
307 }
308 if (flipy) {
309 dy = sh - dy;
310 }
311 if ((dx > -1) && (dy > -1) && (dx < (src->w - 1)) && (dy < (src->h - 1))) {
312 int ex, ey;
313 int t1, t2;
314 sp = (tColorRGBA *)((Uint8 *)src->pixels + src->pitch * dy) + dx;
315 c00 = *sp;
316 sp += 1;
317 c01 = *sp;
318 sp += (src->pitch / 4);
319 c11 = *sp;
320 sp -= 1;
321 c10 = *sp;
322 if (flipx) {
323 cswap = c00;
324 c00 = c01;
325 c01 = cswap;
326 cswap = c10;
327 c10 = c11;
328 c11 = cswap;
329 }
330 if (flipy) {
331 cswap = c00;
332 c00 = c10;
333 c10 = cswap;
334 cswap = c01;
335 c01 = c11;
336 c11 = cswap;
337 }
338 /*
339 * Interpolate colors
340 */
341 ex = (sdx & 0xffff);
342 ey = (sdy & 0xffff);
343 t1 = ((((c01.r - c00.r) * ex) >> 16) + c00.r) & 0xff;
344 t2 = ((((c11.r - c10.r) * ex) >> 16) + c10.r) & 0xff;
345 pc->r = (Uint8)((((t2 - t1) * ey) >> 16) + t1);
346 t1 = ((((c01.g - c00.g) * ex) >> 16) + c00.g) & 0xff;
347 t2 = ((((c11.g - c10.g) * ex) >> 16) + c10.g) & 0xff;
348 pc->g = (Uint8)((((t2 - t1) * ey) >> 16) + t1);
349 t1 = ((((c01.b - c00.b) * ex) >> 16) + c00.b) & 0xff;
350 t2 = ((((c11.b - c10.b) * ex) >> 16) + c10.b) & 0xff;
351 pc->b = (Uint8)((((t2 - t1) * ey) >> 16) + t1);
352 t1 = ((((c01.a - c00.a) * ex) >> 16) + c00.a) & 0xff;
353 t2 = ((((c11.a - c10.a) * ex) >> 16) + c10.a) & 0xff;
354 pc->a = (Uint8)((((t2 - t1) * ey) >> 16) + t1);
355 }
356 sdx += icos;
357 sdy += isin;
358 pc++;
359 }
360 pc = (tColorRGBA *)((Uint8 *)pc + gap);
361 }
362 } else {
363 int y;
364 for (y = 0; y < dst->h; y++) {
365 int x;
366 double src_x = ((double)rect_dest->x + 0 + 0.5 - center->x);
367 double src_y = ((double)rect_dest->y + y + 0.5 - center->y);
368 int sdx = (int)((icos * src_x - isin * src_y) + cx - fp_half);
369 int sdy = (int)((isin * src_x + icos * src_y) + cy - fp_half);
370 for (x = 0; x < dst->w; x++) {
371 int dx = (sdx >> 16);
372 int dy = (sdy >> 16);
373 if ((unsigned)dx < (unsigned)src->w && (unsigned)dy < (unsigned)src->h) {
374 if (flipx) {
375 dx = sw - dx;
376 }
377 if (flipy) {
378 dy = sh - dy;
379 }
380 *pc = *((tColorRGBA *)((Uint8 *)src->pixels + src->pitch * dy) + dx);
381 }
382 sdx += icos;
383 sdy += isin;
384 pc++;
385 }
386 pc = (tColorRGBA *)((Uint8 *)pc + gap);
387 }
388 }
389}
390
391/**
392
393Rotates and zooms 8 bit palette/Y 'src' surface to 'dst' surface without smoothing.
394
395Rotates and zooms 8 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control
396parameters by scanning the destination surface.
397Assumes src and dst surfaces are of 8 bit depth.
398Assumes dst surface was allocated with the correct dimensions.
399
400\param src Source surface.
401\param dst Destination surface.
402\param isin Integer version of sine of angle.
403\param icos Integer version of cosine of angle.
404\param flipx Flag indicating horizontal mirroring should be applied.
405\param flipy Flag indicating vertical mirroring should be applied.
406\param rect_dest destination coordinates
407\param center true center.
408*/
409static void transformSurfaceY(SDL_Surface *src, SDL_Surface *dst, int isin, int icos, int flipx, int flipy,
410 const SDL_Rect *rect_dest,
411 const SDL_FPoint *center)
412{
413 int sw, sh;
414 int cx, cy;
415 tColorY *pc;
416 int gap;
417 const int fp_half = (1 << 15);
418 int y;
419
420 /*
421 * Variable setup
422 */
423 sw = src->w - 1;
424 sh = src->h - 1;
425 pc = (tColorY *)dst->pixels;
426 gap = dst->pitch - dst->w;
427 cx = (int)(center->x * 65536.0);
428 cy = (int)(center->y * 65536.0);
429
430 /*
431 * Clear surface to colorkey
432 */
433 SDL_memset(pc, (int)(get_colorkey(src) & 0xff), (size_t)dst->pitch * dst->h);
434 /*
435 * Iterate through destination surface
436 */
437 for (y = 0; y < dst->h; y++) {
438 int x;
439 double src_x = ((double)rect_dest->x + 0 + 0.5 - center->x);
440 double src_y = ((double)rect_dest->y + y + 0.5 - center->y);
441 int sdx = (int)((icos * src_x - isin * src_y) + cx - fp_half);
442 int sdy = (int)((isin * src_x + icos * src_y) + cy - fp_half);
443 for (x = 0; x < dst->w; x++) {
444 int dx = (sdx >> 16);
445 int dy = (sdy >> 16);
446 if ((unsigned)dx < (unsigned)src->w && (unsigned)dy < (unsigned)src->h) {
447 if (flipx) {
448 dx = sw - dx;
449 }
450 if (flipy) {
451 dy = sh - dy;
452 }
453 *pc = *((tColorY *)src->pixels + src->pitch * dy + dx);
454 }
455 sdx += icos;
456 sdy += isin;
457 pc++;
458 }
459 pc += gap;
460 }
461}
462
463/**
464Rotates and zooms a surface with different horizontal and vertival scaling factors and optional anti-aliasing.
465
466Rotates a 32-bit or 8-bit 'src' surface to newly created 'dst' surface.
467'angle' is the rotation in degrees, 'center' the rotation center. If 'smooth' is set
468then the destination 32-bit surface is anti-aliased. 8-bit surfaces must have a colorkey. 32-bit
469surfaces must have a 8888 layout with red, green, blue and alpha masks (any ordering goes).
470The blend mode of the 'src' surface has some effects on generation of the 'dst' surface: The NONE
471mode will set the BLEND mode on the 'dst' surface. The MOD mode either generates a white 'dst'
472surface and sets the colorkey or fills the it with the colorkey before copying the pixels.
473When using the NONE and MOD modes, color and alpha modulation must be applied before using this function.
474
475\param src The surface to rotozoom.
476\param angle The angle to rotate in degrees.
477\param smooth Antialiasing flag; set to SMOOTHING_ON to enable.
478\param flipx Set to 1 to flip the image horizontally
479\param flipy Set to 1 to flip the image vertically
480\param rect_dest The destination rect bounding box
481\param cangle The angle cosine
482\param sangle The angle sine
483\param center The true coordinate of the center of rotation
484\return The new rotated surface.
485
486*/
487
488SDL_Surface *SDLgfx_rotateSurface(SDL_Surface *src, double angle, int smooth, int flipx, int flipy,
489 const SDL_Rect *rect_dest, double cangle, double sangle, const SDL_FPoint *center)
490{
491 SDL_Surface *rz_dst;
492 int is8bit, angle90;
493 SDL_BlendMode blendmode;
494 Uint32 colorkey = 0;
495 bool colorKeyAvailable = false;
496 double sangleinv, cangleinv;
497
498 // Sanity check
499 if (!SDL_SurfaceValid(src)) {
500 return NULL;
501 }
502
503 if (SDL_SurfaceHasColorKey(src)) {
504 if (SDL_GetSurfaceColorKey(src, &colorkey)) {
505 colorKeyAvailable = true;
506 }
507 }
508 // This function requires a 32-bit surface or 8-bit surface with a colorkey
509 is8bit = src->fmt->bits_per_pixel == 8 && colorKeyAvailable;
510 if (!(is8bit || (src->fmt->bits_per_pixel == 32 && SDL_ISPIXELFORMAT_ALPHA(src->format)))) {
511 return NULL;
512 }
513
514 // Calculate target factors from sine/cosine and zoom
515 sangleinv = sangle * 65536.0;
516 cangleinv = cangle * 65536.0;
517
518 // Alloc space to completely contain the rotated surface
519 rz_dst = NULL;
520 if (is8bit) {
521 // Target surface is 8 bit
522 rz_dst = SDL_CreateSurface(rect_dest->w, rect_dest->h + GUARD_ROWS, src->format);
523 if (rz_dst) {
524 SDL_SetSurfacePalette(rz_dst, src->palette);
525 }
526 } else {
527 // Target surface is 32 bit with source RGBA ordering
528 rz_dst = SDL_CreateSurface(rect_dest->w, rect_dest->h + GUARD_ROWS, src->format);
529 }
530
531 // Check target
532 if (!rz_dst) {
533 return NULL;
534 }
535
536 // Adjust for guard rows
537 rz_dst->h = rect_dest->h;
538
539 SDL_GetSurfaceBlendMode(src, &blendmode);
540
541 if (colorKeyAvailable) {
542 // If available, the colorkey will be used to discard the pixels that are outside of the rotated area.
543 SDL_SetSurfaceColorKey(rz_dst, true, colorkey);
544 SDL_FillSurfaceRect(rz_dst, NULL, colorkey);
545 } else if (blendmode == SDL_BLENDMODE_NONE) {
546 blendmode = SDL_BLENDMODE_BLEND;
547 } else if (blendmode == SDL_BLENDMODE_MOD || blendmode == SDL_BLENDMODE_MUL) {
548 /* Without a colorkey, the target texture has to be white for the MOD and MUL blend mode so
549 * that the pixels outside the rotated area don't affect the destination surface.
550 */
551 colorkey = SDL_MapSurfaceRGBA(rz_dst, 255, 255, 255, 0);
552 SDL_FillSurfaceRect(rz_dst, NULL, colorkey);
553 /* Setting a white colorkey for the destination surface makes the final blit discard
554 * all pixels outside of the rotated area. This doesn't interfere with anything because
555 * white pixels are already a no-op and the MOD blend mode does not interact with alpha.
556 */
557 SDL_SetSurfaceColorKey(rz_dst, true, colorkey);
558 }
559
560 SDL_SetSurfaceBlendMode(rz_dst, blendmode);
561
562 // Lock source surface
563 if (SDL_MUSTLOCK(src)) {
564 if (!SDL_LockSurface(src)) {
565 SDL_DestroySurface(rz_dst);
566 return NULL;
567 }
568 }
569
570 /* check if the rotation is a multiple of 90 degrees so we can take a fast path and also somewhat reduce
571 * the off-by-one problem in transformSurfaceRGBA that expresses itself when the rotation is near
572 * multiples of 90 degrees.
573 */
574 angle90 = (int)(angle / 90);
575 if (angle90 == angle / 90) {
576 angle90 %= 4;
577 if (angle90 < 0) {
578 angle90 += 4; // 0:0 deg, 1:90 deg, 2:180 deg, 3:270 deg
579 }
580
581 } else {
582 angle90 = -1;
583 }
584
585 if (is8bit) {
586 // Call the 8-bit transformation routine to do the rotation
587 if (angle90 >= 0) {
588 transformSurfaceY90(src, rz_dst, angle90, flipx, flipy);
589 } else {
590 transformSurfaceY(src, rz_dst, (int)sangleinv, (int)cangleinv,
591 flipx, flipy, rect_dest, center);
592 }
593 } else {
594 // Call the 32-bit transformation routine to do the rotation
595 if (angle90 >= 0) {
596 transformSurfaceRGBA90(src, rz_dst, angle90, flipx, flipy);
597 } else {
598 transformSurfaceRGBA(src, rz_dst, (int)sangleinv, (int)cangleinv,
599 flipx, flipy, smooth, rect_dest, center);
600 }
601 }
602
603 // Unlock source surface
604 if (SDL_MUSTLOCK(src)) {
605 SDL_UnlockSurface(src);
606 }
607
608 // Return rotated surface
609 return rz_dst;
610}
611
612#endif // SDL_VIDEO_RENDER_SW
diff --git a/SDL-3.2.8/src/render/software/SDL_rotate.h b/SDL-3.2.8/src/render/software/SDL_rotate.h
new file mode 100644
index 0000000..ecf84f7
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_rotate.h
@@ -0,0 +1,30 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_rotate_h_
23#define SDL_rotate_h_
24
25extern SDL_Surface *SDLgfx_rotateSurface(SDL_Surface *src, double angle, int smooth, int flipx, int flipy,
26 const SDL_Rect *rect_dest, double cangle, double sangle, const SDL_FPoint *center);
27extern void SDLgfx_rotozoomSurfaceSizeTrig(int width, int height, double angle, const SDL_FPoint *center,
28 SDL_Rect *rect_dest, double *cangle, double *sangle);
29
30#endif // SDL_rotate_h_
diff --git a/SDL-3.2.8/src/render/software/SDL_triangle.c b/SDL-3.2.8/src/render/software/SDL_triangle.c
new file mode 100644
index 0000000..c4e16d1
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_triangle.c
@@ -0,0 +1,945 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_SW
24
25#include <limits.h>
26
27#include "SDL_triangle.h"
28
29#include "../../video/SDL_surface_c.h"
30
31/* fixed points bits precision
32 * Set to 1, so that it can start rendering with middle of a pixel precision.
33 * It doesn't need to be increased.
34 * But, if increased too much, it overflows (srcx, srcy) coordinates used for filling with texture.
35 * (which could be turned to int64).
36 */
37#define FP_BITS 1
38
39#define COLOR_EQ(c1, c2) ((c1).r == (c2).r && (c1).g == (c2).g && (c1).b == (c2).b && (c1).a == (c2).a)
40
41static void SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
42 SDL_Point s2_x_area, SDL_Rect dstrect, int area, int bias_w0, int bias_w1, int bias_w2,
43 int d2d1_y, int d1d2_x, int d0d2_y, int d2d0_x, int d1d0_y, int d0d1_x,
44 int s2s0_x, int s2s1_x, int s2s0_y, int s2s1_y, int w0_row, int w1_row, int w2_row,
45 SDL_Color c0, SDL_Color c1, SDL_Color c2, bool is_uniform, SDL_TextureAddressMode texture_address_mode);
46
47#if 0
48bool SDL_BlitTriangle(SDL_Surface *src, const SDL_Point srcpoints[3], SDL_Surface *dst, const SDL_Point dstpoints[3])
49{
50 int i;
51 SDL_Point points[6];
52
53 if (src == NULL || dst == NULL) {
54 return false;
55 }
56
57 for (i = 0; i < 3; i++) {
58 if (srcpoints[i].x < 0 || srcpoints[i].y < 0 || srcpoints[i].x >= src->w || srcpoints[i].y >= src->h) {
59 return SDL_SetError("Values of 'srcpoints' out of bounds");
60 }
61 }
62
63 points[0] = srcpoints[0];
64 points[1] = dstpoints[0];
65 points[2] = srcpoints[1];
66 points[3] = dstpoints[1];
67 points[4] = srcpoints[2];
68 points[5] = dstpoints[2];
69 for (i = 0; i < 3; i++) {
70 trianglepoint_2_fixedpoint(&points[2 * i + 1]);
71 }
72 return SDL_SW_BlitTriangle(src, dst, points);
73}
74
75bool SDL_FillTriangle(SDL_Surface *dst, const SDL_Point points[3], Uint32 color)
76{
77 int i;
78 SDL_Point points_tmp[3];
79 if (dst == NULL) {
80 return false;
81 }
82 for (i = 0; i < 3; i++) {
83 points_tmp[i] = points[i];
84 trianglepoint_2_fixedpoint(&points_tmp[i]);
85 }
86 return SDL_SW_FillTriangle(dst, points_tmp, SDL_BLENDMODE_NONE, color);
87}
88#endif
89
90// cross product AB x AC
91static Sint64 cross_product(const SDL_Point *a, const SDL_Point *b, int c_x, int c_y)
92{
93 return ((Sint64)(b->x - a->x)) * ((Sint64)(c_y - a->y)) - ((Sint64)(b->y - a->y)) * ((Sint64)(c_x - a->x));
94}
95
96// check for top left rules
97static bool is_top_left(const SDL_Point *a, const SDL_Point *b, int is_clockwise)
98{
99 if (is_clockwise) {
100 if (a->y == b->y && a->x < b->x) {
101 return true;
102 }
103 if (b->y < a->y) {
104 return true;
105 }
106 } else {
107 if (a->y == b->y && b->x < a->x) {
108 return true;
109 }
110 if (a->y < b->y) {
111 return true;
112 }
113 }
114 return false;
115}
116
117// x = (y << FP_BITS)
118// prevent runtime error: left shift of negative value
119#define PRECOMP(x, y) \
120 val = y; \
121 if (val >= 0) { \
122 x = val << FP_BITS; \
123 } else { \
124 val *= -1; \
125 x = val << FP_BITS; \
126 x *= -1; \
127 }
128
129void trianglepoint_2_fixedpoint(SDL_Point *a)
130{
131 int val;
132 PRECOMP(a->x, a->x);
133 PRECOMP(a->y, a->y);
134}
135
136// bounding rect of three points (in fixed point)
137static void bounding_rect_fixedpoint(const SDL_Point *a, const SDL_Point *b, const SDL_Point *c, SDL_Rect *r)
138{
139 int min_x = SDL_min(a->x, SDL_min(b->x, c->x));
140 int max_x = SDL_max(a->x, SDL_max(b->x, c->x));
141 int min_y = SDL_min(a->y, SDL_min(b->y, c->y));
142 int max_y = SDL_max(a->y, SDL_max(b->y, c->y));
143 // points are in fixed point, shift back
144 r->x = min_x >> FP_BITS;
145 r->y = min_y >> FP_BITS;
146 r->w = (max_x - min_x) >> FP_BITS;
147 r->h = (max_y - min_y) >> FP_BITS;
148}
149
150// bounding rect of three points
151static void bounding_rect(const SDL_Point *a, const SDL_Point *b, const SDL_Point *c, SDL_Rect *r)
152{
153 int min_x = SDL_min(a->x, SDL_min(b->x, c->x));
154 int max_x = SDL_max(a->x, SDL_max(b->x, c->x));
155 int min_y = SDL_min(a->y, SDL_min(b->y, c->y));
156 int max_y = SDL_max(a->y, SDL_max(b->y, c->y));
157 r->x = min_x;
158 r->y = min_y;
159 r->w = (max_x - min_x);
160 r->h = (max_y - min_y);
161}
162
163/* Triangle rendering, using Barycentric coordinates (w0, w1, w2)
164 *
165 * The cross product isn't computed from scratch at each iteration,
166 * but optimized using constant step increments
167 *
168 */
169
170#define TRIANGLE_BEGIN_LOOP \
171 { \
172 int x, y; \
173 for (y = 0; y < dstrect.h; y++) { \
174 /* y start */ \
175 Sint64 w0 = w0_row; \
176 Sint64 w1 = w1_row; \
177 Sint64 w2 = w2_row; \
178 for (x = 0; x < dstrect.w; x++) { \
179 /* In triangle */ \
180 if (w0 + bias_w0 >= 0 && w1 + bias_w1 >= 0 && w2 + bias_w2 >= 0) { \
181 Uint8 *dptr = (Uint8 *)dst_ptr + x * dstbpp;
182
183// Use 64 bits precision to prevent overflow when interpolating color / texture with wide triangles
184#define TRIANGLE_GET_TEXTCOORD \
185 int srcx = (int)(((Sint64)w0 * s2s0_x + (Sint64)w1 * s2s1_x + s2_x_area.x) / area); \
186 int srcy = (int)(((Sint64)w0 * s2s0_y + (Sint64)w1 * s2s1_y + s2_x_area.y) / area); \
187 if (texture_address_mode == SDL_TEXTURE_ADDRESS_WRAP) { \
188 srcx %= src_surface->w; \
189 if (srcx < 0) { \
190 srcx += (src_surface->w - 1); \
191 } \
192 srcy %= src_surface->h; \
193 if (srcy < 0) { \
194 srcy += (src_surface->h - 1); \
195 } \
196 }
197
198#define TRIANGLE_GET_MAPPED_COLOR \
199 Uint8 r = (Uint8)(((Sint64)w0 * c0.r + (Sint64)w1 * c1.r + (Sint64)w2 * c2.r) / area); \
200 Uint8 g = (Uint8)(((Sint64)w0 * c0.g + (Sint64)w1 * c1.g + (Sint64)w2 * c2.g) / area); \
201 Uint8 b = (Uint8)(((Sint64)w0 * c0.b + (Sint64)w1 * c1.b + (Sint64)w2 * c2.b) / area); \
202 Uint8 a = (Uint8)(((Sint64)w0 * c0.a + (Sint64)w1 * c1.a + (Sint64)w2 * c2.a) / area); \
203 Uint32 color = SDL_MapRGBA(format, palette, r, g, b, a);
204
205#define TRIANGLE_GET_COLOR \
206 int r = (int)(((Sint64)w0 * c0.r + (Sint64)w1 * c1.r + (Sint64)w2 * c2.r) / area); \
207 int g = (int)(((Sint64)w0 * c0.g + (Sint64)w1 * c1.g + (Sint64)w2 * c2.g) / area); \
208 int b = (int)(((Sint64)w0 * c0.b + (Sint64)w1 * c1.b + (Sint64)w2 * c2.b) / area); \
209 int a = (int)(((Sint64)w0 * c0.a + (Sint64)w1 * c1.a + (Sint64)w2 * c2.a) / area);
210
211#define TRIANGLE_END_LOOP \
212 } \
213 /* x += 1 */ \
214 w0 += d2d1_y; \
215 w1 += d0d2_y; \
216 w2 += d1d0_y; \
217 } \
218 /* y += 1 */ \
219 w0_row += d1d2_x; \
220 w1_row += d2d0_x; \
221 w2_row += d0d1_x; \
222 dst_ptr += dst_pitch; \
223 } \
224 }
225
226bool SDL_SW_FillTriangle(SDL_Surface *dst, SDL_Point *d0, SDL_Point *d1, SDL_Point *d2, SDL_BlendMode blend, SDL_Color c0, SDL_Color c1, SDL_Color c2)
227{
228 bool result = true;
229 int dst_locked = 0;
230
231 SDL_Rect dstrect;
232
233 int dstbpp;
234 Uint8 *dst_ptr;
235 int dst_pitch;
236
237 Sint64 area;
238 int is_clockwise;
239
240 int d2d1_y, d1d2_x, d0d2_y, d2d0_x, d1d0_y, d0d1_x;
241 Sint64 w0_row, w1_row, w2_row;
242 int bias_w0, bias_w1, bias_w2;
243
244 bool is_uniform;
245
246 SDL_Surface *tmp = NULL;
247
248 if (!SDL_SurfaceValid(dst)) {
249 return false;
250 }
251
252 area = cross_product(d0, d1, d2->x, d2->y);
253
254 is_uniform = COLOR_EQ(c0, c1) && COLOR_EQ(c1, c2);
255
256 // Flat triangle
257 if (area == 0) {
258 return true;
259 }
260
261 // Lock the destination, if needed
262 if (SDL_MUSTLOCK(dst)) {
263 if (!SDL_LockSurface(dst)) {
264 result = false;
265 goto end;
266 } else {
267 dst_locked = 1;
268 }
269 }
270
271 bounding_rect_fixedpoint(d0, d1, d2, &dstrect);
272
273 {
274 // Clip triangle rect with surface rect
275 SDL_Rect rect;
276 rect.x = 0;
277 rect.y = 0;
278 rect.w = dst->w;
279 rect.h = dst->h;
280 SDL_GetRectIntersection(&dstrect, &rect, &dstrect);
281 }
282
283 {
284 // Clip triangle with surface clip rect
285 SDL_Rect rect;
286 SDL_GetSurfaceClipRect(dst, &rect);
287 SDL_GetRectIntersection(&dstrect, &rect, &dstrect);
288 }
289
290 if (blend != SDL_BLENDMODE_NONE) {
291 SDL_PixelFormat format = dst->format;
292
293 // need an alpha format
294 if (!SDL_ISPIXELFORMAT_ALPHA(format)) {
295 format = SDL_PIXELFORMAT_ARGB8888;
296 }
297
298 // Use an intermediate surface
299 tmp = SDL_CreateSurface(dstrect.w, dstrect.h, format);
300 if (!tmp) {
301 result = false;
302 goto end;
303 }
304
305 if (blend == SDL_BLENDMODE_MOD) {
306 Uint32 c = SDL_MapSurfaceRGBA(tmp, 255, 255, 255, 255);
307 SDL_FillSurfaceRect(tmp, NULL, c);
308 }
309
310 SDL_SetSurfaceBlendMode(tmp, blend);
311
312 dstbpp = tmp->fmt->bytes_per_pixel;
313 dst_ptr = (Uint8 *)tmp->pixels;
314 dst_pitch = tmp->pitch;
315
316 } else {
317 // Write directly to destination surface
318 dstbpp = dst->fmt->bytes_per_pixel;
319 dst_ptr = (Uint8 *)dst->pixels + dstrect.x * dstbpp + dstrect.y * dst->pitch;
320 dst_pitch = dst->pitch;
321 }
322
323 is_clockwise = area > 0;
324 if (area < 0) {
325 area = -area;
326 }
327
328 {
329 int val;
330 PRECOMP(d2d1_y, d1->y - d2->y)
331 PRECOMP(d0d2_y, d2->y - d0->y)
332 PRECOMP(d1d0_y, d0->y - d1->y)
333 PRECOMP(d1d2_x, d2->x - d1->x)
334 PRECOMP(d2d0_x, d0->x - d2->x)
335 PRECOMP(d0d1_x, d1->x - d0->x)
336 }
337
338 // Starting point for rendering, at the middle of a pixel
339 {
340 SDL_Point p;
341 p.x = dstrect.x;
342 p.y = dstrect.y;
343 trianglepoint_2_fixedpoint(&p);
344 p.x += (1 << FP_BITS) / 2;
345 p.y += (1 << FP_BITS) / 2;
346 w0_row = cross_product(d1, d2, p.x, p.y);
347 w1_row = cross_product(d2, d0, p.x, p.y);
348 w2_row = cross_product(d0, d1, p.x, p.y);
349 }
350
351 // Handle anti-clockwise triangles
352 if (!is_clockwise) {
353 d2d1_y *= -1;
354 d0d2_y *= -1;
355 d1d0_y *= -1;
356 d1d2_x *= -1;
357 d2d0_x *= -1;
358 d0d1_x *= -1;
359 w0_row *= -1;
360 w1_row *= -1;
361 w2_row *= -1;
362 }
363
364 // Add a bias to respect top-left rasterization rule
365 bias_w0 = (is_top_left(d1, d2, is_clockwise) ? 0 : -1);
366 bias_w1 = (is_top_left(d2, d0, is_clockwise) ? 0 : -1);
367 bias_w2 = (is_top_left(d0, d1, is_clockwise) ? 0 : -1);
368
369 if (is_uniform) {
370 Uint32 color;
371 if (tmp) {
372 color = SDL_MapSurfaceRGBA(tmp, c0.r, c0.g, c0.b, c0.a);
373 } else {
374 color = SDL_MapSurfaceRGBA(dst, c0.r, c0.g, c0.b, c0.a);
375 }
376
377 if (dstbpp == 4) {
378 TRIANGLE_BEGIN_LOOP
379 {
380 *(Uint32 *)dptr = color;
381 }
382 TRIANGLE_END_LOOP
383 } else if (dstbpp == 3) {
384 TRIANGLE_BEGIN_LOOP
385 {
386 Uint8 *s = (Uint8 *)&color;
387 dptr[0] = s[0];
388 dptr[1] = s[1];
389 dptr[2] = s[2];
390 }
391 TRIANGLE_END_LOOP
392 } else if (dstbpp == 2) {
393 TRIANGLE_BEGIN_LOOP
394 {
395 *(Uint16 *)dptr = (Uint16)color;
396 }
397 TRIANGLE_END_LOOP
398 } else if (dstbpp == 1) {
399 TRIANGLE_BEGIN_LOOP
400 {
401 *dptr = (Uint8)color;
402 }
403 TRIANGLE_END_LOOP
404 }
405 } else {
406 const SDL_PixelFormatDetails *format;
407 SDL_Palette *palette;
408 if (tmp) {
409 format = tmp->fmt;
410 palette = tmp->palette;
411 } else {
412 format = dst->fmt;
413 palette = dst->palette;
414 }
415 if (dstbpp == 4) {
416 TRIANGLE_BEGIN_LOOP
417 {
418 TRIANGLE_GET_MAPPED_COLOR
419 *(Uint32 *)dptr = color;
420 }
421 TRIANGLE_END_LOOP
422 } else if (dstbpp == 3) {
423 TRIANGLE_BEGIN_LOOP
424 {
425 TRIANGLE_GET_MAPPED_COLOR
426 Uint8 *s = (Uint8 *)&color;
427 dptr[0] = s[0];
428 dptr[1] = s[1];
429 dptr[2] = s[2];
430 }
431 TRIANGLE_END_LOOP
432 } else if (dstbpp == 2) {
433 TRIANGLE_BEGIN_LOOP
434 {
435 TRIANGLE_GET_MAPPED_COLOR
436 *(Uint16 *)dptr = (Uint16)color;
437 }
438 TRIANGLE_END_LOOP
439 } else if (dstbpp == 1) {
440 TRIANGLE_BEGIN_LOOP
441 {
442 TRIANGLE_GET_MAPPED_COLOR
443 *dptr = (Uint8)color;
444 }
445 TRIANGLE_END_LOOP
446 }
447 }
448
449 if (tmp) {
450 SDL_BlitSurface(tmp, NULL, dst, &dstrect);
451 SDL_DestroySurface(tmp);
452 }
453
454end:
455 if (dst_locked) {
456 SDL_UnlockSurface(dst);
457 }
458
459 return result;
460}
461
462bool SDL_SW_BlitTriangle(
463 SDL_Surface *src,
464 SDL_Point *s0, SDL_Point *s1, SDL_Point *s2,
465 SDL_Surface *dst,
466 SDL_Point *d0, SDL_Point *d1, SDL_Point *d2,
467 SDL_Color c0, SDL_Color c1, SDL_Color c2,
468 SDL_TextureAddressMode texture_address_mode)
469{
470 bool result = true;
471 SDL_Surface *src_surface = src;
472 int src_locked = 0;
473 int dst_locked = 0;
474
475 SDL_BlendMode blend;
476
477 SDL_Rect dstrect;
478
479 SDL_Point s2_x_area;
480
481 int dstbpp;
482 Uint8 *dst_ptr;
483 int dst_pitch;
484
485 const int *src_ptr;
486 int src_pitch;
487
488 Sint64 area, tmp64;
489 int is_clockwise;
490
491 int d2d1_y, d1d2_x, d0d2_y, d2d0_x, d1d0_y, d0d1_x;
492 int s2s0_x, s2s1_x, s2s0_y, s2s1_y;
493
494 Sint64 w0_row, w1_row, w2_row;
495 int bias_w0, bias_w1, bias_w2;
496
497 bool is_uniform;
498
499 bool has_modulation;
500
501 if (!SDL_SurfaceValid(src)) {
502 return SDL_InvalidParamError("src");
503 }
504 if (!SDL_SurfaceValid(dst)) {
505 return SDL_InvalidParamError("dst");
506 }
507
508 area = cross_product(d0, d1, d2->x, d2->y);
509
510 // Flat triangle
511 if (area == 0) {
512 return true;
513 }
514
515 // Lock the destination, if needed
516 if (SDL_MUSTLOCK(dst)) {
517 if (!SDL_LockSurface(dst)) {
518 result = false;
519 goto end;
520 } else {
521 dst_locked = 1;
522 }
523 }
524
525 // Lock the source, if needed
526 if (SDL_MUSTLOCK(src)) {
527 if (!SDL_LockSurface(src)) {
528 result = false;
529 goto end;
530 } else {
531 src_locked = 1;
532 }
533 }
534
535 is_uniform = COLOR_EQ(c0, c1) && COLOR_EQ(c1, c2);
536
537 bounding_rect_fixedpoint(d0, d1, d2, &dstrect);
538
539 SDL_GetSurfaceBlendMode(src, &blend);
540
541 // TRIANGLE_GET_TEXTCOORD interpolates up to the max values included, so reduce by 1
542 if (texture_address_mode == SDL_TEXTURE_ADDRESS_CLAMP) {
543 SDL_Rect srcrect;
544 int maxx, maxy;
545 bounding_rect(s0, s1, s2, &srcrect);
546 maxx = srcrect.x + srcrect.w;
547 maxy = srcrect.y + srcrect.h;
548 if (srcrect.w > 0) {
549 if (s0->x == maxx) {
550 s0->x--;
551 }
552 if (s1->x == maxx) {
553 s1->x--;
554 }
555 if (s2->x == maxx) {
556 s2->x--;
557 }
558 }
559 if (srcrect.h > 0) {
560 if (s0->y == maxy) {
561 s0->y--;
562 }
563 if (s1->y == maxy) {
564 s1->y--;
565 }
566 if (s2->y == maxy) {
567 s2->y--;
568 }
569 }
570 }
571
572 if (is_uniform) {
573 // SDL_GetSurfaceColorMod(src, &r, &g, &b);
574 has_modulation = c0.r != 255 || c0.g != 255 || c0.b != 255 || c0.a != 255;
575 } else {
576 has_modulation = true;
577 }
578
579 {
580 // Clip triangle with surface clip rect
581 SDL_Rect rect;
582 SDL_GetSurfaceClipRect(dst, &rect);
583 SDL_GetRectIntersection(&dstrect, &rect, &dstrect);
584 }
585
586 // Set destination pointer
587 dstbpp = dst->fmt->bytes_per_pixel;
588 dst_ptr = (Uint8 *)dst->pixels + dstrect.x * dstbpp + dstrect.y * dst->pitch;
589 dst_pitch = dst->pitch;
590
591 // Set source pointer
592 src_ptr = (const int *)src->pixels;
593 src_pitch = src->pitch;
594
595 is_clockwise = area > 0;
596 if (area < 0) {
597 area = -area;
598 }
599
600 {
601 int val;
602 PRECOMP(d2d1_y, d1->y - d2->y)
603 PRECOMP(d0d2_y, d2->y - d0->y)
604 PRECOMP(d1d0_y, d0->y - d1->y)
605 PRECOMP(d1d2_x, d2->x - d1->x)
606 PRECOMP(d2d0_x, d0->x - d2->x)
607 PRECOMP(d0d1_x, d1->x - d0->x)
608 }
609
610 s2s0_x = s0->x - s2->x;
611 s2s1_x = s1->x - s2->x;
612 s2s0_y = s0->y - s2->y;
613 s2s1_y = s1->y - s2->y;
614
615 // Starting point for rendering, at the middle of a pixel
616 {
617 SDL_Point p;
618 p.x = dstrect.x;
619 p.y = dstrect.y;
620 trianglepoint_2_fixedpoint(&p);
621 p.x += (1 << FP_BITS) / 2;
622 p.y += (1 << FP_BITS) / 2;
623 w0_row = cross_product(d1, d2, p.x, p.y);
624 w1_row = cross_product(d2, d0, p.x, p.y);
625 w2_row = cross_product(d0, d1, p.x, p.y);
626 }
627
628 // Handle anti-clockwise triangles
629 if (!is_clockwise) {
630 d2d1_y *= -1;
631 d0d2_y *= -1;
632 d1d0_y *= -1;
633 d1d2_x *= -1;
634 d2d0_x *= -1;
635 d0d1_x *= -1;
636 w0_row *= -1;
637 w1_row *= -1;
638 w2_row *= -1;
639 }
640
641 // Add a bias to respect top-left rasterization rule
642 bias_w0 = (is_top_left(d1, d2, is_clockwise) ? 0 : -1);
643 bias_w1 = (is_top_left(d2, d0, is_clockwise) ? 0 : -1);
644 bias_w2 = (is_top_left(d0, d1, is_clockwise) ? 0 : -1);
645
646 /* precompute constant 's2->x * area' used in TRIANGLE_GET_TEXTCOORD */
647 tmp64 = s2->x * area;
648 if (tmp64 >= INT_MIN && tmp64 <= INT_MAX) {
649 s2_x_area.x = (int)tmp64;
650 } else {
651 result = SDL_SetError("triangle area overflow");
652 goto end;
653 }
654 tmp64 = s2->y * area;
655 if (tmp64 >= INT_MIN && tmp64 <= INT_MAX) {
656 s2_x_area.y = (int)tmp64;
657 } else {
658 result = SDL_SetError("triangle area overflow");
659 goto end;
660 }
661
662 if (blend != SDL_BLENDMODE_NONE || src->format != dst->format || has_modulation || !is_uniform) {
663 // Use SDL_BlitTriangle_Slow
664
665 SDL_BlitInfo *info = &src->map.info;
666 SDL_BlitInfo tmp_info;
667
668 SDL_zero(tmp_info);
669
670 tmp_info.src_fmt = src->fmt;
671 tmp_info.dst_fmt = dst->fmt;
672 tmp_info.flags = info->flags;
673 /*
674 tmp_info.r = info->r;
675 tmp_info.g = info->g;
676 tmp_info.b = info->b;
677 tmp_info.a = info->a;
678 */
679 tmp_info.r = c0.r;
680 tmp_info.g = c0.g;
681 tmp_info.b = c0.b;
682 tmp_info.a = c0.a;
683
684 tmp_info.flags &= ~(SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA);
685
686 if (c0.r != 255 || c1.r != 255 || c2.r != 255 ||
687 c0.g != 255 || c1.g != 255 || c2.g != 255 ||
688 c0.b != 255 || c1.b != 255 || c2.b != 255) {
689 tmp_info.flags |= SDL_COPY_MODULATE_COLOR;
690 }
691
692 if (c0.a != 255 || c1.a != 255 || c2.a != 255) {
693 tmp_info.flags |= SDL_COPY_MODULATE_ALPHA;
694 }
695
696 tmp_info.colorkey = info->colorkey;
697
698 // src
699 tmp_info.src_surface = src_surface;
700 tmp_info.src = (Uint8 *)src_ptr;
701 tmp_info.src_pitch = src_pitch;
702
703 // dst
704 tmp_info.dst = dst_ptr;
705 tmp_info.dst_pitch = dst_pitch;
706
707#define CHECK_INT_RANGE(X) \
708 if ((X) < INT_MIN || (X) > INT_MAX) { \
709 result = SDL_SetError("integer overflow (%s = %" SDL_PRIs64 ")", #X, X); \
710 goto end; \
711 }
712 CHECK_INT_RANGE(area);
713 CHECK_INT_RANGE(w0_row);
714 CHECK_INT_RANGE(w1_row);
715 CHECK_INT_RANGE(w2_row);
716 SDL_BlitTriangle_Slow(&tmp_info, s2_x_area, dstrect, (int)area, bias_w0, bias_w1, bias_w2,
717 d2d1_y, d1d2_x, d0d2_y, d2d0_x, d1d0_y, d0d1_x,
718 s2s0_x, s2s1_x, s2s0_y, s2s1_y, (int)w0_row, (int)w1_row, (int)w2_row,
719 c0, c1, c2, is_uniform, texture_address_mode);
720
721 goto end;
722 }
723
724 if (dstbpp == 4) {
725 TRIANGLE_BEGIN_LOOP
726 {
727 TRIANGLE_GET_TEXTCOORD
728 Uint32 *sptr = (Uint32 *)((Uint8 *)src_ptr + srcy * src_pitch);
729 *(Uint32 *)dptr = sptr[srcx];
730 }
731 TRIANGLE_END_LOOP
732 } else if (dstbpp == 3) {
733 TRIANGLE_BEGIN_LOOP
734 {
735 TRIANGLE_GET_TEXTCOORD
736 Uint8 *sptr = (Uint8 *)src_ptr + srcy * src_pitch;
737 dptr[0] = sptr[3 * srcx];
738 dptr[1] = sptr[3 * srcx + 1];
739 dptr[2] = sptr[3 * srcx + 2];
740 }
741 TRIANGLE_END_LOOP
742 } else if (dstbpp == 2) {
743 TRIANGLE_BEGIN_LOOP
744 {
745 TRIANGLE_GET_TEXTCOORD
746 Uint16 *sptr = (Uint16 *)((Uint8 *)src_ptr + srcy * src_pitch);
747 *(Uint16 *)dptr = sptr[srcx];
748 }
749 TRIANGLE_END_LOOP
750 } else if (dstbpp == 1) {
751 TRIANGLE_BEGIN_LOOP
752 {
753 TRIANGLE_GET_TEXTCOORD
754 Uint8 *sptr = (Uint8 *)src_ptr + srcy * src_pitch;
755 *dptr = sptr[srcx];
756 }
757 TRIANGLE_END_LOOP
758 }
759
760end:
761 if (dst_locked) {
762 SDL_UnlockSurface(dst);
763 }
764 if (src_locked) {
765 SDL_UnlockSurface(src);
766 }
767
768 return result;
769}
770
771#define FORMAT_ALPHA 0
772#define FORMAT_NO_ALPHA -1
773#define FORMAT_2101010 1
774#define FORMAT_HAS_ALPHA(format) format == 0
775#define FORMAT_HAS_NO_ALPHA(format) format < 0
776static int detect_format(const SDL_PixelFormatDetails *pf)
777{
778 if (pf->format == SDL_PIXELFORMAT_ARGB2101010) {
779 return FORMAT_2101010;
780 } else if (pf->Amask) {
781 return FORMAT_ALPHA;
782 } else {
783 return FORMAT_NO_ALPHA;
784 }
785}
786
787static void SDL_BlitTriangle_Slow(SDL_BlitInfo *info,
788 SDL_Point s2_x_area, SDL_Rect dstrect, int area, int bias_w0, int bias_w1, int bias_w2,
789 int d2d1_y, int d1d2_x, int d0d2_y, int d2d0_x, int d1d0_y, int d0d1_x,
790 int s2s0_x, int s2s1_x, int s2s0_y, int s2s1_y, int w0_row, int w1_row, int w2_row,
791 SDL_Color c0, SDL_Color c1, SDL_Color c2, bool is_uniform, SDL_TextureAddressMode texture_address_mode)
792{
793 SDL_Surface *src_surface = info->src_surface;
794 const int flags = info->flags;
795 Uint32 modulateR = info->r;
796 Uint32 modulateG = info->g;
797 Uint32 modulateB = info->b;
798 Uint32 modulateA = info->a;
799 Uint32 srcpixel;
800 Uint32 srcR, srcG, srcB, srcA;
801 Uint32 dstpixel;
802 Uint32 dstR, dstG, dstB, dstA;
803 const SDL_PixelFormatDetails *src_fmt = info->src_fmt;
804 const SDL_PixelFormatDetails *dst_fmt = info->dst_fmt;
805 int srcbpp = src_fmt->bytes_per_pixel;
806 int dstbpp = dst_fmt->bytes_per_pixel;
807 int srcfmt_val;
808 int dstfmt_val;
809 Uint32 rgbmask = ~src_fmt->Amask;
810 Uint32 ckey = info->colorkey & rgbmask;
811
812 Uint8 *dst_ptr = info->dst;
813 int dst_pitch = info->dst_pitch;
814
815 srcfmt_val = detect_format(src_fmt);
816 dstfmt_val = detect_format(dst_fmt);
817
818 TRIANGLE_BEGIN_LOOP
819 {
820 Uint8 *src;
821 Uint8 *dst = dptr;
822 TRIANGLE_GET_TEXTCOORD
823 src = (info->src + (srcy * info->src_pitch) + (srcx * srcbpp));
824 if (FORMAT_HAS_ALPHA(srcfmt_val)) {
825 DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG, srcB, srcA);
826 } else if (FORMAT_HAS_NO_ALPHA(srcfmt_val)) {
827 DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG, srcB);
828 srcA = 0xFF;
829 } else {
830 // SDL_PIXELFORMAT_ARGB2101010
831 srcpixel = *((Uint32 *)(src));
832 RGBA_FROM_ARGB2101010(srcpixel, srcR, srcG, srcB, srcA);
833 }
834 if (flags & SDL_COPY_COLORKEY) {
835 // srcpixel isn't set for 24 bpp
836 if (srcbpp == 3) {
837 srcpixel = (srcR << src_fmt->Rshift) |
838 (srcG << src_fmt->Gshift) | (srcB << src_fmt->Bshift);
839 }
840 if ((srcpixel & rgbmask) == ckey) {
841 continue;
842 }
843 }
844 if ((flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL))) {
845 if (FORMAT_HAS_ALPHA(dstfmt_val)) {
846 DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB, dstA);
847 } else if (FORMAT_HAS_NO_ALPHA(dstfmt_val)) {
848 DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG, dstB);
849 dstA = 0xFF;
850 } else {
851 // SDL_PIXELFORMAT_ARGB2101010
852 dstpixel = *((Uint32 *) (dst));
853 RGBA_FROM_ARGB2101010(dstpixel, dstR, dstG, dstB, dstA);
854 }
855 } else {
856 // don't care
857 dstR = dstG = dstB = dstA = 0;
858 }
859
860 if (!is_uniform) {
861 TRIANGLE_GET_COLOR
862 modulateR = r;
863 modulateG = g;
864 modulateB = b;
865 modulateA = a;
866 }
867
868 if (flags & SDL_COPY_MODULATE_COLOR) {
869 srcR = (srcR * modulateR) / 255;
870 srcG = (srcG * modulateG) / 255;
871 srcB = (srcB * modulateB) / 255;
872 }
873 if (flags & SDL_COPY_MODULATE_ALPHA) {
874 srcA = (srcA * modulateA) / 255;
875 }
876 if (flags & (SDL_COPY_BLEND | SDL_COPY_ADD)) {
877 // This goes away if we ever use premultiplied alpha
878 if (srcA < 255) {
879 srcR = (srcR * srcA) / 255;
880 srcG = (srcG * srcA) / 255;
881 srcB = (srcB * srcA) / 255;
882 }
883 }
884 switch (flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD | SDL_COPY_MUL)) {
885 case 0:
886 dstR = srcR;
887 dstG = srcG;
888 dstB = srcB;
889 dstA = srcA;
890 break;
891 case SDL_COPY_BLEND:
892 dstR = srcR + ((255 - srcA) * dstR) / 255;
893 dstG = srcG + ((255 - srcA) * dstG) / 255;
894 dstB = srcB + ((255 - srcA) * dstB) / 255;
895 dstA = srcA + ((255 - srcA) * dstA) / 255;
896 break;
897 case SDL_COPY_ADD:
898 dstR = srcR + dstR;
899 if (dstR > 255) {
900 dstR = 255;
901 }
902 dstG = srcG + dstG;
903 if (dstG > 255) {
904 dstG = 255;
905 }
906 dstB = srcB + dstB;
907 if (dstB > 255) {
908 dstB = 255;
909 }
910 break;
911 case SDL_COPY_MOD:
912 dstR = (srcR * dstR) / 255;
913 dstG = (srcG * dstG) / 255;
914 dstB = (srcB * dstB) / 255;
915 break;
916 case SDL_COPY_MUL:
917 dstR = ((srcR * dstR) + (dstR * (255 - srcA))) / 255;
918 if (dstR > 255) {
919 dstR = 255;
920 }
921 dstG = ((srcG * dstG) + (dstG * (255 - srcA))) / 255;
922 if (dstG > 255) {
923 dstG = 255;
924 }
925 dstB = ((srcB * dstB) + (dstB * (255 - srcA))) / 255;
926 if (dstB > 255) {
927 dstB = 255;
928 }
929 break;
930 }
931 if (FORMAT_HAS_ALPHA(dstfmt_val)) {
932 ASSEMBLE_RGBA(dst, dstbpp, dst_fmt, dstR, dstG, dstB, dstA);
933 } else if (FORMAT_HAS_NO_ALPHA(dstfmt_val)) {
934 ASSEMBLE_RGB(dst, dstbpp, dst_fmt, dstR, dstG, dstB);
935 } else {
936 // SDL_PIXELFORMAT_ARGB2101010
937 Uint32 pixel;
938 ARGB2101010_FROM_RGBA(pixel, dstR, dstG, dstB, dstA);
939 *(Uint32 *)dst = pixel;
940 }
941 }
942 TRIANGLE_END_LOOP
943}
944
945#endif // SDL_VIDEO_RENDER_SW
diff --git a/SDL-3.2.8/src/render/software/SDL_triangle.h b/SDL-3.2.8/src/render/software/SDL_triangle.h
new file mode 100644
index 0000000..1c5504c
--- /dev/null
+++ b/SDL-3.2.8/src/render/software/SDL_triangle.h
@@ -0,0 +1,42 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_triangle_h_
23#define SDL_triangle_h_
24
25#include "SDL_internal.h"
26
27#include "../SDL_sysrender.h" // For SDL_TextureAddressMode
28
29extern bool SDL_SW_FillTriangle(SDL_Surface *dst,
30 SDL_Point *d0, SDL_Point *d1, SDL_Point *d2,
31 SDL_BlendMode blend, SDL_Color c0, SDL_Color c1, SDL_Color c2);
32
33extern bool SDL_SW_BlitTriangle(SDL_Surface *src,
34 SDL_Point *s0, SDL_Point *s1, SDL_Point *s2,
35 SDL_Surface *dst,
36 SDL_Point *d0, SDL_Point *d1, SDL_Point *d2,
37 SDL_Color c0, SDL_Color c1, SDL_Color c2,
38 SDL_TextureAddressMode texture_address_mode);
39
40extern void trianglepoint_2_fixedpoint(SDL_Point *a);
41
42#endif // SDL_triangle_h_
diff --git a/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm.c b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm.c
new file mode 100644
index 0000000..acf31c3
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm.c
@@ -0,0 +1,1198 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_VITA_GXM
24
25#include "../SDL_sysrender.h"
26
27#include <stdio.h>
28#include <string.h>
29#include <math.h>
30#include <stdarg.h>
31#include <stdlib.h>
32
33#include "SDL_render_vita_gxm_types.h"
34#include "SDL_render_vita_gxm_tools.h"
35#include "SDL_render_vita_gxm_memory.h"
36
37#include <psp2/common_dialog.h>
38
39// #define DEBUG_RAZOR
40
41#ifdef DEBUG_RAZOR
42#include <psp2/sysmodule.h>
43#endif
44
45static bool VITA_GXM_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props);
46
47static void VITA_GXM_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event);
48
49static bool VITA_GXM_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode);
50
51static bool VITA_GXM_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props);
52
53static bool VITA_GXM_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
54 const SDL_Rect *rect, const void *pixels, int pitch);
55
56static bool VITA_GXM_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
57 const SDL_Rect *rect,
58 const Uint8 *Yplane, int Ypitch,
59 const Uint8 *Uplane, int Upitch,
60 const Uint8 *Vplane, int Vpitch);
61
62static bool VITA_GXM_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
63 const SDL_Rect *rect,
64 const Uint8 *Yplane, int Ypitch,
65 const Uint8 *UVplane, int UVpitch);
66
67static bool VITA_GXM_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
68 const SDL_Rect *rect, void **pixels, int *pitch);
69
70static void VITA_GXM_UnlockTexture(SDL_Renderer *renderer,
71 SDL_Texture *texture);
72
73static void VITA_GXM_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode);
74
75static bool VITA_GXM_SetRenderTarget(SDL_Renderer *renderer,
76 SDL_Texture *texture);
77
78static bool VITA_GXM_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd);
79
80static bool VITA_GXM_QueueSetDrawColor(SDL_Renderer *renderer, SDL_RenderCommand *cmd);
81
82static bool VITA_GXM_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count);
83static bool VITA_GXM_QueueDrawLines(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count);
84
85static bool VITA_GXM_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
86 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
87 int num_vertices, const void *indices, int num_indices, int size_indices,
88 float scale_x, float scale_y);
89
90static bool VITA_GXM_RenderClear(SDL_Renderer *renderer, SDL_RenderCommand *cmd);
91
92static void VITA_GXM_InvalidateCachedState(SDL_Renderer *renderer);
93
94static bool VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize);
95
96static SDL_Surface *VITA_GXM_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect);
97
98static bool VITA_GXM_RenderPresent(SDL_Renderer *renderer);
99static void VITA_GXM_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture);
100static void VITA_GXM_DestroyRenderer(SDL_Renderer *renderer);
101
102SDL_RenderDriver VITA_GXM_RenderDriver = {
103 VITA_GXM_CreateRenderer, "VITA gxm"
104};
105
106static int PixelFormatToVITAFMT(Uint32 format)
107{
108 switch (format) {
109 case SDL_PIXELFORMAT_ARGB8888:
110 return SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ARGB;
111 case SDL_PIXELFORMAT_XRGB8888:
112 return SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ARGB;
113 case SDL_PIXELFORMAT_XBGR8888:
114 return SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR;
115 case SDL_PIXELFORMAT_ABGR8888:
116 return SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR;
117 case SDL_PIXELFORMAT_RGB565:
118 return SCE_GXM_TEXTURE_FORMAT_U5U6U5_RGB;
119 case SDL_PIXELFORMAT_BGR565:
120 return SCE_GXM_TEXTURE_FORMAT_U5U6U5_BGR;
121 case SDL_PIXELFORMAT_YV12:
122 return SCE_GXM_TEXTURE_FORMAT_YVU420P3_CSC0;
123 case SDL_PIXELFORMAT_IYUV:
124 return SCE_GXM_TEXTURE_FORMAT_YUV420P3_CSC0;
125 // should be the other way around. looks like SCE bug.
126 case SDL_PIXELFORMAT_NV12:
127 return SCE_GXM_TEXTURE_FORMAT_YVU420P2_CSC0;
128 case SDL_PIXELFORMAT_NV21:
129 return SCE_GXM_TEXTURE_FORMAT_YUV420P2_CSC0;
130 default:
131 return SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR;
132 }
133}
134
135void StartDrawing(SDL_Renderer *renderer)
136{
137 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
138 if (data->drawing) {
139 return;
140 }
141
142 data->drawstate.texture = NULL;
143 data->drawstate.vertex_program = NULL;
144 data->drawstate.fragment_program = NULL;
145 data->drawstate.last_command = -1;
146 data->drawstate.viewport_dirty = true;
147
148 // reset blend mode
149 // data->currentBlendMode = SDL_BLENDMODE_BLEND;
150 // fragment_programs *in = &data->blendFragmentPrograms.blend_mode_blend;
151 // data->colorFragmentProgram = in->color;
152 // data->textureFragmentProgram = in->texture;
153
154 if (!renderer->target) {
155 sceGxmBeginScene(
156 data->gxm_context,
157 0,
158 data->renderTarget,
159 NULL,
160 NULL,
161 data->displayBufferSync[data->backBufferIndex],
162 &data->displaySurface[data->backBufferIndex],
163 &data->depthSurface);
164 } else {
165 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)renderer->target->internal;
166
167 sceGxmBeginScene(
168 data->gxm_context,
169 0,
170 vita_texture->tex->gxm_rendertarget,
171 NULL,
172 NULL,
173 NULL,
174 &vita_texture->tex->gxm_colorsurface,
175 &vita_texture->tex->gxm_depthstencil);
176 }
177
178 // unset_clip_rectangle(data);
179
180 data->drawing = true;
181}
182
183static bool VITA_GXM_SetVSync(SDL_Renderer *renderer, const int vsync)
184{
185 VITA_GXM_RenderData *data = renderer->internal;
186 if (vsync) {
187 data->displayData.wait_vblank = true;
188 } else {
189 data->displayData.wait_vblank = false;
190 }
191 return true;
192}
193
194static bool VITA_GXM_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
195{
196 VITA_GXM_RenderData *data;
197
198 SDL_SetupRendererColorspace(renderer, create_props);
199
200 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB) {
201 return SDL_SetError("Unsupported output colorspace");
202 }
203
204 data = (VITA_GXM_RenderData *)SDL_calloc(1, sizeof(VITA_GXM_RenderData));
205 if (!data) {
206 return false;
207 }
208
209 renderer->WindowEvent = VITA_GXM_WindowEvent;
210 renderer->SupportsBlendMode = VITA_GXM_SupportsBlendMode;
211 renderer->CreateTexture = VITA_GXM_CreateTexture;
212 renderer->UpdateTexture = VITA_GXM_UpdateTexture;
213#ifdef SDL_HAVE_YUV
214 renderer->UpdateTextureYUV = VITA_GXM_UpdateTextureYUV;
215 renderer->UpdateTextureNV = VITA_GXM_UpdateTextureNV;
216#endif
217 renderer->LockTexture = VITA_GXM_LockTexture;
218 renderer->UnlockTexture = VITA_GXM_UnlockTexture;
219 renderer->SetTextureScaleMode = VITA_GXM_SetTextureScaleMode;
220 renderer->SetRenderTarget = VITA_GXM_SetRenderTarget;
221 renderer->QueueSetViewport = VITA_GXM_QueueNoOp;
222 renderer->QueueSetDrawColor = VITA_GXM_QueueSetDrawColor;
223 renderer->QueueDrawPoints = VITA_GXM_QueueDrawPoints;
224 renderer->QueueDrawLines = VITA_GXM_QueueDrawLines;
225 renderer->QueueGeometry = VITA_GXM_QueueGeometry;
226 renderer->InvalidateCachedState = VITA_GXM_InvalidateCachedState;
227 renderer->RunCommandQueue = VITA_GXM_RunCommandQueue;
228 renderer->RenderReadPixels = VITA_GXM_RenderReadPixels;
229 renderer->RenderPresent = VITA_GXM_RenderPresent;
230 renderer->DestroyTexture = VITA_GXM_DestroyTexture;
231 renderer->DestroyRenderer = VITA_GXM_DestroyRenderer;
232 renderer->SetVSync = VITA_GXM_SetVSync;
233
234 renderer->internal = data;
235 VITA_GXM_InvalidateCachedState(renderer);
236 renderer->window = window;
237
238 renderer->name = VITA_GXM_RenderDriver.name;
239 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
240 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
241 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGB565);
242 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_BGR565);
243 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
244 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
245 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
246 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
247 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 4096);
248
249 data->initialized = true;
250
251#ifdef DEBUG_RAZOR
252 sceSysmoduleLoadModule(SCE_SYSMODULE_RAZOR_HUD);
253 sceSysmoduleLoadModule(SCE_SYSMODULE_RAZOR_CAPTURE);
254#endif
255
256 if (gxm_init(renderer) != 0) {
257 return SDL_SetError("gxm_init failed");
258 }
259
260 return true;
261}
262
263static void VITA_GXM_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
264{
265}
266
267static bool VITA_GXM_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
268{
269 // only for custom modes. we build all modes on init, so no custom modes, sorry
270 return false;
271}
272
273static bool VITA_GXM_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
274{
275 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
276 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)SDL_calloc(1, sizeof(VITA_GXM_TextureData));
277
278 if (!vita_texture) {
279 return false;
280 }
281
282 vita_texture->tex = create_gxm_texture(
283 data,
284 texture->w,
285 texture->h,
286 PixelFormatToVITAFMT(texture->format),
287 (texture->access == SDL_TEXTUREACCESS_TARGET),
288 &(vita_texture->w),
289 &(vita_texture->h),
290 &(vita_texture->pitch),
291 &(vita_texture->wscale));
292
293 if (!vita_texture->tex) {
294 SDL_free(vita_texture);
295 return SDL_OutOfMemory();
296 }
297
298 texture->internal = vita_texture;
299
300 VITA_GXM_SetTextureScaleMode(renderer, texture, texture->scaleMode);
301
302#ifdef SDL_HAVE_YUV
303 vita_texture->yuv = ((texture->format == SDL_PIXELFORMAT_IYUV) || (texture->format == SDL_PIXELFORMAT_YV12));
304 vita_texture->nv12 = ((texture->format == SDL_PIXELFORMAT_NV12) || (texture->format == SDL_PIXELFORMAT_NV21));
305#endif
306
307 return true;
308}
309
310static void VITA_GXM_SetYUVProfile(SDL_Renderer *renderer, SDL_Texture *texture)
311{
312 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
313 int ret = 0;
314 if (SDL_ISCOLORSPACE_MATRIX_BT601(texture->colorspace)) {
315 if (SDL_ISCOLORSPACE_LIMITED_RANGE(texture->colorspace)) {
316 ret = sceGxmSetYuvProfile(data->gxm_context, 0, SCE_GXM_YUV_PROFILE_BT601_STANDARD);
317 } else {
318 ret = sceGxmSetYuvProfile(data->gxm_context, 0, SCE_GXM_YUV_PROFILE_BT601_FULL_RANGE);
319 }
320 } else if (SDL_ISCOLORSPACE_MATRIX_BT709(texture->colorspace)) {
321 if (SDL_ISCOLORSPACE_LIMITED_RANGE(texture->colorspace)) {
322 ret = sceGxmSetYuvProfile(data->gxm_context, 0, SCE_GXM_YUV_PROFILE_BT709_STANDARD);
323 } else {
324 ret = sceGxmSetYuvProfile(data->gxm_context, 0, SCE_GXM_YUV_PROFILE_BT709_FULL_RANGE);
325 }
326 } else {
327 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Unsupported YUV colorspace");
328 }
329
330 if (ret < 0) {
331 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Setting YUV profile failed: %x", ret);
332 }
333}
334
335static bool VITA_GXM_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
336 const SDL_Rect *rect, const void *pixels, int pitch)
337{
338 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
339 Uint8 *dst;
340 int row, length, dpitch;
341
342#ifdef SDL_HAVE_YUV
343 if (vita_texture->yuv || vita_texture->nv12) {
344 VITA_GXM_SetYUVProfile(renderer, texture);
345 }
346#endif
347
348 VITA_GXM_LockTexture(renderer, texture, rect, (void **)&dst, &dpitch);
349 length = rect->w * SDL_BYTESPERPIXEL(texture->format);
350 if (length == pitch && length == dpitch) {
351 SDL_memcpy(dst, pixels, length * rect->h);
352 pixels += pitch * rect->h;
353 } else {
354 for (row = 0; row < rect->h; ++row) {
355 SDL_memcpy(dst, pixels, length);
356 pixels += pitch;
357 dst += dpitch;
358 }
359 }
360
361#ifdef SDL_HAVE_YUV
362 if (vita_texture->yuv) {
363 void *Udst;
364 void *Vdst;
365 int uv_pitch = (dpitch + 1) / 2;
366 int uv_src_pitch = (pitch + 1) / 2;
367 SDL_Rect UVrect = { rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2 };
368
369 // skip Y plane
370 Uint8 *Dpixels = gxm_texture_get_datap(vita_texture->tex) + (vita_texture->pitch * vita_texture->h);
371
372 Udst = Dpixels + (UVrect.y * uv_pitch) + UVrect.x;
373 Vdst = Dpixels + (uv_pitch * ((vita_texture->h + 1) / 2)) + (UVrect.y * uv_pitch) + UVrect.x;
374
375 length = UVrect.w;
376
377 // U plane
378 if (length == uv_src_pitch && length == uv_pitch) {
379 SDL_memcpy(Udst, pixels, length * UVrect.h);
380 pixels += uv_src_pitch * UVrect.h;
381 } else {
382 for (row = 0; row < UVrect.h; ++row) {
383 SDL_memcpy(Udst, pixels, length);
384 pixels += uv_src_pitch;
385 Udst += uv_pitch;
386 }
387 }
388
389 // V plane
390 if (length == uv_src_pitch && length == uv_pitch) {
391 SDL_memcpy(Vdst, pixels, length * UVrect.h);
392 } else {
393 for (row = 0; row < UVrect.h; ++row) {
394 SDL_memcpy(Vdst, pixels, length);
395 pixels += uv_src_pitch;
396 Vdst += uv_pitch;
397 }
398 }
399
400 } else if (vita_texture->nv12) {
401 void *UVdst;
402 int uv_pitch = 2 * ((dpitch + 1) / 2);
403 int uv_src_pitch = 2 * ((pitch + 1) / 2);
404 SDL_Rect UVrect = { rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2 };
405
406 // skip Y plane
407 void *Dpixels = (void *)((Uint8 *)gxm_texture_get_datap(vita_texture->tex) + (vita_texture->pitch * vita_texture->h));
408 UVdst = Dpixels + (UVrect.y * uv_pitch) + UVrect.x;
409
410 length = UVrect.w * 2;
411
412 // UV plane
413 if (length == uv_src_pitch && length == uv_pitch) {
414 SDL_memcpy(UVdst, pixels, length * UVrect.h);
415 } else {
416 for (row = 0; row < UVrect.h; ++row) {
417 SDL_memcpy(UVdst, pixels, length);
418 pixels += uv_src_pitch;
419 UVdst += uv_pitch;
420 }
421 }
422 }
423#endif
424
425 return true;
426}
427
428#ifdef SDL_HAVE_YUV
429static bool VITA_GXM_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
430 const SDL_Rect *rect,
431 const Uint8 *Yplane, int Ypitch,
432 const Uint8 *Uplane, int Upitch,
433 const Uint8 *Vplane, int Vpitch)
434{
435 Uint8 *dst;
436 int row, length, dpitch;
437 SDL_Rect UVrect = { rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2 };
438
439 VITA_GXM_SetYUVProfile(renderer, texture);
440
441 // copy Y plane
442 // obtain pixels via locking so that texture is flushed
443 VITA_GXM_LockTexture(renderer, texture, rect, (void **)&dst, &dpitch);
444
445 length = rect->w;
446
447 if (length == Ypitch && length == dpitch) {
448 SDL_memcpy(dst, Yplane, length * rect->h);
449 } else {
450 for (row = 0; row < rect->h; ++row) {
451 SDL_memcpy(dst, Yplane, length);
452 Yplane += Ypitch;
453 dst += dpitch;
454 }
455 }
456
457 // U/V planes
458 {
459 void *Udst;
460 void *Vdst;
461 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
462 int uv_pitch = (dpitch + 1) / 2;
463
464 // skip Y plane
465 void *pixels = (void *)((Uint8 *)gxm_texture_get_datap(vita_texture->tex) + (vita_texture->pitch * vita_texture->h));
466
467 if (texture->format == SDL_PIXELFORMAT_YV12) { // YVU
468 Vdst = pixels + (UVrect.y * uv_pitch) + UVrect.x;
469 Udst = pixels + (uv_pitch * ((vita_texture->h + 1) / 2)) + (UVrect.y * uv_pitch) + UVrect.x;
470 } else { // YUV
471 Udst = pixels + (UVrect.y * uv_pitch) + UVrect.x;
472 Vdst = pixels + (uv_pitch * ((vita_texture->h + 1) / 2)) + (UVrect.y * uv_pitch) + UVrect.x;
473 }
474
475 length = UVrect.w;
476
477 // U plane
478 if (length == Upitch && length == uv_pitch) {
479 SDL_memcpy(Udst, Uplane, length * UVrect.h);
480 } else {
481 for (row = 0; row < UVrect.h; ++row) {
482 SDL_memcpy(Udst, Uplane, length);
483 Uplane += Upitch;
484 Udst += uv_pitch;
485 }
486 }
487
488 // V plane
489 if (length == Vpitch && length == uv_pitch) {
490 SDL_memcpy(Vdst, Vplane, length * UVrect.h);
491 } else {
492 for (row = 0; row < UVrect.h; ++row) {
493 SDL_memcpy(Vdst, Vplane, length);
494 Vplane += Vpitch;
495 Vdst += uv_pitch;
496 }
497 }
498 }
499
500 return true;
501}
502
503static bool VITA_GXM_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
504 const SDL_Rect *rect,
505 const Uint8 *Yplane, int Ypitch,
506 const Uint8 *UVplane, int UVpitch)
507{
508
509 Uint8 *dst;
510 int row, length, dpitch;
511 SDL_Rect UVrect = { rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2 };
512
513 VITA_GXM_SetYUVProfile(renderer, texture);
514
515 // copy Y plane
516 VITA_GXM_LockTexture(renderer, texture, rect, (void **)&dst, &dpitch);
517
518 length = rect->w * SDL_BYTESPERPIXEL(texture->format);
519
520 if (length == Ypitch && length == dpitch) {
521 SDL_memcpy(dst, Yplane, length * rect->h);
522 } else {
523 for (row = 0; row < rect->h; ++row) {
524 SDL_memcpy(dst, Yplane, length);
525 Yplane += Ypitch;
526 dst += dpitch;
527 }
528 }
529
530 // UV plane
531 {
532 void *UVdst;
533 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
534 int uv_pitch = 2 * ((dpitch + 1) / 2);
535
536 // skip Y plane
537 void *pixels = (void *)((Uint8 *)gxm_texture_get_datap(vita_texture->tex) + (vita_texture->pitch * vita_texture->h));
538
539 UVdst = pixels + (UVrect.y * uv_pitch) + UVrect.x;
540
541 length = UVrect.w * 2;
542
543 // UV plane
544 if (length == UVpitch && length == uv_pitch) {
545 SDL_memcpy(UVdst, UVplane, length * UVrect.h);
546 } else {
547 for (row = 0; row < UVrect.h; ++row) {
548 SDL_memcpy(UVdst, UVplane, length);
549 UVplane += UVpitch;
550 UVdst += uv_pitch;
551 }
552 }
553 }
554
555 return true;
556}
557
558#endif
559
560static bool VITA_GXM_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
561 const SDL_Rect *rect, void **pixels, int *pitch)
562{
563 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
564 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
565
566 *pixels =
567 (void *)((Uint8 *)gxm_texture_get_datap(vita_texture->tex) + (rect->y * vita_texture->pitch) + rect->x * SDL_BYTESPERPIXEL(texture->format));
568 *pitch = vita_texture->pitch;
569
570 // make sure that rendering is finished on render target textures
571 if (vita_texture->tex->gxm_rendertarget) {
572 sceGxmFinish(data->gxm_context);
573 }
574
575 return true;
576}
577
578static void VITA_GXM_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
579{
580 // No need to update texture data on ps vita.
581 // VITA_GXM_LockTexture already returns a pointer to the texture pixels buffer.
582 // This really improves framerate when using lock/unlock.
583}
584
585static void VITA_GXM_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
586{
587 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
588
589 /*
590 set texture filtering according to scaleMode
591 supported hint values are nearest (0, default) or linear (1)
592 vitaScaleMode is either SCE_GXM_TEXTURE_FILTER_POINT (good for tile-map)
593 or SCE_GXM_TEXTURE_FILTER_LINEAR (good for scaling)
594 */
595
596 int vitaScaleMode = (scaleMode == SDL_SCALEMODE_NEAREST
597 ? SCE_GXM_TEXTURE_FILTER_POINT
598 : SCE_GXM_TEXTURE_FILTER_LINEAR);
599 gxm_texture_set_filters(vita_texture->tex, vitaScaleMode, vitaScaleMode);
600
601 return;
602}
603
604static bool VITA_GXM_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
605{
606 return true;
607}
608
609static void VITA_GXM_SetBlendMode(VITA_GXM_RenderData *data, int blendMode)
610{
611 if (blendMode != data->currentBlendMode) {
612 fragment_programs *in = &data->blendFragmentPrograms.blend_mode_blend;
613
614 switch (blendMode) {
615 case SDL_BLENDMODE_NONE:
616 in = &data->blendFragmentPrograms.blend_mode_none;
617 break;
618 case SDL_BLENDMODE_BLEND:
619 in = &data->blendFragmentPrograms.blend_mode_blend;
620 break;
621 case SDL_BLENDMODE_ADD:
622 in = &data->blendFragmentPrograms.blend_mode_add;
623 break;
624 case SDL_BLENDMODE_MOD:
625 in = &data->blendFragmentPrograms.blend_mode_mod;
626 break;
627 case SDL_BLENDMODE_MUL:
628 in = &data->blendFragmentPrograms.blend_mode_mul;
629 break;
630 }
631 data->colorFragmentProgram = in->color;
632 data->textureFragmentProgram = in->texture;
633 data->currentBlendMode = blendMode;
634 }
635}
636
637static bool VITA_GXM_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
638{
639 return true;
640}
641
642static bool VITA_GXM_QueueSetDrawColor(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
643{
644 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
645
646 data->drawstate.color.r = cmd->data.color.color.r * cmd->data.color.color_scale;
647 data->drawstate.color.g = cmd->data.color.color.g * cmd->data.color.color_scale;
648 data->drawstate.color.b = cmd->data.color.color.b * cmd->data.color.color_scale;
649 data->drawstate.color.a = cmd->data.color.color.a;
650
651 return true;
652}
653
654static bool VITA_GXM_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
655{
656 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
657
658 SDL_FColor color = data->drawstate.color;
659
660 color_vertex *vertex = (color_vertex *)pool_malloc(
661 data,
662 count * sizeof(color_vertex));
663
664 cmd->data.draw.first = (size_t)vertex;
665 cmd->data.draw.count = count;
666
667 for (int i = 0; i < count; i++) {
668 vertex[i].x = points[i].x;
669 vertex[i].y = points[i].y;
670 vertex[i].color = color;
671 }
672
673 return true;
674}
675
676static bool VITA_GXM_QueueDrawLines(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
677{
678 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
679 SDL_FColor color = data->drawstate.color;
680
681 color_vertex *vertex = (color_vertex *)pool_malloc(
682 data,
683 (count - 1) * 2 * sizeof(color_vertex));
684
685 cmd->data.draw.first = (size_t)vertex;
686 cmd->data.draw.count = (count - 1) * 2;
687
688 for (int i = 0; i < count - 1; i++) {
689 vertex[i * 2].x = points[i].x;
690 vertex[i * 2].y = points[i].y;
691 vertex[i * 2].color = color;
692
693 vertex[i * 2 + 1].x = points[i + 1].x;
694 vertex[i * 2 + 1].y = points[i + 1].y;
695 vertex[i * 2 + 1].color = color;
696 }
697
698 return true;
699}
700
701static bool VITA_GXM_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
702 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
703 int num_vertices, const void *indices, int num_indices, int size_indices,
704 float scale_x, float scale_y)
705{
706 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
707 int i;
708 int count = indices ? num_indices : num_vertices;
709 const float color_scale = cmd->data.draw.color_scale;
710
711 cmd->data.draw.count = count;
712 size_indices = indices ? size_indices : 0;
713
714 if (texture) {
715 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
716 texture_vertex *vertices;
717
718 vertices = (texture_vertex *)pool_malloc(
719 data,
720 count * sizeof(texture_vertex));
721
722 if (!vertices) {
723 return false;
724 }
725
726 for (i = 0; i < count; i++) {
727 int j;
728 float *xy_;
729 float *uv_;
730 SDL_FColor col_;
731 if (size_indices == 4) {
732 j = ((const Uint32 *)indices)[i];
733 } else if (size_indices == 2) {
734 j = ((const Uint16 *)indices)[i];
735 } else if (size_indices == 1) {
736 j = ((const Uint8 *)indices)[i];
737 } else {
738 j = i;
739 }
740
741 xy_ = (float *)((char *)xy + j * xy_stride);
742 col_ = *(SDL_FColor *)((char *)color + j * color_stride);
743 uv_ = (float *)((char *)uv + j * uv_stride);
744
745 col_.r *= color_scale;
746 col_.g *= color_scale;
747 col_.b *= color_scale;
748
749 vertices[i].x = xy_[0] * scale_x;
750 vertices[i].y = xy_[1] * scale_y;
751 vertices[i].u = uv_[0] * vita_texture->wscale;
752 vertices[i].v = uv_[1];
753 vertices[i].color = col_;
754 }
755
756 cmd->data.draw.first = (size_t)vertices;
757
758 } else {
759 color_vertex *vertices;
760
761 vertices = (color_vertex *)pool_malloc(
762 data,
763 count * sizeof(color_vertex));
764
765 if (!vertices) {
766 return false;
767 }
768
769 for (i = 0; i < count; i++) {
770 int j;
771 float *xy_;
772 SDL_FColor col_;
773 if (size_indices == 4) {
774 j = ((const Uint32 *)indices)[i];
775 } else if (size_indices == 2) {
776 j = ((const Uint16 *)indices)[i];
777 } else if (size_indices == 1) {
778 j = ((const Uint8 *)indices)[i];
779 } else {
780 j = i;
781 }
782
783 xy_ = (float *)((char *)xy + j * xy_stride);
784 col_ = *(SDL_FColor *)((char *)color + j * color_stride);
785
786 col_.r *= color_scale;
787 col_.g *= color_scale;
788 col_.b *= color_scale;
789
790 vertices[i].x = xy_[0] * scale_x;
791 vertices[i].y = xy_[1] * scale_y;
792 vertices[i].color = col_;
793 }
794 cmd->data.draw.first = (size_t)vertices;
795 }
796
797 return true;
798}
799
800static bool VITA_GXM_RenderClear(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
801{
802 void *color_buffer;
803 SDL_FColor color;
804
805 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
806 unset_clip_rectangle(data);
807
808 // set clear shaders
809 data->drawstate.fragment_program = data->clearFragmentProgram;
810 data->drawstate.vertex_program = data->clearVertexProgram;
811 sceGxmSetVertexProgram(data->gxm_context, data->clearVertexProgram);
812 sceGxmSetFragmentProgram(data->gxm_context, data->clearFragmentProgram);
813
814 // set the clear color
815 color = cmd->data.color.color;
816 color.r *= cmd->data.color.color_scale;
817 color.g *= cmd->data.color.color_scale;
818 color.b *= cmd->data.color.color_scale;
819 sceGxmReserveFragmentDefaultUniformBuffer(data->gxm_context, &color_buffer);
820 sceGxmSetUniformDataF(color_buffer, data->clearClearColorParam, 0, 4, &color.r);
821
822 // draw the clear triangle
823 sceGxmSetVertexStream(data->gxm_context, 0, data->clearVertices);
824 sceGxmDraw(data->gxm_context, SCE_GXM_PRIMITIVE_TRIANGLES, SCE_GXM_INDEX_FORMAT_U16, data->linearIndices, 3);
825
826 data->drawstate.cliprect_dirty = true;
827 return true;
828}
829
830static bool SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
831{
832 SDL_Texture *texture = cmd->data.draw.texture;
833 const SDL_BlendMode blend = cmd->data.draw.blend;
834 SceGxmFragmentProgram *fragment_program;
835 SceGxmVertexProgram *vertex_program;
836 bool matrix_updated = false;
837 bool program_updated = false;
838
839 if (data->drawstate.viewport_dirty) {
840 const SDL_Rect *viewport = &data->drawstate.viewport;
841
842 float sw = viewport->w / 2.f;
843 float sh = viewport->h / 2.f;
844
845 float x_scale = sw;
846 float x_off = viewport->x + sw;
847 float y_scale = -(sh);
848 float y_off = viewport->y + sh;
849
850 sceGxmSetViewport(data->gxm_context, x_off, x_scale, y_off, y_scale, 0.5f, 0.5f);
851
852 if (viewport->w && viewport->h) {
853 init_orthographic_matrix(data->ortho_matrix,
854 (float)0,
855 (float)viewport->w,
856 (float)viewport->h,
857 (float)0,
858 0.0f, 1.0f);
859 matrix_updated = true;
860 }
861
862 data->drawstate.viewport_dirty = false;
863 }
864
865 if (data->drawstate.cliprect_enabled_dirty) {
866 if (!data->drawstate.cliprect_enabled) {
867 unset_clip_rectangle(data);
868 }
869 data->drawstate.cliprect_enabled_dirty = false;
870 }
871
872 if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) {
873 const SDL_Rect *rect = &data->drawstate.cliprect;
874 set_clip_rectangle(data, rect->x, rect->y, rect->x + rect->w, rect->y + rect->h);
875 data->drawstate.cliprect_dirty = false;
876 }
877
878 VITA_GXM_SetBlendMode(data, blend); // do that first, to select appropriate shaders
879
880 if (texture) {
881 vertex_program = data->textureVertexProgram;
882 fragment_program = data->textureFragmentProgram;
883 } else {
884 vertex_program = data->colorVertexProgram;
885 fragment_program = data->colorFragmentProgram;
886 }
887
888 if (data->drawstate.vertex_program != vertex_program) {
889 data->drawstate.vertex_program = vertex_program;
890 sceGxmSetVertexProgram(data->gxm_context, vertex_program);
891 program_updated = true;
892 }
893
894 if (data->drawstate.fragment_program != fragment_program) {
895 data->drawstate.fragment_program = fragment_program;
896 sceGxmSetFragmentProgram(data->gxm_context, fragment_program);
897 program_updated = true;
898 }
899
900 if (program_updated || matrix_updated) {
901 if (data->drawstate.fragment_program == data->textureFragmentProgram) {
902 void *vertex_wvp_buffer;
903 sceGxmReserveVertexDefaultUniformBuffer(data->gxm_context, &vertex_wvp_buffer);
904 sceGxmSetUniformDataF(vertex_wvp_buffer, data->textureWvpParam, 0, 16, data->ortho_matrix);
905 } else { // color
906 void *vertexDefaultBuffer;
907 sceGxmReserveVertexDefaultUniformBuffer(data->gxm_context, &vertexDefaultBuffer);
908 sceGxmSetUniformDataF(vertexDefaultBuffer, data->colorWvpParam, 0, 16, data->ortho_matrix);
909 }
910 }
911
912 if (texture != data->drawstate.texture) {
913 if (texture) {
914 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)cmd->data.draw.texture->internal;
915 sceGxmSetFragmentTexture(data->gxm_context, 0, &vita_texture->tex->gxm_tex);
916 }
917 data->drawstate.texture = texture;
918 }
919
920 // all drawing commands use this
921 sceGxmSetVertexStream(data->gxm_context, 0, (const void *)cmd->data.draw.first);
922
923 return true;
924}
925
926static void VITA_GXM_InvalidateCachedState(SDL_Renderer *renderer)
927{
928 // currently this doesn't do anything. If this needs to do something (and someone is mixing their own rendering calls in!), update this.
929}
930
931static bool VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
932{
933 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
934 StartDrawing(renderer);
935
936 data->drawstate.target = renderer->target;
937 if (!data->drawstate.target) {
938 int w, h;
939 SDL_GetWindowSizeInPixels(renderer->window, &w, &h);
940 if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
941 data->drawstate.viewport_dirty = true; // if the window dimensions changed, invalidate the current viewport, etc.
942 data->drawstate.cliprect_dirty = true;
943 data->drawstate.drawablew = w;
944 data->drawstate.drawableh = h;
945 }
946 }
947
948 while (cmd) {
949 switch (cmd->command) {
950
951 case SDL_RENDERCMD_SETVIEWPORT:
952 {
953 SDL_Rect *viewport = &data->drawstate.viewport;
954 if (SDL_memcmp(viewport, &cmd->data.viewport.rect, sizeof(cmd->data.viewport.rect)) != 0) {
955 SDL_copyp(viewport, &cmd->data.viewport.rect);
956 data->drawstate.viewport_dirty = true;
957 data->drawstate.cliprect_dirty = true;
958 }
959 break;
960 }
961
962 case SDL_RENDERCMD_SETCLIPRECT:
963 {
964 const SDL_Rect *rect = &cmd->data.cliprect.rect;
965 if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
966 data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
967 data->drawstate.cliprect_enabled_dirty = true;
968 }
969
970 if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) {
971 SDL_copyp(&data->drawstate.cliprect, rect);
972 data->drawstate.cliprect_dirty = true;
973 }
974 break;
975 }
976
977 case SDL_RENDERCMD_SETDRAWCOLOR:
978 {
979 break;
980 }
981
982 case SDL_RENDERCMD_CLEAR:
983 {
984 VITA_GXM_RenderClear(renderer, cmd);
985 break;
986 }
987
988 case SDL_RENDERCMD_FILL_RECTS: // unused
989 break;
990
991 case SDL_RENDERCMD_COPY: // unused
992 break;
993
994 case SDL_RENDERCMD_COPY_EX: // unused
995 break;
996
997 case SDL_RENDERCMD_DRAW_POINTS:
998 case SDL_RENDERCMD_DRAW_LINES:
999 case SDL_RENDERCMD_GEOMETRY:
1000 {
1001 SDL_Texture *thistexture = cmd->data.draw.texture;
1002 SDL_BlendMode thisblend = cmd->data.draw.blend;
1003 const SDL_RenderCommandType thiscmdtype = cmd->command;
1004 SDL_RenderCommand *finalcmd = cmd;
1005 SDL_RenderCommand *nextcmd = cmd->next;
1006 size_t count = cmd->data.draw.count;
1007 int ret;
1008 while (nextcmd) {
1009 const SDL_RenderCommandType nextcmdtype = nextcmd->command;
1010 if (nextcmdtype != thiscmdtype) {
1011 break; // can't go any further on this draw call, different render command up next.
1012 } else if (nextcmd->data.draw.texture != thistexture || nextcmd->data.draw.blend != thisblend) {
1013 break; // can't go any further on this draw call, different texture/blendmode copy up next.
1014 } else {
1015 finalcmd = nextcmd; // we can combine copy operations here. Mark this one as the furthest okay command.
1016 count += nextcmd->data.draw.count;
1017 }
1018 nextcmd = nextcmd->next;
1019 }
1020
1021 ret = SetDrawState(data, cmd);
1022
1023 if (ret) {
1024 int op = SCE_GXM_PRIMITIVE_TRIANGLES;
1025
1026 if (thiscmdtype == SDL_RENDERCMD_DRAW_POINTS) {
1027 sceGxmSetFrontPolygonMode(data->gxm_context, SCE_GXM_POLYGON_MODE_POINT);
1028 op = SCE_GXM_PRIMITIVE_POINTS;
1029 } else if (thiscmdtype == SDL_RENDERCMD_DRAW_LINES) {
1030 sceGxmSetFrontPolygonMode(data->gxm_context, SCE_GXM_POLYGON_MODE_LINE);
1031 op = SCE_GXM_PRIMITIVE_LINES;
1032 }
1033
1034 sceGxmDraw(data->gxm_context, op, SCE_GXM_INDEX_FORMAT_U16, data->linearIndices, count);
1035
1036 if (thiscmdtype == SDL_RENDERCMD_DRAW_POINTS || thiscmdtype == SDL_RENDERCMD_DRAW_LINES) {
1037 sceGxmSetFrontPolygonMode(data->gxm_context, SCE_GXM_POLYGON_MODE_TRIANGLE_FILL);
1038 }
1039 }
1040
1041 cmd = finalcmd; // skip any copy commands we just combined in here.
1042 break;
1043 }
1044
1045 case SDL_RENDERCMD_NO_OP:
1046 break;
1047 }
1048 data->drawstate.last_command = cmd->command;
1049 cmd = cmd->next;
1050 }
1051
1052 sceGxmEndScene(data->gxm_context, NULL, NULL);
1053 data->drawing = false;
1054
1055 return true;
1056}
1057
1058void read_pixels(int x, int y, size_t width, size_t height, void *data)
1059{
1060 SceDisplayFrameBuf pParam;
1061 int i, j;
1062 Uint32 *out32;
1063 Uint32 *in32;
1064
1065 pParam.size = sizeof(SceDisplayFrameBuf);
1066
1067 sceDisplayGetFrameBuf(&pParam, SCE_DISPLAY_SETBUF_NEXTFRAME);
1068
1069 out32 = (Uint32 *)data;
1070 in32 = (Uint32 *)pParam.base;
1071
1072 in32 += (x + y * pParam.pitch);
1073
1074 for (i = 0; i < height; i++) {
1075 for (j = 0; j < width; j++) {
1076 out32[(height - (i + 1)) * width + j] = in32[j];
1077 }
1078 in32 += pParam.pitch;
1079 }
1080}
1081
1082static SDL_Surface *VITA_GXM_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
1083{
1084 Uint32 format = renderer->target ? renderer->target->format : SDL_PIXELFORMAT_ABGR8888;
1085 SDL_Surface *surface;
1086
1087 // TODO: read from texture rendertarget.
1088 if (renderer->target) {
1089 SDL_Unsupported();
1090 return NULL;
1091 }
1092
1093 surface = SDL_CreateSurface(rect->w, rect->h, format);
1094 if (!surface) {
1095 return NULL;
1096 }
1097
1098 int y = rect->y;
1099 if (!renderer->target) {
1100 int w, h;
1101 SDL_GetRenderOutputSize(renderer, &w, &h);
1102 y = (h - y) - rect->h;
1103 }
1104
1105 read_pixels(rect->x, y, rect->w, rect->h, surface->pixels);
1106
1107 // Flip the rows to be top-down if necessary
1108 if (!renderer->target) {
1109 SDL_FlipSurface(surface, SDL_FLIP_VERTICAL);
1110 }
1111 return surface;
1112}
1113
1114static bool VITA_GXM_RenderPresent(SDL_Renderer *renderer)
1115{
1116 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
1117 SceCommonDialogUpdateParam updateParam;
1118
1119 data->displayData.address = data->displayBufferData[data->backBufferIndex];
1120
1121 SDL_memset(&updateParam, 0, sizeof(updateParam));
1122
1123 updateParam.renderTarget.colorFormat = VITA_GXM_COLOR_FORMAT;
1124 updateParam.renderTarget.surfaceType = SCE_GXM_COLOR_SURFACE_LINEAR;
1125 updateParam.renderTarget.width = VITA_GXM_SCREEN_WIDTH;
1126 updateParam.renderTarget.height = VITA_GXM_SCREEN_HEIGHT;
1127 updateParam.renderTarget.strideInPixels = VITA_GXM_SCREEN_STRIDE;
1128
1129 updateParam.renderTarget.colorSurfaceData = data->displayBufferData[data->backBufferIndex];
1130 updateParam.renderTarget.depthSurfaceData = data->depthBufferData;
1131
1132 updateParam.displaySyncObject = (SceGxmSyncObject *)data->displayBufferSync[data->backBufferIndex];
1133
1134 sceCommonDialogUpdate(&updateParam);
1135
1136#ifdef DEBUG_RAZOR
1137 sceGxmPadHeartbeat(
1138 (const SceGxmColorSurface *)&data->displaySurface[data->backBufferIndex],
1139 (SceGxmSyncObject *)data->displayBufferSync[data->backBufferIndex]);
1140#endif
1141
1142 sceGxmDisplayQueueAddEntry(
1143 data->displayBufferSync[data->frontBufferIndex], // OLD fb
1144 data->displayBufferSync[data->backBufferIndex], // NEW fb
1145 &data->displayData);
1146
1147 // update buffer indices
1148 data->frontBufferIndex = data->backBufferIndex;
1149 data->backBufferIndex = (data->backBufferIndex + 1) % VITA_GXM_BUFFERS;
1150 data->pool_index = 0;
1151
1152 data->current_pool = (data->current_pool + 1) % 2;
1153 return true;
1154}
1155
1156static void VITA_GXM_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
1157{
1158 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
1159 VITA_GXM_TextureData *vita_texture = (VITA_GXM_TextureData *)texture->internal;
1160
1161 if (!data) {
1162 return;
1163 }
1164
1165 if (!vita_texture) {
1166 return;
1167 }
1168
1169 if (!vita_texture->tex) {
1170 return;
1171 }
1172
1173 sceGxmFinish(data->gxm_context);
1174
1175 free_gxm_texture(data, vita_texture->tex);
1176
1177 SDL_free(vita_texture);
1178
1179 texture->internal = NULL;
1180}
1181
1182static void VITA_GXM_DestroyRenderer(SDL_Renderer *renderer)
1183{
1184 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
1185 if (data) {
1186 if (!data->initialized) {
1187 return;
1188 }
1189
1190 gxm_finish(renderer);
1191
1192 data->initialized = false;
1193 data->drawing = false;
1194 SDL_free(data);
1195 }
1196}
1197
1198#endif // SDL_VIDEO_RENDER_VITA_GXM
diff --git a/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_memory.c b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_memory.c
new file mode 100644
index 0000000..e37a345
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_memory.c
@@ -0,0 +1,179 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#include "SDL_internal.h"
23
24#ifdef SDL_VIDEO_RENDER_VITA_GXM
25
26#include "SDL_render_vita_gxm_memory.h"
27
28void *vita_mem_alloc(unsigned int type, unsigned int size, unsigned int alignment, unsigned int attribs, SceUID *uid)
29{
30 void *mem;
31
32 if (type == SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW) {
33 size = ALIGN(size, 256 * 1024);
34 } else if (type == SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_NC_RW) {
35 size = ALIGN(size, 1024 * 1024);
36 } else {
37 size = ALIGN(size, 4 * 1024);
38 }
39
40 *uid = sceKernelAllocMemBlock("gpu_mem", type, size, NULL);
41
42 if (*uid < 0) {
43 return NULL;
44 }
45
46 if (sceKernelGetMemBlockBase(*uid, &mem) < 0) {
47 return NULL;
48 }
49
50 if (sceGxmMapMemory(mem, size, attribs) < 0) {
51 return NULL;
52 }
53
54 return mem;
55}
56
57void vita_mem_free(SceUID uid)
58{
59 void *mem = NULL;
60 if (sceKernelGetMemBlockBase(uid, &mem) < 0) {
61 return;
62 }
63 sceGxmUnmapMemory(mem);
64 sceKernelFreeMemBlock(uid);
65}
66
67void *vita_gpu_mem_alloc(VITA_GXM_RenderData *data, unsigned int size)
68{
69 void *mem;
70
71 if (!data->texturePool) {
72 int poolsize;
73 int ret;
74 SceKernelFreeMemorySizeInfo info;
75 info.size = sizeof(SceKernelFreeMemorySizeInfo);
76 sceKernelGetFreeMemorySize(&info);
77
78 poolsize = ALIGN(info.size_cdram, 256 * 1024);
79 if (poolsize > info.size_cdram) {
80 poolsize = ALIGN(info.size_cdram - 256 * 1024, 256 * 1024);
81 }
82 data->texturePoolUID = sceKernelAllocMemBlock("gpu_texture_pool", SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW, poolsize, NULL);
83 if (data->texturePoolUID < 0) {
84 return NULL;
85 }
86
87 ret = sceKernelGetMemBlockBase(data->texturePoolUID, &mem);
88 if (ret < 0) {
89 return NULL;
90 }
91 data->texturePool = sceClibMspaceCreate(mem, poolsize);
92
93 if (!data->texturePool) {
94 return NULL;
95 }
96 ret = sceGxmMapMemory(mem, poolsize, SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE);
97 if (ret < 0) {
98 return NULL;
99 }
100 }
101 return sceClibMspaceMemalign(data->texturePool, SCE_GXM_TEXTURE_ALIGNMENT, size);
102}
103
104void vita_gpu_mem_free(VITA_GXM_RenderData *data, void *ptr)
105{
106 if (data->texturePool) {
107 sceClibMspaceFree(data->texturePool, ptr);
108 }
109}
110
111void vita_gpu_mem_destroy(VITA_GXM_RenderData *data)
112{
113 void *mem = NULL;
114 if (data->texturePool) {
115 sceClibMspaceDestroy(data->texturePool);
116 data->texturePool = NULL;
117 if (sceKernelGetMemBlockBase(data->texturePoolUID, &mem) < 0) {
118 return;
119 }
120 sceGxmUnmapMemory(mem);
121 sceKernelFreeMemBlock(data->texturePoolUID);
122 }
123}
124
125void *vita_mem_vertex_usse_alloc(unsigned int size, SceUID *uid, unsigned int *usse_offset)
126{
127 void *mem = NULL;
128
129 size = ALIGN(size, 4096);
130 *uid = sceKernelAllocMemBlock("vertex_usse", SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE, size, NULL);
131
132 if (sceKernelGetMemBlockBase(*uid, &mem) < 0) {
133 return NULL;
134 }
135 if (sceGxmMapVertexUsseMemory(mem, size, usse_offset) < 0) {
136 return NULL;
137 }
138
139 return mem;
140}
141
142void vita_mem_vertex_usse_free(SceUID uid)
143{
144 void *mem = NULL;
145 if (sceKernelGetMemBlockBase(uid, &mem) < 0) {
146 return;
147 }
148 sceGxmUnmapVertexUsseMemory(mem);
149 sceKernelFreeMemBlock(uid);
150}
151
152void *vita_mem_fragment_usse_alloc(unsigned int size, SceUID *uid, unsigned int *usse_offset)
153{
154 void *mem = NULL;
155
156 size = ALIGN(size, 4096);
157 *uid = sceKernelAllocMemBlock("fragment_usse", SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE, size, NULL);
158
159 if (sceKernelGetMemBlockBase(*uid, &mem) < 0) {
160 return NULL;
161 }
162 if (sceGxmMapFragmentUsseMemory(mem, size, usse_offset) < 0) {
163 return NULL;
164 }
165
166 return mem;
167}
168
169void vita_mem_fragment_usse_free(SceUID uid)
170{
171 void *mem = NULL;
172 if (sceKernelGetMemBlockBase(uid, &mem) < 0) {
173 return;
174 }
175 sceGxmUnmapFragmentUsseMemory(mem);
176 sceKernelFreeMemBlock(uid);
177}
178
179#endif // SDL_VIDEO_RENDER_VITA_GXM
diff --git a/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_memory.h b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_memory.h
new file mode 100644
index 0000000..cc548b3
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_memory.h
@@ -0,0 +1,42 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_RENDER_VITA_GXM_MEMORY_H
23#define SDL_RENDER_VITA_GXM_MEMORY_H
24
25#include <psp2/gxm.h>
26#include <psp2/types.h>
27#include <psp2/kernel/sysmem.h>
28#include "SDL_render_vita_gxm_types.h"
29
30#define ALIGN(x, a) (((x) + ((a)-1)) & ~((a)-1))
31
32void *vita_mem_alloc(unsigned int type, unsigned int size, unsigned int alignment, unsigned int attribs, SceUID *uid);
33void vita_mem_free(SceUID uid);
34void *vita_gpu_mem_alloc(VITA_GXM_RenderData *data, unsigned int size);
35void vita_gpu_mem_free(VITA_GXM_RenderData *data, void *ptr);
36void vita_gpu_mem_destroy(VITA_GXM_RenderData *data);
37void *vita_mem_vertex_usse_alloc(unsigned int size, SceUID *uid, unsigned int *usse_offset);
38void vita_mem_vertex_usse_free(SceUID uid);
39void *vita_mem_fragment_usse_alloc(unsigned int size, SceUID *uid, unsigned int *usse_offset);
40void vita_mem_fragment_usse_free(SceUID uid);
41
42#endif // SDL_RENDER_VITA_GXM_MEMORY_H
diff --git a/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_shaders.h b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_shaders.h
new file mode 100644
index 0000000..ef80e03
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_shaders.h
@@ -0,0 +1,282 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_RENDER_VITA_GXM_SHADERS_H
23#define SDL_RENDER_VITA_GXM_SHADERS_H
24
25#include <psp2/gxm.h>
26
27/* *INDENT-OFF* */ /* clang-format off */
28
29#define gxm_shader_clear_f_size 232
30static const unsigned char gxm_shader_clear_f[gxm_shader_clear_f_size] = {
31 0x47, 0x58, 0x50, 0x00, 0x01, 0x05, 0x50, 0x03,
32 0xe8, 0x00, 0x00, 0x00, 0xa2, 0x55, 0x22, 0x3e,
33 0xc6, 0x7e, 0x77, 0xf1, 0x01, 0x00, 0x18, 0x00,
34 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
35 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
36 0xa4, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
37 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
38 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
39 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40 0x68, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
41 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
44 0x5c, 0x00, 0x00, 0x00, 0xc0, 0x3d, 0x03, 0x00,
45 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
46 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
49 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,
52 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0x00, 0x07, 0x44, 0xfa, 0x02, 0x80, 0x19, 0xf0,
55 0x7e, 0x0d, 0x80, 0x40, 0x0e, 0x00, 0x00, 0x00,
56 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00,
57 0x01, 0xe4, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x75, 0x43, 0x6c, 0x65,
59 0x61, 0x72, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00,
60};
61
62#define gxm_shader_clear_v_size 252
63static const unsigned char gxm_shader_clear_v[gxm_shader_clear_v_size] = {
64 0x47, 0x58, 0x50, 0x00, 0x01, 0x05, 0x50, 0x03,
65 0xfa, 0x00, 0x00, 0x00, 0xdc, 0x25, 0x34, 0x74,
66 0x53, 0x4a, 0x7a, 0x5b, 0x04, 0x00, 0x19, 0x00,
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
69 0xb8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
70 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00,
72 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73 0x74, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
74 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77 0x78, 0x00, 0x00, 0x00, 0xc0, 0x3d, 0x03, 0x00,
78 0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
80 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
81 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
82 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x44, 0xfa,
89 0x01, 0x00, 0x04, 0x90, 0x85, 0x11, 0xa5, 0x08,
90 0x01, 0x80, 0x56, 0x90, 0x81, 0x11, 0x83, 0x08,
91 0x00, 0x00, 0x20, 0xa0, 0x00, 0x50, 0x27, 0xfb,
92 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
93 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94 0x61, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
95 0x6e, 0x00, 0x00, 0x00,
96};
97
98#define gxm_shader_color_f_size 212
99static const unsigned char gxm_shader_color_f[gxm_shader_color_f_size] = {
100 0x47, 0x58, 0x50, 0x00, 0x01, 0x05, 0x50, 0x03,
101 0xd4, 0x00, 0x00, 0x00, 0x9c, 0xd6, 0x9b, 0xf7,
102 0x78, 0x00, 0x5d, 0x31, 0x01, 0x10, 0x18, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0xac, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
106 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
108 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x78, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x6c, 0x00, 0x00, 0x00, 0xc0, 0x3d, 0x03, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
117 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,
121 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
122 0x0f, 0xa0, 0xd0, 0x0e, 0x00, 0x00, 0x00, 0x00,
123 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125 0x00, 0x07, 0x44, 0xfa, 0x02, 0x80, 0x19, 0xa0,
126 0x7e, 0x0d, 0x80, 0x40,
127};
128
129#define gxm_shader_color_v_size 368
130static const unsigned char gxm_shader_color_v[gxm_shader_color_v_size] = {
131 0x47, 0x58, 0x50, 0x00, 0x01, 0x05, 0x50, 0x03,
132 0x6d, 0x01, 0x00, 0x00, 0x09, 0xce, 0x4e, 0xc2,
133 0xe1, 0xcd, 0x24, 0xbc, 0x00, 0x00, 0x19, 0x00,
134 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
135 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
136 0x00, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
137 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
138 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00,
139 0x98, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
140 0x74, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
144 0xb8, 0x00, 0x00, 0x00, 0xc0, 0x3d, 0x03, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
146 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00,
149 0x01, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00,
151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x09,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x06, 0x43, 0x00, 0x61,
155 0x86, 0x81, 0xa2, 0x00, 0x07, 0x53, 0x40, 0x61,
156 0x86, 0x81, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x40, 0x01, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x44, 0xfa,
159 0x80, 0x00, 0x08, 0x83, 0x21, 0x1d, 0x80, 0x38,
160 0x00, 0x00, 0xf0, 0x83, 0x20, 0x0d, 0x80, 0x38,
161 0x0a, 0x84, 0xb9, 0xff, 0xbc, 0x0d, 0xc0, 0x40,
162 0x02, 0x11, 0x45, 0xcf, 0x80, 0x8f, 0xb1, 0x18,
163 0x00, 0x11, 0x01, 0xc0, 0x81, 0x81, 0xb1, 0x18,
164 0x01, 0xd1, 0x42, 0xc0, 0x81, 0x81, 0xb1, 0x18,
165 0x40, 0x00, 0x10, 0x41, 0x09, 0x05, 0x82, 0x38,
166 0x00, 0x00, 0x20, 0xa0, 0x00, 0x50, 0x27, 0xfb,
167 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
168 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
169 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x2a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
171 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
172 0x21, 0x00, 0x00, 0x00, 0x01, 0xe4, 0x00, 0x00,
173 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x61, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
175 0x6e, 0x00, 0x61, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
176 0x00, 0x77, 0x76, 0x70, 0x00, 0x00, 0x00, 0x00,
177};
178
179#define gxm_shader_texture_f_size 288
180static const unsigned char gxm_shader_texture_f[gxm_shader_texture_f_size] = {
181 0x47, 0x58, 0x50, 0x00, 0x01, 0x05, 0x50, 0x03,
182 0x20, 0x01, 0x00, 0x00, 0xeb, 0x4f, 0xb5, 0xba,
183 0x60, 0xb2, 0xd0, 0x8d, 0x05, 0x18, 0x18, 0x00,
184 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
186 0xc4, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
187 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00,
189 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190 0x78, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x84, 0x00, 0x00, 0x00, 0xc0, 0x3d, 0x03, 0x00,
195 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
197 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
199 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
200 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04,
202 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00,
203 0x00, 0xa9, 0xd0, 0x0e, 0x00, 0x00, 0x00, 0x00,
204 0xf0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x00, 0x07, 0x44, 0xfa, 0x00, 0x00, 0x00, 0x00,
207 0x40, 0x09, 0x00, 0xf8, 0x02, 0x80, 0x99, 0xaf,
208 0xbc, 0x0d, 0xc0, 0x40, 0x06, 0x82, 0xb9, 0xaf,
209 0xbc, 0x0d, 0x80, 0x40, 0x7c, 0x0f, 0x04, 0x00,
210 0x86, 0x47, 0xa4, 0x10, 0x30, 0x00, 0x00, 0x00,
211 0x02, 0x04, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00,
213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x00,
217};
218
219#define gxm_shader_texture_v_size 400
220static const unsigned char gxm_shader_texture_v[gxm_shader_texture_v_size] = {
221 0x47, 0x58, 0x50, 0x00, 0x01, 0x05, 0x50, 0x03,
222 0x8f, 0x01, 0x00, 0x00, 0x60, 0x1e, 0x69, 0x97,
223 0x82, 0x7e, 0x0c, 0xac, 0x00, 0x00, 0x19, 0x00,
224 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
226 0x08, 0x01, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
227 0x0c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00,
229 0x98, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
230 0x74, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
234 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x3d, 0x03, 0x00,
235 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00,
239 0x01, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00,
240 0x00, 0x00, 0x00, 0x00, 0x33, 0x0f, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0a,
243 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0x06, 0x43, 0x00, 0x61,
245 0x86, 0x81, 0xa2, 0x00, 0x07, 0x53, 0x40, 0x61,
246 0x86, 0x81, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0x40, 0x01, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x44, 0xfa,
249 0x01, 0x0e, 0x01, 0x01, 0x02, 0x00, 0x10, 0xfa,
250 0x80, 0x00, 0x08, 0x83, 0x21, 0x25, 0x80, 0x38,
251 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x14, 0xfa,
252 0x00, 0x00, 0xf0, 0x83, 0x20, 0x0d, 0x80, 0x38,
253 0x0a, 0x84, 0xb9, 0xff, 0xbc, 0x0d, 0xc0, 0x40,
254 0x02, 0x11, 0x45, 0xcf, 0x80, 0x8f, 0xb1, 0x18,
255 0x00, 0x11, 0x01, 0xc0, 0x81, 0x81, 0xb1, 0x18,
256 0x01, 0xd1, 0x42, 0xc0, 0x81, 0x81, 0xb1, 0x18,
257 0x00, 0x00, 0x20, 0xa0, 0x00, 0x50, 0x27, 0xfb,
258 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
259 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
260 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x3a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
262 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
263 0x34, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
264 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
265 0x2b, 0x00, 0x00, 0x00, 0x01, 0xe4, 0x00, 0x00,
266 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x61, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
268 0x6e, 0x00, 0x61, 0x54, 0x65, 0x78, 0x63, 0x6f,
269 0x6f, 0x72, 0x64, 0x00, 0x61, 0x43, 0x6f, 0x6c,
270 0x6f, 0x72, 0x00, 0x77, 0x76, 0x70, 0x00, 0x00,
271};
272
273/* *INDENT-ON* */ /* clang-format on */
274
275static const SceGxmProgram *const clearVertexProgramGxp = (const SceGxmProgram *)gxm_shader_clear_v;
276static const SceGxmProgram *const clearFragmentProgramGxp = (const SceGxmProgram *)gxm_shader_clear_f;
277static const SceGxmProgram *const colorVertexProgramGxp = (const SceGxmProgram *)gxm_shader_color_v;
278static const SceGxmProgram *const colorFragmentProgramGxp = (const SceGxmProgram *)gxm_shader_color_f;
279static const SceGxmProgram *const textureVertexProgramGxp = (const SceGxmProgram *)gxm_shader_texture_v;
280static const SceGxmProgram *const textureFragmentProgramGxp = (const SceGxmProgram *)gxm_shader_texture_f;
281
282#endif // SDL_RENDER_VITA_GXM_SHADERS_H
diff --git a/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_tools.c b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_tools.c
new file mode 100644
index 0000000..9140a62
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_tools.c
@@ -0,0 +1,1213 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_VITA_GXM
24
25#include "../SDL_sysrender.h"
26
27#include <psp2/kernel/processmgr.h>
28#include <psp2/appmgr.h>
29#include <psp2/display.h>
30#include <psp2/gxm.h>
31#include <psp2/types.h>
32#include <psp2/kernel/sysmem.h>
33#include <psp2/message_dialog.h>
34
35#include <stdio.h>
36#include <string.h>
37#include <math.h>
38#include <stdarg.h>
39#include <stdlib.h>
40
41#include "SDL_render_vita_gxm_tools.h"
42#include "SDL_render_vita_gxm_types.h"
43#include "SDL_render_vita_gxm_memory.h"
44#include "SDL_render_vita_gxm_shaders.h"
45
46void init_orthographic_matrix(float *m, float left, float right, float bottom, float top, float near, float far)
47{
48 m[0x0] = 2.0f / (right - left);
49 m[0x4] = 0.0f;
50 m[0x8] = 0.0f;
51 m[0xC] = -(right + left) / (right - left);
52
53 m[0x1] = 0.0f;
54 m[0x5] = 2.0f / (top - bottom);
55 m[0x9] = 0.0f;
56 m[0xD] = -(top + bottom) / (top - bottom);
57
58 m[0x2] = 0.0f;
59 m[0x6] = 0.0f;
60 m[0xA] = -2.0f / (far - near);
61 m[0xE] = (far + near) / (far - near);
62
63 m[0x3] = 0.0f;
64 m[0x7] = 0.0f;
65 m[0xB] = 0.0f;
66 m[0xF] = 1.0f;
67}
68
69static void *patcher_host_alloc(void *user_data, unsigned int size)
70{
71 void *mem = SDL_malloc(size);
72 (void)user_data;
73 return mem;
74}
75
76static void patcher_host_free(void *user_data, void *mem)
77{
78 (void)user_data;
79 SDL_free(mem);
80}
81
82void *pool_malloc(VITA_GXM_RenderData *data, unsigned int size)
83{
84
85 if ((data->pool_index + size) < VITA_GXM_POOL_SIZE) {
86 void *addr = (void *)((unsigned int)data->pool_addr[data->current_pool] + data->pool_index);
87 data->pool_index += size;
88 return addr;
89 }
90 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "POOL OVERFLOW");
91 return NULL;
92}
93
94void *pool_memalign(VITA_GXM_RenderData *data, unsigned int size, unsigned int alignment)
95{
96 unsigned int new_index = (data->pool_index + alignment - 1) & ~(alignment - 1);
97 if ((new_index + size) < VITA_GXM_POOL_SIZE) {
98 void *addr = (void *)((unsigned int)data->pool_addr[data->current_pool] + new_index);
99 data->pool_index = new_index + size;
100 return addr;
101 }
102 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "POOL OVERFLOW");
103 return NULL;
104}
105
106static int tex_format_to_bytespp(SceGxmTextureFormat format)
107{
108 switch (format & 0x9f000000U) {
109 case SCE_GXM_TEXTURE_BASE_FORMAT_U8:
110 case SCE_GXM_TEXTURE_BASE_FORMAT_S8:
111 case SCE_GXM_TEXTURE_BASE_FORMAT_P8:
112 case SCE_GXM_TEXTURE_BASE_FORMAT_YUV420P2: // YUV actually uses 12 bits per pixel. UV planes bits/mem are handled elsewhere
113 case SCE_GXM_TEXTURE_BASE_FORMAT_YUV420P3:
114 return 1;
115 case SCE_GXM_TEXTURE_BASE_FORMAT_U4U4U4U4:
116 case SCE_GXM_TEXTURE_BASE_FORMAT_U8U3U3U2:
117 case SCE_GXM_TEXTURE_BASE_FORMAT_U1U5U5U5:
118 case SCE_GXM_TEXTURE_BASE_FORMAT_U5U6U5:
119 case SCE_GXM_TEXTURE_BASE_FORMAT_S5S5U6:
120 case SCE_GXM_TEXTURE_BASE_FORMAT_U8U8:
121 case SCE_GXM_TEXTURE_BASE_FORMAT_S8S8:
122 return 2;
123 case SCE_GXM_TEXTURE_BASE_FORMAT_U8U8U8:
124 case SCE_GXM_TEXTURE_BASE_FORMAT_S8S8S8:
125 return 3;
126 case SCE_GXM_TEXTURE_BASE_FORMAT_U8U8U8U8:
127 case SCE_GXM_TEXTURE_BASE_FORMAT_S8S8S8S8:
128 case SCE_GXM_TEXTURE_BASE_FORMAT_F32:
129 case SCE_GXM_TEXTURE_BASE_FORMAT_U32:
130 case SCE_GXM_TEXTURE_BASE_FORMAT_S32:
131 default:
132 return 4;
133 }
134}
135
136static void display_callback(const void *callback_data)
137{
138 SceDisplayFrameBuf framebuf;
139 const VITA_GXM_DisplayData *display_data = (const VITA_GXM_DisplayData *)callback_data;
140
141 SDL_memset(&framebuf, 0x00, sizeof(SceDisplayFrameBuf));
142 framebuf.size = sizeof(SceDisplayFrameBuf);
143 framebuf.base = display_data->address;
144 framebuf.pitch = VITA_GXM_SCREEN_STRIDE;
145 framebuf.pixelformat = VITA_GXM_PIXEL_FORMAT;
146 framebuf.width = VITA_GXM_SCREEN_WIDTH;
147 framebuf.height = VITA_GXM_SCREEN_HEIGHT;
148 sceDisplaySetFrameBuf(&framebuf, SCE_DISPLAY_SETBUF_NEXTFRAME);
149
150 if (display_data->wait_vblank) {
151 sceDisplayWaitVblankStart();
152 }
153}
154
155static void free_fragment_programs(VITA_GXM_RenderData *data, fragment_programs *out)
156{
157 sceGxmShaderPatcherReleaseFragmentProgram(data->shaderPatcher, out->color);
158 sceGxmShaderPatcherReleaseFragmentProgram(data->shaderPatcher, out->texture);
159}
160
161static void make_fragment_programs(VITA_GXM_RenderData *data, fragment_programs *out,
162 const SceGxmBlendInfo *blend_info)
163{
164 int err;
165
166 err = sceGxmShaderPatcherCreateFragmentProgram(
167 data->shaderPatcher,
168 data->colorFragmentProgramId,
169 SCE_GXM_OUTPUT_REGISTER_FORMAT_UCHAR4,
170 0,
171 blend_info,
172 colorVertexProgramGxp,
173 &out->color);
174
175 if (err != 0) {
176 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Patcher create fragment failed: %d", err);
177 return;
178 }
179
180 err = sceGxmShaderPatcherCreateFragmentProgram(
181 data->shaderPatcher,
182 data->textureFragmentProgramId,
183 SCE_GXM_OUTPUT_REGISTER_FORMAT_UCHAR4,
184 0,
185 blend_info,
186 textureVertexProgramGxp,
187 &out->texture);
188
189 if (err != 0) {
190 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Patcher create fragment failed: %d", err);
191 return;
192 }
193}
194
195static void set_stencil_mask(VITA_GXM_RenderData *data, float x, float y, float w, float h)
196{
197 void *vertexDefaultBuffer;
198 color_vertex *vertices = (color_vertex *)pool_memalign(
199 data,
200 4 * sizeof(color_vertex), // 4 vertices
201 sizeof(color_vertex));
202
203 vertices[0].x = x;
204 vertices[0].y = y;
205 vertices[0].color.r = 0;
206 vertices[0].color.g = 0;
207 vertices[0].color.b = 0;
208 vertices[0].color.a = 0;
209
210 vertices[1].x = x + w;
211 vertices[1].y = y;
212 vertices[1].color.r = 0;
213 vertices[1].color.g = 0;
214 vertices[1].color.b = 0;
215 vertices[1].color.a = 0;
216
217 vertices[2].x = x;
218 vertices[2].y = y + h;
219 vertices[2].color.r = 0;
220 vertices[2].color.g = 0;
221 vertices[2].color.b = 0;
222 vertices[2].color.a = 0;
223
224 vertices[3].x = x + w;
225 vertices[3].y = y + h;
226 vertices[3].color.r = 0;
227 vertices[3].color.g = 0;
228 vertices[3].color.b = 0;
229 vertices[3].color.a = 0;
230
231 data->drawstate.fragment_program = data->colorFragmentProgram;
232 data->drawstate.vertex_program = data->colorVertexProgram;
233 sceGxmSetVertexProgram(data->gxm_context, data->colorVertexProgram);
234 sceGxmSetFragmentProgram(data->gxm_context, data->colorFragmentProgram);
235
236 sceGxmReserveVertexDefaultUniformBuffer(data->gxm_context, &vertexDefaultBuffer);
237 sceGxmSetUniformDataF(vertexDefaultBuffer, data->colorWvpParam, 0, 16, data->ortho_matrix);
238
239 sceGxmSetVertexStream(data->gxm_context, 0, vertices);
240 sceGxmDraw(data->gxm_context, SCE_GXM_PRIMITIVE_TRIANGLE_STRIP, SCE_GXM_INDEX_FORMAT_U16, data->linearIndices, 4);
241}
242
243void set_clip_rectangle(VITA_GXM_RenderData *data, int x_min, int y_min, int x_max, int y_max)
244{
245 if (data->drawing) {
246 // clear the stencil buffer to 0
247 sceGxmSetFrontStencilFunc(
248 data->gxm_context,
249 SCE_GXM_STENCIL_FUNC_NEVER,
250 SCE_GXM_STENCIL_OP_ZERO,
251 SCE_GXM_STENCIL_OP_ZERO,
252 SCE_GXM_STENCIL_OP_ZERO,
253 0xFF,
254 0xFF);
255
256 set_stencil_mask(data, 0, 0, VITA_GXM_SCREEN_WIDTH, VITA_GXM_SCREEN_HEIGHT);
257
258 // set the stencil to 1 in the desired region
259 sceGxmSetFrontStencilFunc(
260 data->gxm_context,
261 SCE_GXM_STENCIL_FUNC_NEVER,
262 SCE_GXM_STENCIL_OP_REPLACE,
263 SCE_GXM_STENCIL_OP_REPLACE,
264 SCE_GXM_STENCIL_OP_REPLACE,
265 0xFF,
266 0xFF);
267
268 set_stencil_mask(data, x_min, y_min, x_max - x_min, y_max - y_min);
269
270 // set the stencil function to only accept pixels where the stencil is 1
271 sceGxmSetFrontStencilFunc(
272 data->gxm_context,
273 SCE_GXM_STENCIL_FUNC_EQUAL,
274 SCE_GXM_STENCIL_OP_KEEP,
275 SCE_GXM_STENCIL_OP_KEEP,
276 SCE_GXM_STENCIL_OP_KEEP,
277 0xFF,
278 0xFF);
279 }
280}
281
282void unset_clip_rectangle(VITA_GXM_RenderData *data)
283{
284 sceGxmSetFrontStencilFunc(
285 data->gxm_context,
286 SCE_GXM_STENCIL_FUNC_ALWAYS,
287 SCE_GXM_STENCIL_OP_KEEP,
288 SCE_GXM_STENCIL_OP_KEEP,
289 SCE_GXM_STENCIL_OP_KEEP,
290 0xFF,
291 0xFF);
292}
293
294int gxm_init(SDL_Renderer *renderer)
295{
296 unsigned int i, x, y;
297 int err;
298 void *vdmRingBuffer;
299 void *vertexRingBuffer;
300 void *fragmentRingBuffer;
301 unsigned int fragmentUsseRingBufferOffset;
302 void *fragmentUsseRingBuffer;
303 unsigned int patcherVertexUsseOffset;
304 unsigned int patcherFragmentUsseOffset;
305 void *patcherBuffer;
306 void *patcherVertexUsse;
307 void *patcherFragmentUsse;
308
309 SceGxmRenderTargetParams renderTargetParams;
310 SceGxmShaderPatcherParams patcherParams;
311
312 // compute the memory footprint of the depth buffer
313 const unsigned int alignedWidth = ALIGN(VITA_GXM_SCREEN_WIDTH, SCE_GXM_TILE_SIZEX);
314 const unsigned int alignedHeight = ALIGN(VITA_GXM_SCREEN_HEIGHT, SCE_GXM_TILE_SIZEY);
315
316 unsigned int sampleCount = alignedWidth * alignedHeight;
317 unsigned int depthStrideInSamples = alignedWidth;
318
319 // set buffer sizes for this sample
320 const unsigned int patcherBufferSize = 64 * 1024;
321 const unsigned int patcherVertexUsseSize = 64 * 1024;
322 const unsigned int patcherFragmentUsseSize = 64 * 1024;
323
324 // Fill SceGxmBlendInfo
325 static const SceGxmBlendInfo blend_info_none = {
326 .colorFunc = SCE_GXM_BLEND_FUNC_NONE,
327 .alphaFunc = SCE_GXM_BLEND_FUNC_NONE,
328 .colorSrc = SCE_GXM_BLEND_FACTOR_ZERO,
329 .colorDst = SCE_GXM_BLEND_FACTOR_ZERO,
330 .alphaSrc = SCE_GXM_BLEND_FACTOR_ZERO,
331 .alphaDst = SCE_GXM_BLEND_FACTOR_ZERO,
332 .colorMask = SCE_GXM_COLOR_MASK_ALL
333 };
334
335 static const SceGxmBlendInfo blend_info_blend = {
336 .colorFunc = SCE_GXM_BLEND_FUNC_ADD,
337 .alphaFunc = SCE_GXM_BLEND_FUNC_ADD,
338 .colorSrc = SCE_GXM_BLEND_FACTOR_SRC_ALPHA,
339 .colorDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
340 .alphaSrc = SCE_GXM_BLEND_FACTOR_ONE,
341 .alphaDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
342 .colorMask = SCE_GXM_COLOR_MASK_ALL
343 };
344
345 static const SceGxmBlendInfo blend_info_add = {
346 .colorFunc = SCE_GXM_BLEND_FUNC_ADD,
347 .alphaFunc = SCE_GXM_BLEND_FUNC_ADD,
348 .colorSrc = SCE_GXM_BLEND_FACTOR_SRC_ALPHA,
349 .colorDst = SCE_GXM_BLEND_FACTOR_ONE,
350 .alphaSrc = SCE_GXM_BLEND_FACTOR_ZERO,
351 .alphaDst = SCE_GXM_BLEND_FACTOR_ONE,
352 .colorMask = SCE_GXM_COLOR_MASK_ALL
353 };
354
355 static const SceGxmBlendInfo blend_info_mod = {
356 .colorFunc = SCE_GXM_BLEND_FUNC_ADD,
357 .alphaFunc = SCE_GXM_BLEND_FUNC_ADD,
358
359 .colorSrc = SCE_GXM_BLEND_FACTOR_ZERO,
360 .colorDst = SCE_GXM_BLEND_FACTOR_SRC_COLOR,
361
362 .alphaSrc = SCE_GXM_BLEND_FACTOR_ZERO,
363 .alphaDst = SCE_GXM_BLEND_FACTOR_ONE,
364 .colorMask = SCE_GXM_COLOR_MASK_ALL
365 };
366
367 static const SceGxmBlendInfo blend_info_mul = {
368 .colorFunc = SCE_GXM_BLEND_FUNC_ADD,
369 .alphaFunc = SCE_GXM_BLEND_FUNC_ADD,
370 .colorSrc = SCE_GXM_BLEND_FACTOR_DST_COLOR,
371 .colorDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
372 .alphaSrc = SCE_GXM_BLEND_FACTOR_DST_ALPHA,
373 .alphaDst = SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
374 .colorMask = SCE_GXM_COLOR_MASK_ALL
375 };
376
377 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
378
379 SceGxmInitializeParams initializeParams;
380 SDL_memset(&initializeParams, 0, sizeof(SceGxmInitializeParams));
381 initializeParams.flags = 0;
382 initializeParams.displayQueueMaxPendingCount = VITA_GXM_PENDING_SWAPS;
383 initializeParams.displayQueueCallback = display_callback;
384 initializeParams.displayQueueCallbackDataSize = sizeof(VITA_GXM_DisplayData);
385 initializeParams.parameterBufferSize = SCE_GXM_DEFAULT_PARAMETER_BUFFER_SIZE;
386
387 err = sceGxmInitialize(&initializeParams);
388
389 if (err != 0) {
390 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "gxm init failed: %d", err);
391 return err;
392 }
393
394 // allocate ring buffer memory using default sizes
395 vdmRingBuffer = vita_mem_alloc(
396 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
397 SCE_GXM_DEFAULT_VDM_RING_BUFFER_SIZE,
398 4,
399 SCE_GXM_MEMORY_ATTRIB_READ,
400 &data->vdmRingBufferUid);
401
402 vertexRingBuffer = vita_mem_alloc(
403 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
404 SCE_GXM_DEFAULT_VERTEX_RING_BUFFER_SIZE,
405 4,
406 SCE_GXM_MEMORY_ATTRIB_READ,
407 &data->vertexRingBufferUid);
408
409 fragmentRingBuffer = vita_mem_alloc(
410 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
411 SCE_GXM_DEFAULT_FRAGMENT_RING_BUFFER_SIZE,
412 4,
413 SCE_GXM_MEMORY_ATTRIB_READ,
414 &data->fragmentRingBufferUid);
415
416 fragmentUsseRingBuffer = vita_mem_fragment_usse_alloc(
417 SCE_GXM_DEFAULT_FRAGMENT_USSE_RING_BUFFER_SIZE,
418 &data->fragmentUsseRingBufferUid,
419 &fragmentUsseRingBufferOffset);
420
421 SDL_memset(&data->contextParams, 0, sizeof(SceGxmContextParams));
422 data->contextParams.hostMem = SDL_malloc(SCE_GXM_MINIMUM_CONTEXT_HOST_MEM_SIZE);
423 data->contextParams.hostMemSize = SCE_GXM_MINIMUM_CONTEXT_HOST_MEM_SIZE;
424 data->contextParams.vdmRingBufferMem = vdmRingBuffer;
425 data->contextParams.vdmRingBufferMemSize = SCE_GXM_DEFAULT_VDM_RING_BUFFER_SIZE;
426 data->contextParams.vertexRingBufferMem = vertexRingBuffer;
427 data->contextParams.vertexRingBufferMemSize = SCE_GXM_DEFAULT_VERTEX_RING_BUFFER_SIZE;
428 data->contextParams.fragmentRingBufferMem = fragmentRingBuffer;
429 data->contextParams.fragmentRingBufferMemSize = SCE_GXM_DEFAULT_FRAGMENT_RING_BUFFER_SIZE;
430 data->contextParams.fragmentUsseRingBufferMem = fragmentUsseRingBuffer;
431 data->contextParams.fragmentUsseRingBufferMemSize = SCE_GXM_DEFAULT_FRAGMENT_USSE_RING_BUFFER_SIZE;
432 data->contextParams.fragmentUsseRingBufferOffset = fragmentUsseRingBufferOffset;
433
434 err = sceGxmCreateContext(&data->contextParams, &data->gxm_context);
435 if (err != 0) {
436 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "create context failed: %d", err);
437 return err;
438 }
439
440 // set up parameters
441 SDL_memset(&renderTargetParams, 0, sizeof(SceGxmRenderTargetParams));
442 renderTargetParams.flags = 0;
443 renderTargetParams.width = VITA_GXM_SCREEN_WIDTH;
444 renderTargetParams.height = VITA_GXM_SCREEN_HEIGHT;
445 renderTargetParams.scenesPerFrame = 1;
446 renderTargetParams.multisampleMode = 0;
447 renderTargetParams.multisampleLocations = 0;
448 renderTargetParams.driverMemBlock = -1; // Invalid UID
449
450 // create the render target
451 err = sceGxmCreateRenderTarget(&renderTargetParams, &data->renderTarget);
452 if (err != 0) {
453 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "render target creation failed: %d", err);
454 return err;
455 }
456
457 // allocate memory and sync objects for display buffers
458 for (i = 0; i < VITA_GXM_BUFFERS; i++) {
459
460 // allocate memory for display
461 data->displayBufferData[i] = vita_mem_alloc(
462 SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW,
463 4 * VITA_GXM_SCREEN_STRIDE * VITA_GXM_SCREEN_HEIGHT,
464 SCE_GXM_COLOR_SURFACE_ALIGNMENT,
465 SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
466 &data->displayBufferUid[i]);
467
468 // SDL_memset the buffer to black
469 for (y = 0; y < VITA_GXM_SCREEN_HEIGHT; y++) {
470 unsigned int *row = (unsigned int *)data->displayBufferData[i] + y * VITA_GXM_SCREEN_STRIDE;
471 for (x = 0; x < VITA_GXM_SCREEN_WIDTH; x++) {
472 row[x] = 0xff000000;
473 }
474 }
475
476 // initialize a color surface for this display buffer
477 err = sceGxmColorSurfaceInit(
478 &data->displaySurface[i],
479 VITA_GXM_COLOR_FORMAT,
480 SCE_GXM_COLOR_SURFACE_LINEAR,
481 SCE_GXM_COLOR_SURFACE_SCALE_NONE,
482 SCE_GXM_OUTPUT_REGISTER_SIZE_32BIT,
483 VITA_GXM_SCREEN_WIDTH,
484 VITA_GXM_SCREEN_HEIGHT,
485 VITA_GXM_SCREEN_STRIDE,
486 data->displayBufferData[i]);
487
488 if (err != 0) {
489 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "color surface init failed: %d", err);
490 return err;
491 }
492
493 // create a sync object that we will associate with this buffer
494 err = sceGxmSyncObjectCreate(&data->displayBufferSync[i]);
495 if (err != 0) {
496 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "sync object creation failed: %d", err);
497 return err;
498 }
499 }
500
501 // allocate the depth buffer
502 data->depthBufferData = vita_mem_alloc(
503 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
504 4 * sampleCount,
505 SCE_GXM_DEPTHSTENCIL_SURFACE_ALIGNMENT,
506 SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
507 &data->depthBufferUid);
508
509 // allocate the stencil buffer
510 data->stencilBufferData = vita_mem_alloc(
511 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
512 4 * sampleCount,
513 SCE_GXM_DEPTHSTENCIL_SURFACE_ALIGNMENT,
514 SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
515 &data->stencilBufferUid);
516
517 // create the SceGxmDepthStencilSurface structure
518 err = sceGxmDepthStencilSurfaceInit(
519 &data->depthSurface,
520 SCE_GXM_DEPTH_STENCIL_FORMAT_S8D24,
521 SCE_GXM_DEPTH_STENCIL_SURFACE_TILED,
522 depthStrideInSamples,
523 data->depthBufferData,
524 data->stencilBufferData);
525
526 // set the stencil test reference (this is currently assumed to always remain 1 after here for region clipping)
527 sceGxmSetFrontStencilRef(data->gxm_context, 1);
528
529 // set the stencil function (this wouldn't actually be needed, as the set clip rectangle function has to call this at the beginning of every scene)
530 sceGxmSetFrontStencilFunc(
531 data->gxm_context,
532 SCE_GXM_STENCIL_FUNC_ALWAYS,
533 SCE_GXM_STENCIL_OP_KEEP,
534 SCE_GXM_STENCIL_OP_KEEP,
535 SCE_GXM_STENCIL_OP_KEEP,
536 0xFF,
537 0xFF);
538
539 // allocate memory for buffers and USSE code
540 patcherBuffer = vita_mem_alloc(
541 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
542 patcherBufferSize,
543 4,
544 SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
545 &data->patcherBufferUid);
546
547 patcherVertexUsse = vita_mem_vertex_usse_alloc(
548 patcherVertexUsseSize,
549 &data->patcherVertexUsseUid,
550 &patcherVertexUsseOffset);
551
552 patcherFragmentUsse = vita_mem_fragment_usse_alloc(
553 patcherFragmentUsseSize,
554 &data->patcherFragmentUsseUid,
555 &patcherFragmentUsseOffset);
556
557 // create a shader patcher
558 SDL_memset(&patcherParams, 0, sizeof(SceGxmShaderPatcherParams));
559 patcherParams.userData = NULL;
560 patcherParams.hostAllocCallback = &patcher_host_alloc;
561 patcherParams.hostFreeCallback = &patcher_host_free;
562 patcherParams.bufferAllocCallback = NULL;
563 patcherParams.bufferFreeCallback = NULL;
564 patcherParams.bufferMem = patcherBuffer;
565 patcherParams.bufferMemSize = patcherBufferSize;
566 patcherParams.vertexUsseAllocCallback = NULL;
567 patcherParams.vertexUsseFreeCallback = NULL;
568 patcherParams.vertexUsseMem = patcherVertexUsse;
569 patcherParams.vertexUsseMemSize = patcherVertexUsseSize;
570 patcherParams.vertexUsseOffset = patcherVertexUsseOffset;
571 patcherParams.fragmentUsseAllocCallback = NULL;
572 patcherParams.fragmentUsseFreeCallback = NULL;
573 patcherParams.fragmentUsseMem = patcherFragmentUsse;
574 patcherParams.fragmentUsseMemSize = patcherFragmentUsseSize;
575 patcherParams.fragmentUsseOffset = patcherFragmentUsseOffset;
576
577 err = sceGxmShaderPatcherCreate(&patcherParams, &data->shaderPatcher);
578 if (err != 0) {
579 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "shader patcher creation failed: %d", err);
580 return err;
581 }
582
583 // check the shaders
584 err = sceGxmProgramCheck(clearVertexProgramGxp);
585 if (err != 0) {
586 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "check program (clear vertex) failed: %d", err);
587 return err;
588 }
589
590 err = sceGxmProgramCheck(clearFragmentProgramGxp);
591 if (err != 0) {
592 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "check program (clear fragment) failed: %d", err);
593 return err;
594 }
595
596 err = sceGxmProgramCheck(colorVertexProgramGxp);
597 if (err != 0) {
598 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "check program (color vertex) failed: %d", err);
599 return err;
600 }
601
602 err = sceGxmProgramCheck(colorFragmentProgramGxp);
603 if (err != 0) {
604 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "check program (color fragment) failed: %d", err);
605 return err;
606 }
607
608 err = sceGxmProgramCheck(textureVertexProgramGxp);
609 if (err != 0) {
610 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "check program (texture vertex) failed: %d", err);
611 return err;
612 }
613
614 err = sceGxmProgramCheck(textureFragmentProgramGxp);
615 if (err != 0) {
616 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "check program (texture fragment) failed: %d", err);
617 return err;
618 }
619
620 // register programs with the patcher
621 err = sceGxmShaderPatcherRegisterProgram(data->shaderPatcher, clearVertexProgramGxp, &data->clearVertexProgramId);
622 if (err != 0) {
623 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "register program (clear vertex) failed: %d", err);
624 return err;
625 }
626
627 err = sceGxmShaderPatcherRegisterProgram(data->shaderPatcher, clearFragmentProgramGxp, &data->clearFragmentProgramId);
628 if (err != 0) {
629 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "register program (clear fragment) failed: %d", err);
630 return err;
631 }
632
633 err = sceGxmShaderPatcherRegisterProgram(data->shaderPatcher, colorVertexProgramGxp, &data->colorVertexProgramId);
634 if (err != 0) {
635 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "register program (color vertex) failed: %d", err);
636 return err;
637 }
638
639 err = sceGxmShaderPatcherRegisterProgram(data->shaderPatcher, colorFragmentProgramGxp, &data->colorFragmentProgramId);
640 if (err != 0) {
641 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "register program (color fragment) failed: %d", err);
642 return err;
643 }
644
645 err = sceGxmShaderPatcherRegisterProgram(data->shaderPatcher, textureVertexProgramGxp, &data->textureVertexProgramId);
646 if (err != 0) {
647 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "register program (texture vertex) failed: %d", err);
648 return err;
649 }
650
651 err = sceGxmShaderPatcherRegisterProgram(data->shaderPatcher, textureFragmentProgramGxp, &data->textureFragmentProgramId);
652 if (err != 0) {
653 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "register program (texture fragment) failed: %d", err);
654 return err;
655 }
656
657 {
658 // get attributes by name to create vertex format bindings
659 const SceGxmProgramParameter *paramClearPositionAttribute = sceGxmProgramFindParameterByName(clearVertexProgramGxp, "aPosition");
660
661 // create clear vertex format
662 SceGxmVertexAttribute clearVertexAttributes[1];
663 SceGxmVertexStream clearVertexStreams[1];
664 clearVertexAttributes[0].streamIndex = 0;
665 clearVertexAttributes[0].offset = 0;
666 clearVertexAttributes[0].format = SCE_GXM_ATTRIBUTE_FORMAT_F32;
667 clearVertexAttributes[0].componentCount = 2;
668 clearVertexAttributes[0].regIndex = sceGxmProgramParameterGetResourceIndex(paramClearPositionAttribute);
669 clearVertexStreams[0].stride = sizeof(clear_vertex);
670 clearVertexStreams[0].indexSource = SCE_GXM_INDEX_SOURCE_INDEX_16BIT;
671
672 // create clear programs
673 err = sceGxmShaderPatcherCreateVertexProgram(
674 data->shaderPatcher,
675 data->clearVertexProgramId,
676 clearVertexAttributes,
677 1,
678 clearVertexStreams,
679 1,
680 &data->clearVertexProgram);
681 if (err != 0) {
682 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "create program (clear vertex) failed: %d", err);
683 return err;
684 }
685
686 err = sceGxmShaderPatcherCreateFragmentProgram(
687 data->shaderPatcher,
688 data->clearFragmentProgramId,
689 SCE_GXM_OUTPUT_REGISTER_FORMAT_UCHAR4,
690 0,
691 NULL,
692 clearVertexProgramGxp,
693 &data->clearFragmentProgram);
694 if (err != 0) {
695 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "create program (clear fragment) failed: %d", err);
696 return err;
697 }
698
699 // create the clear triangle vertex/index data
700 data->clearVertices = (clear_vertex *)vita_mem_alloc(
701 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
702 3 * sizeof(clear_vertex),
703 4,
704 SCE_GXM_MEMORY_ATTRIB_READ,
705 &data->clearVerticesUid);
706 }
707
708 // Allocate a 64k * 2 bytes = 128 KiB buffer and store all possible
709 // 16-bit indices in linear ascending order, so we can use this for
710 // all drawing operations where we don't want to use indexing.
711 data->linearIndices = (uint16_t *)vita_mem_alloc(
712 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
713 UINT16_MAX * sizeof(uint16_t),
714 sizeof(uint16_t),
715 SCE_GXM_MEMORY_ATTRIB_READ,
716 &data->linearIndicesUid);
717
718 for (i = 0; i <= UINT16_MAX; ++i) {
719 data->linearIndices[i] = i;
720 }
721
722 data->clearVertices[0].x = -1.0f;
723 data->clearVertices[0].y = -1.0f;
724 data->clearVertices[1].x = 3.0f;
725 data->clearVertices[1].y = -1.0f;
726 data->clearVertices[2].x = -1.0f;
727 data->clearVertices[2].y = 3.0f;
728
729 {
730 const SceGxmProgramParameter *paramColorPositionAttribute = sceGxmProgramFindParameterByName(colorVertexProgramGxp, "aPosition");
731
732 const SceGxmProgramParameter *paramColorColorAttribute = sceGxmProgramFindParameterByName(colorVertexProgramGxp, "aColor");
733
734 // create color vertex format
735 SceGxmVertexAttribute colorVertexAttributes[2];
736 SceGxmVertexStream colorVertexStreams[1];
737 // x,y: 2 float 32 bits
738 colorVertexAttributes[0].streamIndex = 0;
739 colorVertexAttributes[0].offset = 0;
740 colorVertexAttributes[0].format = SCE_GXM_ATTRIBUTE_FORMAT_F32;
741 colorVertexAttributes[0].componentCount = 2; // (x, y)
742 colorVertexAttributes[0].regIndex = sceGxmProgramParameterGetResourceIndex(paramColorPositionAttribute);
743 // color: 4 floats = 4*32 bits
744 colorVertexAttributes[1].streamIndex = 0;
745 colorVertexAttributes[1].offset = 8; // (x, y) * 4 = 8 bytes
746 colorVertexAttributes[1].format = SCE_GXM_ATTRIBUTE_FORMAT_F32;
747 colorVertexAttributes[1].componentCount = 4; // (color)
748 colorVertexAttributes[1].regIndex = sceGxmProgramParameterGetResourceIndex(paramColorColorAttribute);
749 // 16 bit (short) indices
750 colorVertexStreams[0].stride = sizeof(color_vertex);
751 colorVertexStreams[0].indexSource = SCE_GXM_INDEX_SOURCE_INDEX_16BIT;
752
753 // create color shaders
754 err = sceGxmShaderPatcherCreateVertexProgram(
755 data->shaderPatcher,
756 data->colorVertexProgramId,
757 colorVertexAttributes,
758 2,
759 colorVertexStreams,
760 1,
761 &data->colorVertexProgram);
762 if (err != 0) {
763 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "create program (color vertex) failed: %d", err);
764 return err;
765 }
766 }
767
768 {
769 const SceGxmProgramParameter *paramTexturePositionAttribute = sceGxmProgramFindParameterByName(textureVertexProgramGxp, "aPosition");
770 const SceGxmProgramParameter *paramTextureTexcoordAttribute = sceGxmProgramFindParameterByName(textureVertexProgramGxp, "aTexcoord");
771 const SceGxmProgramParameter *paramTextureColorAttribute = sceGxmProgramFindParameterByName(textureVertexProgramGxp, "aColor");
772
773 // create texture vertex format
774 SceGxmVertexAttribute textureVertexAttributes[3];
775 SceGxmVertexStream textureVertexStreams[1];
776 // x,y: 2 float 32 bits
777 textureVertexAttributes[0].streamIndex = 0;
778 textureVertexAttributes[0].offset = 0;
779 textureVertexAttributes[0].format = SCE_GXM_ATTRIBUTE_FORMAT_F32;
780 textureVertexAttributes[0].componentCount = 2; // (x, y)
781 textureVertexAttributes[0].regIndex = sceGxmProgramParameterGetResourceIndex(paramTexturePositionAttribute);
782 // u,v: 2 floats 32 bits
783 textureVertexAttributes[1].streamIndex = 0;
784 textureVertexAttributes[1].offset = 8; // (x, y) * 4 = 8 bytes
785 textureVertexAttributes[1].format = SCE_GXM_ATTRIBUTE_FORMAT_F32;
786 textureVertexAttributes[1].componentCount = 2; // (u, v)
787 textureVertexAttributes[1].regIndex = sceGxmProgramParameterGetResourceIndex(paramTextureTexcoordAttribute);
788 // r,g,b,a: 4 floats 4*32 bits
789 textureVertexAttributes[2].streamIndex = 0;
790 textureVertexAttributes[2].offset = 16; // (x, y, u, v) * 4 = 16 bytes
791 textureVertexAttributes[2].format = SCE_GXM_ATTRIBUTE_FORMAT_F32;
792 textureVertexAttributes[2].componentCount = 4; // (r, g, b, a)
793 textureVertexAttributes[2].regIndex = sceGxmProgramParameterGetResourceIndex(paramTextureColorAttribute);
794 // 16 bit (short) indices
795 textureVertexStreams[0].stride = sizeof(texture_vertex);
796 textureVertexStreams[0].indexSource = SCE_GXM_INDEX_SOURCE_INDEX_16BIT;
797
798 // create texture shaders
799 err = sceGxmShaderPatcherCreateVertexProgram(
800 data->shaderPatcher,
801 data->textureVertexProgramId,
802 textureVertexAttributes,
803 3,
804 textureVertexStreams,
805 1,
806 &data->textureVertexProgram);
807 if (err != 0) {
808 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "create program (texture vertex) failed: %x", err);
809 return err;
810 }
811 }
812
813 // Create variations of the fragment program based on blending mode
814 make_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_none, &blend_info_none);
815 make_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_blend, &blend_info_blend);
816 make_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_add, &blend_info_add);
817 make_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_mod, &blend_info_mod);
818 make_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_mul, &blend_info_mul);
819
820 {
821 // Default to blend blending mode
822 fragment_programs *in = &data->blendFragmentPrograms.blend_mode_blend;
823
824 data->colorFragmentProgram = in->color;
825 data->textureFragmentProgram = in->texture;
826 }
827
828 // find vertex uniforms by name and cache parameter information
829 data->clearClearColorParam = (SceGxmProgramParameter *)sceGxmProgramFindParameterByName(clearFragmentProgramGxp, "uClearColor");
830 data->colorWvpParam = (SceGxmProgramParameter *)sceGxmProgramFindParameterByName(colorVertexProgramGxp, "wvp");
831 data->textureWvpParam = (SceGxmProgramParameter *)sceGxmProgramFindParameterByName(textureVertexProgramGxp, "wvp");
832
833 // Allocate memory for the memory pool
834 data->pool_addr[0] = vita_mem_alloc(
835 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW,
836 VITA_GXM_POOL_SIZE,
837 sizeof(void *),
838 SCE_GXM_MEMORY_ATTRIB_READ,
839 &data->poolUid[0]);
840
841 data->pool_addr[1] = vita_mem_alloc(
842 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW,
843 VITA_GXM_POOL_SIZE,
844 sizeof(void *),
845 SCE_GXM_MEMORY_ATTRIB_READ,
846 &data->poolUid[1]);
847
848 init_orthographic_matrix(data->ortho_matrix, 0.0f, VITA_GXM_SCREEN_WIDTH, VITA_GXM_SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f);
849
850 data->backBufferIndex = 0;
851 data->frontBufferIndex = 0;
852 data->pool_index = 0;
853 data->current_pool = 0;
854 data->currentBlendMode = SDL_BLENDMODE_BLEND;
855
856 return 0;
857}
858
859void gxm_finish(SDL_Renderer *renderer)
860{
861 VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->internal;
862
863 // wait until rendering is done
864 sceGxmFinish(data->gxm_context);
865
866 // clean up allocations
867 sceGxmShaderPatcherReleaseFragmentProgram(data->shaderPatcher, data->clearFragmentProgram);
868 sceGxmShaderPatcherReleaseVertexProgram(data->shaderPatcher, data->clearVertexProgram);
869 sceGxmShaderPatcherReleaseVertexProgram(data->shaderPatcher, data->colorVertexProgram);
870 sceGxmShaderPatcherReleaseVertexProgram(data->shaderPatcher, data->textureVertexProgram);
871
872 free_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_none);
873 free_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_blend);
874 free_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_add);
875 free_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_mod);
876 free_fragment_programs(data, &data->blendFragmentPrograms.blend_mode_mul);
877
878 vita_mem_free(data->linearIndicesUid);
879 vita_mem_free(data->clearVerticesUid);
880
881 // wait until display queue is finished before deallocating display buffers
882 sceGxmDisplayQueueFinish();
883
884 // clean up display queue
885 vita_mem_free(data->depthBufferUid);
886
887 for (size_t i = 0; i < VITA_GXM_BUFFERS; i++) {
888 // clear the buffer then deallocate
889 SDL_memset(data->displayBufferData[i], 0, VITA_GXM_SCREEN_HEIGHT * VITA_GXM_SCREEN_STRIDE * 4);
890 vita_mem_free(data->displayBufferUid[i]);
891
892 // destroy the sync object
893 sceGxmSyncObjectDestroy(data->displayBufferSync[i]);
894 }
895
896 // Free the depth and stencil buffer
897 vita_mem_free(data->depthBufferUid);
898 vita_mem_free(data->stencilBufferUid);
899
900 // unregister programs and destroy shader patcher
901 sceGxmShaderPatcherUnregisterProgram(data->shaderPatcher, data->clearFragmentProgramId);
902 sceGxmShaderPatcherUnregisterProgram(data->shaderPatcher, data->clearVertexProgramId);
903 sceGxmShaderPatcherUnregisterProgram(data->shaderPatcher, data->colorFragmentProgramId);
904 sceGxmShaderPatcherUnregisterProgram(data->shaderPatcher, data->colorVertexProgramId);
905 sceGxmShaderPatcherUnregisterProgram(data->shaderPatcher, data->textureFragmentProgramId);
906 sceGxmShaderPatcherUnregisterProgram(data->shaderPatcher, data->textureVertexProgramId);
907
908 sceGxmShaderPatcherDestroy(data->shaderPatcher);
909 vita_mem_fragment_usse_free(data->patcherFragmentUsseUid);
910 vita_mem_vertex_usse_free(data->patcherVertexUsseUid);
911 vita_mem_free(data->patcherBufferUid);
912
913 // destroy the render target
914 sceGxmDestroyRenderTarget(data->renderTarget);
915
916 // destroy the gxm context
917 sceGxmDestroyContext(data->gxm_context);
918 vita_mem_fragment_usse_free(data->fragmentUsseRingBufferUid);
919 vita_mem_free(data->fragmentRingBufferUid);
920 vita_mem_free(data->vertexRingBufferUid);
921 vita_mem_free(data->vdmRingBufferUid);
922 SDL_free(data->contextParams.hostMem);
923
924 vita_mem_free(data->poolUid[0]);
925 vita_mem_free(data->poolUid[1]);
926 vita_gpu_mem_destroy(data);
927
928 // terminate libgxm
929 sceGxmTerminate();
930}
931
932// textures
933
934void free_gxm_texture(VITA_GXM_RenderData *data, gxm_texture *texture)
935{
936 if (texture) {
937 if (texture->gxm_rendertarget) {
938 sceGxmDestroyRenderTarget(texture->gxm_rendertarget);
939 }
940 if (texture->depth_UID) {
941 vita_mem_free(texture->depth_UID);
942 }
943 if (texture->cdram) {
944 vita_gpu_mem_free(data, sceGxmTextureGetData(&texture->gxm_tex));
945 } else {
946 vita_mem_free(texture->data_UID);
947 }
948 SDL_free(texture);
949 }
950}
951
952SceGxmTextureFormat
953gxm_texture_get_format(const gxm_texture *texture)
954{
955 return sceGxmTextureGetFormat(&texture->gxm_tex);
956}
957
958void *gxm_texture_get_datap(const gxm_texture *texture)
959{
960 return sceGxmTextureGetData(&texture->gxm_tex);
961}
962
963static SceGxmColorFormat tex_format_to_color_format(SceGxmTextureFormat format)
964{
965 switch (format) {
966 case SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ARGB:
967 return SCE_GXM_COLOR_FORMAT_U8U8U8U8_ARGB;
968 case SCE_GXM_TEXTURE_FORMAT_U8U8U8_RGB:
969 return SCE_GXM_COLOR_FORMAT_U8U8U8_RGB;
970 case SCE_GXM_TEXTURE_FORMAT_U8U8U8_BGR:
971 return SCE_GXM_COLOR_FORMAT_U8U8U8_BGR;
972 case SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR:
973 return SCE_GXM_COLOR_FORMAT_U8U8U8U8_ABGR;
974 case SCE_GXM_TEXTURE_FORMAT_U5U6U5_RGB:
975 return SCE_GXM_COLOR_FORMAT_U5U6U5_RGB;
976 case SCE_GXM_TEXTURE_FORMAT_U5U6U5_BGR:
977 return SCE_GXM_COLOR_FORMAT_U5U6U5_BGR;
978 default:
979 return SCE_GXM_COLOR_FORMAT_U8U8U8U8_ABGR;
980 }
981}
982
983gxm_texture *create_gxm_texture(VITA_GXM_RenderData *data, unsigned int w, unsigned int h, SceGxmTextureFormat format, unsigned int isRenderTarget, unsigned int *return_w, unsigned int *return_h, unsigned int *return_pitch, float *return_wscale)
984{
985 gxm_texture *texture = SDL_calloc(1, sizeof(gxm_texture));
986 int aligned_w = ALIGN(w, 8);
987 int texture_w = w;
988 int tex_size = aligned_w * h * tex_format_to_bytespp(format);
989 void *texture_data;
990 int ret;
991
992 *return_wscale = 1.0f;
993
994 // SCE_GXM_TEXTURE_BASE_FORMAT_YUV420P3/P2 based formats require width aligned to 16
995 if ((format & 0x9f000000U) == SCE_GXM_TEXTURE_BASE_FORMAT_YUV420P3 || (format & 0x9f000000U) == SCE_GXM_TEXTURE_BASE_FORMAT_YUV420P2) {
996 aligned_w = ALIGN(w, 16);
997 texture_w = aligned_w;
998 tex_size = aligned_w * h * tex_format_to_bytespp(format);
999 *return_wscale = (float)(w) / texture_w;
1000 // add storage for UV planes
1001 tex_size += (((aligned_w + 1) / 2) * ((h + 1) / 2)) * 2;
1002 }
1003
1004 if (!texture) {
1005 return NULL;
1006 }
1007
1008 *return_w = w;
1009 *return_h = h;
1010 *return_pitch = aligned_w * tex_format_to_bytespp(format);
1011
1012 // Allocate a GPU buffer for the texture
1013 texture_data = vita_gpu_mem_alloc(
1014 data,
1015 tex_size);
1016
1017 // Try SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE in case we're out of VRAM
1018 if (!texture_data) {
1019 SDL_LogWarn(SDL_LOG_CATEGORY_RENDER, "CDRAM texture allocation failed");
1020 texture_data = vita_mem_alloc(
1021 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
1022 tex_size,
1023 SCE_GXM_TEXTURE_ALIGNMENT,
1024 SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
1025 &texture->data_UID);
1026 texture->cdram = 0;
1027 } else {
1028 texture->cdram = 1;
1029 }
1030
1031 if (!texture_data) {
1032 SDL_free(texture);
1033 return NULL;
1034 }
1035
1036 // Clear the texture
1037 SDL_memset(texture_data, 0, tex_size);
1038
1039 // Create the gxm texture
1040 ret = sceGxmTextureInitLinear(&texture->gxm_tex, texture_data, format, texture_w, h, 0);
1041 if (ret < 0) {
1042 free_gxm_texture(data, texture);
1043 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "texture init failed: %x", ret);
1044 return NULL;
1045 }
1046
1047 if (isRenderTarget) {
1048 void *depthBufferData;
1049 const uint32_t alignedWidth = ALIGN(w, SCE_GXM_TILE_SIZEX);
1050 const uint32_t alignedHeight = ALIGN(h, SCE_GXM_TILE_SIZEY);
1051 uint32_t sampleCount = alignedWidth * alignedHeight;
1052 uint32_t depthStrideInSamples = alignedWidth;
1053 const uint32_t alignedColorSurfaceStride = ALIGN(w, 8);
1054
1055 int err = sceGxmColorSurfaceInit(
1056 &texture->gxm_colorsurface,
1057 tex_format_to_color_format(format),
1058 SCE_GXM_COLOR_SURFACE_LINEAR,
1059 SCE_GXM_COLOR_SURFACE_SCALE_NONE,
1060 SCE_GXM_OUTPUT_REGISTER_SIZE_32BIT,
1061 w,
1062 h,
1063 alignedColorSurfaceStride,
1064 texture_data);
1065
1066 if (err < 0) {
1067 free_gxm_texture(data, texture);
1068 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "color surface init failed: %x", err);
1069 return NULL;
1070 }
1071
1072 // allocate it
1073 depthBufferData = vita_mem_alloc(
1074 SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE,
1075 4 * sampleCount,
1076 SCE_GXM_DEPTHSTENCIL_SURFACE_ALIGNMENT,
1077 SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
1078 &texture->depth_UID);
1079
1080 // create the SceGxmDepthStencilSurface structure
1081 err = sceGxmDepthStencilSurfaceInit(
1082 &texture->gxm_depthstencil,
1083 SCE_GXM_DEPTH_STENCIL_FORMAT_S8D24,
1084 SCE_GXM_DEPTH_STENCIL_SURFACE_TILED,
1085 depthStrideInSamples,
1086 depthBufferData,
1087 NULL);
1088
1089 if (err < 0) {
1090 free_gxm_texture(data, texture);
1091 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "depth stencil init failed: %x", err);
1092 return NULL;
1093 }
1094
1095 {
1096 SceGxmRenderTarget *tgt = NULL;
1097
1098 // set up parameters
1099 SceGxmRenderTargetParams renderTargetParams;
1100 SDL_memset(&renderTargetParams, 0, sizeof(SceGxmRenderTargetParams));
1101 renderTargetParams.flags = 0;
1102 renderTargetParams.width = w;
1103 renderTargetParams.height = h;
1104 renderTargetParams.scenesPerFrame = 1;
1105 renderTargetParams.multisampleMode = SCE_GXM_MULTISAMPLE_NONE;
1106 renderTargetParams.multisampleLocations = 0;
1107 renderTargetParams.driverMemBlock = -1;
1108
1109 // create the render target
1110 err = sceGxmCreateRenderTarget(&renderTargetParams, &tgt);
1111
1112 texture->gxm_rendertarget = tgt;
1113
1114 if (err < 0) {
1115 free_gxm_texture(data, texture);
1116 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "create render target failed: %x", err);
1117 return NULL;
1118 }
1119 }
1120 }
1121
1122 return texture;
1123}
1124
1125void gxm_texture_set_filters(gxm_texture *texture, SceGxmTextureFilter min_filter, SceGxmTextureFilter mag_filter)
1126{
1127 sceGxmTextureSetMinFilter(&texture->gxm_tex, min_filter);
1128 sceGxmTextureSetMagFilter(&texture->gxm_tex, mag_filter);
1129}
1130
1131static unsigned int back_buffer_index_for_common_dialog = 0;
1132static unsigned int front_buffer_index_for_common_dialog = 0;
1133struct
1134{
1135 VITA_GXM_DisplayData displayData;
1136 SceGxmSyncObject *sync;
1137 SceGxmColorSurface surf;
1138 SceUID uid;
1139} buffer_for_common_dialog[VITA_GXM_BUFFERS];
1140
1141void gxm_minimal_init_for_common_dialog(void)
1142{
1143 SceGxmInitializeParams initializeParams;
1144 SDL_zero(initializeParams);
1145 initializeParams.flags = 0;
1146 initializeParams.displayQueueMaxPendingCount = VITA_GXM_PENDING_SWAPS;
1147 initializeParams.displayQueueCallback = display_callback;
1148 initializeParams.displayQueueCallbackDataSize = sizeof(VITA_GXM_DisplayData);
1149 initializeParams.parameterBufferSize = SCE_GXM_DEFAULT_PARAMETER_BUFFER_SIZE;
1150 sceGxmInitialize(&initializeParams);
1151}
1152
1153void gxm_minimal_term_for_common_dialog(void)
1154{
1155 sceGxmTerminate();
1156}
1157
1158void gxm_init_for_common_dialog(void)
1159{
1160 for (int i = 0; i < VITA_GXM_BUFFERS; i += 1) {
1161 buffer_for_common_dialog[i].displayData.wait_vblank = true;
1162 buffer_for_common_dialog[i].displayData.address = vita_mem_alloc(
1163 SCE_KERNEL_MEMBLOCK_TYPE_USER_MAIN_PHYCONT_NC_RW,
1164 4 * VITA_GXM_SCREEN_STRIDE * VITA_GXM_SCREEN_HEIGHT,
1165 SCE_GXM_COLOR_SURFACE_ALIGNMENT,
1166 SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
1167 &buffer_for_common_dialog[i].uid);
1168 sceGxmColorSurfaceInit(
1169 &buffer_for_common_dialog[i].surf,
1170 VITA_GXM_PIXEL_FORMAT,
1171 SCE_GXM_COLOR_SURFACE_LINEAR,
1172 SCE_GXM_COLOR_SURFACE_SCALE_NONE,
1173 SCE_GXM_OUTPUT_REGISTER_SIZE_32BIT,
1174 VITA_GXM_SCREEN_WIDTH,
1175 VITA_GXM_SCREEN_HEIGHT,
1176 VITA_GXM_SCREEN_STRIDE,
1177 buffer_for_common_dialog[i].displayData.address);
1178 sceGxmSyncObjectCreate(&buffer_for_common_dialog[i].sync);
1179 }
1180 sceGxmDisplayQueueFinish();
1181}
1182
1183void gxm_swap_for_common_dialog(void)
1184{
1185 SceCommonDialogUpdateParam updateParam;
1186 SDL_zero(updateParam);
1187 updateParam.renderTarget.colorFormat = VITA_GXM_PIXEL_FORMAT;
1188 updateParam.renderTarget.surfaceType = SCE_GXM_COLOR_SURFACE_LINEAR;
1189 updateParam.renderTarget.width = VITA_GXM_SCREEN_WIDTH;
1190 updateParam.renderTarget.height = VITA_GXM_SCREEN_HEIGHT;
1191 updateParam.renderTarget.strideInPixels = VITA_GXM_SCREEN_STRIDE;
1192
1193 updateParam.renderTarget.colorSurfaceData = buffer_for_common_dialog[back_buffer_index_for_common_dialog].displayData.address;
1194
1195 updateParam.displaySyncObject = buffer_for_common_dialog[back_buffer_index_for_common_dialog].sync;
1196 SDL_memset(buffer_for_common_dialog[back_buffer_index_for_common_dialog].displayData.address, 0, 4 * VITA_GXM_SCREEN_STRIDE * VITA_GXM_SCREEN_HEIGHT);
1197 sceCommonDialogUpdate(&updateParam);
1198
1199 sceGxmDisplayQueueAddEntry(buffer_for_common_dialog[front_buffer_index_for_common_dialog].sync, buffer_for_common_dialog[back_buffer_index_for_common_dialog].sync, &buffer_for_common_dialog[back_buffer_index_for_common_dialog].displayData);
1200 front_buffer_index_for_common_dialog = back_buffer_index_for_common_dialog;
1201 back_buffer_index_for_common_dialog = (back_buffer_index_for_common_dialog + 1) % VITA_GXM_BUFFERS;
1202}
1203
1204void gxm_term_for_common_dialog(void)
1205{
1206 sceGxmDisplayQueueFinish();
1207 for (int i = 0; i < VITA_GXM_BUFFERS; i += 1) {
1208 vita_mem_free(buffer_for_common_dialog[i].uid);
1209 sceGxmSyncObjectDestroy(buffer_for_common_dialog[i].sync);
1210 }
1211}
1212
1213#endif // SDL_VIDEO_RENDER_VITA_GXM
diff --git a/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_tools.h b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_tools.h
new file mode 100644
index 0000000..023f859
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_tools.h
@@ -0,0 +1,63 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_RENDER_VITA_GXM_TOOLS_H
23#define SDL_RENDER_VITA_GXM_TOOLS_H
24
25#include "SDL_internal.h"
26
27#include "../SDL_sysrender.h"
28
29#include <psp2/kernel/processmgr.h>
30#include <psp2/appmgr.h>
31#include <psp2/display.h>
32#include <psp2/gxm.h>
33#include <psp2/types.h>
34#include <psp2/kernel/sysmem.h>
35
36#include "SDL_render_vita_gxm_types.h"
37
38void init_orthographic_matrix(float *m, float left, float right, float bottom, float top, float near, float far);
39
40void *pool_malloc(VITA_GXM_RenderData *data, unsigned int size);
41void *pool_memalign(VITA_GXM_RenderData *data, unsigned int size, unsigned int alignment);
42
43void set_clip_rectangle(VITA_GXM_RenderData *data, int x_min, int y_min, int x_max, int y_max);
44void unset_clip_rectangle(VITA_GXM_RenderData *data);
45
46int gxm_init(SDL_Renderer *renderer);
47void gxm_finish(SDL_Renderer *renderer);
48
49gxm_texture *create_gxm_texture(VITA_GXM_RenderData *data, unsigned int w, unsigned int h, SceGxmTextureFormat format, unsigned int isRenderTarget, unsigned int *return_w, unsigned int *return_h, unsigned int *return_pitch, float *return_wscale);
50void free_gxm_texture(VITA_GXM_RenderData *data, gxm_texture *texture);
51
52void gxm_texture_set_filters(gxm_texture *texture, SceGxmTextureFilter min_filter, SceGxmTextureFilter mag_filter);
53SceGxmTextureFormat gxm_texture_get_format(const gxm_texture *texture);
54
55void *gxm_texture_get_datap(const gxm_texture *texture);
56
57void gxm_minimal_init_for_common_dialog(void);
58void gxm_minimal_term_for_common_dialog(void);
59void gxm_init_for_common_dialog(void);
60void gxm_swap_for_common_dialog(void);
61void gxm_term_for_common_dialog(void);
62
63#endif // SDL_RENDER_VITA_GXM_TOOLS_H
diff --git a/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_types.h b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_types.h
new file mode 100644
index 0000000..19962c7
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/SDL_render_vita_gxm_types.h
@@ -0,0 +1,210 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef SDL_RENDER_VITA_GXM_TYPES_H
23#define SDL_RENDER_VITA_GXM_TYPES_H
24
25#include "SDL_internal.h"
26
27#include "../SDL_sysrender.h"
28
29#include <psp2/kernel/processmgr.h>
30#include <psp2/appmgr.h>
31#include <psp2/display.h>
32#include <psp2/gxm.h>
33#include <psp2/types.h>
34#include <psp2/kernel/sysmem.h>
35#include <psp2/kernel/clib.h>
36
37#include <string.h>
38
39#define VITA_GXM_SCREEN_WIDTH 960
40#define VITA_GXM_SCREEN_HEIGHT 544
41#define VITA_GXM_SCREEN_STRIDE 960
42
43#define VITA_GXM_COLOR_FORMAT SCE_GXM_COLOR_FORMAT_A8B8G8R8
44#define VITA_GXM_PIXEL_FORMAT SCE_DISPLAY_PIXELFORMAT_A8B8G8R8
45
46#define VITA_GXM_BUFFERS 3
47#define VITA_GXM_PENDING_SWAPS 2
48#define VITA_GXM_POOL_SIZE 2 * 1024 * 1024
49
50typedef struct
51{
52 void *address;
53 Uint8 wait_vblank;
54} VITA_GXM_DisplayData;
55
56typedef struct clear_vertex
57{
58 float x;
59 float y;
60} clear_vertex;
61
62typedef struct color_vertex
63{
64 float x;
65 float y;
66 SDL_FColor color;
67} color_vertex;
68
69typedef struct texture_vertex
70{
71 float x;
72 float y;
73 float u;
74 float v;
75 SDL_FColor color;
76} texture_vertex;
77
78typedef struct gxm_texture
79{
80 SceGxmTexture gxm_tex;
81 SceUID data_UID;
82 SceGxmRenderTarget *gxm_rendertarget;
83 SceGxmColorSurface gxm_colorsurface;
84 SceGxmDepthStencilSurface gxm_depthstencil;
85 SceUID depth_UID;
86 bool cdram;
87} gxm_texture;
88
89typedef struct fragment_programs
90{
91 SceGxmFragmentProgram *color;
92 SceGxmFragmentProgram *texture;
93} fragment_programs;
94
95typedef struct blend_fragment_programs
96{
97 fragment_programs blend_mode_none;
98 fragment_programs blend_mode_blend;
99 fragment_programs blend_mode_add;
100 fragment_programs blend_mode_mod;
101 fragment_programs blend_mode_mul;
102} blend_fragment_programs;
103
104typedef struct
105{
106 SDL_Rect viewport;
107 bool viewport_dirty;
108 SDL_Texture *texture;
109 SDL_Texture *target;
110 SDL_FColor color;
111 SceGxmFragmentProgram *fragment_program;
112 SceGxmVertexProgram *vertex_program;
113 int last_command;
114
115 bool cliprect_enabled_dirty;
116 bool cliprect_enabled;
117 bool cliprect_dirty;
118 SDL_Rect cliprect;
119 bool texturing;
120 int drawablew;
121 int drawableh;
122} gxm_drawstate_cache;
123
124typedef struct
125{
126 bool initialized;
127 bool drawing;
128
129 unsigned int psm;
130 unsigned int bpp;
131
132 int currentBlendMode;
133
134 VITA_GXM_DisplayData displayData;
135
136 SceUID vdmRingBufferUid;
137 SceUID vertexRingBufferUid;
138 SceUID fragmentRingBufferUid;
139 SceUID fragmentUsseRingBufferUid;
140 SceGxmContextParams contextParams;
141 SceGxmContext *gxm_context;
142 SceGxmRenderTarget *renderTarget;
143 SceUID displayBufferUid[VITA_GXM_BUFFERS];
144 void *displayBufferData[VITA_GXM_BUFFERS];
145 SceGxmColorSurface displaySurface[VITA_GXM_BUFFERS];
146 SceGxmSyncObject *displayBufferSync[VITA_GXM_BUFFERS];
147
148 SceUID depthBufferUid;
149 SceUID stencilBufferUid;
150 SceGxmDepthStencilSurface depthSurface;
151 void *depthBufferData;
152 void *stencilBufferData;
153
154 unsigned int backBufferIndex;
155 unsigned int frontBufferIndex;
156
157 void *pool_addr[2];
158 SceUID poolUid[2];
159 unsigned int pool_index;
160 unsigned int current_pool;
161
162 float ortho_matrix[4 * 4];
163
164 SceGxmVertexProgram *colorVertexProgram;
165 SceGxmFragmentProgram *colorFragmentProgram;
166 SceGxmVertexProgram *textureVertexProgram;
167 SceGxmFragmentProgram *textureFragmentProgram;
168 SceGxmProgramParameter *clearClearColorParam;
169 SceGxmProgramParameter *colorWvpParam;
170 SceGxmProgramParameter *textureWvpParam;
171
172 SceGxmShaderPatcher *shaderPatcher;
173 SceGxmVertexProgram *clearVertexProgram;
174 SceGxmFragmentProgram *clearFragmentProgram;
175
176 SceGxmShaderPatcherId clearVertexProgramId;
177 SceGxmShaderPatcherId clearFragmentProgramId;
178 SceGxmShaderPatcherId colorVertexProgramId;
179 SceGxmShaderPatcherId colorFragmentProgramId;
180 SceGxmShaderPatcherId textureVertexProgramId;
181 SceGxmShaderPatcherId textureFragmentProgramId;
182
183 SceUID patcherBufferUid;
184 SceUID patcherVertexUsseUid;
185 SceUID patcherFragmentUsseUid;
186
187 SceUID clearVerticesUid;
188 SceUID linearIndicesUid;
189 clear_vertex *clearVertices;
190 uint16_t *linearIndices;
191
192 blend_fragment_programs blendFragmentPrograms;
193
194 gxm_drawstate_cache drawstate;
195 SceClibMspace texturePool;
196 SceUID texturePoolUID;
197} VITA_GXM_RenderData;
198
199typedef struct
200{
201 gxm_texture *tex;
202 unsigned int pitch;
203 unsigned int w;
204 unsigned int h;
205 float wscale;
206 bool yuv;
207 bool nv12;
208} VITA_GXM_TextureData;
209
210#endif // SDL_RENDER_VITA_GXM_TYPES_H
diff --git a/SDL-3.2.8/src/render/vitagxm/shader_src/clear_f.cg b/SDL-3.2.8/src/render/vitagxm/shader_src/clear_f.cg
new file mode 100644
index 0000000..6d8fb3b
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/shader_src/clear_f.cg
@@ -0,0 +1,4 @@
1float4 main( uniform float4 uClearColor) : COLOR
2{
3 return uClearColor;
4}
diff --git a/SDL-3.2.8/src/render/vitagxm/shader_src/clear_v.cg b/SDL-3.2.8/src/render/vitagxm/shader_src/clear_v.cg
new file mode 100644
index 0000000..ee5aa9f
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/shader_src/clear_v.cg
@@ -0,0 +1,4 @@
1float4 main(float2 aPosition) : POSITION
2{
3 return float4(aPosition, 1.f, 1.f);
4}
diff --git a/SDL-3.2.8/src/render/vitagxm/shader_src/color_f.cg b/SDL-3.2.8/src/render/vitagxm/shader_src/color_f.cg
new file mode 100644
index 0000000..dc87c2a
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/shader_src/color_f.cg
@@ -0,0 +1,4 @@
1float4 main(float4 vColor : COLOR)
2{
3 return vColor;
4}
diff --git a/SDL-3.2.8/src/render/vitagxm/shader_src/color_v.cg b/SDL-3.2.8/src/render/vitagxm/shader_src/color_v.cg
new file mode 100644
index 0000000..4966099
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/shader_src/color_v.cg
@@ -0,0 +1,13 @@
1void main(
2 float2 aPosition,
3 float4 aColor,
4 uniform float4x4 wvp,
5 out float4 vPosition : POSITION,
6 out float4 vColor : COLOR,
7 out float pSize : PSIZE
8)
9{
10 vPosition = mul(float4(aPosition, 1.f, 0.5f), wvp);
11 vColor = aColor;
12 pSize = 1.f;
13}
diff --git a/SDL-3.2.8/src/render/vitagxm/shader_src/texture_f.cg b/SDL-3.2.8/src/render/vitagxm/shader_src/texture_f.cg
new file mode 100644
index 0000000..a1f63b8
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/shader_src/texture_f.cg
@@ -0,0 +1,4 @@
1float4 main(float2 vTexcoord : TEXCOORD0, float4 vColor : COLOR, uniform sampler2D tex)
2{
3 return tex2D(tex, vTexcoord) * vColor;
4}
diff --git a/SDL-3.2.8/src/render/vitagxm/shader_src/texture_v.cg b/SDL-3.2.8/src/render/vitagxm/shader_src/texture_v.cg
new file mode 100644
index 0000000..9e05e9a
--- /dev/null
+++ b/SDL-3.2.8/src/render/vitagxm/shader_src/texture_v.cg
@@ -0,0 +1,14 @@
1void main(
2 float2 aPosition,
3 float2 aTexcoord,
4 float4 aColor,
5 uniform float4x4 wvp,
6 out float4 vPosition : POSITION,
7 out float4 vColor : COLOR,
8 out float2 vTexcoord : TEXCOORD0
9)
10{
11 vPosition = mul(float4(aPosition, 1.f, 0.5f), wvp);
12 vTexcoord = aTexcoord;
13 vColor = aColor;
14}
diff --git a/SDL-3.2.8/src/render/vulkan/SDL_render_vulkan.c b/SDL-3.2.8/src/render/vulkan/SDL_render_vulkan.c
new file mode 100644
index 0000000..d2157c3
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/SDL_render_vulkan.c
@@ -0,0 +1,4349 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_VULKAN
24
25#define SDL_VULKAN_FRAME_QUEUE_DEPTH 2
26#define SDL_VULKAN_NUM_VERTEX_BUFFERS 256
27#define SDL_VULKAN_VERTEX_BUFFER_DEFAULT_SIZE 65536
28#define SDL_VULKAN_CONSTANT_BUFFER_DEFAULT_SIZE 65536
29#define SDL_VULKAN_NUM_UPLOAD_BUFFERS 32
30#define SDL_VULKAN_MAX_DESCRIPTOR_SETS 4096
31
32#define SDL_VULKAN_VALIDATION_LAYER_NAME "VK_LAYER_KHRONOS_validation"
33
34#define VK_NO_PROTOTYPES
35#include "../../video/SDL_vulkan_internal.h"
36#include "../../video/SDL_sysvideo.h"
37#include "../SDL_sysrender.h"
38#include "../SDL_d3dmath.h"
39#include "../../video/SDL_pixels_c.h"
40#include "SDL_shaders_vulkan.h"
41
42#define SET_ERROR_CODE(message, rc) \
43 if (SDL_GetHintBoolean(SDL_HINT_RENDER_VULKAN_DEBUG, false)) { \
44 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s: %s", message, SDL_Vulkan_GetResultString(rc)); \
45 SDL_TriggerBreakpoint(); \
46 } \
47 SDL_SetError("%s: %s", message, SDL_Vulkan_GetResultString(rc)) \
48
49#define SET_ERROR_MESSAGE(message) \
50 if (SDL_GetHintBoolean(SDL_HINT_RENDER_VULKAN_DEBUG, false)) { \
51 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "%s", message); \
52 SDL_TriggerBreakpoint(); \
53 } \
54 SDL_SetError("%s", message) \
55
56#define VULKAN_FUNCTIONS() \
57 VULKAN_DEVICE_FUNCTION(vkAcquireNextImageKHR) \
58 VULKAN_DEVICE_FUNCTION(vkAllocateCommandBuffers) \
59 VULKAN_DEVICE_FUNCTION(vkAllocateDescriptorSets) \
60 VULKAN_DEVICE_FUNCTION(vkAllocateMemory) \
61 VULKAN_DEVICE_FUNCTION(vkBeginCommandBuffer) \
62 VULKAN_DEVICE_FUNCTION(vkBindBufferMemory) \
63 VULKAN_DEVICE_FUNCTION(vkBindImageMemory) \
64 VULKAN_DEVICE_FUNCTION(vkCmdBeginRenderPass) \
65 VULKAN_DEVICE_FUNCTION(vkCmdBindDescriptorSets) \
66 VULKAN_DEVICE_FUNCTION(vkCmdBindPipeline) \
67 VULKAN_DEVICE_FUNCTION(vkCmdBindVertexBuffers) \
68 VULKAN_DEVICE_FUNCTION(vkCmdClearColorImage) \
69 VULKAN_DEVICE_FUNCTION(vkCmdCopyBufferToImage) \
70 VULKAN_DEVICE_FUNCTION(vkCmdCopyImageToBuffer) \
71 VULKAN_DEVICE_FUNCTION(vkCmdDraw) \
72 VULKAN_DEVICE_FUNCTION(vkCmdEndRenderPass) \
73 VULKAN_DEVICE_FUNCTION(vkCmdPipelineBarrier) \
74 VULKAN_DEVICE_FUNCTION(vkCmdPushConstants) \
75 VULKAN_DEVICE_FUNCTION(vkCmdSetScissor) \
76 VULKAN_DEVICE_FUNCTION(vkCmdSetViewport) \
77 VULKAN_DEVICE_FUNCTION(vkCreateBuffer) \
78 VULKAN_DEVICE_FUNCTION(vkCreateCommandPool) \
79 VULKAN_DEVICE_FUNCTION(vkCreateDescriptorPool) \
80 VULKAN_DEVICE_FUNCTION(vkCreateDescriptorSetLayout) \
81 VULKAN_DEVICE_FUNCTION(vkCreateFence) \
82 VULKAN_DEVICE_FUNCTION(vkCreateFramebuffer) \
83 VULKAN_DEVICE_FUNCTION(vkCreateGraphicsPipelines) \
84 VULKAN_DEVICE_FUNCTION(vkCreateImage) \
85 VULKAN_DEVICE_FUNCTION(vkCreateImageView) \
86 VULKAN_DEVICE_FUNCTION(vkCreatePipelineLayout) \
87 VULKAN_DEVICE_FUNCTION(vkCreateRenderPass) \
88 VULKAN_DEVICE_FUNCTION(vkCreateSampler) \
89 VULKAN_DEVICE_FUNCTION(vkCreateSemaphore) \
90 VULKAN_DEVICE_FUNCTION(vkCreateShaderModule) \
91 VULKAN_DEVICE_FUNCTION(vkCreateSwapchainKHR) \
92 VULKAN_DEVICE_FUNCTION(vkDestroyBuffer) \
93 VULKAN_DEVICE_FUNCTION(vkDestroyCommandPool) \
94 VULKAN_DEVICE_FUNCTION(vkDestroyDevice) \
95 VULKAN_DEVICE_FUNCTION(vkDestroyDescriptorPool) \
96 VULKAN_DEVICE_FUNCTION(vkDestroyDescriptorSetLayout) \
97 VULKAN_DEVICE_FUNCTION(vkDestroyFence) \
98 VULKAN_DEVICE_FUNCTION(vkDestroyFramebuffer) \
99 VULKAN_DEVICE_FUNCTION(vkDestroyImage) \
100 VULKAN_DEVICE_FUNCTION(vkDestroyImageView) \
101 VULKAN_DEVICE_FUNCTION(vkDestroyPipeline) \
102 VULKAN_DEVICE_FUNCTION(vkDestroyPipelineLayout) \
103 VULKAN_DEVICE_FUNCTION(vkDestroyRenderPass) \
104 VULKAN_DEVICE_FUNCTION(vkDestroySampler) \
105 VULKAN_DEVICE_FUNCTION(vkDestroySemaphore) \
106 VULKAN_DEVICE_FUNCTION(vkDestroyShaderModule) \
107 VULKAN_DEVICE_FUNCTION(vkDestroySwapchainKHR) \
108 VULKAN_DEVICE_FUNCTION(vkDeviceWaitIdle) \
109 VULKAN_DEVICE_FUNCTION(vkEndCommandBuffer) \
110 VULKAN_DEVICE_FUNCTION(vkFreeCommandBuffers) \
111 VULKAN_DEVICE_FUNCTION(vkFreeMemory) \
112 VULKAN_DEVICE_FUNCTION(vkGetBufferMemoryRequirements) \
113 VULKAN_DEVICE_FUNCTION(vkGetImageMemoryRequirements) \
114 VULKAN_DEVICE_FUNCTION(vkGetDeviceQueue) \
115 VULKAN_DEVICE_FUNCTION(vkGetFenceStatus) \
116 VULKAN_DEVICE_FUNCTION(vkGetSwapchainImagesKHR) \
117 VULKAN_DEVICE_FUNCTION(vkMapMemory) \
118 VULKAN_DEVICE_FUNCTION(vkQueuePresentKHR) \
119 VULKAN_DEVICE_FUNCTION(vkQueueSubmit) \
120 VULKAN_DEVICE_FUNCTION(vkResetCommandBuffer) \
121 VULKAN_DEVICE_FUNCTION(vkResetCommandPool) \
122 VULKAN_DEVICE_FUNCTION(vkResetDescriptorPool) \
123 VULKAN_DEVICE_FUNCTION(vkResetFences) \
124 VULKAN_DEVICE_FUNCTION(vkUnmapMemory) \
125 VULKAN_DEVICE_FUNCTION(vkUpdateDescriptorSets) \
126 VULKAN_DEVICE_FUNCTION(vkWaitForFences) \
127 VULKAN_GLOBAL_FUNCTION(vkCreateInstance) \
128 VULKAN_GLOBAL_FUNCTION(vkEnumerateInstanceExtensionProperties) \
129 VULKAN_GLOBAL_FUNCTION(vkEnumerateInstanceLayerProperties) \
130 VULKAN_INSTANCE_FUNCTION(vkCreateDevice) \
131 VULKAN_INSTANCE_FUNCTION(vkDestroyInstance) \
132 VULKAN_INSTANCE_FUNCTION(vkDestroySurfaceKHR) \
133 VULKAN_INSTANCE_FUNCTION(vkEnumerateDeviceExtensionProperties) \
134 VULKAN_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices) \
135 VULKAN_INSTANCE_FUNCTION(vkGetDeviceProcAddr) \
136 VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures) \
137 VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceProperties) \
138 VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceMemoryProperties) \
139 VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceQueueFamilyProperties) \
140 VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) \
141 VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR) \
142 VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR) \
143 VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR) \
144 VULKAN_INSTANCE_FUNCTION(vkQueueWaitIdle) \
145 VULKAN_OPTIONAL_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures2KHR) \
146 VULKAN_OPTIONAL_INSTANCE_FUNCTION(vkGetPhysicalDeviceFormatProperties2KHR) \
147 VULKAN_OPTIONAL_INSTANCE_FUNCTION(vkGetPhysicalDeviceImageFormatProperties2KHR) \
148 VULKAN_OPTIONAL_INSTANCE_FUNCTION(vkGetPhysicalDeviceMemoryProperties2KHR) \
149 VULKAN_OPTIONAL_INSTANCE_FUNCTION(vkGetPhysicalDeviceProperties2KHR) \
150 VULKAN_OPTIONAL_DEVICE_FUNCTION(vkCreateSamplerYcbcrConversionKHR) \
151 VULKAN_OPTIONAL_DEVICE_FUNCTION(vkDestroySamplerYcbcrConversionKHR) \
152
153#define VULKAN_DEVICE_FUNCTION(name) static PFN_##name name = NULL;
154#define VULKAN_GLOBAL_FUNCTION(name) static PFN_##name name = NULL;
155#define VULKAN_INSTANCE_FUNCTION(name) static PFN_##name name = NULL;
156#define VULKAN_OPTIONAL_INSTANCE_FUNCTION(name) static PFN_##name name = NULL;
157#define VULKAN_OPTIONAL_DEVICE_FUNCTION(name) static PFN_##name name = NULL;
158VULKAN_FUNCTIONS()
159#undef VULKAN_DEVICE_FUNCTION
160#undef VULKAN_GLOBAL_FUNCTION
161#undef VULKAN_INSTANCE_FUNCTION
162#undef VULKAN_OPTIONAL_INSTANCE_FUNCTION
163#undef VULKAN_OPTIONAL_DEVICE_FUNCTION
164
165// Renderpass types
166typedef enum {
167 VULKAN_RENDERPASS_LOAD = 0,
168 VULKAN_RENDERPASS_CLEAR = 1,
169 VULKAN_RENDERPASS_COUNT
170} VULKAN_RenderPass;
171
172// Sampler types
173typedef enum
174{
175 VULKAN_SAMPLER_NEAREST_CLAMP,
176 VULKAN_SAMPLER_NEAREST_WRAP,
177 VULKAN_SAMPLER_LINEAR_CLAMP,
178 VULKAN_SAMPLER_LINEAR_WRAP,
179 VULKAN_SAMPLER_COUNT
180} VULKAN_Sampler;
181
182// Vertex shader, common values
183typedef struct
184{
185 Float4X4 model;
186 Float4X4 projectionAndView;
187} VULKAN_VertexShaderConstants;
188
189// These should mirror the definitions in VULKAN_PixelShader_Common.hlsli
190//static const float TONEMAP_NONE = 0;
191//static const float TONEMAP_LINEAR = 1;
192static const float TONEMAP_CHROME = 2;
193
194static const float INPUTTYPE_UNSPECIFIED = 0;
195static const float INPUTTYPE_SRGB = 1;
196static const float INPUTTYPE_SCRGB = 2;
197static const float INPUTTYPE_HDR10 = 3;
198
199typedef enum
200{
201 SAMPLER_POINT_CLAMP,
202 SAMPLER_POINT_WRAP,
203 SAMPLER_LINEAR_CLAMP,
204 SAMPLER_LINEAR_WRAP,
205 NUM_SAMPLERS
206} Sampler;
207
208// Pixel shader constants, common values
209typedef struct
210{
211 float scRGB_output;
212 float input_type;
213 float color_scale;
214 float unused_pad0;
215
216 float tonemap_method;
217 float tonemap_factor1;
218 float tonemap_factor2;
219 float sdr_white_point;
220} VULKAN_PixelShaderConstants;
221
222// Per-vertex data
223typedef struct
224{
225 float pos[2];
226 float tex[2];
227 SDL_FColor color;
228} VULKAN_VertexPositionColor;
229
230// Vulkan Buffer
231typedef struct
232{
233 VkDeviceMemory deviceMemory;
234 VkBuffer buffer;
235 VkDeviceSize size;
236 void *mappedBufferPtr;
237
238} VULKAN_Buffer;
239
240// Vulkan image
241typedef struct
242{
243 bool allocatedImage;
244 VkImage image;
245 VkImageView imageView;
246 VkDeviceMemory deviceMemory;
247 VkImageLayout imageLayout;
248 VkFormat format;
249} VULKAN_Image;
250
251// Per-texture data
252typedef struct
253{
254 VULKAN_Image mainImage;
255 VkRenderPass mainRenderpasses[VULKAN_RENDERPASS_COUNT];
256 VkFramebuffer mainFramebuffer;
257 VULKAN_Buffer stagingBuffer;
258 VkFilter scaleMode;
259 SDL_Rect lockedRect;
260 int width;
261 int height;
262 VULKAN_Shader shader;
263
264 // Object passed to VkImageView and VkSampler for doing Ycbcr -> RGB conversion
265 VkSamplerYcbcrConversion samplerYcbcrConversion;
266 // Sampler created with samplerYcbcrConversion, passed to PSO as immutable sampler
267 VkSampler samplerYcbcr;
268 // Descriptor set layout with samplerYcbcr baked as immutable sampler
269 VkDescriptorSetLayout descriptorSetLayoutYcbcr;
270 // Pipeline layout with immutable sampler descriptor set layout
271 VkPipelineLayout pipelineLayoutYcbcr;
272
273} VULKAN_TextureData;
274
275// Pipeline State Object data
276typedef struct
277{
278 VULKAN_Shader shader;
279 VULKAN_PixelShaderConstants shader_constants;
280 SDL_BlendMode blendMode;
281 VkPrimitiveTopology topology;
282 VkFormat format;
283 VkPipelineLayout pipelineLayout;
284 VkDescriptorSetLayout descriptorSetLayout;
285 VkPipeline pipeline;
286} VULKAN_PipelineState;
287
288typedef struct
289{
290 VkBuffer vertexBuffer;
291} VULKAN_DrawStateCache;
292
293// Private renderer data
294typedef struct
295{
296 PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
297 VkInstance instance;
298 bool instance_external;
299 VkSurfaceKHR surface;
300 bool surface_external;
301 VkPhysicalDevice physicalDevice;
302 VkPhysicalDeviceProperties physicalDeviceProperties;
303 VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties;
304 VkPhysicalDeviceFeatures physicalDeviceFeatures;
305 VkQueue graphicsQueue;
306 VkQueue presentQueue;
307 VkDevice device;
308 bool device_external;
309 uint32_t graphicsQueueFamilyIndex;
310 uint32_t presentQueueFamilyIndex;
311 VkSwapchainKHR swapchain;
312 VkCommandPool commandPool;
313 VkCommandBuffer *commandBuffers;
314 uint32_t currentCommandBufferIndex;
315 VkCommandBuffer currentCommandBuffer;
316 VkFence *fences;
317 VkSurfaceCapabilitiesKHR surfaceCapabilities;
318 VkSurfaceFormatKHR *surfaceFormats;
319 bool recreateSwapchain;
320 int vsync;
321 SDL_PropertiesID create_props;
322
323 VkFramebuffer *framebuffers;
324 VkRenderPass renderPasses[VULKAN_RENDERPASS_COUNT];
325 VkRenderPass currentRenderPass;
326
327 VkShaderModule vertexShaderModules[NUM_SHADERS];
328 VkShaderModule fragmentShaderModules[NUM_SHADERS];
329 VkDescriptorSetLayout descriptorSetLayout;
330 VkPipelineLayout pipelineLayout;
331
332 // Vertex buffer data
333 VULKAN_Buffer vertexBuffers[SDL_VULKAN_NUM_VERTEX_BUFFERS];
334 VULKAN_VertexShaderConstants vertexShaderConstantsData;
335
336 // Data for staging/allocating textures
337 VULKAN_Buffer **uploadBuffers;
338 int *currentUploadBuffer;
339
340 // Data for updating constants
341 VULKAN_Buffer **constantBuffers;
342 uint32_t *numConstantBuffers;
343 uint32_t currentConstantBufferIndex;
344 int32_t currentConstantBufferOffset;
345
346 VkSampler samplers[VULKAN_SAMPLER_COUNT];
347 VkDescriptorPool **descriptorPools;
348 uint32_t *numDescriptorPools;
349 uint32_t currentDescriptorPoolIndex;
350 uint32_t currentDescriptorSetIndex;
351
352 int pipelineStateCount;
353 VULKAN_PipelineState *pipelineStates;
354 VULKAN_PipelineState *currentPipelineState;
355
356 bool supportsEXTSwapchainColorspace;
357 bool supportsKHRGetPhysicalDeviceProperties2;
358 bool supportsKHRSamplerYCbCrConversion;
359 uint32_t surfaceFormatsAllocatedCount;
360 uint32_t surfaceFormatsCount;
361 uint32_t swapchainDesiredImageCount;
362 VkSurfaceFormatKHR surfaceFormat;
363 VkExtent2D swapchainSize;
364 VkSurfaceTransformFlagBitsKHR swapChainPreTransform;
365 uint32_t swapchainImageCount;
366 VkImage *swapchainImages;
367 VkImageView *swapchainImageViews;
368 VkImageLayout *swapchainImageLayouts;
369 VkSemaphore *imageAvailableSemaphores;
370 VkSemaphore *renderingFinishedSemaphores;
371 VkSemaphore currentImageAvailableSemaphore;
372 uint32_t currentSwapchainImageIndex;
373
374 VkPipelineStageFlags *waitDestStageMasks;
375 VkSemaphore *waitRenderSemaphores;
376 uint32_t waitRenderSemaphoreCount;
377 uint32_t waitRenderSemaphoreMax;
378 VkSemaphore *signalRenderSemaphores;
379 uint32_t signalRenderSemaphoreCount;
380 uint32_t signalRenderSemaphoreMax;
381
382 // Cached renderer properties
383 VULKAN_TextureData *textureRenderTarget;
384 bool cliprectDirty;
385 bool currentCliprectEnabled;
386 SDL_Rect currentCliprect;
387 SDL_Rect currentViewport;
388 int currentViewportRotation;
389 bool viewportDirty;
390 Float4X4 identity;
391 VkComponentMapping identitySwizzle;
392 int currentVertexBuffer;
393 bool issueBatch;
394} VULKAN_RenderData;
395
396static SDL_PixelFormat VULKAN_VkFormatToSDLPixelFormat(VkFormat vkFormat)
397{
398 switch (vkFormat) {
399 case VK_FORMAT_B8G8R8A8_UNORM:
400 return SDL_PIXELFORMAT_ARGB8888;
401 case VK_FORMAT_R8G8B8A8_UNORM:
402 return SDL_PIXELFORMAT_ABGR8888;
403 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
404 return SDL_PIXELFORMAT_ABGR2101010;
405 case VK_FORMAT_R16G16B16A16_SFLOAT:
406 return SDL_PIXELFORMAT_RGBA64_FLOAT;
407 default:
408 return SDL_PIXELFORMAT_UNKNOWN;
409 }
410}
411
412static int VULKAN_VkFormatGetNumPlanes(VkFormat vkFormat)
413{
414 switch (vkFormat) {
415 case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
416 return 3;
417 case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
418 case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
419 return 2;
420 default:
421 return 1;
422 }
423}
424
425static VkDeviceSize VULKAN_GetBytesPerPixel(VkFormat vkFormat)
426{
427 switch (vkFormat) {
428 case VK_FORMAT_R8_UNORM:
429 return 1;
430 case VK_FORMAT_R8G8_UNORM:
431 return 2;
432 case VK_FORMAT_R16G16_UNORM:
433 return 4;
434 case VK_FORMAT_B8G8R8A8_SRGB:
435 case VK_FORMAT_B8G8R8A8_UNORM:
436 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
437 return 4;
438 case VK_FORMAT_R16G16B16A16_SFLOAT:
439 return 8;
440 default:
441 return 4;
442 }
443}
444
445static VkFormat SDLPixelFormatToVkTextureFormat(Uint32 format, Uint32 output_colorspace)
446{
447 switch (format) {
448 case SDL_PIXELFORMAT_RGBA64_FLOAT:
449 return VK_FORMAT_R16G16B16A16_SFLOAT;
450 case SDL_PIXELFORMAT_ABGR2101010:
451 return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
452 case SDL_PIXELFORMAT_ARGB8888:
453 if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
454 return VK_FORMAT_B8G8R8A8_SRGB;
455 }
456 return VK_FORMAT_B8G8R8A8_UNORM;
457 case SDL_PIXELFORMAT_ABGR8888:
458 if (output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
459 return VK_FORMAT_R8G8B8A8_SRGB;
460 }
461 return VK_FORMAT_R8G8B8A8_UNORM;
462 case SDL_PIXELFORMAT_YUY2:
463 return VK_FORMAT_G8B8G8R8_422_UNORM;
464 case SDL_PIXELFORMAT_UYVY:
465 return VK_FORMAT_B8G8R8G8_422_UNORM;
466 case SDL_PIXELFORMAT_YV12:
467 case SDL_PIXELFORMAT_IYUV:
468 return VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
469 case SDL_PIXELFORMAT_NV12:
470 case SDL_PIXELFORMAT_NV21:
471 return VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
472 case SDL_PIXELFORMAT_P010:
473 return VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16;
474 default:
475 return VK_FORMAT_UNDEFINED;
476 }
477}
478
479static void VULKAN_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture);
480static void VULKAN_DestroyBuffer(VULKAN_RenderData *rendererData, VULKAN_Buffer *vulkanBuffer);
481static void VULKAN_DestroyImage(VULKAN_RenderData *rendererData, VULKAN_Image *vulkanImage);
482static void VULKAN_ResetCommandList(VULKAN_RenderData *rendererData);
483static bool VULKAN_FindMemoryTypeIndex(VULKAN_RenderData *rendererData, uint32_t typeBits, VkMemoryPropertyFlags requiredFlags, VkMemoryPropertyFlags desiredFlags, uint32_t *memoryTypeIndexOut);
484static VkResult VULKAN_CreateWindowSizeDependentResources(SDL_Renderer *renderer);
485static VkDescriptorPool VULKAN_AllocateDescriptorPool(VULKAN_RenderData *rendererData);
486static VkResult VULKAN_CreateDescriptorSetAndPipelineLayout(VULKAN_RenderData *rendererData, VkSampler samplerYcbcr, VkDescriptorSetLayout *descriptorSetLayoutOut, VkPipelineLayout *pipelineLayoutOut);
487static VkSurfaceTransformFlagBitsKHR VULKAN_GetRotationForCurrentRenderTarget(VULKAN_RenderData *rendererData);
488static bool VULKAN_IsDisplayRotated90Degrees(VkSurfaceTransformFlagBitsKHR rotation);
489
490static void VULKAN_DestroyAll(SDL_Renderer *renderer)
491{
492 VULKAN_RenderData *rendererData;
493 if (renderer == NULL) {
494 return;
495 }
496 rendererData = (VULKAN_RenderData *)renderer->internal;
497 if (rendererData == NULL) {
498 return;
499 }
500
501 // Release all textures
502 for (SDL_Texture *texture = renderer->textures; texture; texture = texture->next) {
503 VULKAN_DestroyTexture(renderer, texture);
504 }
505
506 if (rendererData->waitDestStageMasks) {
507 SDL_free(rendererData->waitDestStageMasks);
508 rendererData->waitDestStageMasks = NULL;
509 }
510 if (rendererData->waitRenderSemaphores) {
511 SDL_free(rendererData->waitRenderSemaphores);
512 rendererData->waitRenderSemaphores = NULL;
513 }
514 if (rendererData->signalRenderSemaphores) {
515 SDL_free(rendererData->signalRenderSemaphores);
516 rendererData->signalRenderSemaphores = NULL;
517 }
518 if (rendererData->surfaceFormats != NULL) {
519 SDL_free(rendererData->surfaceFormats);
520 rendererData->surfaceFormats = NULL;
521 rendererData->surfaceFormatsAllocatedCount = 0;
522 }
523 if (rendererData->swapchainImages != NULL) {
524 SDL_free(rendererData->swapchainImages);
525 rendererData->swapchainImages = NULL;
526 }
527 if (rendererData->swapchain) {
528 vkDestroySwapchainKHR(rendererData->device, rendererData->swapchain, NULL);
529 rendererData->swapchain = VK_NULL_HANDLE;
530 }
531 if (rendererData->fences != NULL) {
532 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
533 if (rendererData->fences[i] != VK_NULL_HANDLE) {
534 vkDestroyFence(rendererData->device, rendererData->fences[i], NULL);
535 rendererData->fences[i] = VK_NULL_HANDLE;
536 }
537 }
538 SDL_free(rendererData->fences);
539 rendererData->fences = NULL;
540 }
541 if (rendererData->swapchainImageViews) {
542 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
543 if (rendererData->swapchainImageViews[i] != VK_NULL_HANDLE) {
544 vkDestroyImageView(rendererData->device, rendererData->swapchainImageViews[i], NULL);
545 }
546 }
547 SDL_free(rendererData->swapchainImageViews);
548 rendererData->swapchainImageViews = NULL;
549 }
550 if (rendererData->swapchainImageLayouts) {
551 SDL_free(rendererData->swapchainImageLayouts);
552 rendererData->swapchainImageLayouts = NULL;
553 }
554 if (rendererData->framebuffers) {
555 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
556 if (rendererData->framebuffers[i] != VK_NULL_HANDLE) {
557 vkDestroyFramebuffer(rendererData->device, rendererData->framebuffers[i], NULL);
558 }
559 }
560 SDL_free(rendererData->framebuffers);
561 rendererData->framebuffers = NULL;
562 }
563 for (uint32_t i = 0; i < SDL_arraysize(rendererData->samplers); i++) {
564 if (rendererData->samplers[i] != VK_NULL_HANDLE) {
565 vkDestroySampler(rendererData->device, rendererData->samplers[i], NULL);
566 rendererData->samplers[i] = VK_NULL_HANDLE;
567 }
568 }
569 for (uint32_t i = 0; i < SDL_arraysize(rendererData->vertexBuffers); i++ ) {
570 VULKAN_DestroyBuffer(rendererData, &rendererData->vertexBuffers[i]);
571 }
572 SDL_memset(rendererData->vertexBuffers, 0, sizeof(rendererData->vertexBuffers));
573 for (uint32_t i = 0; i < VULKAN_RENDERPASS_COUNT; i++) {
574 if (rendererData->renderPasses[i] != VK_NULL_HANDLE) {
575 vkDestroyRenderPass(rendererData->device, rendererData->renderPasses[i], NULL);
576 rendererData->renderPasses[i] = VK_NULL_HANDLE;
577 }
578 }
579 if (rendererData->imageAvailableSemaphores) {
580 for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
581 if (rendererData->imageAvailableSemaphores[i] != VK_NULL_HANDLE) {
582 vkDestroySemaphore(rendererData->device, rendererData->imageAvailableSemaphores[i], NULL);
583 }
584 }
585 SDL_free(rendererData->imageAvailableSemaphores);
586 rendererData->imageAvailableSemaphores = NULL;
587 }
588 if (rendererData->renderingFinishedSemaphores) {
589 for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
590 if (rendererData->renderingFinishedSemaphores[i] != VK_NULL_HANDLE) {
591 vkDestroySemaphore(rendererData->device, rendererData->renderingFinishedSemaphores[i], NULL);
592 }
593 }
594 SDL_free(rendererData->renderingFinishedSemaphores);
595 rendererData->renderingFinishedSemaphores = NULL;
596 }
597 if (rendererData->commandBuffers) {
598 vkFreeCommandBuffers(rendererData->device, rendererData->commandPool, rendererData->swapchainImageCount, rendererData->commandBuffers);
599 SDL_free(rendererData->commandBuffers);
600 rendererData->commandBuffers = NULL;
601 rendererData->currentCommandBuffer = VK_NULL_HANDLE;
602 rendererData->currentCommandBufferIndex = 0;
603 }
604 if (rendererData->commandPool) {
605 vkDestroyCommandPool(rendererData->device, rendererData->commandPool, NULL);
606 rendererData->commandPool = VK_NULL_HANDLE;
607 }
608 if (rendererData->descriptorPools) {
609 SDL_assert(rendererData->numDescriptorPools);
610 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
611 for (uint32_t j = 0; j < rendererData->numDescriptorPools[i]; j++) {
612 if (rendererData->descriptorPools[i][j] != VK_NULL_HANDLE) {
613 vkDestroyDescriptorPool(rendererData->device, rendererData->descriptorPools[i][j], NULL);
614 }
615 }
616 SDL_free(rendererData->descriptorPools[i]);
617 }
618 SDL_free(rendererData->descriptorPools);
619 rendererData->descriptorPools = NULL;
620 SDL_free(rendererData->numDescriptorPools);
621 rendererData->numDescriptorPools = NULL;
622 }
623 for (uint32_t i = 0; i < NUM_SHADERS; i++) {
624 if (rendererData->vertexShaderModules[i] != VK_NULL_HANDLE) {
625 vkDestroyShaderModule(rendererData->device, rendererData->vertexShaderModules[i], NULL);
626 rendererData->vertexShaderModules[i] = VK_NULL_HANDLE;
627 }
628 if (rendererData->fragmentShaderModules[i] != VK_NULL_HANDLE) {
629 vkDestroyShaderModule(rendererData->device, rendererData->fragmentShaderModules[i], NULL);
630 rendererData->fragmentShaderModules[i] = VK_NULL_HANDLE;
631 }
632 }
633 if (rendererData->descriptorSetLayout != VK_NULL_HANDLE) {
634 vkDestroyDescriptorSetLayout(rendererData->device, rendererData->descriptorSetLayout, NULL);
635 rendererData->descriptorSetLayout = VK_NULL_HANDLE;
636 }
637 if (rendererData->pipelineLayout != VK_NULL_HANDLE) {
638 vkDestroyPipelineLayout(rendererData->device, rendererData->pipelineLayout, NULL);
639 rendererData->pipelineLayout = VK_NULL_HANDLE;
640 }
641 for (int i = 0; i < rendererData->pipelineStateCount; i++) {
642 vkDestroyPipeline(rendererData->device, rendererData->pipelineStates[i].pipeline, NULL);
643 }
644 SDL_free(rendererData->pipelineStates);
645 rendererData->pipelineStates = NULL;
646 rendererData->pipelineStateCount = 0;
647
648 if (rendererData->currentUploadBuffer) {
649 for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
650 for (int j = 0; j < rendererData->currentUploadBuffer[i]; ++j) {
651 VULKAN_DestroyBuffer(rendererData, &rendererData->uploadBuffers[i][j]);
652 }
653 SDL_free(rendererData->uploadBuffers[i]);
654 }
655 SDL_free(rendererData->uploadBuffers);
656 rendererData->uploadBuffers = NULL;
657 SDL_free(rendererData->currentUploadBuffer);
658 rendererData->currentUploadBuffer = NULL;
659 }
660
661 if (rendererData->constantBuffers) {
662 SDL_assert(rendererData->numConstantBuffers);
663 for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
664 for (uint32_t j = 0; j < rendererData->numConstantBuffers[i]; j++) {
665 VULKAN_DestroyBuffer(rendererData, &rendererData->constantBuffers[i][j]);
666 }
667 SDL_free(rendererData->constantBuffers[i]);
668 }
669 SDL_free(rendererData->constantBuffers);
670 rendererData->constantBuffers = NULL;
671 SDL_free(rendererData->numConstantBuffers);
672 rendererData->numConstantBuffers = NULL;
673 }
674
675 if (rendererData->device != VK_NULL_HANDLE && !rendererData->device_external) {
676 vkDestroyDevice(rendererData->device, NULL);
677 rendererData->device = VK_NULL_HANDLE;
678 }
679 if (rendererData->surface != VK_NULL_HANDLE && !rendererData->surface_external) {
680 vkDestroySurfaceKHR(rendererData->instance, rendererData->surface, NULL);
681 rendererData->surface = VK_NULL_HANDLE;
682 }
683 if (rendererData->instance != VK_NULL_HANDLE && !rendererData->instance_external) {
684 vkDestroyInstance(rendererData->instance, NULL);
685 rendererData->instance = VK_NULL_HANDLE;
686 }
687}
688
689static void VULKAN_DestroyBuffer(VULKAN_RenderData *rendererData, VULKAN_Buffer *vulkanBuffer)
690{
691 if (vulkanBuffer->buffer != VK_NULL_HANDLE) {
692 vkDestroyBuffer(rendererData->device, vulkanBuffer->buffer, NULL);
693 vulkanBuffer->buffer = VK_NULL_HANDLE;
694 }
695 if (vulkanBuffer->deviceMemory != VK_NULL_HANDLE) {
696 vkFreeMemory(rendererData->device, vulkanBuffer->deviceMemory, NULL);
697 vulkanBuffer->deviceMemory = VK_NULL_HANDLE;
698 }
699 SDL_memset(vulkanBuffer, 0, sizeof(VULKAN_Buffer));
700}
701
702static VkResult VULKAN_AllocateBuffer(VULKAN_RenderData *rendererData, VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags requiredMemoryProps, VkMemoryPropertyFlags desiredMemoryProps, VULKAN_Buffer *bufferOut)
703{
704 VkResult result;
705 VkBufferCreateInfo bufferCreateInfo = { 0 };
706 bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
707 bufferCreateInfo.size = size;
708 bufferCreateInfo.usage = usage;
709 result = vkCreateBuffer(rendererData->device, &bufferCreateInfo, NULL, &bufferOut->buffer);
710 if (result != VK_SUCCESS) {
711 SET_ERROR_CODE("vkCreateBuffer()", result);
712 return result;
713 }
714
715 VkMemoryRequirements memoryRequirements = { 0 };
716 vkGetBufferMemoryRequirements(rendererData->device, bufferOut->buffer, &memoryRequirements);
717 if (result != VK_SUCCESS) {
718 VULKAN_DestroyBuffer(rendererData, bufferOut);
719 SET_ERROR_CODE("vkGetBufferMemoryRequirements()", result);
720 return result;
721 }
722
723 uint32_t memoryTypeIndex = 0;
724 if (!VULKAN_FindMemoryTypeIndex(rendererData, memoryRequirements.memoryTypeBits, requiredMemoryProps, desiredMemoryProps, &memoryTypeIndex)) {
725 VULKAN_DestroyBuffer(rendererData, bufferOut);
726 return VK_ERROR_UNKNOWN;
727 }
728
729 VkMemoryAllocateInfo memoryAllocateInfo = { 0 };
730 memoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
731 memoryAllocateInfo.allocationSize = memoryRequirements.size;
732 memoryAllocateInfo.memoryTypeIndex = memoryTypeIndex;
733 result = vkAllocateMemory(rendererData->device, &memoryAllocateInfo, NULL, &bufferOut->deviceMemory);
734 if (result != VK_SUCCESS) {
735 VULKAN_DestroyBuffer(rendererData, bufferOut);
736 SET_ERROR_CODE("vkAllocateMemory()", result);
737 return result;
738 }
739 result = vkBindBufferMemory(rendererData->device, bufferOut->buffer, bufferOut->deviceMemory, 0);
740 if (result != VK_SUCCESS) {
741 VULKAN_DestroyBuffer(rendererData, bufferOut);
742 SET_ERROR_CODE("vkBindBufferMemory()", result);
743 return result;
744 }
745
746 result = vkMapMemory(rendererData->device, bufferOut->deviceMemory, 0, size, 0, &bufferOut->mappedBufferPtr);
747 if (result != VK_SUCCESS) {
748 VULKAN_DestroyBuffer(rendererData, bufferOut);
749 SET_ERROR_CODE("vkMapMemory()", result);
750 return result;
751 }
752 bufferOut->size = size;
753 return result;
754}
755
756static void VULKAN_DestroyImage(VULKAN_RenderData *rendererData, VULKAN_Image *vulkanImage)
757{
758 if (vulkanImage->imageView != VK_NULL_HANDLE) {
759 vkDestroyImageView(rendererData->device, vulkanImage->imageView, NULL);
760 vulkanImage->imageView = VK_NULL_HANDLE;
761 }
762 if (vulkanImage->image != VK_NULL_HANDLE) {
763 if (vulkanImage->allocatedImage) {
764 vkDestroyImage(rendererData->device, vulkanImage->image, NULL);
765 }
766 vulkanImage->image = VK_NULL_HANDLE;
767 }
768
769 if (vulkanImage->deviceMemory != VK_NULL_HANDLE) {
770 if (vulkanImage->allocatedImage) {
771 vkFreeMemory(rendererData->device, vulkanImage->deviceMemory, NULL);
772 }
773 vulkanImage->deviceMemory = VK_NULL_HANDLE;
774 }
775 SDL_memset(vulkanImage, 0, sizeof(VULKAN_Image));
776}
777
778static VkResult VULKAN_AllocateImage(VULKAN_RenderData *rendererData, SDL_PropertiesID create_props, uint32_t width, uint32_t height, VkFormat format, VkImageUsageFlags imageUsage, VkComponentMapping swizzle, VkSamplerYcbcrConversionKHR samplerYcbcrConversion, VULKAN_Image *imageOut)
779{
780 VkResult result;
781 VkSamplerYcbcrConversionInfoKHR samplerYcbcrConversionInfo = { 0 };
782
783 SDL_memset(imageOut, 0, sizeof(VULKAN_Image));
784 imageOut->format = format;
785 imageOut->image = (VkImage)SDL_GetNumberProperty(create_props, SDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER, 0);
786
787 if (imageOut->image == VK_NULL_HANDLE) {
788 imageOut->allocatedImage = VK_TRUE;
789
790 VkImageCreateInfo imageCreateInfo = { 0 };
791 imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
792 imageCreateInfo.flags = 0;
793 imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
794 imageCreateInfo.format = format;
795 imageCreateInfo.extent.width = width;
796 imageCreateInfo.extent.height = height;
797 imageCreateInfo.extent.depth = 1;
798 imageCreateInfo.mipLevels = 1;
799 imageCreateInfo.arrayLayers = 1;
800 imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
801 imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
802 imageCreateInfo.usage = imageUsage;
803 imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
804 imageCreateInfo.queueFamilyIndexCount = 0;
805 imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
806
807 result = vkCreateImage(rendererData->device, &imageCreateInfo, NULL, &imageOut->image);
808 if (result != VK_SUCCESS) {
809 VULKAN_DestroyImage(rendererData, imageOut);
810 SET_ERROR_CODE("vkCreateImage()", result);
811 return result;
812 }
813
814 VkMemoryRequirements memoryRequirements = { 0 };
815 vkGetImageMemoryRequirements(rendererData->device, imageOut->image, &memoryRequirements);
816 if (result != VK_SUCCESS) {
817 VULKAN_DestroyImage(rendererData, imageOut);
818 SET_ERROR_CODE("vkGetImageMemoryRequirements()", result);
819 return result;
820 }
821
822 uint32_t memoryTypeIndex = 0;
823 if (!VULKAN_FindMemoryTypeIndex(rendererData, memoryRequirements.memoryTypeBits, 0, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memoryTypeIndex)) {
824 VULKAN_DestroyImage(rendererData, imageOut);
825 return VK_ERROR_UNKNOWN;
826 }
827
828 VkMemoryAllocateInfo memoryAllocateInfo = { 0 };
829 memoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
830 memoryAllocateInfo.allocationSize = memoryRequirements.size;
831 memoryAllocateInfo.memoryTypeIndex = memoryTypeIndex;
832 result = vkAllocateMemory(rendererData->device, &memoryAllocateInfo, NULL, &imageOut->deviceMemory);
833 if (result != VK_SUCCESS) {
834 VULKAN_DestroyImage(rendererData, imageOut);
835 SET_ERROR_CODE("vkAllocateMemory()", result);
836 return result;
837 }
838 result = vkBindImageMemory(rendererData->device, imageOut->image, imageOut->deviceMemory, 0);
839 if (result != VK_SUCCESS) {
840 VULKAN_DestroyImage(rendererData, imageOut);
841 SET_ERROR_CODE("vkBindImageMemory()", result);
842 return result;
843 }
844 } else {
845 imageOut->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
846 }
847
848 VkImageViewCreateInfo imageViewCreateInfo = { 0 };
849 imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
850 imageViewCreateInfo.image = imageOut->image;
851 imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
852 imageViewCreateInfo.format = format;
853 imageViewCreateInfo.components = swizzle;
854 imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
855 imageViewCreateInfo.subresourceRange.baseMipLevel = 0;
856 imageViewCreateInfo.subresourceRange.levelCount = 1;
857 imageViewCreateInfo.subresourceRange.baseArrayLayer = 0;
858 imageViewCreateInfo.subresourceRange.layerCount = 1;
859
860 // If it's a YCbCr image, we need to pass the conversion info to the VkImageView (and the VkSampler)
861 if (samplerYcbcrConversion != VK_NULL_HANDLE) {
862 samplerYcbcrConversionInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR;
863 samplerYcbcrConversionInfo.conversion = samplerYcbcrConversion;
864 imageViewCreateInfo.pNext = &samplerYcbcrConversionInfo;
865 }
866
867 result = vkCreateImageView(rendererData->device, &imageViewCreateInfo, NULL, &imageOut->imageView);
868 if (result != VK_SUCCESS) {
869 VULKAN_DestroyImage(rendererData, imageOut);
870 SET_ERROR_CODE("vkCreateImageView()", result);
871 return result;
872 }
873
874 return result;
875}
876
877
878static void VULKAN_RecordPipelineImageBarrier(VULKAN_RenderData *rendererData, VkAccessFlags sourceAccessMask, VkAccessFlags destAccessMask,
879 VkPipelineStageFlags srcStageFlags, VkPipelineStageFlags dstStageFlags, VkImageLayout destLayout, VkImage image, VkImageLayout *imageLayout)
880{
881 // Stop any outstanding renderpass if open
882 if (rendererData->currentRenderPass != VK_NULL_HANDLE) {
883 vkCmdEndRenderPass(rendererData->currentCommandBuffer);
884 rendererData->currentRenderPass = VK_NULL_HANDLE;
885 }
886
887 VkImageMemoryBarrier barrier = { 0 };
888 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
889 barrier.srcAccessMask = sourceAccessMask;
890 barrier.dstAccessMask = destAccessMask;
891 barrier.oldLayout = *imageLayout;
892 barrier.newLayout = destLayout;
893 barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
894 barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
895 barrier.image = image;
896 barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
897 barrier.subresourceRange.baseMipLevel = 0;
898 barrier.subresourceRange.levelCount = 1;
899 barrier.subresourceRange.baseArrayLayer = 0;
900 barrier.subresourceRange.layerCount = 1;
901 vkCmdPipelineBarrier(rendererData->currentCommandBuffer, srcStageFlags, dstStageFlags, 0, 0, NULL, 0, NULL, 1, &barrier);
902 *imageLayout = destLayout;
903}
904
905static VkResult VULKAN_AcquireNextSwapchainImage(SDL_Renderer *renderer)
906{
907 VULKAN_RenderData *rendererData = ( VULKAN_RenderData * )renderer->internal;
908
909 VkResult result;
910
911 rendererData->currentImageAvailableSemaphore = VK_NULL_HANDLE;
912 result = vkAcquireNextImageKHR(rendererData->device, rendererData->swapchain, UINT64_MAX,
913 rendererData->imageAvailableSemaphores[rendererData->currentCommandBufferIndex], VK_NULL_HANDLE, &rendererData->currentSwapchainImageIndex);
914 if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_ERROR_SURFACE_LOST_KHR) {
915 result = VULKAN_CreateWindowSizeDependentResources(renderer);
916 return result;
917 } else if(result == VK_SUBOPTIMAL_KHR) {
918 // Suboptimal, but we can contiue
919 } else if (result != VK_SUCCESS) {
920 SET_ERROR_CODE("vkAcquireNextImageKHR()", result);
921 return result;
922 }
923 rendererData->currentImageAvailableSemaphore = rendererData->imageAvailableSemaphores[rendererData->currentCommandBufferIndex];
924 return result;
925}
926
927static void VULKAN_BeginRenderPass(VULKAN_RenderData *rendererData, VkAttachmentLoadOp loadOp, VkClearColorValue *clearColor)
928{
929 int width = rendererData->swapchainSize.width;
930 int height = rendererData->swapchainSize.height;
931 if (rendererData->textureRenderTarget) {
932 width = rendererData->textureRenderTarget->width;
933 height = rendererData->textureRenderTarget->height;
934 }
935
936 switch (loadOp) {
937 case VK_ATTACHMENT_LOAD_OP_CLEAR:
938 rendererData->currentRenderPass = rendererData->textureRenderTarget ?
939 rendererData->textureRenderTarget->mainRenderpasses[VULKAN_RENDERPASS_CLEAR] :
940 rendererData->renderPasses[VULKAN_RENDERPASS_CLEAR];
941 break;
942
943 case VK_ATTACHMENT_LOAD_OP_LOAD:
944 default:
945 rendererData->currentRenderPass = rendererData->textureRenderTarget ?
946 rendererData->textureRenderTarget->mainRenderpasses[VULKAN_RENDERPASS_LOAD] :
947 rendererData->renderPasses[VULKAN_RENDERPASS_LOAD];
948 break;
949 }
950
951 VkFramebuffer framebuffer = rendererData->textureRenderTarget ?
952 rendererData->textureRenderTarget->mainFramebuffer :
953 rendererData->framebuffers[rendererData->currentSwapchainImageIndex];
954
955 VkRenderPassBeginInfo renderPassBeginInfo = { 0 };
956 renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
957 renderPassBeginInfo.pNext = NULL;
958 renderPassBeginInfo.renderPass = rendererData->currentRenderPass;
959 renderPassBeginInfo.framebuffer = framebuffer;
960 renderPassBeginInfo.renderArea.offset.x = 0;
961 renderPassBeginInfo.renderArea.offset.y = 0;
962 renderPassBeginInfo.renderArea.extent.width = width;
963 renderPassBeginInfo.renderArea.extent.height = height;
964 renderPassBeginInfo.clearValueCount = (clearColor == NULL) ? 0 : 1;
965 VkClearValue clearValue;
966 if (clearColor != NULL) {
967 clearValue.color = *clearColor;
968 renderPassBeginInfo.pClearValues = &clearValue;
969 }
970 vkCmdBeginRenderPass(rendererData->currentCommandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
971}
972
973static void VULKAN_EnsureCommandBuffer(VULKAN_RenderData *rendererData)
974{
975 if (rendererData->currentCommandBuffer == VK_NULL_HANDLE) {
976 rendererData->currentCommandBuffer = rendererData->commandBuffers[rendererData->currentCommandBufferIndex];
977 VULKAN_ResetCommandList(rendererData);
978
979 // Ensure the swapchain is in the correct layout
980 if (rendererData->swapchainImageLayouts[rendererData->currentSwapchainImageIndex] == VK_IMAGE_LAYOUT_UNDEFINED) {
981 VULKAN_RecordPipelineImageBarrier(rendererData,
982 0,
983 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
984 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
985 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
986 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
987 rendererData->swapchainImages[rendererData->currentSwapchainImageIndex],
988 &rendererData->swapchainImageLayouts[rendererData->currentSwapchainImageIndex]);
989 }
990 else if (rendererData->swapchainImageLayouts[rendererData->currentCommandBufferIndex] != VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
991 VULKAN_RecordPipelineImageBarrier(rendererData,
992 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
993 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
994 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
995 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
996 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
997 rendererData->swapchainImages[rendererData->currentSwapchainImageIndex],
998 &rendererData->swapchainImageLayouts[rendererData->currentSwapchainImageIndex]);
999 }
1000 }
1001}
1002
1003static bool VULKAN_ActivateCommandBuffer(SDL_Renderer *renderer, VkAttachmentLoadOp loadOp, VkClearColorValue *clearColor, VULKAN_DrawStateCache *stateCache)
1004{
1005 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
1006
1007 VULKAN_EnsureCommandBuffer(rendererData);
1008
1009 if (rendererData->currentRenderPass == VK_NULL_HANDLE || loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) {
1010 if (rendererData->currentRenderPass != VK_NULL_HANDLE) {
1011 vkCmdEndRenderPass(rendererData->currentCommandBuffer);
1012 rendererData->currentRenderPass = VK_NULL_HANDLE;
1013 }
1014 VULKAN_BeginRenderPass(rendererData, loadOp, clearColor);
1015 }
1016
1017 // Bind cached VB now
1018 if (stateCache->vertexBuffer != VK_NULL_HANDLE) {
1019 VkDeviceSize offset = 0;
1020 vkCmdBindVertexBuffers(rendererData->currentCommandBuffer, 0, 1, &stateCache->vertexBuffer, &offset);
1021 }
1022
1023 return true;
1024}
1025
1026static void VULKAN_WaitForGPU(VULKAN_RenderData *rendererData)
1027{
1028 vkQueueWaitIdle(rendererData->graphicsQueue);
1029}
1030
1031
1032static void VULKAN_ResetCommandList(VULKAN_RenderData *rendererData)
1033{
1034 vkResetCommandBuffer(rendererData->currentCommandBuffer, 0);
1035 for (uint32_t i = 0; i < rendererData->numDescriptorPools[rendererData->currentCommandBufferIndex]; i++) {
1036 vkResetDescriptorPool(rendererData->device, rendererData->descriptorPools[rendererData->currentCommandBufferIndex][i], 0);
1037 }
1038
1039 VkCommandBufferBeginInfo beginInfo = { 0 };
1040 beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1041 beginInfo.flags = 0;
1042 vkBeginCommandBuffer(rendererData->currentCommandBuffer, &beginInfo);
1043
1044 rendererData->currentPipelineState = NULL;
1045 rendererData->currentVertexBuffer = 0;
1046 rendererData->issueBatch = false;
1047 rendererData->cliprectDirty = true;
1048 rendererData->currentDescriptorSetIndex = 0;
1049 rendererData->currentDescriptorPoolIndex = 0;
1050 rendererData->currentConstantBufferOffset = -1;
1051 rendererData->currentConstantBufferIndex = 0;
1052
1053 // Release any upload buffers that were inflight
1054 for (int i = 0; i < rendererData->currentUploadBuffer[rendererData->currentCommandBufferIndex]; ++i) {
1055 VULKAN_DestroyBuffer(rendererData, &rendererData->uploadBuffers[rendererData->currentCommandBufferIndex][i]);
1056 }
1057 rendererData->currentUploadBuffer[rendererData->currentCommandBufferIndex] = 0;
1058}
1059
1060static VkResult VULKAN_IssueBatch(VULKAN_RenderData *rendererData)
1061{
1062 VkResult result;
1063 if (rendererData->currentCommandBuffer == VK_NULL_HANDLE) {
1064 return VK_SUCCESS;
1065 }
1066
1067 if (rendererData->currentRenderPass) {
1068 vkCmdEndRenderPass(rendererData->currentCommandBuffer);
1069 rendererData->currentRenderPass = VK_NULL_HANDLE;
1070 }
1071
1072 rendererData->currentPipelineState = VK_NULL_HANDLE;
1073 rendererData->viewportDirty = true;
1074
1075 vkEndCommandBuffer(rendererData->currentCommandBuffer);
1076
1077 VkSubmitInfo submitInfo = { 0 };
1078 VkPipelineStageFlags waitDestStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1079 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1080 submitInfo.commandBufferCount = 1;
1081 submitInfo.pCommandBuffers = &rendererData->currentCommandBuffer;
1082 if (rendererData->waitRenderSemaphoreCount > 0) {
1083 Uint32 additionalSemaphoreCount = (rendererData->currentImageAvailableSemaphore != VK_NULL_HANDLE) ? 1 : 0;
1084 submitInfo.waitSemaphoreCount = rendererData->waitRenderSemaphoreCount + additionalSemaphoreCount;
1085 if (additionalSemaphoreCount > 0) {
1086 rendererData->waitRenderSemaphores[rendererData->waitRenderSemaphoreCount] = rendererData->currentImageAvailableSemaphore;
1087 rendererData->waitDestStageMasks[rendererData->waitRenderSemaphoreCount] = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
1088 }
1089 submitInfo.pWaitSemaphores = rendererData->waitRenderSemaphores;
1090 submitInfo.pWaitDstStageMask = rendererData->waitDestStageMasks;
1091 rendererData->waitRenderSemaphoreCount = 0;
1092 } else if (rendererData->currentImageAvailableSemaphore != VK_NULL_HANDLE) {
1093 submitInfo.waitSemaphoreCount = 1;
1094 submitInfo.pWaitSemaphores = &rendererData->currentImageAvailableSemaphore;
1095 submitInfo.pWaitDstStageMask = &waitDestStageMask;
1096 }
1097
1098 result = vkQueueSubmit(rendererData->graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE);
1099 rendererData->currentImageAvailableSemaphore = VK_NULL_HANDLE;
1100
1101 VULKAN_WaitForGPU(rendererData);
1102
1103 VULKAN_ResetCommandList(rendererData);
1104
1105 return result;
1106}
1107
1108static void VULKAN_DestroyRenderer(SDL_Renderer *renderer)
1109{
1110 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
1111 if (rendererData) {
1112 if (rendererData->device != VK_NULL_HANDLE) {
1113 vkDeviceWaitIdle(rendererData->device);
1114 VULKAN_DestroyAll(renderer);
1115 }
1116 SDL_free(rendererData);
1117 }
1118}
1119
1120static VkBlendFactor GetBlendFactor(SDL_BlendFactor factor)
1121{
1122 switch (factor) {
1123 case SDL_BLENDFACTOR_ZERO:
1124 return VK_BLEND_FACTOR_ZERO;
1125 case SDL_BLENDFACTOR_ONE:
1126 return VK_BLEND_FACTOR_ONE;
1127 case SDL_BLENDFACTOR_SRC_COLOR:
1128 return VK_BLEND_FACTOR_SRC_COLOR;
1129 case SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR:
1130 return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;
1131 case SDL_BLENDFACTOR_SRC_ALPHA:
1132 return VK_BLEND_FACTOR_SRC_ALPHA;
1133 case SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA:
1134 return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
1135 case SDL_BLENDFACTOR_DST_COLOR:
1136 return VK_BLEND_FACTOR_DST_COLOR;
1137 case SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR:
1138 return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;
1139 case SDL_BLENDFACTOR_DST_ALPHA:
1140 return VK_BLEND_FACTOR_DST_ALPHA;
1141 case SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA:
1142 return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;
1143 default:
1144 return VK_BLEND_FACTOR_MAX_ENUM;
1145 }
1146}
1147
1148static VkBlendOp GetBlendOp(SDL_BlendOperation operation)
1149{
1150 switch (operation) {
1151 case SDL_BLENDOPERATION_ADD:
1152 return VK_BLEND_OP_ADD;
1153 case SDL_BLENDOPERATION_SUBTRACT:
1154 return VK_BLEND_OP_SUBTRACT;
1155 case SDL_BLENDOPERATION_REV_SUBTRACT:
1156 return VK_BLEND_OP_REVERSE_SUBTRACT;
1157 case SDL_BLENDOPERATION_MINIMUM:
1158 return VK_BLEND_OP_MIN;
1159 case SDL_BLENDOPERATION_MAXIMUM:
1160 return VK_BLEND_OP_MAX;
1161 default:
1162 return VK_BLEND_OP_MAX_ENUM;
1163 }
1164}
1165
1166
1167static VULKAN_PipelineState *VULKAN_CreatePipelineState(SDL_Renderer *renderer,
1168 VULKAN_Shader shader, VkPipelineLayout pipelineLayout, VkDescriptorSetLayout descriptorSetLayout, SDL_BlendMode blendMode, VkPrimitiveTopology topology, VkFormat format)
1169{
1170 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
1171 VULKAN_PipelineState *pipelineStates;
1172 VkPipeline pipeline = VK_NULL_HANDLE;
1173 VkResult result = VK_SUCCESS;
1174 VkPipelineVertexInputStateCreateInfo vertexInputCreateInfo = { 0 };
1175 VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCreateInfo = { 0 };
1176 VkVertexInputAttributeDescription attributeDescriptions[3];
1177 VkVertexInputBindingDescription bindingDescriptions[1];
1178 VkPipelineShaderStageCreateInfo shaderStageCreateInfo[2];
1179 VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo = { 0 };
1180 VkPipelineViewportStateCreateInfo viewportStateCreateInfo = { 0 };
1181 VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo = { 0 };
1182 VkPipelineMultisampleStateCreateInfo multisampleStateCreateInfo = { 0 };
1183 VkPipelineDepthStencilStateCreateInfo depthStencilStateCreateInfo = { 0 };
1184 VkPipelineColorBlendStateCreateInfo colorBlendStateCreateInfo = { 0 };
1185
1186 VkGraphicsPipelineCreateInfo pipelineCreateInfo = { 0 };
1187 pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
1188 pipelineCreateInfo.flags = 0;
1189 pipelineCreateInfo.pStages = shaderStageCreateInfo;
1190 pipelineCreateInfo.pVertexInputState = &vertexInputCreateInfo;
1191 pipelineCreateInfo.pInputAssemblyState = &inputAssemblyStateCreateInfo;
1192 pipelineCreateInfo.pViewportState = &viewportStateCreateInfo;
1193 pipelineCreateInfo.pRasterizationState = &rasterizationStateCreateInfo;
1194 pipelineCreateInfo.pMultisampleState = &multisampleStateCreateInfo;
1195 pipelineCreateInfo.pDepthStencilState = &depthStencilStateCreateInfo;
1196 pipelineCreateInfo.pColorBlendState = &colorBlendStateCreateInfo;
1197 pipelineCreateInfo.pDynamicState = &dynamicStateCreateInfo;
1198
1199 // Shaders
1200 const char *name = "main";
1201 for (uint32_t i = 0; i < 2; i++) {
1202 SDL_memset(&shaderStageCreateInfo[i], 0, sizeof(shaderStageCreateInfo[i]));
1203 shaderStageCreateInfo[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1204 shaderStageCreateInfo[i].module = (i == 0) ? rendererData->vertexShaderModules[shader] : rendererData->fragmentShaderModules[shader];
1205 shaderStageCreateInfo[i].stage = (i == 0) ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT;
1206 shaderStageCreateInfo[i].pName = name;
1207 }
1208 pipelineCreateInfo.stageCount = 2;
1209 pipelineCreateInfo.pStages = &shaderStageCreateInfo[0];
1210
1211
1212 // Vertex input
1213 vertexInputCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
1214 vertexInputCreateInfo.vertexAttributeDescriptionCount = 3;
1215 vertexInputCreateInfo.pVertexAttributeDescriptions = &attributeDescriptions[0];
1216 vertexInputCreateInfo.vertexBindingDescriptionCount = 1;
1217 vertexInputCreateInfo.pVertexBindingDescriptions = &bindingDescriptions[0];
1218
1219 attributeDescriptions[ 0 ].binding = 0;
1220 attributeDescriptions[ 0 ].format = VK_FORMAT_R32G32_SFLOAT;
1221 attributeDescriptions[ 0 ].location = 0;
1222 attributeDescriptions[ 0 ].offset = 0;
1223 attributeDescriptions[ 1 ].binding = 0;
1224 attributeDescriptions[ 1 ].format = VK_FORMAT_R32G32_SFLOAT;
1225 attributeDescriptions[ 1 ].location = 1;
1226 attributeDescriptions[ 1 ].offset = 8;
1227 attributeDescriptions[ 2 ].binding = 0;
1228 attributeDescriptions[ 2 ].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1229 attributeDescriptions[ 2 ].location = 2;
1230 attributeDescriptions[ 2 ].offset = 16;
1231
1232 bindingDescriptions[ 0 ].binding = 0;
1233 bindingDescriptions[ 0 ].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1234 bindingDescriptions[ 0 ].stride = 32;
1235
1236 // Input assembly
1237 inputAssemblyStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
1238 inputAssemblyStateCreateInfo.topology = topology;
1239 inputAssemblyStateCreateInfo.primitiveRestartEnable = VK_FALSE;
1240
1241 viewportStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
1242 viewportStateCreateInfo.scissorCount = 1;
1243 viewportStateCreateInfo.viewportCount = 1;
1244
1245 // Dynamic states
1246 dynamicStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
1247 VkDynamicState dynamicStates[2] = {
1248 VK_DYNAMIC_STATE_VIEWPORT,
1249 VK_DYNAMIC_STATE_SCISSOR
1250 };
1251 dynamicStateCreateInfo.dynamicStateCount = SDL_arraysize(dynamicStates);
1252 dynamicStateCreateInfo.pDynamicStates = dynamicStates;
1253
1254 // Rasterization state
1255 rasterizationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1256 rasterizationStateCreateInfo.depthClampEnable = VK_FALSE;
1257 rasterizationStateCreateInfo.rasterizerDiscardEnable = VK_FALSE;
1258 rasterizationStateCreateInfo.cullMode = VK_CULL_MODE_NONE;
1259 rasterizationStateCreateInfo.polygonMode = VK_POLYGON_MODE_FILL;
1260 rasterizationStateCreateInfo.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
1261 rasterizationStateCreateInfo.depthBiasEnable = VK_FALSE;
1262 rasterizationStateCreateInfo.depthBiasConstantFactor = 0.0f;
1263 rasterizationStateCreateInfo.depthBiasClamp = 0.0f;
1264 rasterizationStateCreateInfo.depthBiasSlopeFactor = 0.0f;
1265 rasterizationStateCreateInfo.lineWidth = 1.0f;
1266
1267 // MSAA state
1268 multisampleStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
1269 VkSampleMask multiSampleMask = 0xFFFFFFFF;
1270 multisampleStateCreateInfo.pSampleMask = &multiSampleMask;
1271 multisampleStateCreateInfo.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
1272
1273 // Depth Stencil
1274 depthStencilStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
1275
1276 // Color blend
1277 VkPipelineColorBlendAttachmentState colorBlendAttachment = { 0 };
1278 colorBlendStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
1279 colorBlendStateCreateInfo.attachmentCount = 1;
1280 colorBlendStateCreateInfo.pAttachments = &colorBlendAttachment;
1281 colorBlendAttachment.blendEnable = VK_TRUE;
1282 colorBlendAttachment.srcColorBlendFactor = GetBlendFactor(SDL_GetBlendModeSrcColorFactor(blendMode));
1283 colorBlendAttachment.srcAlphaBlendFactor = GetBlendFactor(SDL_GetBlendModeSrcAlphaFactor(blendMode));
1284 colorBlendAttachment.colorBlendOp = GetBlendOp(SDL_GetBlendModeColorOperation(blendMode));
1285 colorBlendAttachment.dstColorBlendFactor = GetBlendFactor(SDL_GetBlendModeDstColorFactor(blendMode));
1286 colorBlendAttachment.dstAlphaBlendFactor = GetBlendFactor(SDL_GetBlendModeDstAlphaFactor(blendMode));
1287 colorBlendAttachment.alphaBlendOp = GetBlendOp(SDL_GetBlendModeAlphaOperation(blendMode));
1288 colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
1289
1290 // Renderpass / layout
1291 pipelineCreateInfo.renderPass = rendererData->currentRenderPass;
1292 pipelineCreateInfo.subpass = 0;
1293 pipelineCreateInfo.layout = pipelineLayout;
1294
1295 result = vkCreateGraphicsPipelines(rendererData->device, VK_NULL_HANDLE, 1, &pipelineCreateInfo, NULL, &pipeline);
1296 if (result != VK_SUCCESS) {
1297 SET_ERROR_CODE("vkCreateGraphicsPipelines()", result);
1298 return NULL;
1299 }
1300
1301 pipelineStates = (VULKAN_PipelineState *)SDL_realloc(rendererData->pipelineStates, (rendererData->pipelineStateCount + 1) * sizeof(*pipelineStates));
1302 if (!pipelineStates) {
1303 return NULL;
1304 }
1305 pipelineStates[rendererData->pipelineStateCount].shader = shader;
1306 pipelineStates[rendererData->pipelineStateCount].blendMode = blendMode;
1307 pipelineStates[rendererData->pipelineStateCount].topology = topology;
1308 pipelineStates[rendererData->pipelineStateCount].format = format;
1309 pipelineStates[rendererData->pipelineStateCount].pipeline = pipeline;
1310 pipelineStates[rendererData->pipelineStateCount].descriptorSetLayout = descriptorSetLayout;
1311 pipelineStates[rendererData->pipelineStateCount].pipelineLayout = pipelineCreateInfo.layout;
1312 rendererData->pipelineStates = pipelineStates;
1313 ++rendererData->pipelineStateCount;
1314
1315 return &pipelineStates[rendererData->pipelineStateCount - 1];
1316}
1317
1318static bool VULKAN_FindMemoryTypeIndex(VULKAN_RenderData *rendererData, uint32_t typeBits, VkMemoryPropertyFlags requiredFlags, VkMemoryPropertyFlags desiredFlags, uint32_t *memoryTypeIndexOut)
1319{
1320 uint32_t memoryTypeIndex = 0;
1321 bool foundExactMatch = false;
1322
1323 // Desired flags must be a superset of required flags.
1324 desiredFlags |= requiredFlags;
1325
1326 for (memoryTypeIndex = 0; memoryTypeIndex < rendererData->physicalDeviceMemoryProperties.memoryTypeCount; memoryTypeIndex++) {
1327 if (typeBits & (1 << memoryTypeIndex)) {
1328 if (rendererData->physicalDeviceMemoryProperties.memoryTypes[memoryTypeIndex].propertyFlags == desiredFlags) {
1329 foundExactMatch = true;
1330 break;
1331 }
1332 }
1333 }
1334 if (!foundExactMatch) {
1335 for (memoryTypeIndex = 0; memoryTypeIndex < rendererData->physicalDeviceMemoryProperties.memoryTypeCount; memoryTypeIndex++) {
1336 if (typeBits & (1 << memoryTypeIndex)) {
1337 if ((rendererData->physicalDeviceMemoryProperties.memoryTypes[memoryTypeIndex].propertyFlags & requiredFlags) == requiredFlags) {
1338 break;
1339 }
1340 }
1341 }
1342 }
1343
1344 if (memoryTypeIndex >= rendererData->physicalDeviceMemoryProperties.memoryTypeCount) {
1345 SET_ERROR_MESSAGE("Unable to find memory type for allocation");
1346 return false;
1347 }
1348 *memoryTypeIndexOut = memoryTypeIndex;
1349 return true;
1350}
1351
1352static VkResult VULKAN_CreateVertexBuffer(VULKAN_RenderData *rendererData, size_t vbidx, size_t size)
1353{
1354 VkResult result;
1355
1356 VULKAN_DestroyBuffer(rendererData, &rendererData->vertexBuffers[vbidx]);
1357
1358 result = VULKAN_AllocateBuffer(rendererData, size,
1359 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
1360 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
1361 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1362 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
1363 &rendererData->vertexBuffers[vbidx]);
1364 if (result != VK_SUCCESS) {
1365 return result;
1366 }
1367 return result;
1368}
1369
1370static bool VULKAN_LoadGlobalFunctions(VULKAN_RenderData *rendererData)
1371{
1372#define VULKAN_DEVICE_FUNCTION(name)
1373#define VULKAN_GLOBAL_FUNCTION(name) \
1374 name = (PFN_##name)rendererData->vkGetInstanceProcAddr(VK_NULL_HANDLE, #name); \
1375 if (!name) { \
1376 SET_ERROR_MESSAGE("vkGetInstanceProcAddr(VK_NULL_HANDLE, \"" #name "\") failed"); \
1377 return false; \
1378 }
1379#define VULKAN_INSTANCE_FUNCTION(name)
1380#define VULKAN_OPTIONAL_INSTANCE_FUNCTION(name)
1381#define VULKAN_OPTIONAL_DEVICE_FUNCTION(name)
1382 VULKAN_FUNCTIONS()
1383#undef VULKAN_DEVICE_FUNCTION
1384#undef VULKAN_GLOBAL_FUNCTION
1385#undef VULKAN_INSTANCE_FUNCTION
1386#undef VULKAN_OPTIONAL_INSTANCE_FUNCTION
1387#undef VULKAN_OPTIONAL_DEVICE_FUNCTION
1388
1389 return true;
1390}
1391
1392static bool VULKAN_LoadInstanceFunctions(VULKAN_RenderData *rendererData)
1393{
1394#define VULKAN_DEVICE_FUNCTION(name)
1395#define VULKAN_GLOBAL_FUNCTION(name)
1396#define VULKAN_INSTANCE_FUNCTION(name) \
1397 name = (PFN_##name)rendererData->vkGetInstanceProcAddr(rendererData->instance, #name); \
1398 if (!name) { \
1399 SET_ERROR_MESSAGE("vkGetInstanceProcAddr(instance, \"" #name "\") failed"); \
1400 return false; \
1401 }
1402#define VULKAN_OPTIONAL_INSTANCE_FUNCTION(name) \
1403 name = (PFN_##name)rendererData->vkGetInstanceProcAddr(rendererData->instance, #name);
1404#define VULKAN_OPTIONAL_DEVICE_FUNCTION(name)
1405
1406 VULKAN_FUNCTIONS()
1407#undef VULKAN_DEVICE_FUNCTION
1408#undef VULKAN_GLOBAL_FUNCTION
1409#undef VULKAN_INSTANCE_FUNCTION
1410#undef VULKAN_OPTIONAL_INSTANCE_FUNCTION
1411#undef VULKAN_OPTIONAL_DEVICE_FUNCTION
1412
1413 return true;
1414}
1415
1416static bool VULKAN_LoadDeviceFunctions(VULKAN_RenderData *rendererData)
1417{
1418#define VULKAN_DEVICE_FUNCTION(name) \
1419 name = (PFN_##name)vkGetDeviceProcAddr(rendererData->device, #name); \
1420 if (!name) { \
1421 SET_ERROR_MESSAGE("vkGetDeviceProcAddr(device, \"" #name "\") failed"); \
1422 return false; \
1423 }
1424#define VULKAN_GLOBAL_FUNCTION(name)
1425#define VULKAN_OPTIONAL_DEVICE_FUNCTION(name) \
1426 name = (PFN_##name)vkGetDeviceProcAddr(rendererData->device, #name);
1427#define VULKAN_INSTANCE_FUNCTION(name)
1428#define VULKAN_OPTIONAL_INSTANCE_FUNCTION(name)
1429 VULKAN_FUNCTIONS()
1430#undef VULKAN_DEVICE_FUNCTION
1431#undef VULKAN_GLOBAL_FUNCTION
1432#undef VULKAN_INSTANCE_FUNCTION
1433#undef VULKAN_OPTIONAL_INSTANCE_FUNCTION
1434#undef VULKAN_OPTIONAL_DEVICE_FUNCTION
1435 return true;
1436}
1437
1438static VkResult VULKAN_FindPhysicalDevice(VULKAN_RenderData *rendererData)
1439{
1440 uint32_t physicalDeviceCount = 0;
1441 VkPhysicalDevice *physicalDevices;
1442 VkQueueFamilyProperties *queueFamiliesProperties = NULL;
1443 uint32_t queueFamiliesPropertiesAllocatedSize = 0;
1444 VkExtensionProperties *deviceExtensions = NULL;
1445 uint32_t deviceExtensionsAllocatedSize = 0;
1446 uint32_t physicalDeviceIndex;
1447 VkResult result;
1448
1449 result = vkEnumeratePhysicalDevices(rendererData->instance, &physicalDeviceCount, NULL);
1450 if (result != VK_SUCCESS) {
1451 SET_ERROR_CODE("vkEnumeratePhysicalDevices()", result);
1452 return result;
1453 }
1454 if (physicalDeviceCount == 0) {
1455 SET_ERROR_MESSAGE("vkEnumeratePhysicalDevices(): no physical devices");
1456 return VK_ERROR_UNKNOWN;
1457 }
1458 physicalDevices = (VkPhysicalDevice *)SDL_malloc(sizeof(VkPhysicalDevice) * physicalDeviceCount);
1459 result = vkEnumeratePhysicalDevices(rendererData->instance, &physicalDeviceCount, physicalDevices);
1460 if (result != VK_SUCCESS) {
1461 SDL_free(physicalDevices);
1462 SET_ERROR_CODE("vkEnumeratePhysicalDevices()", result);
1463 return result;
1464 }
1465 rendererData->physicalDevice = NULL;
1466 for (physicalDeviceIndex = 0; physicalDeviceIndex < physicalDeviceCount; physicalDeviceIndex++) {
1467 uint32_t queueFamiliesCount = 0;
1468 uint32_t queueFamilyIndex;
1469 uint32_t deviceExtensionCount = 0;
1470 bool hasSwapchainExtension = false;
1471 uint32_t i;
1472
1473 VkPhysicalDevice physicalDevice = physicalDevices[physicalDeviceIndex];
1474 vkGetPhysicalDeviceProperties(physicalDevice, &rendererData->physicalDeviceProperties);
1475 if (VK_VERSION_MAJOR(rendererData->physicalDeviceProperties.apiVersion) < 1) {
1476 continue;
1477 }
1478 vkGetPhysicalDeviceMemoryProperties(physicalDevice, &rendererData->physicalDeviceMemoryProperties);
1479 vkGetPhysicalDeviceFeatures(physicalDevice, &rendererData->physicalDeviceFeatures);
1480 vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamiliesCount, NULL);
1481 if (queueFamiliesCount == 0) {
1482 continue;
1483 }
1484 if (queueFamiliesPropertiesAllocatedSize < queueFamiliesCount) {
1485 SDL_free(queueFamiliesProperties);
1486 queueFamiliesPropertiesAllocatedSize = queueFamiliesCount;
1487 queueFamiliesProperties = (VkQueueFamilyProperties *)SDL_malloc(sizeof(VkQueueFamilyProperties) * queueFamiliesPropertiesAllocatedSize);
1488 if (!queueFamiliesProperties) {
1489 SDL_free(physicalDevices);
1490 SDL_free(deviceExtensions);
1491 return VK_ERROR_UNKNOWN;
1492 }
1493 }
1494 vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamiliesCount, queueFamiliesProperties);
1495 rendererData->graphicsQueueFamilyIndex = queueFamiliesCount;
1496 rendererData->presentQueueFamilyIndex = queueFamiliesCount;
1497 for (queueFamilyIndex = 0; queueFamilyIndex < queueFamiliesCount; queueFamilyIndex++) {
1498 VkBool32 supported = 0;
1499
1500 if (queueFamiliesProperties[queueFamilyIndex].queueCount == 0) {
1501 continue;
1502 }
1503
1504 if (queueFamiliesProperties[queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
1505 rendererData->graphicsQueueFamilyIndex = queueFamilyIndex;
1506 }
1507
1508 result = vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, rendererData->surface, &supported);
1509 if (result != VK_SUCCESS) {
1510 SDL_free(physicalDevices);
1511 SDL_free(queueFamiliesProperties);
1512 SDL_free(deviceExtensions);
1513 SET_ERROR_CODE("vkGetPhysicalDeviceSurfaceSupportKHR()", result);
1514 return VK_ERROR_UNKNOWN;
1515 }
1516 if (supported) {
1517 rendererData->presentQueueFamilyIndex = queueFamilyIndex;
1518 if (queueFamiliesProperties[queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT) {
1519 break; // use this queue because it can present and do graphics
1520 }
1521 }
1522 }
1523
1524 if (rendererData->graphicsQueueFamilyIndex == queueFamiliesCount) { // no good queues found
1525 continue;
1526 }
1527 if (rendererData->presentQueueFamilyIndex == queueFamiliesCount) { // no good queues found
1528 continue;
1529 }
1530 result = vkEnumerateDeviceExtensionProperties(physicalDevice, NULL, &deviceExtensionCount, NULL);
1531 if (result != VK_SUCCESS) {
1532 SDL_free(physicalDevices);
1533 SDL_free(queueFamiliesProperties);
1534 SDL_free(deviceExtensions);
1535 SET_ERROR_CODE("vkEnumerateDeviceExtensionProperties()", result);
1536 return VK_ERROR_UNKNOWN;
1537 }
1538 if (deviceExtensionCount == 0) {
1539 continue;
1540 }
1541 if (deviceExtensionsAllocatedSize < deviceExtensionCount) {
1542 SDL_free(deviceExtensions);
1543 deviceExtensionsAllocatedSize = deviceExtensionCount;
1544 deviceExtensions = (VkExtensionProperties *)SDL_malloc(sizeof(VkExtensionProperties) * deviceExtensionsAllocatedSize);
1545 if (!deviceExtensions) {
1546 SDL_free(physicalDevices);
1547 SDL_free(queueFamiliesProperties);
1548 return VK_ERROR_UNKNOWN;
1549 }
1550 }
1551 result = vkEnumerateDeviceExtensionProperties(physicalDevice, NULL, &deviceExtensionCount, deviceExtensions);
1552 if (result != VK_SUCCESS) {
1553 SDL_free(physicalDevices);
1554 SDL_free(queueFamiliesProperties);
1555 SDL_free(deviceExtensions);
1556 SET_ERROR_CODE("vkEnumerateDeviceExtensionProperties()", result);
1557 return result;
1558 }
1559 for (i = 0; i < deviceExtensionCount; i++) {
1560 if (SDL_strcmp(deviceExtensions[i].extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
1561 hasSwapchainExtension = true;
1562 break;
1563 }
1564 }
1565 if (!hasSwapchainExtension) {
1566 continue;
1567 }
1568 rendererData->physicalDevice = physicalDevice;
1569 break;
1570 }
1571 SDL_free(physicalDevices);
1572 SDL_free(queueFamiliesProperties);
1573 SDL_free(deviceExtensions);
1574 if (!rendererData->physicalDevice) {
1575 SET_ERROR_MESSAGE("No viable physical devices found");
1576 return VK_ERROR_UNKNOWN;
1577 }
1578 return VK_SUCCESS;
1579}
1580
1581static VkResult VULKAN_GetSurfaceFormats(VULKAN_RenderData *rendererData)
1582{
1583 VkResult result = vkGetPhysicalDeviceSurfaceFormatsKHR(rendererData->physicalDevice,
1584 rendererData->surface,
1585 &rendererData->surfaceFormatsCount,
1586 NULL);
1587 if (result != VK_SUCCESS) {
1588 rendererData->surfaceFormatsCount = 0;
1589 SET_ERROR_CODE("vkGetPhysicalDeviceSurfaceFormatsKHR()", result);
1590 return result;
1591 }
1592 if (rendererData->surfaceFormatsCount > rendererData->surfaceFormatsAllocatedCount) {
1593 rendererData->surfaceFormatsAllocatedCount = rendererData->surfaceFormatsCount;
1594 SDL_free(rendererData->surfaceFormats);
1595 rendererData->surfaceFormats = (VkSurfaceFormatKHR *)SDL_malloc(sizeof(VkSurfaceFormatKHR) * rendererData->surfaceFormatsAllocatedCount);
1596 }
1597 result = vkGetPhysicalDeviceSurfaceFormatsKHR(rendererData->physicalDevice,
1598 rendererData->surface,
1599 &rendererData->surfaceFormatsCount,
1600 rendererData->surfaceFormats);
1601 if (result != VK_SUCCESS) {
1602 rendererData->surfaceFormatsCount = 0;
1603 SET_ERROR_CODE("vkGetPhysicalDeviceSurfaceFormatsKHR()", result);
1604 return result;
1605 }
1606
1607 return VK_SUCCESS;
1608}
1609
1610static VkSemaphore VULKAN_CreateSemaphore(VULKAN_RenderData *rendererData)
1611{
1612 VkResult result;
1613 VkSemaphore semaphore = VK_NULL_HANDLE;
1614
1615 VkSemaphoreCreateInfo semaphoreCreateInfo = { 0 };
1616 semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
1617 result = vkCreateSemaphore(rendererData->device, &semaphoreCreateInfo, NULL, &semaphore);
1618 if (result != VK_SUCCESS) {
1619 SET_ERROR_CODE("vkCreateSemaphore()", result);
1620 return VK_NULL_HANDLE;
1621 }
1622 return semaphore;
1623}
1624
1625static bool VULKAN_DeviceExtensionsFound(VULKAN_RenderData *rendererData, int extensionsToCheck, const char* const* extNames)
1626{
1627 uint32_t extensionCount;
1628 bool foundExtensions = true;
1629 VkResult result = vkEnumerateDeviceExtensionProperties(rendererData->physicalDevice, NULL, &extensionCount, NULL);
1630 if (result != VK_SUCCESS ) {
1631 SET_ERROR_CODE("vkEnumerateDeviceExtensionProperties()", result);
1632 return false;
1633 }
1634 if (extensionCount > 0 ) {
1635 VkExtensionProperties *extensionProperties = (VkExtensionProperties *)SDL_calloc(extensionCount, sizeof(VkExtensionProperties));
1636 result = vkEnumerateDeviceExtensionProperties(rendererData->physicalDevice, NULL, &extensionCount, extensionProperties);
1637 if (result != VK_SUCCESS ) {
1638 SET_ERROR_CODE("vkEnumerateDeviceExtensionProperties()", result);
1639 SDL_free(extensionProperties);
1640 return false;
1641 }
1642 for (int ext = 0; ext < extensionsToCheck && foundExtensions; ext++) {
1643 bool foundExtension = false;
1644 for (uint32_t i = 0; i < extensionCount; i++) {
1645 if (SDL_strcmp(extensionProperties[i].extensionName, extNames[ext]) == 0) {
1646 foundExtension = true;
1647 break;
1648 }
1649 }
1650 foundExtensions &= foundExtension;
1651 }
1652
1653 SDL_free(extensionProperties);
1654 }
1655
1656 return foundExtensions;
1657}
1658
1659static bool VULKAN_InstanceExtensionFound(VULKAN_RenderData *rendererData, const char *extName)
1660{
1661 uint32_t extensionCount;
1662 VkResult result = vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
1663 if (result != VK_SUCCESS ) {
1664 SET_ERROR_CODE("vkEnumerateInstanceExtensionProperties()", result);
1665 return false;
1666 }
1667 if (extensionCount > 0 ) {
1668 VkExtensionProperties *extensionProperties = (VkExtensionProperties *)SDL_calloc(extensionCount, sizeof(VkExtensionProperties));
1669 result = vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, extensionProperties);
1670 if (result != VK_SUCCESS ) {
1671 SET_ERROR_CODE("vkEnumerateInstanceExtensionProperties()", result);
1672 SDL_free(extensionProperties);
1673 return false;
1674 }
1675 for (uint32_t i = 0; i< extensionCount; i++) {
1676 if (SDL_strcmp(extensionProperties[i].extensionName, extName) == 0) {
1677 SDL_free(extensionProperties);
1678 return true;
1679 }
1680 }
1681 SDL_free(extensionProperties);
1682 }
1683
1684 return false;
1685}
1686
1687static bool VULKAN_ValidationLayersFound(void)
1688{
1689 uint32_t instanceLayerCount = 0;
1690 uint32_t i;
1691 bool foundValidation = false;
1692
1693 vkEnumerateInstanceLayerProperties(&instanceLayerCount, NULL);
1694 if (instanceLayerCount > 0) {
1695 VkLayerProperties *instanceLayers = (VkLayerProperties *)SDL_calloc(instanceLayerCount, sizeof(VkLayerProperties));
1696 vkEnumerateInstanceLayerProperties(&instanceLayerCount, instanceLayers);
1697 for (i = 0; i < instanceLayerCount; i++) {
1698 if (!SDL_strcmp(SDL_VULKAN_VALIDATION_LAYER_NAME, instanceLayers[i].layerName)) {
1699 foundValidation = true;
1700 break;
1701 }
1702 }
1703 SDL_free(instanceLayers);
1704 }
1705
1706 return foundValidation;
1707}
1708
1709// Create resources that depend on the device.
1710static VkResult VULKAN_CreateDeviceResources(SDL_Renderer *renderer, SDL_PropertiesID create_props)
1711{
1712 static const char *const deviceExtensionNames[] = {
1713 VK_KHR_SWAPCHAIN_EXTENSION_NAME,
1714 /* VK_KHR_sampler_ycbcr_conversion + dependent extensions.
1715 Note VULKAN_DeviceExtensionsFound() call below, if these get moved in this
1716 array, update that check too.
1717 */
1718 VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
1719 VK_KHR_MAINTENANCE1_EXTENSION_NAME,
1720 VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
1721 VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
1722 };
1723 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
1724 SDL_VideoDevice *device = SDL_GetVideoDevice();
1725 VkResult result = VK_SUCCESS;
1726 PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = NULL;
1727 bool createDebug = SDL_GetHintBoolean(SDL_HINT_RENDER_VULKAN_DEBUG, false);
1728 const char *validationLayerName[] = { SDL_VULKAN_VALIDATION_LAYER_NAME };
1729
1730 if (!SDL_Vulkan_LoadLibrary(NULL)) {
1731 SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, "SDL_Vulkan_LoadLibrary failed" );
1732 return VK_ERROR_UNKNOWN;
1733 }
1734 vkGetInstanceProcAddr = device ? (PFN_vkGetInstanceProcAddr)device->vulkan_config.vkGetInstanceProcAddr : NULL;
1735 if(!vkGetInstanceProcAddr) {
1736 SDL_LogDebug(SDL_LOG_CATEGORY_RENDER, "vkGetInstanceProcAddr is NULL" );
1737 return VK_ERROR_UNKNOWN;
1738 }
1739
1740 // Load global Vulkan functions
1741 rendererData->vkGetInstanceProcAddr = vkGetInstanceProcAddr;
1742 if (!VULKAN_LoadGlobalFunctions(rendererData)) {
1743 return VK_ERROR_UNKNOWN;
1744 }
1745
1746 // Check for colorspace extension
1747 rendererData->supportsEXTSwapchainColorspace = VK_FALSE;
1748 if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR ||
1749 renderer->output_colorspace == SDL_COLORSPACE_HDR10) {
1750 rendererData->supportsEXTSwapchainColorspace = VULKAN_InstanceExtensionFound(rendererData, VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME);
1751 if (!rendererData->supportsEXTSwapchainColorspace) {
1752 SDL_SetError("Using HDR output but %s not supported", VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME);
1753 return VK_ERROR_UNKNOWN;
1754 }
1755 }
1756
1757 // Check for VK_KHR_get_physical_device_properties2
1758 rendererData->supportsKHRGetPhysicalDeviceProperties2 = VULKAN_InstanceExtensionFound(rendererData, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1759
1760 // Create VkInstance
1761 rendererData->instance = (VkInstance)SDL_GetPointerProperty(create_props, SDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER, NULL);
1762 if (rendererData->instance) {
1763 rendererData->instance_external = true;
1764 } else {
1765 VkInstanceCreateInfo instanceCreateInfo = { 0 };
1766 VkApplicationInfo appInfo = { 0 };
1767 appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
1768 appInfo.apiVersion = VK_API_VERSION_1_0;
1769 instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
1770 instanceCreateInfo.pApplicationInfo = &appInfo;
1771 char const *const *instanceExtensions = SDL_Vulkan_GetInstanceExtensions(&instanceCreateInfo.enabledExtensionCount);
1772
1773 const char **instanceExtensionsCopy = (const char **)SDL_calloc(instanceCreateInfo.enabledExtensionCount + 2, sizeof(const char *));
1774 for (uint32_t i = 0; i < instanceCreateInfo.enabledExtensionCount; i++) {
1775 instanceExtensionsCopy[i] = instanceExtensions[i];
1776 }
1777 if (rendererData->supportsEXTSwapchainColorspace) {
1778 instanceExtensionsCopy[instanceCreateInfo.enabledExtensionCount] = VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME;
1779 instanceCreateInfo.enabledExtensionCount++;
1780 }
1781 if (rendererData->supportsKHRGetPhysicalDeviceProperties2) {
1782 instanceExtensionsCopy[instanceCreateInfo.enabledExtensionCount] = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME;
1783 instanceCreateInfo.enabledExtensionCount++;
1784 }
1785 instanceCreateInfo.ppEnabledExtensionNames = (const char *const *)instanceExtensionsCopy;
1786 if (createDebug && VULKAN_ValidationLayersFound()) {
1787 instanceCreateInfo.ppEnabledLayerNames = validationLayerName;
1788 instanceCreateInfo.enabledLayerCount = 1;
1789 }
1790 result = vkCreateInstance(&instanceCreateInfo, NULL, &rendererData->instance);
1791 SDL_free((void *)instanceExtensionsCopy);
1792 if (result != VK_SUCCESS) {
1793 SET_ERROR_CODE("vkCreateInstance()", result);
1794 return result;
1795 }
1796 }
1797
1798 // Load instance Vulkan functions
1799 if (!VULKAN_LoadInstanceFunctions(rendererData)) {
1800 VULKAN_DestroyAll(renderer);
1801 return VK_ERROR_UNKNOWN;
1802 }
1803
1804 // Create Vulkan surface
1805 rendererData->surface = (VkSurfaceKHR)SDL_GetNumberProperty(create_props, SDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER, 0);
1806 if (rendererData->surface) {
1807 rendererData->surface_external = true;
1808 } else {
1809 if (!device->Vulkan_CreateSurface || !device->Vulkan_CreateSurface(device, renderer->window, rendererData->instance, NULL, &rendererData->surface)) {
1810 VULKAN_DestroyAll(renderer);
1811 SET_ERROR_MESSAGE("Vulkan_CreateSurface() failed");
1812 return VK_ERROR_UNKNOWN;
1813 }
1814 }
1815
1816 // Choose Vulkan physical device
1817 rendererData->physicalDevice = (VkPhysicalDevice)SDL_GetPointerProperty(create_props, SDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER, NULL);
1818 if (rendererData->physicalDevice) {
1819 vkGetPhysicalDeviceMemoryProperties(rendererData->physicalDevice, &rendererData->physicalDeviceMemoryProperties);
1820 vkGetPhysicalDeviceFeatures(rendererData->physicalDevice, &rendererData->physicalDeviceFeatures);
1821 } else {
1822 if (VULKAN_FindPhysicalDevice(rendererData) != VK_SUCCESS) {
1823 VULKAN_DestroyAll(renderer);
1824 return VK_ERROR_UNKNOWN;
1825 }
1826 }
1827
1828 if (SDL_HasProperty(create_props, SDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER)) {
1829 rendererData->graphicsQueueFamilyIndex = (uint32_t)SDL_GetNumberProperty(create_props, SDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER, 0);
1830 }
1831 if (SDL_HasProperty(create_props, SDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER)) {
1832 rendererData->presentQueueFamilyIndex = (uint32_t)SDL_GetNumberProperty(create_props, SDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER, 0);
1833 }
1834
1835 if (rendererData->supportsKHRGetPhysicalDeviceProperties2 &&
1836 VULKAN_DeviceExtensionsFound(rendererData, 4, &deviceExtensionNames[1])) {
1837 rendererData->supportsKHRSamplerYCbCrConversion = true;
1838 }
1839
1840 // Create Vulkan device
1841 rendererData->device = (VkDevice)SDL_GetPointerProperty(create_props, SDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER, NULL);
1842 if (rendererData->device) {
1843 rendererData->device_external = true;
1844 } else {
1845 VkPhysicalDeviceSamplerYcbcrConversionFeatures deviceSamplerYcbcrConversionFeatures = { 0 };
1846 VkDeviceQueueCreateInfo deviceQueueCreateInfo[2] = { { 0 }, { 0 } };
1847 static const float queuePriority[] = { 1.0f };
1848
1849 VkDeviceCreateInfo deviceCreateInfo = { 0 };
1850 deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
1851 deviceCreateInfo.queueCreateInfoCount = 0;
1852 deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfo;
1853 deviceCreateInfo.pEnabledFeatures = NULL;
1854 deviceCreateInfo.enabledExtensionCount = (rendererData->supportsKHRSamplerYCbCrConversion) ? 5 : 1;
1855 deviceCreateInfo.ppEnabledExtensionNames = deviceExtensionNames;
1856
1857 deviceQueueCreateInfo[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1858 deviceQueueCreateInfo[0].queueFamilyIndex = rendererData->graphicsQueueFamilyIndex;
1859 deviceQueueCreateInfo[0].queueCount = 1;
1860 deviceQueueCreateInfo[0].pQueuePriorities = queuePriority;
1861 ++deviceCreateInfo.queueCreateInfoCount;
1862
1863 if (rendererData->presentQueueFamilyIndex != rendererData->graphicsQueueFamilyIndex) {
1864 deviceQueueCreateInfo[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
1865 deviceQueueCreateInfo[1].queueFamilyIndex = rendererData->presentQueueFamilyIndex;
1866 deviceQueueCreateInfo[1].queueCount = 1;
1867 deviceQueueCreateInfo[1].pQueuePriorities = queuePriority;
1868 ++deviceCreateInfo.queueCreateInfoCount;
1869 }
1870
1871 if (rendererData->supportsKHRSamplerYCbCrConversion) {
1872 deviceSamplerYcbcrConversionFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
1873 deviceSamplerYcbcrConversionFeatures.samplerYcbcrConversion = VK_TRUE;
1874 deviceSamplerYcbcrConversionFeatures.pNext = (void *)deviceCreateInfo.pNext;
1875 deviceCreateInfo.pNext = &deviceSamplerYcbcrConversionFeatures;
1876 }
1877
1878 result = vkCreateDevice(rendererData->physicalDevice, &deviceCreateInfo, NULL, &rendererData->device);
1879 if (result != VK_SUCCESS) {
1880 SET_ERROR_CODE("vkCreateDevice()", result);
1881 VULKAN_DestroyAll(renderer);
1882 return result;
1883 }
1884 }
1885
1886 if (!VULKAN_LoadDeviceFunctions(rendererData)) {
1887 VULKAN_DestroyAll(renderer);
1888 return VK_ERROR_UNKNOWN;
1889 }
1890
1891 // Get graphics/present queues
1892 vkGetDeviceQueue(rendererData->device, rendererData->graphicsQueueFamilyIndex, 0, &rendererData->graphicsQueue);
1893 if (rendererData->graphicsQueueFamilyIndex != rendererData->presentQueueFamilyIndex) {
1894 vkGetDeviceQueue(rendererData->device, rendererData->presentQueueFamilyIndex, 0, &rendererData->presentQueue);
1895 } else {
1896 rendererData->presentQueue = rendererData->graphicsQueue;
1897 }
1898
1899 // Create command pool/command buffers
1900 VkCommandPoolCreateInfo commandPoolCreateInfo = { 0 };
1901 commandPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
1902 commandPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
1903 commandPoolCreateInfo.queueFamilyIndex = rendererData->graphicsQueueFamilyIndex;
1904 result = vkCreateCommandPool(rendererData->device, &commandPoolCreateInfo, NULL, &rendererData->commandPool);
1905 if (result != VK_SUCCESS) {
1906 VULKAN_DestroyAll(renderer);
1907 SET_ERROR_CODE("vkCreateCommandPool()", result);
1908 return result;
1909 }
1910
1911 if (VULKAN_GetSurfaceFormats(rendererData) != VK_SUCCESS) {
1912 VULKAN_DestroyAll(renderer);
1913 return result;
1914 }
1915
1916 // Create shaders / layouts
1917 for (uint32_t i = 0; i < NUM_SHADERS; i++) {
1918 VULKAN_Shader shader = (VULKAN_Shader)i;
1919 VkShaderModuleCreateInfo shaderModuleCreateInfo = { 0 };
1920 shaderModuleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
1921 VULKAN_GetVertexShader(shader, &shaderModuleCreateInfo.pCode, &shaderModuleCreateInfo.codeSize);
1922 result = vkCreateShaderModule(rendererData->device, &shaderModuleCreateInfo, NULL, &rendererData->vertexShaderModules[i]);
1923 if (result != VK_SUCCESS) {
1924 VULKAN_DestroyAll(renderer);
1925 SET_ERROR_CODE("vkCreateShaderModule()", result);
1926 return result;
1927 }
1928 VULKAN_GetPixelShader(shader, &shaderModuleCreateInfo.pCode, &shaderModuleCreateInfo.codeSize);
1929 result = vkCreateShaderModule(rendererData->device, &shaderModuleCreateInfo, NULL, &rendererData->fragmentShaderModules[i]);
1930 if (result != VK_SUCCESS) {
1931 VULKAN_DestroyAll(renderer);
1932 SET_ERROR_CODE("vkCreateShaderModule()", result);
1933 return result;
1934 }
1935 }
1936
1937 // Descriptor set layout / pipeline layout
1938 result = VULKAN_CreateDescriptorSetAndPipelineLayout(rendererData, VK_NULL_HANDLE, &rendererData->descriptorSetLayout, &rendererData->pipelineLayout);
1939 if (result != VK_SUCCESS) {
1940 VULKAN_DestroyAll(renderer);
1941 return result;
1942 }
1943
1944 // Create default vertex buffers
1945 for (uint32_t i = 0; i < SDL_VULKAN_NUM_VERTEX_BUFFERS; ++i) {
1946 VULKAN_CreateVertexBuffer(rendererData, i, SDL_VULKAN_VERTEX_BUFFER_DEFAULT_SIZE);
1947 }
1948
1949 // Create samplers
1950 {
1951 static struct
1952 {
1953 VkFilter filter;
1954 VkSamplerAddressMode address;
1955 } samplerParams[] = {
1956 { VK_FILTER_NEAREST, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE },
1957 { VK_FILTER_NEAREST, VK_SAMPLER_ADDRESS_MODE_REPEAT },
1958 { VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE },
1959 { VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_REPEAT },
1960 };
1961 SDL_COMPILE_TIME_ASSERT(samplerParams_SIZE, SDL_arraysize(samplerParams) == VULKAN_SAMPLER_COUNT);
1962 VkSamplerCreateInfo samplerCreateInfo = { 0 };
1963 samplerCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1964 samplerCreateInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1965 samplerCreateInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1966 samplerCreateInfo.mipLodBias = 0.0f;
1967 samplerCreateInfo.anisotropyEnable = VK_FALSE;
1968 samplerCreateInfo.maxAnisotropy = 1.0f;
1969 samplerCreateInfo.minLod = 0.0f;
1970 samplerCreateInfo.maxLod = 1000.0f;
1971 for (int i = 0; i < SDL_arraysize(samplerParams); ++i) {
1972 samplerCreateInfo.magFilter = samplerParams[i].filter;
1973 samplerCreateInfo.minFilter = samplerParams[i].filter;
1974 samplerCreateInfo.addressModeU = samplerParams[i].address;
1975 samplerCreateInfo.addressModeV = samplerParams[i].address;
1976 result = vkCreateSampler(rendererData->device, &samplerCreateInfo, NULL, &rendererData->samplers[i]);
1977 if (result != VK_SUCCESS) {
1978 VULKAN_DestroyAll(renderer);
1979 SET_ERROR_CODE("vkCreateSampler()", result);
1980 return result;
1981 }
1982 }
1983 }
1984
1985 SDL_PropertiesID props = SDL_GetRendererProperties(renderer);
1986 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER, rendererData->instance);
1987 SDL_SetNumberProperty(props, SDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER, (Sint64)rendererData->surface);
1988 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER, rendererData->physicalDevice);
1989 SDL_SetPointerProperty(props, SDL_PROP_RENDERER_VULKAN_DEVICE_POINTER, rendererData->device);
1990 SDL_SetNumberProperty(props, SDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER, rendererData->graphicsQueueFamilyIndex);
1991 SDL_SetNumberProperty(props, SDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER, rendererData->presentQueueFamilyIndex);
1992
1993 return VK_SUCCESS;
1994}
1995
1996static VkResult VULKAN_CreateFramebuffersAndRenderPasses(SDL_Renderer *renderer, int w, int h,
1997 VkFormat format, int imageViewCount, VkImageView *imageViews, VkFramebuffer *framebuffers, VkRenderPass renderPasses[VULKAN_RENDERPASS_COUNT])
1998{
1999 VULKAN_RenderData *rendererData = (VULKAN_RenderData *) renderer->internal;
2000 VkResult result;
2001
2002 VkAttachmentDescription attachmentDescription = { 0 };
2003 attachmentDescription.format = format;
2004 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
2005 attachmentDescription.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
2006 attachmentDescription.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
2007 attachmentDescription.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
2008 attachmentDescription.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2009 attachmentDescription.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2010 attachmentDescription.samples = VK_SAMPLE_COUNT_1_BIT;
2011 attachmentDescription.flags = 0;
2012
2013 VkAttachmentReference colorAttachmentReference = { 0 };
2014 colorAttachmentReference.attachment = 0;
2015 colorAttachmentReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2016
2017 VkSubpassDescription subpassDescription = { 0 };
2018 subpassDescription.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
2019 subpassDescription.flags = 0;
2020 subpassDescription.inputAttachmentCount = 0;
2021 subpassDescription.pInputAttachments = NULL;
2022 subpassDescription.colorAttachmentCount = 1;
2023 subpassDescription.pColorAttachments = &colorAttachmentReference;
2024 subpassDescription.pResolveAttachments = NULL;
2025 subpassDescription.pDepthStencilAttachment = NULL;
2026 subpassDescription.preserveAttachmentCount = 0;
2027 subpassDescription.pPreserveAttachments = NULL;
2028
2029 VkSubpassDependency subPassDependency = { 0 };
2030 subPassDependency.srcSubpass = VK_SUBPASS_EXTERNAL;
2031 subPassDependency.dstSubpass = 0;
2032 subPassDependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
2033 subPassDependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
2034 subPassDependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
2035 subPassDependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
2036 subPassDependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
2037
2038 VkRenderPassCreateInfo renderPassCreateInfo = { 0 };
2039 renderPassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
2040 renderPassCreateInfo.flags = 0;
2041 renderPassCreateInfo.attachmentCount = 1;
2042 renderPassCreateInfo.pAttachments = &attachmentDescription;
2043 renderPassCreateInfo.subpassCount = 1;
2044 renderPassCreateInfo.pSubpasses = &subpassDescription;
2045 renderPassCreateInfo.dependencyCount = 1;
2046 renderPassCreateInfo.pDependencies = &subPassDependency;
2047
2048 result = vkCreateRenderPass(rendererData->device, &renderPassCreateInfo, NULL, &renderPasses[VULKAN_RENDERPASS_LOAD]);
2049 if (result != VK_SUCCESS) {
2050 SET_ERROR_CODE("vkCreateRenderPass()", result);
2051 return result;
2052 }
2053
2054 attachmentDescription.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
2055 result = vkCreateRenderPass(rendererData->device, &renderPassCreateInfo, NULL, &renderPasses[VULKAN_RENDERPASS_CLEAR]);
2056 if (result != VK_SUCCESS) {
2057 SET_ERROR_CODE("vkCreateRenderPass()", result);
2058 return result;
2059 }
2060
2061 VkFramebufferCreateInfo framebufferCreateInfo = { 0 };
2062 framebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
2063 framebufferCreateInfo.pNext = NULL;
2064 framebufferCreateInfo.renderPass = rendererData->renderPasses[VULKAN_RENDERPASS_LOAD];
2065 framebufferCreateInfo.attachmentCount = 1;
2066 framebufferCreateInfo.width = w;
2067 framebufferCreateInfo.height = h;
2068 framebufferCreateInfo.layers = 1;
2069
2070 for (int i = 0; i < imageViewCount; i++) {
2071 framebufferCreateInfo.pAttachments = &imageViews[i];
2072 result = vkCreateFramebuffer(rendererData->device, &framebufferCreateInfo, NULL, &framebuffers[i]);
2073 if (result != VK_SUCCESS) {
2074 SET_ERROR_CODE("vkCreateFramebuffer()", result);
2075 return result;
2076 }
2077 }
2078
2079 return result;
2080}
2081
2082static VkResult VULKAN_CreateSwapChain(SDL_Renderer *renderer, int w, int h)
2083{
2084 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2085 VkResult result = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(rendererData->physicalDevice, rendererData->surface, &rendererData->surfaceCapabilities);
2086 if (result != VK_SUCCESS) {
2087 SET_ERROR_CODE("vkGetPhysicalDeviceSurfaceCapabilitiesKHR()", result);
2088 return result;
2089 }
2090
2091 // clean up previous swapchain resources
2092 if (rendererData->swapchainImageViews) {
2093 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2094 vkDestroyImageView(rendererData->device, rendererData->swapchainImageViews[i], NULL);
2095 }
2096 SDL_free(rendererData->swapchainImageViews);
2097 rendererData->swapchainImageViews = NULL;
2098 }
2099 if (rendererData->fences) {
2100 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2101 if (rendererData->fences[i] != VK_NULL_HANDLE) {
2102 vkDestroyFence(rendererData->device, rendererData->fences[i], NULL);
2103 }
2104 }
2105 SDL_free(rendererData->fences);
2106 rendererData->fences = NULL;
2107 }
2108 if (rendererData->commandBuffers) {
2109 vkResetCommandPool(rendererData->device, rendererData->commandPool, 0);
2110 SDL_free(rendererData->commandBuffers);
2111 rendererData->commandBuffers = NULL;
2112 rendererData->currentCommandBuffer = VK_NULL_HANDLE;
2113 rendererData->currentCommandBufferIndex = 0;
2114 }
2115 if (rendererData->framebuffers) {
2116 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2117 if (rendererData->framebuffers[i] != VK_NULL_HANDLE) {
2118 vkDestroyFramebuffer(rendererData->device, rendererData->framebuffers[i], NULL);
2119 }
2120 }
2121 SDL_free(rendererData->framebuffers);
2122 rendererData->framebuffers = NULL;
2123 }
2124 if (rendererData->descriptorPools) {
2125 SDL_assert(rendererData->numDescriptorPools);
2126 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2127 for (uint32_t j = 0; j < rendererData->numDescriptorPools[i]; j++) {
2128 if (rendererData->descriptorPools[i][j] != VK_NULL_HANDLE) {
2129 vkDestroyDescriptorPool(rendererData->device, rendererData->descriptorPools[i][j], NULL);
2130 }
2131 }
2132 SDL_free(rendererData->descriptorPools[i]);
2133 }
2134 SDL_free(rendererData->descriptorPools);
2135 rendererData->descriptorPools = NULL;
2136 SDL_free(rendererData->numDescriptorPools);
2137 rendererData->numDescriptorPools = NULL;
2138 }
2139 if (rendererData->imageAvailableSemaphores) {
2140 for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
2141 if (rendererData->imageAvailableSemaphores[i] != VK_NULL_HANDLE) {
2142 vkDestroySemaphore(rendererData->device, rendererData->imageAvailableSemaphores[i], NULL);
2143 }
2144 }
2145 SDL_free(rendererData->imageAvailableSemaphores);
2146 rendererData->imageAvailableSemaphores = NULL;
2147 }
2148 if (rendererData->renderingFinishedSemaphores) {
2149 for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
2150 if (rendererData->renderingFinishedSemaphores[i] != VK_NULL_HANDLE) {
2151 vkDestroySemaphore(rendererData->device, rendererData->renderingFinishedSemaphores[i], NULL);
2152 }
2153 }
2154 SDL_free(rendererData->renderingFinishedSemaphores);
2155 rendererData->renderingFinishedSemaphores = NULL;
2156 }
2157 if (rendererData->uploadBuffers) {
2158 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2159 for (uint32_t j = 0; j < SDL_VULKAN_NUM_UPLOAD_BUFFERS; j++) {
2160 VULKAN_DestroyBuffer(rendererData, &rendererData->uploadBuffers[i][j]);
2161 }
2162 SDL_free(rendererData->uploadBuffers[i]);
2163 }
2164 SDL_free(rendererData->uploadBuffers);
2165 rendererData->uploadBuffers = NULL;
2166 }
2167 if (rendererData->constantBuffers) {
2168 SDL_assert(rendererData->numConstantBuffers);
2169 for (uint32_t i = 0; i < rendererData->swapchainImageCount; ++i) {
2170 for (uint32_t j = 0; j < rendererData->numConstantBuffers[i]; j++) {
2171 VULKAN_DestroyBuffer(rendererData, &rendererData->constantBuffers[i][j]);
2172 }
2173 SDL_free(rendererData->constantBuffers[i]);
2174 }
2175 SDL_free(rendererData->constantBuffers);
2176 rendererData->constantBuffers = NULL;
2177 SDL_free(rendererData->numConstantBuffers);
2178 rendererData->numConstantBuffers = NULL;
2179 }
2180
2181 // pick an image count
2182 rendererData->swapchainDesiredImageCount = rendererData->surfaceCapabilities.minImageCount + SDL_VULKAN_FRAME_QUEUE_DEPTH;
2183 if ((rendererData->swapchainDesiredImageCount > rendererData->surfaceCapabilities.maxImageCount) &&
2184 (rendererData->surfaceCapabilities.maxImageCount > 0)) {
2185 rendererData->swapchainDesiredImageCount = rendererData->surfaceCapabilities.maxImageCount;
2186 }
2187
2188 VkFormat desiredFormat = VK_FORMAT_B8G8R8A8_UNORM;
2189 VkColorSpaceKHR desiredColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
2190 if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
2191 desiredFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
2192 desiredColorSpace = VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT;
2193 }
2194 else if (renderer->output_colorspace == SDL_COLORSPACE_HDR10) {
2195 desiredFormat = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
2196 desiredColorSpace = VK_COLOR_SPACE_HDR10_ST2084_EXT;
2197 }
2198
2199 if ((rendererData->surfaceFormatsCount == 1) &&
2200 (rendererData->surfaceFormats[0].format == VK_FORMAT_UNDEFINED)) {
2201 // aren't any preferred formats, so we pick
2202 rendererData->surfaceFormat.colorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
2203 rendererData->surfaceFormat.format = desiredFormat;
2204 } else {
2205 rendererData->surfaceFormat = rendererData->surfaceFormats[0];
2206 rendererData->surfaceFormat.colorSpace = rendererData->surfaceFormats[0].colorSpace;
2207 for (uint32_t i = 0; i < rendererData->surfaceFormatsCount; i++) {
2208 if (rendererData->surfaceFormats[i].format == desiredFormat &&
2209 rendererData->surfaceFormats[i].colorSpace == desiredColorSpace) {
2210 rendererData->surfaceFormat.colorSpace = rendererData->surfaceFormats[i].colorSpace;
2211 rendererData->surfaceFormat = rendererData->surfaceFormats[i];
2212 break;
2213 }
2214 }
2215 }
2216
2217 rendererData->swapchainSize.width = SDL_clamp((uint32_t)w,
2218 rendererData->surfaceCapabilities.minImageExtent.width,
2219 rendererData->surfaceCapabilities.maxImageExtent.width);
2220
2221 rendererData->swapchainSize.height = SDL_clamp((uint32_t)h,
2222 rendererData->surfaceCapabilities.minImageExtent.height,
2223 rendererData->surfaceCapabilities.maxImageExtent.height);
2224
2225 // Handle rotation
2226 rendererData->swapChainPreTransform = rendererData->surfaceCapabilities.currentTransform;
2227 if (rendererData->swapChainPreTransform == VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR ||
2228 rendererData->swapChainPreTransform == VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR) {
2229 uint32_t tempWidth = rendererData->swapchainSize.width;
2230 rendererData->swapchainSize.width = rendererData->swapchainSize.height;
2231 rendererData->swapchainSize.height = tempWidth;
2232 }
2233
2234 if (rendererData->swapchainSize.width == 0 && rendererData->swapchainSize.height == 0) {
2235 // Don't recreate the swapchain if size is (0,0), just fail and continue attempting creation
2236 return VK_ERROR_OUT_OF_DATE_KHR;
2237 }
2238
2239 // Choose a present mode. If vsync is requested, then use VK_PRESENT_MODE_FIFO_KHR which is guaranteed to be supported
2240 VkPresentModeKHR presentMode = VK_PRESENT_MODE_FIFO_KHR;
2241 if (rendererData->vsync <= 0) {
2242 uint32_t presentModeCount = 0;
2243 result = vkGetPhysicalDeviceSurfacePresentModesKHR(rendererData->physicalDevice, rendererData->surface, &presentModeCount, NULL);
2244 if (result != VK_SUCCESS) {
2245 SET_ERROR_CODE("vkGetPhysicalDeviceSurfacePresentModesKHR()", result);
2246 return result;
2247 }
2248 if (presentModeCount > 0) {
2249 VkPresentModeKHR *presentModes = (VkPresentModeKHR *)SDL_calloc(presentModeCount, sizeof(VkPresentModeKHR));
2250 result = vkGetPhysicalDeviceSurfacePresentModesKHR(rendererData->physicalDevice, rendererData->surface, &presentModeCount, presentModes);
2251 if (result != VK_SUCCESS) {
2252 SET_ERROR_CODE("vkGetPhysicalDeviceSurfacePresentModesKHR()", result);
2253 SDL_free(presentModes);
2254 return result;
2255 }
2256
2257 if (rendererData->vsync == 0) {
2258 /* If vsync is not requested, in favor these options in order:
2259 VK_PRESENT_MODE_IMMEDIATE_KHR - no v-sync with tearing
2260 VK_PRESENT_MODE_MAILBOX_KHR - no v-sync without tearing
2261 VK_PRESENT_MODE_FIFO_RELAXED_KHR - no v-sync, may tear */
2262 for (uint32_t i = 0; i < presentModeCount; i++) {
2263 if (presentModes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR) {
2264 presentMode = VK_PRESENT_MODE_IMMEDIATE_KHR;
2265 break;
2266 }
2267 else if (presentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR) {
2268 presentMode = VK_PRESENT_MODE_MAILBOX_KHR;
2269 }
2270 else if ((presentMode != VK_PRESENT_MODE_MAILBOX_KHR) &&
2271 (presentModes[i] == VK_PRESENT_MODE_FIFO_RELAXED_KHR)) {
2272 presentMode = VK_PRESENT_MODE_FIFO_RELAXED_KHR;
2273 }
2274 }
2275 } else if (rendererData->vsync == -1) {
2276 for (uint32_t i = 0; i < presentModeCount; i++) {
2277 if (presentModes[i] == VK_PRESENT_MODE_FIFO_RELAXED_KHR) {
2278 presentMode = VK_PRESENT_MODE_FIFO_RELAXED_KHR;
2279 break;
2280 }
2281 }
2282 }
2283 SDL_free(presentModes);
2284 }
2285 }
2286
2287 VkSwapchainCreateInfoKHR swapchainCreateInfo = { 0 };
2288 swapchainCreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
2289 swapchainCreateInfo.surface = rendererData->surface;
2290 swapchainCreateInfo.minImageCount = rendererData->swapchainDesiredImageCount;
2291 swapchainCreateInfo.imageFormat = rendererData->surfaceFormat.format;
2292 swapchainCreateInfo.imageColorSpace = rendererData->surfaceFormat.colorSpace;
2293 swapchainCreateInfo.imageExtent = rendererData->swapchainSize;
2294 swapchainCreateInfo.imageArrayLayers = 1;
2295 swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2296 swapchainCreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
2297 swapchainCreateInfo.preTransform = rendererData->swapChainPreTransform;
2298 swapchainCreateInfo.compositeAlpha = (renderer->window->flags & SDL_WINDOW_TRANSPARENT) ? (VkCompositeAlphaFlagBitsKHR)0 : VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
2299 swapchainCreateInfo.presentMode = presentMode;
2300 swapchainCreateInfo.clipped = VK_TRUE;
2301 swapchainCreateInfo.oldSwapchain = rendererData->swapchain;
2302 result = vkCreateSwapchainKHR(rendererData->device, &swapchainCreateInfo, NULL, &rendererData->swapchain);
2303
2304 if (swapchainCreateInfo.oldSwapchain != VK_NULL_HANDLE) {
2305 vkDestroySwapchainKHR(rendererData->device, swapchainCreateInfo.oldSwapchain, NULL);
2306 }
2307
2308 if (result != VK_SUCCESS) {
2309 rendererData->swapchain = VK_NULL_HANDLE;
2310 SET_ERROR_CODE("vkCreateSwapchainKHR()", result);
2311 return result;
2312 }
2313
2314 SDL_free(rendererData->swapchainImages);
2315 rendererData->swapchainImages = NULL;
2316 result = vkGetSwapchainImagesKHR(rendererData->device, rendererData->swapchain, &rendererData->swapchainImageCount, NULL);
2317 if (result != VK_SUCCESS) {
2318 rendererData->swapchainImageCount = 0;
2319 SET_ERROR_CODE("vkGetSwapchainImagesKHR()", result);
2320 return result;
2321 }
2322
2323 rendererData->swapchainImages = (VkImage *)SDL_malloc(sizeof(VkImage) * rendererData->swapchainImageCount);
2324 result = vkGetSwapchainImagesKHR(rendererData->device,
2325 rendererData->swapchain,
2326 &rendererData->swapchainImageCount,
2327 rendererData->swapchainImages);
2328 if (result != VK_SUCCESS) {
2329 SDL_free(rendererData->swapchainImages);
2330 rendererData->swapchainImages = NULL;
2331 rendererData->swapchainImageCount = 0;
2332 SET_ERROR_CODE("vkGetSwapchainImagesKHR()", result);
2333 return result;
2334 }
2335
2336 // Create VkImageView's for swapchain images
2337 {
2338 VkImageViewCreateInfo imageViewCreateInfo = { 0 };
2339 imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2340 imageViewCreateInfo.flags = 0;
2341 imageViewCreateInfo.format = rendererData->surfaceFormat.format;
2342 imageViewCreateInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
2343 imageViewCreateInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
2344 imageViewCreateInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
2345 imageViewCreateInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
2346 imageViewCreateInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2347 imageViewCreateInfo.subresourceRange.baseArrayLayer = 0;
2348 imageViewCreateInfo.subresourceRange.baseMipLevel = 0;
2349 imageViewCreateInfo.subresourceRange.layerCount = 1;
2350 imageViewCreateInfo.subresourceRange.levelCount = 1;
2351 imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
2352 rendererData->swapchainImageViews = (VkImageView *)SDL_calloc(rendererData->swapchainImageCount, sizeof(VkImageView));
2353 SDL_free(rendererData->swapchainImageLayouts);
2354 rendererData->swapchainImageLayouts = (VkImageLayout *)SDL_calloc(rendererData->swapchainImageCount, sizeof(VkImageLayout));
2355 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2356 imageViewCreateInfo.image = rendererData->swapchainImages[i];
2357 result = vkCreateImageView(rendererData->device, &imageViewCreateInfo, NULL, &rendererData->swapchainImageViews[i]);
2358 if (result != VK_SUCCESS) {
2359 VULKAN_DestroyAll(renderer);
2360 SET_ERROR_CODE("vkCreateImageView()", result);
2361 return result;
2362 }
2363 rendererData->swapchainImageLayouts[i] = VK_IMAGE_LAYOUT_UNDEFINED;
2364 }
2365
2366 }
2367
2368 VkCommandBufferAllocateInfo commandBufferAllocateInfo = { 0 };
2369 commandBufferAllocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
2370 commandBufferAllocateInfo.commandPool = rendererData->commandPool;
2371 commandBufferAllocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
2372 commandBufferAllocateInfo.commandBufferCount = rendererData->swapchainImageCount;
2373 rendererData->commandBuffers = (VkCommandBuffer *)SDL_calloc(rendererData->swapchainImageCount, sizeof(VkCommandBuffer));
2374 result = vkAllocateCommandBuffers(rendererData->device, &commandBufferAllocateInfo, rendererData->commandBuffers);
2375 if (result != VK_SUCCESS) {
2376 VULKAN_DestroyAll(renderer);
2377 SET_ERROR_CODE("vkAllocateCommandBuffers()", result);
2378 return result;
2379 }
2380
2381 // Create fences
2382 rendererData->fences = (VkFence *)SDL_calloc(rendererData->swapchainImageCount, sizeof(VkFence));
2383 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2384 VkFenceCreateInfo fenceCreateInfo = { 0 };
2385 fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2386 fenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
2387 result = vkCreateFence(rendererData->device, &fenceCreateInfo, NULL, &rendererData->fences[i]);
2388 if (result != VK_SUCCESS) {
2389 VULKAN_DestroyAll(renderer);
2390 SET_ERROR_CODE("vkCreateFence()", result);
2391 return result;
2392 }
2393 }
2394
2395 // Create renderpasses and framebuffer
2396 for (uint32_t i = 0; i < SDL_arraysize(rendererData->renderPasses); i++) {
2397 if (rendererData->renderPasses[i] != VK_NULL_HANDLE) {
2398 vkDestroyRenderPass(rendererData->device, rendererData->renderPasses[i], NULL);
2399 rendererData->renderPasses[i] = VK_NULL_HANDLE;
2400 }
2401 }
2402 rendererData->framebuffers = (VkFramebuffer *)SDL_calloc(rendererData->swapchainImageCount, sizeof(VkFramebuffer));
2403 result = VULKAN_CreateFramebuffersAndRenderPasses(renderer,
2404 rendererData->swapchainSize.width,
2405 rendererData->swapchainSize.height,
2406 rendererData->surfaceFormat.format,
2407 rendererData->swapchainImageCount,
2408 rendererData->swapchainImageViews,
2409 rendererData->framebuffers,
2410 rendererData->renderPasses);
2411 if (result != VK_SUCCESS) {
2412 VULKAN_DestroyAll(renderer);
2413 SET_ERROR_CODE("VULKAN_CreateFramebuffersAndRenderPasses()", result);
2414 return result;
2415 }
2416
2417 // Create descriptor pools - start by allocating one per swapchain image, let it grow if more are needed
2418 rendererData->descriptorPools = (VkDescriptorPool **)SDL_calloc(rendererData->swapchainImageCount, sizeof(VkDescriptorPool*));
2419 rendererData->numDescriptorPools = (uint32_t *)SDL_calloc(rendererData->swapchainImageCount, sizeof(uint32_t));
2420 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2421 // Start by just allocating one pool, it will grow if needed
2422 rendererData->numDescriptorPools[i] = 1;
2423 rendererData->descriptorPools[i] = (VkDescriptorPool *)SDL_calloc(1, sizeof(VkDescriptorPool));
2424 rendererData->descriptorPools[i][0] = VULKAN_AllocateDescriptorPool(rendererData);
2425 if (result != VK_SUCCESS) {
2426 VULKAN_DestroyAll(renderer);
2427 return result;
2428 }
2429 }
2430
2431 // Create semaphores
2432 rendererData->imageAvailableSemaphores = (VkSemaphore *)SDL_calloc(rendererData->swapchainImageCount, sizeof(VkSemaphore));
2433 rendererData->renderingFinishedSemaphores = (VkSemaphore *)SDL_calloc(rendererData->swapchainImageCount, sizeof(VkSemaphore));
2434 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2435 rendererData->imageAvailableSemaphores[i] = VULKAN_CreateSemaphore(rendererData);
2436 if (rendererData->imageAvailableSemaphores[i] == VK_NULL_HANDLE) {
2437 VULKAN_DestroyAll(renderer);
2438 return VK_ERROR_UNKNOWN;
2439 }
2440 rendererData->renderingFinishedSemaphores[i] = VULKAN_CreateSemaphore(rendererData);
2441 if (rendererData->renderingFinishedSemaphores[i] == VK_NULL_HANDLE) {
2442 VULKAN_DestroyAll(renderer);
2443 return VK_ERROR_UNKNOWN;
2444 }
2445 }
2446
2447 // Upload buffers
2448 rendererData->uploadBuffers = (VULKAN_Buffer **)SDL_calloc(rendererData->swapchainImageCount, sizeof(VULKAN_Buffer*));
2449 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2450 rendererData->uploadBuffers[i] = (VULKAN_Buffer *)SDL_calloc(SDL_VULKAN_NUM_UPLOAD_BUFFERS, sizeof(VULKAN_Buffer));
2451 }
2452 SDL_free(rendererData->currentUploadBuffer);
2453 rendererData->currentUploadBuffer = (int *)SDL_calloc(rendererData->swapchainImageCount, sizeof(int));
2454
2455 // Constant buffers
2456 rendererData->constantBuffers = (VULKAN_Buffer **)SDL_calloc(rendererData->swapchainImageCount, sizeof(VULKAN_Buffer*));
2457 rendererData->numConstantBuffers = (uint32_t *)SDL_calloc(rendererData->swapchainImageCount, sizeof(uint32_t));
2458 for (uint32_t i = 0; i < rendererData->swapchainImageCount; i++) {
2459 // Start with just allocating one, will grow if needed
2460 rendererData->numConstantBuffers[i] = 1;
2461 rendererData->constantBuffers[i] = (VULKAN_Buffer *)SDL_calloc(1, sizeof(VULKAN_Buffer));
2462 result = VULKAN_AllocateBuffer(rendererData,
2463 SDL_VULKAN_CONSTANT_BUFFER_DEFAULT_SIZE,
2464 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
2465 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
2466 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
2467 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
2468 &rendererData->constantBuffers[i][0]);
2469 if (result != VK_SUCCESS) {
2470 VULKAN_DestroyAll(renderer);
2471 return result;
2472 }
2473 }
2474 rendererData->currentConstantBufferOffset = -1;
2475 rendererData->currentConstantBufferIndex = 0;
2476
2477 VULKAN_AcquireNextSwapchainImage(renderer);
2478
2479 SDL_PropertiesID props = SDL_GetRendererProperties(renderer);
2480 SDL_SetNumberProperty(props, SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER, rendererData->swapchainImageCount);
2481
2482 return result;
2483}
2484
2485// Initialize all resources that change when the window's size changes.
2486static VkResult VULKAN_CreateWindowSizeDependentResources(SDL_Renderer *renderer)
2487{
2488 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2489 VkResult result = VK_SUCCESS;
2490 int w, h;
2491
2492 // Release resources in the current command list
2493 VULKAN_IssueBatch(rendererData);
2494 VULKAN_WaitForGPU(rendererData);
2495
2496 /* The width and height of the swap chain must be based on the display's
2497 * non-rotated size.
2498 */
2499 SDL_GetWindowSizeInPixels(renderer->window, &w, &h);
2500
2501 result = VULKAN_CreateSwapChain(renderer, w, h);
2502 if (result != VK_SUCCESS) {
2503 rendererData->recreateSwapchain = VK_TRUE;
2504 }
2505
2506 rendererData->viewportDirty = true;
2507
2508 return result;
2509}
2510
2511static bool VULKAN_HandleDeviceLost(SDL_Renderer *renderer)
2512{
2513 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2514 bool recovered = false;
2515
2516 VULKAN_DestroyAll(renderer);
2517
2518 if (VULKAN_CreateDeviceResources(renderer, rendererData->create_props) == VK_SUCCESS &&
2519 VULKAN_CreateWindowSizeDependentResources(renderer) == VK_SUCCESS) {
2520 recovered = true;
2521 } else {
2522 SDL_LogError(SDL_LOG_CATEGORY_RENDER, "Renderer couldn't recover from device lost: %s", SDL_GetError());
2523 VULKAN_DestroyAll(renderer);
2524 }
2525
2526 // Let the application know that the device has been reset or lost
2527 SDL_Event event;
2528 SDL_zero(event);
2529 event.type = recovered ? SDL_EVENT_RENDER_DEVICE_RESET : SDL_EVENT_RENDER_DEVICE_LOST;
2530 event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer));
2531 SDL_PushEvent(&event);
2532
2533 return recovered;
2534}
2535
2536// This method is called when the window's size changes.
2537static VkResult VULKAN_UpdateForWindowSizeChange(SDL_Renderer *renderer)
2538{
2539 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2540 // If the GPU has previous work, wait for it to be done first
2541 VULKAN_WaitForGPU(rendererData);
2542
2543 return VULKAN_CreateWindowSizeDependentResources(renderer);
2544}
2545
2546static void VULKAN_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
2547{
2548 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2549
2550 if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
2551 rendererData->recreateSwapchain = true;
2552 }
2553}
2554
2555static bool VULKAN_SupportsBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
2556{
2557 SDL_BlendFactor srcColorFactor = SDL_GetBlendModeSrcColorFactor(blendMode);
2558 SDL_BlendFactor srcAlphaFactor = SDL_GetBlendModeSrcAlphaFactor(blendMode);
2559 SDL_BlendOperation colorOperation = SDL_GetBlendModeColorOperation(blendMode);
2560 SDL_BlendFactor dstColorFactor = SDL_GetBlendModeDstColorFactor(blendMode);
2561 SDL_BlendFactor dstAlphaFactor = SDL_GetBlendModeDstAlphaFactor(blendMode);
2562 SDL_BlendOperation alphaOperation = SDL_GetBlendModeAlphaOperation(blendMode);
2563
2564 if (GetBlendFactor(srcColorFactor) == VK_BLEND_FACTOR_MAX_ENUM ||
2565 GetBlendFactor(srcAlphaFactor) == VK_BLEND_FACTOR_MAX_ENUM ||
2566 GetBlendOp(colorOperation) == VK_BLEND_OP_MAX_ENUM ||
2567 GetBlendFactor(dstColorFactor) == VK_BLEND_FACTOR_MAX_ENUM ||
2568 GetBlendFactor(dstAlphaFactor) == VK_BLEND_FACTOR_MAX_ENUM ||
2569 GetBlendOp(alphaOperation) == VK_BLEND_OP_MAX_ENUM) {
2570 return false;
2571 }
2572 return true;
2573}
2574
2575static bool VULKAN_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_PropertiesID create_props)
2576{
2577 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2578 VULKAN_TextureData *textureData;
2579 VkResult result;
2580 VkFormat textureFormat = SDLPixelFormatToVkTextureFormat(texture->format, renderer->output_colorspace);
2581 uint32_t width = texture->w;
2582 uint32_t height = texture->h;
2583 VkComponentMapping imageViewSwizzle = rendererData->identitySwizzle;
2584
2585 if (!rendererData->device) {
2586 return SDL_SetError("Device lost and couldn't be recovered");
2587 }
2588
2589 if (textureFormat == VK_FORMAT_UNDEFINED) {
2590 return SDL_SetError("%s, An unsupported SDL pixel format (0x%x) was specified", __FUNCTION__, texture->format);
2591 }
2592
2593 textureData = (VULKAN_TextureData *)SDL_calloc(1, sizeof(*textureData));
2594 if (!textureData) {
2595 return false;
2596 }
2597 texture->internal = textureData;
2598 if (SDL_COLORSPACETRANSFER(texture->colorspace) == SDL_TRANSFER_CHARACTERISTICS_SRGB) {
2599 textureData->shader = SHADER_RGB;
2600 } else {
2601 textureData->shader = SHADER_ADVANCED;
2602 }
2603 textureData->scaleMode = (texture->scaleMode == SDL_SCALEMODE_NEAREST) ? VK_FILTER_NEAREST : VK_FILTER_LINEAR;
2604
2605#ifdef SDL_HAVE_YUV
2606 // YUV textures must have even width and height. Also create Ycbcr conversion
2607 if (texture->format == SDL_PIXELFORMAT_YV12 ||
2608 texture->format == SDL_PIXELFORMAT_IYUV ||
2609 texture->format == SDL_PIXELFORMAT_NV12 ||
2610 texture->format == SDL_PIXELFORMAT_NV21 ||
2611 texture->format == SDL_PIXELFORMAT_P010) {
2612 const uint32_t YUV_SD_THRESHOLD = 576;
2613
2614 // Check that we have VK_KHR_sampler_ycbcr_conversion support
2615 if (!rendererData->supportsKHRSamplerYCbCrConversion) {
2616 return SDL_SetError("YUV textures require a Vulkan device that supports VK_KHR_sampler_ycbcr_conversion");
2617 }
2618
2619 VkSamplerYcbcrConversionCreateInfoKHR samplerYcbcrConversionCreateInfo = { 0 };
2620 samplerYcbcrConversionCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR;
2621
2622 // Pad width/height to multiple of 2
2623 width = (width + 1) & ~1;
2624 height = (height + 1) & ~1;
2625
2626 // Create samplerYcbcrConversion which will be used on the VkImageView and VkSampler
2627 samplerYcbcrConversionCreateInfo.format = textureFormat;
2628 switch (SDL_COLORSPACEMATRIX(texture->colorspace)) {
2629 case SDL_MATRIX_COEFFICIENTS_BT470BG:
2630 case SDL_MATRIX_COEFFICIENTS_BT601:
2631 samplerYcbcrConversionCreateInfo.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR;
2632 break;
2633 case SDL_MATRIX_COEFFICIENTS_BT709:
2634 samplerYcbcrConversionCreateInfo.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR;
2635 break;
2636 case SDL_MATRIX_COEFFICIENTS_BT2020_NCL:
2637 samplerYcbcrConversionCreateInfo.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR;
2638 break;
2639 case SDL_MATRIX_COEFFICIENTS_UNSPECIFIED:
2640 if (texture->format == SDL_PIXELFORMAT_P010) {
2641 samplerYcbcrConversionCreateInfo.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR;
2642 } else if (height > YUV_SD_THRESHOLD) {
2643 samplerYcbcrConversionCreateInfo.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR;
2644 } else {
2645 samplerYcbcrConversionCreateInfo.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR;
2646 }
2647 break;
2648 default:
2649 return SDL_SetError("Unsupported Ycbcr colorspace: %d", SDL_COLORSPACEMATRIX(texture->colorspace));
2650 }
2651 samplerYcbcrConversionCreateInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
2652 samplerYcbcrConversionCreateInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
2653 samplerYcbcrConversionCreateInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
2654 samplerYcbcrConversionCreateInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
2655 if (texture->format == SDL_PIXELFORMAT_YV12 ||
2656 texture->format == SDL_PIXELFORMAT_NV21) {
2657 samplerYcbcrConversionCreateInfo.components.r = VK_COMPONENT_SWIZZLE_B;
2658 samplerYcbcrConversionCreateInfo.components.b = VK_COMPONENT_SWIZZLE_R;
2659 }
2660
2661 switch (SDL_COLORSPACERANGE(texture->colorspace)) {
2662 case SDL_COLOR_RANGE_LIMITED:
2663 samplerYcbcrConversionCreateInfo.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW_KHR;
2664 break;
2665 case SDL_COLOR_RANGE_FULL:
2666 default:
2667 samplerYcbcrConversionCreateInfo.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL_KHR;
2668 break;
2669 }
2670
2671 switch (SDL_COLORSPACECHROMA(texture->colorspace)) {
2672 case SDL_CHROMA_LOCATION_LEFT:
2673 samplerYcbcrConversionCreateInfo.xChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN_KHR;
2674 samplerYcbcrConversionCreateInfo.yChromaOffset = VK_CHROMA_LOCATION_MIDPOINT_KHR;
2675 break;
2676 case SDL_CHROMA_LOCATION_TOPLEFT:
2677 samplerYcbcrConversionCreateInfo.xChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN_KHR;
2678 samplerYcbcrConversionCreateInfo.yChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN_KHR;
2679 break;
2680 case SDL_CHROMA_LOCATION_NONE:
2681 case SDL_CHROMA_LOCATION_CENTER:
2682 default:
2683 samplerYcbcrConversionCreateInfo.xChromaOffset = VK_CHROMA_LOCATION_MIDPOINT_KHR;
2684 samplerYcbcrConversionCreateInfo.yChromaOffset = VK_CHROMA_LOCATION_MIDPOINT_KHR;
2685 break;
2686 }
2687 samplerYcbcrConversionCreateInfo.chromaFilter = VK_FILTER_LINEAR;
2688 samplerYcbcrConversionCreateInfo.forceExplicitReconstruction = VK_FALSE;
2689
2690 result = vkCreateSamplerYcbcrConversionKHR(rendererData->device, &samplerYcbcrConversionCreateInfo, NULL, &textureData->samplerYcbcrConversion);
2691 if (result != VK_SUCCESS) {
2692 SET_ERROR_CODE("vkCreateSamplerYcbcrConversionKHR()", result);
2693 return false;
2694 }
2695
2696 // Also create VkSampler object which we will need to pass to the PSO as an immutable sampler
2697 VkSamplerCreateInfo samplerCreateInfo = { 0 };
2698 samplerCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
2699 samplerCreateInfo.magFilter = VK_FILTER_NEAREST;
2700 samplerCreateInfo.minFilter = VK_FILTER_NEAREST;
2701 samplerCreateInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
2702 samplerCreateInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
2703 samplerCreateInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
2704 samplerCreateInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
2705 samplerCreateInfo.mipLodBias = 0.0f;
2706 samplerCreateInfo.anisotropyEnable = VK_FALSE;
2707 samplerCreateInfo.maxAnisotropy = 1.0f;
2708 samplerCreateInfo.minLod = 0.0f;
2709 samplerCreateInfo.maxLod = 1000.0f;
2710
2711 VkSamplerYcbcrConversionInfoKHR samplerYcbcrConversionInfo = { 0 };
2712 samplerYcbcrConversionInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR;
2713 samplerYcbcrConversionInfo.conversion = textureData->samplerYcbcrConversion;
2714 samplerCreateInfo.pNext = &samplerYcbcrConversionInfo;
2715 result = vkCreateSampler(rendererData->device, &samplerCreateInfo, NULL, &textureData->samplerYcbcr);
2716 if (result != VK_SUCCESS) {
2717 SET_ERROR_CODE("vkCreateSampler()", result);
2718 return false;
2719 }
2720
2721 // Allocate special descriptor set layout with samplerYcbcr baked as an immutable sampler
2722 result = VULKAN_CreateDescriptorSetAndPipelineLayout(rendererData, textureData->samplerYcbcr, &textureData->descriptorSetLayoutYcbcr, &textureData->pipelineLayoutYcbcr);
2723 if (result != VK_SUCCESS) {
2724 return false;
2725 }
2726 }
2727#endif
2728 textureData->width = width;
2729 textureData->height = height;
2730
2731 VkImageUsageFlags usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2732 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
2733 usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
2734 }
2735
2736 result = VULKAN_AllocateImage(rendererData, create_props, width, height, textureFormat, usage, imageViewSwizzle, textureData->samplerYcbcrConversion, &textureData->mainImage);
2737 if (result != VK_SUCCESS) {
2738 SET_ERROR_CODE("VULKAN_AllocateImage()", result);
2739 return false;
2740 }
2741
2742 SDL_PropertiesID props = SDL_GetTextureProperties(texture);
2743 SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER, (Sint64)textureData->mainImage.image);
2744
2745 if (texture->access == SDL_TEXTUREACCESS_TARGET) {
2746 result = VULKAN_CreateFramebuffersAndRenderPasses(renderer,
2747 texture->w,
2748 texture->h,
2749 textureFormat,
2750 1,
2751 &textureData->mainImage.imageView,
2752 &textureData->mainFramebuffer,
2753 textureData->mainRenderpasses);
2754 if (result != VK_SUCCESS) {
2755 SET_ERROR_CODE("VULKAN_CreateFramebuffersAndRenderPasses()", result);
2756 return false;
2757 }
2758 }
2759 return true;
2760}
2761
2762static void VULKAN_DestroyTexture(SDL_Renderer *renderer,
2763 SDL_Texture *texture)
2764{
2765 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2766 VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
2767
2768 if (!textureData) {
2769 return;
2770 }
2771
2772 /* Because SDL_DestroyTexture might be called while the data is in-flight, we need to issue the batch first
2773 Unfortunately, this means that deleting a lot of textures mid-frame will have poor performance. */
2774 VULKAN_IssueBatch(rendererData);
2775 VULKAN_WaitForGPU(rendererData);
2776
2777 VULKAN_DestroyImage(rendererData, &textureData->mainImage);
2778
2779#ifdef SDL_HAVE_YUV
2780 if (textureData->samplerYcbcrConversion != VK_NULL_HANDLE) {
2781 vkDestroySamplerYcbcrConversionKHR(rendererData->device, textureData->samplerYcbcrConversion, NULL);
2782 textureData->samplerYcbcrConversion = VK_NULL_HANDLE;
2783 }
2784 if (textureData->samplerYcbcr != VK_NULL_HANDLE) {
2785 vkDestroySampler(rendererData->device, textureData->samplerYcbcr, NULL);
2786 textureData->samplerYcbcr = VK_NULL_HANDLE;
2787 }
2788 if (textureData->pipelineLayoutYcbcr != VK_NULL_HANDLE) {
2789 vkDestroyPipelineLayout(rendererData->device, textureData->pipelineLayoutYcbcr, NULL);
2790 textureData->pipelineLayoutYcbcr = VK_NULL_HANDLE;
2791 }
2792 if (textureData->descriptorSetLayoutYcbcr != VK_NULL_HANDLE) {
2793 vkDestroyDescriptorSetLayout(rendererData->device, textureData->descriptorSetLayoutYcbcr, NULL);
2794 textureData->descriptorSetLayoutYcbcr = VK_NULL_HANDLE;
2795 }
2796#endif
2797
2798 VULKAN_DestroyBuffer(rendererData, &textureData->stagingBuffer);
2799 if (textureData->mainFramebuffer != VK_NULL_HANDLE) {
2800 vkDestroyFramebuffer(rendererData->device, textureData->mainFramebuffer, NULL);
2801 textureData->mainFramebuffer = VK_NULL_HANDLE;
2802 }
2803 for (uint32_t i = 0; i < SDL_arraysize(textureData->mainRenderpasses); i++) {
2804 if (textureData->mainRenderpasses[i] != VK_NULL_HANDLE) {
2805 vkDestroyRenderPass(rendererData->device, textureData->mainRenderpasses[i], NULL);
2806 textureData->mainRenderpasses[i] = VK_NULL_HANDLE;
2807 }
2808 }
2809
2810 SDL_free(textureData);
2811 texture->internal = NULL;
2812}
2813
2814static bool VULKAN_UpdateTextureInternal(VULKAN_RenderData *rendererData, VkImage image, VkFormat format, int plane, int x, int y, int w, int h, const void *pixels, int pitch, VkImageLayout *imageLayout)
2815{
2816 VkDeviceSize pixelSize = VULKAN_GetBytesPerPixel(format);
2817 VkDeviceSize length = w * pixelSize;
2818 VkDeviceSize uploadBufferSize = length * h;
2819 const Uint8 *src;
2820 Uint8 *dst;
2821 VkResult rc;
2822 int planeCount = VULKAN_VkFormatGetNumPlanes(format);
2823
2824 VULKAN_EnsureCommandBuffer(rendererData);
2825
2826 int currentUploadBufferIndex = rendererData->currentUploadBuffer[rendererData->currentCommandBufferIndex];
2827 VULKAN_Buffer *uploadBuffer = &rendererData->uploadBuffers[rendererData->currentCommandBufferIndex][currentUploadBufferIndex];
2828
2829 rc = VULKAN_AllocateBuffer(rendererData, uploadBufferSize,
2830 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
2831 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
2832 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
2833 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
2834 uploadBuffer);
2835 if (rc != VK_SUCCESS) {
2836 return false;
2837 }
2838
2839 src = (const Uint8 *)pixels;
2840 dst = (Uint8 *)uploadBuffer->mappedBufferPtr;
2841 if (length == (VkDeviceSize)pitch) {
2842 SDL_memcpy(dst, src, (size_t)length * h);
2843 } else {
2844 if (length > (VkDeviceSize)pitch) {
2845 length = pitch;
2846 }
2847 for (VkDeviceSize row = h; row--; ) {
2848 SDL_memcpy(dst, src, (size_t)length);
2849 src += pitch;
2850 dst += length;
2851 }
2852 }
2853
2854 // Make sure the destination is in the correct resource state
2855 VULKAN_RecordPipelineImageBarrier(rendererData,
2856 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
2857 VK_ACCESS_TRANSFER_WRITE_BIT,
2858 VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
2859 VK_PIPELINE_STAGE_TRANSFER_BIT,
2860 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2861 image,
2862 imageLayout);
2863
2864 VkBufferImageCopy region;
2865 region.bufferOffset = 0;
2866 region.bufferRowLength = 0;
2867 region.bufferImageHeight = 0;
2868 region.imageSubresource.baseArrayLayer = 0;
2869 region.imageSubresource.layerCount = 1;
2870 region.imageSubresource.mipLevel = 0;
2871 if (planeCount <= 1) {
2872 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2873 } else {
2874 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT << plane;
2875 }
2876 region.imageOffset.x = x;
2877 region.imageOffset.y = y;
2878 region.imageOffset.z = 0;
2879 region.imageExtent.width = w;
2880 region.imageExtent.height = h;
2881 region.imageExtent.depth = 1;
2882
2883 vkCmdCopyBufferToImage(rendererData->currentCommandBuffer, uploadBuffer->buffer, image, *imageLayout, 1, &region);
2884
2885 // Transition the texture to be shader accessible
2886 VULKAN_RecordPipelineImageBarrier(rendererData,
2887 VK_ACCESS_TRANSFER_WRITE_BIT,
2888 VK_ACCESS_SHADER_READ_BIT,
2889 VK_PIPELINE_STAGE_TRANSFER_BIT,
2890 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
2891 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
2892 image,
2893 imageLayout);
2894
2895 rendererData->currentUploadBuffer[rendererData->currentCommandBufferIndex]++;
2896
2897 // If we've used up all the upload buffers, we need to issue the batch
2898 if (rendererData->currentUploadBuffer[rendererData->currentCommandBufferIndex] == SDL_VULKAN_NUM_UPLOAD_BUFFERS) {
2899 VULKAN_IssueBatch(rendererData);
2900 }
2901
2902 return true;
2903}
2904
2905
2906static bool VULKAN_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
2907 const SDL_Rect *rect, const void *srcPixels,
2908 int srcPitch)
2909{
2910 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2911 VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
2912
2913 if (!textureData) {
2914 return SDL_SetError("Texture is not currently available");
2915 }
2916
2917 if (!VULKAN_UpdateTextureInternal(rendererData, textureData->mainImage.image, textureData->mainImage.format, 0, rect->x, rect->y, rect->w, rect->h, srcPixels, srcPitch, &textureData->mainImage.imageLayout)) {
2918 return false;
2919 }
2920#ifdef SDL_HAVE_YUV
2921 Uint32 numPlanes = VULKAN_VkFormatGetNumPlanes(textureData->mainImage.format);
2922 // Skip to the correct offset into the next texture
2923 srcPixels = (const void *)((const Uint8 *)srcPixels + rect->h * srcPitch);
2924 // YUV data
2925 if (numPlanes == 3) {
2926 for (Uint32 plane = 1; plane < numPlanes; plane++) {
2927 if (!VULKAN_UpdateTextureInternal(rendererData, textureData->mainImage.image, textureData->mainImage.format, plane, rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, srcPixels, (srcPitch + 1) / 2, &textureData->mainImage.imageLayout)) {
2928 return false;
2929 }
2930
2931 // Skip to the correct offset into the next texture
2932 srcPixels = (const void *)((const Uint8 *)srcPixels + ((rect->h + 1) / 2) * ((srcPitch + 1) / 2));
2933 }
2934 }
2935 // NV12/NV21 data
2936 else if (numPlanes == 2)
2937 {
2938 if (texture->format == SDL_PIXELFORMAT_P010) {
2939 srcPitch = (srcPitch + 3) & ~3;
2940 } else {
2941 srcPitch = (srcPitch + 1) & ~1;
2942 }
2943
2944 if (!VULKAN_UpdateTextureInternal(rendererData, textureData->mainImage.image, textureData->mainImage.format, 1, rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, srcPixels, srcPitch, &textureData->mainImage.imageLayout)) {
2945 return false;
2946 }
2947 }
2948#endif
2949 return true;
2950}
2951
2952#ifdef SDL_HAVE_YUV
2953static bool VULKAN_UpdateTextureYUV(SDL_Renderer *renderer, SDL_Texture *texture,
2954 const SDL_Rect *rect,
2955 const Uint8 *Yplane, int Ypitch,
2956 const Uint8 *Uplane, int Upitch,
2957 const Uint8 *Vplane, int Vpitch)
2958{
2959 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2960 VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
2961
2962 if (!textureData) {
2963 return SDL_SetError("Texture is not currently available");
2964 }
2965
2966 if (!VULKAN_UpdateTextureInternal(rendererData, textureData->mainImage.image, textureData->mainImage.format, 0, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch, &textureData->mainImage.imageLayout)) {
2967 return false;
2968 }
2969 if (!VULKAN_UpdateTextureInternal(rendererData, textureData->mainImage.image, textureData->mainImage.format, 1, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Uplane, Upitch, &textureData->mainImage.imageLayout)) {
2970 return false;
2971 }
2972 if (!VULKAN_UpdateTextureInternal(rendererData, textureData->mainImage.image, textureData->mainImage.format, 2, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Vplane, Vpitch, &textureData->mainImage.imageLayout)) {
2973 return false;
2974 }
2975 return true;
2976}
2977
2978static bool VULKAN_UpdateTextureNV(SDL_Renderer *renderer, SDL_Texture *texture,
2979 const SDL_Rect *rect,
2980 const Uint8 *Yplane, int Ypitch,
2981 const Uint8 *UVplane, int UVpitch)
2982{
2983 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
2984 VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
2985
2986 if (!textureData) {
2987 return SDL_SetError("Texture is not currently available");
2988 }
2989
2990 if (!VULKAN_UpdateTextureInternal(rendererData, textureData->mainImage.image, textureData->mainImage.format, 0, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch, &textureData->mainImage.imageLayout)) {
2991 return false;
2992 }
2993
2994 if (!VULKAN_UpdateTextureInternal(rendererData, textureData->mainImage.image, textureData->mainImage.format, 1, rect->x / 2, rect->y / 2, (rect->w + 1) / 2, (rect->h + 1) / 2, UVplane, UVpitch, &textureData->mainImage.imageLayout)) {
2995 return false;
2996 }
2997 return true;
2998}
2999#endif
3000
3001static bool VULKAN_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
3002 const SDL_Rect *rect, void **pixels, int *pitch)
3003{
3004 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3005 VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
3006 VkResult rc;
3007 if (!textureData) {
3008 return SDL_SetError("Texture is not currently available");
3009 }
3010
3011 if (textureData->stagingBuffer.buffer != VK_NULL_HANDLE) {
3012 return SDL_SetError("texture is already locked");
3013 }
3014
3015 VkDeviceSize pixelSize = VULKAN_GetBytesPerPixel(textureData->mainImage.format);
3016 VkDeviceSize length = rect->w * pixelSize;
3017 VkDeviceSize stagingBufferSize = length * rect->h;
3018 rc = VULKAN_AllocateBuffer(rendererData,
3019 stagingBufferSize,
3020 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
3021 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
3022 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
3023 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
3024 &textureData->stagingBuffer);
3025 if (rc != VK_SUCCESS) {
3026 return false;
3027 }
3028
3029 /* Make note of where the staging texture will be written to
3030 * (on a call to SDL_UnlockTexture):
3031 */
3032 textureData->lockedRect = *rect;
3033
3034 /* Make sure the caller has information on the texture's pixel buffer,
3035 * then return:
3036 */
3037 *pixels = textureData->stagingBuffer.mappedBufferPtr;
3038 *pitch = (int)length;
3039 return true;
3040
3041}
3042
3043static void VULKAN_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
3044{
3045 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3046 VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
3047
3048 if (!textureData) {
3049 return;
3050 }
3051
3052 VULKAN_EnsureCommandBuffer(rendererData);
3053
3054 // Make sure the destination is in the correct resource state
3055 VULKAN_RecordPipelineImageBarrier(rendererData,
3056 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
3057 VK_ACCESS_TRANSFER_WRITE_BIT,
3058 VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
3059 VK_PIPELINE_STAGE_TRANSFER_BIT,
3060 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
3061 textureData->mainImage.image,
3062 &textureData->mainImage.imageLayout);
3063
3064 VkBufferImageCopy region;
3065 region.bufferOffset = 0;
3066 region.bufferRowLength = 0;
3067 region.bufferImageHeight = 0;
3068 region.imageSubresource.baseArrayLayer = 0;
3069 region.imageSubresource.layerCount = 1;
3070 region.imageSubresource.mipLevel = 0;
3071 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3072 region.imageOffset.x = textureData->lockedRect.x;
3073 region.imageOffset.y = textureData->lockedRect.y;
3074 region.imageOffset.z = 0;
3075 region.imageExtent.width = textureData->lockedRect.w;
3076 region.imageExtent.height = textureData->lockedRect.h;
3077 region.imageExtent.depth = 1;
3078 vkCmdCopyBufferToImage(rendererData->currentCommandBuffer, textureData->stagingBuffer.buffer, textureData->mainImage.image, textureData->mainImage.imageLayout, 1, &region);
3079
3080 // Transition the texture to be shader accessible
3081 VULKAN_RecordPipelineImageBarrier(rendererData,
3082 VK_ACCESS_TRANSFER_WRITE_BIT,
3083 VK_ACCESS_SHADER_READ_BIT,
3084 VK_PIPELINE_STAGE_TRANSFER_BIT,
3085 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
3086 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
3087 textureData->mainImage.image,
3088 &textureData->mainImage.imageLayout);
3089
3090 // Execute the command list before releasing the staging buffer
3091 VULKAN_IssueBatch(rendererData);
3092
3093 VULKAN_DestroyBuffer(rendererData, &textureData->stagingBuffer);
3094}
3095
3096static void VULKAN_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
3097{
3098 VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
3099
3100 if (!textureData) {
3101 return;
3102 }
3103
3104 textureData->scaleMode = (scaleMode == SDL_SCALEMODE_NEAREST) ? VK_FILTER_NEAREST : VK_FILTER_LINEAR;
3105}
3106
3107static bool VULKAN_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
3108{
3109 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3110 VULKAN_TextureData *textureData = NULL;
3111
3112 VULKAN_EnsureCommandBuffer(rendererData);
3113
3114 if (!texture) {
3115 if (rendererData->textureRenderTarget) {
3116
3117 VULKAN_RecordPipelineImageBarrier(rendererData,
3118 VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3119 VK_ACCESS_SHADER_READ_BIT,
3120 VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3121 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
3122 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
3123 rendererData->textureRenderTarget->mainImage.image,
3124 &rendererData->textureRenderTarget->mainImage.imageLayout);
3125 }
3126 rendererData->textureRenderTarget = NULL;
3127 return true;
3128 }
3129
3130 textureData = (VULKAN_TextureData *)texture->internal;
3131
3132 if (textureData->mainImage.imageView == VK_NULL_HANDLE) {
3133 return SDL_SetError("specified texture is not a render target");
3134 }
3135
3136 rendererData->textureRenderTarget = textureData;
3137 VULKAN_RecordPipelineImageBarrier(rendererData,
3138 VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3139 VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3140 VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3141 VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3142 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3143 rendererData->textureRenderTarget->mainImage.image,
3144 &rendererData->textureRenderTarget->mainImage.imageLayout);
3145
3146 return true;
3147}
3148
3149static bool VULKAN_QueueNoOp(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
3150{
3151 return true; // nothing to do in this backend.
3152}
3153
3154static bool VULKAN_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
3155{
3156 VULKAN_VertexPositionColor *verts = (VULKAN_VertexPositionColor *)SDL_AllocateRenderVertices(renderer, count * sizeof(VULKAN_VertexPositionColor), 0, &cmd->data.draw.first);
3157 int i;
3158 bool convert_color = SDL_RenderingLinearSpace(renderer);
3159
3160 if (!verts) {
3161 return false;
3162 }
3163
3164 cmd->data.draw.count = count;
3165 for (i = 0; i < count; i++) {
3166 verts->pos[0] = points[i].x + 0.5f;
3167 verts->pos[1] = points[i].y + 0.5f;
3168 verts->tex[0] = 0.0f;
3169 verts->tex[1] = 0.0f;
3170 verts->color = cmd->data.draw.color;
3171 if (convert_color) {
3172 SDL_ConvertToLinear(&verts->color);
3173 }
3174 verts++;
3175 }
3176 return true;
3177}
3178
3179static bool VULKAN_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
3180 const float *xy, int xy_stride, const SDL_FColor *color, int color_stride, const float *uv, int uv_stride,
3181 int num_vertices, const void *indices, int num_indices, int size_indices,
3182 float scale_x, float scale_y)
3183{
3184 int i;
3185 int count = indices ? num_indices : num_vertices;
3186 VULKAN_VertexPositionColor *verts = (VULKAN_VertexPositionColor *)SDL_AllocateRenderVertices(renderer, count * sizeof(VULKAN_VertexPositionColor), 0, &cmd->data.draw.first);
3187 bool convert_color = SDL_RenderingLinearSpace(renderer);
3188 VULKAN_TextureData *textureData = texture ? (VULKAN_TextureData *)texture->internal : NULL;
3189 float u_scale = textureData ? (float)texture->w / textureData->width : 0.0f;
3190 float v_scale = textureData ? (float)texture->h / textureData->height : 0.0f;
3191
3192 if (!verts) {
3193 return false;
3194 }
3195
3196 cmd->data.draw.count = count;
3197 size_indices = indices ? size_indices : 0;
3198
3199 for (i = 0; i < count; i++) {
3200 int j;
3201 float *xy_;
3202 if (size_indices == 4) {
3203 j = ((const Uint32 *)indices)[i];
3204 } else if (size_indices == 2) {
3205 j = ((const Uint16 *)indices)[i];
3206 } else if (size_indices == 1) {
3207 j = ((const Uint8 *)indices)[i];
3208 } else {
3209 j = i;
3210 }
3211
3212 xy_ = (float *)((char *)xy + j * xy_stride);
3213
3214 verts->pos[0] = xy_[0] * scale_x;
3215 verts->pos[1] = xy_[1] * scale_y;
3216 verts->color = *(SDL_FColor *)((char *)color + j * color_stride);
3217 if (convert_color) {
3218 SDL_ConvertToLinear(&verts->color);
3219 }
3220
3221 if (texture) {
3222 float *uv_ = (float *)((char *)uv + j * uv_stride);
3223 verts->tex[0] = uv_[0] * u_scale;
3224 verts->tex[1] = uv_[1] * v_scale;
3225 } else {
3226 verts->tex[0] = 0.0f;
3227 verts->tex[1] = 0.0f;
3228 }
3229
3230 verts += 1;
3231 }
3232 return true;
3233}
3234
3235static bool VULKAN_UpdateVertexBuffer(SDL_Renderer *renderer,
3236 const void *vertexData, size_t dataSizeInBytes, VULKAN_DrawStateCache *stateCache)
3237{
3238 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3239 const int vbidx = rendererData->currentVertexBuffer;
3240 VULKAN_Buffer *vertexBuffer;
3241
3242 if (dataSizeInBytes == 0) {
3243 return true; // nothing to do.
3244 }
3245
3246 if (rendererData->issueBatch) {
3247 if (VULKAN_IssueBatch(rendererData) != VK_SUCCESS) {
3248 return SDL_SetError("Failed to issue intermediate batch");
3249 }
3250 }
3251 // If the existing vertex buffer isn't big enough, we need to recreate a big enough one
3252 if (dataSizeInBytes > rendererData->vertexBuffers[vbidx].size) {
3253 VULKAN_IssueBatch(rendererData);
3254 VULKAN_WaitForGPU(rendererData);
3255 VULKAN_CreateVertexBuffer(rendererData, vbidx, dataSizeInBytes);
3256 }
3257
3258 vertexBuffer = &rendererData->vertexBuffers[vbidx];
3259 SDL_memcpy(vertexBuffer->mappedBufferPtr, vertexData, dataSizeInBytes);
3260
3261 stateCache->vertexBuffer = vertexBuffer->buffer;
3262
3263 rendererData->currentVertexBuffer = vbidx + 1;
3264 if (rendererData->currentVertexBuffer >= SDL_VULKAN_NUM_VERTEX_BUFFERS) {
3265 rendererData->currentVertexBuffer = 0;
3266 rendererData->issueBatch = true;
3267 }
3268
3269 return true;
3270}
3271
3272static VkSurfaceTransformFlagBitsKHR VULKAN_GetRotationForCurrentRenderTarget(VULKAN_RenderData *rendererData)
3273{
3274 if (rendererData->textureRenderTarget) {
3275 return VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
3276 } else {
3277 return rendererData->swapChainPreTransform;
3278 }
3279}
3280
3281static bool VULKAN_IsDisplayRotated90Degrees(VkSurfaceTransformFlagBitsKHR rotation)
3282{
3283 switch (rotation) {
3284 case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR:
3285 case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR:
3286 return true;
3287 default:
3288 return false;
3289 }
3290}
3291
3292static bool VULKAN_UpdateViewport(SDL_Renderer *renderer)
3293{
3294 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3295 const SDL_Rect *viewport = &rendererData->currentViewport;
3296 Float4X4 projection;
3297 Float4X4 view;
3298 VkSurfaceTransformFlagBitsKHR rotation = VULKAN_GetRotationForCurrentRenderTarget(rendererData);
3299 bool swapDimensions;
3300
3301 if (viewport->w == 0 || viewport->h == 0) {
3302 /* If the viewport is empty, assume that it is because
3303 * SDL_CreateRenderer is calling it, and will call it again later
3304 * with a non-empty viewport.
3305 */
3306 // SDL_Log("%s, no viewport was set!", __FUNCTION__);
3307 return false;
3308 }
3309
3310 switch (rotation) {
3311 case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR:
3312 projection = MatrixRotationZ(SDL_PI_F * 0.5f);
3313 break;
3314 case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR:
3315 projection = MatrixRotationZ(SDL_PI_F);
3316 break;
3317 case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR:
3318 projection = MatrixRotationZ(-SDL_PI_F * 0.5f);
3319 break;
3320 case VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR:
3321 default:
3322 projection = MatrixIdentity();
3323 break;
3324
3325 }
3326
3327 // Update the view matrix
3328 SDL_zero(view);
3329 view.m[0][0] = 2.0f / viewport->w;
3330 view.m[1][1] = -2.0f / viewport->h;
3331 view.m[2][2] = 1.0f;
3332 view.m[3][0] = -1.0f;
3333 view.m[3][1] = 1.0f;
3334 view.m[3][3] = 1.0f;
3335
3336 rendererData->vertexShaderConstantsData.projectionAndView = MatrixMultiply(
3337 view,
3338 projection);
3339
3340 VkViewport vkViewport;
3341
3342 swapDimensions = VULKAN_IsDisplayRotated90Degrees(rotation);
3343 if (swapDimensions) {
3344 vkViewport.x = viewport->y;
3345 vkViewport.y = viewport->x;
3346 vkViewport.width = viewport->h;
3347 vkViewport.height = viewport->w;
3348 }
3349 else {
3350 vkViewport.x = viewport->x;
3351 vkViewport.y = viewport->y;
3352 vkViewport.width = viewport->w;
3353 vkViewport.height = viewport->h;
3354 }
3355 vkViewport.minDepth = 0.0f;
3356 vkViewport.maxDepth = 1.0f;
3357 vkCmdSetViewport(rendererData->currentCommandBuffer, 0, 1, &vkViewport);
3358
3359 rendererData->viewportDirty = false;
3360 return true;
3361}
3362
3363static bool VULKAN_UpdateClipRect(SDL_Renderer *renderer)
3364{
3365 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3366 const SDL_Rect *viewport = &rendererData->currentViewport;
3367 VkSurfaceTransformFlagBitsKHR rotation = VULKAN_GetRotationForCurrentRenderTarget(rendererData);
3368 bool swapDimensions = VULKAN_IsDisplayRotated90Degrees(rotation);
3369
3370 VkRect2D scissor;
3371 if (rendererData->currentCliprectEnabled) {
3372 scissor.offset.x = viewport->x + rendererData->currentCliprect.x;
3373 scissor.offset.y = viewport->y + rendererData->currentCliprect.y;
3374 scissor.extent.width = rendererData->currentCliprect.w;
3375 scissor.extent.height = rendererData->currentCliprect.h;
3376 } else {
3377 scissor.offset.x = viewport->x;
3378 scissor.offset.y = viewport->y;
3379 scissor.extent.width = viewport->w;
3380 scissor.extent.height = viewport->h;
3381 }
3382 if (swapDimensions) {
3383 VkRect2D scissorTemp = scissor;
3384 scissor.offset.x = scissorTemp.offset.y;
3385 scissor.offset.y = scissorTemp.offset.x;
3386 scissor.extent.width = scissorTemp.extent.height;
3387 scissor.extent.height = scissorTemp.extent.width;
3388 }
3389 vkCmdSetScissor(rendererData->currentCommandBuffer, 0, 1, &scissor);
3390
3391 rendererData->cliprectDirty = false;
3392 return true;
3393}
3394
3395static void VULKAN_SetupShaderConstants(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const SDL_Texture *texture, VULKAN_PixelShaderConstants *constants)
3396{
3397 float output_headroom;
3398
3399 SDL_zerop(constants);
3400
3401 constants->scRGB_output = (float)SDL_RenderingLinearSpace(renderer);
3402 constants->color_scale = cmd->data.draw.color_scale;
3403
3404 if (texture) {
3405 switch (texture->format) {
3406 case SDL_PIXELFORMAT_YV12:
3407 case SDL_PIXELFORMAT_IYUV:
3408 case SDL_PIXELFORMAT_NV12:
3409 case SDL_PIXELFORMAT_NV21:
3410 constants->input_type = INPUTTYPE_SRGB;
3411 break;
3412 case SDL_PIXELFORMAT_P010:
3413 constants->input_type = INPUTTYPE_HDR10;
3414 break;
3415 default:
3416 if (texture->colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
3417 constants->input_type = INPUTTYPE_SCRGB;
3418 } else if (SDL_COLORSPACEPRIMARIES(texture->colorspace) == SDL_COLOR_PRIMARIES_BT2020 &&
3419 SDL_COLORSPACETRANSFER(texture->colorspace) == SDL_TRANSFER_CHARACTERISTICS_PQ) {
3420 constants->input_type = INPUTTYPE_HDR10;
3421 } else {
3422 // The sampler will convert from sRGB to linear on load if working in linear colorspace
3423 constants->input_type = INPUTTYPE_UNSPECIFIED;
3424 }
3425 break;
3426 }
3427
3428 constants->sdr_white_point = texture->SDR_white_point;
3429
3430 if (renderer->target) {
3431 output_headroom = renderer->target->HDR_headroom;
3432 } else {
3433 output_headroom = renderer->HDR_headroom;
3434 }
3435
3436 if (texture->HDR_headroom > output_headroom) {
3437 constants->tonemap_method = TONEMAP_CHROME;
3438 constants->tonemap_factor1 = (output_headroom / (texture->HDR_headroom * texture->HDR_headroom));
3439 constants->tonemap_factor2 = (1.0f / output_headroom);
3440 }
3441 }
3442}
3443
3444static VkDescriptorPool VULKAN_AllocateDescriptorPool(VULKAN_RenderData *rendererData)
3445{
3446 VkDescriptorPool descriptorPool = VK_NULL_HANDLE;
3447 VkDescriptorPoolSize descriptorPoolSizes[3];
3448 VkResult result;
3449 descriptorPoolSizes[0].descriptorCount = SDL_VULKAN_MAX_DESCRIPTOR_SETS;
3450 descriptorPoolSizes[0].type = VK_DESCRIPTOR_TYPE_SAMPLER;
3451
3452 descriptorPoolSizes[1].descriptorCount = SDL_VULKAN_MAX_DESCRIPTOR_SETS;
3453 descriptorPoolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
3454
3455 descriptorPoolSizes[2].descriptorCount = SDL_VULKAN_MAX_DESCRIPTOR_SETS;
3456 descriptorPoolSizes[2].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3457
3458 VkDescriptorPoolCreateInfo descriptorPoolCreateInfo = { 0 };
3459 descriptorPoolCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
3460 descriptorPoolCreateInfo.poolSizeCount = SDL_arraysize(descriptorPoolSizes);
3461 descriptorPoolCreateInfo.pPoolSizes = descriptorPoolSizes;
3462 descriptorPoolCreateInfo.maxSets = SDL_VULKAN_MAX_DESCRIPTOR_SETS;
3463 result = vkCreateDescriptorPool(rendererData->device, &descriptorPoolCreateInfo, NULL, &descriptorPool);
3464 if (result != VK_SUCCESS) {
3465 SET_ERROR_CODE("vkCreateDescrptorPool()", result);
3466 return VK_NULL_HANDLE;
3467 }
3468
3469 return descriptorPool;
3470}
3471
3472static VkResult VULKAN_CreateDescriptorSetAndPipelineLayout(VULKAN_RenderData *rendererData, VkSampler samplerYcbcr, VkDescriptorSetLayout *descriptorSetLayoutOut,
3473 VkPipelineLayout *pipelineLayoutOut)
3474{
3475 VkResult result;
3476
3477 // Descriptor set layout
3478 VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo = { 0 };
3479 descriptorSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
3480 descriptorSetLayoutCreateInfo.flags = 0;
3481 VkDescriptorSetLayoutBinding layoutBindings[2];
3482 // PixelShaderConstants
3483 layoutBindings[0].binding = 1;
3484 layoutBindings[0].descriptorCount = 1;
3485 layoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3486 layoutBindings[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3487 layoutBindings[0].pImmutableSamplers = NULL;
3488
3489 // Combined image/sampler
3490 layoutBindings[1].binding = 0;
3491 layoutBindings[1].descriptorCount = 1;
3492 layoutBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
3493 layoutBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
3494 layoutBindings[1].pImmutableSamplers = (samplerYcbcr != VK_NULL_HANDLE) ? &samplerYcbcr : NULL;
3495
3496 descriptorSetLayoutCreateInfo.bindingCount = 2;
3497 descriptorSetLayoutCreateInfo.pBindings = layoutBindings;
3498 result = vkCreateDescriptorSetLayout(rendererData->device, &descriptorSetLayoutCreateInfo, NULL, descriptorSetLayoutOut);
3499 if (result != VK_SUCCESS) {
3500 SET_ERROR_CODE("vkCreateDescriptorSetLayout()", result);
3501 return result;
3502 }
3503
3504 // Pipeline layout
3505 VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = { 0 };
3506 VkPushConstantRange pushConstantRange;
3507 pushConstantRange.size = sizeof( VULKAN_VertexShaderConstants );
3508 pushConstantRange.offset = 0;
3509 pushConstantRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
3510 pipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
3511 pipelineLayoutCreateInfo.setLayoutCount = 1;
3512 pipelineLayoutCreateInfo.pSetLayouts = descriptorSetLayoutOut;
3513 pipelineLayoutCreateInfo.pushConstantRangeCount = 1;
3514 pipelineLayoutCreateInfo.pPushConstantRanges = &pushConstantRange;
3515 result = vkCreatePipelineLayout(rendererData->device, &pipelineLayoutCreateInfo, NULL, pipelineLayoutOut);
3516 if (result != VK_SUCCESS) {
3517 SET_ERROR_CODE("vkCreatePipelineLayout()", result);
3518 return result;
3519 }
3520
3521 return result;
3522}
3523
3524static VkDescriptorSet VULKAN_AllocateDescriptorSet(SDL_Renderer *renderer, VULKAN_Shader shader, VkDescriptorSetLayout descriptorSetLayout,
3525 VkSampler sampler, VkBuffer constantBuffer, VkDeviceSize constantBufferOffset, VkImageView imageView)
3526{
3527 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3528 uint32_t currentDescriptorPoolIndex = rendererData->currentDescriptorPoolIndex;
3529 VkDescriptorPool descriptorPool = rendererData->descriptorPools[rendererData->currentCommandBufferIndex][currentDescriptorPoolIndex];
3530
3531 VkDescriptorSetAllocateInfo descriptorSetAllocateInfo = { 0 };
3532 descriptorSetAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
3533 descriptorSetAllocateInfo.descriptorSetCount = 1;
3534 descriptorSetAllocateInfo.descriptorPool = descriptorPool;
3535 descriptorSetAllocateInfo.pSetLayouts = &descriptorSetLayout;
3536
3537 VkDescriptorSet descriptorSet = VK_NULL_HANDLE;
3538 VkResult result = (rendererData->currentDescriptorSetIndex >= SDL_VULKAN_MAX_DESCRIPTOR_SETS) ? VK_ERROR_OUT_OF_DEVICE_MEMORY : VK_SUCCESS;
3539 if (result == VK_SUCCESS) {
3540 result = vkAllocateDescriptorSets(rendererData->device, &descriptorSetAllocateInfo, &descriptorSet);
3541 }
3542 if (result != VK_SUCCESS) {
3543 // Out of descriptor sets in this pool - see if we have more pools allocated
3544 currentDescriptorPoolIndex++;
3545 if (currentDescriptorPoolIndex < rendererData->numDescriptorPools[rendererData->currentCommandBufferIndex]) {
3546 descriptorPool = rendererData->descriptorPools[rendererData->currentCommandBufferIndex][currentDescriptorPoolIndex];
3547 descriptorSetAllocateInfo.descriptorPool = descriptorPool;
3548 result = vkAllocateDescriptorSets(rendererData->device, &descriptorSetAllocateInfo, &descriptorSet);
3549 if (result != VK_SUCCESS) {
3550 // This should not fail - we are allocating from the front of the descriptor set
3551 SDL_SetError("Unable to allocate descriptor set");
3552 return VK_NULL_HANDLE;
3553 }
3554 rendererData->currentDescriptorPoolIndex = currentDescriptorPoolIndex;
3555 rendererData->currentDescriptorSetIndex = 0;
3556
3557 }
3558 // We are out of pools, create a new one
3559 else {
3560 descriptorPool = VULKAN_AllocateDescriptorPool(rendererData);
3561 if (descriptorPool == VK_NULL_HANDLE) {
3562 // SDL_SetError called in VULKAN_AllocateDescriptorPool if we failed to allocate a new pool
3563 return VK_NULL_HANDLE;
3564 }
3565 rendererData->numDescriptorPools[rendererData->currentCommandBufferIndex]++;
3566 VkDescriptorPool *descriptorPools = (VkDescriptorPool *)SDL_realloc(rendererData->descriptorPools[rendererData->currentCommandBufferIndex],
3567 sizeof(VkDescriptorPool) * rendererData->numDescriptorPools[rendererData->currentCommandBufferIndex]);
3568 descriptorPools[rendererData->numDescriptorPools[rendererData->currentCommandBufferIndex] - 1] = descriptorPool;
3569 rendererData->descriptorPools[rendererData->currentCommandBufferIndex] = descriptorPools;
3570 rendererData->currentDescriptorPoolIndex = currentDescriptorPoolIndex;
3571 rendererData->currentDescriptorSetIndex = 0;
3572
3573 // Call recursively to allocate from the new pool
3574 return VULKAN_AllocateDescriptorSet(renderer, shader, descriptorSetLayout, sampler, constantBuffer, constantBufferOffset, imageView);
3575 }
3576 }
3577 rendererData->currentDescriptorSetIndex++;
3578 VkDescriptorImageInfo combinedImageSamplerDescriptor = { 0 };
3579 VkDescriptorBufferInfo bufferDescriptor = { 0 };
3580 bufferDescriptor.buffer = constantBuffer;
3581 bufferDescriptor.offset = constantBufferOffset;
3582 bufferDescriptor.range = sizeof(VULKAN_PixelShaderConstants);
3583
3584 VkWriteDescriptorSet descriptorWrites[2];
3585 SDL_memset(descriptorWrites, 0, sizeof(descriptorWrites));
3586 uint32_t descriptorCount = 1; // Always have the uniform buffer
3587
3588 descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3589 descriptorWrites[0].dstSet = descriptorSet;
3590 descriptorWrites[0].dstBinding = 1;
3591 descriptorWrites[0].dstArrayElement = 0;
3592 descriptorWrites[0].descriptorCount = 1;
3593 descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
3594 descriptorWrites[0].pBufferInfo = &bufferDescriptor;
3595
3596 if (sampler != VK_NULL_HANDLE && imageView != VK_NULL_HANDLE) {
3597 descriptorCount++;
3598 descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
3599 descriptorWrites[1].dstSet = descriptorSet;
3600 descriptorWrites[1].dstBinding = 0;
3601 descriptorWrites[1].dstArrayElement = 0;
3602 descriptorWrites[1].descriptorCount = 1;
3603 descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
3604 descriptorWrites[1].pImageInfo = &combinedImageSamplerDescriptor;
3605
3606 // Ignore the sampler if we're using YcBcCr data since it will be baked in the descriptor set layout
3607 if (descriptorSetLayout == rendererData->descriptorSetLayout) {
3608 combinedImageSamplerDescriptor.sampler = sampler;
3609 }
3610 combinedImageSamplerDescriptor.imageView = imageView;
3611 combinedImageSamplerDescriptor.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3612 }
3613
3614 vkUpdateDescriptorSets(rendererData->device, descriptorCount, descriptorWrites, 0, NULL);
3615
3616 return descriptorSet;
3617}
3618
3619static bool VULKAN_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, VULKAN_Shader shader, VkPipelineLayout pipelineLayout, VkDescriptorSetLayout descriptorSetLayout,
3620 const VULKAN_PixelShaderConstants *shader_constants, VkPrimitiveTopology topology, VkImageView imageView, VkSampler sampler, const Float4X4 *matrix, VULKAN_DrawStateCache *stateCache)
3621
3622{
3623 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3624 const SDL_BlendMode blendMode = cmd->data.draw.blend;
3625 VkFormat format = rendererData->surfaceFormat.format;
3626 const Float4X4 *newmatrix = matrix ? matrix : &rendererData->identity;
3627 bool updateConstants = false;
3628 VULKAN_PixelShaderConstants solid_constants;
3629 VkDescriptorSet descriptorSet;
3630 VkBuffer constantBuffer;
3631 VkDeviceSize constantBufferOffset;
3632 int i;
3633
3634 if (!VULKAN_ActivateCommandBuffer(renderer, VK_ATTACHMENT_LOAD_OP_LOAD, NULL, stateCache)) {
3635 return false;
3636 }
3637
3638 // See if we need to change the pipeline state
3639 if (!rendererData->currentPipelineState ||
3640 rendererData->currentPipelineState->shader != shader ||
3641 rendererData->currentPipelineState->blendMode != blendMode ||
3642 rendererData->currentPipelineState->topology != topology ||
3643 rendererData->currentPipelineState->format != format ||
3644 rendererData->currentPipelineState->pipelineLayout != pipelineLayout ||
3645 rendererData->currentPipelineState->descriptorSetLayout != descriptorSetLayout) {
3646
3647 rendererData->currentPipelineState = NULL;
3648 for (i = 0; i < rendererData->pipelineStateCount; ++i) {
3649 VULKAN_PipelineState *candidatePiplineState = &rendererData->pipelineStates[i];
3650 if (candidatePiplineState->shader == shader &&
3651 candidatePiplineState->blendMode == blendMode &&
3652 candidatePiplineState->topology == topology &&
3653 candidatePiplineState->format == format &&
3654 candidatePiplineState->pipelineLayout == pipelineLayout &&
3655 candidatePiplineState->descriptorSetLayout == descriptorSetLayout) {
3656 rendererData->currentPipelineState = candidatePiplineState;
3657 break;
3658 }
3659 }
3660
3661 // If we didn't find a match, create a new one -- it must mean the blend mode is non-standard
3662 if (!rendererData->currentPipelineState) {
3663 rendererData->currentPipelineState = VULKAN_CreatePipelineState(renderer, shader, pipelineLayout, descriptorSetLayout, blendMode, topology, format);
3664 }
3665
3666 if (!rendererData->currentPipelineState) {
3667 return SDL_SetError("Unable to create required pipeline state");
3668 }
3669
3670 vkCmdBindPipeline(rendererData->currentCommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, rendererData->currentPipelineState->pipeline);
3671 updateConstants = true;
3672 }
3673
3674 if (rendererData->viewportDirty) {
3675 if (VULKAN_UpdateViewport(renderer)) {
3676 // vertexShaderConstantsData.projectionAndView has changed
3677 updateConstants = true;
3678 }
3679 }
3680
3681 if (rendererData->cliprectDirty) {
3682 VULKAN_UpdateClipRect(renderer);
3683 }
3684
3685 if (updateConstants == true || SDL_memcmp(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix)) != 0) {
3686 SDL_memcpy(&rendererData->vertexShaderConstantsData.model, newmatrix, sizeof(*newmatrix));
3687 vkCmdPushConstants(rendererData->currentCommandBuffer, rendererData->currentPipelineState->pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0,
3688 sizeof(rendererData->vertexShaderConstantsData),
3689 &rendererData->vertexShaderConstantsData);
3690 }
3691
3692 if (!shader_constants) {
3693 VULKAN_SetupShaderConstants(renderer, cmd, NULL, &solid_constants);
3694 shader_constants = &solid_constants;
3695 }
3696
3697 constantBuffer = rendererData->constantBuffers[rendererData->currentCommandBufferIndex][rendererData->currentConstantBufferIndex].buffer;
3698 constantBufferOffset = (rendererData->currentConstantBufferOffset < 0) ? 0 : rendererData->currentConstantBufferOffset;
3699 if (updateConstants ||
3700 SDL_memcmp(shader_constants, &rendererData->currentPipelineState->shader_constants, sizeof(*shader_constants)) != 0) {
3701
3702 if (rendererData->currentConstantBufferOffset == -1) {
3703 // First time, grab offset 0
3704 rendererData->currentConstantBufferOffset = 0;
3705 constantBufferOffset = 0;
3706 }
3707 else {
3708 // Align the next address to the minUniformBufferOffsetAlignment
3709 VkDeviceSize alignment = rendererData->physicalDeviceProperties.limits.minUniformBufferOffsetAlignment;
3710 SDL_assert(rendererData->currentConstantBufferOffset >= 0 );
3711 rendererData->currentConstantBufferOffset += (int32_t)(sizeof(VULKAN_PixelShaderConstants) + alignment - 1) & ~(alignment - 1);
3712 constantBufferOffset = rendererData->currentConstantBufferOffset;
3713 }
3714
3715 // If we have run out of size in this constant buffer, create another if needed
3716 if (rendererData->currentConstantBufferOffset >= SDL_VULKAN_CONSTANT_BUFFER_DEFAULT_SIZE) {
3717 uint32_t newConstantBufferIndex = (rendererData->currentConstantBufferIndex + 1);
3718 // We need a new constant buffer
3719 if (newConstantBufferIndex >= rendererData->numConstantBuffers[rendererData->currentCommandBufferIndex]) {
3720 VULKAN_Buffer newConstantBuffer;
3721 VkResult result = VULKAN_AllocateBuffer(rendererData,
3722 SDL_VULKAN_CONSTANT_BUFFER_DEFAULT_SIZE,
3723 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
3724 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
3725 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
3726 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
3727 &newConstantBuffer);
3728 if (result != VK_SUCCESS) {
3729 return false;
3730 }
3731
3732 rendererData->numConstantBuffers[rendererData->currentCommandBufferIndex]++;
3733 VULKAN_Buffer *newConstantBuffers = (VULKAN_Buffer *)SDL_realloc(rendererData->constantBuffers[rendererData->currentCommandBufferIndex],
3734 sizeof(VULKAN_Buffer) * rendererData->numConstantBuffers[rendererData->currentCommandBufferIndex]);
3735 newConstantBuffers[rendererData->numConstantBuffers[rendererData->currentCommandBufferIndex] - 1] = newConstantBuffer;
3736 rendererData->constantBuffers[rendererData->currentCommandBufferIndex] = newConstantBuffers;
3737 }
3738 rendererData->currentConstantBufferIndex = newConstantBufferIndex;
3739 rendererData->currentConstantBufferOffset = 0;
3740 constantBufferOffset = 0;
3741 constantBuffer = rendererData->constantBuffers[rendererData->currentCommandBufferIndex][rendererData->currentConstantBufferIndex].buffer;
3742 }
3743
3744 SDL_memcpy(&rendererData->currentPipelineState->shader_constants, shader_constants, sizeof(*shader_constants));
3745
3746 // Upload constants to persistently mapped buffer
3747 uint8_t *dst = (uint8_t *)rendererData->constantBuffers[rendererData->currentCommandBufferIndex][rendererData->currentConstantBufferIndex].mappedBufferPtr;
3748 dst += constantBufferOffset;
3749 SDL_memcpy(dst, &rendererData->currentPipelineState->shader_constants, sizeof(VULKAN_PixelShaderConstants));
3750 }
3751
3752 // Allocate/update descriptor set with the bindings
3753 descriptorSet = VULKAN_AllocateDescriptorSet(renderer, shader, descriptorSetLayout, sampler, constantBuffer, constantBufferOffset, imageView);
3754 if (descriptorSet == VK_NULL_HANDLE) {
3755 return false;
3756 }
3757
3758 // Bind the descriptor set with the sampler/UBO/image views
3759 vkCmdBindDescriptorSets(rendererData->currentCommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, rendererData->currentPipelineState->pipelineLayout,
3760 0, 1, &descriptorSet, 0, NULL);
3761
3762 return true;
3763}
3764
3765
3766static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, const Float4X4 *matrix, VULKAN_DrawStateCache *stateCache)
3767{
3768 SDL_Texture *texture = cmd->data.draw.texture;
3769 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3770 VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
3771 VkSampler textureSampler = VK_NULL_HANDLE;
3772 VULKAN_PixelShaderConstants constants;
3773 VkDescriptorSetLayout descriptorSetLayout = (textureData->descriptorSetLayoutYcbcr != VK_NULL_HANDLE) ? textureData->descriptorSetLayoutYcbcr : rendererData->descriptorSetLayout;
3774 VkPipelineLayout pipelineLayout = (textureData->pipelineLayoutYcbcr != VK_NULL_HANDLE) ? textureData->pipelineLayoutYcbcr : rendererData->pipelineLayout;
3775
3776 VULKAN_SetupShaderConstants(renderer, cmd, texture, &constants);
3777
3778 switch (textureData->scaleMode) {
3779 case VK_FILTER_NEAREST:
3780 switch (cmd->data.draw.texture_address_mode) {
3781 case SDL_TEXTURE_ADDRESS_CLAMP:
3782 textureSampler = rendererData->samplers[VULKAN_SAMPLER_NEAREST_CLAMP];
3783 break;
3784 case SDL_TEXTURE_ADDRESS_WRAP:
3785 textureSampler = rendererData->samplers[VULKAN_SAMPLER_NEAREST_WRAP];
3786 break;
3787 default:
3788 return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
3789 }
3790 break;
3791 case VK_FILTER_LINEAR:
3792 switch (cmd->data.draw.texture_address_mode) {
3793 case SDL_TEXTURE_ADDRESS_CLAMP:
3794 textureSampler = rendererData->samplers[VULKAN_SAMPLER_LINEAR_CLAMP];
3795 break;
3796 case SDL_TEXTURE_ADDRESS_WRAP:
3797 textureSampler = rendererData->samplers[VULKAN_SAMPLER_LINEAR_WRAP];
3798 break;
3799 default:
3800 return SDL_SetError("Unknown texture address mode: %d", cmd->data.draw.texture_address_mode);
3801 }
3802 break;
3803 default:
3804 return SDL_SetError("Unknown scale mode: %d", textureData->scaleMode);
3805 }
3806
3807 if (textureData->mainImage.imageLayout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
3808 bool stoppedRenderPass = false;
3809 if (rendererData->currentRenderPass != VK_NULL_HANDLE) {
3810 vkCmdEndRenderPass(rendererData->currentCommandBuffer);
3811 rendererData->currentRenderPass = VK_NULL_HANDLE;
3812 stoppedRenderPass = true;
3813 }
3814
3815 VULKAN_RecordPipelineImageBarrier(rendererData,
3816 VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3817 VK_ACCESS_SHADER_READ_BIT,
3818 VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3819 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
3820 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
3821 textureData->mainImage.image,
3822 &textureData->mainImage.imageLayout);
3823
3824 if (stoppedRenderPass) {
3825 VULKAN_BeginRenderPass(rendererData, VK_ATTACHMENT_LOAD_OP_LOAD, NULL);
3826 }
3827 }
3828
3829 return VULKAN_SetDrawState(renderer, cmd, textureData->shader, pipelineLayout, descriptorSetLayout, &constants, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, textureData->mainImage.imageView, textureSampler, matrix, stateCache);
3830}
3831
3832static void VULKAN_DrawPrimitives(SDL_Renderer *renderer, VkPrimitiveTopology primitiveTopology, const size_t vertexStart, const size_t vertexCount)
3833{
3834 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3835 vkCmdDraw(rendererData->currentCommandBuffer, (uint32_t)vertexCount, 1, (uint32_t)vertexStart, 0);
3836}
3837
3838static void VULKAN_InvalidateCachedState(SDL_Renderer *renderer)
3839{
3840 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3841 rendererData->currentPipelineState = NULL;
3842 rendererData->cliprectDirty = true;
3843}
3844
3845static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
3846{
3847 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3848 VkSurfaceTransformFlagBitsKHR currentRotation = VULKAN_GetRotationForCurrentRenderTarget(rendererData);
3849 VULKAN_DrawStateCache stateCache;
3850 SDL_memset(&stateCache, 0, sizeof(stateCache));
3851
3852 if (!rendererData->device) {
3853 return SDL_SetError("Device lost and couldn't be recovered");
3854 }
3855
3856 if(rendererData->currentViewportRotation != currentRotation) {
3857 rendererData->currentViewportRotation = currentRotation;
3858 rendererData->viewportDirty = true;
3859 rendererData->cliprectDirty = true;
3860 }
3861
3862 if (rendererData->recreateSwapchain) {
3863 if (VULKAN_UpdateForWindowSizeChange(renderer) != VK_SUCCESS) {
3864 return false;
3865 }
3866 rendererData->recreateSwapchain = false;
3867 }
3868
3869 if (!VULKAN_UpdateVertexBuffer(renderer, vertices, vertsize, &stateCache)) {
3870 return false;
3871 }
3872
3873 while (cmd) {
3874 switch (cmd->command) {
3875 case SDL_RENDERCMD_SETDRAWCOLOR:
3876 {
3877 break; // this isn't currently used in this render backend.
3878 }
3879
3880 case SDL_RENDERCMD_SETVIEWPORT:
3881 {
3882 SDL_Rect *viewport = &rendererData->currentViewport;
3883 if (SDL_memcmp(viewport, &cmd->data.viewport.rect, sizeof(cmd->data.viewport.rect)) != 0) {
3884 SDL_copyp(viewport, &cmd->data.viewport.rect);
3885 rendererData->viewportDirty = true;
3886 rendererData->cliprectDirty = true;
3887 }
3888 break;
3889 }
3890
3891 case SDL_RENDERCMD_SETCLIPRECT:
3892 {
3893 const SDL_Rect *rect = &cmd->data.cliprect.rect;
3894 if (rendererData->currentCliprectEnabled != cmd->data.cliprect.enabled) {
3895 rendererData->currentCliprectEnabled = cmd->data.cliprect.enabled;
3896 rendererData->cliprectDirty = true;
3897 }
3898 if (SDL_memcmp(&rendererData->currentCliprect, rect, sizeof(*rect)) != 0) {
3899 SDL_copyp(&rendererData->currentCliprect, rect);
3900 rendererData->cliprectDirty = true;
3901 }
3902 break;
3903 }
3904
3905 case SDL_RENDERCMD_CLEAR:
3906 {
3907 bool convert_color = SDL_RenderingLinearSpace(renderer);
3908 SDL_FColor color = cmd->data.color.color;
3909 if (convert_color) {
3910 SDL_ConvertToLinear(&color);
3911 }
3912 color.r *= cmd->data.color.color_scale;
3913 color.g *= cmd->data.color.color_scale;
3914 color.b *= cmd->data.color.color_scale;
3915
3916 VkClearColorValue clearColor;
3917 clearColor.float32[0] = color.r;
3918 clearColor.float32[1] = color.g;
3919 clearColor.float32[2] = color.b;
3920 clearColor.float32[3] = color.a;
3921 VULKAN_ActivateCommandBuffer(renderer, VK_ATTACHMENT_LOAD_OP_CLEAR, &clearColor, &stateCache);
3922 break;
3923 }
3924
3925 case SDL_RENDERCMD_DRAW_POINTS:
3926 {
3927 const size_t count = cmd->data.draw.count;
3928 const size_t first = cmd->data.draw.first;
3929 const size_t start = first / sizeof(VULKAN_VertexPositionColor);
3930 VULKAN_SetDrawState(renderer, cmd, SHADER_SOLID, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
3931 VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, start, count);
3932 break;
3933 }
3934
3935 case SDL_RENDERCMD_DRAW_LINES:
3936 {
3937 const size_t count = cmd->data.draw.count;
3938 const size_t first = cmd->data.draw.first;
3939 const size_t start = first / sizeof(VULKAN_VertexPositionColor);
3940 const VULKAN_VertexPositionColor *verts = (VULKAN_VertexPositionColor *)(((Uint8 *)vertices) + first);
3941 VULKAN_SetDrawState(renderer, cmd, SHADER_SOLID, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
3942 VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, start, count);
3943 if (verts[0].pos[0] != verts[count - 1].pos[0] || verts[0].pos[1] != verts[count - 1].pos[1]) {
3944 VULKAN_SetDrawState(renderer, cmd, SHADER_SOLID, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
3945 VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, start + (count - 1), 1);
3946 }
3947 break;
3948 }
3949
3950 case SDL_RENDERCMD_FILL_RECTS: // unused
3951 break;
3952
3953 case SDL_RENDERCMD_COPY: // unused
3954 break;
3955
3956 case SDL_RENDERCMD_COPY_EX: // unused
3957 break;
3958
3959 case SDL_RENDERCMD_GEOMETRY:
3960 {
3961 SDL_Texture *texture = cmd->data.draw.texture;
3962 const size_t count = cmd->data.draw.count;
3963 const size_t first = cmd->data.draw.first;
3964 const size_t start = first / sizeof(VULKAN_VertexPositionColor);
3965
3966 if (texture) {
3967 VULKAN_SetCopyState(renderer, cmd, NULL, &stateCache);
3968 } else {
3969 VULKAN_SetDrawState(renderer, cmd, SHADER_SOLID, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
3970 }
3971
3972 VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, start, count);
3973 break;
3974 }
3975
3976 case SDL_RENDERCMD_NO_OP:
3977 break;
3978 }
3979
3980 cmd = cmd->next;
3981 }
3982 return true;
3983}
3984
3985static SDL_Surface* VULKAN_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect)
3986{
3987 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
3988 VkImage backBuffer;
3989 VkImageLayout *imageLayout;
3990 VULKAN_Buffer readbackBuffer;
3991 VkDeviceSize pixelSize;
3992 VkDeviceSize length;
3993 VkDeviceSize readbackBufferSize;
3994 VkFormat vkFormat;
3995 SDL_Surface *output;
3996
3997 VULKAN_EnsureCommandBuffer(rendererData);
3998
3999 // Stop any outstanding renderpass if open
4000 if (rendererData->currentRenderPass != VK_NULL_HANDLE) {
4001 vkCmdEndRenderPass(rendererData->currentCommandBuffer);
4002 rendererData->currentRenderPass = VK_NULL_HANDLE;
4003 }
4004
4005 if (rendererData->textureRenderTarget) {
4006 backBuffer = rendererData->textureRenderTarget->mainImage.image;
4007 imageLayout = &rendererData->textureRenderTarget->mainImage.imageLayout;
4008 vkFormat = rendererData->textureRenderTarget->mainImage.format;
4009 } else {
4010 backBuffer = rendererData->swapchainImages[rendererData->currentSwapchainImageIndex];
4011 imageLayout = &rendererData->swapchainImageLayouts[rendererData->currentSwapchainImageIndex];
4012 vkFormat = rendererData->surfaceFormat.format;
4013 }
4014
4015 pixelSize = VULKAN_GetBytesPerPixel(vkFormat);
4016 length = rect->w * pixelSize;
4017 readbackBufferSize = length * rect->h;
4018 if (VULKAN_AllocateBuffer(rendererData, readbackBufferSize,
4019 VK_BUFFER_USAGE_TRANSFER_DST_BIT,
4020 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
4021 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
4022 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
4023 &readbackBuffer) != VK_SUCCESS) {
4024 return NULL;
4025 }
4026
4027
4028 // Make sure the source is in the correct resource state
4029 VULKAN_RecordPipelineImageBarrier(rendererData,
4030 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
4031 VK_ACCESS_TRANSFER_READ_BIT,
4032 VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
4033 VK_PIPELINE_STAGE_TRANSFER_BIT,
4034 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4035 backBuffer,
4036 imageLayout);
4037
4038 // Copy the image to the readback buffer
4039 VkBufferImageCopy region;
4040 region.bufferOffset = 0;
4041 region.bufferRowLength = 0;
4042 region.bufferImageHeight = 0;
4043 region.imageSubresource.baseArrayLayer = 0;
4044 region.imageSubresource.layerCount = 1;
4045 region.imageSubresource.mipLevel = 0;
4046 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4047 region.imageOffset.x = rect->x;
4048 region.imageOffset.y = rect->y;
4049 region.imageOffset.z = 0;
4050 region.imageExtent.width = rect->w;
4051 region.imageExtent.height = rect->h;
4052 region.imageExtent.depth = 1;
4053 vkCmdCopyImageToBuffer(rendererData->currentCommandBuffer, backBuffer, *imageLayout, readbackBuffer.buffer, 1, &region);
4054
4055 // We need to issue the command list for the copy to finish
4056 VULKAN_IssueBatch(rendererData);
4057
4058 // Transition the render target back to a render target
4059 VULKAN_RecordPipelineImageBarrier(rendererData,
4060 VK_ACCESS_TRANSFER_WRITE_BIT,
4061 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT,
4062 VK_PIPELINE_STAGE_TRANSFER_BIT,
4063 VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
4064 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
4065 backBuffer,
4066 imageLayout);
4067
4068 output = SDL_DuplicatePixels(
4069 rect->w, rect->h,
4070 VULKAN_VkFormatToSDLPixelFormat(vkFormat),
4071 renderer->target ? renderer->target->colorspace : renderer->output_colorspace,
4072 readbackBuffer.mappedBufferPtr,
4073 (int)length);
4074
4075 VULKAN_DestroyBuffer(rendererData, &readbackBuffer);
4076
4077 return output;
4078}
4079
4080static bool VULKAN_AddVulkanRenderSemaphores(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore)
4081{
4082 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
4083
4084 if (wait_semaphore) {
4085 if (rendererData->waitRenderSemaphoreCount == rendererData->waitRenderSemaphoreMax) {
4086 // Allocate an additional one at the end for the normal present wait
4087 VkPipelineStageFlags *waitDestStageMasks = (VkPipelineStageFlags *)SDL_realloc(rendererData->waitDestStageMasks, (rendererData->waitRenderSemaphoreMax + 2) * sizeof(*waitDestStageMasks));
4088 if (!waitDestStageMasks) {
4089 return false;
4090 }
4091 rendererData->waitDestStageMasks = waitDestStageMasks;
4092
4093 VkSemaphore *semaphores = (VkSemaphore *)SDL_realloc(rendererData->waitRenderSemaphores, (rendererData->waitRenderSemaphoreMax + 2) * sizeof(*semaphores));
4094 if (!semaphores) {
4095 return false;
4096 }
4097 rendererData->waitRenderSemaphores = semaphores;
4098 ++rendererData->waitRenderSemaphoreMax;
4099 }
4100 rendererData->waitDestStageMasks[rendererData->waitRenderSemaphoreCount] = wait_stage_mask;
4101 rendererData->waitRenderSemaphores[rendererData->waitRenderSemaphoreCount] = (VkSemaphore)wait_semaphore;
4102 ++rendererData->waitRenderSemaphoreCount;
4103 }
4104
4105 if (signal_semaphore) {
4106 if (rendererData->signalRenderSemaphoreCount == rendererData->signalRenderSemaphoreMax) {
4107 // Allocate an additional one at the end for the normal present signal
4108 VkSemaphore *semaphores = (VkSemaphore *)SDL_realloc(rendererData->signalRenderSemaphores, (rendererData->signalRenderSemaphoreMax + 2) * sizeof(*semaphores));
4109 if (!semaphores) {
4110 return false;
4111 }
4112 rendererData->signalRenderSemaphores = semaphores;
4113 ++rendererData->signalRenderSemaphoreMax;
4114 }
4115 rendererData->signalRenderSemaphores[rendererData->signalRenderSemaphoreCount] = (VkSemaphore)signal_semaphore;
4116 ++rendererData->signalRenderSemaphoreCount;
4117 }
4118
4119 return true;
4120}
4121
4122static bool VULKAN_RenderPresent(SDL_Renderer *renderer)
4123{
4124 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
4125 VkResult result = VK_SUCCESS;
4126
4127 if (!rendererData->device) {
4128 return SDL_SetError("Device lost and couldn't be recovered");
4129 }
4130
4131 if (rendererData->currentCommandBuffer) {
4132 rendererData->currentPipelineState = VK_NULL_HANDLE;
4133 rendererData->viewportDirty = true;
4134
4135 VULKAN_RecordPipelineImageBarrier(rendererData,
4136 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4137 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
4138 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4139 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
4140 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
4141 rendererData->swapchainImages[rendererData->currentSwapchainImageIndex],
4142 &rendererData->swapchainImageLayouts[rendererData->currentSwapchainImageIndex]);
4143
4144 vkEndCommandBuffer(rendererData->currentCommandBuffer);
4145
4146 result = vkResetFences(rendererData->device, 1, &rendererData->fences[rendererData->currentCommandBufferIndex]);
4147 if (result != VK_SUCCESS) {
4148 SET_ERROR_CODE("vkResetFences()", result);
4149 return false;
4150 }
4151
4152 VkPipelineStageFlags waitDestStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
4153 VkSubmitInfo submitInfo = { 0 };
4154 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4155 if (rendererData->waitRenderSemaphoreCount > 0) {
4156 Uint32 additionalSemaphoreCount = (rendererData->currentImageAvailableSemaphore != VK_NULL_HANDLE) ? 1 : 0;
4157 submitInfo.waitSemaphoreCount = rendererData->waitRenderSemaphoreCount + additionalSemaphoreCount;
4158 if (additionalSemaphoreCount > 0) {
4159 rendererData->waitRenderSemaphores[rendererData->waitRenderSemaphoreCount] = rendererData->currentImageAvailableSemaphore;
4160 rendererData->waitDestStageMasks[rendererData->waitRenderSemaphoreCount] = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
4161 }
4162 submitInfo.pWaitSemaphores = rendererData->waitRenderSemaphores;
4163 submitInfo.pWaitDstStageMask = rendererData->waitDestStageMasks;
4164 rendererData->waitRenderSemaphoreCount = 0;
4165 } else if (rendererData->currentImageAvailableSemaphore != VK_NULL_HANDLE) {
4166 submitInfo.waitSemaphoreCount = 1;
4167 submitInfo.pWaitSemaphores = &rendererData->currentImageAvailableSemaphore;
4168 submitInfo.pWaitDstStageMask = &waitDestStageMask;
4169 }
4170 submitInfo.commandBufferCount = 1;
4171 submitInfo.pCommandBuffers = &rendererData->currentCommandBuffer;
4172 if (rendererData->signalRenderSemaphoreCount > 0) {
4173 submitInfo.signalSemaphoreCount = rendererData->signalRenderSemaphoreCount + 1;
4174 rendererData->signalRenderSemaphores[rendererData->signalRenderSemaphoreCount] = rendererData->renderingFinishedSemaphores[rendererData->currentCommandBufferIndex];
4175 submitInfo.pSignalSemaphores = rendererData->signalRenderSemaphores;
4176 rendererData->signalRenderSemaphoreCount = 0;
4177 } else {
4178 submitInfo.signalSemaphoreCount = 1;
4179 submitInfo.pSignalSemaphores = &rendererData->renderingFinishedSemaphores[rendererData->currentCommandBufferIndex];
4180 }
4181 result = vkQueueSubmit(rendererData->graphicsQueue, 1, &submitInfo, rendererData->fences[rendererData->currentCommandBufferIndex]);
4182 if (result != VK_SUCCESS) {
4183 if (result == VK_ERROR_DEVICE_LOST) {
4184 if (VULKAN_HandleDeviceLost(renderer)) {
4185 SDL_SetError("Present failed, device lost");
4186 } else {
4187 // Recovering from device lost failed, error is already set
4188 }
4189 } else {
4190 SET_ERROR_CODE("vkQueueSubmit()", result);
4191 }
4192 return false;
4193 }
4194 rendererData->currentCommandBuffer = VK_NULL_HANDLE;
4195 rendererData->currentImageAvailableSemaphore = VK_NULL_HANDLE;
4196
4197 VkPresentInfoKHR presentInfo = { 0 };
4198 presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
4199 presentInfo.waitSemaphoreCount = 1;
4200 presentInfo.pWaitSemaphores = &rendererData->renderingFinishedSemaphores[rendererData->currentCommandBufferIndex];
4201 presentInfo.swapchainCount = 1;
4202 presentInfo.pSwapchains = &rendererData->swapchain;
4203 presentInfo.pImageIndices = &rendererData->currentSwapchainImageIndex;
4204 result = vkQueuePresentKHR(rendererData->presentQueue, &presentInfo);
4205 if ((result != VK_SUCCESS) && (result != VK_ERROR_OUT_OF_DATE_KHR) && (result != VK_ERROR_SURFACE_LOST_KHR) && (result != VK_SUBOPTIMAL_KHR )) {
4206 SET_ERROR_CODE("vkQueuePresentKHR()", result);
4207 return false;
4208 }
4209
4210 rendererData->currentCommandBufferIndex = ( rendererData->currentCommandBufferIndex + 1 ) % rendererData->swapchainImageCount;
4211
4212 // Wait for previous time this command buffer was submitted, will be N frames ago
4213 result = vkWaitForFences(rendererData->device, 1, &rendererData->fences[rendererData->currentCommandBufferIndex], VK_TRUE, UINT64_MAX);
4214 if (result != VK_SUCCESS) {
4215 if (result == VK_ERROR_DEVICE_LOST) {
4216 if (VULKAN_HandleDeviceLost(renderer)) {
4217 SDL_SetError("Present failed, device lost");
4218 } else {
4219 // Recovering from device lost failed, error is already set
4220 }
4221 } else {
4222 SET_ERROR_CODE("vkWaitForFences()", result);
4223 }
4224 return false;
4225 }
4226
4227 VULKAN_AcquireNextSwapchainImage(renderer);
4228 }
4229
4230 return true;
4231}
4232
4233static bool VULKAN_SetVSync(SDL_Renderer *renderer, const int vsync)
4234{
4235 VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
4236
4237 switch (vsync) {
4238 case -1:
4239 case 0:
4240 case 1:
4241 // Supported
4242 break;
4243 default:
4244 return SDL_Unsupported();
4245 }
4246 if (vsync != rendererData->vsync) {
4247 rendererData->vsync = vsync;
4248 rendererData->recreateSwapchain = true;
4249 }
4250 return true;
4251}
4252
4253static bool VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_PropertiesID create_props)
4254{
4255 VULKAN_RenderData *rendererData;
4256
4257 SDL_SetupRendererColorspace(renderer, create_props);
4258
4259 if (renderer->output_colorspace != SDL_COLORSPACE_SRGB &&
4260 renderer->output_colorspace != SDL_COLORSPACE_SRGB_LINEAR
4261 /*&& renderer->output_colorspace != SDL_COLORSPACE_HDR10*/) {
4262 return SDL_SetError("Unsupported output colorspace");
4263 }
4264
4265 rendererData = (VULKAN_RenderData *)SDL_calloc(1, sizeof(*rendererData));
4266 if (!rendererData) {
4267 return false;
4268 }
4269
4270 rendererData->identity = MatrixIdentity();
4271 rendererData->identitySwizzle.r = VK_COMPONENT_SWIZZLE_IDENTITY;
4272 rendererData->identitySwizzle.g = VK_COMPONENT_SWIZZLE_IDENTITY;
4273 rendererData->identitySwizzle.b = VK_COMPONENT_SWIZZLE_IDENTITY;
4274 rendererData->identitySwizzle.a = VK_COMPONENT_SWIZZLE_IDENTITY;
4275
4276 // Save the create props in case we need to recreate on device lost
4277 rendererData->create_props = SDL_CreateProperties();
4278 if (!SDL_CopyProperties(create_props, rendererData->create_props)) {
4279 SDL_free(rendererData);
4280 return false;
4281 }
4282
4283 renderer->WindowEvent = VULKAN_WindowEvent;
4284 renderer->SupportsBlendMode = VULKAN_SupportsBlendMode;
4285 renderer->CreateTexture = VULKAN_CreateTexture;
4286 renderer->UpdateTexture = VULKAN_UpdateTexture;
4287#ifdef SDL_HAVE_YUV
4288 renderer->UpdateTextureYUV = VULKAN_UpdateTextureYUV;
4289 renderer->UpdateTextureNV = VULKAN_UpdateTextureNV;
4290#endif
4291 renderer->LockTexture = VULKAN_LockTexture;
4292 renderer->UnlockTexture = VULKAN_UnlockTexture;
4293 renderer->SetTextureScaleMode = VULKAN_SetTextureScaleMode;
4294 renderer->SetRenderTarget = VULKAN_SetRenderTarget;
4295 renderer->QueueSetViewport = VULKAN_QueueNoOp;
4296 renderer->QueueSetDrawColor = VULKAN_QueueNoOp;
4297 renderer->QueueDrawPoints = VULKAN_QueueDrawPoints;
4298 renderer->QueueDrawLines = VULKAN_QueueDrawPoints; // lines and points queue vertices the same way.
4299 renderer->QueueGeometry = VULKAN_QueueGeometry;
4300 renderer->InvalidateCachedState = VULKAN_InvalidateCachedState;
4301 renderer->RunCommandQueue = VULKAN_RunCommandQueue;
4302 renderer->RenderReadPixels = VULKAN_RenderReadPixels;
4303 renderer->AddVulkanRenderSemaphores = VULKAN_AddVulkanRenderSemaphores;
4304 renderer->RenderPresent = VULKAN_RenderPresent;
4305 renderer->DestroyTexture = VULKAN_DestroyTexture;
4306 renderer->DestroyRenderer = VULKAN_DestroyRenderer;
4307 renderer->SetVSync = VULKAN_SetVSync;
4308 renderer->internal = rendererData;
4309 VULKAN_InvalidateCachedState(renderer);
4310
4311 renderer->name = VULKAN_RenderDriver.name;
4312 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ARGB8888);
4313 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
4314 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
4315 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
4316 SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384);
4317
4318 /* HACK: make sure the SDL_Renderer references the SDL_Window data now, in
4319 * order to give init functions access to the underlying window handle:
4320 */
4321 renderer->window = window;
4322
4323 // Initialize Vulkan resources
4324 if (VULKAN_CreateDeviceResources(renderer, create_props) != VK_SUCCESS) {
4325 return false;
4326 }
4327
4328 if (VULKAN_CreateWindowSizeDependentResources(renderer) != VK_SUCCESS) {
4329 return false;
4330 }
4331
4332#ifdef SDL_HAVE_YUV
4333 if (rendererData->supportsKHRSamplerYCbCrConversion) {
4334 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_YV12);
4335 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_IYUV);
4336 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV12);
4337 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_NV21);
4338 SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_P010);
4339 }
4340#endif
4341
4342 return true;
4343}
4344
4345SDL_RenderDriver VULKAN_RenderDriver = {
4346 VULKAN_CreateRenderer, "vulkan"
4347};
4348
4349#endif // SDL_VIDEO_RENDER_VULKAN
diff --git a/SDL-3.2.8/src/render/vulkan/SDL_shaders_vulkan.c b/SDL-3.2.8/src/render/vulkan/SDL_shaders_vulkan.c
new file mode 100644
index 0000000..6c02cf2
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/SDL_shaders_vulkan.c
@@ -0,0 +1,60 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23#ifdef SDL_VIDEO_RENDER_VULKAN
24
25#include "SDL_shaders_vulkan.h"
26
27// The shaders here were compiled with compile_shaders.bat
28#include "VULKAN_PixelShader_Colors.h"
29#include "VULKAN_PixelShader_Textures.h"
30#include "VULKAN_PixelShader_Advanced.h"
31#include "VULKAN_VertexShader.h"
32
33static struct
34{
35 const void *ps_shader_data;
36 size_t ps_shader_size;
37 const void *vs_shader_data;
38 size_t vs_shader_size;
39} VULKAN_shaders[NUM_SHADERS] = {
40 { VULKAN_PixelShader_Colors, sizeof(VULKAN_PixelShader_Colors),
41 VULKAN_VertexShader, sizeof(VULKAN_VertexShader) },
42 { VULKAN_PixelShader_Textures, sizeof(VULKAN_PixelShader_Textures),
43 VULKAN_VertexShader, sizeof(VULKAN_VertexShader) },
44 { VULKAN_PixelShader_Advanced, sizeof(VULKAN_PixelShader_Advanced),
45 VULKAN_VertexShader, sizeof(VULKAN_VertexShader) },
46};
47
48void VULKAN_GetVertexShader(VULKAN_Shader shader, const uint32_t **outBytecode, size_t *outSize)
49{
50 *outBytecode = (const uint32_t *)VULKAN_shaders[shader].vs_shader_data;
51 *outSize = VULKAN_shaders[shader].vs_shader_size;
52}
53
54void VULKAN_GetPixelShader(VULKAN_Shader shader, const uint32_t **outBytecode, size_t *outSize)
55{
56 *outBytecode = (const uint32_t *)VULKAN_shaders[shader].ps_shader_data;
57 *outSize = VULKAN_shaders[shader].ps_shader_size;
58}
59
60#endif // SDL_VIDEO_RENDER_VULKAN
diff --git a/SDL-3.2.8/src/render/vulkan/SDL_shaders_vulkan.h b/SDL-3.2.8/src/render/vulkan/SDL_shaders_vulkan.h
new file mode 100644
index 0000000..bc98aa3
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/SDL_shaders_vulkan.h
@@ -0,0 +1,44 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23// Vulkan shader implementation
24
25// Set up for C function definitions, even when using C++
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30typedef enum
31{
32 SHADER_SOLID,
33 SHADER_RGB,
34 SHADER_ADVANCED,
35 NUM_SHADERS
36} VULKAN_Shader;
37
38extern void VULKAN_GetVertexShader(VULKAN_Shader shader, const uint32_t **outBytecode, size_t *outSize);
39extern void VULKAN_GetPixelShader(VULKAN_Shader shader, const uint32_t **outBytecode, size_t *outSize);
40
41// Ends C function definitions when using C++
42#ifdef __cplusplus
43}
44#endif
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Advanced.h b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Advanced.h
new file mode 100644
index 0000000..0c267cf
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Advanced.h
@@ -0,0 +1,271 @@
1 // 1113.1.1
2 #pragma once
3static const uint32_t VULKAN_PixelShader_Advanced[] = {
4 0x07230203,0x00010000,0x0008000b,0x0000043e,0x00000000,0x00020011,0x00000001,0x0006000b,
5 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
6 0x0008000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x000001bb,0x000001be,0x000001c2,
7 0x00030010,0x00000004,0x00000007,0x00030003,0x00000005,0x000001f4,0x00040005,0x00000004,
8 0x6e69616d,0x00000000,0x00050005,0x00000075,0x736e6f43,0x746e6174,0x00000073,0x00070006,
9 0x00000075,0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00060006,0x00000075,
10 0x00000001,0x75706e69,0x79745f74,0x00006570,0x00060006,0x00000075,0x00000002,0x6f6c6f63,
11 0x63735f72,0x00656c61,0x00060006,0x00000075,0x00000003,0x73756e75,0x705f6465,0x00306461,
12 0x00070006,0x00000075,0x00000004,0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,
13 0x00000075,0x00000005,0x656e6f74,0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000075,
14 0x00000006,0x656e6f74,0x5f70616d,0x74636166,0x0032726f,0x00070006,0x00000075,0x00000007,
15 0x5f726473,0x74696877,0x6f705f65,0x00746e69,0x00030005,0x00000077,0x00000000,0x00050005,
16 0x000000e6,0x74786574,0x30657275,0x00000000,0x00050005,0x000001bb,0x75706e69,0x65742e74,
17 0x00000078,0x00050005,0x000001be,0x75706e69,0x6f632e74,0x00726f6c,0x00070005,0x000001c2,
18 0x746e6540,0x6f507972,0x4f746e69,0x75707475,0x00000074,0x00050048,0x00000075,0x00000000,
19 0x00000023,0x00000000,0x00050048,0x00000075,0x00000001,0x00000023,0x00000004,0x00050048,
20 0x00000075,0x00000002,0x00000023,0x00000008,0x00050048,0x00000075,0x00000003,0x00000023,
21 0x0000000c,0x00050048,0x00000075,0x00000004,0x00000023,0x00000010,0x00050048,0x00000075,
22 0x00000005,0x00000023,0x00000014,0x00050048,0x00000075,0x00000006,0x00000023,0x00000018,
23 0x00050048,0x00000075,0x00000007,0x00000023,0x0000001c,0x00030047,0x00000075,0x00000002,
24 0x00040047,0x00000077,0x00000022,0x00000000,0x00040047,0x00000077,0x00000021,0x00000001,
25 0x00040047,0x000000e6,0x00000022,0x00000000,0x00040047,0x000000e6,0x00000021,0x00000000,
26 0x00040047,0x000001bb,0x0000001e,0x00000000,0x00040047,0x000001be,0x0000001e,0x00000001,
27 0x00040047,0x000001c2,0x0000001e,0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,
28 0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x0000000f,0x00000006,0x00000003,
29 0x00040017,0x00000018,0x00000006,0x00000004,0x00040017,0x00000019,0x00000006,0x00000002,
30 0x0004002b,0x00000006,0x00000032,0x3d25aee6,0x00020014,0x00000033,0x0004002b,0x00000006,
31 0x00000038,0x414eb852,0x0004002b,0x00000006,0x0000003c,0x3d6147ae,0x0004002b,0x00000006,
32 0x0000003f,0x3f870a3d,0x0004002b,0x00000006,0x00000041,0x4019999a,0x0004002b,0x00000006,
33 0x00000047,0x3b4d2e1c,0x0004002b,0x00000006,0x00000050,0x3ed55555,0x0004002b,0x00000006,
34 0x0000005a,0x3c4fcdac,0x0006002c,0x0000000f,0x0000005b,0x0000005a,0x0000005a,0x0000005a,
35 0x0004002b,0x00000006,0x0000005d,0x3f560000,0x0004002b,0x00000006,0x00000060,0x00000000,
36 0x0006002c,0x0000000f,0x00000061,0x00000060,0x00000060,0x00000060,0x0004002b,0x00000006,
37 0x00000064,0x4196d000,0x0004002b,0x00000006,0x00000065,0x41958000,0x0004002b,0x00000006,
38 0x0000006c,0x461c4000,0x0004002b,0x00000006,0x00000071,0x40c8e06b,0x0006002c,0x0000000f,
39 0x00000072,0x00000071,0x00000071,0x00000071,0x000a001e,0x00000075,0x00000006,0x00000006,
40 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,0x00000076,
41 0x00000002,0x00000075,0x0004003b,0x00000076,0x00000077,0x00000002,0x00040015,0x00000078,
42 0x00000020,0x00000001,0x0004002b,0x00000078,0x00000079,0x00000007,0x00040020,0x0000007a,
43 0x00000002,0x00000006,0x0004002b,0x00000078,0x00000081,0x00000004,0x0004002b,0x00000006,
44 0x00000084,0x3f800000,0x0004002b,0x00000078,0x00000088,0x00000005,0x0004002b,0x00000006,
45 0x00000090,0x40000000,0x0004002b,0x00000078,0x00000094,0x00000001,0x00040018,0x0000009b,
46 0x0000000f,0x00000003,0x0004002b,0x00000006,0x0000009c,0x3f209d8c,0x0004002b,0x00000006,
47 0x0000009d,0x3ea897c8,0x0004002b,0x00000006,0x0000009e,0x3d3168f9,0x0006002c,0x0000000f,
48 0x0000009f,0x0000009c,0x0000009d,0x0000009e,0x0004002b,0x00000006,0x000000a0,0x3d8d82ba,
49 0x0004002b,0x00000006,0x000000a1,0x3f6b670a,0x0004002b,0x00000006,0x000000a2,0x3c3a27af,
50 0x0006002c,0x0000000f,0x000000a3,0x000000a0,0x000000a1,0x000000a2,0x0004002b,0x00000006,
51 0x000000a4,0x3c86466b,0x0004002b,0x00000006,0x000000a5,0x3db44029,0x0004002b,0x00000006,
52 0x000000a6,0x3f6545b7,0x0006002c,0x0000000f,0x000000a7,0x000000a4,0x000000a5,0x000000a6,
53 0x0006002c,0x0000009b,0x000000a8,0x0000009f,0x000000a3,0x000000a7,0x0004002b,0x00000078,
54 0x000000c1,0x00000006,0x0004002b,0x00000006,0x000000d1,0x3fd48b22,0x0004002b,0x00000006,
55 0x000000d2,0xbf1670a0,0x0004002b,0x00000006,0x000000d3,0xbd952d23,0x0006002c,0x0000000f,
56 0x000000d4,0x000000d1,0x000000d2,0x000000d3,0x0004002b,0x00000006,0x000000d5,0xbdff127f,
57 0x0004002b,0x00000006,0x000000d6,0x3f9102b4,0x0004002b,0x00000006,0x000000d7,0xbc08c60d,
58 0x0006002c,0x0000000f,0x000000d8,0x000000d5,0x000000d6,0x000000d7,0x0004002b,0x00000006,
59 0x000000d9,0xbc94b7b3,0x0004002b,0x00000006,0x000000da,0xbdce05cd,0x0004002b,0x00000006,
60 0x000000db,0x3f8f333c,0x0006002c,0x0000000f,0x000000dc,0x000000d9,0x000000da,0x000000db,
61 0x0006002c,0x0000009b,0x000000dd,0x000000d4,0x000000d8,0x000000dc,0x00090019,0x000000e3,
62 0x00000006,0x00000001,0x00000000,0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,
63 0x000000e4,0x000000e3,0x00040020,0x000000e5,0x00000000,0x000000e4,0x0004003b,0x000000e5,
64 0x000000e6,0x00000000,0x0004002b,0x00000078,0x000000f2,0x00000002,0x0004002b,0x00000078,
65 0x00000103,0x00000000,0x0004002b,0x00000006,0x00000147,0x40400000,0x00040020,0x000001b6,
66 0x00000001,0x00000018,0x00040020,0x000001ba,0x00000001,0x00000019,0x0004003b,0x000001ba,
67 0x000001bb,0x00000001,0x0004003b,0x000001b6,0x000001be,0x00000001,0x00040020,0x000001c1,
68 0x00000003,0x00000018,0x0004003b,0x000001c1,0x000001c2,0x00000003,0x0006002c,0x0000000f,
69 0x000003fa,0x0000005d,0x0000005d,0x0000005d,0x0006002c,0x0000000f,0x000003fb,0x00000064,
70 0x00000064,0x00000064,0x0006002c,0x0000000f,0x00000400,0x00000084,0x00000084,0x00000084,
71 0x0004002b,0x00000006,0x00000406,0x3f72a76f,0x0004002b,0x00000006,0x00000407,0x3d9e8391,
72 0x0004002b,0x00000006,0x00000409,0xbd6147ae,0x00030001,0x00000018,0x0000043d,0x00050036,
73 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x00000019,
74 0x000001bc,0x000001bb,0x0004003d,0x00000018,0x000001bf,0x000001be,0x0004003d,0x000000e4,
75 0x0000023c,0x000000e6,0x00050057,0x00000018,0x0000023f,0x0000023c,0x000001bc,0x00050041,
76 0x0000007a,0x000001d8,0x00000077,0x00000094,0x0004003d,0x00000006,0x000001d9,0x000001d8,
77 0x000500b4,0x00000033,0x000001da,0x000001d9,0x00000147,0x000300f7,0x000001e5,0x00000000,
78 0x000400fa,0x000001da,0x000001db,0x000001e5,0x000200f8,0x000001db,0x0008004f,0x0000000f,
79 0x000001dd,0x0000023f,0x0000023f,0x00000000,0x00000001,0x00000002,0x0006000c,0x0000000f,
80 0x00000246,0x00000001,0x00000004,0x000001dd,0x0007000c,0x0000000f,0x00000247,0x00000001,
81 0x0000001a,0x00000246,0x0000005b,0x00050083,0x0000000f,0x00000249,0x00000247,0x000003fa,
82 0x0007000c,0x0000000f,0x0000024a,0x00000001,0x00000028,0x00000249,0x00000061,0x0006000c,
83 0x0000000f,0x0000024c,0x00000001,0x00000004,0x000001dd,0x0007000c,0x0000000f,0x0000024d,
84 0x00000001,0x0000001a,0x0000024c,0x0000005b,0x0005008e,0x0000000f,0x0000024e,0x0000024d,
85 0x00000065,0x00050083,0x0000000f,0x00000250,0x000003fb,0x0000024e,0x00050088,0x0000000f,
86 0x00000253,0x0000024a,0x00000250,0x0006000c,0x0000000f,0x00000254,0x00000001,0x00000004,
87 0x00000253,0x0007000c,0x0000000f,0x00000255,0x00000001,0x0000001a,0x00000254,0x00000072,
88 0x0005008e,0x0000000f,0x00000256,0x00000255,0x0000006c,0x00050041,0x0000007a,0x00000257,
89 0x00000077,0x00000079,0x0004003d,0x00000006,0x00000258,0x00000257,0x00060050,0x0000000f,
90 0x00000259,0x00000258,0x00000258,0x00000258,0x00050088,0x0000000f,0x0000025a,0x00000256,
91 0x00000259,0x00050051,0x00000006,0x000001e0,0x0000025a,0x00000000,0x00060052,0x00000018,
92 0x000003a7,0x000001e0,0x0000023f,0x00000000,0x00050051,0x00000006,0x000001e2,0x0000025a,
93 0x00000001,0x00060052,0x00000018,0x000003a9,0x000001e2,0x000003a7,0x00000001,0x00050051,
94 0x00000006,0x000001e4,0x0000025a,0x00000002,0x00060052,0x00000018,0x000003ab,0x000001e4,
95 0x000003a9,0x00000002,0x000200f9,0x000001e5,0x000200f8,0x000001e5,0x000700f5,0x00000018,
96 0x0000040a,0x0000023f,0x00000005,0x000003ab,0x000001db,0x00050041,0x0000007a,0x000001e6,
97 0x00000077,0x00000081,0x0004003d,0x00000006,0x000001e7,0x000001e6,0x000500b7,0x00000033,
98 0x000001e8,0x000001e7,0x00000060,0x000300f7,0x000001f3,0x00000000,0x000400fa,0x000001e8,
99 0x000001e9,0x000001f3,0x000200f8,0x000001e9,0x0008004f,0x0000000f,0x000001eb,0x0000040a,
100 0x0000040a,0x00000000,0x00000001,0x00000002,0x00050041,0x0000007a,0x0000025f,0x00000077,
101 0x00000081,0x0004003d,0x00000006,0x00000260,0x0000025f,0x000500b4,0x00000033,0x00000261,
102 0x00000260,0x00000084,0x000300f7,0x00000295,0x00000000,0x000400fa,0x00000261,0x00000262,
103 0x00000267,0x000200f8,0x00000262,0x00050041,0x0000007a,0x00000263,0x00000077,0x00000088,
104 0x0004003d,0x00000006,0x00000264,0x00000263,0x0005008e,0x0000000f,0x00000266,0x000001eb,
105 0x00000264,0x000200f9,0x00000295,0x000200f8,0x00000267,0x00050041,0x0000007a,0x00000268,
106 0x00000077,0x00000081,0x0004003d,0x00000006,0x00000269,0x00000268,0x000500b4,0x00000033,
107 0x0000026a,0x00000269,0x00000090,0x000300f7,0x00000294,0x00000000,0x000400fa,0x0000026a,
108 0x0000026b,0x00000294,0x000200f8,0x0000026b,0x00050041,0x0000007a,0x0000026c,0x00000077,
109 0x00000094,0x0004003d,0x00000006,0x0000026d,0x0000026c,0x000500b4,0x00000033,0x0000026e,
110 0x0000026d,0x00000090,0x000300f7,0x00000272,0x00000000,0x000400fa,0x0000026e,0x0000026f,
111 0x00000272,0x000200f8,0x0000026f,0x00050090,0x0000000f,0x00000271,0x000001eb,0x000000a8,
112 0x000200f9,0x00000272,0x000200f8,0x00000272,0x000700f5,0x0000000f,0x0000040b,0x000001eb,
113 0x0000026b,0x00000271,0x0000026f,0x00050051,0x00000006,0x00000274,0x0000040b,0x00000000,
114 0x00050051,0x00000006,0x00000276,0x0000040b,0x00000001,0x00050051,0x00000006,0x00000278,
115 0x0000040b,0x00000002,0x0007000c,0x00000006,0x00000279,0x00000001,0x00000028,0x00000276,
116 0x00000278,0x0007000c,0x00000006,0x0000027a,0x00000001,0x00000028,0x00000274,0x00000279,
117 0x000500ba,0x00000033,0x0000027c,0x0000027a,0x00000060,0x000300f7,0x0000028c,0x00000000,
118 0x000400fa,0x0000027c,0x0000027d,0x0000028c,0x000200f8,0x0000027d,0x00050041,0x0000007a,
119 0x0000027e,0x00000077,0x00000088,0x0004003d,0x00000006,0x0000027f,0x0000027e,0x0008000c,
120 0x00000006,0x00000282,0x00000001,0x00000032,0x0000027f,0x0000027a,0x00000084,0x00050041,
121 0x0000007a,0x00000283,0x00000077,0x000000c1,0x0004003d,0x00000006,0x00000284,0x00000283,
122 0x0008000c,0x00000006,0x00000287,0x00000001,0x00000032,0x00000284,0x0000027a,0x00000084,
123 0x00050088,0x00000006,0x00000288,0x00000282,0x00000287,0x0005008e,0x0000000f,0x0000028b,
124 0x0000040b,0x00000288,0x000200f9,0x0000028c,0x000200f8,0x0000028c,0x000700f5,0x0000000f,
125 0x0000040c,0x0000040b,0x00000272,0x0000028b,0x0000027d,0x00050041,0x0000007a,0x0000028d,
126 0x00000077,0x00000094,0x0004003d,0x00000006,0x0000028e,0x0000028d,0x000500b4,0x00000033,
127 0x0000028f,0x0000028e,0x00000090,0x000300f7,0x00000293,0x00000000,0x000400fa,0x0000028f,
128 0x00000290,0x00000293,0x000200f8,0x00000290,0x00050090,0x0000000f,0x00000292,0x0000040c,
129 0x000000dd,0x000200f9,0x00000293,0x000200f8,0x00000293,0x000700f5,0x0000000f,0x0000040f,
130 0x0000040c,0x0000028c,0x00000292,0x00000290,0x000200f9,0x00000294,0x000200f8,0x00000294,
131 0x000700f5,0x0000000f,0x0000040e,0x000001eb,0x00000267,0x0000040f,0x00000293,0x000200f9,
132 0x00000295,0x000200f8,0x00000295,0x000700f5,0x0000000f,0x0000040d,0x00000266,0x00000262,
133 0x0000040e,0x00000294,0x00050051,0x00000006,0x000001ee,0x0000040d,0x00000000,0x00060052,
134 0x00000018,0x000003b0,0x000001ee,0x0000040a,0x00000000,0x00050051,0x00000006,0x000001f0,
135 0x0000040d,0x00000001,0x00060052,0x00000018,0x000003b2,0x000001f0,0x000003b0,0x00000001,
136 0x00050051,0x00000006,0x000001f2,0x0000040d,0x00000002,0x00060052,0x00000018,0x000003b4,
137 0x000001f2,0x000003b2,0x00000002,0x000200f9,0x000001f3,0x000200f8,0x000001f3,0x000700f5,
138 0x00000018,0x00000415,0x0000040a,0x000001e5,0x000003b4,0x00000295,0x00050041,0x0000007a,
139 0x000001f4,0x00000077,0x00000094,0x0004003d,0x00000006,0x000001f5,0x000001f4,0x000500b4,
140 0x00000033,0x000001f6,0x000001f5,0x00000084,0x000300f7,0x00000234,0x00000000,0x000400fa,
141 0x000001f6,0x000001f7,0x00000204,0x000200f8,0x000001f7,0x0008004f,0x0000000f,0x000001f9,
142 0x00000415,0x00000415,0x00000000,0x00000001,0x00000002,0x00050041,0x0000007a,0x0000029d,
143 0x00000077,0x00000103,0x0004003d,0x00000006,0x0000029e,0x0000029d,0x000500b7,0x00000033,
144 0x0000029f,0x0000029e,0x00000060,0x000300f7,0x000002ad,0x00000000,0x000400fa,0x0000029f,
145 0x000002a0,0x000002ad,0x000200f8,0x000002a0,0x00050051,0x00000006,0x000002a2,0x00000415,
146 0x00000000,0x000500bc,0x00000033,0x000002b6,0x000002a2,0x00000032,0x000300f7,0x000002c0,
147 0x00000000,0x000400fa,0x000002b6,0x000002b7,0x000002ba,0x000200f8,0x000002b7,0x00050085,
148 0x00000006,0x000002b9,0x000002a2,0x00000407,0x000200f9,0x000002c0,0x000200f8,0x000002ba,
149 0x00050081,0x00000006,0x000002bc,0x000002a2,0x0000003c,0x0006000c,0x00000006,0x000002bd,
150 0x00000001,0x00000004,0x000002bc,0x00050085,0x00000006,0x000002be,0x000002bd,0x00000406,
151 0x0007000c,0x00000006,0x000002bf,0x00000001,0x0000001a,0x000002be,0x00000041,0x000200f9,
152 0x000002c0,0x000200f8,0x000002c0,0x000700f5,0x00000006,0x0000042c,0x000002b9,0x000002b7,
153 0x000002bf,0x000002ba,0x00050051,0x00000006,0x000002a6,0x00000415,0x00000001,0x000500bc,
154 0x00000033,0x000002c5,0x000002a6,0x00000032,0x000300f7,0x000002cf,0x00000000,0x000400fa,
155 0x000002c5,0x000002c6,0x000002c9,0x000200f8,0x000002c6,0x00050085,0x00000006,0x000002c8,
156 0x000002a6,0x00000407,0x000200f9,0x000002cf,0x000200f8,0x000002c9,0x00050081,0x00000006,
157 0x000002cb,0x000002a6,0x0000003c,0x0006000c,0x00000006,0x000002cc,0x00000001,0x00000004,
158 0x000002cb,0x00050085,0x00000006,0x000002cd,0x000002cc,0x00000406,0x0007000c,0x00000006,
159 0x000002ce,0x00000001,0x0000001a,0x000002cd,0x00000041,0x000200f9,0x000002cf,0x000200f8,
160 0x000002cf,0x000700f5,0x00000006,0x0000042e,0x000002c8,0x000002c6,0x000002ce,0x000002c9,
161 0x00050051,0x00000006,0x000002aa,0x00000415,0x00000002,0x000500bc,0x00000033,0x000002d4,
162 0x000002aa,0x00000032,0x000300f7,0x000002de,0x00000000,0x000400fa,0x000002d4,0x000002d5,
163 0x000002d8,0x000200f8,0x000002d5,0x00050085,0x00000006,0x000002d7,0x000002aa,0x00000407,
164 0x000200f9,0x000002de,0x000200f8,0x000002d8,0x00050081,0x00000006,0x000002da,0x000002aa,
165 0x0000003c,0x0006000c,0x00000006,0x000002db,0x00000001,0x00000004,0x000002da,0x00050085,
166 0x00000006,0x000002dc,0x000002db,0x00000406,0x0007000c,0x00000006,0x000002dd,0x00000001,
167 0x0000001a,0x000002dc,0x00000041,0x000200f9,0x000002de,0x000200f8,0x000002de,0x000700f5,
168 0x00000006,0x00000430,0x000002d7,0x000002d5,0x000002dd,0x000002d8,0x00060050,0x0000000f,
169 0x0000043c,0x0000042c,0x0000042e,0x00000430,0x000200f9,0x000002ad,0x000200f8,0x000002ad,
170 0x000700f5,0x0000000f,0x00000432,0x000001f9,0x000001f7,0x0000043c,0x000002de,0x00050041,
171 0x0000007a,0x000002af,0x00000077,0x000000f2,0x0004003d,0x00000006,0x000002b0,0x000002af,
172 0x0005008e,0x0000000f,0x000002b1,0x00000432,0x000002b0,0x00050051,0x00000006,0x000001fc,
173 0x000002b1,0x00000000,0x00050051,0x00000006,0x000001fe,0x000002b1,0x00000001,0x00050051,
174 0x00000006,0x00000200,0x000002b1,0x00000002,0x00050051,0x00000006,0x00000202,0x00000415,
175 0x00000003,0x00070050,0x00000018,0x00000408,0x000001fc,0x000001fe,0x00000200,0x00000202,
176 0x000200f9,0x00000234,0x000200f8,0x00000204,0x00050041,0x0000007a,0x00000205,0x00000077,
177 0x00000094,0x0004003d,0x00000006,0x00000206,0x00000205,0x000500b4,0x00000033,0x00000207,
178 0x00000206,0x00000090,0x000300f7,0x00000233,0x00000000,0x000400fa,0x00000207,0x00000208,
179 0x00000215,0x000200f8,0x00000208,0x0008004f,0x0000000f,0x0000020a,0x00000415,0x00000415,
180 0x00000000,0x00000001,0x00000002,0x00050041,0x0000007a,0x000002e7,0x00000077,0x000000f2,
181 0x0004003d,0x00000006,0x000002e8,0x000002e7,0x0005008e,0x0000000f,0x000002e9,0x0000020a,
182 0x000002e8,0x00050041,0x0000007a,0x000002ea,0x00000077,0x00000103,0x0004003d,0x00000006,
183 0x000002eb,0x000002ea,0x000500b7,0x00000033,0x000002ec,0x000002eb,0x00000060,0x000400a8,
184 0x00000033,0x000002ed,0x000002ec,0x000300f7,0x000002ff,0x00000000,0x000400fa,0x000002ed,
185 0x000002ee,0x000002ff,0x000200f8,0x000002ee,0x00050051,0x00000006,0x000002f0,0x000002e9,
186 0x00000000,0x000500bc,0x00000033,0x00000304,0x000002f0,0x00000047,0x000300f7,0x0000030e,
187 0x00000000,0x000400fa,0x00000304,0x00000305,0x00000308,0x000200f8,0x00000305,0x00050085,
188 0x00000006,0x00000307,0x000002f0,0x00000038,0x000200f9,0x0000030e,0x000200f8,0x00000308,
189 0x0006000c,0x00000006,0x0000030a,0x00000001,0x00000004,0x000002f0,0x0007000c,0x00000006,
190 0x0000030b,0x00000001,0x0000001a,0x0000030a,0x00000050,0x0008000c,0x00000006,0x0000030d,
191 0x00000001,0x00000032,0x0000030b,0x0000003f,0x00000409,0x000200f9,0x0000030e,0x000200f8,
192 0x0000030e,0x000700f5,0x00000006,0x00000421,0x00000307,0x00000305,0x0000030d,0x00000308,
193 0x00050051,0x00000006,0x000002f4,0x000002e9,0x00000001,0x000500bc,0x00000033,0x00000313,
194 0x000002f4,0x00000047,0x000300f7,0x0000031d,0x00000000,0x000400fa,0x00000313,0x00000314,
195 0x00000317,0x000200f8,0x00000314,0x00050085,0x00000006,0x00000316,0x000002f4,0x00000038,
196 0x000200f9,0x0000031d,0x000200f8,0x00000317,0x0006000c,0x00000006,0x00000319,0x00000001,
197 0x00000004,0x000002f4,0x0007000c,0x00000006,0x0000031a,0x00000001,0x0000001a,0x00000319,
198 0x00000050,0x0008000c,0x00000006,0x0000031c,0x00000001,0x00000032,0x0000031a,0x0000003f,
199 0x00000409,0x000200f9,0x0000031d,0x000200f8,0x0000031d,0x000700f5,0x00000006,0x00000423,
200 0x00000316,0x00000314,0x0000031c,0x00000317,0x00050051,0x00000006,0x000002f8,0x000002e9,
201 0x00000002,0x000500bc,0x00000033,0x00000322,0x000002f8,0x00000047,0x000300f7,0x0000032c,
202 0x00000000,0x000400fa,0x00000322,0x00000323,0x00000326,0x000200f8,0x00000323,0x00050085,
203 0x00000006,0x00000325,0x000002f8,0x00000038,0x000200f9,0x0000032c,0x000200f8,0x00000326,
204 0x0006000c,0x00000006,0x00000328,0x00000001,0x00000004,0x000002f8,0x0007000c,0x00000006,
205 0x00000329,0x00000001,0x0000001a,0x00000328,0x00000050,0x0008000c,0x00000006,0x0000032b,
206 0x00000001,0x00000032,0x00000329,0x0000003f,0x00000409,0x000200f9,0x0000032c,0x000200f8,
207 0x0000032c,0x000700f5,0x00000006,0x00000425,0x00000325,0x00000323,0x0000032b,0x00000326,
208 0x00060050,0x0000000f,0x0000043b,0x00000421,0x00000423,0x00000425,0x0008000c,0x0000000f,
209 0x000002fe,0x00000001,0x0000002b,0x0000043b,0x00000061,0x00000400,0x000200f9,0x000002ff,
210 0x000200f8,0x000002ff,0x000700f5,0x0000000f,0x00000427,0x000002e9,0x00000208,0x000002fe,
211 0x0000032c,0x00050051,0x00000006,0x0000020d,0x00000427,0x00000000,0x00050051,0x00000006,
212 0x0000020f,0x00000427,0x00000001,0x00050051,0x00000006,0x00000211,0x00000427,0x00000002,
213 0x00050051,0x00000006,0x00000213,0x00000415,0x00000003,0x00070050,0x00000018,0x00000405,
214 0x0000020d,0x0000020f,0x00000211,0x00000213,0x000200f9,0x00000233,0x000200f8,0x00000215,
215 0x00050041,0x0000007a,0x00000216,0x00000077,0x00000094,0x0004003d,0x00000006,0x00000217,
216 0x00000216,0x000500b4,0x00000033,0x00000218,0x00000217,0x00000147,0x000300f7,0x00000232,
217 0x00000000,0x000400fa,0x00000218,0x00000219,0x0000022f,0x000200f8,0x00000219,0x0008004f,
218 0x0000000f,0x0000021b,0x00000415,0x00000415,0x00000000,0x00000001,0x00000002,0x00050090,
219 0x0000000f,0x0000021c,0x0000021b,0x000000dd,0x00050051,0x00000006,0x0000021e,0x0000021c,
220 0x00000000,0x00060052,0x00000018,0x000003da,0x0000021e,0x0000043d,0x00000000,0x00050051,
221 0x00000006,0x00000220,0x0000021c,0x00000001,0x00060052,0x00000018,0x000003dc,0x00000220,
222 0x000003da,0x00000001,0x00050051,0x00000006,0x00000222,0x0000021c,0x00000002,0x00060052,
223 0x00000018,0x000003de,0x00000222,0x000003dc,0x00000002,0x0008004f,0x0000000f,0x00000224,
224 0x000003de,0x000003de,0x00000000,0x00000001,0x00000002,0x00050041,0x0000007a,0x00000335,
225 0x00000077,0x000000f2,0x0004003d,0x00000006,0x00000336,0x00000335,0x0005008e,0x0000000f,
226 0x00000337,0x00000224,0x00000336,0x00050041,0x0000007a,0x00000338,0x00000077,0x00000103,
227 0x0004003d,0x00000006,0x00000339,0x00000338,0x000500b7,0x00000033,0x0000033a,0x00000339,
228 0x00000060,0x000400a8,0x00000033,0x0000033b,0x0000033a,0x000300f7,0x0000034d,0x00000000,
229 0x000400fa,0x0000033b,0x0000033c,0x0000034d,0x000200f8,0x0000033c,0x00050051,0x00000006,
230 0x0000033e,0x00000337,0x00000000,0x000500bc,0x00000033,0x00000352,0x0000033e,0x00000047,
231 0x000300f7,0x0000035c,0x00000000,0x000400fa,0x00000352,0x00000353,0x00000356,0x000200f8,
232 0x00000353,0x00050085,0x00000006,0x00000355,0x0000033e,0x00000038,0x000200f9,0x0000035c,
233 0x000200f8,0x00000356,0x0006000c,0x00000006,0x00000358,0x00000001,0x00000004,0x0000033e,
234 0x0007000c,0x00000006,0x00000359,0x00000001,0x0000001a,0x00000358,0x00000050,0x0008000c,
235 0x00000006,0x0000035b,0x00000001,0x00000032,0x00000359,0x0000003f,0x00000409,0x000200f9,
236 0x0000035c,0x000200f8,0x0000035c,0x000700f5,0x00000006,0x00000416,0x00000355,0x00000353,
237 0x0000035b,0x00000356,0x00050051,0x00000006,0x00000342,0x00000337,0x00000001,0x000500bc,
238 0x00000033,0x00000361,0x00000342,0x00000047,0x000300f7,0x0000036b,0x00000000,0x000400fa,
239 0x00000361,0x00000362,0x00000365,0x000200f8,0x00000362,0x00050085,0x00000006,0x00000364,
240 0x00000342,0x00000038,0x000200f9,0x0000036b,0x000200f8,0x00000365,0x0006000c,0x00000006,
241 0x00000367,0x00000001,0x00000004,0x00000342,0x0007000c,0x00000006,0x00000368,0x00000001,
242 0x0000001a,0x00000367,0x00000050,0x0008000c,0x00000006,0x0000036a,0x00000001,0x00000032,
243 0x00000368,0x0000003f,0x00000409,0x000200f9,0x0000036b,0x000200f8,0x0000036b,0x000700f5,
244 0x00000006,0x00000418,0x00000364,0x00000362,0x0000036a,0x00000365,0x00050051,0x00000006,
245 0x00000346,0x00000337,0x00000002,0x000500bc,0x00000033,0x00000370,0x00000346,0x00000047,
246 0x000300f7,0x0000037a,0x00000000,0x000400fa,0x00000370,0x00000371,0x00000374,0x000200f8,
247 0x00000371,0x00050085,0x00000006,0x00000373,0x00000346,0x00000038,0x000200f9,0x0000037a,
248 0x000200f8,0x00000374,0x0006000c,0x00000006,0x00000376,0x00000001,0x00000004,0x00000346,
249 0x0007000c,0x00000006,0x00000377,0x00000001,0x0000001a,0x00000376,0x00000050,0x0008000c,
250 0x00000006,0x00000379,0x00000001,0x00000032,0x00000377,0x0000003f,0x00000409,0x000200f9,
251 0x0000037a,0x000200f8,0x0000037a,0x000700f5,0x00000006,0x0000041a,0x00000373,0x00000371,
252 0x00000379,0x00000374,0x00060050,0x0000000f,0x0000043a,0x00000416,0x00000418,0x0000041a,
253 0x0008000c,0x0000000f,0x0000034c,0x00000001,0x0000002b,0x0000043a,0x00000061,0x00000400,
254 0x000200f9,0x0000034d,0x000200f8,0x0000034d,0x000700f5,0x0000000f,0x0000041c,0x00000337,
255 0x00000219,0x0000034c,0x0000037a,0x00050051,0x00000006,0x00000227,0x0000041c,0x00000000,
256 0x00050051,0x00000006,0x00000229,0x0000041c,0x00000001,0x00050051,0x00000006,0x0000022b,
257 0x0000041c,0x00000002,0x00050051,0x00000006,0x0000022d,0x00000415,0x00000003,0x00070050,
258 0x00000018,0x00000401,0x00000227,0x00000229,0x0000022b,0x0000022d,0x000200f9,0x00000232,
259 0x000200f8,0x0000022f,0x0008004f,0x0000000f,0x00000380,0x00000415,0x00000415,0x00000000,
260 0x00000001,0x00000002,0x00050041,0x0000007a,0x00000381,0x00000077,0x000000f2,0x0004003d,
261 0x00000006,0x00000382,0x00000381,0x0005008e,0x0000000f,0x00000383,0x00000380,0x00000382,
262 0x00050051,0x00000006,0x00000385,0x00000383,0x00000000,0x00050051,0x00000006,0x00000387,
263 0x00000383,0x00000001,0x00050051,0x00000006,0x00000389,0x00000383,0x00000002,0x00050051,
264 0x00000006,0x0000038b,0x00000415,0x00000003,0x00070050,0x00000018,0x000003fc,0x00000385,
265 0x00000387,0x00000389,0x0000038b,0x000200f9,0x00000232,0x000200f8,0x00000232,0x000700f5,
266 0x00000018,0x00000439,0x00000401,0x0000034d,0x000003fc,0x0000022f,0x000200f9,0x00000233,
267 0x000200f8,0x00000233,0x000700f5,0x00000018,0x00000438,0x00000405,0x000002ff,0x00000439,
268 0x00000232,0x000200f9,0x00000234,0x000200f8,0x00000234,0x000700f5,0x00000018,0x00000437,
269 0x00000408,0x000002ad,0x00000438,0x00000233,0x00050085,0x00000018,0x00000238,0x00000437,
270 0x000001bf,0x0003003e,0x000001c2,0x00000238,0x000100fd,0x00010038
271};
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Advanced.hlsl b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Advanced.hlsl
new file mode 100644
index 0000000..f3a0a61
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Advanced.hlsl
@@ -0,0 +1,7 @@
1
2#include "VULKAN_PixelShader_Common.hlsli"
3
4float4 main(PixelShaderInput input) : SV_TARGET
5{
6 return AdvancedPixelShader(input);
7}
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Colors.h b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Colors.h
new file mode 100644
index 0000000..bd03f72
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Colors.h
@@ -0,0 +1,41 @@
1 // 1113.1.1
2 #pragma once
3static const uint32_t VULKAN_PixelShader_Colors[] = {
4 0x07230203,0x00010000,0x0008000b,0x000000a1,0x00000000,0x00020011,0x00000001,0x0006000b,
5 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
6 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000048,0x0000004c,0x00030010,
7 0x00000004,0x00000007,0x00030003,0x00000005,0x000001f4,0x00040005,0x00000004,0x6e69616d,
8 0x00000000,0x00050005,0x00000018,0x736e6f43,0x746e6174,0x00000073,0x00070006,0x00000018,
9 0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00060006,0x00000018,0x00000001,
10 0x75706e69,0x79745f74,0x00006570,0x00060006,0x00000018,0x00000002,0x6f6c6f63,0x63735f72,
11 0x00656c61,0x00060006,0x00000018,0x00000003,0x73756e75,0x705f6465,0x00306461,0x00070006,
12 0x00000018,0x00000004,0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,0x00000018,
13 0x00000005,0x656e6f74,0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000018,0x00000006,
14 0x656e6f74,0x5f70616d,0x74636166,0x0032726f,0x00070006,0x00000018,0x00000007,0x5f726473,
15 0x74696877,0x6f705f65,0x00746e69,0x00030005,0x0000001a,0x00000000,0x00050005,0x00000048,
16 0x75706e69,0x6f632e74,0x00726f6c,0x00070005,0x0000004c,0x746e6540,0x6f507972,0x4f746e69,
17 0x75707475,0x00000074,0x00050048,0x00000018,0x00000000,0x00000023,0x00000000,0x00050048,
18 0x00000018,0x00000001,0x00000023,0x00000004,0x00050048,0x00000018,0x00000002,0x00000023,
19 0x00000008,0x00050048,0x00000018,0x00000003,0x00000023,0x0000000c,0x00050048,0x00000018,
20 0x00000004,0x00000023,0x00000010,0x00050048,0x00000018,0x00000005,0x00000023,0x00000014,
21 0x00050048,0x00000018,0x00000006,0x00000023,0x00000018,0x00050048,0x00000018,0x00000007,
22 0x00000023,0x0000001c,0x00030047,0x00000018,0x00000002,0x00040047,0x0000001a,0x00000022,
23 0x00000000,0x00040047,0x0000001a,0x00000021,0x00000001,0x00040047,0x00000048,0x0000001e,
24 0x00000001,0x00040047,0x0000004c,0x0000001e,0x00000000,0x00020013,0x00000002,0x00030021,
25 0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,
26 0x00000004,0x00040017,0x00000015,0x00000006,0x00000003,0x000a001e,0x00000018,0x00000006,
27 0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,
28 0x00000019,0x00000002,0x00000018,0x0004003b,0x00000019,0x0000001a,0x00000002,0x00040015,
29 0x0000001b,0x00000020,0x00000001,0x0004002b,0x0000001b,0x0000001c,0x00000002,0x00040020,
30 0x0000001d,0x00000002,0x00000006,0x0004002b,0x00000006,0x00000033,0x3f800000,0x00040020,
31 0x0000003e,0x00000001,0x00000007,0x0004003b,0x0000003e,0x00000048,0x00000001,0x00040020,
32 0x0000004b,0x00000003,0x00000007,0x0004003b,0x0000004b,0x0000004c,0x00000003,0x0006002c,
33 0x00000015,0x0000009f,0x00000033,0x00000033,0x00000033,0x00050036,0x00000002,0x00000004,
34 0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x00000007,0x00000049,0x00000048,
35 0x00050041,0x0000001d,0x0000007e,0x0000001a,0x0000001c,0x0004003d,0x00000006,0x0000007f,
36 0x0000007e,0x0005008e,0x00000015,0x00000080,0x0000009f,0x0000007f,0x00050051,0x00000006,
37 0x00000082,0x00000080,0x00000000,0x00050051,0x00000006,0x00000084,0x00000080,0x00000001,
38 0x00050051,0x00000006,0x00000086,0x00000080,0x00000002,0x00070050,0x00000007,0x000000a0,
39 0x00000082,0x00000084,0x00000086,0x00000033,0x00050085,0x00000007,0x00000078,0x000000a0,
40 0x00000049,0x0003003e,0x0000004c,0x00000078,0x000100fd,0x00010038
41};
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Colors.hlsl b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Colors.hlsl
new file mode 100644
index 0000000..b754dde
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Colors.hlsl
@@ -0,0 +1,7 @@
1
2#include "VULKAN_PixelShader_Common.hlsli"
3
4float4 main(PixelShaderInput input) : SV_TARGET0
5{
6 return GetOutputColor(1.0) * input.color;
7}
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Common.hlsli b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Common.hlsli
new file mode 100644
index 0000000..04ca409
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Common.hlsli
@@ -0,0 +1,181 @@
1SamplerState sampler0 : register(s0);
2Texture2D texture0 : register(t0);
3
4struct PixelShaderInput
5{
6 float4 pos : SV_POSITION;
7 float2 tex : TEXCOORD0;
8 float4 color : COLOR0;
9};
10
11// These should mirror the definitions in SDL_render_vulkan.c
12static const float TONEMAP_NONE = 0;
13static const float TONEMAP_LINEAR = 1;
14static const float TONEMAP_CHROME = 2;
15
16static const float INPUTTYPE_UNSPECIFIED = 0;
17static const float INPUTTYPE_SRGB = 1;
18static const float INPUTTYPE_SCRGB = 2;
19static const float INPUTTYPE_HDR10 = 3;
20
21cbuffer Constants : register(b1)
22{
23 float scRGB_output;
24 float input_type;
25 float color_scale;
26 float unused_pad0;
27
28 float tonemap_method;
29 float tonemap_factor1;
30 float tonemap_factor2;
31 float sdr_white_point;
32};
33
34static const float3x3 mat709to2020 = {
35 { 0.627404, 0.329283, 0.043313 },
36 { 0.069097, 0.919541, 0.011362 },
37 { 0.016391, 0.088013, 0.895595 }
38};
39
40static const float3x3 mat2020to709 = {
41 { 1.660496, -0.587656, -0.072840 },
42 { -0.124547, 1.132895, -0.008348 },
43 { -0.018154, -0.100597, 1.118751 }
44};
45
46float sRGBtoLinear(float v)
47{
48 if (v <= 0.04045) {
49 v = (v / 12.92);
50 } else {
51 v = pow(abs(v + 0.055) / 1.055, 2.4);
52 }
53 return v;
54}
55
56float sRGBfromLinear(float v)
57{
58 if (v <= 0.0031308) {
59 v = (v * 12.92);
60 } else {
61 v = (pow(abs(v), 1.0 / 2.4) * 1.055 - 0.055);
62 }
63 return v;
64}
65
66float3 PQtoLinear(float3 v)
67{
68 const float c1 = 0.8359375;
69 const float c2 = 18.8515625;
70 const float c3 = 18.6875;
71 const float oo_m1 = 1.0 / 0.1593017578125;
72 const float oo_m2 = 1.0 / 78.84375;
73
74 float3 num = max(pow(abs(v), oo_m2) - c1, 0.0);
75 float3 den = c2 - c3 * pow(abs(v), oo_m2);
76 return (10000.0 * pow(abs(num / den), oo_m1) / sdr_white_point);
77}
78
79float3 ApplyTonemap(float3 v)
80{
81 if (tonemap_method == TONEMAP_LINEAR) {
82 v *= tonemap_factor1;
83 } else if (tonemap_method == TONEMAP_CHROME) {
84 if (input_type == INPUTTYPE_SCRGB) {
85 // Convert to BT.2020 colorspace for tone mapping
86 v = mul(mat709to2020, v);
87 }
88
89 float vmax = max(v.r, max(v.g, v.b));
90 if (vmax > 0.0) {
91 float scale = (1.0 + tonemap_factor1 * vmax) / (1.0 + tonemap_factor2 * vmax);
92 v *= scale;
93 }
94
95 if (input_type == INPUTTYPE_SCRGB) {
96 // Convert to BT.709 colorspace after tone mapping
97 v = mul(mat2020to709, v);
98 }
99 }
100 return v;
101}
102
103float4 GetInputColor(PixelShaderInput input)
104{
105 float4 rgba;
106
107 rgba = texture0.Sample(sampler0, input.tex).rgba;
108
109 return rgba;
110}
111
112float4 GetOutputColor(float4 rgba)
113{
114 float4 output;
115
116 output.rgb = rgba.rgb * color_scale;
117 output.a = rgba.a;
118
119 return output;
120}
121
122float3 GetOutputColorFromSRGB(float3 rgb)
123{
124 float3 output;
125
126 if (scRGB_output) {
127 rgb.r = sRGBtoLinear(rgb.r);
128 rgb.g = sRGBtoLinear(rgb.g);
129 rgb.b = sRGBtoLinear(rgb.b);
130 }
131
132 output.rgb = rgb * color_scale;
133
134 return output;
135}
136
137float3 GetOutputColorFromLinear(float3 rgb)
138{
139 float3 output;
140
141 output.rgb = rgb * color_scale;
142
143 if (!scRGB_output) {
144 output.r = sRGBfromLinear(output.r);
145 output.g = sRGBfromLinear(output.g);
146 output.b = sRGBfromLinear(output.b);
147 output.rgb = saturate(output.rgb);
148 }
149
150 return output;
151}
152
153float4 AdvancedPixelShader(PixelShaderInput input)
154{
155 float4 rgba = GetInputColor(input);
156 float4 output;
157
158 if (input_type == INPUTTYPE_HDR10) {
159 rgba.rgb = PQtoLinear(rgba.rgb);
160 }
161
162 if (tonemap_method != TONEMAP_NONE) {
163 rgba.rgb = ApplyTonemap(rgba.rgb);
164 }
165
166 if (input_type == INPUTTYPE_SRGB) {
167 output.rgb = GetOutputColorFromSRGB(rgba.rgb);
168 output.a = rgba.a;
169 } else if (input_type == INPUTTYPE_SCRGB) {
170 output.rgb = GetOutputColorFromLinear(rgba.rgb);
171 output.a = rgba.a;
172 } else if (input_type == INPUTTYPE_HDR10) {
173 rgba.rgb = mul(mat2020to709, rgba.rgb);
174 output.rgb = GetOutputColorFromLinear(rgba.rgb);
175 output.a = rgba.a;
176 } else {
177 output = GetOutputColor(rgba);
178 }
179
180 return output * input.color;
181}
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Textures.h b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Textures.h
new file mode 100644
index 0000000..3b49aab
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Textures.h
@@ -0,0 +1,50 @@
1 // 1113.1.1
2 #pragma once
3static const uint32_t VULKAN_PixelShader_Textures[] = {
4 0x07230203,0x00010000,0x0008000b,0x000000a8,0x00000000,0x00020011,0x00000001,0x0006000b,
5 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
6 0x0008000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000004b,0x0000004e,0x00000052,
7 0x00030010,0x00000004,0x00000007,0x00030003,0x00000005,0x000001f4,0x00040005,0x00000004,
8 0x6e69616d,0x00000000,0x00050005,0x00000018,0x736e6f43,0x746e6174,0x00000073,0x00070006,
9 0x00000018,0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00060006,0x00000018,
10 0x00000001,0x75706e69,0x79745f74,0x00006570,0x00060006,0x00000018,0x00000002,0x6f6c6f63,
11 0x63735f72,0x00656c61,0x00060006,0x00000018,0x00000003,0x73756e75,0x705f6465,0x00306461,
12 0x00070006,0x00000018,0x00000004,0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,
13 0x00000018,0x00000005,0x656e6f74,0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000018,
14 0x00000006,0x656e6f74,0x5f70616d,0x74636166,0x0032726f,0x00070006,0x00000018,0x00000007,
15 0x5f726473,0x74696877,0x6f705f65,0x00746e69,0x00030005,0x0000001a,0x00000000,0x00050005,
16 0x00000036,0x74786574,0x30657275,0x00000000,0x00050005,0x0000004b,0x75706e69,0x65742e74,
17 0x00000078,0x00050005,0x0000004e,0x75706e69,0x6f632e74,0x00726f6c,0x00070005,0x00000052,
18 0x746e6540,0x6f507972,0x4f746e69,0x75707475,0x00000074,0x00050048,0x00000018,0x00000000,
19 0x00000023,0x00000000,0x00050048,0x00000018,0x00000001,0x00000023,0x00000004,0x00050048,
20 0x00000018,0x00000002,0x00000023,0x00000008,0x00050048,0x00000018,0x00000003,0x00000023,
21 0x0000000c,0x00050048,0x00000018,0x00000004,0x00000023,0x00000010,0x00050048,0x00000018,
22 0x00000005,0x00000023,0x00000014,0x00050048,0x00000018,0x00000006,0x00000023,0x00000018,
23 0x00050048,0x00000018,0x00000007,0x00000023,0x0000001c,0x00030047,0x00000018,0x00000002,
24 0x00040047,0x0000001a,0x00000022,0x00000000,0x00040047,0x0000001a,0x00000021,0x00000001,
25 0x00040047,0x00000036,0x00000022,0x00000000,0x00040047,0x00000036,0x00000021,0x00000000,
26 0x00040047,0x0000004b,0x0000001e,0x00000000,0x00040047,0x0000004e,0x0000001e,0x00000001,
27 0x00040047,0x00000052,0x0000001e,0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,
28 0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,
29 0x00040017,0x0000000d,0x00000006,0x00000002,0x00040017,0x00000015,0x00000006,0x00000003,
30 0x000a001e,0x00000018,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,0x00000006,
31 0x00000006,0x00000006,0x00040020,0x00000019,0x00000002,0x00000018,0x0004003b,0x00000019,
32 0x0000001a,0x00000002,0x00040015,0x0000001b,0x00000020,0x00000001,0x0004002b,0x0000001b,
33 0x0000001c,0x00000002,0x00040020,0x0000001d,0x00000002,0x00000006,0x00090019,0x00000033,
34 0x00000006,0x00000001,0x00000000,0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,
35 0x00000034,0x00000033,0x00040020,0x00000035,0x00000000,0x00000034,0x0004003b,0x00000035,
36 0x00000036,0x00000000,0x00040020,0x00000046,0x00000001,0x00000007,0x00040020,0x0000004a,
37 0x00000001,0x0000000d,0x0004003b,0x0000004a,0x0000004b,0x00000001,0x0004003b,0x00000046,
38 0x0000004e,0x00000001,0x00040020,0x00000051,0x00000003,0x00000007,0x0004003b,0x00000051,
39 0x00000052,0x00000003,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
40 0x00000005,0x0004003d,0x0000000d,0x0000004c,0x0000004b,0x0004003d,0x00000007,0x0000004f,
41 0x0000004e,0x0004003d,0x00000034,0x00000078,0x00000036,0x00050057,0x00000007,0x0000007b,
42 0x00000078,0x0000004c,0x0008004f,0x00000015,0x00000084,0x0000007b,0x0000007b,0x00000000,
43 0x00000001,0x00000002,0x00050041,0x0000001d,0x00000085,0x0000001a,0x0000001c,0x0004003d,
44 0x00000006,0x00000086,0x00000085,0x0005008e,0x00000015,0x00000087,0x00000084,0x00000086,
45 0x00050051,0x00000006,0x00000089,0x00000087,0x00000000,0x00050051,0x00000006,0x0000008b,
46 0x00000087,0x00000001,0x00050051,0x00000006,0x0000008d,0x00000087,0x00000002,0x00050051,
47 0x00000006,0x0000008f,0x0000007b,0x00000003,0x00070050,0x00000007,0x000000a7,0x00000089,
48 0x0000008b,0x0000008d,0x0000008f,0x00050085,0x00000007,0x0000007f,0x000000a7,0x0000004f,
49 0x0003003e,0x00000052,0x0000007f,0x000100fd,0x00010038
50};
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Textures.hlsl b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Textures.hlsl
new file mode 100644
index 0000000..e665291
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_PixelShader_Textures.hlsl
@@ -0,0 +1,7 @@
1
2#include "VULKAN_PixelShader_Common.hlsli"
3
4float4 main(PixelShaderInput input) : SV_TARGET
5{
6 return GetOutputColor(texture0.Sample(sampler0, input.tex)) * input.color;
7}
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_VertexShader.h b/SDL-3.2.8/src/render/vulkan/VULKAN_VertexShader.h
new file mode 100644
index 0000000..76c1c7b
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_VertexShader.h
@@ -0,0 +1,51 @@
1 // 1113.1.1
2 #pragma once
3static const uint32_t VULKAN_VertexShader[] = {
4 0x07230203,0x00010000,0x0008000b,0x000000af,0x00000000,0x00020011,0x00000001,0x0006000b,
5 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
6 0x000c000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000003f,0x00000043,0x00000047,
7 0x00000058,0x0000005b,0x0000005e,0x00000062,0x00030003,0x00000005,0x000001f4,0x00040005,
8 0x00000004,0x6e69616d,0x00000000,0x00060005,0x0000001e,0x68737570,0x736e6f43,0x746e6174,
9 0x00000073,0x00050006,0x0000001e,0x00000000,0x65646f6d,0x0000006c,0x00080006,0x0000001e,
10 0x00000001,0x6a6f7270,0x69746365,0x6e416e6f,0x65695664,0x00000077,0x00060005,0x00000020,
11 0x68737570,0x736e6f43,0x746e6174,0x00000073,0x00050005,0x0000003f,0x75706e69,0x6f702e74,
12 0x00000073,0x00050005,0x00000043,0x75706e69,0x65742e74,0x00000078,0x00050005,0x00000047,
13 0x75706e69,0x6f632e74,0x00726f6c,0x00080005,0x00000058,0x746e6540,0x6f507972,0x4f746e69,
14 0x75707475,0x6f702e74,0x00000073,0x00080005,0x0000005b,0x746e6540,0x6f507972,0x4f746e69,
15 0x75707475,0x65742e74,0x00000078,0x00080005,0x0000005e,0x746e6540,0x6f507972,0x4f746e69,
16 0x75707475,0x6f632e74,0x00726f6c,0x00090005,0x00000062,0x746e6540,0x6f507972,0x4f746e69,
17 0x75707475,0x6f702e74,0x53746e69,0x00657a69,0x00040048,0x0000001e,0x00000000,0x00000005,
18 0x00050048,0x0000001e,0x00000000,0x00000023,0x00000000,0x00050048,0x0000001e,0x00000000,
19 0x00000007,0x00000010,0x00040048,0x0000001e,0x00000001,0x00000005,0x00050048,0x0000001e,
20 0x00000001,0x00000023,0x00000040,0x00050048,0x0000001e,0x00000001,0x00000007,0x00000010,
21 0x00030047,0x0000001e,0x00000002,0x00040047,0x0000003f,0x0000001e,0x00000000,0x00040047,
22 0x00000043,0x0000001e,0x00000001,0x00040047,0x00000047,0x0000001e,0x00000002,0x00040047,
23 0x00000058,0x0000000b,0x00000000,0x00040047,0x0000005b,0x0000001e,0x00000000,0x00040047,
24 0x0000005e,0x0000001e,0x00000001,0x00040047,0x00000062,0x0000000b,0x00000001,0x00020013,
25 0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,
26 0x00000007,0x00000006,0x00000003,0x00040017,0x00000008,0x00000006,0x00000002,0x00040017,
27 0x00000009,0x00000006,0x00000004,0x00040015,0x00000013,0x00000020,0x00000001,0x0004002b,
28 0x00000013,0x00000014,0x00000000,0x0004002b,0x00000006,0x00000018,0x3f800000,0x00040018,
29 0x0000001d,0x00000009,0x00000004,0x0004001e,0x0000001e,0x0000001d,0x0000001d,0x00040020,
30 0x0000001f,0x00000009,0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000009,0x00040020,
31 0x00000021,0x00000009,0x0000001d,0x0004002b,0x00000013,0x00000026,0x00000001,0x00040020,
32 0x0000003e,0x00000001,0x00000007,0x0004003b,0x0000003e,0x0000003f,0x00000001,0x00040020,
33 0x00000042,0x00000001,0x00000008,0x0004003b,0x00000042,0x00000043,0x00000001,0x00040020,
34 0x00000046,0x00000001,0x00000009,0x0004003b,0x00000046,0x00000047,0x00000001,0x00040020,
35 0x00000057,0x00000003,0x00000009,0x0004003b,0x00000057,0x00000058,0x00000003,0x00040020,
36 0x0000005a,0x00000003,0x00000008,0x0004003b,0x0000005a,0x0000005b,0x00000003,0x0004003b,
37 0x00000057,0x0000005e,0x00000003,0x00040020,0x00000061,0x00000003,0x00000006,0x0004003b,
38 0x00000061,0x00000062,0x00000003,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,
39 0x000200f8,0x00000005,0x0004003d,0x00000007,0x00000040,0x0000003f,0x0004003d,0x00000008,
40 0x00000044,0x00000043,0x0004003d,0x00000009,0x00000048,0x00000047,0x00050051,0x00000006,
41 0x0000006b,0x00000040,0x00000000,0x00050051,0x00000006,0x0000006c,0x00000040,0x00000001,
42 0x00050051,0x00000006,0x0000006d,0x00000040,0x00000002,0x00070050,0x00000009,0x0000006e,
43 0x0000006b,0x0000006c,0x0000006d,0x00000018,0x00050041,0x00000021,0x0000006f,0x00000020,
44 0x00000014,0x0004003d,0x0000001d,0x00000070,0x0000006f,0x00050091,0x00000009,0x00000072,
45 0x00000070,0x0000006e,0x00050041,0x00000021,0x00000073,0x00000020,0x00000026,0x0004003d,
46 0x0000001d,0x00000074,0x00000073,0x00050091,0x00000009,0x00000076,0x00000074,0x00000072,
47 0x00050051,0x00000006,0x00000054,0x00000076,0x00000001,0x0004007f,0x00000006,0x00000055,
48 0x00000054,0x00060052,0x00000009,0x000000ae,0x00000055,0x00000076,0x00000001,0x0003003e,
49 0x00000058,0x000000ae,0x0003003e,0x0000005b,0x00000044,0x0003003e,0x0000005e,0x00000048,
50 0x0003003e,0x00000062,0x00000018,0x000100fd,0x00010038
51};
diff --git a/SDL-3.2.8/src/render/vulkan/VULKAN_VertexShader.hlsl b/SDL-3.2.8/src/render/vulkan/VULKAN_VertexShader.hlsl
new file mode 100644
index 0000000..373a179
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/VULKAN_VertexShader.hlsl
@@ -0,0 +1,45 @@
1#pragma pack_matrix( row_major )
2
3struct VertexShaderConstants
4{
5 matrix model;
6 matrix projectionAndView;
7};
8[[vk::push_constant]]
9ConstantBuffer<VertexShaderConstants> pushConstants;
10
11struct VertexShaderInput
12{
13 float3 pos : POSITION;
14 float2 tex : TEXCOORD0;
15 float4 color : COLOR0;
16};
17
18struct VertexShaderOutput
19{
20 float4 pos : SV_POSITION;
21 float2 tex : TEXCOORD0;
22 float4 color : COLOR0;
23 [[vk::builtin("PointSize")]] float pointSize : SV_PointSize;
24};
25
26VertexShaderOutput mainColor(VertexShaderInput input)
27{
28 VertexShaderOutput output;
29 float4 pos = float4(input.pos, 1.0f);
30
31 // Transform the vertex position into projected space.
32 pos = mul(pos, pushConstants.model);
33 pos = mul(pos, pushConstants.projectionAndView);
34 output.pos = pos;
35
36 // Pass through texture coordinates and color values without transformation
37 output.tex = input.tex;
38 output.color = input.color;
39
40 // Always output pointSize so that this VS can be used with points
41 output.pointSize = 1.0;
42
43 return output;
44}
45
diff --git a/SDL-3.2.8/src/render/vulkan/compile_shaders.bat b/SDL-3.2.8/src/render/vulkan/compile_shaders.bat
new file mode 100644
index 0000000..093de82
--- /dev/null
+++ b/SDL-3.2.8/src/render/vulkan/compile_shaders.bat
@@ -0,0 +1,5 @@
1glslangValidator -D --sep main -e main -S frag --target-env vulkan1.0 --auto-sampled-textures --vn VULKAN_PixelShader_Colors -o VULKAN_PixelShader_Colors.h VULKAN_PixelShader_Colors.hlsl
2glslangValidator -D --sep main -e main -S frag --target-env vulkan1.0 --auto-sampled-textures --vn VULKAN_PixelShader_Textures -o VULKAN_PixelShader_Textures.h VULKAN_PixelShader_Textures.hlsl
3glslangValidator -D --sep main -e main -S frag --target-env vulkan1.0 --auto-sampled-textures --vn VULKAN_PixelShader_Advanced -o VULKAN_PixelShader_Advanced.h VULKAN_PixelShader_Advanced.hlsl
4
5glslangValidator -D --sep mainColor -e main -S vert --iy --target-env vulkan1.0 --vn VULKAN_VertexShader -o VULKAN_VertexShader.h VULKAN_VertexShader.hlsl