From 2a55bdd487beba2581fa46404867c2f6da388993 Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Mon, 27 Jan 2025 09:29:26 +0100 Subject: [PATCH 1/9] Account for all bind-points when tracking bound pipelines --- framework/decode/vulkan_address_replacer.cpp | 14 +++++++++----- framework/decode/vulkan_object_info.h | 14 +++++++------- framework/decode/vulkan_replay_consumer_base.cpp | 11 ++++++++--- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/framework/decode/vulkan_address_replacer.cpp b/framework/decode/vulkan_address_replacer.cpp index b416bed422..518f397b70 100644 --- a/framework/decode/vulkan_address_replacer.cpp +++ b/framework/decode/vulkan_address_replacer.cpp @@ -355,7 +355,7 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( auto input_addresses = reinterpret_cast(pipeline_context_sbt.input_handle_buffer.mapped_data); std::unordered_map num_handles_map; - uint32_t num_addresses = 0; + uint32_t num_addresses = 0; { const auto handle_size_capture = static_cast(util::aligned_value( @@ -578,13 +578,17 @@ void VulkanAddressReplacer::ProcessCmdBuildAccelerationStructuresKHR( &build_size_info); } + bool as_buffer_usable = false; + // retrieve VkAccelerationStructureKHR -> VkBuffer -> check/correct size auto* acceleration_structure_info = address_tracker.GetAccelerationStructureByHandle(build_geometry_info.dstAccelerationStructure); - GFXRECON_ASSERT(acceleration_structure_info != nullptr); - auto* buffer_info = address_tracker.GetBufferByHandle(acceleration_structure_info->buffer); - bool as_buffer_usable = - buffer_info != nullptr && buffer_info->size >= build_size_info.accelerationStructureSize; + if (acceleration_structure_info != nullptr) + { + auto* buffer_info = address_tracker.GetBufferByHandle(acceleration_structure_info->buffer); + as_buffer_usable = + buffer_info != nullptr && buffer_info->size >= build_size_info.accelerationStructureSize; + } // determine required size of scratch-buffer uint32_t scratch_size = build_geometry_info.mode == VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR diff --git a/framework/decode/vulkan_object_info.h b/framework/decode/vulkan_object_info.h index 76f43e09a0..60fcb13095 100644 --- a/framework/decode/vulkan_object_info.h +++ b/framework/decode/vulkan_object_info.h @@ -620,13 +620,13 @@ struct VulkanShaderEXTInfo : VulkanObjectInfoAsync struct VulkanCommandBufferInfo : public VulkanPoolObjectInfo { - bool is_frame_boundary{ false }; - std::vector frame_buffer_ids; - std::unordered_map image_layout_barriers; - format::HandleId bound_pipeline_id = format::kNullHandleId; - std::vector push_constant_data; - VkShaderStageFlags push_constant_stage_flags = 0; - VkPipelineLayout push_constant_pipeline_layout = VK_NULL_HANDLE; + bool is_frame_boundary{ false }; + std::vector frame_buffer_ids; + std::unordered_map image_layout_barriers; + std::unordered_map bound_pipelines; + std::vector push_constant_data; + VkShaderStageFlags push_constant_stage_flags = 0; + VkPipelineLayout push_constant_pipeline_layout = VK_NULL_HANDLE; }; struct VulkanRenderPassInfo : public VulkanObjectInfo diff --git a/framework/decode/vulkan_replay_consumer_base.cpp b/framework/decode/vulkan_replay_consumer_base.cpp index 919a5f0d6d..3c271dd006 100644 --- a/framework/decode/vulkan_replay_consumer_base.cpp +++ b/framework/decode/vulkan_replay_consumer_base.cpp @@ -7844,6 +7844,9 @@ VkResult VulkanReplayConsumerBase::OverrideCreateAccelerationStructureKHR( { result = func(device, replay_create_info, GetAllocationCallbacks(pAllocator), replay_accel_struct); } + + // track newly created acceleration-structure + GetDeviceAddressTracker(device_info).TrackAccelerationStructure(acceleration_structure_info); return result; } @@ -8446,7 +8449,7 @@ void VulkanReplayConsumerBase::ClearCommandBufferInfo(VulkanCommandBufferInfo* c GFXRECON_ASSERT(command_buffer_info != nullptr) command_buffer_info->is_frame_boundary = false; command_buffer_info->frame_buffer_ids.clear(); - command_buffer_info->bound_pipeline_id = format::kNullHandleId; + command_buffer_info->bound_pipelines.clear(); command_buffer_info->push_constant_data.clear(); command_buffer_info->push_constant_stage_flags = 0; command_buffer_info->push_constant_pipeline_layout = VK_NULL_HANDLE; @@ -8592,7 +8595,7 @@ void VulkanReplayConsumerBase::OverrideCmdBindPipeline(PFN_vkCmdBindPipeline pipeline = MapHandle(pipeline_info->capture_id, &CommonObjectInfoTable::GetVkPipelineInfo); // keep track of currently bound pipeline - command_buffer_info->bound_pipeline_id = pipeline_info->capture_id; + command_buffer_info->bound_pipelines[pipelineBindPoint] = pipeline_info->capture_id; } func(command_buffer, pipelineBindPoint, pipeline); } @@ -8742,7 +8745,9 @@ void VulkanReplayConsumerBase::OverrideCmdTraceRaysKHR( const auto& address_tracker = GetDeviceAddressTracker(device_info); auto& address_replacer = GetDeviceAddressReplacer(device_info); - auto bound_pipeline = GetObjectInfoTable().GetVkPipelineInfo(command_buffer_info->bound_pipeline_id); + GFXRECON_ASSERT(command_buffer_info->bound_pipelines.count(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR)); + auto bound_pipeline = GetObjectInfoTable().GetVkPipelineInfo( + command_buffer_info->bound_pipelines[VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR]); GFXRECON_ASSERT(bound_pipeline != nullptr) address_replacer.ProcessCmdTraceRays(command_buffer_info, From 09505412d1ae0e8e78e96ff772de8dadac209c35 Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Mon, 27 Jan 2025 10:24:01 +0100 Subject: [PATCH 2/9] Adjust internal compute-shader: pass-through data that could not be mapped --- .../decode/vulkan_address_replacer_shaders.h | 347 +++++++++--------- 1 file changed, 172 insertions(+), 175 deletions(-) diff --git a/framework/decode/vulkan_address_replacer_shaders.h b/framework/decode/vulkan_address_replacer_shaders.h index f90b5aec46..37bbde2785 100644 --- a/framework/decode/vulkan_address_replacer_shaders.h +++ b/framework/decode/vulkan_address_replacer_shaders.h @@ -161,7 +161,7 @@ void main() // g_replacer_bda_comp: original GLSL source #if 0 #version 460 -#extension GL_EXT_buffer_reference2 : require +#extension GL_EXT_buffer_reference2: require #extension GL_GOOGLE_include_directive : require /// -> hash.glsl @@ -174,24 +174,24 @@ uint murmur_32_scramble(uint k) } //! condensed version of murmur3_32 for arrays of uint32_t -#define DEFINE_MURMUR3_32(LEN) \ - uint murmur3_32(const uint key[LEN], uint seed) \ - { \ - uint h = seed; \ - for (uint i = 0; i < LEN; ++i) \ - { \ - h ^= murmur_32_scramble(key[i]); \ - h = (h << 13) | (h >> 19); \ - h = h * 5 + 0xe6546b64; \ - } \ - h ^= LEN << 2; \ - h ^= h >> 16; \ - h *= 0x85ebca6b; \ - h ^= h >> 13; \ - h *= 0xc2b2ae35; \ - h ^= h >> 16; \ - return h; \ - } \ +#define DEFINE_MURMUR3_32(LEN) \ +uint murmur3_32(const uint key[LEN], uint seed)\ +{\ + uint h = seed;\ + for(uint i = 0; i < LEN; ++i)\ + {\ + h ^= murmur_32_scramble(key[i]);\ + h = (h << 13) | (h >> 19);\ + h = h * 5 + 0xe6546b64;\ + }\ + h ^= LEN << 2;\ + h ^= h >> 16;\ + h *= 0x85ebca6b;\ + h ^= h >> 13;\ + h *= 0xc2b2ae35;\ + h ^= h >> 16;\ + return h;\ +}\ /// hash.glsl DEFINE_MURMUR3_32(2); @@ -276,14 +276,11 @@ void main() if(gid >= params.num_handles){ return; } // hashmap lookup - buffer_device_address_t result = get(params.buffer_device_address_map, - params.input_handles.v[gid].buffer_device_address); + buffer_device_address_t input_address = params.input_handles.v[gid].buffer_device_address; + buffer_device_address_t result = get(params.buffer_device_address_map, input_address); - if(!is_null(result)) - { - // write remapped value to output-array - params.output_handles.v[gid].buffer_device_address = result; - } + // write remapped or original value to output-array + params.output_handles.v[gid].buffer_device_address = is_null(result) ? input_address : result; } #endif // g_replacer_bda_comp @@ -534,8 +531,8 @@ static const std::array g_replacer_sbt_comp = { 0x00000152, 0x000200f8, 0x00000152, 0x000200f9, 0x0000016f, 0x000200f8, 0x0000016f, 0x000100fd, 0x00010038 }; -const std::array g_replacer_bda_comp = { - 0x07230203, 0x00010300, 0x0008000b, 0x00000358, 0x00000000, 0x00020011, 0x00000001, 0x00020011, 0x000014b6, +const std::array g_replacer_bda_comp = { + 0x07230203, 0x00010300, 0x0008000b, 0x00000372, 0x00000000, 0x00020011, 0x00000001, 0x00020011, 0x000014b6, 0x00020011, 0x000014e3, 0x0008000a, 0x5f565053, 0x5f545845, 0x63736564, 0x74706972, 0x695f726f, 0x7865646e, 0x00676e69, 0x0009000a, 0x5f565053, 0x5f52484b, 0x73796870, 0x6c616369, 0x6f74735f, 0x65676172, 0x6675625f, 0x00726566, 0x0006000b, 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e, 0x000014e4, @@ -575,7 +572,7 @@ const std::array g_replacer_bda_comp = { 0x00000000, 0x00040047, 0x000000f6, 0x00000006, 0x00000004, 0x00050048, 0x000000f7, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x000000f8, 0x00000002, 0x00050048, 0x000000f8, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x000000fa, 0x00000002, 0x00050048, 0x000000fa, 0x00000000, 0x00000023, 0x00000000, 0x00040047, - 0x0000013b, 0x0000000b, 0x00000019, 0x00020013, 0x00000002, 0x00030021, 0x00000003, 0x00000002, 0x00040015, + 0x0000013e, 0x0000000b, 0x00000019, 0x00020013, 0x00000002, 0x00030021, 0x00000003, 0x00000002, 0x00040015, 0x00000006, 0x00000020, 0x00000000, 0x00040020, 0x00000007, 0x00000007, 0x00000006, 0x0004002b, 0x00000006, 0x0000000c, 0x00000002, 0x0004001c, 0x0000000d, 0x00000006, 0x0000000c, 0x00020014, 0x00000014, 0x00030027, 0x00000022, 0x000014e5, 0x0004001c, 0x00000024, 0x00000006, 0x0000000c, 0x0003001e, 0x00000025, 0x00000024, @@ -599,155 +596,155 @@ const std::array g_replacer_bda_comp = { 0x000000f7, 0x00040020, 0x000000f3, 0x000014e5, 0x000000f8, 0x00040020, 0x000000f1, 0x000014e5, 0x000000f5, 0x0003001e, 0x000000fa, 0x000000f2, 0x00040020, 0x000000fb, 0x00000009, 0x000000fa, 0x0004003b, 0x000000fb, 0x000000fc, 0x00000009, 0x0004002b, 0x00000032, 0x000000fd, 0x00000003, 0x00040020, 0x000000fe, 0x00000009, - 0x00000006, 0x00040020, 0x00000106, 0x00000009, 0x000000f0, 0x00040020, 0x00000109, 0x00000009, 0x000000f1, - 0x00040020, 0x0000010d, 0x000014e5, 0x000000f3, 0x00040020, 0x00000110, 0x000014e5, 0x000000f7, 0x00040020, - 0x00000133, 0x000014e5, 0x000000f6, 0x00040020, 0x00000136, 0x000014e5, 0x00000006, 0x0004002b, 0x00000006, - 0x0000013a, 0x00000020, 0x0006002c, 0x000000e9, 0x0000013b, 0x0000013a, 0x000000b3, 0x000000b3, 0x00030001, - 0x00000014, 0x000002f4, 0x00050036, 0x00000002, 0x00000004, 0x00000000, 0x00000003, 0x000200f8, 0x00000005, - 0x0004003b, 0x0000004c, 0x00000294, 0x00000007, 0x0004003b, 0x0000004c, 0x00000291, 0x00000007, 0x0004003b, - 0x0000004c, 0x0000028e, 0x00000007, 0x0004003b, 0x0000004c, 0x0000028b, 0x00000007, 0x0004003b, 0x0000004c, - 0x00000288, 0x00000007, 0x0004003b, 0x0000004c, 0x00000285, 0x00000007, 0x0004003b, 0x0000004c, 0x00000282, - 0x00000007, 0x0004003b, 0x0000004c, 0x0000027f, 0x00000007, 0x0004003b, 0x0000004c, 0x0000027c, 0x00000007, - 0x0004003b, 0x0000004c, 0x00000279, 0x00000007, 0x0004003b, 0x0000004c, 0x000001be, 0x00000007, 0x000300f7, - 0x0000013c, 0x00000000, 0x000300fb, 0x00000042, 0x0000013d, 0x000200f8, 0x0000013d, 0x00050041, 0x000000ec, + 0x00000006, 0x00040020, 0x00000106, 0x00000009, 0x000000f1, 0x00040020, 0x0000010a, 0x000014e5, 0x000000f3, + 0x00040020, 0x0000010d, 0x000014e5, 0x000000f7, 0x00040020, 0x00000117, 0x00000009, 0x000000f0, 0x00040020, + 0x00000136, 0x000014e5, 0x000000f6, 0x00040020, 0x00000139, 0x000014e5, 0x00000006, 0x0004002b, 0x00000006, + 0x0000013d, 0x00000020, 0x0006002c, 0x000000e9, 0x0000013e, 0x0000013d, 0x000000b3, 0x000000b3, 0x00030001, + 0x00000014, 0x0000030a, 0x00050036, 0x00000002, 0x00000004, 0x00000000, 0x00000003, 0x000200f8, 0x00000005, + 0x0004003b, 0x0000004c, 0x00000297, 0x00000007, 0x0004003b, 0x0000004c, 0x00000294, 0x00000007, 0x0004003b, + 0x0000004c, 0x00000291, 0x00000007, 0x0004003b, 0x0000004c, 0x0000028e, 0x00000007, 0x0004003b, 0x0000004c, + 0x0000028b, 0x00000007, 0x0004003b, 0x0000004c, 0x00000288, 0x00000007, 0x0004003b, 0x0000004c, 0x00000285, + 0x00000007, 0x0004003b, 0x0000004c, 0x00000282, 0x00000007, 0x0004003b, 0x0000004c, 0x0000027f, 0x00000007, + 0x0004003b, 0x0000004c, 0x0000027c, 0x00000007, 0x0004003b, 0x0000004c, 0x000001c1, 0x00000007, 0x000300f7, + 0x0000013f, 0x00000000, 0x000300fb, 0x00000042, 0x00000140, 0x000200f8, 0x00000140, 0x00050041, 0x000000ec, 0x000000ed, 0x000000eb, 0x00000042, 0x0004003d, 0x00000006, 0x000000ee, 0x000000ed, 0x00060041, 0x000000fe, 0x000000ff, 0x000000fc, 0x00000083, 0x000000fd, 0x0004003d, 0x00000006, 0x00000100, 0x000000ff, 0x000500ae, 0x00000014, 0x00000101, 0x000000ee, 0x00000100, 0x000300f7, 0x00000103, 0x00000000, 0x000400fa, 0x00000101, - 0x00000102, 0x00000103, 0x000200f8, 0x00000102, 0x000200f9, 0x0000013c, 0x000200f8, 0x00000103, 0x00060041, - 0x00000106, 0x00000107, 0x000000fc, 0x00000083, 0x00000083, 0x0004003d, 0x000000f0, 0x00000108, 0x00000107, - 0x00060041, 0x00000109, 0x0000010a, 0x000000fc, 0x00000083, 0x00000060, 0x0004003d, 0x000000f1, 0x0000010b, - 0x0000010a, 0x00060041, 0x0000010d, 0x0000010e, 0x0000010b, 0x00000083, 0x000000ee, 0x0006003d, 0x000000f3, - 0x0000010f, 0x0000010e, 0x00000002, 0x00000008, 0x00050041, 0x00000110, 0x00000111, 0x0000010f, 0x00000083, - 0x0006003d, 0x000000f7, 0x00000112, 0x00000111, 0x00000002, 0x00000010, 0x00050051, 0x00000022, 0x00000115, - 0x00000108, 0x00000000, 0x00050051, 0x00000006, 0x0000011a, 0x00000108, 0x00000002, 0x00050051, 0x000000f6, - 0x0000011e, 0x00000112, 0x00000000, 0x00050051, 0x00000006, 0x00000120, 0x0000011e, 0x00000000, 0x00050051, - 0x00000006, 0x00000122, 0x0000011e, 0x00000001, 0x00050050, 0x0000000d, 0x000002dd, 0x00000120, 0x00000122, - 0x000300f7, 0x00000193, 0x00000000, 0x000300fb, 0x00000042, 0x00000154, 0x000200f8, 0x00000154, 0x000300f7, - 0x000001b4, 0x00000000, 0x000300fb, 0x00000042, 0x0000019f, 0x000200f8, 0x0000019f, 0x000200f9, 0x000001a0, - 0x000200f8, 0x000001a0, 0x000700f5, 0x00000006, 0x000002ee, 0x00000042, 0x0000019f, 0x000001b0, 0x000001ae, - 0x000500b0, 0x00000014, 0x000001a3, 0x000002ee, 0x0000000c, 0x000400f6, 0x000001b1, 0x000001ae, 0x00000000, - 0x000400fa, 0x000001a3, 0x000001a4, 0x000001b1, 0x000200f8, 0x000001a4, 0x0003003e, 0x00000291, 0x000002dd, - 0x00050041, 0x00000007, 0x00000293, 0x00000291, 0x000002ee, 0x0004003d, 0x00000006, 0x000001a7, 0x00000293, - 0x0003003e, 0x00000294, 0x00000097, 0x00050041, 0x00000007, 0x00000296, 0x00000294, 0x000002ee, 0x0004003d, - 0x00000006, 0x000001aa, 0x00000296, 0x000500ab, 0x00000014, 0x000001ab, 0x000001a7, 0x000001aa, 0x000300f7, - 0x000001ad, 0x00000000, 0x000400fa, 0x000001ab, 0x000001ac, 0x000001ad, 0x000200f8, 0x000001ac, 0x000200f9, - 0x000001b1, 0x000200f8, 0x000001ad, 0x000200f9, 0x000001ae, 0x000200f8, 0x000001ae, 0x00050080, 0x00000006, - 0x000001b0, 0x000002ee, 0x00000060, 0x000200f9, 0x000001a0, 0x000200f8, 0x000001b1, 0x000700f5, 0x00000014, - 0x000002f2, 0x000002f4, 0x000001a0, 0x00000090, 0x000001ac, 0x000700f5, 0x00000014, 0x000002ef, 0x00000090, - 0x000001a0, 0x00000094, 0x000001ac, 0x000300f7, 0x000001b3, 0x00000000, 0x000400fa, 0x000002ef, 0x000001b4, - 0x000001b3, 0x000200f8, 0x000001b3, 0x000200f9, 0x000001b4, 0x000200f8, 0x000001b4, 0x000700f5, 0x00000014, - 0x000002f1, 0x000002f2, 0x000001b1, 0x00000094, 0x000001b3, 0x000400a8, 0x00000014, 0x00000156, 0x000002f1, - 0x000300f7, 0x0000015a, 0x00000000, 0x000400fa, 0x00000156, 0x00000157, 0x0000015a, 0x000200f8, 0x00000157, - 0x000500aa, 0x00000014, 0x00000159, 0x0000011a, 0x00000042, 0x000200f9, 0x0000015a, 0x000200f8, 0x0000015a, - 0x000700f5, 0x00000014, 0x0000015b, 0x000002f1, 0x000001b4, 0x00000159, 0x00000157, 0x000300f7, 0x0000015d, - 0x00000000, 0x000400fa, 0x0000015b, 0x0000015c, 0x0000015d, 0x000200f8, 0x0000015c, 0x000200f9, 0x00000193, - 0x000200f8, 0x0000015d, 0x000200f9, 0x000001c2, 0x000200f8, 0x000001c2, 0x000700f5, 0x00000006, 0x000002f6, - 0x00000042, 0x0000015d, 0x000001d4, 0x000001c6, 0x000700f5, 0x00000006, 0x000002f5, 0x00000042, 0x0000015d, - 0x000001d7, 0x000001c6, 0x000500b0, 0x00000014, 0x000001c5, 0x000002f5, 0x0000000c, 0x000400f6, 0x000001d8, - 0x000001c6, 0x00000000, 0x000400fa, 0x000001c5, 0x000001c6, 0x000001d8, 0x000200f8, 0x000001c6, 0x0003003e, - 0x000001be, 0x000002dd, 0x00050041, 0x00000007, 0x000001c8, 0x000001be, 0x000002f5, 0x0004003d, 0x00000006, - 0x000001c9, 0x000001c8, 0x00050084, 0x00000006, 0x000001ef, 0x000001c9, 0x0000002e, 0x000500c4, 0x00000006, - 0x000001f1, 0x000001ef, 0x00000033, 0x000500c2, 0x00000006, 0x000001f3, 0x000001ef, 0x00000036, 0x000500c5, - 0x00000006, 0x000001f4, 0x000001f1, 0x000001f3, 0x00050084, 0x00000006, 0x000001f6, 0x000001f4, 0x00000039, - 0x000500c6, 0x00000006, 0x000001cc, 0x000002f6, 0x000001f6, 0x000500c4, 0x00000006, 0x000001ce, 0x000001cc, - 0x00000054, 0x000500c2, 0x00000006, 0x000001d0, 0x000001cc, 0x00000057, 0x000500c5, 0x00000006, 0x000001d1, - 0x000001ce, 0x000001d0, 0x00050084, 0x00000006, 0x000001d3, 0x000001d1, 0x0000005b, 0x00050080, 0x00000006, - 0x000001d4, 0x000001d3, 0x0000005d, 0x00050080, 0x00000006, 0x000001d7, 0x000002f5, 0x00000060, 0x000200f9, - 0x000001c2, 0x000200f8, 0x000001d8, 0x000500c6, 0x00000006, 0x000001da, 0x000002f6, 0x00000062, 0x000500c2, - 0x00000006, 0x000001dc, 0x000001da, 0x00000066, 0x000500c6, 0x00000006, 0x000001de, 0x000001da, 0x000001dc, - 0x00050084, 0x00000006, 0x000001e0, 0x000001de, 0x0000006a, 0x000500c2, 0x00000006, 0x000001e2, 0x000001e0, - 0x00000054, 0x000500c6, 0x00000006, 0x000001e4, 0x000001e0, 0x000001e2, 0x00050084, 0x00000006, 0x000001e6, - 0x000001e4, 0x00000071, 0x000500c2, 0x00000006, 0x000001e8, 0x000001e6, 0x00000066, 0x000500c6, 0x00000006, - 0x000001ea, 0x000001e6, 0x000001e8, 0x000200f9, 0x0000015f, 0x000200f8, 0x0000015f, 0x000700f5, 0x00000014, - 0x0000031f, 0x000002f4, 0x000001d8, 0x00000357, 0x0000018d, 0x000700f5, 0x00000014, 0x0000030d, 0x000002f4, - 0x000001d8, 0x00000307, 0x0000018d, 0x000700f5, 0x00000014, 0x000002fe, 0x000002f4, 0x000001d8, 0x000002fb, - 0x0000018d, 0x000700f5, 0x00000006, 0x000002f7, 0x000001ea, 0x000001d8, 0x0000018f, 0x0000018d, 0x000400f6, - 0x00000190, 0x0000018d, 0x00000000, 0x000200f9, 0x00000160, 0x000200f8, 0x00000160, 0x00050082, 0x00000006, - 0x00000162, 0x0000011a, 0x000000b3, 0x000500c7, 0x00000006, 0x00000164, 0x000002f7, 0x00000162, 0x00060041, - 0x000000bc, 0x00000167, 0x00000115, 0x00000083, 0x00000164, 0x0006003d, 0x00000026, 0x00000168, 0x00000167, - 0x00000002, 0x00000010, 0x00050051, 0x00000025, 0x00000169, 0x00000168, 0x00000000, 0x00050051, 0x00000024, - 0x0000016b, 0x00000169, 0x00000000, 0x00050051, 0x00000006, 0x0000016d, 0x0000016b, 0x00000000, 0x00050051, - 0x00000006, 0x0000016f, 0x0000016b, 0x00000001, 0x00050051, 0x00000025, 0x00000171, 0x00000168, 0x00000001, - 0x00050051, 0x00000024, 0x00000173, 0x00000171, 0x00000000, 0x00050051, 0x00000006, 0x00000175, 0x00000173, - 0x00000000, 0x00050051, 0x00000006, 0x00000177, 0x00000173, 0x00000001, 0x00050050, 0x0000000d, 0x000002e2, - 0x0000016d, 0x0000016f, 0x000300f7, 0x00000217, 0x00000000, 0x000300fb, 0x00000042, 0x00000202, 0x000200f8, - 0x00000202, 0x000200f9, 0x00000203, 0x000200f8, 0x00000203, 0x000700f5, 0x00000006, 0x000002f8, 0x00000042, - 0x00000202, 0x00000213, 0x00000211, 0x000500b0, 0x00000014, 0x00000206, 0x000002f8, 0x0000000c, 0x000400f6, - 0x00000214, 0x00000211, 0x00000000, 0x000400fa, 0x00000206, 0x00000207, 0x00000214, 0x000200f8, 0x00000207, - 0x0003003e, 0x0000028b, 0x000002e2, 0x00050041, 0x00000007, 0x0000028d, 0x0000028b, 0x000002f8, 0x0004003d, - 0x00000006, 0x0000020a, 0x0000028d, 0x0003003e, 0x0000028e, 0x00000097, 0x00050041, 0x00000007, 0x00000290, - 0x0000028e, 0x000002f8, 0x0004003d, 0x00000006, 0x0000020d, 0x00000290, 0x000500ab, 0x00000014, 0x0000020e, - 0x0000020a, 0x0000020d, 0x000300f7, 0x00000210, 0x00000000, 0x000400fa, 0x0000020e, 0x0000020f, 0x00000210, - 0x000200f8, 0x0000020f, 0x000200f9, 0x00000214, 0x000200f8, 0x00000210, 0x000200f9, 0x00000211, 0x000200f8, - 0x00000211, 0x00050080, 0x00000006, 0x00000213, 0x000002f8, 0x00000060, 0x000200f9, 0x00000203, 0x000200f8, - 0x00000214, 0x000700f5, 0x00000014, 0x000002fc, 0x000002fe, 0x00000203, 0x00000090, 0x0000020f, 0x000700f5, - 0x00000014, 0x000002f9, 0x00000090, 0x00000203, 0x00000094, 0x0000020f, 0x000300f7, 0x00000216, 0x00000000, - 0x000400fa, 0x000002f9, 0x00000217, 0x00000216, 0x000200f8, 0x00000216, 0x000200f9, 0x00000217, 0x000200f8, - 0x00000217, 0x000700f5, 0x00000014, 0x000002fb, 0x000002fc, 0x00000214, 0x00000094, 0x00000216, 0x000300f7, - 0x0000018c, 0x00000000, 0x000400fa, 0x000002fb, 0x0000017c, 0x0000017d, 0x000200f8, 0x0000017c, 0x000200f9, - 0x00000190, 0x000200f8, 0x0000017d, 0x000300f7, 0x00000235, 0x00000000, 0x000300fb, 0x00000042, 0x00000220, - 0x000200f8, 0x00000220, 0x000200f9, 0x00000221, 0x000200f8, 0x00000221, 0x000700f5, 0x00000006, 0x00000304, - 0x00000042, 0x00000220, 0x00000231, 0x0000022f, 0x000500b0, 0x00000014, 0x00000224, 0x00000304, 0x0000000c, - 0x000400f6, 0x00000232, 0x0000022f, 0x00000000, 0x000400fa, 0x00000224, 0x00000225, 0x00000232, 0x000200f8, - 0x00000225, 0x0003003e, 0x00000285, 0x000002dd, 0x00050041, 0x00000007, 0x00000287, 0x00000285, 0x00000304, - 0x0004003d, 0x00000006, 0x00000228, 0x00000287, 0x0003003e, 0x00000288, 0x000002e2, 0x00050041, 0x00000007, - 0x0000028a, 0x00000288, 0x00000304, 0x0004003d, 0x00000006, 0x0000022b, 0x0000028a, 0x000500ab, 0x00000014, - 0x0000022c, 0x00000228, 0x0000022b, 0x000300f7, 0x0000022e, 0x00000000, 0x000400fa, 0x0000022c, 0x0000022d, - 0x0000022e, 0x000200f8, 0x0000022d, 0x000200f9, 0x00000232, 0x000200f8, 0x0000022e, 0x000200f9, 0x0000022f, - 0x000200f8, 0x0000022f, 0x00050080, 0x00000006, 0x00000231, 0x00000304, 0x00000060, 0x000200f9, 0x00000221, - 0x000200f8, 0x00000232, 0x000700f5, 0x00000014, 0x00000308, 0x0000030d, 0x00000221, 0x00000090, 0x0000022d, - 0x000700f5, 0x00000014, 0x00000305, 0x00000090, 0x00000221, 0x00000094, 0x0000022d, 0x000300f7, 0x00000234, - 0x00000000, 0x000400fa, 0x00000305, 0x00000235, 0x00000234, 0x000200f8, 0x00000234, 0x000200f9, 0x00000235, - 0x000200f8, 0x00000235, 0x000700f5, 0x00000014, 0x00000307, 0x00000308, 0x00000232, 0x00000094, 0x00000234, - 0x000300f7, 0x00000186, 0x00000000, 0x000400fa, 0x00000307, 0x00000181, 0x00000186, 0x000200f8, 0x00000181, - 0x00050050, 0x0000000d, 0x000002ea, 0x00000175, 0x00000177, 0x000300f7, 0x00000256, 0x00000000, 0x000300fb, - 0x00000042, 0x00000241, 0x000200f8, 0x00000241, 0x000200f9, 0x00000242, 0x000200f8, 0x00000242, 0x000700f5, - 0x00000006, 0x00000313, 0x00000042, 0x00000241, 0x00000252, 0x00000250, 0x000500b0, 0x00000014, 0x00000245, - 0x00000313, 0x0000000c, 0x000400f6, 0x00000253, 0x00000250, 0x00000000, 0x000400fa, 0x00000245, 0x00000246, - 0x00000253, 0x000200f8, 0x00000246, 0x0003003e, 0x0000027f, 0x000002ea, 0x00050041, 0x00000007, 0x00000281, - 0x0000027f, 0x00000313, 0x0004003d, 0x00000006, 0x00000249, 0x00000281, 0x0003003e, 0x00000282, 0x00000097, - 0x00050041, 0x00000007, 0x00000284, 0x00000282, 0x00000313, 0x0004003d, 0x00000006, 0x0000024c, 0x00000284, - 0x000500ab, 0x00000014, 0x0000024d, 0x00000249, 0x0000024c, 0x000300f7, 0x0000024f, 0x00000000, 0x000400fa, - 0x0000024d, 0x0000024e, 0x0000024f, 0x000200f8, 0x0000024e, 0x000200f9, 0x00000253, 0x000200f8, 0x0000024f, - 0x000200f9, 0x00000250, 0x000200f8, 0x00000250, 0x00050080, 0x00000006, 0x00000252, 0x00000313, 0x00000060, - 0x000200f9, 0x00000242, 0x000200f8, 0x00000253, 0x000700f5, 0x00000014, 0x00000317, 0x0000031f, 0x00000242, - 0x00000090, 0x0000024e, 0x000700f5, 0x00000014, 0x00000314, 0x00000090, 0x00000242, 0x00000094, 0x0000024e, - 0x000300f7, 0x00000255, 0x00000000, 0x000400fa, 0x00000314, 0x00000256, 0x00000255, 0x000200f8, 0x00000255, - 0x000200f9, 0x00000256, 0x000200f8, 0x00000256, 0x000700f5, 0x00000014, 0x00000316, 0x00000317, 0x00000253, - 0x00000094, 0x00000255, 0x000400a8, 0x00000014, 0x00000185, 0x00000316, 0x000200f9, 0x00000186, 0x000200f8, - 0x00000186, 0x000700f5, 0x00000014, 0x00000357, 0x0000031f, 0x00000235, 0x00000316, 0x00000256, 0x000700f5, - 0x00000014, 0x00000187, 0x00000307, 0x00000235, 0x00000185, 0x00000256, 0x000300f7, 0x0000018b, 0x00000000, - 0x000400fa, 0x00000187, 0x00000188, 0x0000018b, 0x000200f8, 0x00000188, 0x000200f9, 0x00000190, 0x000200f8, - 0x0000018b, 0x000200f9, 0x0000018c, 0x000200f8, 0x0000018c, 0x000200f9, 0x0000018d, 0x000200f8, 0x0000018d, - 0x00050080, 0x00000006, 0x0000018f, 0x00000164, 0x00000060, 0x000200f9, 0x0000015f, 0x000200f8, 0x00000190, - 0x000700f5, 0x00000006, 0x00000333, 0x00000042, 0x0000017c, 0x00000175, 0x00000188, 0x000700f5, 0x00000006, - 0x00000331, 0x00000042, 0x0000017c, 0x00000177, 0x00000188, 0x000300f7, 0x00000192, 0x00000000, 0x000400fa, - 0x00000094, 0x00000193, 0x00000192, 0x000200f8, 0x00000192, 0x000200f9, 0x00000193, 0x000200f8, 0x00000193, - 0x000900f5, 0x00000006, 0x00000332, 0x00000042, 0x0000015c, 0x00000333, 0x00000190, 0x00000333, 0x00000192, - 0x000900f5, 0x00000006, 0x00000330, 0x00000042, 0x0000015c, 0x00000331, 0x00000190, 0x00000331, 0x00000192, - 0x00050050, 0x0000000d, 0x000002d5, 0x00000332, 0x00000330, 0x000300f7, 0x00000277, 0x00000000, 0x000300fb, - 0x00000042, 0x00000262, 0x000200f8, 0x00000262, 0x000200f9, 0x00000263, 0x000200f8, 0x00000263, 0x000700f5, - 0x00000006, 0x00000334, 0x00000042, 0x00000262, 0x00000273, 0x00000271, 0x000500b0, 0x00000014, 0x00000266, - 0x00000334, 0x0000000c, 0x000400f6, 0x00000274, 0x00000271, 0x00000000, 0x000400fa, 0x00000266, 0x00000267, - 0x00000274, 0x000200f8, 0x00000267, 0x0003003e, 0x00000279, 0x000002d5, 0x00050041, 0x00000007, 0x0000027b, - 0x00000279, 0x00000334, 0x0004003d, 0x00000006, 0x0000026a, 0x0000027b, 0x0003003e, 0x0000027c, 0x00000097, - 0x00050041, 0x00000007, 0x0000027e, 0x0000027c, 0x00000334, 0x0004003d, 0x00000006, 0x0000026d, 0x0000027e, - 0x000500ab, 0x00000014, 0x0000026e, 0x0000026a, 0x0000026d, 0x000300f7, 0x00000270, 0x00000000, 0x000400fa, - 0x0000026e, 0x0000026f, 0x00000270, 0x000200f8, 0x0000026f, 0x000200f9, 0x00000274, 0x000200f8, 0x00000270, - 0x000200f9, 0x00000271, 0x000200f8, 0x00000271, 0x00050080, 0x00000006, 0x00000273, 0x00000334, 0x00000060, - 0x000200f9, 0x00000263, 0x000200f8, 0x00000274, 0x000700f5, 0x00000014, 0x00000338, 0x000002f4, 0x00000263, - 0x00000090, 0x0000026f, 0x000700f5, 0x00000014, 0x00000335, 0x00000090, 0x00000263, 0x00000094, 0x0000026f, - 0x000300f7, 0x00000276, 0x00000000, 0x000400fa, 0x00000335, 0x00000277, 0x00000276, 0x000200f8, 0x00000276, - 0x000200f9, 0x00000277, 0x000200f8, 0x00000277, 0x000700f5, 0x00000014, 0x00000337, 0x00000338, 0x00000274, - 0x00000094, 0x00000276, 0x000400a8, 0x00000014, 0x00000128, 0x00000337, 0x000300f7, 0x0000012a, 0x00000000, - 0x000400fa, 0x00000128, 0x00000129, 0x0000012a, 0x000200f8, 0x00000129, 0x00060041, 0x00000109, 0x0000012b, - 0x000000fc, 0x00000083, 0x000000a5, 0x0004003d, 0x000000f1, 0x0000012c, 0x0000012b, 0x00060041, 0x0000010d, - 0x0000012e, 0x0000012c, 0x00000083, 0x000000ee, 0x0006003d, 0x000000f3, 0x0000012f, 0x0000012e, 0x00000002, - 0x00000008, 0x00050041, 0x00000110, 0x00000131, 0x0000012f, 0x00000083, 0x00050041, 0x00000133, 0x00000134, - 0x00000131, 0x00000083, 0x00050041, 0x00000136, 0x00000137, 0x00000134, 0x00000083, 0x0005003e, 0x00000137, - 0x00000332, 0x00000002, 0x00000004, 0x00050041, 0x00000136, 0x00000139, 0x00000134, 0x00000060, 0x0005003e, - 0x00000139, 0x00000330, 0x00000002, 0x00000004, 0x000200f9, 0x0000012a, 0x000200f8, 0x0000012a, 0x000200f9, - 0x0000013c, 0x000200f8, 0x0000013c, 0x000100fd, 0x00010038 + 0x00000102, 0x00000103, 0x000200f8, 0x00000102, 0x000200f9, 0x0000013f, 0x000200f8, 0x00000103, 0x00060041, + 0x00000106, 0x00000107, 0x000000fc, 0x00000083, 0x00000060, 0x0004003d, 0x000000f1, 0x00000108, 0x00000107, + 0x00060041, 0x0000010a, 0x0000010b, 0x00000108, 0x00000083, 0x000000ee, 0x0006003d, 0x000000f3, 0x0000010c, + 0x0000010b, 0x00000002, 0x00000008, 0x00050041, 0x0000010d, 0x0000010e, 0x0000010c, 0x00000083, 0x0006003d, + 0x000000f7, 0x0000010f, 0x0000010e, 0x00000002, 0x00000010, 0x00050051, 0x000000f6, 0x00000110, 0x0000010f, + 0x00000000, 0x00050051, 0x00000006, 0x00000112, 0x00000110, 0x00000000, 0x00050051, 0x00000006, 0x00000114, + 0x00000110, 0x00000001, 0x00060041, 0x00000117, 0x00000118, 0x000000fc, 0x00000083, 0x00000083, 0x0004003d, + 0x000000f0, 0x00000119, 0x00000118, 0x00050050, 0x0000000d, 0x000002dd, 0x00000112, 0x00000114, 0x00050051, + 0x00000022, 0x0000011d, 0x00000119, 0x00000000, 0x00050051, 0x00000006, 0x00000122, 0x00000119, 0x00000002, + 0x000300f7, 0x00000196, 0x00000000, 0x000300fb, 0x00000042, 0x00000157, 0x000200f8, 0x00000157, 0x000300f7, + 0x000001b7, 0x00000000, 0x000300fb, 0x00000042, 0x000001a2, 0x000200f8, 0x000001a2, 0x000200f9, 0x000001a3, + 0x000200f8, 0x000001a3, 0x000700f5, 0x00000006, 0x00000304, 0x00000042, 0x000001a2, 0x000001b3, 0x000001b1, + 0x000500b0, 0x00000014, 0x000001a6, 0x00000304, 0x0000000c, 0x000400f6, 0x000001b4, 0x000001b1, 0x00000000, + 0x000400fa, 0x000001a6, 0x000001a7, 0x000001b4, 0x000200f8, 0x000001a7, 0x0003003e, 0x00000294, 0x000002dd, + 0x00050041, 0x00000007, 0x00000296, 0x00000294, 0x00000304, 0x0004003d, 0x00000006, 0x000001aa, 0x00000296, + 0x0003003e, 0x00000297, 0x00000097, 0x00050041, 0x00000007, 0x00000299, 0x00000297, 0x00000304, 0x0004003d, + 0x00000006, 0x000001ad, 0x00000299, 0x000500ab, 0x00000014, 0x000001ae, 0x000001aa, 0x000001ad, 0x000300f7, + 0x000001b0, 0x00000000, 0x000400fa, 0x000001ae, 0x000001af, 0x000001b0, 0x000200f8, 0x000001af, 0x000200f9, + 0x000001b4, 0x000200f8, 0x000001b0, 0x000200f9, 0x000001b1, 0x000200f8, 0x000001b1, 0x00050080, 0x00000006, + 0x000001b3, 0x00000304, 0x00000060, 0x000200f9, 0x000001a3, 0x000200f8, 0x000001b4, 0x000700f5, 0x00000014, + 0x00000308, 0x0000030a, 0x000001a3, 0x00000090, 0x000001af, 0x000700f5, 0x00000014, 0x00000305, 0x00000090, + 0x000001a3, 0x00000094, 0x000001af, 0x000300f7, 0x000001b6, 0x00000000, 0x000400fa, 0x00000305, 0x000001b7, + 0x000001b6, 0x000200f8, 0x000001b6, 0x000200f9, 0x000001b7, 0x000200f8, 0x000001b7, 0x000700f5, 0x00000014, + 0x00000307, 0x00000308, 0x000001b4, 0x00000094, 0x000001b6, 0x000400a8, 0x00000014, 0x00000159, 0x00000307, + 0x000300f7, 0x0000015d, 0x00000000, 0x000400fa, 0x00000159, 0x0000015a, 0x0000015d, 0x000200f8, 0x0000015a, + 0x000500aa, 0x00000014, 0x0000015c, 0x00000122, 0x00000042, 0x000200f9, 0x0000015d, 0x000200f8, 0x0000015d, + 0x000700f5, 0x00000014, 0x0000015e, 0x00000307, 0x000001b7, 0x0000015c, 0x0000015a, 0x000300f7, 0x00000160, + 0x00000000, 0x000400fa, 0x0000015e, 0x0000015f, 0x00000160, 0x000200f8, 0x0000015f, 0x000200f9, 0x00000196, + 0x000200f8, 0x00000160, 0x000200f9, 0x000001c5, 0x000200f8, 0x000001c5, 0x000700f5, 0x00000006, 0x0000030c, + 0x00000042, 0x00000160, 0x000001d7, 0x000001c9, 0x000700f5, 0x00000006, 0x0000030b, 0x00000042, 0x00000160, + 0x000001da, 0x000001c9, 0x000500b0, 0x00000014, 0x000001c8, 0x0000030b, 0x0000000c, 0x000400f6, 0x000001db, + 0x000001c9, 0x00000000, 0x000400fa, 0x000001c8, 0x000001c9, 0x000001db, 0x000200f8, 0x000001c9, 0x0003003e, + 0x000001c1, 0x000002dd, 0x00050041, 0x00000007, 0x000001cb, 0x000001c1, 0x0000030b, 0x0004003d, 0x00000006, + 0x000001cc, 0x000001cb, 0x00050084, 0x00000006, 0x000001f2, 0x000001cc, 0x0000002e, 0x000500c4, 0x00000006, + 0x000001f4, 0x000001f2, 0x00000033, 0x000500c2, 0x00000006, 0x000001f6, 0x000001f2, 0x00000036, 0x000500c5, + 0x00000006, 0x000001f7, 0x000001f4, 0x000001f6, 0x00050084, 0x00000006, 0x000001f9, 0x000001f7, 0x00000039, + 0x000500c6, 0x00000006, 0x000001cf, 0x0000030c, 0x000001f9, 0x000500c4, 0x00000006, 0x000001d1, 0x000001cf, + 0x00000054, 0x000500c2, 0x00000006, 0x000001d3, 0x000001cf, 0x00000057, 0x000500c5, 0x00000006, 0x000001d4, + 0x000001d1, 0x000001d3, 0x00050084, 0x00000006, 0x000001d6, 0x000001d4, 0x0000005b, 0x00050080, 0x00000006, + 0x000001d7, 0x000001d6, 0x0000005d, 0x00050080, 0x00000006, 0x000001da, 0x0000030b, 0x00000060, 0x000200f9, + 0x000001c5, 0x000200f8, 0x000001db, 0x000500c6, 0x00000006, 0x000001dd, 0x0000030c, 0x00000062, 0x000500c2, + 0x00000006, 0x000001df, 0x000001dd, 0x00000066, 0x000500c6, 0x00000006, 0x000001e1, 0x000001dd, 0x000001df, + 0x00050084, 0x00000006, 0x000001e3, 0x000001e1, 0x0000006a, 0x000500c2, 0x00000006, 0x000001e5, 0x000001e3, + 0x00000054, 0x000500c6, 0x00000006, 0x000001e7, 0x000001e3, 0x000001e5, 0x00050084, 0x00000006, 0x000001e9, + 0x000001e7, 0x00000071, 0x000500c2, 0x00000006, 0x000001eb, 0x000001e9, 0x00000066, 0x000500c6, 0x00000006, + 0x000001ed, 0x000001e9, 0x000001eb, 0x000200f9, 0x00000162, 0x000200f8, 0x00000162, 0x000700f5, 0x00000014, + 0x00000335, 0x0000030a, 0x000001db, 0x0000036f, 0x00000190, 0x000700f5, 0x00000014, 0x00000323, 0x0000030a, + 0x000001db, 0x0000031d, 0x00000190, 0x000700f5, 0x00000014, 0x00000314, 0x0000030a, 0x000001db, 0x00000311, + 0x00000190, 0x000700f5, 0x00000006, 0x0000030d, 0x000001ed, 0x000001db, 0x00000192, 0x00000190, 0x000400f6, + 0x00000193, 0x00000190, 0x00000000, 0x000200f9, 0x00000163, 0x000200f8, 0x00000163, 0x00050082, 0x00000006, + 0x00000165, 0x00000122, 0x000000b3, 0x000500c7, 0x00000006, 0x00000167, 0x0000030d, 0x00000165, 0x00060041, + 0x000000bc, 0x0000016a, 0x0000011d, 0x00000083, 0x00000167, 0x0006003d, 0x00000026, 0x0000016b, 0x0000016a, + 0x00000002, 0x00000010, 0x00050051, 0x00000025, 0x0000016c, 0x0000016b, 0x00000000, 0x00050051, 0x00000024, + 0x0000016e, 0x0000016c, 0x00000000, 0x00050051, 0x00000006, 0x00000170, 0x0000016e, 0x00000000, 0x00050051, + 0x00000006, 0x00000172, 0x0000016e, 0x00000001, 0x00050051, 0x00000025, 0x00000174, 0x0000016b, 0x00000001, + 0x00050051, 0x00000024, 0x00000176, 0x00000174, 0x00000000, 0x00050051, 0x00000006, 0x00000178, 0x00000176, + 0x00000000, 0x00050051, 0x00000006, 0x0000017a, 0x00000176, 0x00000001, 0x00050050, 0x0000000d, 0x000002f8, + 0x00000170, 0x00000172, 0x000300f7, 0x0000021a, 0x00000000, 0x000300fb, 0x00000042, 0x00000205, 0x000200f8, + 0x00000205, 0x000200f9, 0x00000206, 0x000200f8, 0x00000206, 0x000700f5, 0x00000006, 0x0000030e, 0x00000042, + 0x00000205, 0x00000216, 0x00000214, 0x000500b0, 0x00000014, 0x00000209, 0x0000030e, 0x0000000c, 0x000400f6, + 0x00000217, 0x00000214, 0x00000000, 0x000400fa, 0x00000209, 0x0000020a, 0x00000217, 0x000200f8, 0x0000020a, + 0x0003003e, 0x0000028e, 0x000002f8, 0x00050041, 0x00000007, 0x00000290, 0x0000028e, 0x0000030e, 0x0004003d, + 0x00000006, 0x0000020d, 0x00000290, 0x0003003e, 0x00000291, 0x00000097, 0x00050041, 0x00000007, 0x00000293, + 0x00000291, 0x0000030e, 0x0004003d, 0x00000006, 0x00000210, 0x00000293, 0x000500ab, 0x00000014, 0x00000211, + 0x0000020d, 0x00000210, 0x000300f7, 0x00000213, 0x00000000, 0x000400fa, 0x00000211, 0x00000212, 0x00000213, + 0x000200f8, 0x00000212, 0x000200f9, 0x00000217, 0x000200f8, 0x00000213, 0x000200f9, 0x00000214, 0x000200f8, + 0x00000214, 0x00050080, 0x00000006, 0x00000216, 0x0000030e, 0x00000060, 0x000200f9, 0x00000206, 0x000200f8, + 0x00000217, 0x000700f5, 0x00000014, 0x00000312, 0x00000314, 0x00000206, 0x00000090, 0x00000212, 0x000700f5, + 0x00000014, 0x0000030f, 0x00000090, 0x00000206, 0x00000094, 0x00000212, 0x000300f7, 0x00000219, 0x00000000, + 0x000400fa, 0x0000030f, 0x0000021a, 0x00000219, 0x000200f8, 0x00000219, 0x000200f9, 0x0000021a, 0x000200f8, + 0x0000021a, 0x000700f5, 0x00000014, 0x00000311, 0x00000312, 0x00000217, 0x00000094, 0x00000219, 0x000300f7, + 0x0000018f, 0x00000000, 0x000400fa, 0x00000311, 0x0000017f, 0x00000180, 0x000200f8, 0x0000017f, 0x000200f9, + 0x00000193, 0x000200f8, 0x00000180, 0x000300f7, 0x00000238, 0x00000000, 0x000300fb, 0x00000042, 0x00000223, + 0x000200f8, 0x00000223, 0x000200f9, 0x00000224, 0x000200f8, 0x00000224, 0x000700f5, 0x00000006, 0x0000031a, + 0x00000042, 0x00000223, 0x00000234, 0x00000232, 0x000500b0, 0x00000014, 0x00000227, 0x0000031a, 0x0000000c, + 0x000400f6, 0x00000235, 0x00000232, 0x00000000, 0x000400fa, 0x00000227, 0x00000228, 0x00000235, 0x000200f8, + 0x00000228, 0x0003003e, 0x00000288, 0x000002dd, 0x00050041, 0x00000007, 0x0000028a, 0x00000288, 0x0000031a, + 0x0004003d, 0x00000006, 0x0000022b, 0x0000028a, 0x0003003e, 0x0000028b, 0x000002f8, 0x00050041, 0x00000007, + 0x0000028d, 0x0000028b, 0x0000031a, 0x0004003d, 0x00000006, 0x0000022e, 0x0000028d, 0x000500ab, 0x00000014, + 0x0000022f, 0x0000022b, 0x0000022e, 0x000300f7, 0x00000231, 0x00000000, 0x000400fa, 0x0000022f, 0x00000230, + 0x00000231, 0x000200f8, 0x00000230, 0x000200f9, 0x00000235, 0x000200f8, 0x00000231, 0x000200f9, 0x00000232, + 0x000200f8, 0x00000232, 0x00050080, 0x00000006, 0x00000234, 0x0000031a, 0x00000060, 0x000200f9, 0x00000224, + 0x000200f8, 0x00000235, 0x000700f5, 0x00000014, 0x0000031e, 0x00000323, 0x00000224, 0x00000090, 0x00000230, + 0x000700f5, 0x00000014, 0x0000031b, 0x00000090, 0x00000224, 0x00000094, 0x00000230, 0x000300f7, 0x00000237, + 0x00000000, 0x000400fa, 0x0000031b, 0x00000238, 0x00000237, 0x000200f8, 0x00000237, 0x000200f9, 0x00000238, + 0x000200f8, 0x00000238, 0x000700f5, 0x00000014, 0x0000031d, 0x0000031e, 0x00000235, 0x00000094, 0x00000237, + 0x000300f7, 0x00000189, 0x00000000, 0x000400fa, 0x0000031d, 0x00000184, 0x00000189, 0x000200f8, 0x00000184, + 0x00050050, 0x0000000d, 0x00000300, 0x00000178, 0x0000017a, 0x000300f7, 0x00000259, 0x00000000, 0x000300fb, + 0x00000042, 0x00000244, 0x000200f8, 0x00000244, 0x000200f9, 0x00000245, 0x000200f8, 0x00000245, 0x000700f5, + 0x00000006, 0x00000329, 0x00000042, 0x00000244, 0x00000255, 0x00000253, 0x000500b0, 0x00000014, 0x00000248, + 0x00000329, 0x0000000c, 0x000400f6, 0x00000256, 0x00000253, 0x00000000, 0x000400fa, 0x00000248, 0x00000249, + 0x00000256, 0x000200f8, 0x00000249, 0x0003003e, 0x00000282, 0x00000300, 0x00050041, 0x00000007, 0x00000284, + 0x00000282, 0x00000329, 0x0004003d, 0x00000006, 0x0000024c, 0x00000284, 0x0003003e, 0x00000285, 0x00000097, + 0x00050041, 0x00000007, 0x00000287, 0x00000285, 0x00000329, 0x0004003d, 0x00000006, 0x0000024f, 0x00000287, + 0x000500ab, 0x00000014, 0x00000250, 0x0000024c, 0x0000024f, 0x000300f7, 0x00000252, 0x00000000, 0x000400fa, + 0x00000250, 0x00000251, 0x00000252, 0x000200f8, 0x00000251, 0x000200f9, 0x00000256, 0x000200f8, 0x00000252, + 0x000200f9, 0x00000253, 0x000200f8, 0x00000253, 0x00050080, 0x00000006, 0x00000255, 0x00000329, 0x00000060, + 0x000200f9, 0x00000245, 0x000200f8, 0x00000256, 0x000700f5, 0x00000014, 0x0000032d, 0x00000335, 0x00000245, + 0x00000090, 0x00000251, 0x000700f5, 0x00000014, 0x0000032a, 0x00000090, 0x00000245, 0x00000094, 0x00000251, + 0x000300f7, 0x00000258, 0x00000000, 0x000400fa, 0x0000032a, 0x00000259, 0x00000258, 0x000200f8, 0x00000258, + 0x000200f9, 0x00000259, 0x000200f8, 0x00000259, 0x000700f5, 0x00000014, 0x0000032c, 0x0000032d, 0x00000256, + 0x00000094, 0x00000258, 0x000400a8, 0x00000014, 0x00000188, 0x0000032c, 0x000200f9, 0x00000189, 0x000200f8, + 0x00000189, 0x000700f5, 0x00000014, 0x0000036f, 0x00000335, 0x00000238, 0x0000032c, 0x00000259, 0x000700f5, + 0x00000014, 0x0000018a, 0x0000031d, 0x00000238, 0x00000188, 0x00000259, 0x000300f7, 0x0000018e, 0x00000000, + 0x000400fa, 0x0000018a, 0x0000018b, 0x0000018e, 0x000200f8, 0x0000018b, 0x000200f9, 0x00000193, 0x000200f8, + 0x0000018e, 0x000200f9, 0x0000018f, 0x000200f8, 0x0000018f, 0x000200f9, 0x00000190, 0x000200f8, 0x00000190, + 0x00050080, 0x00000006, 0x00000192, 0x00000167, 0x00000060, 0x000200f9, 0x00000162, 0x000200f8, 0x00000193, + 0x000700f5, 0x00000006, 0x00000349, 0x00000042, 0x0000017f, 0x00000178, 0x0000018b, 0x000700f5, 0x00000006, + 0x00000347, 0x00000042, 0x0000017f, 0x0000017a, 0x0000018b, 0x000300f7, 0x00000195, 0x00000000, 0x000400fa, + 0x00000094, 0x00000196, 0x00000195, 0x000200f8, 0x00000195, 0x000200f9, 0x00000196, 0x000200f8, 0x00000196, + 0x000900f5, 0x00000006, 0x00000348, 0x00000042, 0x0000015f, 0x00000349, 0x00000193, 0x00000349, 0x00000195, + 0x000900f5, 0x00000006, 0x00000346, 0x00000042, 0x0000015f, 0x00000347, 0x00000193, 0x00000347, 0x00000195, + 0x00060041, 0x00000106, 0x00000126, 0x000000fc, 0x00000083, 0x000000a5, 0x0004003d, 0x000000f1, 0x00000127, + 0x00000126, 0x00060041, 0x0000010a, 0x00000129, 0x00000127, 0x00000083, 0x000000ee, 0x0006003d, 0x000000f3, + 0x0000012a, 0x00000129, 0x00000002, 0x00000008, 0x00050050, 0x0000000d, 0x000002e7, 0x00000348, 0x00000346, + 0x000300f7, 0x0000027a, 0x00000000, 0x000300fb, 0x00000042, 0x00000265, 0x000200f8, 0x00000265, 0x000200f9, + 0x00000266, 0x000200f8, 0x00000266, 0x000700f5, 0x00000006, 0x0000034a, 0x00000042, 0x00000265, 0x00000276, + 0x00000274, 0x000500b0, 0x00000014, 0x00000269, 0x0000034a, 0x0000000c, 0x000400f6, 0x00000277, 0x00000274, + 0x00000000, 0x000400fa, 0x00000269, 0x0000026a, 0x00000277, 0x000200f8, 0x0000026a, 0x0003003e, 0x0000027c, + 0x000002e7, 0x00050041, 0x00000007, 0x0000027e, 0x0000027c, 0x0000034a, 0x0004003d, 0x00000006, 0x0000026d, + 0x0000027e, 0x0003003e, 0x0000027f, 0x00000097, 0x00050041, 0x00000007, 0x00000281, 0x0000027f, 0x0000034a, + 0x0004003d, 0x00000006, 0x00000270, 0x00000281, 0x000500ab, 0x00000014, 0x00000271, 0x0000026d, 0x00000270, + 0x000300f7, 0x00000273, 0x00000000, 0x000400fa, 0x00000271, 0x00000272, 0x00000273, 0x000200f8, 0x00000272, + 0x000200f9, 0x00000277, 0x000200f8, 0x00000273, 0x000200f9, 0x00000274, 0x000200f8, 0x00000274, 0x00050080, + 0x00000006, 0x00000276, 0x0000034a, 0x00000060, 0x000200f9, 0x00000266, 0x000200f8, 0x00000277, 0x000700f5, + 0x00000014, 0x0000034e, 0x0000030a, 0x00000266, 0x00000090, 0x00000272, 0x000700f5, 0x00000014, 0x0000034b, + 0x00000090, 0x00000266, 0x00000094, 0x00000272, 0x000300f7, 0x00000279, 0x00000000, 0x000400fa, 0x0000034b, + 0x0000027a, 0x00000279, 0x000200f8, 0x00000279, 0x000200f9, 0x0000027a, 0x000200f8, 0x0000027a, 0x000700f5, + 0x00000014, 0x0000034d, 0x0000034e, 0x00000277, 0x00000094, 0x00000279, 0x000200f9, 0x0000012f, 0x000200f8, + 0x0000012f, 0x000600a9, 0x00000006, 0x00000370, 0x0000034d, 0x00000112, 0x00000348, 0x000600a9, 0x00000006, + 0x00000371, 0x0000034d, 0x00000114, 0x00000346, 0x00050041, 0x0000010d, 0x00000134, 0x0000012a, 0x00000083, + 0x00050041, 0x00000136, 0x00000137, 0x00000134, 0x00000083, 0x00050041, 0x00000139, 0x0000013a, 0x00000137, + 0x00000083, 0x0005003e, 0x0000013a, 0x00000370, 0x00000002, 0x00000004, 0x00050041, 0x00000139, 0x0000013c, + 0x00000137, 0x00000060, 0x0005003e, 0x0000013c, 0x00000371, 0x00000002, 0x00000004, 0x000200f9, 0x0000013f, + 0x000200f8, 0x0000013f, 0x000100fd, 0x00010038 }; GFXRECON_END_NAMESPACE(decode) From db9cc6ac2b91fdc07dfa3ccf33e58b41f0a4a9c9 Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Mon, 27 Jan 2025 10:24:52 +0100 Subject: [PATCH 3/9] Keep track of opaque/assigned acceleration-structure addresses --- framework/decode/vulkan_replay_consumer_base.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/decode/vulkan_replay_consumer_base.cpp b/framework/decode/vulkan_replay_consumer_base.cpp index 3c271dd006..a3fff4e7d5 100644 --- a/framework/decode/vulkan_replay_consumer_base.cpp +++ b/framework/decode/vulkan_replay_consumer_base.cpp @@ -7829,7 +7829,11 @@ VkResult VulkanReplayConsumerBase::OverrideCreateAccelerationStructureKHR( auto entry = device_info->opaque_addresses.find(capture_id); if (entry != device_info->opaque_addresses.end()) { - modified_create_info.deviceAddress = entry->second; + modified_create_info.deviceAddress = entry->second; + + // assign opaque address, same for capture and replay + acceleration_structure_info->capture_address = acceleration_structure_info->replay_address = + modified_create_info.deviceAddress; } else { From 277d50b2b6ae0d63d14e253c14bc0bccfe89e94d Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Mon, 27 Jan 2025 10:39:07 +0100 Subject: [PATCH 4/9] Rebind previously bound compute-pipelines, if any --- framework/decode/vulkan_address_replacer.cpp | 32 ++++++++++++++++++-- framework/decode/vulkan_address_replacer.h | 1 + 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/framework/decode/vulkan_address_replacer.cpp b/framework/decode/vulkan_address_replacer.cpp index 518f397b70..8550c76cf3 100644 --- a/framework/decode/vulkan_address_replacer.cpp +++ b/framework/decode/vulkan_address_replacer.cpp @@ -147,7 +147,7 @@ VulkanAddressReplacer::VulkanAddressReplacer(const VulkanDeviceInfo* const encode::VulkanDeviceTable* device_table, const encode::VulkanInstanceTable* instance_table, const decode::CommonObjectInfoTable& object_table) : - device_table_(device_table) + device_table_(device_table), object_table_(&object_table) { GFXRECON_ASSERT(device_info != nullptr && device_table != nullptr && instance_table != nullptr); physical_device_info_ = object_table.GetVkPhysicalDeviceInfo(device_info->parent_id); @@ -497,7 +497,20 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( VK_ACCESS_SHADER_READ_BIT); } - // set previous push-constant data + // set previous compute-pipeline, if any + if (command_buffer_info->bound_pipelines.count(VK_PIPELINE_BIND_POINT_COMPUTE)) + { + auto* previous_pipeline = object_table_->GetVkPipelineInfo( + command_buffer_info->bound_pipelines.at(VK_PIPELINE_BIND_POINT_COMPUTE)); + GFXRECON_ASSERT(previous_pipeline); + if (previous_pipeline != nullptr) + { + device_table_->CmdBindPipeline( + command_buffer_info->handle, VK_PIPELINE_BIND_POINT_COMPUTE, previous_pipeline->handle); + } + } + + // set previous push-constant data, if any if (!command_buffer_info->push_constant_data.empty()) { device_table_->CmdPushConstants(command_buffer_info->handle, @@ -815,7 +828,20 @@ void VulkanAddressReplacer::ProcessCmdBuildAccelerationStructuresKHR( VK_ACCESS_SHADER_READ_BIT); } - // set previous push-constant data + // set previous compute-pipeline, if any + if (command_buffer_info->bound_pipelines.count(VK_PIPELINE_BIND_POINT_COMPUTE)) + { + auto* previous_pipeline = object_table_->GetVkPipelineInfo( + command_buffer_info->bound_pipelines.at(VK_PIPELINE_BIND_POINT_COMPUTE)); + GFXRECON_ASSERT(previous_pipeline); + if (previous_pipeline != nullptr) + { + device_table_->CmdBindPipeline( + command_buffer_info->handle, VK_PIPELINE_BIND_POINT_COMPUTE, previous_pipeline->handle); + } + } + + // set previous push-constant data, if any if (!command_buffer_info->push_constant_data.empty()) { device_table_->CmdPushConstants(command_buffer_info->handle, diff --git a/framework/decode/vulkan_address_replacer.h b/framework/decode/vulkan_address_replacer.h index 60b584a858..95c14060b1 100644 --- a/framework/decode/vulkan_address_replacer.h +++ b/framework/decode/vulkan_address_replacer.h @@ -298,6 +298,7 @@ class VulkanAddressReplacer bool swap_acceleration_structure_handle(VkAccelerationStructureKHR& handle); const encode::VulkanDeviceTable* device_table_ = nullptr; + const decode::CommonObjectInfoTable* object_table_ = nullptr; VkPhysicalDeviceMemoryProperties memory_properties_ = {}; std::optional capture_ray_properties_{}, replay_ray_properties_{}; std::optional replay_acceleration_structure_properties_{}; From aae9d06a2a307a7facda24ea62863da923cd659c Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Mon, 27 Jan 2025 11:46:01 +0100 Subject: [PATCH 5/9] Adjust internal compute-shader: pass-through data that could not be mapped (SBT) --- .../decode/vulkan_address_replacer_shaders.h | 410 +++++++++--------- 1 file changed, 205 insertions(+), 205 deletions(-) diff --git a/framework/decode/vulkan_address_replacer_shaders.h b/framework/decode/vulkan_address_replacer_shaders.h index 37bbde2785..5612c76245 100644 --- a/framework/decode/vulkan_address_replacer_shaders.h +++ b/framework/decode/vulkan_address_replacer_shaders.h @@ -30,8 +30,6 @@ GFXRECON_BEGIN_NAMESPACE(decode) // g_replacer_sbt_comp: original GLSL source #if 0 -// replacer_sbt.comp - #version 460 #extension GL_EXT_buffer_reference2 : require #extension GL_GOOGLE_include_directive : require @@ -148,20 +146,18 @@ void main() if(gid >= params.num_handles){ return; } // hashmap lookup - shader_group_handle_t result = get(params.shader_group_handle_map, params.input_handles.v[gid].group_handle); + shader_group_handle_t input_handle = params.input_handles.v[gid].group_handle; + shader_group_handle_t result = get(params.shader_group_handle_map, input_handle); - if(!is_null(result)) - { - // write remapped value to output-array - params.output_handles.v[gid].group_handle = result; - } + // write remapped or original value to output-array + params.output_handles.v[gid].group_handle = is_null(result) ? input_handle : result; } #endif // g_replacer_sbt_comp: original GLSL source // g_replacer_bda_comp: original GLSL source #if 0 #version 460 -#extension GL_EXT_buffer_reference2: require +#extension GL_EXT_buffer_reference2 : require #extension GL_GOOGLE_include_directive : require /// -> hash.glsl @@ -174,24 +170,24 @@ uint murmur_32_scramble(uint k) } //! condensed version of murmur3_32 for arrays of uint32_t -#define DEFINE_MURMUR3_32(LEN) \ -uint murmur3_32(const uint key[LEN], uint seed)\ -{\ - uint h = seed;\ - for(uint i = 0; i < LEN; ++i)\ - {\ - h ^= murmur_32_scramble(key[i]);\ - h = (h << 13) | (h >> 19);\ - h = h * 5 + 0xe6546b64;\ - }\ - h ^= LEN << 2;\ - h ^= h >> 16;\ - h *= 0x85ebca6b;\ - h ^= h >> 13;\ - h *= 0xc2b2ae35;\ - h ^= h >> 16;\ - return h;\ -}\ +#define DEFINE_MURMUR3_32(LEN) \ + uint murmur3_32(const uint key[LEN], uint seed) \ + { \ + uint h = seed; \ + for (uint i = 0; i < LEN; ++i) \ + { \ + h ^= murmur_32_scramble(key[i]); \ + h = (h << 13) | (h >> 19); \ + h = h * 5 + 0xe6546b64; \ + } \ + h ^= LEN << 2; \ + h ^= h >> 16; \ + h *= 0x85ebca6b; \ + h ^= h >> 13; \ + h *= 0xc2b2ae35; \ + h ^= h >> 16; \ + return h; \ + } \ /// hash.glsl DEFINE_MURMUR3_32(2); @@ -284,8 +280,8 @@ void main() } #endif // g_replacer_bda_comp -static const std::array g_replacer_sbt_comp = { - 0x07230203, 0x00010300, 0x0008000b, 0x00000427, 0x00000000, 0x00020011, 0x00000001, 0x00020011, 0x000014b6, +static const std::array g_replacer_sbt_comp = { + 0x07230203, 0x00010300, 0x0008000b, 0x0000046b, 0x00000000, 0x00020011, 0x00000001, 0x00020011, 0x000014b6, 0x00020011, 0x000014e3, 0x0008000a, 0x5f565053, 0x5f545845, 0x63736564, 0x74706972, 0x695f726f, 0x7865646e, 0x00676e69, 0x0009000a, 0x5f565053, 0x5f52484b, 0x73796870, 0x6c616369, 0x6f74735f, 0x65676172, 0x6675625f, 0x00726566, 0x0006000b, 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e, 0x000014e4, @@ -324,7 +320,7 @@ static const std::array g_replacer_sbt_comp = { 0x00050048, 0x00000112, 0x00000000, 0x00000023, 0x00000000, 0x00040047, 0x00000113, 0x00000006, 0x00000004, 0x00050048, 0x00000114, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000115, 0x00000002, 0x00050048, 0x00000115, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000117, 0x00000002, 0x00050048, 0x00000117, - 0x00000000, 0x00000023, 0x00000000, 0x00040047, 0x0000016e, 0x0000000b, 0x00000019, 0x00020013, 0x00000002, + 0x00000000, 0x00000023, 0x00000000, 0x00040047, 0x00000171, 0x0000000b, 0x00000019, 0x00020013, 0x00000002, 0x00030021, 0x00000003, 0x00000002, 0x00040015, 0x00000006, 0x00000020, 0x00000000, 0x00040020, 0x00000007, 0x00000007, 0x00000006, 0x0004002b, 0x00000006, 0x0000000c, 0x00000008, 0x0004001c, 0x0000000d, 0x00000006, 0x0000000c, 0x00020014, 0x00000014, 0x00030027, 0x00000022, 0x000014e5, 0x0004001c, 0x00000024, 0x00000006, @@ -351,184 +347,188 @@ static const std::array g_replacer_sbt_comp = { 0x00000113, 0x0003001e, 0x00000115, 0x00000114, 0x00040020, 0x00000110, 0x000014e5, 0x00000115, 0x00040020, 0x0000010e, 0x000014e5, 0x00000112, 0x0003001e, 0x00000117, 0x0000010f, 0x00040020, 0x00000118, 0x00000009, 0x00000117, 0x0004003b, 0x00000118, 0x00000119, 0x00000009, 0x00040020, 0x0000011a, 0x00000009, 0x00000006, - 0x00040020, 0x00000122, 0x00000009, 0x0000010d, 0x00040020, 0x00000125, 0x00000009, 0x0000010e, 0x00040020, - 0x00000129, 0x000014e5, 0x00000110, 0x00040020, 0x0000012c, 0x000014e5, 0x00000114, 0x00040020, 0x0000015b, - 0x000014e5, 0x00000113, 0x00040020, 0x0000015e, 0x000014e5, 0x00000006, 0x0006002c, 0x00000106, 0x0000016e, - 0x00000062, 0x000000b3, 0x000000b3, 0x00030001, 0x00000014, 0x000003b7, 0x00050036, 0x00000002, 0x00000004, - 0x00000000, 0x00000003, 0x000200f8, 0x00000005, 0x0004003b, 0x0000004c, 0x000002df, 0x00000007, 0x0004003b, - 0x0000004c, 0x000002dc, 0x00000007, 0x0004003b, 0x0000004c, 0x000002d9, 0x00000007, 0x0004003b, 0x0000004c, - 0x000002d6, 0x00000007, 0x0004003b, 0x0000004c, 0x000002d3, 0x00000007, 0x0004003b, 0x0000004c, 0x000002d0, - 0x00000007, 0x0004003b, 0x0000004c, 0x000002cd, 0x00000007, 0x0004003b, 0x0000004c, 0x000002ca, 0x00000007, - 0x0004003b, 0x0000004c, 0x000002c7, 0x00000007, 0x0004003b, 0x0000004c, 0x000002c4, 0x00000007, 0x0004003b, - 0x0000004c, 0x00000209, 0x00000007, 0x000300f7, 0x0000016f, 0x00000000, 0x000300fb, 0x00000042, 0x00000170, - 0x000200f8, 0x00000170, 0x00050041, 0x00000109, 0x0000010a, 0x00000108, 0x00000042, 0x0004003d, 0x00000006, + 0x00040020, 0x00000122, 0x00000009, 0x0000010e, 0x00040020, 0x00000126, 0x000014e5, 0x00000110, 0x00040020, + 0x00000129, 0x000014e5, 0x00000114, 0x00040020, 0x0000013f, 0x00000009, 0x0000010d, 0x00040020, 0x0000015e, + 0x000014e5, 0x00000113, 0x00040020, 0x00000161, 0x000014e5, 0x00000006, 0x0006002c, 0x00000106, 0x00000171, + 0x00000062, 0x000000b3, 0x000000b3, 0x00030001, 0x00000014, 0x000003eb, 0x00050036, 0x00000002, 0x00000004, + 0x00000000, 0x00000003, 0x000200f8, 0x00000005, 0x0004003b, 0x0000004c, 0x000002e2, 0x00000007, 0x0004003b, + 0x0000004c, 0x000002df, 0x00000007, 0x0004003b, 0x0000004c, 0x000002dc, 0x00000007, 0x0004003b, 0x0000004c, + 0x000002d9, 0x00000007, 0x0004003b, 0x0000004c, 0x000002d6, 0x00000007, 0x0004003b, 0x0000004c, 0x000002d3, + 0x00000007, 0x0004003b, 0x0000004c, 0x000002d0, 0x00000007, 0x0004003b, 0x0000004c, 0x000002cd, 0x00000007, + 0x0004003b, 0x0000004c, 0x000002ca, 0x00000007, 0x0004003b, 0x0000004c, 0x000002c7, 0x00000007, 0x0004003b, + 0x0000004c, 0x0000020c, 0x00000007, 0x000300f7, 0x00000172, 0x00000000, 0x000300fb, 0x00000042, 0x00000173, + 0x000200f8, 0x00000173, 0x00050041, 0x00000109, 0x0000010a, 0x00000108, 0x00000042, 0x0004003d, 0x00000006, 0x0000010b, 0x0000010a, 0x00060041, 0x0000011a, 0x0000011b, 0x00000119, 0x00000083, 0x000000ca, 0x0004003d, 0x00000006, 0x0000011c, 0x0000011b, 0x000500ae, 0x00000014, 0x0000011d, 0x0000010b, 0x0000011c, 0x000300f7, 0x0000011f, 0x00000000, 0x000400fa, 0x0000011d, 0x0000011e, 0x0000011f, 0x000200f8, 0x0000011e, 0x000200f9, - 0x0000016f, 0x000200f8, 0x0000011f, 0x00060041, 0x00000122, 0x00000123, 0x00000119, 0x00000083, 0x00000083, - 0x0004003d, 0x0000010d, 0x00000124, 0x00000123, 0x00060041, 0x00000125, 0x00000126, 0x00000119, 0x00000083, - 0x00000060, 0x0004003d, 0x0000010e, 0x00000127, 0x00000126, 0x00060041, 0x00000129, 0x0000012a, 0x00000127, - 0x00000083, 0x0000010b, 0x0006003d, 0x00000110, 0x0000012b, 0x0000012a, 0x00000002, 0x00000008, 0x00050041, - 0x0000012c, 0x0000012d, 0x0000012b, 0x00000083, 0x0006003d, 0x00000114, 0x0000012e, 0x0000012d, 0x00000002, - 0x00000010, 0x00050051, 0x00000022, 0x00000131, 0x00000124, 0x00000000, 0x00050051, 0x00000006, 0x00000136, - 0x00000124, 0x00000002, 0x00050051, 0x00000113, 0x0000013a, 0x0000012e, 0x00000000, 0x00050051, 0x00000006, - 0x0000013c, 0x0000013a, 0x00000000, 0x00050051, 0x00000006, 0x0000013e, 0x0000013a, 0x00000001, 0x00050051, - 0x00000006, 0x00000140, 0x0000013a, 0x00000002, 0x00050051, 0x00000006, 0x00000142, 0x0000013a, 0x00000003, - 0x00050051, 0x00000006, 0x00000144, 0x0000013a, 0x00000004, 0x00050051, 0x00000006, 0x00000146, 0x0000013a, - 0x00000005, 0x00050051, 0x00000006, 0x00000148, 0x0000013a, 0x00000006, 0x00050051, 0x00000006, 0x0000014a, - 0x0000013a, 0x00000007, 0x000b0050, 0x0000000d, 0x0000037c, 0x0000013c, 0x0000013e, 0x00000140, 0x00000142, - 0x00000144, 0x00000146, 0x00000148, 0x0000014a, 0x000300f7, 0x000001de, 0x00000000, 0x000300fb, 0x00000042, - 0x00000187, 0x000200f8, 0x00000187, 0x000300f7, 0x000001ff, 0x00000000, 0x000300fb, 0x00000042, 0x000001ea, - 0x000200f8, 0x000001ea, 0x000200f9, 0x000001eb, 0x000200f8, 0x000001eb, 0x000700f5, 0x00000006, 0x000003b1, - 0x00000042, 0x000001ea, 0x000001fb, 0x000001f9, 0x000500b0, 0x00000014, 0x000001ee, 0x000003b1, 0x0000000c, - 0x000400f6, 0x000001fc, 0x000001f9, 0x00000000, 0x000400fa, 0x000001ee, 0x000001ef, 0x000001fc, 0x000200f8, - 0x000001ef, 0x0003003e, 0x000002dc, 0x0000037c, 0x00050041, 0x00000007, 0x000002de, 0x000002dc, 0x000003b1, - 0x0004003d, 0x00000006, 0x000001f2, 0x000002de, 0x0003003e, 0x000002df, 0x00000097, 0x00050041, 0x00000007, - 0x000002e1, 0x000002df, 0x000003b1, 0x0004003d, 0x00000006, 0x000001f5, 0x000002e1, 0x000500ab, 0x00000014, - 0x000001f6, 0x000001f2, 0x000001f5, 0x000300f7, 0x000001f8, 0x00000000, 0x000400fa, 0x000001f6, 0x000001f7, - 0x000001f8, 0x000200f8, 0x000001f7, 0x000200f9, 0x000001fc, 0x000200f8, 0x000001f8, 0x000200f9, 0x000001f9, - 0x000200f8, 0x000001f9, 0x00050080, 0x00000006, 0x000001fb, 0x000003b1, 0x00000060, 0x000200f9, 0x000001eb, - 0x000200f8, 0x000001fc, 0x000700f5, 0x00000014, 0x000003b5, 0x000003b7, 0x000001eb, 0x00000090, 0x000001f7, - 0x000700f5, 0x00000014, 0x000003b2, 0x00000090, 0x000001eb, 0x00000094, 0x000001f7, 0x000300f7, 0x000001fe, - 0x00000000, 0x000400fa, 0x000003b2, 0x000001ff, 0x000001fe, 0x000200f8, 0x000001fe, 0x000200f9, 0x000001ff, - 0x000200f8, 0x000001ff, 0x000700f5, 0x00000014, 0x000003b4, 0x000003b5, 0x000001fc, 0x00000094, 0x000001fe, - 0x000400a8, 0x00000014, 0x00000189, 0x000003b4, 0x000300f7, 0x0000018d, 0x00000000, 0x000400fa, 0x00000189, - 0x0000018a, 0x0000018d, 0x000200f8, 0x0000018a, 0x000500aa, 0x00000014, 0x0000018c, 0x00000136, 0x00000042, - 0x000200f9, 0x0000018d, 0x000200f8, 0x0000018d, 0x000700f5, 0x00000014, 0x0000018e, 0x000003b4, 0x000001ff, - 0x0000018c, 0x0000018a, 0x000300f7, 0x00000190, 0x00000000, 0x000400fa, 0x0000018e, 0x0000018f, 0x00000190, - 0x000200f8, 0x0000018f, 0x000200f9, 0x000001de, 0x000200f8, 0x00000190, 0x000200f9, 0x0000020d, 0x000200f8, - 0x0000020d, 0x000700f5, 0x00000006, 0x000003b9, 0x00000042, 0x00000190, 0x0000021f, 0x00000211, 0x000700f5, - 0x00000006, 0x000003b8, 0x00000042, 0x00000190, 0x00000222, 0x00000211, 0x000500b0, 0x00000014, 0x00000210, - 0x000003b8, 0x0000000c, 0x000400f6, 0x00000223, 0x00000211, 0x00000000, 0x000400fa, 0x00000210, 0x00000211, - 0x00000223, 0x000200f8, 0x00000211, 0x0003003e, 0x00000209, 0x0000037c, 0x00050041, 0x00000007, 0x00000213, - 0x00000209, 0x000003b8, 0x0004003d, 0x00000006, 0x00000214, 0x00000213, 0x00050084, 0x00000006, 0x0000023a, - 0x00000214, 0x0000002e, 0x000500c4, 0x00000006, 0x0000023c, 0x0000023a, 0x00000033, 0x000500c2, 0x00000006, - 0x0000023e, 0x0000023a, 0x00000036, 0x000500c5, 0x00000006, 0x0000023f, 0x0000023c, 0x0000023e, 0x00050084, - 0x00000006, 0x00000241, 0x0000023f, 0x00000039, 0x000500c6, 0x00000006, 0x00000217, 0x000003b9, 0x00000241, - 0x000500c4, 0x00000006, 0x00000219, 0x00000217, 0x00000054, 0x000500c2, 0x00000006, 0x0000021b, 0x00000217, - 0x00000057, 0x000500c5, 0x00000006, 0x0000021c, 0x00000219, 0x0000021b, 0x00050084, 0x00000006, 0x0000021e, - 0x0000021c, 0x0000005b, 0x00050080, 0x00000006, 0x0000021f, 0x0000021e, 0x0000005d, 0x00050080, 0x00000006, - 0x00000222, 0x000003b8, 0x00000060, 0x000200f9, 0x0000020d, 0x000200f8, 0x00000223, 0x000500c6, 0x00000006, - 0x00000225, 0x000003b9, 0x00000062, 0x000500c2, 0x00000006, 0x00000227, 0x00000225, 0x00000066, 0x000500c6, - 0x00000006, 0x00000229, 0x00000225, 0x00000227, 0x00050084, 0x00000006, 0x0000022b, 0x00000229, 0x0000006a, - 0x000500c2, 0x00000006, 0x0000022d, 0x0000022b, 0x00000054, 0x000500c6, 0x00000006, 0x0000022f, 0x0000022b, - 0x0000022d, 0x00050084, 0x00000006, 0x00000231, 0x0000022f, 0x00000071, 0x000500c2, 0x00000006, 0x00000233, - 0x00000231, 0x00000066, 0x000500c6, 0x00000006, 0x00000235, 0x00000231, 0x00000233, 0x000200f9, 0x00000192, - 0x000200f8, 0x00000192, 0x000700f5, 0x00000014, 0x000003e2, 0x000003b7, 0x00000223, 0x00000426, 0x000001d8, - 0x000700f5, 0x00000014, 0x000003d0, 0x000003b7, 0x00000223, 0x000003ca, 0x000001d8, 0x000700f5, 0x00000014, - 0x000003c1, 0x000003b7, 0x00000223, 0x000003be, 0x000001d8, 0x000700f5, 0x00000006, 0x000003ba, 0x00000235, - 0x00000223, 0x000001da, 0x000001d8, 0x000400f6, 0x000001db, 0x000001d8, 0x00000000, 0x000200f9, 0x00000193, - 0x000200f8, 0x00000193, 0x00050082, 0x00000006, 0x00000195, 0x00000136, 0x000000b3, 0x000500c7, 0x00000006, - 0x00000197, 0x000003ba, 0x00000195, 0x00060041, 0x000000bc, 0x0000019a, 0x00000131, 0x00000083, 0x00000197, - 0x0006003d, 0x00000026, 0x0000019b, 0x0000019a, 0x00000002, 0x00000010, 0x00050051, 0x00000025, 0x0000019c, - 0x0000019b, 0x00000000, 0x00050051, 0x00000024, 0x0000019e, 0x0000019c, 0x00000000, 0x00050051, 0x00000006, - 0x000001a0, 0x0000019e, 0x00000000, 0x00050051, 0x00000006, 0x000001a2, 0x0000019e, 0x00000001, 0x00050051, - 0x00000006, 0x000001a4, 0x0000019e, 0x00000002, 0x00050051, 0x00000006, 0x000001a6, 0x0000019e, 0x00000003, - 0x00050051, 0x00000006, 0x000001a8, 0x0000019e, 0x00000004, 0x00050051, 0x00000006, 0x000001aa, 0x0000019e, - 0x00000005, 0x00050051, 0x00000006, 0x000001ac, 0x0000019e, 0x00000006, 0x00050051, 0x00000006, 0x000001ae, - 0x0000019e, 0x00000007, 0x00050051, 0x00000025, 0x000001b0, 0x0000019b, 0x00000001, 0x00050051, 0x00000024, - 0x000001b2, 0x000001b0, 0x00000000, 0x00050051, 0x00000006, 0x000001b4, 0x000001b2, 0x00000000, 0x00050051, - 0x00000006, 0x000001b6, 0x000001b2, 0x00000001, 0x00050051, 0x00000006, 0x000001b8, 0x000001b2, 0x00000002, - 0x00050051, 0x00000006, 0x000001ba, 0x000001b2, 0x00000003, 0x00050051, 0x00000006, 0x000001bc, 0x000001b2, - 0x00000004, 0x00050051, 0x00000006, 0x000001be, 0x000001b2, 0x00000005, 0x00050051, 0x00000006, 0x000001c0, - 0x000001b2, 0x00000006, 0x00050051, 0x00000006, 0x000001c2, 0x000001b2, 0x00000007, 0x000b0050, 0x0000000d, - 0x0000038d, 0x000001a0, 0x000001a2, 0x000001a4, 0x000001a6, 0x000001a8, 0x000001aa, 0x000001ac, 0x000001ae, - 0x000300f7, 0x00000262, 0x00000000, 0x000300fb, 0x00000042, 0x0000024d, 0x000200f8, 0x0000024d, 0x000200f9, - 0x0000024e, 0x000200f8, 0x0000024e, 0x000700f5, 0x00000006, 0x000003bb, 0x00000042, 0x0000024d, 0x0000025e, - 0x0000025c, 0x000500b0, 0x00000014, 0x00000251, 0x000003bb, 0x0000000c, 0x000400f6, 0x0000025f, 0x0000025c, - 0x00000000, 0x000400fa, 0x00000251, 0x00000252, 0x0000025f, 0x000200f8, 0x00000252, 0x0003003e, 0x000002d6, - 0x0000038d, 0x00050041, 0x00000007, 0x000002d8, 0x000002d6, 0x000003bb, 0x0004003d, 0x00000006, 0x00000255, - 0x000002d8, 0x0003003e, 0x000002d9, 0x00000097, 0x00050041, 0x00000007, 0x000002db, 0x000002d9, 0x000003bb, - 0x0004003d, 0x00000006, 0x00000258, 0x000002db, 0x000500ab, 0x00000014, 0x00000259, 0x00000255, 0x00000258, - 0x000300f7, 0x0000025b, 0x00000000, 0x000400fa, 0x00000259, 0x0000025a, 0x0000025b, 0x000200f8, 0x0000025a, - 0x000200f9, 0x0000025f, 0x000200f8, 0x0000025b, 0x000200f9, 0x0000025c, 0x000200f8, 0x0000025c, 0x00050080, - 0x00000006, 0x0000025e, 0x000003bb, 0x00000060, 0x000200f9, 0x0000024e, 0x000200f8, 0x0000025f, 0x000700f5, - 0x00000014, 0x000003bf, 0x000003c1, 0x0000024e, 0x00000090, 0x0000025a, 0x000700f5, 0x00000014, 0x000003bc, - 0x00000090, 0x0000024e, 0x00000094, 0x0000025a, 0x000300f7, 0x00000261, 0x00000000, 0x000400fa, 0x000003bc, - 0x00000262, 0x00000261, 0x000200f8, 0x00000261, 0x000200f9, 0x00000262, 0x000200f8, 0x00000262, 0x000700f5, - 0x00000014, 0x000003be, 0x000003bf, 0x0000025f, 0x00000094, 0x00000261, 0x000300f7, 0x000001d7, 0x00000000, - 0x000400fa, 0x000003be, 0x000001c7, 0x000001c8, 0x000200f8, 0x000001c7, 0x000200f9, 0x000001db, 0x000200f8, - 0x000001c8, 0x000300f7, 0x00000280, 0x00000000, 0x000300fb, 0x00000042, 0x0000026b, 0x000200f8, 0x0000026b, - 0x000200f9, 0x0000026c, 0x000200f8, 0x0000026c, 0x000700f5, 0x00000006, 0x000003c7, 0x00000042, 0x0000026b, - 0x0000027c, 0x0000027a, 0x000500b0, 0x00000014, 0x0000026f, 0x000003c7, 0x0000000c, 0x000400f6, 0x0000027d, - 0x0000027a, 0x00000000, 0x000400fa, 0x0000026f, 0x00000270, 0x0000027d, 0x000200f8, 0x00000270, 0x0003003e, - 0x000002d0, 0x0000037c, 0x00050041, 0x00000007, 0x000002d2, 0x000002d0, 0x000003c7, 0x0004003d, 0x00000006, - 0x00000273, 0x000002d2, 0x0003003e, 0x000002d3, 0x0000038d, 0x00050041, 0x00000007, 0x000002d5, 0x000002d3, - 0x000003c7, 0x0004003d, 0x00000006, 0x00000276, 0x000002d5, 0x000500ab, 0x00000014, 0x00000277, 0x00000273, - 0x00000276, 0x000300f7, 0x00000279, 0x00000000, 0x000400fa, 0x00000277, 0x00000278, 0x00000279, 0x000200f8, - 0x00000278, 0x000200f9, 0x0000027d, 0x000200f8, 0x00000279, 0x000200f9, 0x0000027a, 0x000200f8, 0x0000027a, - 0x00050080, 0x00000006, 0x0000027c, 0x000003c7, 0x00000060, 0x000200f9, 0x0000026c, 0x000200f8, 0x0000027d, - 0x000700f5, 0x00000014, 0x000003cb, 0x000003d0, 0x0000026c, 0x00000090, 0x00000278, 0x000700f5, 0x00000014, - 0x000003c8, 0x00000090, 0x0000026c, 0x00000094, 0x00000278, 0x000300f7, 0x0000027f, 0x00000000, 0x000400fa, - 0x000003c8, 0x00000280, 0x0000027f, 0x000200f8, 0x0000027f, 0x000200f9, 0x00000280, 0x000200f8, 0x00000280, - 0x000700f5, 0x00000014, 0x000003ca, 0x000003cb, 0x0000027d, 0x00000094, 0x0000027f, 0x000300f7, 0x000001d1, - 0x00000000, 0x000400fa, 0x000003ca, 0x000001cc, 0x000001d1, 0x000200f8, 0x000001cc, 0x000b0050, 0x0000000d, - 0x000003a7, 0x000001b4, 0x000001b6, 0x000001b8, 0x000001ba, 0x000001bc, 0x000001be, 0x000001c0, 0x000001c2, - 0x000300f7, 0x000002a1, 0x00000000, 0x000300fb, 0x00000042, 0x0000028c, 0x000200f8, 0x0000028c, 0x000200f9, - 0x0000028d, 0x000200f8, 0x0000028d, 0x000700f5, 0x00000006, 0x000003d6, 0x00000042, 0x0000028c, 0x0000029d, - 0x0000029b, 0x000500b0, 0x00000014, 0x00000290, 0x000003d6, 0x0000000c, 0x000400f6, 0x0000029e, 0x0000029b, - 0x00000000, 0x000400fa, 0x00000290, 0x00000291, 0x0000029e, 0x000200f8, 0x00000291, 0x0003003e, 0x000002ca, - 0x000003a7, 0x00050041, 0x00000007, 0x000002cc, 0x000002ca, 0x000003d6, 0x0004003d, 0x00000006, 0x00000294, - 0x000002cc, 0x0003003e, 0x000002cd, 0x00000097, 0x00050041, 0x00000007, 0x000002cf, 0x000002cd, 0x000003d6, - 0x0004003d, 0x00000006, 0x00000297, 0x000002cf, 0x000500ab, 0x00000014, 0x00000298, 0x00000294, 0x00000297, - 0x000300f7, 0x0000029a, 0x00000000, 0x000400fa, 0x00000298, 0x00000299, 0x0000029a, 0x000200f8, 0x00000299, - 0x000200f9, 0x0000029e, 0x000200f8, 0x0000029a, 0x000200f9, 0x0000029b, 0x000200f8, 0x0000029b, 0x00050080, - 0x00000006, 0x0000029d, 0x000003d6, 0x00000060, 0x000200f9, 0x0000028d, 0x000200f8, 0x0000029e, 0x000700f5, - 0x00000014, 0x000003da, 0x000003e2, 0x0000028d, 0x00000090, 0x00000299, 0x000700f5, 0x00000014, 0x000003d7, - 0x00000090, 0x0000028d, 0x00000094, 0x00000299, 0x000300f7, 0x000002a0, 0x00000000, 0x000400fa, 0x000003d7, - 0x000002a1, 0x000002a0, 0x000200f8, 0x000002a0, 0x000200f9, 0x000002a1, 0x000200f8, 0x000002a1, 0x000700f5, - 0x00000014, 0x000003d9, 0x000003da, 0x0000029e, 0x00000094, 0x000002a0, 0x000400a8, 0x00000014, 0x000001d0, - 0x000003d9, 0x000200f9, 0x000001d1, 0x000200f8, 0x000001d1, 0x000700f5, 0x00000014, 0x00000426, 0x000003e2, - 0x00000280, 0x000003d9, 0x000002a1, 0x000700f5, 0x00000014, 0x000001d2, 0x000003ca, 0x00000280, 0x000001d0, - 0x000002a1, 0x000300f7, 0x000001d6, 0x00000000, 0x000400fa, 0x000001d2, 0x000001d3, 0x000001d6, 0x000200f8, - 0x000001d3, 0x000200f9, 0x000001db, 0x000200f8, 0x000001d6, 0x000200f9, 0x000001d7, 0x000200f8, 0x000001d7, - 0x000200f9, 0x000001d8, 0x000200f8, 0x000001d8, 0x00050080, 0x00000006, 0x000001da, 0x00000197, 0x00000060, - 0x000200f9, 0x00000192, 0x000200f8, 0x000001db, 0x000700f5, 0x00000006, 0x00000402, 0x00000042, 0x000001c7, - 0x000001b4, 0x000001d3, 0x000700f5, 0x00000006, 0x00000400, 0x00000042, 0x000001c7, 0x000001b6, 0x000001d3, - 0x000700f5, 0x00000006, 0x000003fe, 0x00000042, 0x000001c7, 0x000001b8, 0x000001d3, 0x000700f5, 0x00000006, - 0x000003fc, 0x00000042, 0x000001c7, 0x000001ba, 0x000001d3, 0x000700f5, 0x00000006, 0x000003fa, 0x00000042, - 0x000001c7, 0x000001bc, 0x000001d3, 0x000700f5, 0x00000006, 0x000003f8, 0x00000042, 0x000001c7, 0x000001be, - 0x000001d3, 0x000700f5, 0x00000006, 0x000003f6, 0x00000042, 0x000001c7, 0x000001c0, 0x000001d3, 0x000700f5, - 0x00000006, 0x000003f4, 0x00000042, 0x000001c7, 0x000001c2, 0x000001d3, 0x000300f7, 0x000001dd, 0x00000000, - 0x000400fa, 0x00000094, 0x000001de, 0x000001dd, 0x000200f8, 0x000001dd, 0x000200f9, 0x000001de, 0x000200f8, - 0x000001de, 0x000900f5, 0x00000006, 0x00000401, 0x00000042, 0x0000018f, 0x00000402, 0x000001db, 0x00000402, - 0x000001dd, 0x000900f5, 0x00000006, 0x000003ff, 0x00000042, 0x0000018f, 0x00000400, 0x000001db, 0x00000400, - 0x000001dd, 0x000900f5, 0x00000006, 0x000003fd, 0x00000042, 0x0000018f, 0x000003fe, 0x000001db, 0x000003fe, - 0x000001dd, 0x000900f5, 0x00000006, 0x000003fb, 0x00000042, 0x0000018f, 0x000003fc, 0x000001db, 0x000003fc, - 0x000001dd, 0x000900f5, 0x00000006, 0x000003f9, 0x00000042, 0x0000018f, 0x000003fa, 0x000001db, 0x000003fa, - 0x000001dd, 0x000900f5, 0x00000006, 0x000003f7, 0x00000042, 0x0000018f, 0x000003f8, 0x000001db, 0x000003f8, - 0x000001dd, 0x000900f5, 0x00000006, 0x000003f5, 0x00000042, 0x0000018f, 0x000003f6, 0x000001db, 0x000003f6, - 0x000001dd, 0x000900f5, 0x00000006, 0x000003f3, 0x00000042, 0x0000018f, 0x000003f4, 0x000001db, 0x000003f4, - 0x000001dd, 0x000b0050, 0x0000000d, 0x00000362, 0x00000401, 0x000003ff, 0x000003fd, 0x000003fb, 0x000003f9, - 0x000003f7, 0x000003f5, 0x000003f3, 0x000300f7, 0x000002c2, 0x00000000, 0x000300fb, 0x00000042, 0x000002ad, - 0x000200f8, 0x000002ad, 0x000200f9, 0x000002ae, 0x000200f8, 0x000002ae, 0x000700f5, 0x00000006, 0x00000403, - 0x00000042, 0x000002ad, 0x000002be, 0x000002bc, 0x000500b0, 0x00000014, 0x000002b1, 0x00000403, 0x0000000c, - 0x000400f6, 0x000002bf, 0x000002bc, 0x00000000, 0x000400fa, 0x000002b1, 0x000002b2, 0x000002bf, 0x000200f8, - 0x000002b2, 0x0003003e, 0x000002c4, 0x00000362, 0x00050041, 0x00000007, 0x000002c6, 0x000002c4, 0x00000403, - 0x0004003d, 0x00000006, 0x000002b5, 0x000002c6, 0x0003003e, 0x000002c7, 0x00000097, 0x00050041, 0x00000007, - 0x000002c9, 0x000002c7, 0x00000403, 0x0004003d, 0x00000006, 0x000002b8, 0x000002c9, 0x000500ab, 0x00000014, - 0x000002b9, 0x000002b5, 0x000002b8, 0x000300f7, 0x000002bb, 0x00000000, 0x000400fa, 0x000002b9, 0x000002ba, - 0x000002bb, 0x000200f8, 0x000002ba, 0x000200f9, 0x000002bf, 0x000200f8, 0x000002bb, 0x000200f9, 0x000002bc, - 0x000200f8, 0x000002bc, 0x00050080, 0x00000006, 0x000002be, 0x00000403, 0x00000060, 0x000200f9, 0x000002ae, - 0x000200f8, 0x000002bf, 0x000700f5, 0x00000014, 0x00000407, 0x000003b7, 0x000002ae, 0x00000090, 0x000002ba, - 0x000700f5, 0x00000014, 0x00000404, 0x00000090, 0x000002ae, 0x00000094, 0x000002ba, 0x000300f7, 0x000002c1, - 0x00000000, 0x000400fa, 0x00000404, 0x000002c2, 0x000002c1, 0x000200f8, 0x000002c1, 0x000200f9, 0x000002c2, - 0x000200f8, 0x000002c2, 0x000700f5, 0x00000014, 0x00000406, 0x00000407, 0x000002bf, 0x00000094, 0x000002c1, - 0x000400a8, 0x00000014, 0x00000150, 0x00000406, 0x000300f7, 0x00000152, 0x00000000, 0x000400fa, 0x00000150, - 0x00000151, 0x00000152, 0x000200f8, 0x00000151, 0x00060041, 0x00000125, 0x00000153, 0x00000119, 0x00000083, - 0x000000a5, 0x0004003d, 0x0000010e, 0x00000154, 0x00000153, 0x00060041, 0x00000129, 0x00000156, 0x00000154, - 0x00000083, 0x0000010b, 0x0006003d, 0x00000110, 0x00000157, 0x00000156, 0x00000002, 0x00000008, 0x00050041, - 0x0000012c, 0x00000159, 0x00000157, 0x00000083, 0x00050041, 0x0000015b, 0x0000015c, 0x00000159, 0x00000083, - 0x00050041, 0x0000015e, 0x0000015f, 0x0000015c, 0x00000083, 0x0005003e, 0x0000015f, 0x00000401, 0x00000002, - 0x00000004, 0x00050041, 0x0000015e, 0x00000161, 0x0000015c, 0x00000060, 0x0005003e, 0x00000161, 0x000003ff, - 0x00000002, 0x00000004, 0x00050041, 0x0000015e, 0x00000163, 0x0000015c, 0x000000a5, 0x0005003e, 0x00000163, - 0x000003fd, 0x00000002, 0x00000004, 0x00050041, 0x0000015e, 0x00000165, 0x0000015c, 0x000000ca, 0x0005003e, - 0x00000165, 0x000003fb, 0x00000002, 0x00000004, 0x00050041, 0x0000015e, 0x00000167, 0x0000015c, 0x000000cd, - 0x0005003e, 0x00000167, 0x000003f9, 0x00000002, 0x00000004, 0x00050041, 0x0000015e, 0x00000169, 0x0000015c, - 0x000000d0, 0x0005003e, 0x00000169, 0x000003f7, 0x00000002, 0x00000004, 0x00050041, 0x0000015e, 0x0000016b, - 0x0000015c, 0x000000d3, 0x0005003e, 0x0000016b, 0x000003f5, 0x00000002, 0x00000004, 0x00050041, 0x0000015e, - 0x0000016d, 0x0000015c, 0x000000d6, 0x0005003e, 0x0000016d, 0x000003f3, 0x00000002, 0x00000004, 0x000200f9, - 0x00000152, 0x000200f8, 0x00000152, 0x000200f9, 0x0000016f, 0x000200f8, 0x0000016f, 0x000100fd, 0x00010038 + 0x00000172, 0x000200f8, 0x0000011f, 0x00060041, 0x00000122, 0x00000123, 0x00000119, 0x00000083, 0x00000060, + 0x0004003d, 0x0000010e, 0x00000124, 0x00000123, 0x00060041, 0x00000126, 0x00000127, 0x00000124, 0x00000083, + 0x0000010b, 0x0006003d, 0x00000110, 0x00000128, 0x00000127, 0x00000002, 0x00000008, 0x00050041, 0x00000129, + 0x0000012a, 0x00000128, 0x00000083, 0x0006003d, 0x00000114, 0x0000012b, 0x0000012a, 0x00000002, 0x00000010, + 0x00050051, 0x00000113, 0x0000012c, 0x0000012b, 0x00000000, 0x00050051, 0x00000006, 0x0000012e, 0x0000012c, + 0x00000000, 0x00050051, 0x00000006, 0x00000130, 0x0000012c, 0x00000001, 0x00050051, 0x00000006, 0x00000132, + 0x0000012c, 0x00000002, 0x00050051, 0x00000006, 0x00000134, 0x0000012c, 0x00000003, 0x00050051, 0x00000006, + 0x00000136, 0x0000012c, 0x00000004, 0x00050051, 0x00000006, 0x00000138, 0x0000012c, 0x00000005, 0x00050051, + 0x00000006, 0x0000013a, 0x0000012c, 0x00000006, 0x00050051, 0x00000006, 0x0000013c, 0x0000012c, 0x00000007, + 0x00060041, 0x0000013f, 0x00000140, 0x00000119, 0x00000083, 0x00000083, 0x0004003d, 0x0000010d, 0x00000141, + 0x00000140, 0x000b0050, 0x0000000d, 0x00000364, 0x0000012e, 0x00000130, 0x00000132, 0x00000134, 0x00000136, + 0x00000138, 0x0000013a, 0x0000013c, 0x00050051, 0x00000022, 0x00000145, 0x00000141, 0x00000000, 0x00050051, + 0x00000006, 0x0000014a, 0x00000141, 0x00000002, 0x000300f7, 0x000001e1, 0x00000000, 0x000300fb, 0x00000042, + 0x0000018a, 0x000200f8, 0x0000018a, 0x000300f7, 0x00000202, 0x00000000, 0x000300fb, 0x00000042, 0x000001ed, + 0x000200f8, 0x000001ed, 0x000200f9, 0x000001ee, 0x000200f8, 0x000001ee, 0x000700f5, 0x00000006, 0x000003e5, + 0x00000042, 0x000001ed, 0x000001fe, 0x000001fc, 0x000500b0, 0x00000014, 0x000001f1, 0x000003e5, 0x0000000c, + 0x000400f6, 0x000001ff, 0x000001fc, 0x00000000, 0x000400fa, 0x000001f1, 0x000001f2, 0x000001ff, 0x000200f8, + 0x000001f2, 0x0003003e, 0x000002df, 0x00000364, 0x00050041, 0x00000007, 0x000002e1, 0x000002df, 0x000003e5, + 0x0004003d, 0x00000006, 0x000001f5, 0x000002e1, 0x0003003e, 0x000002e2, 0x00000097, 0x00050041, 0x00000007, + 0x000002e4, 0x000002e2, 0x000003e5, 0x0004003d, 0x00000006, 0x000001f8, 0x000002e4, 0x000500ab, 0x00000014, + 0x000001f9, 0x000001f5, 0x000001f8, 0x000300f7, 0x000001fb, 0x00000000, 0x000400fa, 0x000001f9, 0x000001fa, + 0x000001fb, 0x000200f8, 0x000001fa, 0x000200f9, 0x000001ff, 0x000200f8, 0x000001fb, 0x000200f9, 0x000001fc, + 0x000200f8, 0x000001fc, 0x00050080, 0x00000006, 0x000001fe, 0x000003e5, 0x00000060, 0x000200f9, 0x000001ee, + 0x000200f8, 0x000001ff, 0x000700f5, 0x00000014, 0x000003e9, 0x000003eb, 0x000001ee, 0x00000090, 0x000001fa, + 0x000700f5, 0x00000014, 0x000003e6, 0x00000090, 0x000001ee, 0x00000094, 0x000001fa, 0x000300f7, 0x00000201, + 0x00000000, 0x000400fa, 0x000003e6, 0x00000202, 0x00000201, 0x000200f8, 0x00000201, 0x000200f9, 0x00000202, + 0x000200f8, 0x00000202, 0x000700f5, 0x00000014, 0x000003e8, 0x000003e9, 0x000001ff, 0x00000094, 0x00000201, + 0x000400a8, 0x00000014, 0x0000018c, 0x000003e8, 0x000300f7, 0x00000190, 0x00000000, 0x000400fa, 0x0000018c, + 0x0000018d, 0x00000190, 0x000200f8, 0x0000018d, 0x000500aa, 0x00000014, 0x0000018f, 0x0000014a, 0x00000042, + 0x000200f9, 0x00000190, 0x000200f8, 0x00000190, 0x000700f5, 0x00000014, 0x00000191, 0x000003e8, 0x00000202, + 0x0000018f, 0x0000018d, 0x000300f7, 0x00000193, 0x00000000, 0x000400fa, 0x00000191, 0x00000192, 0x00000193, + 0x000200f8, 0x00000192, 0x000200f9, 0x000001e1, 0x000200f8, 0x00000193, 0x000200f9, 0x00000210, 0x000200f8, + 0x00000210, 0x000700f5, 0x00000006, 0x000003ed, 0x00000042, 0x00000193, 0x00000222, 0x00000214, 0x000700f5, + 0x00000006, 0x000003ec, 0x00000042, 0x00000193, 0x00000225, 0x00000214, 0x000500b0, 0x00000014, 0x00000213, + 0x000003ec, 0x0000000c, 0x000400f6, 0x00000226, 0x00000214, 0x00000000, 0x000400fa, 0x00000213, 0x00000214, + 0x00000226, 0x000200f8, 0x00000214, 0x0003003e, 0x0000020c, 0x00000364, 0x00050041, 0x00000007, 0x00000216, + 0x0000020c, 0x000003ec, 0x0004003d, 0x00000006, 0x00000217, 0x00000216, 0x00050084, 0x00000006, 0x0000023d, + 0x00000217, 0x0000002e, 0x000500c4, 0x00000006, 0x0000023f, 0x0000023d, 0x00000033, 0x000500c2, 0x00000006, + 0x00000241, 0x0000023d, 0x00000036, 0x000500c5, 0x00000006, 0x00000242, 0x0000023f, 0x00000241, 0x00050084, + 0x00000006, 0x00000244, 0x00000242, 0x00000039, 0x000500c6, 0x00000006, 0x0000021a, 0x000003ed, 0x00000244, + 0x000500c4, 0x00000006, 0x0000021c, 0x0000021a, 0x00000054, 0x000500c2, 0x00000006, 0x0000021e, 0x0000021a, + 0x00000057, 0x000500c5, 0x00000006, 0x0000021f, 0x0000021c, 0x0000021e, 0x00050084, 0x00000006, 0x00000221, + 0x0000021f, 0x0000005b, 0x00050080, 0x00000006, 0x00000222, 0x00000221, 0x0000005d, 0x00050080, 0x00000006, + 0x00000225, 0x000003ec, 0x00000060, 0x000200f9, 0x00000210, 0x000200f8, 0x00000226, 0x000500c6, 0x00000006, + 0x00000228, 0x000003ed, 0x00000062, 0x000500c2, 0x00000006, 0x0000022a, 0x00000228, 0x00000066, 0x000500c6, + 0x00000006, 0x0000022c, 0x00000228, 0x0000022a, 0x00050084, 0x00000006, 0x0000022e, 0x0000022c, 0x0000006a, + 0x000500c2, 0x00000006, 0x00000230, 0x0000022e, 0x00000054, 0x000500c6, 0x00000006, 0x00000232, 0x0000022e, + 0x00000230, 0x00050084, 0x00000006, 0x00000234, 0x00000232, 0x00000071, 0x000500c2, 0x00000006, 0x00000236, + 0x00000234, 0x00000066, 0x000500c6, 0x00000006, 0x00000238, 0x00000234, 0x00000236, 0x000200f9, 0x00000195, + 0x000200f8, 0x00000195, 0x000700f5, 0x00000014, 0x00000416, 0x000003eb, 0x00000226, 0x00000462, 0x000001db, + 0x000700f5, 0x00000014, 0x00000404, 0x000003eb, 0x00000226, 0x000003fe, 0x000001db, 0x000700f5, 0x00000014, + 0x000003f5, 0x000003eb, 0x00000226, 0x000003f2, 0x000001db, 0x000700f5, 0x00000006, 0x000003ee, 0x00000238, + 0x00000226, 0x000001dd, 0x000001db, 0x000400f6, 0x000001de, 0x000001db, 0x00000000, 0x000200f9, 0x00000196, + 0x000200f8, 0x00000196, 0x00050082, 0x00000006, 0x00000198, 0x0000014a, 0x000000b3, 0x000500c7, 0x00000006, + 0x0000019a, 0x000003ee, 0x00000198, 0x00060041, 0x000000bc, 0x0000019d, 0x00000145, 0x00000083, 0x0000019a, + 0x0006003d, 0x00000026, 0x0000019e, 0x0000019d, 0x00000002, 0x00000010, 0x00050051, 0x00000025, 0x0000019f, + 0x0000019e, 0x00000000, 0x00050051, 0x00000024, 0x000001a1, 0x0000019f, 0x00000000, 0x00050051, 0x00000006, + 0x000001a3, 0x000001a1, 0x00000000, 0x00050051, 0x00000006, 0x000001a5, 0x000001a1, 0x00000001, 0x00050051, + 0x00000006, 0x000001a7, 0x000001a1, 0x00000002, 0x00050051, 0x00000006, 0x000001a9, 0x000001a1, 0x00000003, + 0x00050051, 0x00000006, 0x000001ab, 0x000001a1, 0x00000004, 0x00050051, 0x00000006, 0x000001ad, 0x000001a1, + 0x00000005, 0x00050051, 0x00000006, 0x000001af, 0x000001a1, 0x00000006, 0x00050051, 0x00000006, 0x000001b1, + 0x000001a1, 0x00000007, 0x00050051, 0x00000025, 0x000001b3, 0x0000019e, 0x00000001, 0x00050051, 0x00000024, + 0x000001b5, 0x000001b3, 0x00000000, 0x00050051, 0x00000006, 0x000001b7, 0x000001b5, 0x00000000, 0x00050051, + 0x00000006, 0x000001b9, 0x000001b5, 0x00000001, 0x00050051, 0x00000006, 0x000001bb, 0x000001b5, 0x00000002, + 0x00050051, 0x00000006, 0x000001bd, 0x000001b5, 0x00000003, 0x00050051, 0x00000006, 0x000001bf, 0x000001b5, + 0x00000004, 0x00050051, 0x00000006, 0x000001c1, 0x000001b5, 0x00000005, 0x00050051, 0x00000006, 0x000001c3, + 0x000001b5, 0x00000006, 0x00050051, 0x00000006, 0x000001c5, 0x000001b5, 0x00000007, 0x000b0050, 0x0000000d, + 0x000003c1, 0x000001a3, 0x000001a5, 0x000001a7, 0x000001a9, 0x000001ab, 0x000001ad, 0x000001af, 0x000001b1, + 0x000300f7, 0x00000265, 0x00000000, 0x000300fb, 0x00000042, 0x00000250, 0x000200f8, 0x00000250, 0x000200f9, + 0x00000251, 0x000200f8, 0x00000251, 0x000700f5, 0x00000006, 0x000003ef, 0x00000042, 0x00000250, 0x00000261, + 0x0000025f, 0x000500b0, 0x00000014, 0x00000254, 0x000003ef, 0x0000000c, 0x000400f6, 0x00000262, 0x0000025f, + 0x00000000, 0x000400fa, 0x00000254, 0x00000255, 0x00000262, 0x000200f8, 0x00000255, 0x0003003e, 0x000002d9, + 0x000003c1, 0x00050041, 0x00000007, 0x000002db, 0x000002d9, 0x000003ef, 0x0004003d, 0x00000006, 0x00000258, + 0x000002db, 0x0003003e, 0x000002dc, 0x00000097, 0x00050041, 0x00000007, 0x000002de, 0x000002dc, 0x000003ef, + 0x0004003d, 0x00000006, 0x0000025b, 0x000002de, 0x000500ab, 0x00000014, 0x0000025c, 0x00000258, 0x0000025b, + 0x000300f7, 0x0000025e, 0x00000000, 0x000400fa, 0x0000025c, 0x0000025d, 0x0000025e, 0x000200f8, 0x0000025d, + 0x000200f9, 0x00000262, 0x000200f8, 0x0000025e, 0x000200f9, 0x0000025f, 0x000200f8, 0x0000025f, 0x00050080, + 0x00000006, 0x00000261, 0x000003ef, 0x00000060, 0x000200f9, 0x00000251, 0x000200f8, 0x00000262, 0x000700f5, + 0x00000014, 0x000003f3, 0x000003f5, 0x00000251, 0x00000090, 0x0000025d, 0x000700f5, 0x00000014, 0x000003f0, + 0x00000090, 0x00000251, 0x00000094, 0x0000025d, 0x000300f7, 0x00000264, 0x00000000, 0x000400fa, 0x000003f0, + 0x00000265, 0x00000264, 0x000200f8, 0x00000264, 0x000200f9, 0x00000265, 0x000200f8, 0x00000265, 0x000700f5, + 0x00000014, 0x000003f2, 0x000003f3, 0x00000262, 0x00000094, 0x00000264, 0x000300f7, 0x000001da, 0x00000000, + 0x000400fa, 0x000003f2, 0x000001ca, 0x000001cb, 0x000200f8, 0x000001ca, 0x000200f9, 0x000001de, 0x000200f8, + 0x000001cb, 0x000300f7, 0x00000283, 0x00000000, 0x000300fb, 0x00000042, 0x0000026e, 0x000200f8, 0x0000026e, + 0x000200f9, 0x0000026f, 0x000200f8, 0x0000026f, 0x000700f5, 0x00000006, 0x000003fb, 0x00000042, 0x0000026e, + 0x0000027f, 0x0000027d, 0x000500b0, 0x00000014, 0x00000272, 0x000003fb, 0x0000000c, 0x000400f6, 0x00000280, + 0x0000027d, 0x00000000, 0x000400fa, 0x00000272, 0x00000273, 0x00000280, 0x000200f8, 0x00000273, 0x0003003e, + 0x000002d3, 0x00000364, 0x00050041, 0x00000007, 0x000002d5, 0x000002d3, 0x000003fb, 0x0004003d, 0x00000006, + 0x00000276, 0x000002d5, 0x0003003e, 0x000002d6, 0x000003c1, 0x00050041, 0x00000007, 0x000002d8, 0x000002d6, + 0x000003fb, 0x0004003d, 0x00000006, 0x00000279, 0x000002d8, 0x000500ab, 0x00000014, 0x0000027a, 0x00000276, + 0x00000279, 0x000300f7, 0x0000027c, 0x00000000, 0x000400fa, 0x0000027a, 0x0000027b, 0x0000027c, 0x000200f8, + 0x0000027b, 0x000200f9, 0x00000280, 0x000200f8, 0x0000027c, 0x000200f9, 0x0000027d, 0x000200f8, 0x0000027d, + 0x00050080, 0x00000006, 0x0000027f, 0x000003fb, 0x00000060, 0x000200f9, 0x0000026f, 0x000200f8, 0x00000280, + 0x000700f5, 0x00000014, 0x000003ff, 0x00000404, 0x0000026f, 0x00000090, 0x0000027b, 0x000700f5, 0x00000014, + 0x000003fc, 0x00000090, 0x0000026f, 0x00000094, 0x0000027b, 0x000300f7, 0x00000282, 0x00000000, 0x000400fa, + 0x000003fc, 0x00000283, 0x00000282, 0x000200f8, 0x00000282, 0x000200f9, 0x00000283, 0x000200f8, 0x00000283, + 0x000700f5, 0x00000014, 0x000003fe, 0x000003ff, 0x00000280, 0x00000094, 0x00000282, 0x000300f7, 0x000001d4, + 0x00000000, 0x000400fa, 0x000003fe, 0x000001cf, 0x000001d4, 0x000200f8, 0x000001cf, 0x000b0050, 0x0000000d, + 0x000003db, 0x000001b7, 0x000001b9, 0x000001bb, 0x000001bd, 0x000001bf, 0x000001c1, 0x000001c3, 0x000001c5, + 0x000300f7, 0x000002a4, 0x00000000, 0x000300fb, 0x00000042, 0x0000028f, 0x000200f8, 0x0000028f, 0x000200f9, + 0x00000290, 0x000200f8, 0x00000290, 0x000700f5, 0x00000006, 0x0000040a, 0x00000042, 0x0000028f, 0x000002a0, + 0x0000029e, 0x000500b0, 0x00000014, 0x00000293, 0x0000040a, 0x0000000c, 0x000400f6, 0x000002a1, 0x0000029e, + 0x00000000, 0x000400fa, 0x00000293, 0x00000294, 0x000002a1, 0x000200f8, 0x00000294, 0x0003003e, 0x000002cd, + 0x000003db, 0x00050041, 0x00000007, 0x000002cf, 0x000002cd, 0x0000040a, 0x0004003d, 0x00000006, 0x00000297, + 0x000002cf, 0x0003003e, 0x000002d0, 0x00000097, 0x00050041, 0x00000007, 0x000002d2, 0x000002d0, 0x0000040a, + 0x0004003d, 0x00000006, 0x0000029a, 0x000002d2, 0x000500ab, 0x00000014, 0x0000029b, 0x00000297, 0x0000029a, + 0x000300f7, 0x0000029d, 0x00000000, 0x000400fa, 0x0000029b, 0x0000029c, 0x0000029d, 0x000200f8, 0x0000029c, + 0x000200f9, 0x000002a1, 0x000200f8, 0x0000029d, 0x000200f9, 0x0000029e, 0x000200f8, 0x0000029e, 0x00050080, + 0x00000006, 0x000002a0, 0x0000040a, 0x00000060, 0x000200f9, 0x00000290, 0x000200f8, 0x000002a1, 0x000700f5, + 0x00000014, 0x0000040e, 0x00000416, 0x00000290, 0x00000090, 0x0000029c, 0x000700f5, 0x00000014, 0x0000040b, + 0x00000090, 0x00000290, 0x00000094, 0x0000029c, 0x000300f7, 0x000002a3, 0x00000000, 0x000400fa, 0x0000040b, + 0x000002a4, 0x000002a3, 0x000200f8, 0x000002a3, 0x000200f9, 0x000002a4, 0x000200f8, 0x000002a4, 0x000700f5, + 0x00000014, 0x0000040d, 0x0000040e, 0x000002a1, 0x00000094, 0x000002a3, 0x000400a8, 0x00000014, 0x000001d3, + 0x0000040d, 0x000200f9, 0x000001d4, 0x000200f8, 0x000001d4, 0x000700f5, 0x00000014, 0x00000462, 0x00000416, + 0x00000283, 0x0000040d, 0x000002a4, 0x000700f5, 0x00000014, 0x000001d5, 0x000003fe, 0x00000283, 0x000001d3, + 0x000002a4, 0x000300f7, 0x000001d9, 0x00000000, 0x000400fa, 0x000001d5, 0x000001d6, 0x000001d9, 0x000200f8, + 0x000001d6, 0x000200f9, 0x000001de, 0x000200f8, 0x000001d9, 0x000200f9, 0x000001da, 0x000200f8, 0x000001da, + 0x000200f9, 0x000001db, 0x000200f8, 0x000001db, 0x00050080, 0x00000006, 0x000001dd, 0x0000019a, 0x00000060, + 0x000200f9, 0x00000195, 0x000200f8, 0x000001de, 0x000700f5, 0x00000006, 0x00000436, 0x00000042, 0x000001ca, + 0x000001b7, 0x000001d6, 0x000700f5, 0x00000006, 0x00000434, 0x00000042, 0x000001ca, 0x000001b9, 0x000001d6, + 0x000700f5, 0x00000006, 0x00000432, 0x00000042, 0x000001ca, 0x000001bb, 0x000001d6, 0x000700f5, 0x00000006, + 0x00000430, 0x00000042, 0x000001ca, 0x000001bd, 0x000001d6, 0x000700f5, 0x00000006, 0x0000042e, 0x00000042, + 0x000001ca, 0x000001bf, 0x000001d6, 0x000700f5, 0x00000006, 0x0000042c, 0x00000042, 0x000001ca, 0x000001c1, + 0x000001d6, 0x000700f5, 0x00000006, 0x0000042a, 0x00000042, 0x000001ca, 0x000001c3, 0x000001d6, 0x000700f5, + 0x00000006, 0x00000428, 0x00000042, 0x000001ca, 0x000001c5, 0x000001d6, 0x000300f7, 0x000001e0, 0x00000000, + 0x000400fa, 0x00000094, 0x000001e1, 0x000001e0, 0x000200f8, 0x000001e0, 0x000200f9, 0x000001e1, 0x000200f8, + 0x000001e1, 0x000900f5, 0x00000006, 0x00000435, 0x00000042, 0x00000192, 0x00000436, 0x000001de, 0x00000436, + 0x000001e0, 0x000900f5, 0x00000006, 0x00000433, 0x00000042, 0x00000192, 0x00000434, 0x000001de, 0x00000434, + 0x000001e0, 0x000900f5, 0x00000006, 0x00000431, 0x00000042, 0x00000192, 0x00000432, 0x000001de, 0x00000432, + 0x000001e0, 0x000900f5, 0x00000006, 0x0000042f, 0x00000042, 0x00000192, 0x00000430, 0x000001de, 0x00000430, + 0x000001e0, 0x000900f5, 0x00000006, 0x0000042d, 0x00000042, 0x00000192, 0x0000042e, 0x000001de, 0x0000042e, + 0x000001e0, 0x000900f5, 0x00000006, 0x0000042b, 0x00000042, 0x00000192, 0x0000042c, 0x000001de, 0x0000042c, + 0x000001e0, 0x000900f5, 0x00000006, 0x00000429, 0x00000042, 0x00000192, 0x0000042a, 0x000001de, 0x0000042a, + 0x000001e0, 0x000900f5, 0x00000006, 0x00000427, 0x00000042, 0x00000192, 0x00000428, 0x000001de, 0x00000428, + 0x000001e0, 0x00060041, 0x00000122, 0x0000014e, 0x00000119, 0x00000083, 0x000000a5, 0x0004003d, 0x0000010e, + 0x0000014f, 0x0000014e, 0x00060041, 0x00000126, 0x00000151, 0x0000014f, 0x00000083, 0x0000010b, 0x0006003d, + 0x00000110, 0x00000152, 0x00000151, 0x00000002, 0x00000008, 0x000b0050, 0x0000000d, 0x00000386, 0x00000435, + 0x00000433, 0x00000431, 0x0000042f, 0x0000042d, 0x0000042b, 0x00000429, 0x00000427, 0x000300f7, 0x000002c5, + 0x00000000, 0x000300fb, 0x00000042, 0x000002b0, 0x000200f8, 0x000002b0, 0x000200f9, 0x000002b1, 0x000200f8, + 0x000002b1, 0x000700f5, 0x00000006, 0x00000437, 0x00000042, 0x000002b0, 0x000002c1, 0x000002bf, 0x000500b0, + 0x00000014, 0x000002b4, 0x00000437, 0x0000000c, 0x000400f6, 0x000002c2, 0x000002bf, 0x00000000, 0x000400fa, + 0x000002b4, 0x000002b5, 0x000002c2, 0x000200f8, 0x000002b5, 0x0003003e, 0x000002c7, 0x00000386, 0x00050041, + 0x00000007, 0x000002c9, 0x000002c7, 0x00000437, 0x0004003d, 0x00000006, 0x000002b8, 0x000002c9, 0x0003003e, + 0x000002ca, 0x00000097, 0x00050041, 0x00000007, 0x000002cc, 0x000002ca, 0x00000437, 0x0004003d, 0x00000006, + 0x000002bb, 0x000002cc, 0x000500ab, 0x00000014, 0x000002bc, 0x000002b8, 0x000002bb, 0x000300f7, 0x000002be, + 0x00000000, 0x000400fa, 0x000002bc, 0x000002bd, 0x000002be, 0x000200f8, 0x000002bd, 0x000200f9, 0x000002c2, + 0x000200f8, 0x000002be, 0x000200f9, 0x000002bf, 0x000200f8, 0x000002bf, 0x00050080, 0x00000006, 0x000002c1, + 0x00000437, 0x00000060, 0x000200f9, 0x000002b1, 0x000200f8, 0x000002c2, 0x000700f5, 0x00000014, 0x0000043b, + 0x000003eb, 0x000002b1, 0x00000090, 0x000002bd, 0x000700f5, 0x00000014, 0x00000438, 0x00000090, 0x000002b1, + 0x00000094, 0x000002bd, 0x000300f7, 0x000002c4, 0x00000000, 0x000400fa, 0x00000438, 0x000002c5, 0x000002c4, + 0x000200f8, 0x000002c4, 0x000200f9, 0x000002c5, 0x000200f8, 0x000002c5, 0x000700f5, 0x00000014, 0x0000043a, + 0x0000043b, 0x000002c2, 0x00000094, 0x000002c4, 0x000200f9, 0x00000157, 0x000200f8, 0x00000157, 0x000600a9, + 0x00000006, 0x00000463, 0x0000043a, 0x0000012e, 0x00000435, 0x000600a9, 0x00000006, 0x00000464, 0x0000043a, + 0x00000130, 0x00000433, 0x000600a9, 0x00000006, 0x00000465, 0x0000043a, 0x00000132, 0x00000431, 0x000600a9, + 0x00000006, 0x00000466, 0x0000043a, 0x00000134, 0x0000042f, 0x000600a9, 0x00000006, 0x00000467, 0x0000043a, + 0x00000136, 0x0000042d, 0x000600a9, 0x00000006, 0x00000468, 0x0000043a, 0x00000138, 0x0000042b, 0x000600a9, + 0x00000006, 0x00000469, 0x0000043a, 0x0000013a, 0x00000429, 0x000600a9, 0x00000006, 0x0000046a, 0x0000043a, + 0x0000013c, 0x00000427, 0x00050041, 0x00000129, 0x0000015c, 0x00000152, 0x00000083, 0x00050041, 0x0000015e, + 0x0000015f, 0x0000015c, 0x00000083, 0x00050041, 0x00000161, 0x00000162, 0x0000015f, 0x00000083, 0x0005003e, + 0x00000162, 0x00000463, 0x00000002, 0x00000004, 0x00050041, 0x00000161, 0x00000164, 0x0000015f, 0x00000060, + 0x0005003e, 0x00000164, 0x00000464, 0x00000002, 0x00000004, 0x00050041, 0x00000161, 0x00000166, 0x0000015f, + 0x000000a5, 0x0005003e, 0x00000166, 0x00000465, 0x00000002, 0x00000004, 0x00050041, 0x00000161, 0x00000168, + 0x0000015f, 0x000000ca, 0x0005003e, 0x00000168, 0x00000466, 0x00000002, 0x00000004, 0x00050041, 0x00000161, + 0x0000016a, 0x0000015f, 0x000000cd, 0x0005003e, 0x0000016a, 0x00000467, 0x00000002, 0x00000004, 0x00050041, + 0x00000161, 0x0000016c, 0x0000015f, 0x000000d0, 0x0005003e, 0x0000016c, 0x00000468, 0x00000002, 0x00000004, + 0x00050041, 0x00000161, 0x0000016e, 0x0000015f, 0x000000d3, 0x0005003e, 0x0000016e, 0x00000469, 0x00000002, + 0x00000004, 0x00050041, 0x00000161, 0x00000170, 0x0000015f, 0x000000d6, 0x0005003e, 0x00000170, 0x0000046a, + 0x00000002, 0x00000004, 0x000200f9, 0x00000172, 0x000200f8, 0x00000172, 0x000100fd, 0x00010038 }; const std::array g_replacer_bda_comp = { From e136f23030957c528bf334c1a7d4ce68ce0a96f9 Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Mon, 27 Jan 2025 11:56:58 +0100 Subject: [PATCH 6/9] rework I/O address calculation, account for data-payloads and pass-through --- framework/decode/vulkan_address_replacer.cpp | 28 +++++++++++++------ .../decode/vulkan_replay_consumer_base.cpp | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/framework/decode/vulkan_address_replacer.cpp b/framework/decode/vulkan_address_replacer.cpp index 8550c76cf3..beda048148 100644 --- a/framework/decode/vulkan_address_replacer.cpp +++ b/framework/decode/vulkan_address_replacer.cpp @@ -354,7 +354,7 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( } auto input_addresses = reinterpret_cast(pipeline_context_sbt.input_handle_buffer.mapped_data); - std::unordered_map num_handles_map; + std::unordered_map num_addresses_map; uint32_t num_addresses = 0; { @@ -365,10 +365,18 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( { if (region != nullptr && region->size != 0 && region->stride != 0) { - num_handles_map[region] = region->size / region->stride; + num_addresses_map[region] = region->size / capture_ray_properties_->shaderGroupHandleSize; - for (uint32_t offset = 0; offset < region->size; offset += region->stride) + uint32_t capture_handle_size = capture_ray_properties_->shaderGroupHandleSize; + if (region->stride > capture_handle_size) { + uint32_t payload_size = region->stride - capture_handle_size; + GFXRECON_LOG_DEBUG("Extra data in sbt: %d", payload_size); + } + + for (uint32_t offset = 0; offset < region->size; offset += capture_handle_size) + { + // input-address are handles and extra data input_addresses[num_addresses++] = region->deviceAddress + offset; } } @@ -430,15 +438,17 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( uint32_t num_handles_limit = region->size / region->stride; auto group_size = static_cast(util::aligned_value( num_handles_limit * handle_size_aligned, replay_ray_properties_->shaderGroupBaseAlignment)); - sbt_offset += group_size; - // adjust group-size - region->size = group_size; - region->stride = handle_size_aligned; + // increase group-size/stride, if required + region->size = std::max(group_size, region->size); + region->stride = std::max(handle_size_aligned, region->stride); + + sbt_offset += region->size; } } // raygen: stride == size - raygen_sbt->size = raygen_sbt->stride = replay_ray_properties_->shaderGroupBaseAlignment; + raygen_sbt->size = raygen_sbt->stride = + util::aligned_value(raygen_sbt->stride, replay_ray_properties_->shaderGroupBaseAlignment); if (!create_buffer(shadow_buf_context, sbt_offset, @@ -457,7 +467,7 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( { if (region != nullptr && region->size != 0 && region->stride != 0) { - uint32_t num_handles = num_handles_map[region]; + uint32_t num_handles = num_addresses_map[region]; // assign shadow-sbt-address region->deviceAddress = shadow_buf_context.device_address + sbt_offset; diff --git a/framework/decode/vulkan_replay_consumer_base.cpp b/framework/decode/vulkan_replay_consumer_base.cpp index a3fff4e7d5..f0daf2d003 100644 --- a/framework/decode/vulkan_replay_consumer_base.cpp +++ b/framework/decode/vulkan_replay_consumer_base.cpp @@ -7829,7 +7829,7 @@ VkResult VulkanReplayConsumerBase::OverrideCreateAccelerationStructureKHR( auto entry = device_info->opaque_addresses.find(capture_id); if (entry != device_info->opaque_addresses.end()) { - modified_create_info.deviceAddress = entry->second; + modified_create_info.deviceAddress = entry->second; // assign opaque address, same for capture and replay acceleration_structure_info->capture_address = acceleration_structure_info->replay_address = From f12a476c88dc24488174af26a80ed2eb3eb8be77 Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Tue, 28 Jan 2025 12:54:59 +0100 Subject: [PATCH 7/9] Drop GL_GOOGLE_include_directive from internal compute-shader, not used --- framework/decode/vulkan_address_replacer_shaders.h | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/framework/decode/vulkan_address_replacer_shaders.h b/framework/decode/vulkan_address_replacer_shaders.h index 5612c76245..adf220cea2 100644 --- a/framework/decode/vulkan_address_replacer_shaders.h +++ b/framework/decode/vulkan_address_replacer_shaders.h @@ -32,7 +32,6 @@ GFXRECON_BEGIN_NAMESPACE(decode) #if 0 #version 460 #extension GL_EXT_buffer_reference2 : require -#extension GL_GOOGLE_include_directive : require /// -> hash.glsl uint murmur_32_scramble(uint k) @@ -158,7 +157,6 @@ void main() #if 0 #version 460 #extension GL_EXT_buffer_reference2 : require -#extension GL_GOOGLE_include_directive : require /// -> hash.glsl uint murmur_32_scramble(uint k) @@ -280,7 +278,7 @@ void main() } #endif // g_replacer_bda_comp -static const std::array g_replacer_sbt_comp = { +static const std::array g_replacer_sbt_comp = { 0x07230203, 0x00010300, 0x0008000b, 0x0000046b, 0x00000000, 0x00020011, 0x00000001, 0x00020011, 0x000014b6, 0x00020011, 0x000014e3, 0x0008000a, 0x5f565053, 0x5f545845, 0x63736564, 0x74706972, 0x695f726f, 0x7865646e, 0x00676e69, 0x0009000a, 0x5f565053, 0x5f52484b, 0x73796870, 0x6c616369, 0x6f74735f, 0x65676172, 0x6675625f, @@ -288,9 +286,7 @@ static const std::array g_replacer_sbt_comp = { 0x00000001, 0x0006000f, 0x00000005, 0x00000004, 0x6e69616d, 0x00000000, 0x00000108, 0x00060010, 0x00000004, 0x00000011, 0x00000020, 0x00000001, 0x00000001, 0x00030003, 0x00000002, 0x000001cc, 0x00070004, 0x455f4c47, 0x625f5458, 0x65666675, 0x65725f72, 0x65726566, 0x0065636e, 0x00080004, 0x455f4c47, 0x625f5458, 0x65666675, - 0x65725f72, 0x65726566, 0x3265636e, 0x00000000, 0x000a0004, 0x475f4c47, 0x4c474f4f, 0x70635f45, 0x74735f70, - 0x5f656c79, 0x656e696c, 0x7269645f, 0x69746365, 0x00006576, 0x00080004, 0x475f4c47, 0x4c474f4f, 0x6e695f45, - 0x64756c63, 0x69645f65, 0x74636572, 0x00657669, 0x00040005, 0x00000004, 0x6e69616d, 0x00000000, 0x00080005, + 0x65725f72, 0x65726566, 0x3265636e, 0x00000000, 0x00040005, 0x00000004, 0x6e69616d, 0x00000000, 0x00080005, 0x00000025, 0x64616873, 0x675f7265, 0x70756f72, 0x6e61685f, 0x5f656c64, 0x00000074, 0x00050006, 0x00000025, 0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00000026, 0x68736168, 0x5f70616d, 0x6d657469, 0x0000745f, 0x00040006, 0x00000026, 0x00000000, 0x0079656b, 0x00050006, 0x00000026, 0x00000001, 0x756c6176, 0x00000065, @@ -531,7 +527,7 @@ static const std::array g_replacer_sbt_comp = { 0x00000002, 0x00000004, 0x000200f9, 0x00000172, 0x000200f8, 0x00000172, 0x000100fd, 0x00010038 }; -const std::array g_replacer_bda_comp = { +const std::array g_replacer_bda_comp = { 0x07230203, 0x00010300, 0x0008000b, 0x00000372, 0x00000000, 0x00020011, 0x00000001, 0x00020011, 0x000014b6, 0x00020011, 0x000014e3, 0x0008000a, 0x5f565053, 0x5f545845, 0x63736564, 0x74706972, 0x695f726f, 0x7865646e, 0x00676e69, 0x0009000a, 0x5f565053, 0x5f52484b, 0x73796870, 0x6c616369, 0x6f74735f, 0x65676172, 0x6675625f, @@ -539,9 +535,7 @@ const std::array g_replacer_bda_comp = { 0x00000001, 0x0006000f, 0x00000005, 0x00000004, 0x6e69616d, 0x00000000, 0x000000eb, 0x00060010, 0x00000004, 0x00000011, 0x00000020, 0x00000001, 0x00000001, 0x00030003, 0x00000002, 0x000001cc, 0x00070004, 0x455f4c47, 0x625f5458, 0x65666675, 0x65725f72, 0x65726566, 0x0065636e, 0x00080004, 0x455f4c47, 0x625f5458, 0x65666675, - 0x65725f72, 0x65726566, 0x3265636e, 0x00000000, 0x000a0004, 0x475f4c47, 0x4c474f4f, 0x70635f45, 0x74735f70, - 0x5f656c79, 0x656e696c, 0x7269645f, 0x69746365, 0x00006576, 0x00080004, 0x475f4c47, 0x4c474f4f, 0x6e695f45, - 0x64756c63, 0x69645f65, 0x74636572, 0x00657669, 0x00040005, 0x00000004, 0x6e69616d, 0x00000000, 0x00080005, + 0x65725f72, 0x65726566, 0x3265636e, 0x00000000, 0x00040005, 0x00000004, 0x6e69616d, 0x00000000, 0x00080005, 0x00000025, 0x66667562, 0x645f7265, 0x63697665, 0x64615f65, 0x73657264, 0x00745f73, 0x00050006, 0x00000025, 0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00000026, 0x68736168, 0x5f70616d, 0x6d657469, 0x0000745f, 0x00040006, 0x00000026, 0x00000000, 0x0079656b, 0x00050006, 0x00000026, 0x00000001, 0x756c6176, 0x00000065, From a848a37e6d99c808a14af128cf0a11bdae9826f8 Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Tue, 28 Jan 2025 13:24:25 +0100 Subject: [PATCH 8/9] Use accelerationStructureCaptureReplay only when allocator supports opaque addresses --- framework/decode/vulkan_replay_consumer_base.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/decode/vulkan_replay_consumer_base.cpp b/framework/decode/vulkan_replay_consumer_base.cpp index f0daf2d003..81e95f464c 100644 --- a/framework/decode/vulkan_replay_consumer_base.cpp +++ b/framework/decode/vulkan_replay_consumer_base.cpp @@ -7821,7 +7821,11 @@ VkResult VulkanReplayConsumerBase::OverrideCreateAccelerationStructureKHR( acceleration_structure_info->type = replay_create_info->type; acceleration_structure_info->buffer = replay_create_info->buffer; - if (device_info->property_feature_info.feature_accelerationStructureCaptureReplay) + // even when available, the feature also requires allocator-support + bool use_capture_replay_feature = device_info->property_feature_info.feature_accelerationStructureCaptureReplay && + device_info->allocator->SupportsOpaqueDeviceAddresses(); + + if (use_capture_replay_feature) { // Set opaque device address VkAccelerationStructureCreateInfoKHR modified_create_info = (*replay_create_info); From a68aeea279636808d8974d8771cc1cfaf19fb02b Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Wed, 29 Jan 2025 09:19:51 +0100 Subject: [PATCH 9/9] work on review-comments --- framework/decode/vulkan_address_replacer.cpp | 29 ++++++++++---------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/framework/decode/vulkan_address_replacer.cpp b/framework/decode/vulkan_address_replacer.cpp index beda048148..004c9930db 100644 --- a/framework/decode/vulkan_address_replacer.cpp +++ b/framework/decode/vulkan_address_replacer.cpp @@ -358,25 +358,19 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( uint32_t num_addresses = 0; { - const auto handle_size_capture = static_cast(util::aligned_value( + const auto handle_size_aligned = static_cast(util::aligned_value( capture_ray_properties_->shaderGroupHandleSize, capture_ray_properties_->shaderGroupHandleAlignment)); for (const auto& region : { raygen_sbt, miss_sbt, hit_sbt, callable_sbt }) { if (region != nullptr && region->size != 0 && region->stride != 0) { - num_addresses_map[region] = region->size / capture_ray_properties_->shaderGroupHandleSize; - - uint32_t capture_handle_size = capture_ray_properties_->shaderGroupHandleSize; - if (region->stride > capture_handle_size) - { - uint32_t payload_size = region->stride - capture_handle_size; - GFXRECON_LOG_DEBUG("Extra data in sbt: %d", payload_size); - } + // NOTE: if region->stride > capture_handle_size, the excess-data is considered a shaderRecord + num_addresses_map[region] = region->size / handle_size_aligned; - for (uint32_t offset = 0; offset < region->size; offset += capture_handle_size) + // populate input-addresses, which are handles to replace and shaderRecord data to pass-through + for (uint32_t offset = 0; offset < region->size; offset += handle_size_aligned) { - // input-address are handles and extra data input_addresses[num_addresses++] = region->deviceAddress + offset; } } @@ -435,9 +429,9 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( { if (region != nullptr && region->size != 0 && region->stride != 0) { - uint32_t num_handles_limit = region->size / region->stride; - auto group_size = static_cast(util::aligned_value( - num_handles_limit * handle_size_aligned, replay_ray_properties_->shaderGroupBaseAlignment)); + uint32_t num_handles = num_addresses_map[region]; + auto group_size = static_cast(util::aligned_value( + num_handles * handle_size_aligned, replay_ray_properties_->shaderGroupBaseAlignment)); // increase group-size/stride, if required region->size = std::max(group_size, region->size); @@ -515,6 +509,9 @@ void VulkanAddressReplacer::ProcessCmdTraceRays( GFXRECON_ASSERT(previous_pipeline); if (previous_pipeline != nullptr) { + GFXRECON_LOG_INFO_ONCE( + "VulkanAddressReplacer::ProcessCmdTraceRays: Replay is injecting compute-dispatches, " + "originally bound compute-pipelines are restored."); device_table_->CmdBindPipeline( command_buffer_info->handle, VK_PIPELINE_BIND_POINT_COMPUTE, previous_pipeline->handle); } @@ -844,8 +841,12 @@ void VulkanAddressReplacer::ProcessCmdBuildAccelerationStructuresKHR( auto* previous_pipeline = object_table_->GetVkPipelineInfo( command_buffer_info->bound_pipelines.at(VK_PIPELINE_BIND_POINT_COMPUTE)); GFXRECON_ASSERT(previous_pipeline); + if (previous_pipeline != nullptr) { + GFXRECON_LOG_INFO_ONCE("VulkanAddressReplacer::ProcessCmdBuildAccelerationStructuresKHR: Replay is " + "injecting compute-dispatches, " + "originally bound compute-pipelines are restored."); device_table_->CmdBindPipeline( command_buffer_info->handle, VK_PIPELINE_BIND_POINT_COMPUTE, previous_pipeline->handle); }