From 32318530eee721a1a2f487ea07ab616301ec9471 Mon Sep 17 00:00:00 2001 From: Ilya Doroshenko Date: Tue, 26 Nov 2024 20:54:37 +0100 Subject: [PATCH] [Release] Feature/0.4.0 (#198) * multiview working on Vulkan, but not on dx * Proof of not working stuff * top shader * finally working multiview * Feature/x11 (#200) * added x11 support * minor change * Restyled Feature/x11 (#201) * Restyled by clang-format * Restyled by cmake-format --------- Co-authored-by: Restyled.io --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Restyled.io * Feature/sdl (#202) * factored out a lot of code made sdl3 the default example window system * revamped swapchain on vulkan side added multiview example * removed unnecessary build targets * revisited lut example removed old ones examples are finished, moving to the next tasks * agility sdk fix * updated readme * Restyled Feature/sdl (#203) * Restyled by astyle * Restyled by clang-format * Restyled by cmake-format * Restyled by prettier-markdown * Restyled by whitespace --------- Co-authored-by: Restyled.io --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Restyled.io * fixes for linux platform * Bindless descriptor tables (#204) * step 1: create mock of bindless desctiptor tables * moved descriptor buffer to an extension added descriptor storage for bindless resources reserved place for root descriptors * Restyled Bindless descriptor tables (#205) * Restyled by astyle * Restyled by clang-format * Restyled by cmake-format * Restyled by prettier-markdown * Restyled by whitespace --------- Co-authored-by: Restyled.io --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Restyled.io * fixed build for linux * rootsig for dx only impl * DXIL overlap problem solved (through bruteforce though) * Added push descriptor support Added space overlaps * fixed bindings for push descriptor * why did I use update after bind? * made inline array of render targets * const correctness for structures * fixed multiview not working with depth * com_ptr again, fixed texture replacement resulting in leak added non-uniform root signature creation * fixed textures copy to and from buffer not taking into account offsets * feature bump * tested on Vulkan * Restyled Feature/0.4.0 (#199) * Restyled by astyle * Restyled by clang-format * Restyled by cmake-format * Restyled by prettier-markdown * Restyled by whitespace --------- Co-authored-by: Restyled.io --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Restyled.io --- .gitignore | 3 +- CMakeLists.txt | 3 +- CMakePresets.json | 40 - Changelog.md | 20 + README.md | 65 +- bindings/wisdom.cpp | 308 +- bindings/wisdom.h | 2000 +- bindings/wisdom_exports.h | 41 +- bindings/wisdom_ext.inl | 115 + cmake/functions.cmake | 22 +- cmake/platform/wisdom-x11-config.cmake.in | 19 + cmake/wisdom-deps.cmake.in | 4 +- examples/CMakeLists.txt | 22 +- examples/basic/CMakeLists.txt | 5 + .../basic/descriptor_storage/CMakeLists.txt | 17 + .../basic/descriptor_storage/entry_main.cpp | 253 + examples/basic/lut/CMakeLists.txt | 30 + examples/basic/lut/entry_main.cpp | 435 + examples/{custom => basic}/lut/image.png | Bin examples/{custom => basic}/lut/lut.cube | 0 examples/{custom => basic}/lut/lut_loader.cpp | 0 examples/{custom => basic}/lut/lut_loader.h | 0 examples/basic/multiview/CMakeLists.txt | 17 + examples/basic/multiview/entry_main.cpp | 398 + examples/{ => basic}/shaders/CMakeLists.txt | 17 +- .../descriptor_storage/desc_storage.ps.hlsl | 13 + .../descriptor_storage/desc_storage.vs.hlsl | 34 + .../{custom => basic/shaders}/lut/lut.ps.hlsl | 20 +- .../{custom => basic/shaders}/lut/lut.vs.hlsl | 0 .../basic/shaders/multiview/multiview.ps.hlsl | 14 + .../basic/shaders/multiview/multiview.vs.hlsl | 12 + .../multiview/multiview_screen.ps.hlsl | 28 + .../multiview/multiview_screen.vs.hlsl | 13 + examples/cmake/deps.cmake | 59 + examples/cmake/get_cpm.cmake | 24 + examples/common/CMakeLists.txt | 45 + .../src => common}/keyboard.cpp | 6 +- .../lut_windowed => common}/keyboard.h | 14 +- examples/common/mouse.cpp | 129 + .../{custom/lut_windowed => common}/mouse.h | 66 +- examples/common/window.cpp | 117 + examples/common/window.h | 94 + examples/common/window_event.h | 10 + examples/common/wis_helper.cpp | 82 + examples/common/wis_helper.h | 164 + examples/common/wis_swapchain.h | 111 + examples/custom/CMakeLists.txt | 5 +- examples/custom/bindings/entry_main.c | 1 + examples/custom/cross_device/CMakeLists.txt | 6 +- examples/custom/cross_device/transfer_node.h | 1 + examples/custom/cross_device/work_node.cpp | 33 +- examples/custom/cross_device/work_node.h | 2 + examples/custom/lut/CMakeLists.txt | 39 - examples/custom/lut/app.cpp | 585 - examples/custom/lut/app.h | 55 - examples/custom/lut/entry_main.cpp | 7 - examples/custom/lut_windowed/CMakeLists.txt | 54 - examples/custom/lut_windowed/app.cpp | 643 - examples/custom/lut_windowed/app.h | 64 - examples/custom/lut_windowed/entry_main.cpp | 7 - examples/custom/lut_windowed/image.png | Bin 26271 -> 0 bytes examples/custom/lut_windowed/keyboard.cpp | 100 - examples/custom/lut_windowed/lut.cube | 32776 ---------------- examples/custom/lut_windowed/lut.ps.hlsl | 89 - examples/custom/lut_windowed/lut.vs.hlsl | 11 - examples/custom/lut_windowed/lut_loader.cpp | 119 - examples/custom/lut_windowed/lut_loader.h | 29 - examples/custom/lut_windowed/menu.h | 59 - examples/custom/lut_windowed/mouse.cpp | 122 - examples/custom/lut_windowed/resource.h | 1 - .../custom/lut_windowed/resources/TLR.ico | Bin 212907 -> 0 bytes .../custom/lut_windowed/resources/WinD3D.rc | Bin 9944 -> 0 bytes .../custom/lut_windowed/resources/resource.h | 22 - examples/custom/lut_windowed/util.cpp | 28 - examples/custom/lut_windowed/util.h | 43 - examples/custom/lut_windowed/window.cpp | 498 - examples/custom/lut_windowed/window.h | 170 - examples/custom/multimon/CMakeLists.txt | 6 +- examples/custom/multimon/transfer_node.cpp | 43 +- examples/custom/multimon/transfer_node.h | 2 + examples/custom/multimon/work_node.cpp | 38 +- examples/custom/multimon/work_node.h | 2 + examples/deps/CMakeLists.txt | 81 - examples/platform/CMakeLists.txt | 13 - .../hello-triangle-kdgui-t/CMakeLists.txt | 22 - .../hello-triangle-kdgui-t/entry_main.cpp | 39 - .../hello-triangle-kdgui-t/window.cpp | 142 - .../platform/hello-triangle-kdgui-t/window.h | 54 - .../hello-triangle-win32-t/CMakeLists.txt | 29 - .../include/example/keyboard.h | 76 - .../include/example/menu.h | 59 - .../include/example/mouse.h | 149 - .../include/example/util.h | 43 - .../include/example/window.h | 170 - .../hello-triangle-win32-t/include/pch.h | 0 .../hello-triangle-win32-t/include/resource.h | 1 - .../hello-triangle-win32-t/resources/TLR.ico | Bin 212907 -> 0 bytes .../resources/WinD3D.rc | Bin 9944 -> 0 bytes .../resources/resource.h | 22 - .../hello-triangle-win32-t/src/entry_main.cpp | 41 - .../hello-triangle-win32-t/src/mouse.cpp | 122 - .../hello-triangle-win32-t/src/util.cpp | 28 - .../hello-triangle-win32-t/src/window.cpp | 498 - .../hello-triangle-winrt/CMakeLists.txt | 75 - .../platform/hello-triangle-winrt/app.cpp | 0 examples/platform/hello-triangle-winrt/app.h | 18 - .../platform/hello-triangle-winrt/deps.cmake | 23 - .../hello-triangle-winrt/entry_main.cpp | 18 - .../hello-triangle-winrt/package.appxmanifest | 47 - examples/platform/hello-triangle-winrt/pch.h | 81 - .../platform/hello-triangle-winrt/window.h | 378 - examples/platform/shared/CMakeLists.txt | 15 - examples/platform/shared/app.cpp | 482 - examples/platform/shared/app.h | 72 - examples/shaders/forward/example.ps.hlsl | 144 - examples/shaders/forward/example.vs.hlsl | 21 - generator/generator.cpp | 136 +- generator/generator.h | 14 +- tests/basic/CMakeLists.txt | 3 +- tests/basic/copy_tests.cpp | 126 + tests/basic/relaxed_destruction_order.cpp | 41 +- tests/manual/extended_allocation/test.cpp | 2 + wisdom/dx12.cmake | 3 +- wisdom/extensions/CMakeLists.txt | 10 + .../debug_info/wisdom/wisdom_debug.h | 4 +- .../descriptor_buffer/CMakeLists.txt | 88 + .../wisdom/dx12_descriptor_buffer.h | 120 + .../wisdom/gen/vk_functions.in | 7 + .../wisdom/generated/vk_functions.hpp | 33 + .../wisdom/impl/dx12_descriptor_buffer.cpp | 40 + .../descriptor_buffer/wisdom/impl/impl.dx.cpp | 189 + .../descriptor_buffer/wisdom/impl/impl.vk.cpp | 351 + .../wisdom/impl/vk_descriptor_buffer.cpp | 62 + .../wisdom/vk_descriptor_buffer.h | 187 + .../wisdom/wisdom_descriptor_buffer.h | 327 + .../extended_allocation/CMakeLists.txt | 5 + .../wisdom/impl/impl.dx.cpp | 4 +- .../include/wisdom/dx12/dx12_command_list.h | 81 +- .../include/wisdom/dx12/dx12_command_queue.h | 2 +- .../wisdom/dx12/dx12_descriptor_buffer.h | 171 - .../wisdom/dx12/dx12_descriptor_storage.h | 119 + wisdom/include/wisdom/dx12/dx12_device.h | 107 +- wisdom/include/wisdom/dx12/dx12_resource.h | 2 +- .../include/wisdom/dx12/dx12_root_signature.h | 9 +- wisdom/include/wisdom/dx12/dx12_views.h | 4 +- .../wisdom/dx12/impl/dx12_command_list.cpp | 124 +- .../dx12/impl/dx12_descriptor_buffer.cpp | 72 - .../include/wisdom/dx12/impl/dx12_device.cpp | 441 +- wisdom/include/wisdom/generated/api/api.h | 141 +- .../wisdom/generated/dx12/dx12_structs.hpp | 43 +- .../wisdom/generated/vulkan/vk_functions.hpp | 142 +- .../wisdom/generated/vulkan/vk_structs.hpp | 45 +- wisdom/include/wisdom/global/definitions.h | 7 +- wisdom/include/wisdom/util/com_ptr.h | 29 +- .../include/wisdom/vulkan/gen/vk_functions.in | 12 +- .../wisdom/vulkan/impl/vk_command_list.cpp | 74 +- .../vulkan/impl/vk_descriptor_buffer.cpp | 129 - .../include/wisdom/vulkan/impl/vk_device.cpp | 407 +- .../include/wisdom/vulkan/impl/vk_fence.cpp | 16 +- .../wisdom/vulkan/impl/vk_swapchain.cpp | 73 +- .../include/wisdom/vulkan/vk_command_list.h | 78 +- .../include/wisdom/vulkan/vk_command_queue.h | 2 +- .../wisdom/vulkan/vk_descriptor_buffer.h | 214 - .../wisdom/vulkan/vk_descriptor_storage.h | 172 + wisdom/include/wisdom/vulkan/vk_device.h | 251 +- wisdom/include/wisdom/vulkan/vk_device_ext.h | 93 +- wisdom/include/wisdom/vulkan/vk_resource.h | 2 +- wisdom/include/wisdom/vulkan/vk_swapchain.h | 5 +- wisdom/include/wisdom/vulkan/vk_views.h | 4 +- wisdom/include/wisdom/wisdom.hpp | 12 +- wisdom/platform/CMakeLists.txt | 2 +- .../platform/wayland/wisdom/wisdom_wayland.h | 6 +- .../windows/wisdom/wisdom_windows.cpp | 4 +- wisdom/platform/wisdom/wisdom_platform.h | 3 + wisdom/platform/x11/CMakeLists.txt | 55 + wisdom/platform/x11/wisdom/wisdom_x11.cpp | 29 + wisdom/platform/x11/wisdom/wisdom_x11.h | 65 + wisdom/vulkan.cmake | 3 +- xml/enums.xml | 64 +- xml/structs.xml | 71 +- xml/wis.xml | 285 +- 181 files changed, 7478 insertions(+), 41456 deletions(-) create mode 100644 cmake/platform/wisdom-x11-config.cmake.in create mode 100644 examples/basic/CMakeLists.txt create mode 100644 examples/basic/descriptor_storage/CMakeLists.txt create mode 100644 examples/basic/descriptor_storage/entry_main.cpp create mode 100644 examples/basic/lut/CMakeLists.txt create mode 100644 examples/basic/lut/entry_main.cpp rename examples/{custom => basic}/lut/image.png (100%) rename examples/{custom => basic}/lut/lut.cube (100%) rename examples/{custom => basic}/lut/lut_loader.cpp (100%) rename examples/{custom => basic}/lut/lut_loader.h (100%) create mode 100644 examples/basic/multiview/CMakeLists.txt create mode 100644 examples/basic/multiview/entry_main.cpp rename examples/{ => basic}/shaders/CMakeLists.txt (60%) create mode 100644 examples/basic/shaders/descriptor_storage/desc_storage.ps.hlsl create mode 100644 examples/basic/shaders/descriptor_storage/desc_storage.vs.hlsl rename examples/{custom => basic/shaders}/lut/lut.ps.hlsl (87%) rename examples/{custom => basic/shaders}/lut/lut.vs.hlsl (100%) create mode 100644 examples/basic/shaders/multiview/multiview.ps.hlsl create mode 100644 examples/basic/shaders/multiview/multiview.vs.hlsl create mode 100644 examples/basic/shaders/multiview/multiview_screen.ps.hlsl create mode 100644 examples/basic/shaders/multiview/multiview_screen.vs.hlsl create mode 100644 examples/cmake/deps.cmake create mode 100644 examples/cmake/get_cpm.cmake create mode 100644 examples/common/CMakeLists.txt rename examples/{platform/hello-triangle-win32-t/src => common}/keyboard.cpp (95%) rename examples/{custom/lut_windowed => common}/keyboard.h (89%) create mode 100644 examples/common/mouse.cpp rename examples/{custom/lut_windowed => common}/mouse.h (68%) create mode 100644 examples/common/window.cpp create mode 100644 examples/common/window.h create mode 100644 examples/common/window_event.h create mode 100644 examples/common/wis_helper.cpp create mode 100644 examples/common/wis_helper.h create mode 100644 examples/common/wis_swapchain.h delete mode 100644 examples/custom/lut/CMakeLists.txt delete mode 100644 examples/custom/lut/app.cpp delete mode 100644 examples/custom/lut/app.h delete mode 100644 examples/custom/lut/entry_main.cpp delete mode 100644 examples/custom/lut_windowed/CMakeLists.txt delete mode 100644 examples/custom/lut_windowed/app.cpp delete mode 100644 examples/custom/lut_windowed/app.h delete mode 100644 examples/custom/lut_windowed/entry_main.cpp delete mode 100644 examples/custom/lut_windowed/image.png delete mode 100644 examples/custom/lut_windowed/keyboard.cpp delete mode 100644 examples/custom/lut_windowed/lut.cube delete mode 100644 examples/custom/lut_windowed/lut.ps.hlsl delete mode 100644 examples/custom/lut_windowed/lut.vs.hlsl delete mode 100644 examples/custom/lut_windowed/lut_loader.cpp delete mode 100644 examples/custom/lut_windowed/lut_loader.h delete mode 100644 examples/custom/lut_windowed/menu.h delete mode 100644 examples/custom/lut_windowed/mouse.cpp delete mode 100644 examples/custom/lut_windowed/resource.h delete mode 100644 examples/custom/lut_windowed/resources/TLR.ico delete mode 100644 examples/custom/lut_windowed/resources/WinD3D.rc delete mode 100644 examples/custom/lut_windowed/resources/resource.h delete mode 100644 examples/custom/lut_windowed/util.cpp delete mode 100644 examples/custom/lut_windowed/util.h delete mode 100644 examples/custom/lut_windowed/window.cpp delete mode 100644 examples/custom/lut_windowed/window.h delete mode 100644 examples/deps/CMakeLists.txt delete mode 100644 examples/platform/CMakeLists.txt delete mode 100644 examples/platform/hello-triangle-kdgui-t/CMakeLists.txt delete mode 100644 examples/platform/hello-triangle-kdgui-t/entry_main.cpp delete mode 100644 examples/platform/hello-triangle-kdgui-t/window.cpp delete mode 100644 examples/platform/hello-triangle-kdgui-t/window.h delete mode 100644 examples/platform/hello-triangle-win32-t/CMakeLists.txt delete mode 100644 examples/platform/hello-triangle-win32-t/include/example/keyboard.h delete mode 100644 examples/platform/hello-triangle-win32-t/include/example/menu.h delete mode 100644 examples/platform/hello-triangle-win32-t/include/example/mouse.h delete mode 100644 examples/platform/hello-triangle-win32-t/include/example/util.h delete mode 100644 examples/platform/hello-triangle-win32-t/include/example/window.h delete mode 100644 examples/platform/hello-triangle-win32-t/include/pch.h delete mode 100644 examples/platform/hello-triangle-win32-t/include/resource.h delete mode 100644 examples/platform/hello-triangle-win32-t/resources/TLR.ico delete mode 100644 examples/platform/hello-triangle-win32-t/resources/WinD3D.rc delete mode 100644 examples/platform/hello-triangle-win32-t/resources/resource.h delete mode 100644 examples/platform/hello-triangle-win32-t/src/entry_main.cpp delete mode 100644 examples/platform/hello-triangle-win32-t/src/mouse.cpp delete mode 100644 examples/platform/hello-triangle-win32-t/src/util.cpp delete mode 100644 examples/platform/hello-triangle-win32-t/src/window.cpp delete mode 100644 examples/platform/hello-triangle-winrt/CMakeLists.txt delete mode 100644 examples/platform/hello-triangle-winrt/app.cpp delete mode 100644 examples/platform/hello-triangle-winrt/app.h delete mode 100644 examples/platform/hello-triangle-winrt/deps.cmake delete mode 100644 examples/platform/hello-triangle-winrt/entry_main.cpp delete mode 100644 examples/platform/hello-triangle-winrt/package.appxmanifest delete mode 100644 examples/platform/hello-triangle-winrt/pch.h delete mode 100644 examples/platform/hello-triangle-winrt/window.h delete mode 100644 examples/platform/shared/CMakeLists.txt delete mode 100644 examples/platform/shared/app.cpp delete mode 100644 examples/platform/shared/app.h delete mode 100644 examples/shaders/forward/example.ps.hlsl delete mode 100644 examples/shaders/forward/example.vs.hlsl create mode 100644 tests/basic/copy_tests.cpp create mode 100644 wisdom/extensions/descriptor_buffer/CMakeLists.txt create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/dx12_descriptor_buffer.h create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/gen/vk_functions.in create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/generated/vk_functions.hpp create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/impl/dx12_descriptor_buffer.cpp create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/impl/impl.dx.cpp create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/impl/impl.vk.cpp create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/impl/vk_descriptor_buffer.cpp create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/vk_descriptor_buffer.h create mode 100644 wisdom/extensions/descriptor_buffer/wisdom/wisdom_descriptor_buffer.h delete mode 100644 wisdom/include/wisdom/dx12/dx12_descriptor_buffer.h create mode 100644 wisdom/include/wisdom/dx12/dx12_descriptor_storage.h delete mode 100644 wisdom/include/wisdom/dx12/impl/dx12_descriptor_buffer.cpp delete mode 100644 wisdom/include/wisdom/vulkan/impl/vk_descriptor_buffer.cpp delete mode 100644 wisdom/include/wisdom/vulkan/vk_descriptor_buffer.h create mode 100644 wisdom/include/wisdom/vulkan/vk_descriptor_storage.h create mode 100644 wisdom/platform/x11/CMakeLists.txt create mode 100644 wisdom/platform/x11/wisdom/wisdom_x11.cpp create mode 100644 wisdom/platform/x11/wisdom/wisdom_x11.h diff --git a/.gitignore b/.gitignore index a4ed0bad..b173b5b3 100644 --- a/.gitignore +++ b/.gitignore @@ -365,7 +365,6 @@ FodyWeavers.xsd /CMakeSettings.json *.idb .vscode/settings.json -/wisdom/include/wisdom/vulkan/gen/generate_functions.bat - +/**/gen/generate_functions.bat #restyler *.orig \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 5beccd69..d896aa89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ cmake_minimum_required(VERSION 3.22) -set(WISDOM_VERSION "0.3.15") +set(WISDOM_VERSION "0.4.0") project("Wisdom" VERSION ${WISDOM_VERSION}) set(CMAKE_DEBUG_POSTFIX d) @@ -43,7 +43,6 @@ if(WISDOM_BUILD_BINDINGS) add_subdirectory("bindings") endif() if(WISDOM_BUILD_EXAMPLES) - option(WISDOM_EXCLUDE_KDGUI "Exclude KDGui Example from build" ON) add_subdirectory("examples") endif() diff --git a/CMakePresets.json b/CMakePresets.json index a1e0396d..5095527a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -73,37 +73,6 @@ "CMAKE_BUILD_TYPE": "Debug" } }, - { - "name": "x64-debug-vk", - "displayName": "x64 Debug Vk", - "description": "Target Windows (64-bit) with the Visual Studio development environment. (Debug)", - "inherits": "windows-base", - "architecture": { - "value": "x64", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "WISDOM_FORCE_VULKAN": true - } - }, - { - "name": "x64-debug-winrt", - "displayName": "x64 Debug UWP", - "description": "Target Windows (64-bit) with the Visual Studio development environment. (Debug)", - "inherits": "windows-base", - "generator": "Visual Studio 17 2022", - "architecture": { - "value": "x64", - "strategy": "external" - }, - "cacheVariables": { - "CMAKE_BUILD_TYPE": "Debug", - "WISDOM_BUILD_TYPE": "headers", - "CMAKE_SYSTEM_NAME": "WindowsStore", - "CMAKE_SYSTEM_VERSION": "10.0" - } - }, { "name": "x64-release", "displayName": "x64 Release", @@ -113,15 +82,6 @@ "CMAKE_BUILD_TYPE": "RelWithDebInfo" } }, - { - "name": "x64-release-vk", - "displayName": "x64 Release Vk", - "description": "Target Windows (64-bit) with the Visual Studio development environment. (RelWithDebInfo)", - "inherits": "x64-debug-vk", - "cacheVariables": { - "CMAKE_BUILD_TYPE": "RelWithDebInfo" - } - }, { "name": "x64-only-lib", "displayName": "x64 Lib", diff --git a/Changelog.md b/Changelog.md index 6f9110d6..4aa55c63 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,25 @@ # Version History +- 0.4.0 Major Update + + - Fixed Vulkan Swapchain on resize occasionally result in error messages + - Revisited Examples and made them use SDL3 for window creation + - Added common library for examples + - Added Multiview support with example + - Examples are now stored in examples/bin folder with compiled shaders and resources + - Added support for Xlib without XCB for Vulkan + - Moved DescriptorBuffer to its own extension. It is now only possible to use if both VK_EXT_mutable_descriptor_type and VK_EXT_descritpor_buffer are enabled + - Added support for VK_EXT_descriptor_indexing and created DescriptorStorage for bindless descriptors. This is now the default way of creating descriptor tables + - Lifted the restriction of mandatory VK_EXT_mutable_descriptor_type and VK_EXT_descritpor_buffer for Vulkan. It is now possible to use Wisdom with Vulkan 1.2 (with other mandatory extensions of course) + - Renamed RootConstants to PushConstants because it is more common name + - Added support for push descriptors. Maximum number of push descriptors is 8 for now. + - Added new CreateRootSignature method for DX12 and Vulkan. It is now possible to create a root signatures with non-uniform spacing. + +- Bugfixes: + + - Fixed textures not being destroyed correctly in DX12 on replacement (texture1 = std::move(texture2)) was resulting in leaks) + - Fixed DX12 copy texture not working correctly with offsets + - 0.3.15 - Fixed Vulkan default texture barriers diff --git a/README.md b/README.md index 7cf5151f..4f473c92 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![CMake Windows](https://github.com/Agrael1/Wisdom/actions/workflows/cmake.yml/badge.svg) -**Low-level Direct Translation header only Graphics API. Easy to learn, easy to extend, highly performant, multiplatform!** +**Low-level Direct Translation Graphics API. Easy to learn, easy to extend, highly performant, multiplatform!** ## NuGet Link @@ -11,20 +11,21 @@ https://www.nuget.org/packages/Wisdom/ # Why? A lot of old OpenGL solutions are scratching the ceiling of OpenGL potential, and Vulkan is too low-level for most of the tasks. DirectX 12 is a good alternative, but it's not cross-platform. -Wisdom is designed to be a direct translation layer on top of DirectX 12 and Vulkan, with a simple API, that is easy to learn and extend. It's designed to be used in games, simulations, and other heavy computations. -It's not designed to be a rendering engine, but a tool to create one. +Wisdom is designed to be a direct translation layer on top of DirectX 12 and Vulkan, with a simple API, that is easy to learn and extend. +It is still low level, yet more user friendly. It uses a lot of advanced graphics features, like Descriptor Buffer and Direct GPU Upload. -The library is designed to be used in a modern C++20 environment, with a lot of modern C++ features, like concepts, modules, and ranges. It's designed to be used with CMake or NuGet, and it's easy to integrate with your project. -It is also using the fine selection of features from the underlying APIs to provide the best performance possible with wide range of freedom and be future proof. +You can use it even partially, for example initialize device and swapchain, get internals of library objects and use it with your own rendering engine, or use it fully, with all the extensions and features. + +Library transparency makes it a good choice for gradual API replacement. This is further enhanced by the interoperability with other APIs through platform extensions. # Details The API is structured like this: - The basic types are defined, depending on platform of choice. They are **Factory**, **Adapter**, **Device** etc. They are directly implemented, this eliminates memory indirection and potential cache misses. -- The the platform is selected the most suitable to the system: Windows - DirectX 12, MacOS - Metal **[TBD]** -- You can override the platform selection with `WISDOM_FORCE_VULKAN` option on CMake configuration. This will force the library to use Vulkan as a base API. This is useful for debugging Vulkan extensions. -- All calls are done directly, without usage of interfaces/virtual functions. This eliminates call indirection and the projection is direct as if you wrote the code directly inside your functions. +- The platform selects the most suitable implemetation to the system: Windows - DirectX 12, Linux - Vulkan. This is done in compile time. +- You can override the implementation selection with `WISDOM_FORCE_VULKAN` option on CMake configuration. This will force the library to use Vulkan as a base API. This is useful for debugging Vulkan extensions. +- All calls are done directly, without usage of interfaces/virtual functions. This eliminates call indirection and the code is inlined as if you wrote the code directly inside your functions. - Underlying accessibility, all of the internals are accessible using `GetInternal()` and can be used to bridge functionality or to create extensions. All the internal state is immutable for the stability of work between library and extensions. However it's not advised to use internal state directly, since it is platform dependent. Vulkan is compiled on compatible systems and used as default only if there is no other alternative. Vulkan can still be used under supported operating system with explicit types `wis::VKFactory`, `wis::VKDevice` etc. @@ -36,14 +37,18 @@ Vulkan is compiled on compatible systems and used as default only if there is no Supported platforms are: - Windows API (Win32) - DirectX 12 and Vulkan -- Windows Store (UWP) - Microsoft Store certified applications. DirectX 12 only. -- Linux (X11 and Wayland) - Vulkan only +- Windows Store (UWP) - Microsoft Store applications. DirectX 12 only. +- Linux (X11, XCB and Wayland) - Vulkan only # Build This is a CMake project, all the plugins are ensured to download beforehand, so it's enough to just configure the project, everything is going to be downloaded with respect to platform. The later reconfigurations are not reloading the plugins for easy expansion of the library, but if the plugin reload is required, the cache deletion should be done, or change `PLUGINS_LOADED` CMakeCache entry to `FALSE`. +The library does not contain any extra dependencies, except for the ones required by the underlying APIs, such as DX12 Agility SDK and memory allocators. + +If you don't have Vulkan SDK installed on Windows the library will still provide you with DX12 implementation, that comes with Windows system. No administrative rights are required to build or use the library. + # CMake Options - `WISDOM_LOG_LEVEL=debug/warn` set the log level for the library, values are `debug,trace,info,warn,error,critical` log calls under current level are not compiled @@ -64,6 +69,13 @@ There is also a NuPkg available for NuGet consumption in release artifacts. To link library simply use `target_link_libraries(${YOUR_TARGET} PUBLIC wis::wisdom)`. Alternatively if you wish for header only target, there is also `target_link_libraries(${YOUR_TARGET} PUBLIC wis::wisdom-headers)`. +Available targets are: + +- `wis::wisdom` - functional library +- `wis::debug` - debug extension +- `wis::extended-allocation` - extended allocation extension (direct GPU Upload) +- `wis::platform` - platform specific extensions (Swapchain and Interop exports) + # System Requirements **Windows:** @@ -72,30 +84,25 @@ To link library simply use `target_link_libraries(${YOUR_TARGET} PUBLIC wis::wis - CMake 3.22+ Tested on MSVC v143, Visual Studio 2022. -Video card must support DirectX 12.0+ and Enchanced Barriers. +Video card must support DirectX 12.1+ and Enchanced Barriers. for Vulkan: - Vulkan 1.3.2xx+ -Tested on Windows with NVIDIA GeForce GTX 1070 and Linux with RTX A4000 with latest drivers. - -**Windows Store:** +Functionality is tested on NVIDIA GeForce GTX 1070 and RTX A4000 with latest drivers. AMD cards were tested, but with limited functionality. -To Compile for Windows Store with CMake, the following is required: +Best performance is achieved with NVIDIA cards later than GTX 1650 series, because of the descriptor buffer support. -- CMakeSettings: `-DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 -DCMAKE_BUILD_TYPE=Debug/Release/RelWithDebInfo/MinSizeRel` -- Windows 10 SDK 10.0.19041.0+ -- Visual Studio Generator, tested on Visual Studio 2022 (v143) - Ninja generator is not supported -- Installed UWP SDK +Tested on Windows with NVIDIA GeForce GTX 1070 and Linux with RTX A4000 with latest drivers. -To launch a project find generated .sln in build `out/build/{BuildName}/examples/hello-triangle-winrt` folder and launch it with Visual Studio. This is due to deployment requirements of UWP applications, which is performed with Visual Studio. +**Windows Store:** -Or you can install a NuGet package to any Visual studio project. +You can install a NuGet package to any Visual studio project. After the first launch, the project can be launched from the Start Menu. -This type of project does not support Vulkan, since Vulkan does not have UWP surface. +This type of project does not support Vulkan, since Vulkan does not have UWP surface, but the API is the same as for any other platform. Useful when you want to deploy your application to Microsoft Store without too much code rewriting. **Linux** @@ -104,25 +111,15 @@ This type of project does not support Vulkan, since Vulkan does not have UWP sur Video card driver should have Descriptor buffer support. Tested on NVIDIA RTX A4000. -KDUils for the example need some packages to be installed: -`sudo apt install libxkbcommon-dev libxcb-xkb-dev libxkbcommon-x11-dev wayland-scanner++ wayland-protocols` - -Visit https://github.com/KDAB/KDUtils to see more details. -Alternatively you can disable the example with `WISDOM_EXCLUDE_KDGUI=ON` option. - -**MacOS** - -- TBD... When I get my hands on a Mac - # Roadmap The project has Gitub projects enabled, so you can see the progress on the project. For the roadmap, the following features are planned: -- [ ] SDL2 integration +- [x] SDL3 examples - [ ] UWP example - [ ] Elaborate documentation -- [ ] C API generation +- [x] C API generation - [ ] Debugging tools - [ ] Small game engine - [x] Lower CMake version requirement to 3.22 diff --git a/bindings/wisdom.cpp b/bindings/wisdom.cpp index dbb8c9ed..8b74be24 100644 --- a/bindings/wisdom.cpp +++ b/bindings/wisdom.cpp @@ -125,10 +125,23 @@ extern "C" WisResult DX12DeviceCreateGraphicsPipeline(DX12Device self, const DX1 return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::DX12PipelineState." }; return reinterpret_cast(res); } -extern "C" WisResult DX12DeviceCreateRootSignature(DX12Device self, const WisRootConstant* root_constants, uint32_t constants_size, const WisDescriptorTable* tables, uint32_t tables_count, DX12RootSignature* signature) +extern "C" WisResult DX12DeviceCreateRootSignature(DX12Device self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t descriptors_count, uint32_t space_overlap_count, DX12RootSignature* signature) { auto* xself = reinterpret_cast(self); - auto&& [res, value] = xself->CreateRootSignature(reinterpret_cast(root_constants), constants_size, reinterpret_cast(tables), tables_count); + auto&& [res, value] = xself->CreateRootSignature(reinterpret_cast(push_constants), constants_count, reinterpret_cast(push_descriptors), descriptors_count, space_overlap_count); + + if (res.status != wis::Status::Ok) + return reinterpret_cast(res); + + *signature = reinterpret_cast(new (std::nothrow) wis::DX12RootSignature(std::move(value))); + if (!*signature) + return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::DX12RootSignature." }; + return reinterpret_cast(res); +} +extern "C" WisResult DX12DeviceCreateRootSignature2(DX12Device self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t push_descriptors_count, const WisDescriptorSpacing* descriptor_spacing, DX12RootSignature* signature) +{ + auto* xself = reinterpret_cast(self); + auto&& [res, value] = xself->CreateRootSignature2(reinterpret_cast(push_constants), constants_count, reinterpret_cast(push_descriptors), push_descriptors_count, reinterpret_cast(descriptor_spacing)); if (res.status != wis::Status::Ok) return reinterpret_cast(res); @@ -216,33 +229,6 @@ extern "C" WisResult DX12DeviceCreateShaderResource(DX12Device self, DX12Texture return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::DX12ShaderResource." }; return reinterpret_cast(res); } -extern "C" uint32_t DX12DeviceGetDescriptorTableAlignment(DX12Device self, WisDescriptorHeapType heap) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->GetDescriptorTableAlignment(static_cast(heap)); - ; - return res; -} -extern "C" uint32_t DX12DeviceGetDescriptorBufferUnitSize(DX12Device self, WisDescriptorHeapType heap) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->GetDescriptorBufferUnitSize(static_cast(heap)); - ; - return res; -} -extern "C" WisResult DX12DeviceCreateDescriptorBuffer(DX12Device self, WisDescriptorHeapType heap_type, WisDescriptorMemory memory_type, uint64_t size_bytes, DX12DescriptorBuffer* buffer) -{ - auto* xself = reinterpret_cast(self); - auto&& [res, value] = xself->CreateDescriptorBuffer(static_cast(heap_type), static_cast(memory_type), size_bytes); - - if (res.status != wis::Status::Ok) - return reinterpret_cast(res); - - *buffer = reinterpret_cast(new (std::nothrow) wis::DX12DescriptorBuffer(std::move(value))); - if (!*buffer) - return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::DX12DescriptorBuffer." }; - return reinterpret_cast(res); -} extern "C" bool DX12DeviceQueryFeatureSupport(DX12Device self, WisDeviceFeature feature) { auto* xself = reinterpret_cast(self); @@ -251,48 +237,6 @@ extern "C" bool DX12DeviceQueryFeatureSupport(DX12Device self, WisDeviceFeature return res; } -// DX12DescriptorBuffer methods -- -extern "C" void DX12DescriptorBufferDestroy(DX12DescriptorBuffer self) -{ - auto* xself = reinterpret_cast(self); - delete xself; -} -extern "C" uint64_t DX12DescriptorBufferWriteSampler(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12Sampler sampler) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteSampler(aligned_table_offset, index, *reinterpret_cast(sampler)); - ; - return res; -} -extern "C" uint64_t DX12DescriptorBufferWriteShaderResource2(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12ShaderResource resource) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteShaderResource2(aligned_table_offset, index, *reinterpret_cast(resource)); - ; - return res; -} -extern "C" uint64_t DX12DescriptorBufferWriteConstantBuffer2(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12Buffer buffer, uint32_t buffer_size) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteConstantBuffer2(aligned_table_offset, index, *reinterpret_cast(buffer), buffer_size); - ; - return res; -} -extern "C" uint64_t DX12DescriptorBufferWriteShaderResource(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, DX12RootSignature root_signature, DX12ShaderResource resource) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteShaderResource(aligned_table_offset, root_table_index, binding, array_member, *reinterpret_cast(root_signature), *reinterpret_cast(resource)); - ; - return res; -} -extern "C" uint64_t DX12DescriptorBufferWriteConstantBuffer(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, DX12RootSignature root_signature, DX12Buffer buffer, uint32_t buffer_size) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteConstantBuffer(aligned_table_offset, root_table_index, binding, array_member, *reinterpret_cast(root_signature), *reinterpret_cast(buffer), buffer_size); - ; - return res; -} - // DX12ResourceAllocator methods -- extern "C" void DX12ResourceAllocatorDestroy(DX12ResourceAllocator self) { @@ -392,6 +336,20 @@ extern "C" WisResult DX12ResourceAllocatorPlaceTexture(DX12ResourceAllocator sel return reinterpret_cast(res); } +// DX12Memory methods -- +extern "C" void DX12MemoryDestroy(DX12Memory self) +{ + auto* xself = reinterpret_cast(self); + delete xself; +} +extern "C" uint64_t DX12MemoryGetBlockOffset(DX12Memory self) +{ + auto* xself = reinterpret_cast(self); + auto res = xself->GetBlockOffset(); + ; + return res; +} + // DX12Fence methods -- extern "C" void DX12FenceDestroy(DX12Fence self) { @@ -552,34 +510,15 @@ extern "C" void DX12CommandListDrawInstanced(DX12CommandList self, uint32_t vert auto* xself = reinterpret_cast(self); xself->DrawInstanced(vertex_count_per_instance, instance_count, start_vertex, start_instance); } -extern "C" void DX12CommandListSetRootConstants(DX12CommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage) -{ - auto* xself = reinterpret_cast(self); - xself->SetRootConstants(data, size_4bytes, offset_4bytes, static_cast(stage)); -} -extern "C" void DX12CommandListSetDescriptorBuffers(DX12CommandList self, const DX12DescriptorBufferView* buffers, uint32_t buffer_count) +extern "C" void DX12CommandListSetPushConstants(DX12CommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage) { auto* xself = reinterpret_cast(self); - xself->SetDescriptorBuffers(reinterpret_cast(buffers), buffer_count); + xself->SetPushConstants(data, size_4bytes, offset_4bytes, static_cast(stage)); } -extern "C" void DX12CommandListSetDescriptorTableOffset(DX12CommandList self, uint32_t root_table_index, DX12DescriptorBuffer buffer, uint32_t offset_bytes) +extern "C" void DX12CommandListPushDescriptor(DX12CommandList self, WisDescriptorType type, uint32_t root_index, DX12Buffer buffer, uint32_t offset) { auto* xself = reinterpret_cast(self); - xself->SetDescriptorTableOffset(root_table_index, *reinterpret_cast(buffer), offset_bytes); -} - -// DX12Memory methods -- -extern "C" void DX12MemoryDestroy(DX12Memory self) -{ - auto* xself = reinterpret_cast(self); - delete xself; -} -extern "C" uint64_t DX12MemoryGetBlockOffset(DX12Memory self) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->GetBlockOffset(); - ; - return res; + xself->PushDescriptor(static_cast(type), root_index, *reinterpret_cast(buffer), offset); } // DX12SwapChain methods -- @@ -657,6 +596,28 @@ extern "C" void DX12TextureDestroy(DX12Texture self) delete xself; } +// DX12DescriptorStorage methods -- +extern "C" void DX12DescriptorStorageDestroy(DX12DescriptorStorage self) +{ + auto* xself = reinterpret_cast(self); + delete xself; +} +extern "C" void DX12DescriptorStorageWriteSampler(DX12DescriptorStorage self, uint32_t index, DX12Sampler sampler) +{ + auto* xself = reinterpret_cast(self); + xself->WriteSampler(index, *reinterpret_cast(sampler)); +} +extern "C" void DX12DescriptorStorageWriteConstantBuffer(DX12DescriptorStorage self, uint32_t index, DX12Buffer buffer, uint32_t size, uint32_t offset) +{ + auto* xself = reinterpret_cast(self); + xself->WriteConstantBuffer(index, *reinterpret_cast(buffer), size, offset); +} +extern "C" void DX12DescriptorStorageWriteTexture(DX12DescriptorStorage self, uint32_t index, DX12ShaderResource resource) +{ + auto* xself = reinterpret_cast(self); + xself->WriteTexture(index, *reinterpret_cast(resource)); +} + // DX12RootSignature methods -- extern "C" void DX12RootSignatureDestroy(DX12RootSignature self) { @@ -734,11 +695,6 @@ extern "C" DX12RootSignatureView AsDX12RootSignatureView(DX12RootSignature self) wis::DX12RootSignatureView xself = reinterpret_cast(*self); return reinterpret_cast(xself); } -extern "C" DX12DescriptorBufferView AsDX12DescriptorBufferView(DX12DescriptorBuffer self) -{ - wis::DX12DescriptorBufferView xself = reinterpret_cast(*self); - return reinterpret_cast(xself); -} #endif #if defined(WISDOM_VULKAN) @@ -866,10 +822,23 @@ extern "C" WisResult VKDeviceCreateGraphicsPipeline(VKDevice self, const VKGraph return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::VKPipelineState." }; return reinterpret_cast(res); } -extern "C" WisResult VKDeviceCreateRootSignature(VKDevice self, const WisRootConstant* root_constants, uint32_t constants_size, const WisDescriptorTable* tables, uint32_t tables_count, VKRootSignature* signature) +extern "C" WisResult VKDeviceCreateRootSignature(VKDevice self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t descriptors_count, uint32_t space_overlap_count, VKRootSignature* signature) { auto* xself = reinterpret_cast(self); - auto&& [res, value] = xself->CreateRootSignature(reinterpret_cast(root_constants), constants_size, reinterpret_cast(tables), tables_count); + auto&& [res, value] = xself->CreateRootSignature(reinterpret_cast(push_constants), constants_count, reinterpret_cast(push_descriptors), descriptors_count, space_overlap_count); + + if (res.status != wis::Status::Ok) + return reinterpret_cast(res); + + *signature = reinterpret_cast(new (std::nothrow) wis::VKRootSignature(std::move(value))); + if (!*signature) + return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::VKRootSignature." }; + return reinterpret_cast(res); +} +extern "C" WisResult VKDeviceCreateRootSignature2(VKDevice self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t push_descriptors_count, const WisDescriptorSpacing* descriptor_spacing, VKRootSignature* signature) +{ + auto* xself = reinterpret_cast(self); + auto&& [res, value] = xself->CreateRootSignature2(reinterpret_cast(push_constants), constants_count, reinterpret_cast(push_descriptors), push_descriptors_count, reinterpret_cast(descriptor_spacing)); if (res.status != wis::Status::Ok) return reinterpret_cast(res); @@ -957,33 +926,6 @@ extern "C" WisResult VKDeviceCreateShaderResource(VKDevice self, VKTexture textu return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::VKShaderResource." }; return reinterpret_cast(res); } -extern "C" uint32_t VKDeviceGetDescriptorTableAlignment(VKDevice self, WisDescriptorHeapType heap) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->GetDescriptorTableAlignment(static_cast(heap)); - ; - return res; -} -extern "C" uint32_t VKDeviceGetDescriptorBufferUnitSize(VKDevice self, WisDescriptorHeapType heap) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->GetDescriptorBufferUnitSize(static_cast(heap)); - ; - return res; -} -extern "C" WisResult VKDeviceCreateDescriptorBuffer(VKDevice self, WisDescriptorHeapType heap_type, WisDescriptorMemory memory_type, uint64_t size_bytes, VKDescriptorBuffer* buffer) -{ - auto* xself = reinterpret_cast(self); - auto&& [res, value] = xself->CreateDescriptorBuffer(static_cast(heap_type), static_cast(memory_type), size_bytes); - - if (res.status != wis::Status::Ok) - return reinterpret_cast(res); - - *buffer = reinterpret_cast(new (std::nothrow) wis::VKDescriptorBuffer(std::move(value))); - if (!*buffer) - return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::VKDescriptorBuffer." }; - return reinterpret_cast(res); -} extern "C" bool VKDeviceQueryFeatureSupport(VKDevice self, WisDeviceFeature feature) { auto* xself = reinterpret_cast(self); @@ -992,48 +934,6 @@ extern "C" bool VKDeviceQueryFeatureSupport(VKDevice self, WisDeviceFeature feat return res; } -// VKDescriptorBuffer methods -- -extern "C" void VKDescriptorBufferDestroy(VKDescriptorBuffer self) -{ - auto* xself = reinterpret_cast(self); - delete xself; -} -extern "C" uint64_t VKDescriptorBufferWriteSampler(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKSampler sampler) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteSampler(aligned_table_offset, index, *reinterpret_cast(sampler)); - ; - return res; -} -extern "C" uint64_t VKDescriptorBufferWriteShaderResource2(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKShaderResource resource) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteShaderResource2(aligned_table_offset, index, *reinterpret_cast(resource)); - ; - return res; -} -extern "C" uint64_t VKDescriptorBufferWriteConstantBuffer2(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKBuffer buffer, uint32_t buffer_size) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteConstantBuffer2(aligned_table_offset, index, *reinterpret_cast(buffer), buffer_size); - ; - return res; -} -extern "C" uint64_t VKDescriptorBufferWriteShaderResource(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, VKRootSignature root_signature, VKShaderResource resource) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteShaderResource(aligned_table_offset, root_table_index, binding, array_member, *reinterpret_cast(root_signature), *reinterpret_cast(resource)); - ; - return res; -} -extern "C" uint64_t VKDescriptorBufferWriteConstantBuffer(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, VKRootSignature root_signature, VKBuffer buffer, uint32_t buffer_size) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->WriteConstantBuffer(aligned_table_offset, root_table_index, binding, array_member, *reinterpret_cast(root_signature), *reinterpret_cast(buffer), buffer_size); - ; - return res; -} - // VKResourceAllocator methods -- extern "C" void VKResourceAllocatorDestroy(VKResourceAllocator self) { @@ -1133,6 +1033,20 @@ extern "C" WisResult VKResourceAllocatorPlaceTexture(VKResourceAllocator self, V return reinterpret_cast(res); } +// VKMemory methods -- +extern "C" void VKMemoryDestroy(VKMemory self) +{ + auto* xself = reinterpret_cast(self); + delete xself; +} +extern "C" uint64_t VKMemoryGetBlockOffset(VKMemory self) +{ + auto* xself = reinterpret_cast(self); + auto res = xself->GetBlockOffset(); + ; + return res; +} + // VKFence methods -- extern "C" void VKFenceDestroy(VKFence self) { @@ -1293,34 +1207,15 @@ extern "C" void VKCommandListDrawInstanced(VKCommandList self, uint32_t vertex_c auto* xself = reinterpret_cast(self); xself->DrawInstanced(vertex_count_per_instance, instance_count, start_vertex, start_instance); } -extern "C" void VKCommandListSetRootConstants(VKCommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage) -{ - auto* xself = reinterpret_cast(self); - xself->SetRootConstants(data, size_4bytes, offset_4bytes, static_cast(stage)); -} -extern "C" void VKCommandListSetDescriptorBuffers(VKCommandList self, const VKDescriptorBufferView* buffers, uint32_t buffer_count) +extern "C" void VKCommandListSetPushConstants(VKCommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage) { auto* xself = reinterpret_cast(self); - xself->SetDescriptorBuffers(reinterpret_cast(buffers), buffer_count); + xself->SetPushConstants(data, size_4bytes, offset_4bytes, static_cast(stage)); } -extern "C" void VKCommandListSetDescriptorTableOffset(VKCommandList self, uint32_t root_table_index, VKDescriptorBuffer buffer, uint32_t offset_bytes) +extern "C" void VKCommandListPushDescriptor(VKCommandList self, WisDescriptorType type, uint32_t root_index, VKBuffer buffer, uint32_t offset) { auto* xself = reinterpret_cast(self); - xself->SetDescriptorTableOffset(root_table_index, *reinterpret_cast(buffer), offset_bytes); -} - -// VKMemory methods -- -extern "C" void VKMemoryDestroy(VKMemory self) -{ - auto* xself = reinterpret_cast(self); - delete xself; -} -extern "C" uint64_t VKMemoryGetBlockOffset(VKMemory self) -{ - auto* xself = reinterpret_cast(self); - auto res = xself->GetBlockOffset(); - ; - return res; + xself->PushDescriptor(static_cast(type), root_index, *reinterpret_cast(buffer), offset); } // VKSwapChain methods -- @@ -1398,6 +1293,28 @@ extern "C" void VKTextureDestroy(VKTexture self) delete xself; } +// VKDescriptorStorage methods -- +extern "C" void VKDescriptorStorageDestroy(VKDescriptorStorage self) +{ + auto* xself = reinterpret_cast(self); + delete xself; +} +extern "C" void VKDescriptorStorageWriteSampler(VKDescriptorStorage self, uint32_t index, VKSampler sampler) +{ + auto* xself = reinterpret_cast(self); + xself->WriteSampler(index, *reinterpret_cast(sampler)); +} +extern "C" void VKDescriptorStorageWriteConstantBuffer(VKDescriptorStorage self, uint32_t index, VKBuffer buffer, uint32_t size, uint32_t offset) +{ + auto* xself = reinterpret_cast(self); + xself->WriteConstantBuffer(index, *reinterpret_cast(buffer), size, offset); +} +extern "C" void VKDescriptorStorageWriteTexture(VKDescriptorStorage self, uint32_t index, VKShaderResource resource) +{ + auto* xself = reinterpret_cast(self); + xself->WriteTexture(index, *reinterpret_cast(resource)); +} + // VKRootSignature methods -- extern "C" void VKRootSignatureDestroy(VKRootSignature self) { @@ -1475,9 +1392,4 @@ extern "C" VKRootSignatureView AsVKRootSignatureView(VKRootSignature self) wis::VKRootSignatureView xself = reinterpret_cast(*self); return reinterpret_cast(xself); } -extern "C" VKDescriptorBufferView AsVKDescriptorBufferView(VKDescriptorBuffer self) -{ - wis::VKDescriptorBufferView xself = reinterpret_cast(*self); - return reinterpret_cast(xself); -} #endif diff --git a/bindings/wisdom.h b/bindings/wisdom.h index 48147a0b..6441a023 100644 --- a/bindings/wisdom.h +++ b/bindings/wisdom.h @@ -6,7 +6,7 @@ /** \mainpage Wisdom API Documentation -Version 0.3.14 +Version 0.4.0 Copyright (c) 2024 Ilya Doroshenko. All rights reserved. License: MIT @@ -96,23 +96,29 @@ enum WisMutiWaitFlags { * */ enum WisDescriptorType { /** - * @brief Descriptor is a shader resource view. - * Used for textures. + * @brief Descriptor is a sampler. + * Sampler is used to sample textures in shaders. + * Stored in separate descriptor table and + * can't be mixed with other descriptor types. * */ - DescriptorTypeShaderResource = 0, - DescriptorTypeConstantBuffer = 1, ///< Descriptor is a constant buffer view. + DescriptorTypeSampler = 0, + DescriptorTypeConstantBuffer = 1, ///< Descriptor is a constant buffer. + DescriptorTypeTexture = 2, ///< Descriptor is a texture. /** - * @brief Descriptor is an unordered access view. + * @brief Descriptor is an unordered access read-write texture. * Used for read/write operations in compute shaders. * */ - DescriptorTypeUnorderedAccess = 2, + DescriptorTypeRWTexture = 3, /** - * @brief Descriptor is a sampler. - * Sampler is used to sample textures in shaders. - * Stored in separate descriptor table and - * can't be mixed with other descriptor types + * @brief Descriptor is an unordered access read-write buffer. + * Used for read/write operations in compute shaders. + * */ + DescriptorTypeRWBuffer = 4, + /** + * @brief Descriptor is a shader resource buffer. + * May be bigger than constant buffers, but slower. * */ - DescriptorTypeSampler = 3, + DescriptorTypeBuffer = 5, }; /** @@ -955,6 +961,32 @@ enum WisTextureLayout { TextureLayoutTexture3D = 8, ///< Texture is 3D volume. }; +/** + * @brief Binding index for resources. + * Used in DescriptorStorage to determine which descriptor type goes where when binding. + * Same values are used for HLSL side to pick descriptors up. + * Space 0 and set 0 are reserved for push descriptors and push constants. + * + * */ +enum WisBindingIndex { + /** + * @brief No binding index set.Results in [[vk::binding(*,0)]] and register(*). + * This space is reserved for push constants and push descriptors. + * */ + BindingIndexNone = 0, + BindingIndexSampler = 1, ///< Binding index for sampler descriptors. Results in [[vk::binding(0,1)]] and register(s0, space1). + BindingIndexConstantBuffer = 2, ///< Binding index for constant buffer descriptors. Results in [[vk::binding(0,2)]] and register(b0, space2). + BindingIndexTexture = 3, ///< Binding index for texture descriptors. Results in [[vk::binding(0,3)]] and register(t0, space3). + BindingIndexRWTexture = 4, ///< Binding index for read-write texture descriptors. Results in [[vk::binding(0,4)]] and register(u0, space4). + BindingIndexRWBuffer = 5, ///< Binding index for read-write buffer descriptors. Results in [[vk::binding(0,5)]] and register(u0, space5). + /** + * @brief Binding index for read buffer descriptors. Results in [[vk::binding(0,6)]] and register(t0, space6). + * Can't be merged with Texture because of Vulkan. + * */ + BindingIndexBuffer = 6, + BindingIndexCount = 6, ///< Number of binding indices. Used for array sizes. +}; + /** * @brief Descriptor heap type. * @@ -1024,11 +1056,6 @@ enum WisTopologyType { * * */ enum WisDeviceFeature { - /** - * @brief Core Functionality. Descriptor buffer support for VK, always true for DX12. - * Vulkan provides DescriptorPool and DescriptorSet functionalities, that have to be used manually through library internals. - * */ - DeviceFeatureDescriptorBuffer = 0, /** * @brief Core Functionality. Supports enhanced barriers. Support for VK and DX12. * Used in all barriers to provide more control over synchronization. Without the feature behavior is undefined. @@ -1041,11 +1068,6 @@ enum WisDeviceFeature { * Unlocks Swapchain::WaitForPresent. * */ DeviceFeatureWaitForPresent = 2, - /** - * @brief Descriptor size for SRV UAV and CBV are equal in size, support for VK, always true for DX12. - * Unlocks DescriptorBuffer::WriteShaderResource2, DescriptorBuffer::WriteConstantBuffer2 functions. Without the feature their behavior is undefined. - * */ - DeviceFeatureDescriptorEqualSize = 3, /** * @brief Supports advanced index buffer features. Support for VK, always true for DX12. * Unlocks CommandList::IASetIndexBuffer2 function. Without the extension behavior is undefined. @@ -1057,6 +1079,7 @@ enum WisDeviceFeature { * */ DeviceFeatureDynamicVSync = 5, DeviceFeatureUnusedRenderTargets = 6, ///< Supports unused render targets. Support for VK, always true for DX12. + DeviceFeaturePushDescriptors = 7, ///< Supports push descriptors. Support for VK, always true for DX12. }; /** @@ -1148,6 +1171,7 @@ enum WisFactoryExtID { * */ enum WisDeviceExtID { DeviceExtIDCustom = 0, ///< Custom provided extension. Default initialization of the extension is done by user. + DeviceExtIDDescriptorBufferExtension = 1, }; //------------------------------------------------------------------------- @@ -1340,6 +1364,21 @@ enum WisFenceFlagsBits { FenceFlagsShared = 1 << 0, ///< Fence is shared. Used for sharing fences for single physical device. }; +/** + * @brief Pipeline flags for additional pipeline features + * + * Translates to D3D12_PIPELINE_STATE_FLAGS for dx implementation. + * Translates to VkPipelineCreateFlags for vk implementation. + * */ +enum WisPipelineFlagsBits { + PipelineFlagsNone = 0x0, ///< No flags set. Pipeline is regular. + /** + * @brief Pipeline is created to be used with DescriptorBuffer extension. + * Do not mix DescriptorBuffer and non-DescriptorBuffer pipelines. + * */ + PipelineFlagsDescriptorBuffer = 1 << 0, +}; + //------------------------------------------------------------------------- typedef struct WisResult WisResult; @@ -1357,7 +1396,7 @@ typedef struct WisDepthStencilDesc WisDepthStencilDesc; typedef struct WisBlendAttachmentDesc WisBlendAttachmentDesc; typedef struct WisBlendStateDesc WisBlendStateDesc; typedef struct WisRenderAttachmentsDesc WisRenderAttachmentsDesc; -typedef struct WisRootConstant WisRootConstant; +typedef struct WisPushConstant WisPushConstant; typedef struct WisSwapchainDesc WisSwapchainDesc; typedef struct WisTextureDesc WisTextureDesc; typedef struct WisAllocationInfo WisAllocationInfo; @@ -1377,6 +1416,8 @@ typedef struct WisComponentMapping WisComponentMapping; typedef struct WisShaderResourceDesc WisShaderResourceDesc; typedef struct WisFactoryExtQuery WisFactoryExtQuery; typedef struct WisDeviceExtQuery WisDeviceExtQuery; +typedef struct WisDescriptorStorageDesc WisDescriptorStorageDesc; +typedef struct WisDescriptorSpacing WisDescriptorSpacing; typedef enum WisShaderStages WisShaderStages; typedef enum WisStatus WisStatus; typedef enum WisMutiWaitFlags WisMutiWaitFlags; @@ -1401,6 +1442,7 @@ typedef enum WisShaderIntermediate WisShaderIntermediate; typedef enum WisTextureState WisTextureState; typedef enum WisLoadOperation WisLoadOperation; typedef enum WisTextureLayout WisTextureLayout; +typedef enum WisBindingIndex WisBindingIndex; typedef enum WisDescriptorHeapType WisDescriptorHeapType; typedef enum WisStoreOperation WisStoreOperation; typedef enum WisPrimitiveTopology WisPrimitiveTopology; @@ -1433,6 +1475,8 @@ typedef enum WisTextureUsageBits WisTextureUsageBits; typedef uint32_t WisTextureUsage; typedef enum WisFenceFlagsBits WisFenceFlagsBits; typedef uint32_t WisFenceFlags; +typedef enum WisPipelineFlagsBits WisPipelineFlagsBits; +typedef uint32_t WisPipelineFlags; //------------------------------------------------------------------------- @@ -1516,9 +1560,9 @@ struct WisInputAttribute { * @brief Input layout description for . * */ struct WisInputLayout { - WisInputSlotDesc* slots; ///< Input slots array. Made to pick up data from several arrays of vertex data. + const WisInputSlotDesc* slots; ///< Input slots array. Made to pick up data from several arrays of vertex data. uint32_t slot_count; ///< Input slots count. Max number is 16. - WisInputAttribute* attributes; ///< Input attributes array. Describes how the vertex data is read by the HLSL shader. + const WisInputAttribute* attributes; ///< Input attributes array. Describes how the vertex data is read by the HLSL shader. uint32_t attribute_count; ///< Input attributes count. }; @@ -1598,17 +1642,19 @@ struct WisBlendStateDesc { * @brief Render attachments description for . * */ struct WisRenderAttachmentsDesc { - WisDataFormat* attachment_formats; ///< Attachment formats array. Describes the format of the render target. - uint32_t attachments_count; ///< Attachment formats count. + WisDataFormat attachment_formats[8]; ///< Attachment formats array. Describes the format of the render target. + uint32_t attachments_count; ///< Attachment formats count. Max is 8. WisDataFormat depth_attachment; ///< Depth attachment format. Describes the format of the depth buffer. }; /** - * @brief Root constant description for . + * @brief A set of constants that get pushed directly to the pipeline. + * Only one set can be created per shader stage. * */ -struct WisRootConstant { +struct WisPushConstant { WisShaderStages stage; ///< Shader stage. Defines the stage where the constant is used. - uint32_t size_bytes; ///< Size of the constant in bytes. + uint32_t size_bytes; ///< Size of the constant in bytes. Must be divisible by 4. + uint32_t bind_register; ///< Bind register number in HLSL. }; /** @@ -1668,13 +1714,11 @@ struct WisBufferTextureCopyRegion { }; /** - * @brief Push descriptor. Unused for now. + * @brief Push descriptor. Used to push data directly to pipeline. * */ struct WisPushDescriptor { - WisShaderStages stage; - uint32_t bind_register; - WisDescriptorType type; - uint32_t reserved; + WisShaderStages stage; ///< Shader stage. Defines the stage where the descriptor is used. + WisDescriptorType type; ///< Descriptor type. Works only with buffer-like bindings. }; /** @@ -1841,6 +1885,33 @@ struct WisDeviceExtQuery { void* result; }; +/** + * @brief Descriptor storage description for DescriptorStorage creation. + * */ +struct WisDescriptorStorageDesc { + uint32_t sampler_count; ///< Count of sampler descriptors to allocate. + uint32_t cbuffer_count; ///< Count of constant buffer descriptors to allocate. + uint32_t sbuffer_count; ///< Count of storage buffer descriptors to allocate. + uint32_t texture_count; ///< Count of texture descriptors to allocate. + uint32_t stexture_count; ///< Count of storage texture descriptors to allocate. + uint32_t rbuffer_count; ///< Count of read only storage buffer descriptors to allocate. + WisDescriptorMemory memory; ///< Descriptor memory to use. +}; + +/** + * @brief Describes how many types can descriptors be reinterpreted as. + * Minimal amount of spaces for each type is 1, 0 is treated as 1. + * Used for RootSignature. + * */ +struct WisDescriptorSpacing { + uint32_t sampler_count; ///< Count of spaces of sampler descriptors to allocate. + uint32_t cbuffer_count; ///< Count of spaces of constant buffer descriptors to allocate. + uint32_t sbuffer_count; ///< Count of spaces of storage buffer descriptors to allocate. + uint32_t texture_count; ///< Count of spaces of texture descriptors to allocate. + uint32_t stexture_count; ///< Count of spaces of storage texture descriptors to allocate. + uint32_t rbuffer_count; ///< Count of spaces of read only storage buffer descriptors to allocate. +}; + //------------------------------------------------------------------------- //------------------------------------------------------------------------- @@ -1867,7 +1938,6 @@ typedef struct VKTextureView VKTextureView; typedef struct VKShaderView VKShaderView; typedef struct VKRenderTargetView VKRenderTargetView; typedef struct VKRootSignatureView VKRootSignatureView; -typedef struct VKDescriptorBufferView VKDescriptorBufferView; typedef struct VKTextureBarrier2 VKTextureBarrier2; typedef struct VKBufferBarrier2 VKBufferBarrier2; typedef struct VKGraphicsShaderStages VKGraphicsShaderStages; @@ -1907,11 +1977,6 @@ struct VKRootSignatureView { void* value; }; -struct VKDescriptorBufferView { - uint64_t value1; - uint32_t value2; -}; - /** * @brief Variant of BufferBarrier with BufferView. * */ @@ -1947,11 +2012,17 @@ struct VKGraphicsPipelineDesc { WisInputLayout input_layout; ///< Input layout. VKGraphicsShaderStages shaders; ///< Shader stages. WisRenderAttachmentsDesc attachments; ///< Render attachments. - WisRasterizerDesc* rasterizer; ///< Rasterizer description. - WisSampleDesc* sample; ///< Sample description. - WisBlendStateDesc* blend; ///< Blend state description. - WisDepthStencilDesc* depth_stencil; ///< Depth stencil description. + const WisRasterizerDesc* rasterizer; ///< Rasterizer description. + const WisSampleDesc* sample; ///< Sample description. + const WisBlendStateDesc* blend; ///< Blend state description. + const WisDepthStencilDesc* depth_stencil; ///< Depth stencil description. WisTopologyType topology_type; ///< Topology type. Default is TopologyTypeTriangle. + /** + * @brief View mask for Multiview feature. If multiview is not available it is ignored. + * Default is 0. 0 means regular rendering. + * */ + uint32_t view_mask; + WisPipelineFlags flags; ///< Pipeline flags to add options to pipeline creation. }; /** @@ -1983,9 +2054,15 @@ struct VKRenderPassDepthStencilDesc { * */ struct VKRenderPassDesc { WisRenderPassFlags flags; ///< Render pass flags. + /** + * @brief View mask for Multiview feature. If multiview is not available it is ignored. + * Value must be the same as in upon pipeline creation. Otherwise behavior is undefined. + * Default is 0. 0 means regular rendering. + * */ + uint32_t view_mask; uint32_t target_count; ///< Render target count. - VKRenderPassRenderTargetDesc* targets; ///< Render target descriptions. - VKRenderPassDepthStencilDesc* depth_stencil; ///< Depth stencil description. + const VKRenderPassRenderTargetDesc* targets; ///< Render target descriptions. + const VKRenderPassDepthStencilDesc* depth_stencil; ///< Depth stencil description. }; /** @@ -2006,15 +2083,15 @@ typedef struct VKDeviceExtension_t* VKDeviceExtension; typedef struct VKPipelineState_t* VKPipelineState; typedef struct VKAdapter_t* VKAdapter; typedef struct VKDevice_t* VKDevice; -typedef struct VKDescriptorBuffer_t* VKDescriptorBuffer; typedef struct VKFactoryExtension_t* VKFactoryExtension; typedef struct VKResourceAllocator_t* VKResourceAllocator; +typedef struct VKMemory_t* VKMemory; typedef struct VKFence_t* VKFence; typedef struct VKCommandList_t* VKCommandList; -typedef struct VKMemory_t* VKMemory; typedef struct VKSwapChain_t* VKSwapChain; typedef struct VKBuffer_t* VKBuffer; typedef struct VKTexture_t* VKTexture; +typedef struct VKDescriptorStorage_t* VKDescriptorStorage; typedef struct VKRootSignature_t* VKRootSignature; typedef struct VKShader_t* VKShader; typedef struct VKDebugMessenger_t* VKDebugMessenger; @@ -2165,17 +2242,41 @@ WISDOM_API WisResult VKDeviceCreateCommandList(VKDevice self, WisQueueType type, WISDOM_API WisResult VKDeviceCreateGraphicsPipeline(VKDevice self, const VKGraphicsPipelineDesc* desc, VKPipelineState* pipeline); /** - * @brief Creates a root signature object. + * @brief Creates a root signature object for use with DescriptorStorage. * @param self valid handle to the Device - * @param root_constants The root constants to create the root signature with. - * @param constants_size The number of root constants. - * @param tables The descriptor tables to create the root signature with. - * @param tables_count The number of descriptor tables. + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. push_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param descriptors_count The number of push descriptors. Max is 8. + * @param space_overlap_count Count of descriptor spaces to overlap for each of the DescriptorStorage types. + * Default is 1. Max is 16. This is used primarily for descriptor type aliasing. + * Example: If VKDevice is 2, that means that 2 descriptor spaces will be allocated for each descriptor type. + * [[vk::binding(0,0)]] SamplerState samplers: register(s0,space1); // space1 can be used for different type of samplers e.g. SamplerComparisonState + * [[vk::binding(0,0)]] SamplerComparisonState shadow_samplers: register(s0,space2); // they use the same binding (works like overloading) + * [[vk::binding(0,1)]] ConstantBuffer cbuffers: register(b0,space3); // this type also has 2 spaces, next will be on space 4 etc. + * @param signature VKRootSignature on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +WISDOM_API WisResult VKDeviceCreateRootSignature(VKDevice self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t descriptors_count, uint32_t space_overlap_count, VKRootSignature* signature); + +/** + * @brief Creates a root signature object for use with DescriptorStorage. + * Supplies number of types for each descriptor type separately. + * @param self valid handle to the Device + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. root_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param push_descriptors_count The number of push descriptors. Max is 8. + * @param descriptor_spacing Descriptor spacing allocation. + * nullptr means allocate 1 space for each. * @param signature VKRootSignature on success (StatusOk). * @return Result with StatusOk on success. * Error in WisResult::error otherwise. * */ -WISDOM_API WisResult VKDeviceCreateRootSignature(VKDevice self, const WisRootConstant* root_constants, uint32_t constants_size, const WisDescriptorTable* tables, uint32_t tables_count, VKRootSignature* signature); +WISDOM_API WisResult VKDeviceCreateRootSignature2(VKDevice self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t push_descriptors_count, const WisDescriptorSpacing* descriptor_spacing, VKRootSignature* signature); /** * @brief Creates a shader object. @@ -2243,35 +2344,6 @@ WISDOM_API WisResult VKDeviceCreateSampler(VKDevice self, const WisSamplerDesc* * */ WISDOM_API WisResult VKDeviceCreateShaderResource(VKDevice self, VKTexture texture, WisShaderResourceDesc desc, VKShaderResource* resource); -/** - * @brief Returns the alignment of the descriptor table in bytes. - * The value is used to correctly determine descriptor page alignment for descriptor buffer. - * @param self valid handle to the Device - * @param heap The type of the descriptor heap to get the alignment for. - * @return The alignment of the descriptor table in bytes. - * */ -WISDOM_API uint32_t VKDeviceGetDescriptorTableAlignment(VKDevice self, WisDescriptorHeapType heap); - -/** - * @brief Returns the size of the descriptor buffer unit in bytes. - * @param self valid handle to the Device - * @param heap The type of the descriptor heap to get the unit size for. - * @return The size of the descriptor buffer unit in bytes. Descriptor unit is the size of one descriptor. - * */ -WISDOM_API uint32_t VKDeviceGetDescriptorBufferUnitSize(VKDevice self, WisDescriptorHeapType heap); - -/** - * @brief Creates a descriptor buffer object. - * @param self valid handle to the Device - * @param heap_type The type of the descriptor heap to create the descriptor buffer with. - * @param memory_type The type of the descriptor memory to create the descriptor buffer with. - * @param size_bytes The number of bytes to allocate for the descriptor buffer. - * @param buffer VKDescriptorBuffer on success (StatusOk). - * @return Result with StatusOk on success. - * Error in WisResult::error otherwise. - * */ -WISDOM_API WisResult VKDeviceCreateDescriptorBuffer(VKDevice self, WisDescriptorHeapType heap_type, WisDescriptorMemory memory_type, uint64_t size_bytes, VKDescriptorBuffer* buffer); - /** * @brief Queries if the device supports the feature. * @param self valid handle to the Device @@ -2280,81 +2352,6 @@ WISDOM_API WisResult VKDeviceCreateDescriptorBuffer(VKDevice self, WisDescriptor * */ WISDOM_API bool VKDeviceQueryFeatureSupport(VKDevice self, WisDeviceFeature feature); -// VKDescriptorBuffer methods -- -/** - * @brief Destroys the VKDescriptorBuffer. - * @param self valid handle to the DescriptorBuffer - * */ -WISDOM_API void VKDescriptorBufferDestroy(VKDescriptorBuffer self); - -/** - * @brief Writes the sampler to the sampler descriptor buffer. - * Must be called with Sampler descriptor buffer, which was created with DescriptorHeapTypeSampler. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with VKDevice. - * @param index Binding index in descriptor table. - * @param sampler The sampler to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t VKDescriptorBufferWriteSampler(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKSampler sampler); - -/** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * Must be called with Shader Resource descriptor buffer, which was created with DescriptorHeapTypeDescriptor. - * Requires DeviceFeatureDescriptorEqualSize to run, otherwise program is ill-formed. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with VKDevice. - * @param index Binding index in descriptor table. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t VKDescriptorBufferWriteShaderResource2(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKShaderResource resource); - -/** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * Must be called with Constant Buffer descriptor buffer, which was created with DescriptorHeapTypeDescriptor. - * Requires DeviceFeatureDescriptorEqualSize to run, otherwise program is ill-formed. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with VKDevice. - * @param index Binding index in descriptor table. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t VKDescriptorBufferWriteConstantBuffer2(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKBuffer buffer, uint32_t buffer_size); - -/** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with VKDevice. - * @param root_table_index Index of the descriptor table in VKRootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t VKDescriptorBufferWriteShaderResource(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, VKRootSignature root_signature, VKShaderResource resource); - -/** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with VKDevice. - * @param root_table_index Index of the descriptor table in VKRootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t VKDescriptorBufferWriteConstantBuffer(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, VKRootSignature root_signature, VKBuffer buffer, uint32_t buffer_size); - // VKResourceAllocator methods -- /** * @brief Destroys the VKResourceAllocator. @@ -2462,6 +2459,20 @@ WISDOM_API WisResult VKResourceAllocatorPlaceBuffer(VKResourceAllocator self, VK * */ WISDOM_API WisResult VKResourceAllocatorPlaceTexture(VKResourceAllocator self, VKMemory memory, uint64_t memory_offset, const WisTextureDesc* desc, VKTexture* texture); +// VKMemory methods -- +/** + * @brief Destroys the VKMemory. + * @param self valid handle to the Memory + * */ +WISDOM_API void VKMemoryDestroy(VKMemory self); + +/** + * @brief Returns the offset of the block in the global memory. + * @param self valid handle to the Memory + * @return The offset of the block in the global memory. + * */ +WISDOM_API uint64_t VKMemoryGetBlockOffset(VKMemory self); + // VKFence methods -- /** * @brief Destroys the VKFence. @@ -2705,40 +2716,19 @@ WISDOM_API void VKCommandListDrawInstanced(VKCommandList self, uint32_t vertex_c * @param offset_4bytes The offset in the data in 4-byte units. * @param stage The shader stages to set the root constants for. * */ -WISDOM_API void VKCommandListSetRootConstants(VKCommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage); +WISDOM_API void VKCommandListSetPushConstants(VKCommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage); /** - * @brief Sets the root descriptor tables for the shader. - * Operation will perform flush in some cases, so it's not recommended to rebind descriptor buffers too often. + * @brief Pushes descriptor directly to the command list, without putting it to the table. + * Works only with buffer bindings. + * Buffer is always bound with full size. * @param self valid handle to the CommandList - * @param buffers The descriptor buffers to set the root descriptor tables with. - * May only be one of each type (one Descriptor and one Sampler buffer) - * @param buffer_count The number of descriptor buffers to set. May be 1 or 2. - * */ -WISDOM_API void VKCommandListSetDescriptorBuffers(VKCommandList self, const VKDescriptorBufferView* buffers, uint32_t buffer_count); - -/** - * @brief Sets the offset in the descriptor table for the descriptor buffer. - * @param self valid handle to the CommandList - * @param root_table_index The index of the root table to set the offset for. - * @param buffer The descriptor buffer to set the offset for. - * @param offset_bytes The offset in the descriptor buffer in bytes. - * */ -WISDOM_API void VKCommandListSetDescriptorTableOffset(VKCommandList self, uint32_t root_table_index, VKDescriptorBuffer buffer, uint32_t offset_bytes); - -// VKMemory methods -- -/** - * @brief Destroys the VKMemory. - * @param self valid handle to the Memory - * */ -WISDOM_API void VKMemoryDestroy(VKMemory self); - -/** - * @brief Returns the offset of the block in the global memory. - * @param self valid handle to the Memory - * @return The offset of the block in the global memory. + * @param type The type of the descriptor to set. + * @param root_index The index of the root descriptor to set. + * @param buffer The buffer to set. + * @param offset The offset in the descriptor table to set the descriptor to. * */ -WISDOM_API uint64_t VKMemoryGetBlockOffset(VKMemory self); +WISDOM_API void VKCommandListPushDescriptor(VKCommandList self, WisDescriptorType type, uint32_t root_index, VKBuffer buffer, uint32_t offset); // VKSwapChain methods -- /** @@ -2830,6 +2820,40 @@ WISDOM_API void VKBufferUnmap(VKBuffer self); * */ WISDOM_API void VKTextureDestroy(VKTexture self); +// VKDescriptorStorage methods -- +/** + * @brief Destroys the VKDescriptorStorage. + * @param self valid handle to the DescriptorStorage + * */ +WISDOM_API void VKDescriptorStorageDestroy(VKDescriptorStorage self); + +/** + * @brief Writes the sampler to the sampler descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of samplers to fill. + * @param sampler The sampler to write. + * */ +WISDOM_API void VKDescriptorStorageWriteSampler(VKDescriptorStorage self, uint32_t index, VKSampler sampler); + +/** + * @brief Writes the constant buffer to the constant buffer descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of constant buffers to fill. + * @param buffer The buffer to write. + * @param size The size of the constant buffer in bytes. + * @param offset The offset in the buffer to write the constant buffer to. + * size + offset must be less or equal the overall size of the bound buffer. + * */ +WISDOM_API void VKDescriptorStorageWriteConstantBuffer(VKDescriptorStorage self, uint32_t index, VKBuffer buffer, uint32_t size, uint32_t offset); + +/** + * @brief Writes the texture to the shader resource descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of shader resources to fill. + * @param resource The shader resource to write. + * */ +WISDOM_API void VKDescriptorStorageWriteTexture(VKDescriptorStorage self, uint32_t index, VKShaderResource resource); + // VKRootSignature methods -- /** * @brief Destroys the VKRootSignature. @@ -2910,7 +2934,6 @@ WISDOM_API VKRenderTargetView AsVKRenderTargetView(VKRenderTarget self); WISDOM_API VKCommandListView AsVKCommandListView(VKCommandList self); WISDOM_API VKShaderView AsVKShaderView(VKShader self); WISDOM_API VKRootSignatureView AsVKRootSignatureView(VKRootSignature self); -WISDOM_API VKDescriptorBufferView AsVKDescriptorBufferView(VKDescriptorBuffer self); #endif #ifdef WISDOM_DX12 @@ -2923,7 +2946,6 @@ typedef struct DX12TextureView DX12TextureView; typedef struct DX12ShaderView DX12ShaderView; typedef struct DX12RenderTargetView DX12RenderTargetView; typedef struct DX12RootSignatureView DX12RootSignatureView; -typedef struct DX12DescriptorBufferView DX12DescriptorBufferView; typedef struct DX12TextureBarrier2 DX12TextureBarrier2; typedef struct DX12BufferBarrier2 DX12BufferBarrier2; typedef struct DX12GraphicsShaderStages DX12GraphicsShaderStages; @@ -2962,10 +2984,6 @@ struct DX12RootSignatureView { void* value; }; -struct DX12DescriptorBufferView { - void* value; -}; - /** * @brief Variant of BufferBarrier with BufferView. * */ @@ -3001,11 +3019,17 @@ struct DX12GraphicsPipelineDesc { WisInputLayout input_layout; ///< Input layout. DX12GraphicsShaderStages shaders; ///< Shader stages. WisRenderAttachmentsDesc attachments; ///< Render attachments. - WisRasterizerDesc* rasterizer; ///< Rasterizer description. - WisSampleDesc* sample; ///< Sample description. - WisBlendStateDesc* blend; ///< Blend state description. - WisDepthStencilDesc* depth_stencil; ///< Depth stencil description. + const WisRasterizerDesc* rasterizer; ///< Rasterizer description. + const WisSampleDesc* sample; ///< Sample description. + const WisBlendStateDesc* blend; ///< Blend state description. + const WisDepthStencilDesc* depth_stencil; ///< Depth stencil description. WisTopologyType topology_type; ///< Topology type. Default is TopologyTypeTriangle. + /** + * @brief View mask for Multiview feature. If multiview is not available it is ignored. + * Default is 0. 0 means regular rendering. + * */ + uint32_t view_mask; + WisPipelineFlags flags; ///< Pipeline flags to add options to pipeline creation. }; /** @@ -3037,9 +3061,15 @@ struct DX12RenderPassDepthStencilDesc { * */ struct DX12RenderPassDesc { WisRenderPassFlags flags; ///< Render pass flags. + /** + * @brief View mask for Multiview feature. If multiview is not available it is ignored. + * Value must be the same as in upon pipeline creation. Otherwise behavior is undefined. + * Default is 0. 0 means regular rendering. + * */ + uint32_t view_mask; uint32_t target_count; ///< Render target count. - DX12RenderPassRenderTargetDesc* targets; ///< Render target descriptions. - DX12RenderPassDepthStencilDesc* depth_stencil; ///< Depth stencil description. + const DX12RenderPassRenderTargetDesc* targets; ///< Render target descriptions. + const DX12RenderPassDepthStencilDesc* depth_stencil; ///< Depth stencil description. }; /** @@ -3060,15 +3090,15 @@ typedef struct DX12DeviceExtension_t* DX12DeviceExtension; typedef struct DX12PipelineState_t* DX12PipelineState; typedef struct DX12Adapter_t* DX12Adapter; typedef struct DX12Device_t* DX12Device; -typedef struct DX12DescriptorBuffer_t* DX12DescriptorBuffer; typedef struct DX12FactoryExtension_t* DX12FactoryExtension; typedef struct DX12ResourceAllocator_t* DX12ResourceAllocator; +typedef struct DX12Memory_t* DX12Memory; typedef struct DX12Fence_t* DX12Fence; typedef struct DX12CommandList_t* DX12CommandList; -typedef struct DX12Memory_t* DX12Memory; typedef struct DX12SwapChain_t* DX12SwapChain; typedef struct DX12Buffer_t* DX12Buffer; typedef struct DX12Texture_t* DX12Texture; +typedef struct DX12DescriptorStorage_t* DX12DescriptorStorage; typedef struct DX12RootSignature_t* DX12RootSignature; typedef struct DX12Shader_t* DX12Shader; typedef struct DX12DebugMessenger_t* DX12DebugMessenger; @@ -3219,17 +3249,41 @@ WISDOM_API WisResult DX12DeviceCreateCommandList(DX12Device self, WisQueueType t WISDOM_API WisResult DX12DeviceCreateGraphicsPipeline(DX12Device self, const DX12GraphicsPipelineDesc* desc, DX12PipelineState* pipeline); /** - * @brief Creates a root signature object. + * @brief Creates a root signature object for use with DescriptorStorage. * @param self valid handle to the Device - * @param root_constants The root constants to create the root signature with. - * @param constants_size The number of root constants. - * @param tables The descriptor tables to create the root signature with. - * @param tables_count The number of descriptor tables. + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. push_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param descriptors_count The number of push descriptors. Max is 8. + * @param space_overlap_count Count of descriptor spaces to overlap for each of the DescriptorStorage types. + * Default is 1. Max is 16. This is used primarily for descriptor type aliasing. + * Example: If DX12Device is 2, that means that 2 descriptor spaces will be allocated for each descriptor type. + * [[vk::binding(0,0)]] SamplerState samplers: register(s0,space1); // space1 can be used for different type of samplers e.g. SamplerComparisonState + * [[vk::binding(0,0)]] SamplerComparisonState shadow_samplers: register(s0,space2); // they use the same binding (works like overloading) + * [[vk::binding(0,1)]] ConstantBuffer cbuffers: register(b0,space3); // this type also has 2 spaces, next will be on space 4 etc. * @param signature DX12RootSignature on success (StatusOk). * @return Result with StatusOk on success. * Error in WisResult::error otherwise. * */ -WISDOM_API WisResult DX12DeviceCreateRootSignature(DX12Device self, const WisRootConstant* root_constants, uint32_t constants_size, const WisDescriptorTable* tables, uint32_t tables_count, DX12RootSignature* signature); +WISDOM_API WisResult DX12DeviceCreateRootSignature(DX12Device self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t descriptors_count, uint32_t space_overlap_count, DX12RootSignature* signature); + +/** + * @brief Creates a root signature object for use with DescriptorStorage. + * Supplies number of types for each descriptor type separately. + * @param self valid handle to the Device + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. root_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param push_descriptors_count The number of push descriptors. Max is 8. + * @param descriptor_spacing Descriptor spacing allocation. + * nullptr means allocate 1 space for each. + * @param signature DX12RootSignature on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +WISDOM_API WisResult DX12DeviceCreateRootSignature2(DX12Device self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t push_descriptors_count, const WisDescriptorSpacing* descriptor_spacing, DX12RootSignature* signature); /** * @brief Creates a shader object. @@ -3298,159 +3352,55 @@ WISDOM_API WisResult DX12DeviceCreateSampler(DX12Device self, const WisSamplerDe WISDOM_API WisResult DX12DeviceCreateShaderResource(DX12Device self, DX12Texture texture, WisShaderResourceDesc desc, DX12ShaderResource* resource); /** - * @brief Returns the alignment of the descriptor table in bytes. - * The value is used to correctly determine descriptor page alignment for descriptor buffer. + * @brief Queries if the device supports the feature. * @param self valid handle to the Device - * @param heap The type of the descriptor heap to get the alignment for. - * @return The alignment of the descriptor table in bytes. + * @param feature The feature to query. + * @return true if feature is supported. false otherwise. * */ -WISDOM_API uint32_t DX12DeviceGetDescriptorTableAlignment(DX12Device self, WisDescriptorHeapType heap); +WISDOM_API bool DX12DeviceQueryFeatureSupport(DX12Device self, WisDeviceFeature feature); +// DX12ResourceAllocator methods -- /** - * @brief Returns the size of the descriptor buffer unit in bytes. - * @param self valid handle to the Device - * @param heap The type of the descriptor heap to get the unit size for. - * @return The size of the descriptor buffer unit in bytes. Descriptor unit is the size of one descriptor. + * @brief Destroys the DX12ResourceAllocator. + * You can still use memory allocated by it even if it is destroyed. + * @param self valid handle to the ResourceAllocator * */ -WISDOM_API uint32_t DX12DeviceGetDescriptorBufferUnitSize(DX12Device self, WisDescriptorHeapType heap); +WISDOM_API void DX12ResourceAllocatorDestroy(DX12ResourceAllocator self); /** - * @brief Creates a descriptor buffer object. - * @param self valid handle to the Device - * @param heap_type The type of the descriptor heap to create the descriptor buffer with. - * @param memory_type The type of the descriptor memory to create the descriptor buffer with. - * @param size_bytes The number of bytes to allocate for the descriptor buffer. - * @param buffer DX12DescriptorBuffer on success (StatusOk). + * @brief Creates a buffer object and allocates memory for it. + * Equivalent to creating a Buffer, allocating a memory and binding buffer to it. + * @param self valid handle to the ResourceAllocator + * @param size The size of the buffer in bytes. + * @param usage The usage of the buffer. May affect the alignment of the buffer memory allocation. + * @param memory The type of the memory to allocate for the buffer. + * @param mem_flags The flags of the memory to allocate for the buffer. + * @param buffer DX12Buffer on success (StatusOk). * @return Result with StatusOk on success. * Error in WisResult::error otherwise. * */ -WISDOM_API WisResult DX12DeviceCreateDescriptorBuffer(DX12Device self, WisDescriptorHeapType heap_type, WisDescriptorMemory memory_type, uint64_t size_bytes, DX12DescriptorBuffer* buffer); +WISDOM_API WisResult DX12ResourceAllocatorCreateBuffer(DX12ResourceAllocator self, uint64_t size, WisBufferUsage usage, WisMemoryType memory, WisMemoryFlags mem_flags, DX12Buffer* buffer); /** - * @brief Queries if the device supports the feature. - * @param self valid handle to the Device - * @param feature The feature to query. - * @return true if feature is supported. false otherwise. + * @brief Creates a texture object and allocates memory for it. + * Equivalent to creating a Texture, allocating a memory and binding texture to it. + * @param self valid handle to the ResourceAllocator + * @param desc The description of the texture to create. + * @param memory The type of the memory to allocate for the texture. + * @param mem_flags The flags of the memory to allocate for the texture. + * @param texture DX12Texture on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. * */ -WISDOM_API bool DX12DeviceQueryFeatureSupport(DX12Device self, WisDeviceFeature feature); +WISDOM_API WisResult DX12ResourceAllocatorCreateTexture(DX12ResourceAllocator self, const WisTextureDesc* desc, WisMemoryType memory, WisMemoryFlags mem_flags, DX12Texture* texture); -// DX12DescriptorBuffer methods -- /** - * @brief Destroys the DX12DescriptorBuffer. - * @param self valid handle to the DescriptorBuffer + * @brief Returns the allocation info for the texture. + * @param self valid handle to the ResourceAllocator + * @param desc The description of the texture to get the allocation info for. + * @return The allocation info for the texture. Contains size and alignment. Useful if allocating memory manually. * */ -WISDOM_API void DX12DescriptorBufferDestroy(DX12DescriptorBuffer self); - -/** - * @brief Writes the sampler to the sampler descriptor buffer. - * Must be called with Sampler descriptor buffer, which was created with DescriptorHeapTypeSampler. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with DX12Device. - * @param index Binding index in descriptor table. - * @param sampler The sampler to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t DX12DescriptorBufferWriteSampler(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12Sampler sampler); - -/** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * Must be called with Shader Resource descriptor buffer, which was created with DescriptorHeapTypeDescriptor. - * Requires DeviceFeatureDescriptorEqualSize to run, otherwise program is ill-formed. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with DX12Device. - * @param index Binding index in descriptor table. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t DX12DescriptorBufferWriteShaderResource2(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12ShaderResource resource); - -/** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * Must be called with Constant Buffer descriptor buffer, which was created with DescriptorHeapTypeDescriptor. - * Requires DeviceFeatureDescriptorEqualSize to run, otherwise program is ill-formed. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with DX12Device. - * @param index Binding index in descriptor table. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t DX12DescriptorBufferWriteConstantBuffer2(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12Buffer buffer, uint32_t buffer_size); - -/** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with DX12Device. - * @param root_table_index Index of the descriptor table in DX12RootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t DX12DescriptorBufferWriteShaderResource(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, DX12RootSignature root_signature, DX12ShaderResource resource); - -/** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with DX12Device. - * @param root_table_index Index of the descriptor table in DX12RootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -WISDOM_API uint64_t DX12DescriptorBufferWriteConstantBuffer(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, DX12RootSignature root_signature, DX12Buffer buffer, uint32_t buffer_size); - -// DX12ResourceAllocator methods -- -/** - * @brief Destroys the DX12ResourceAllocator. - * You can still use memory allocated by it even if it is destroyed. - * @param self valid handle to the ResourceAllocator - * */ -WISDOM_API void DX12ResourceAllocatorDestroy(DX12ResourceAllocator self); - -/** - * @brief Creates a buffer object and allocates memory for it. - * Equivalent to creating a Buffer, allocating a memory and binding buffer to it. - * @param self valid handle to the ResourceAllocator - * @param size The size of the buffer in bytes. - * @param usage The usage of the buffer. May affect the alignment of the buffer memory allocation. - * @param memory The type of the memory to allocate for the buffer. - * @param mem_flags The flags of the memory to allocate for the buffer. - * @param buffer DX12Buffer on success (StatusOk). - * @return Result with StatusOk on success. - * Error in WisResult::error otherwise. - * */ -WISDOM_API WisResult DX12ResourceAllocatorCreateBuffer(DX12ResourceAllocator self, uint64_t size, WisBufferUsage usage, WisMemoryType memory, WisMemoryFlags mem_flags, DX12Buffer* buffer); - -/** - * @brief Creates a texture object and allocates memory for it. - * Equivalent to creating a Texture, allocating a memory and binding texture to it. - * @param self valid handle to the ResourceAllocator - * @param desc The description of the texture to create. - * @param memory The type of the memory to allocate for the texture. - * @param mem_flags The flags of the memory to allocate for the texture. - * @param texture DX12Texture on success (StatusOk). - * @return Result with StatusOk on success. - * Error in WisResult::error otherwise. - * */ -WISDOM_API WisResult DX12ResourceAllocatorCreateTexture(DX12ResourceAllocator self, const WisTextureDesc* desc, WisMemoryType memory, WisMemoryFlags mem_flags, DX12Texture* texture); - -/** - * @brief Returns the allocation info for the texture. - * @param self valid handle to the ResourceAllocator - * @param desc The description of the texture to get the allocation info for. - * @return The allocation info for the texture. Contains size and alignment. Useful if allocating memory manually. - * */ -WISDOM_API WisAllocationInfo DX12ResourceAllocatorGetTextureAllocationInfo(DX12ResourceAllocator self, const WisTextureDesc* desc); +WISDOM_API WisAllocationInfo DX12ResourceAllocatorGetTextureAllocationInfo(DX12ResourceAllocator self, const WisTextureDesc* desc); /** * @brief Returns the allocation info for the buffer. @@ -3516,6 +3466,20 @@ WISDOM_API WisResult DX12ResourceAllocatorPlaceBuffer(DX12ResourceAllocator self * */ WISDOM_API WisResult DX12ResourceAllocatorPlaceTexture(DX12ResourceAllocator self, DX12Memory memory, uint64_t memory_offset, const WisTextureDesc* desc, DX12Texture* texture); +// DX12Memory methods -- +/** + * @brief Destroys the DX12Memory. + * @param self valid handle to the Memory + * */ +WISDOM_API void DX12MemoryDestroy(DX12Memory self); + +/** + * @brief Returns the offset of the block in the global memory. + * @param self valid handle to the Memory + * @return The offset of the block in the global memory. + * */ +WISDOM_API uint64_t DX12MemoryGetBlockOffset(DX12Memory self); + // DX12Fence methods -- /** * @brief Destroys the DX12Fence. @@ -3759,40 +3723,19 @@ WISDOM_API void DX12CommandListDrawInstanced(DX12CommandList self, uint32_t vert * @param offset_4bytes The offset in the data in 4-byte units. * @param stage The shader stages to set the root constants for. * */ -WISDOM_API void DX12CommandListSetRootConstants(DX12CommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage); - -/** - * @brief Sets the root descriptor tables for the shader. - * Operation will perform flush in some cases, so it's not recommended to rebind descriptor buffers too often. - * @param self valid handle to the CommandList - * @param buffers The descriptor buffers to set the root descriptor tables with. - * May only be one of each type (one Descriptor and one Sampler buffer) - * @param buffer_count The number of descriptor buffers to set. May be 1 or 2. - * */ -WISDOM_API void DX12CommandListSetDescriptorBuffers(DX12CommandList self, const DX12DescriptorBufferView* buffers, uint32_t buffer_count); +WISDOM_API void DX12CommandListSetPushConstants(DX12CommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage); /** - * @brief Sets the offset in the descriptor table for the descriptor buffer. + * @brief Pushes descriptor directly to the command list, without putting it to the table. + * Works only with buffer bindings. + * Buffer is always bound with full size. * @param self valid handle to the CommandList - * @param root_table_index The index of the root table to set the offset for. - * @param buffer The descriptor buffer to set the offset for. - * @param offset_bytes The offset in the descriptor buffer in bytes. - * */ -WISDOM_API void DX12CommandListSetDescriptorTableOffset(DX12CommandList self, uint32_t root_table_index, DX12DescriptorBuffer buffer, uint32_t offset_bytes); - -// DX12Memory methods -- -/** - * @brief Destroys the DX12Memory. - * @param self valid handle to the Memory - * */ -WISDOM_API void DX12MemoryDestroy(DX12Memory self); - -/** - * @brief Returns the offset of the block in the global memory. - * @param self valid handle to the Memory - * @return The offset of the block in the global memory. + * @param type The type of the descriptor to set. + * @param root_index The index of the root descriptor to set. + * @param buffer The buffer to set. + * @param offset The offset in the descriptor table to set the descriptor to. * */ -WISDOM_API uint64_t DX12MemoryGetBlockOffset(DX12Memory self); +WISDOM_API void DX12CommandListPushDescriptor(DX12CommandList self, WisDescriptorType type, uint32_t root_index, DX12Buffer buffer, uint32_t offset); // DX12SwapChain methods -- /** @@ -3884,6 +3827,40 @@ WISDOM_API void DX12BufferUnmap(DX12Buffer self); * */ WISDOM_API void DX12TextureDestroy(DX12Texture self); +// DX12DescriptorStorage methods -- +/** + * @brief Destroys the DX12DescriptorStorage. + * @param self valid handle to the DescriptorStorage + * */ +WISDOM_API void DX12DescriptorStorageDestroy(DX12DescriptorStorage self); + +/** + * @brief Writes the sampler to the sampler descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of samplers to fill. + * @param sampler The sampler to write. + * */ +WISDOM_API void DX12DescriptorStorageWriteSampler(DX12DescriptorStorage self, uint32_t index, DX12Sampler sampler); + +/** + * @brief Writes the constant buffer to the constant buffer descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of constant buffers to fill. + * @param buffer The buffer to write. + * @param size The size of the constant buffer in bytes. + * @param offset The offset in the buffer to write the constant buffer to. + * size + offset must be less or equal the overall size of the bound buffer. + * */ +WISDOM_API void DX12DescriptorStorageWriteConstantBuffer(DX12DescriptorStorage self, uint32_t index, DX12Buffer buffer, uint32_t size, uint32_t offset); + +/** + * @brief Writes the texture to the shader resource descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of shader resources to fill. + * @param resource The shader resource to write. + * */ +WISDOM_API void DX12DescriptorStorageWriteTexture(DX12DescriptorStorage self, uint32_t index, DX12ShaderResource resource); + // DX12RootSignature methods -- /** * @brief Destroys the DX12RootSignature. @@ -3964,7 +3941,6 @@ WISDOM_API DX12RenderTargetView AsDX12RenderTargetView(DX12RenderTarget self); WISDOM_API DX12CommandListView AsDX12CommandListView(DX12CommandList self); WISDOM_API DX12ShaderView AsDX12ShaderView(DX12Shader self); WISDOM_API DX12RootSignatureView AsDX12RootSignatureView(DX12RootSignature self); -WISDOM_API DX12DescriptorBufferView AsDX12DescriptorBufferView(DX12DescriptorBuffer self); #endif #if defined(WISDOM_VULKAN) && defined(WISDOM_FORCE_VULKAN) @@ -3980,15 +3956,15 @@ typedef DX12DeviceExtension WisDeviceExtension; typedef DX12PipelineState WisPipelineState; typedef DX12Adapter WisAdapter; typedef DX12Device WisDevice; -typedef DX12DescriptorBuffer WisDescriptorBuffer; typedef DX12FactoryExtension WisFactoryExtension; typedef DX12ResourceAllocator WisResourceAllocator; +typedef DX12Memory WisMemory; typedef DX12Fence WisFence; typedef DX12CommandList WisCommandList; -typedef DX12Memory WisMemory; typedef DX12SwapChain WisSwapChain; typedef DX12Buffer WisBuffer; typedef DX12Texture WisTexture; +typedef DX12DescriptorStorage WisDescriptorStorage; typedef DX12RootSignature WisRootSignature; typedef DX12Shader WisShader; typedef DX12DebugMessenger WisDebugMessenger; @@ -4002,7 +3978,6 @@ typedef DX12RenderTargetView WisRenderTargetView; typedef DX12CommandListView WisCommandListView; typedef DX12ShaderView WisShaderView; typedef DX12RootSignatureView WisRootSignatureView; -typedef DX12DescriptorBufferView WisDescriptorBufferView; typedef DX12BufferBarrier2 WisBufferBarrier2; typedef DX12TextureBarrier2 WisTextureBarrier2; typedef DX12GraphicsShaderStages WisGraphicsShaderStages; @@ -4021,7 +3996,7 @@ typedef DX12VertexBufferBinding WisVertexBufferBinding; * */ inline void WisCommandQueueDestroy(WisCommandQueue self) { - return DX12CommandQueueDestroy(self); + DX12CommandQueueDestroy(self); } /** @@ -4032,7 +4007,7 @@ inline void WisCommandQueueDestroy(WisCommandQueue self) * */ inline void WisCommandQueueExecuteCommandLists(WisCommandQueue self, const WisCommandListView* lists, uint32_t count) { - return DX12CommandQueueExecuteCommandLists(self, lists, count); + DX12CommandQueueExecuteCommandLists(self, lists, count); } /** @@ -4066,7 +4041,7 @@ inline WisResult WisCommandQueueWaitQueue(WisCommandQueue self, WisFence fence, * */ inline void WisFactoryDestroy(WisFactory self) { - return DX12FactoryDestroy(self); + DX12FactoryDestroy(self); } /** @@ -4091,7 +4066,7 @@ inline WisResult WisFactoryGetAdapter(WisFactory self, uint32_t index, WisAdapte * */ inline void WisPipelineStateDestroy(WisPipelineState self) { - return DX12PipelineStateDestroy(self); + DX12PipelineStateDestroy(self); } // WisAdapter methods -- @@ -4101,7 +4076,7 @@ inline void WisPipelineStateDestroy(WisPipelineState self) * */ inline void WisAdapterDestroy(WisAdapter self) { - return DX12AdapterDestroy(self); + DX12AdapterDestroy(self); } /** @@ -4123,7 +4098,7 @@ inline WisResult WisAdapterGetDesc(WisAdapter self, WisAdapterDesc* inout_desc) * */ inline void WisDeviceDestroy(WisDevice self) { - return DX12DeviceDestroy(self); + DX12DeviceDestroy(self); } /** @@ -4200,19 +4175,46 @@ inline WisResult WisDeviceCreateGraphicsPipeline(WisDevice self, const WisGraphi } /** - * @brief Creates a root signature object. + * @brief Creates a root signature object for use with DescriptorStorage. * @param self valid handle to the Device - * @param root_constants The root constants to create the root signature with. - * @param constants_size The number of root constants. - * @param tables The descriptor tables to create the root signature with. - * @param tables_count The number of descriptor tables. + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. push_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param descriptors_count The number of push descriptors. Max is 8. + * @param space_overlap_count Count of descriptor spaces to overlap for each of the DescriptorStorage types. + * Default is 1. Max is 16. This is used primarily for descriptor type aliasing. + * Example: If WisDevice is 2, that means that 2 descriptor spaces will be allocated for each descriptor type. + * [[vk::binding(0,0)]] SamplerState samplers: register(s0,space1); // space1 can be used for different type of samplers e.g. SamplerComparisonState + * [[vk::binding(0,0)]] SamplerComparisonState shadow_samplers: register(s0,space2); // they use the same binding (works like overloading) + * [[vk::binding(0,1)]] ConstantBuffer cbuffers: register(b0,space3); // this type also has 2 spaces, next will be on space 4 etc. + * @param signature WisRootSignature on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +inline WisResult WisDeviceCreateRootSignature(WisDevice self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t descriptors_count, uint32_t space_overlap_count, WisRootSignature* signature) +{ + return DX12DeviceCreateRootSignature(self, push_constants, constants_count, push_descriptors, descriptors_count, space_overlap_count, signature); +} + +/** + * @brief Creates a root signature object for use with DescriptorStorage. + * Supplies number of types for each descriptor type separately. + * @param self valid handle to the Device + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. root_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param push_descriptors_count The number of push descriptors. Max is 8. + * @param descriptor_spacing Descriptor spacing allocation. + * nullptr means allocate 1 space for each. * @param signature WisRootSignature on success (StatusOk). * @return Result with StatusOk on success. * Error in WisResult::error otherwise. * */ -inline WisResult WisDeviceCreateRootSignature(WisDevice self, const WisRootConstant* root_constants, uint32_t constants_size, const WisDescriptorTable* tables, uint32_t tables_count, WisRootSignature* signature) +inline WisResult WisDeviceCreateRootSignature2(WisDevice self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t push_descriptors_count, const WisDescriptorSpacing* descriptor_spacing, WisRootSignature* signature) { - return DX12DeviceCreateRootSignature(self, root_constants, constants_size, tables, tables_count, signature); + return DX12DeviceCreateRootSignature2(self, push_constants, constants_count, push_descriptors, push_descriptors_count, descriptor_spacing, signature); } /** @@ -4299,44 +4301,6 @@ inline WisResult WisDeviceCreateShaderResource(WisDevice self, WisTexture textur return DX12DeviceCreateShaderResource(self, texture, desc, resource); } -/** - * @brief Returns the alignment of the descriptor table in bytes. - * The value is used to correctly determine descriptor page alignment for descriptor buffer. - * @param self valid handle to the Device - * @param heap The type of the descriptor heap to get the alignment for. - * @return The alignment of the descriptor table in bytes. - * */ -inline uint32_t WisDeviceGetDescriptorTableAlignment(WisDevice self, WisDescriptorHeapType heap) -{ - return DX12DeviceGetDescriptorTableAlignment(self, heap); -} - -/** - * @brief Returns the size of the descriptor buffer unit in bytes. - * @param self valid handle to the Device - * @param heap The type of the descriptor heap to get the unit size for. - * @return The size of the descriptor buffer unit in bytes. Descriptor unit is the size of one descriptor. - * */ -inline uint32_t WisDeviceGetDescriptorBufferUnitSize(WisDevice self, WisDescriptorHeapType heap) -{ - return DX12DeviceGetDescriptorBufferUnitSize(self, heap); -} - -/** - * @brief Creates a descriptor buffer object. - * @param self valid handle to the Device - * @param heap_type The type of the descriptor heap to create the descriptor buffer with. - * @param memory_type The type of the descriptor memory to create the descriptor buffer with. - * @param size_bytes The number of bytes to allocate for the descriptor buffer. - * @param buffer WisDescriptorBuffer on success (StatusOk). - * @return Result with StatusOk on success. - * Error in WisResult::error otherwise. - * */ -inline WisResult WisDeviceCreateDescriptorBuffer(WisDevice self, WisDescriptorHeapType heap_type, WisDescriptorMemory memory_type, uint64_t size_bytes, WisDescriptorBuffer* buffer) -{ - return DX12DeviceCreateDescriptorBuffer(self, heap_type, memory_type, size_bytes, buffer); -} - /** * @brief Queries if the device supports the feature. * @param self valid handle to the Device @@ -4348,99 +4312,6 @@ inline bool WisDeviceQueryFeatureSupport(WisDevice self, WisDeviceFeature featur return DX12DeviceQueryFeatureSupport(self, feature); } -// WisDescriptorBuffer methods -- -/** - * @brief Destroys the WisDescriptorBuffer. - * @param self valid handle to the DescriptorBuffer - * */ -inline void WisDescriptorBufferDestroy(WisDescriptorBuffer self) -{ - return DX12DescriptorBufferDestroy(self); -} - -/** - * @brief Writes the sampler to the sampler descriptor buffer. - * Must be called with Sampler descriptor buffer, which was created with DescriptorHeapTypeSampler. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param index Binding index in descriptor table. - * @param sampler The sampler to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteSampler(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisSampler sampler) -{ - return DX12DescriptorBufferWriteSampler(self, aligned_table_offset, index, sampler); -} - -/** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * Must be called with Shader Resource descriptor buffer, which was created with DescriptorHeapTypeDescriptor. - * Requires DeviceFeatureDescriptorEqualSize to run, otherwise program is ill-formed. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param index Binding index in descriptor table. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteShaderResource2(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisShaderResource resource) -{ - return DX12DescriptorBufferWriteShaderResource2(self, aligned_table_offset, index, resource); -} - -/** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * Must be called with Constant Buffer descriptor buffer, which was created with DescriptorHeapTypeDescriptor. - * Requires DeviceFeatureDescriptorEqualSize to run, otherwise program is ill-formed. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param index Binding index in descriptor table. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteConstantBuffer2(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisBuffer buffer, uint32_t buffer_size) -{ - return DX12DescriptorBufferWriteConstantBuffer2(self, aligned_table_offset, index, buffer, buffer_size); -} - -/** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param root_table_index Index of the descriptor table in WisRootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteShaderResource(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, WisRootSignature root_signature, WisShaderResource resource) -{ - return DX12DescriptorBufferWriteShaderResource(self, aligned_table_offset, root_table_index, binding, array_member, root_signature, resource); -} - -/** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param root_table_index Index of the descriptor table in WisRootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteConstantBuffer(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, WisRootSignature root_signature, WisBuffer buffer, uint32_t buffer_size) -{ - return DX12DescriptorBufferWriteConstantBuffer(self, aligned_table_offset, root_table_index, binding, array_member, root_signature, buffer, buffer_size); -} - // WisResourceAllocator methods -- /** * @brief Destroys the WisResourceAllocator. @@ -4449,7 +4320,7 @@ inline uint64_t WisDescriptorBufferWriteConstantBuffer(WisDescriptorBuffer self, * */ inline void WisResourceAllocatorDestroy(WisResourceAllocator self) { - return DX12ResourceAllocatorDestroy(self); + DX12ResourceAllocatorDestroy(self); } /** @@ -4575,6 +4446,26 @@ inline WisResult WisResourceAllocatorPlaceTexture(WisResourceAllocator self, Wis return DX12ResourceAllocatorPlaceTexture(self, memory, memory_offset, desc, texture); } +// WisMemory methods -- +/** + * @brief Destroys the WisMemory. + * @param self valid handle to the Memory + * */ +inline void WisMemoryDestroy(WisMemory self) +{ + DX12MemoryDestroy(self); +} + +/** + * @brief Returns the offset of the block in the global memory. + * @param self valid handle to the Memory + * @return The offset of the block in the global memory. + * */ +inline uint64_t WisMemoryGetBlockOffset(WisMemory self) +{ + return DX12MemoryGetBlockOffset(self); +} + // WisFence methods -- /** * @brief Destroys the WisFence. @@ -4582,7 +4473,7 @@ inline WisResult WisResourceAllocatorPlaceTexture(WisResourceAllocator self, Wis * */ inline void WisFenceDestroy(WisFence self) { - return DX12FenceDestroy(self); + DX12FenceDestroy(self); } /** @@ -4623,7 +4514,7 @@ inline WisResult WisFenceSignal(WisFence self, uint64_t value) * */ inline void WisCommandListDestroy(WisCommandList self) { - return DX12CommandListDestroy(self); + DX12CommandListDestroy(self); } /** @@ -4663,7 +4554,7 @@ inline WisResult WisCommandListReset(WisCommandList self, WisPipelineState initi * */ inline void WisCommandListSetPipelineState(WisCommandList self, WisPipelineState pipeline) { - return DX12CommandListSetPipelineState(self, pipeline); + DX12CommandListSetPipelineState(self, pipeline); } /** @@ -4675,7 +4566,7 @@ inline void WisCommandListSetPipelineState(WisCommandList self, WisPipelineState * */ inline void WisCommandListCopyBuffer(WisCommandList self, WisBuffer source, WisBuffer destination, WisBufferRegion region) { - return DX12CommandListCopyBuffer(self, source, destination, region); + DX12CommandListCopyBuffer(self, source, destination, region); } /** @@ -4688,7 +4579,7 @@ inline void WisCommandListCopyBuffer(WisCommandList self, WisBuffer source, WisB * */ inline void WisCommandListCopyBufferToTexture(WisCommandList self, WisBuffer source, WisTexture destination, const WisBufferTextureCopyRegion* regions, uint32_t region_count) { - return DX12CommandListCopyBufferToTexture(self, source, destination, regions, region_count); + DX12CommandListCopyBufferToTexture(self, source, destination, regions, region_count); } /** @@ -4701,7 +4592,7 @@ inline void WisCommandListCopyBufferToTexture(WisCommandList self, WisBuffer sou * */ inline void WisCommandListCopyTextureToBuffer(WisCommandList self, WisTexture source, WisBuffer destination, const WisBufferTextureCopyRegion* regions, uint32_t region_count) { - return DX12CommandListCopyTextureToBuffer(self, source, destination, regions, region_count); + DX12CommandListCopyTextureToBuffer(self, source, destination, regions, region_count); } /** @@ -4712,7 +4603,7 @@ inline void WisCommandListCopyTextureToBuffer(WisCommandList self, WisTexture so * */ inline void WisCommandListBufferBarrier(WisCommandList self, WisBufferBarrier barrier, WisBuffer buffer) { - return DX12CommandListBufferBarrier(self, barrier, buffer); + DX12CommandListBufferBarrier(self, barrier, buffer); } /** @@ -4723,7 +4614,7 @@ inline void WisCommandListBufferBarrier(WisCommandList self, WisBufferBarrier ba * */ inline void WisCommandListBufferBarriers(WisCommandList self, const WisBufferBarrier2* barriers, uint32_t barrier_count) { - return DX12CommandListBufferBarriers(self, barriers, barrier_count); + DX12CommandListBufferBarriers(self, barriers, barrier_count); } /** @@ -4734,7 +4625,7 @@ inline void WisCommandListBufferBarriers(WisCommandList self, const WisBufferBar * */ inline void WisCommandListTextureBarrier(WisCommandList self, WisTextureBarrier barrier, WisTexture texture) { - return DX12CommandListTextureBarrier(self, barrier, texture); + DX12CommandListTextureBarrier(self, barrier, texture); } /** @@ -4745,7 +4636,7 @@ inline void WisCommandListTextureBarrier(WisCommandList self, WisTextureBarrier * */ inline void WisCommandListTextureBarriers(WisCommandList self, const WisTextureBarrier2* barriers, uint32_t barrier_count) { - return DX12CommandListTextureBarriers(self, barriers, barrier_count); + DX12CommandListTextureBarriers(self, barriers, barrier_count); } /** @@ -4755,7 +4646,7 @@ inline void WisCommandListTextureBarriers(WisCommandList self, const WisTextureB * */ inline void WisCommandListBeginRenderPass(WisCommandList self, const WisRenderPassDesc* pass_desc) { - return DX12CommandListBeginRenderPass(self, pass_desc); + DX12CommandListBeginRenderPass(self, pass_desc); } /** @@ -4764,7 +4655,7 @@ inline void WisCommandListBeginRenderPass(WisCommandList self, const WisRenderPa * */ inline void WisCommandListEndRenderPass(WisCommandList self) { - return DX12CommandListEndRenderPass(self); + DX12CommandListEndRenderPass(self); } /** @@ -4774,7 +4665,7 @@ inline void WisCommandListEndRenderPass(WisCommandList self) * */ inline void WisCommandListSetRootSignature(WisCommandList self, WisRootSignature root_signature) { - return DX12CommandListSetRootSignature(self, root_signature); + DX12CommandListSetRootSignature(self, root_signature); } /** @@ -4784,7 +4675,7 @@ inline void WisCommandListSetRootSignature(WisCommandList self, WisRootSignature * */ inline void WisCommandListIASetPrimitiveTopology(WisCommandList self, WisPrimitiveTopology topology) { - return DX12CommandListIASetPrimitiveTopology(self, topology); + DX12CommandListIASetPrimitiveTopology(self, topology); } /** @@ -4796,7 +4687,7 @@ inline void WisCommandListIASetPrimitiveTopology(WisCommandList self, WisPrimiti * */ inline void WisCommandListIASetVertexBuffers(WisCommandList self, const WisVertexBufferBinding* resources, uint32_t count, uint32_t start_slot) { - return DX12CommandListIASetVertexBuffers(self, resources, count, start_slot); + DX12CommandListIASetVertexBuffers(self, resources, count, start_slot); } /** @@ -4808,7 +4699,7 @@ inline void WisCommandListIASetVertexBuffers(WisCommandList self, const WisVerte * */ inline void WisCommandListIASetIndexBuffer(WisCommandList self, WisBuffer buffer, WisIndexType type, uint64_t offset) { - return DX12CommandListIASetIndexBuffer(self, buffer, type, offset); + DX12CommandListIASetIndexBuffer(self, buffer, type, offset); } /** @@ -4823,7 +4714,7 @@ inline void WisCommandListIASetIndexBuffer(WisCommandList self, WisBuffer buffer * */ inline void WisCommandListIASetIndexBuffer2(WisCommandList self, WisBuffer buffer, WisIndexType type, uint32_t size, uint64_t offset) { - return DX12CommandListIASetIndexBuffer2(self, buffer, type, size, offset); + DX12CommandListIASetIndexBuffer2(self, buffer, type, size, offset); } /** @@ -4833,7 +4724,7 @@ inline void WisCommandListIASetIndexBuffer2(WisCommandList self, WisBuffer buffe * */ inline void WisCommandListRSSetViewport(WisCommandList self, WisViewport viewport) { - return DX12CommandListRSSetViewport(self, viewport); + DX12CommandListRSSetViewport(self, viewport); } /** @@ -4844,7 +4735,7 @@ inline void WisCommandListRSSetViewport(WisCommandList self, WisViewport viewpor * */ inline void WisCommandListRSSetViewports(WisCommandList self, const WisViewport* viewports, uint32_t count) { - return DX12CommandListRSSetViewports(self, viewports, count); + DX12CommandListRSSetViewports(self, viewports, count); } /** @@ -4854,7 +4745,7 @@ inline void WisCommandListRSSetViewports(WisCommandList self, const WisViewport* * */ inline void WisCommandListRSSetScissor(WisCommandList self, WisScissor scissor) { - return DX12CommandListRSSetScissor(self, scissor); + DX12CommandListRSSetScissor(self, scissor); } /** @@ -4867,7 +4758,7 @@ inline void WisCommandListRSSetScissor(WisCommandList self, WisScissor scissor) * */ inline void WisCommandListRSSetScissors(WisCommandList self, const WisScissor* scissors, uint32_t count) { - return DX12CommandListRSSetScissors(self, scissors, count); + DX12CommandListRSSetScissors(self, scissors, count); } /** @@ -4881,7 +4772,7 @@ inline void WisCommandListRSSetScissors(WisCommandList self, const WisScissor* s * */ inline void WisCommandListDrawIndexedInstanced(WisCommandList self, uint32_t vertex_count_per_instance, uint32_t instance_count, uint32_t start_index, uint32_t base_vertex, uint32_t start_instance) { - return DX12CommandListDrawIndexedInstanced(self, vertex_count_per_instance, instance_count, start_index, base_vertex, start_instance); + DX12CommandListDrawIndexedInstanced(self, vertex_count_per_instance, instance_count, start_index, base_vertex, start_instance); } /** @@ -4894,7 +4785,7 @@ inline void WisCommandListDrawIndexedInstanced(WisCommandList self, uint32_t ver * */ inline void WisCommandListDrawInstanced(WisCommandList self, uint32_t vertex_count_per_instance, uint32_t instance_count, uint32_t start_vertex, uint32_t start_instance) { - return DX12CommandListDrawInstanced(self, vertex_count_per_instance, instance_count, start_vertex, start_instance); + DX12CommandListDrawInstanced(self, vertex_count_per_instance, instance_count, start_vertex, start_instance); } /** @@ -4905,64 +4796,34 @@ inline void WisCommandListDrawInstanced(WisCommandList self, uint32_t vertex_cou * @param offset_4bytes The offset in the data in 4-byte units. * @param stage The shader stages to set the root constants for. * */ -inline void WisCommandListSetRootConstants(WisCommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage) +inline void WisCommandListSetPushConstants(WisCommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage) { - return DX12CommandListSetRootConstants(self, data, size_4bytes, offset_4bytes, stage); + DX12CommandListSetPushConstants(self, data, size_4bytes, offset_4bytes, stage); } /** - * @brief Sets the root descriptor tables for the shader. - * Operation will perform flush in some cases, so it's not recommended to rebind descriptor buffers too often. + * @brief Pushes descriptor directly to the command list, without putting it to the table. + * Works only with buffer bindings. + * Buffer is always bound with full size. * @param self valid handle to the CommandList - * @param buffers The descriptor buffers to set the root descriptor tables with. - * May only be one of each type (one Descriptor and one Sampler buffer) - * @param buffer_count The number of descriptor buffers to set. May be 1 or 2. + * @param type The type of the descriptor to set. + * @param root_index The index of the root descriptor to set. + * @param buffer The buffer to set. + * @param offset The offset in the descriptor table to set the descriptor to. * */ -inline void WisCommandListSetDescriptorBuffers(WisCommandList self, const WisDescriptorBufferView* buffers, uint32_t buffer_count) +inline void WisCommandListPushDescriptor(WisCommandList self, WisDescriptorType type, uint32_t root_index, WisBuffer buffer, uint32_t offset) { - return DX12CommandListSetDescriptorBuffers(self, buffers, buffer_count); + DX12CommandListPushDescriptor(self, type, root_index, buffer, offset); } -/** - * @brief Sets the offset in the descriptor table for the descriptor buffer. - * @param self valid handle to the CommandList - * @param root_table_index The index of the root table to set the offset for. - * @param buffer The descriptor buffer to set the offset for. - * @param offset_bytes The offset in the descriptor buffer in bytes. - * */ -inline void WisCommandListSetDescriptorTableOffset(WisCommandList self, uint32_t root_table_index, WisDescriptorBuffer buffer, uint32_t offset_bytes) -{ - return DX12CommandListSetDescriptorTableOffset(self, root_table_index, buffer, offset_bytes); -} - -// WisMemory methods -- -/** - * @brief Destroys the WisMemory. - * @param self valid handle to the Memory - * */ -inline void WisMemoryDestroy(WisMemory self) -{ - return DX12MemoryDestroy(self); -} - -/** - * @brief Returns the offset of the block in the global memory. - * @param self valid handle to the Memory - * @return The offset of the block in the global memory. - * */ -inline uint64_t WisMemoryGetBlockOffset(WisMemory self) -{ - return DX12MemoryGetBlockOffset(self); -} - -// WisSwapChain methods -- +// WisSwapChain methods -- /** * @brief Destroys the WisSwapChain. * @param self valid handle to the SwapChain * */ inline void WisSwapChainDestroy(WisSwapChain self) { - return DX12SwapChainDestroy(self); + DX12SwapChainDestroy(self); } /** @@ -5049,7 +4910,7 @@ inline WisResult WisSwapChainWaitForPresent(WisSwapChain self, uint64_t timeout_ * */ inline void WisBufferDestroy(WisBuffer self) { - return DX12BufferDestroy(self); + DX12BufferDestroy(self); } /** @@ -5068,7 +4929,7 @@ inline void* WisBufferMapRaw(WisBuffer self) * */ inline void WisBufferUnmap(WisBuffer self) { - return DX12BufferUnmap(self); + DX12BufferUnmap(self); } // WisTexture methods -- @@ -5078,7 +4939,53 @@ inline void WisBufferUnmap(WisBuffer self) * */ inline void WisTextureDestroy(WisTexture self) { - return DX12TextureDestroy(self); + DX12TextureDestroy(self); +} + +// WisDescriptorStorage methods -- +/** + * @brief Destroys the WisDescriptorStorage. + * @param self valid handle to the DescriptorStorage + * */ +inline void WisDescriptorStorageDestroy(WisDescriptorStorage self) +{ + DX12DescriptorStorageDestroy(self); +} + +/** + * @brief Writes the sampler to the sampler descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of samplers to fill. + * @param sampler The sampler to write. + * */ +inline void WisDescriptorStorageWriteSampler(WisDescriptorStorage self, uint32_t index, WisSampler sampler) +{ + DX12DescriptorStorageWriteSampler(self, index, sampler); +} + +/** + * @brief Writes the constant buffer to the constant buffer descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of constant buffers to fill. + * @param buffer The buffer to write. + * @param size The size of the constant buffer in bytes. + * @param offset The offset in the buffer to write the constant buffer to. + * size + offset must be less or equal the overall size of the bound buffer. + * */ +inline void WisDescriptorStorageWriteConstantBuffer(WisDescriptorStorage self, uint32_t index, WisBuffer buffer, uint32_t size, uint32_t offset) +{ + DX12DescriptorStorageWriteConstantBuffer(self, index, buffer, size, offset); +} + +/** + * @brief Writes the texture to the shader resource descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of shader resources to fill. + * @param resource The shader resource to write. + * */ +inline void WisDescriptorStorageWriteTexture(WisDescriptorStorage self, uint32_t index, WisShaderResource resource) +{ + DX12DescriptorStorageWriteTexture(self, index, resource); } // WisRootSignature methods -- @@ -5088,7 +4995,7 @@ inline void WisTextureDestroy(WisTexture self) * */ inline void WisRootSignatureDestroy(WisRootSignature self) { - return DX12RootSignatureDestroy(self); + DX12RootSignatureDestroy(self); } // WisShader methods -- @@ -5098,7 +5005,7 @@ inline void WisRootSignatureDestroy(WisRootSignature self) * */ inline void WisShaderDestroy(WisShader self) { - return DX12ShaderDestroy(self); + DX12ShaderDestroy(self); } // WisDebugMessenger methods -- @@ -5108,7 +5015,7 @@ inline void WisShaderDestroy(WisShader self) * */ inline void WisDebugMessengerDestroy(WisDebugMessenger self) { - return DX12DebugMessengerDestroy(self); + DX12DebugMessengerDestroy(self); } // WisRenderTarget methods -- @@ -5118,7 +5025,7 @@ inline void WisDebugMessengerDestroy(WisDebugMessenger self) * */ inline void WisRenderTargetDestroy(WisRenderTarget self) { - return DX12RenderTargetDestroy(self); + DX12RenderTargetDestroy(self); } // WisSampler methods -- @@ -5128,7 +5035,7 @@ inline void WisRenderTargetDestroy(WisRenderTarget self) * */ inline void WisSamplerDestroy(WisSampler self) { - return DX12SamplerDestroy(self); + DX12SamplerDestroy(self); } // WisShaderResource methods -- @@ -5138,7 +5045,7 @@ inline void WisSamplerDestroy(WisSampler self) * */ inline void WisShaderResourceDestroy(WisShaderResource self) { - return DX12ShaderResourceDestroy(self); + DX12ShaderResourceDestroy(self); } //------------------------------------------------------------------------- @@ -5185,15 +5092,15 @@ typedef VKDeviceExtension WisDeviceExtension; typedef VKPipelineState WisPipelineState; typedef VKAdapter WisAdapter; typedef VKDevice WisDevice; -typedef VKDescriptorBuffer WisDescriptorBuffer; typedef VKFactoryExtension WisFactoryExtension; typedef VKResourceAllocator WisResourceAllocator; +typedef VKMemory WisMemory; typedef VKFence WisFence; typedef VKCommandList WisCommandList; -typedef VKMemory WisMemory; typedef VKSwapChain WisSwapChain; typedef VKBuffer WisBuffer; typedef VKTexture WisTexture; +typedef VKDescriptorStorage WisDescriptorStorage; typedef VKRootSignature WisRootSignature; typedef VKShader WisShader; typedef VKDebugMessenger WisDebugMessenger; @@ -5207,7 +5114,6 @@ typedef VKRenderTargetView WisRenderTargetView; typedef VKCommandListView WisCommandListView; typedef VKShaderView WisShaderView; typedef VKRootSignatureView WisRootSignatureView; -typedef VKDescriptorBufferView WisDescriptorBufferView; typedef VKBufferBarrier2 WisBufferBarrier2; typedef VKTextureBarrier2 WisTextureBarrier2; typedef VKGraphicsShaderStages WisGraphicsShaderStages; @@ -5226,7 +5132,7 @@ typedef VKVertexBufferBinding WisVertexBufferBinding; * */ inline void WisCommandQueueDestroy(WisCommandQueue self) { - return VKCommandQueueDestroy(self); + VKCommandQueueDestroy(self); } /** @@ -5237,7 +5143,7 @@ inline void WisCommandQueueDestroy(WisCommandQueue self) * */ inline void WisCommandQueueExecuteCommandLists(WisCommandQueue self, const WisCommandListView* lists, uint32_t count) { - return VKCommandQueueExecuteCommandLists(self, lists, count); + VKCommandQueueExecuteCommandLists(self, lists, count); } /** @@ -5271,7 +5177,7 @@ inline WisResult WisCommandQueueWaitQueue(WisCommandQueue self, WisFence fence, * */ inline void WisFactoryDestroy(WisFactory self) { - return VKFactoryDestroy(self); + VKFactoryDestroy(self); } /** @@ -5296,7 +5202,7 @@ inline WisResult WisFactoryGetAdapter(WisFactory self, uint32_t index, WisAdapte * */ inline void WisPipelineStateDestroy(WisPipelineState self) { - return VKPipelineStateDestroy(self); + VKPipelineStateDestroy(self); } // WisAdapter methods -- @@ -5306,7 +5212,7 @@ inline void WisPipelineStateDestroy(WisPipelineState self) * */ inline void WisAdapterDestroy(WisAdapter self) { - return VKAdapterDestroy(self); + VKAdapterDestroy(self); } /** @@ -5328,7 +5234,7 @@ inline WisResult WisAdapterGetDesc(WisAdapter self, WisAdapterDesc* inout_desc) * */ inline void WisDeviceDestroy(WisDevice self) { - return VKDeviceDestroy(self); + VKDeviceDestroy(self); } /** @@ -5405,19 +5311,46 @@ inline WisResult WisDeviceCreateGraphicsPipeline(WisDevice self, const WisGraphi } /** - * @brief Creates a root signature object. + * @brief Creates a root signature object for use with DescriptorStorage. * @param self valid handle to the Device - * @param root_constants The root constants to create the root signature with. - * @param constants_size The number of root constants. - * @param tables The descriptor tables to create the root signature with. - * @param tables_count The number of descriptor tables. + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. push_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param descriptors_count The number of push descriptors. Max is 8. + * @param space_overlap_count Count of descriptor spaces to overlap for each of the DescriptorStorage types. + * Default is 1. Max is 16. This is used primarily for descriptor type aliasing. + * Example: If WisDevice is 2, that means that 2 descriptor spaces will be allocated for each descriptor type. + * [[vk::binding(0,0)]] SamplerState samplers: register(s0,space1); // space1 can be used for different type of samplers e.g. SamplerComparisonState + * [[vk::binding(0,0)]] SamplerComparisonState shadow_samplers: register(s0,space2); // they use the same binding (works like overloading) + * [[vk::binding(0,1)]] ConstantBuffer cbuffers: register(b0,space3); // this type also has 2 spaces, next will be on space 4 etc. + * @param signature WisRootSignature on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +inline WisResult WisDeviceCreateRootSignature(WisDevice self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t descriptors_count, uint32_t space_overlap_count, WisRootSignature* signature) +{ + return VKDeviceCreateRootSignature(self, push_constants, constants_count, push_descriptors, descriptors_count, space_overlap_count, signature); +} + +/** + * @brief Creates a root signature object for use with DescriptorStorage. + * Supplies number of types for each descriptor type separately. + * @param self valid handle to the Device + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. root_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param push_descriptors_count The number of push descriptors. Max is 8. + * @param descriptor_spacing Descriptor spacing allocation. + * nullptr means allocate 1 space for each. * @param signature WisRootSignature on success (StatusOk). * @return Result with StatusOk on success. * Error in WisResult::error otherwise. * */ -inline WisResult WisDeviceCreateRootSignature(WisDevice self, const WisRootConstant* root_constants, uint32_t constants_size, const WisDescriptorTable* tables, uint32_t tables_count, WisRootSignature* signature) +inline WisResult WisDeviceCreateRootSignature2(WisDevice self, const WisPushConstant* push_constants, uint32_t constants_count, const WisPushDescriptor* push_descriptors, uint32_t push_descriptors_count, const WisDescriptorSpacing* descriptor_spacing, WisRootSignature* signature) { - return VKDeviceCreateRootSignature(self, root_constants, constants_size, tables, tables_count, signature); + return VKDeviceCreateRootSignature2(self, push_constants, constants_count, push_descriptors, push_descriptors_count, descriptor_spacing, signature); } /** @@ -5504,44 +5437,6 @@ inline WisResult WisDeviceCreateShaderResource(WisDevice self, WisTexture textur return VKDeviceCreateShaderResource(self, texture, desc, resource); } -/** - * @brief Returns the alignment of the descriptor table in bytes. - * The value is used to correctly determine descriptor page alignment for descriptor buffer. - * @param self valid handle to the Device - * @param heap The type of the descriptor heap to get the alignment for. - * @return The alignment of the descriptor table in bytes. - * */ -inline uint32_t WisDeviceGetDescriptorTableAlignment(WisDevice self, WisDescriptorHeapType heap) -{ - return VKDeviceGetDescriptorTableAlignment(self, heap); -} - -/** - * @brief Returns the size of the descriptor buffer unit in bytes. - * @param self valid handle to the Device - * @param heap The type of the descriptor heap to get the unit size for. - * @return The size of the descriptor buffer unit in bytes. Descriptor unit is the size of one descriptor. - * */ -inline uint32_t WisDeviceGetDescriptorBufferUnitSize(WisDevice self, WisDescriptorHeapType heap) -{ - return VKDeviceGetDescriptorBufferUnitSize(self, heap); -} - -/** - * @brief Creates a descriptor buffer object. - * @param self valid handle to the Device - * @param heap_type The type of the descriptor heap to create the descriptor buffer with. - * @param memory_type The type of the descriptor memory to create the descriptor buffer with. - * @param size_bytes The number of bytes to allocate for the descriptor buffer. - * @param buffer WisDescriptorBuffer on success (StatusOk). - * @return Result with StatusOk on success. - * Error in WisResult::error otherwise. - * */ -inline WisResult WisDeviceCreateDescriptorBuffer(WisDevice self, WisDescriptorHeapType heap_type, WisDescriptorMemory memory_type, uint64_t size_bytes, WisDescriptorBuffer* buffer) -{ - return VKDeviceCreateDescriptorBuffer(self, heap_type, memory_type, size_bytes, buffer); -} - /** * @brief Queries if the device supports the feature. * @param self valid handle to the Device @@ -5553,99 +5448,6 @@ inline bool WisDeviceQueryFeatureSupport(WisDevice self, WisDeviceFeature featur return VKDeviceQueryFeatureSupport(self, feature); } -// WisDescriptorBuffer methods -- -/** - * @brief Destroys the WisDescriptorBuffer. - * @param self valid handle to the DescriptorBuffer - * */ -inline void WisDescriptorBufferDestroy(WisDescriptorBuffer self) -{ - return VKDescriptorBufferDestroy(self); -} - -/** - * @brief Writes the sampler to the sampler descriptor buffer. - * Must be called with Sampler descriptor buffer, which was created with DescriptorHeapTypeSampler. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param index Binding index in descriptor table. - * @param sampler The sampler to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteSampler(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisSampler sampler) -{ - return VKDescriptorBufferWriteSampler(self, aligned_table_offset, index, sampler); -} - -/** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * Must be called with Shader Resource descriptor buffer, which was created with DescriptorHeapTypeDescriptor. - * Requires DeviceFeatureDescriptorEqualSize to run, otherwise program is ill-formed. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param index Binding index in descriptor table. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteShaderResource2(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisShaderResource resource) -{ - return VKDescriptorBufferWriteShaderResource2(self, aligned_table_offset, index, resource); -} - -/** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * Must be called with Constant Buffer descriptor buffer, which was created with DescriptorHeapTypeDescriptor. - * Requires DeviceFeatureDescriptorEqualSize to run, otherwise program is ill-formed. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param index Binding index in descriptor table. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteConstantBuffer2(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisBuffer buffer, uint32_t buffer_size) -{ - return VKDescriptorBufferWriteConstantBuffer2(self, aligned_table_offset, index, buffer, buffer_size); -} - -/** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param root_table_index Index of the descriptor table in WisRootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteShaderResource(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, WisRootSignature root_signature, WisShaderResource resource) -{ - return VKDescriptorBufferWriteShaderResource(self, aligned_table_offset, root_table_index, binding, array_member, root_signature, resource); -} - -/** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * @param self valid handle to the DescriptorBuffer - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with WisDevice. - * @param root_table_index Index of the descriptor table in WisRootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ -inline uint64_t WisDescriptorBufferWriteConstantBuffer(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, WisRootSignature root_signature, WisBuffer buffer, uint32_t buffer_size) -{ - return VKDescriptorBufferWriteConstantBuffer(self, aligned_table_offset, root_table_index, binding, array_member, root_signature, buffer, buffer_size); -} - // WisResourceAllocator methods -- /** * @brief Destroys the WisResourceAllocator. @@ -5654,7 +5456,7 @@ inline uint64_t WisDescriptorBufferWriteConstantBuffer(WisDescriptorBuffer self, * */ inline void WisResourceAllocatorDestroy(WisResourceAllocator self) { - return VKResourceAllocatorDestroy(self); + VKResourceAllocatorDestroy(self); } /** @@ -5780,6 +5582,26 @@ inline WisResult WisResourceAllocatorPlaceTexture(WisResourceAllocator self, Wis return VKResourceAllocatorPlaceTexture(self, memory, memory_offset, desc, texture); } +// WisMemory methods -- +/** + * @brief Destroys the WisMemory. + * @param self valid handle to the Memory + * */ +inline void WisMemoryDestroy(WisMemory self) +{ + VKMemoryDestroy(self); +} + +/** + * @brief Returns the offset of the block in the global memory. + * @param self valid handle to the Memory + * @return The offset of the block in the global memory. + * */ +inline uint64_t WisMemoryGetBlockOffset(WisMemory self) +{ + return VKMemoryGetBlockOffset(self); +} + // WisFence methods -- /** * @brief Destroys the WisFence. @@ -5787,7 +5609,7 @@ inline WisResult WisResourceAllocatorPlaceTexture(WisResourceAllocator self, Wis * */ inline void WisFenceDestroy(WisFence self) { - return VKFenceDestroy(self); + VKFenceDestroy(self); } /** @@ -5828,7 +5650,7 @@ inline WisResult WisFenceSignal(WisFence self, uint64_t value) * */ inline void WisCommandListDestroy(WisCommandList self) { - return VKCommandListDestroy(self); + VKCommandListDestroy(self); } /** @@ -5868,7 +5690,7 @@ inline WisResult WisCommandListReset(WisCommandList self, WisPipelineState initi * */ inline void WisCommandListSetPipelineState(WisCommandList self, WisPipelineState pipeline) { - return VKCommandListSetPipelineState(self, pipeline); + VKCommandListSetPipelineState(self, pipeline); } /** @@ -5880,7 +5702,7 @@ inline void WisCommandListSetPipelineState(WisCommandList self, WisPipelineState * */ inline void WisCommandListCopyBuffer(WisCommandList self, WisBuffer source, WisBuffer destination, WisBufferRegion region) { - return VKCommandListCopyBuffer(self, source, destination, region); + VKCommandListCopyBuffer(self, source, destination, region); } /** @@ -5893,7 +5715,7 @@ inline void WisCommandListCopyBuffer(WisCommandList self, WisBuffer source, WisB * */ inline void WisCommandListCopyBufferToTexture(WisCommandList self, WisBuffer source, WisTexture destination, const WisBufferTextureCopyRegion* regions, uint32_t region_count) { - return VKCommandListCopyBufferToTexture(self, source, destination, regions, region_count); + VKCommandListCopyBufferToTexture(self, source, destination, regions, region_count); } /** @@ -5906,7 +5728,7 @@ inline void WisCommandListCopyBufferToTexture(WisCommandList self, WisBuffer sou * */ inline void WisCommandListCopyTextureToBuffer(WisCommandList self, WisTexture source, WisBuffer destination, const WisBufferTextureCopyRegion* regions, uint32_t region_count) { - return VKCommandListCopyTextureToBuffer(self, source, destination, regions, region_count); + VKCommandListCopyTextureToBuffer(self, source, destination, regions, region_count); } /** @@ -5917,7 +5739,7 @@ inline void WisCommandListCopyTextureToBuffer(WisCommandList self, WisTexture so * */ inline void WisCommandListBufferBarrier(WisCommandList self, WisBufferBarrier barrier, WisBuffer buffer) { - return VKCommandListBufferBarrier(self, barrier, buffer); + VKCommandListBufferBarrier(self, barrier, buffer); } /** @@ -5928,7 +5750,7 @@ inline void WisCommandListBufferBarrier(WisCommandList self, WisBufferBarrier ba * */ inline void WisCommandListBufferBarriers(WisCommandList self, const WisBufferBarrier2* barriers, uint32_t barrier_count) { - return VKCommandListBufferBarriers(self, barriers, barrier_count); + VKCommandListBufferBarriers(self, barriers, barrier_count); } /** @@ -5939,7 +5761,7 @@ inline void WisCommandListBufferBarriers(WisCommandList self, const WisBufferBar * */ inline void WisCommandListTextureBarrier(WisCommandList self, WisTextureBarrier barrier, WisTexture texture) { - return VKCommandListTextureBarrier(self, barrier, texture); + VKCommandListTextureBarrier(self, barrier, texture); } /** @@ -5950,7 +5772,7 @@ inline void WisCommandListTextureBarrier(WisCommandList self, WisTextureBarrier * */ inline void WisCommandListTextureBarriers(WisCommandList self, const WisTextureBarrier2* barriers, uint32_t barrier_count) { - return VKCommandListTextureBarriers(self, barriers, barrier_count); + VKCommandListTextureBarriers(self, barriers, barrier_count); } /** @@ -5960,7 +5782,7 @@ inline void WisCommandListTextureBarriers(WisCommandList self, const WisTextureB * */ inline void WisCommandListBeginRenderPass(WisCommandList self, const WisRenderPassDesc* pass_desc) { - return VKCommandListBeginRenderPass(self, pass_desc); + VKCommandListBeginRenderPass(self, pass_desc); } /** @@ -5969,7 +5791,7 @@ inline void WisCommandListBeginRenderPass(WisCommandList self, const WisRenderPa * */ inline void WisCommandListEndRenderPass(WisCommandList self) { - return VKCommandListEndRenderPass(self); + VKCommandListEndRenderPass(self); } /** @@ -5979,7 +5801,7 @@ inline void WisCommandListEndRenderPass(WisCommandList self) * */ inline void WisCommandListSetRootSignature(WisCommandList self, WisRootSignature root_signature) { - return VKCommandListSetRootSignature(self, root_signature); + VKCommandListSetRootSignature(self, root_signature); } /** @@ -5989,7 +5811,7 @@ inline void WisCommandListSetRootSignature(WisCommandList self, WisRootSignature * */ inline void WisCommandListIASetPrimitiveTopology(WisCommandList self, WisPrimitiveTopology topology) { - return VKCommandListIASetPrimitiveTopology(self, topology); + VKCommandListIASetPrimitiveTopology(self, topology); } /** @@ -6001,7 +5823,7 @@ inline void WisCommandListIASetPrimitiveTopology(WisCommandList self, WisPrimiti * */ inline void WisCommandListIASetVertexBuffers(WisCommandList self, const WisVertexBufferBinding* resources, uint32_t count, uint32_t start_slot) { - return VKCommandListIASetVertexBuffers(self, resources, count, start_slot); + VKCommandListIASetVertexBuffers(self, resources, count, start_slot); } /** @@ -6013,7 +5835,7 @@ inline void WisCommandListIASetVertexBuffers(WisCommandList self, const WisVerte * */ inline void WisCommandListIASetIndexBuffer(WisCommandList self, WisBuffer buffer, WisIndexType type, uint64_t offset) { - return VKCommandListIASetIndexBuffer(self, buffer, type, offset); + VKCommandListIASetIndexBuffer(self, buffer, type, offset); } /** @@ -6028,7 +5850,7 @@ inline void WisCommandListIASetIndexBuffer(WisCommandList self, WisBuffer buffer * */ inline void WisCommandListIASetIndexBuffer2(WisCommandList self, WisBuffer buffer, WisIndexType type, uint32_t size, uint64_t offset) { - return VKCommandListIASetIndexBuffer2(self, buffer, type, size, offset); + VKCommandListIASetIndexBuffer2(self, buffer, type, size, offset); } /** @@ -6038,7 +5860,7 @@ inline void WisCommandListIASetIndexBuffer2(WisCommandList self, WisBuffer buffe * */ inline void WisCommandListRSSetViewport(WisCommandList self, WisViewport viewport) { - return VKCommandListRSSetViewport(self, viewport); + VKCommandListRSSetViewport(self, viewport); } /** @@ -6049,7 +5871,7 @@ inline void WisCommandListRSSetViewport(WisCommandList self, WisViewport viewpor * */ inline void WisCommandListRSSetViewports(WisCommandList self, const WisViewport* viewports, uint32_t count) { - return VKCommandListRSSetViewports(self, viewports, count); + VKCommandListRSSetViewports(self, viewports, count); } /** @@ -6059,7 +5881,7 @@ inline void WisCommandListRSSetViewports(WisCommandList self, const WisViewport* * */ inline void WisCommandListRSSetScissor(WisCommandList self, WisScissor scissor) { - return VKCommandListRSSetScissor(self, scissor); + VKCommandListRSSetScissor(self, scissor); } /** @@ -6072,7 +5894,7 @@ inline void WisCommandListRSSetScissor(WisCommandList self, WisScissor scissor) * */ inline void WisCommandListRSSetScissors(WisCommandList self, const WisScissor* scissors, uint32_t count) { - return VKCommandListRSSetScissors(self, scissors, count); + VKCommandListRSSetScissors(self, scissors, count); } /** @@ -6086,7 +5908,7 @@ inline void WisCommandListRSSetScissors(WisCommandList self, const WisScissor* s * */ inline void WisCommandListDrawIndexedInstanced(WisCommandList self, uint32_t vertex_count_per_instance, uint32_t instance_count, uint32_t start_index, uint32_t base_vertex, uint32_t start_instance) { - return VKCommandListDrawIndexedInstanced(self, vertex_count_per_instance, instance_count, start_index, base_vertex, start_instance); + VKCommandListDrawIndexedInstanced(self, vertex_count_per_instance, instance_count, start_index, base_vertex, start_instance); } /** @@ -6099,7 +5921,7 @@ inline void WisCommandListDrawIndexedInstanced(WisCommandList self, uint32_t ver * */ inline void WisCommandListDrawInstanced(WisCommandList self, uint32_t vertex_count_per_instance, uint32_t instance_count, uint32_t start_vertex, uint32_t start_instance) { - return VKCommandListDrawInstanced(self, vertex_count_per_instance, instance_count, start_vertex, start_instance); + VKCommandListDrawInstanced(self, vertex_count_per_instance, instance_count, start_vertex, start_instance); } /** @@ -6110,54 +5932,24 @@ inline void WisCommandListDrawInstanced(WisCommandList self, uint32_t vertex_cou * @param offset_4bytes The offset in the data in 4-byte units. * @param stage The shader stages to set the root constants for. * */ -inline void WisCommandListSetRootConstants(WisCommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage) -{ - return VKCommandListSetRootConstants(self, data, size_4bytes, offset_4bytes, stage); -} - -/** - * @brief Sets the root descriptor tables for the shader. - * Operation will perform flush in some cases, so it's not recommended to rebind descriptor buffers too often. - * @param self valid handle to the CommandList - * @param buffers The descriptor buffers to set the root descriptor tables with. - * May only be one of each type (one Descriptor and one Sampler buffer) - * @param buffer_count The number of descriptor buffers to set. May be 1 or 2. - * */ -inline void WisCommandListSetDescriptorBuffers(WisCommandList self, const WisDescriptorBufferView* buffers, uint32_t buffer_count) +inline void WisCommandListSetPushConstants(WisCommandList self, void* data, uint32_t size_4bytes, uint32_t offset_4bytes, WisShaderStages stage) { - return VKCommandListSetDescriptorBuffers(self, buffers, buffer_count); + VKCommandListSetPushConstants(self, data, size_4bytes, offset_4bytes, stage); } /** - * @brief Sets the offset in the descriptor table for the descriptor buffer. + * @brief Pushes descriptor directly to the command list, without putting it to the table. + * Works only with buffer bindings. + * Buffer is always bound with full size. * @param self valid handle to the CommandList - * @param root_table_index The index of the root table to set the offset for. - * @param buffer The descriptor buffer to set the offset for. - * @param offset_bytes The offset in the descriptor buffer in bytes. - * */ -inline void WisCommandListSetDescriptorTableOffset(WisCommandList self, uint32_t root_table_index, WisDescriptorBuffer buffer, uint32_t offset_bytes) -{ - return VKCommandListSetDescriptorTableOffset(self, root_table_index, buffer, offset_bytes); -} - -// WisMemory methods -- -/** - * @brief Destroys the WisMemory. - * @param self valid handle to the Memory - * */ -inline void WisMemoryDestroy(WisMemory self) -{ - return VKMemoryDestroy(self); -} - -/** - * @brief Returns the offset of the block in the global memory. - * @param self valid handle to the Memory - * @return The offset of the block in the global memory. + * @param type The type of the descriptor to set. + * @param root_index The index of the root descriptor to set. + * @param buffer The buffer to set. + * @param offset The offset in the descriptor table to set the descriptor to. * */ -inline uint64_t WisMemoryGetBlockOffset(WisMemory self) +inline void WisCommandListPushDescriptor(WisCommandList self, WisDescriptorType type, uint32_t root_index, WisBuffer buffer, uint32_t offset) { - return VKMemoryGetBlockOffset(self); + VKCommandListPushDescriptor(self, type, root_index, buffer, offset); } // WisSwapChain methods -- @@ -6167,7 +5959,7 @@ inline uint64_t WisMemoryGetBlockOffset(WisMemory self) * */ inline void WisSwapChainDestroy(WisSwapChain self) { - return VKSwapChainDestroy(self); + VKSwapChainDestroy(self); } /** @@ -6254,7 +6046,7 @@ inline WisResult WisSwapChainWaitForPresent(WisSwapChain self, uint64_t timeout_ * */ inline void WisBufferDestroy(WisBuffer self) { - return VKBufferDestroy(self); + VKBufferDestroy(self); } /** @@ -6273,7 +6065,7 @@ inline void* WisBufferMapRaw(WisBuffer self) * */ inline void WisBufferUnmap(WisBuffer self) { - return VKBufferUnmap(self); + VKBufferUnmap(self); } // WisTexture methods -- @@ -6283,7 +6075,53 @@ inline void WisBufferUnmap(WisBuffer self) * */ inline void WisTextureDestroy(WisTexture self) { - return VKTextureDestroy(self); + VKTextureDestroy(self); +} + +// WisDescriptorStorage methods -- +/** + * @brief Destroys the WisDescriptorStorage. + * @param self valid handle to the DescriptorStorage + * */ +inline void WisDescriptorStorageDestroy(WisDescriptorStorage self) +{ + VKDescriptorStorageDestroy(self); +} + +/** + * @brief Writes the sampler to the sampler descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of samplers to fill. + * @param sampler The sampler to write. + * */ +inline void WisDescriptorStorageWriteSampler(WisDescriptorStorage self, uint32_t index, WisSampler sampler) +{ + VKDescriptorStorageWriteSampler(self, index, sampler); +} + +/** + * @brief Writes the constant buffer to the constant buffer descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of constant buffers to fill. + * @param buffer The buffer to write. + * @param size The size of the constant buffer in bytes. + * @param offset The offset in the buffer to write the constant buffer to. + * size + offset must be less or equal the overall size of the bound buffer. + * */ +inline void WisDescriptorStorageWriteConstantBuffer(WisDescriptorStorage self, uint32_t index, WisBuffer buffer, uint32_t size, uint32_t offset) +{ + VKDescriptorStorageWriteConstantBuffer(self, index, buffer, size, offset); +} + +/** + * @brief Writes the texture to the shader resource descriptor storage. + * @param self valid handle to the DescriptorStorage + * @param index Index in array of shader resources to fill. + * @param resource The shader resource to write. + * */ +inline void WisDescriptorStorageWriteTexture(WisDescriptorStorage self, uint32_t index, WisShaderResource resource) +{ + VKDescriptorStorageWriteTexture(self, index, resource); } // WisRootSignature methods -- @@ -6293,7 +6131,7 @@ inline void WisTextureDestroy(WisTexture self) * */ inline void WisRootSignatureDestroy(WisRootSignature self) { - return VKRootSignatureDestroy(self); + VKRootSignatureDestroy(self); } // WisShader methods -- @@ -6303,7 +6141,7 @@ inline void WisRootSignatureDestroy(WisRootSignature self) * */ inline void WisShaderDestroy(WisShader self) { - return VKShaderDestroy(self); + VKShaderDestroy(self); } // WisDebugMessenger methods -- @@ -6313,7 +6151,7 @@ inline void WisShaderDestroy(WisShader self) * */ inline void WisDebugMessengerDestroy(WisDebugMessenger self) { - return VKDebugMessengerDestroy(self); + VKDebugMessengerDestroy(self); } // WisRenderTarget methods -- @@ -6323,7 +6161,7 @@ inline void WisDebugMessengerDestroy(WisDebugMessenger self) * */ inline void WisRenderTargetDestroy(WisRenderTarget self) { - return VKRenderTargetDestroy(self); + VKRenderTargetDestroy(self); } // WisSampler methods -- @@ -6333,7 +6171,7 @@ inline void WisRenderTargetDestroy(WisRenderTarget self) * */ inline void WisSamplerDestroy(WisSampler self) { - return VKSamplerDestroy(self); + VKSamplerDestroy(self); } // WisShaderResource methods -- @@ -6343,7 +6181,7 @@ inline void WisSamplerDestroy(WisSampler self) * */ inline void WisShaderResourceDestroy(WisShaderResource self) { - return VKShaderResourceDestroy(self); + VKShaderResourceDestroy(self); } //------------------------------------------------------------------------- @@ -6460,6 +6298,524 @@ inline WisResult WisDebugExtensionCreateDebugMessenger(WisDebugExtension self, D //------------------------------------------------------------------------- +// DescriptorBufferExtension-- +#ifndef WIS_DescriptorBufferExtension +#define WIS_DescriptorBufferExtension 1 +#endif + +#ifdef WISDOM_VULKAN +typedef VKFactoryExtension VKDescriptorBufferExtension; +typedef struct VKDescriptorBuffer_t* VKDescriptorBuffer; + +// VKDescriptorBufferExtension methods -- +/** + * @brief Creates a root signature object. + * @param self valid handle to the DescriptorBufferExtension + * @param root_constants The root constants to create the root signature with. + * @param constants_count The number of root constants. Max is 5. + * @param root_descriptors The root descriptors to create the root signature with. + * @param descriptors_count The number of root descriptors. Max is 8. + * @param tables The descriptor tables to create the root signature with. + * @param tables_count The number of descriptor tables. + * @param signature VKRootSignature on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +WISDOM_API WisResult VKDescriptorBufferExtensionCreateRootSignature(VKDescriptorBufferExtension self, const WisPushConstant* root_constants, uint32_t constants_count, const WisPushDescriptor* root_descriptors, uint32_t descriptors_count, const WisDescriptorTable* tables, uint32_t tables_count, VKRootSignature* signature); + +/** + * @brief Creates a descriptor buffer object. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to create. + * @param memory Memory location of the buffer (CPU or GPU). + * @param memory_bytes The size of the descriptor buffer in bytes. + * @param buffer VKDescriptorBuffer on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +WISDOM_API WisResult VKDescriptorBufferExtensionCreateDescriptorBuffer(VKDescriptorBufferExtension self, WisDescriptorHeapType type, WisDescriptorMemory memory, uint64_t memory_bytes, VKDescriptorBuffer* buffer); + +/** + * @brief Returns the alignment of the descriptor table in bytes. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to get the alignment for. + * @return The alignment of the descriptor table in bytes. + * */ +WISDOM_API uint64_t VKDescriptorBufferExtensionGetDescriptorTableAlignment(VKDescriptorBufferExtension self, WisDescriptorHeapType type); + +/** + * @brief Returns the size of single descriptor in bytes. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to get the size for. + * @return The size of the descriptor table in bytes. + * */ +WISDOM_API uint64_t VKDescriptorBufferExtensionGetDescriptorSize(VKDescriptorBufferExtension self, WisDescriptorHeapType type); + +/** + * @brief Sets the descriptor buffers to the command list. + * @param self valid handle to the DescriptorBufferExtension + * @param list The command list to set the descriptor buffers to. + * @param resource_buffer The resource descriptor buffer to set. + * @param sampler_buffer The sampler descriptor buffer to set. + * */ +WISDOM_API void VKDescriptorBufferExtensionSetDescriptorBuffers(VKDescriptorBufferExtension self, VKCommandList list, VKDescriptorBuffer resource_buffer, VKDescriptorBuffer sampler_buffer); + +/** + * @brief Sets the offset into the descriptor buffer + * for selected descriptor table. Pipeline will get the bindings from that offset. + * @param self valid handle to the DescriptorBufferExtension + * @param list The command list to set the descriptor buffer offset to. + * @param root_signature The root signature to get binding table from. + * @param table_index Index of the descriptor table in the root signature. + * @param buffer The descriptor buffer to set the offset for. + * @param table_aligned_byte_offset Byte offset from the buffer beginning in table alignment sizes. + * */ +WISDOM_API void VKDescriptorBufferExtensionSetDescriptorTableOffset(VKDescriptorBufferExtension self, VKCommandList list, VKRootSignature root_signature, uint32_t table_index, VKDescriptorBuffer buffer, uint32_t table_aligned_byte_offset); + +// VKDescriptorBuffer methods -- +/** + * @brief Destroys the VKDescriptorBuffer. + * @param self valid handle to the DescriptorBuffer + * */ +WISDOM_API void VKDescriptorBufferDestroy(VKDescriptorBuffer self); + +/** + * @brief Writes the sampler to the sampler descriptor buffer. + * Must be called with Sampler descriptor buffer, which was created with DescriptorHeapTypeSampler. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param sampler The sampler to write. + * */ +WISDOM_API void VKDescriptorBufferWriteSampler(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKSampler sampler); + +/** + * @brief Writes the shader resource to the shader resource descriptor buffer. + * Must be called with Shader Resource descriptor buffer, which was created with DescriptorHeapTypeDescriptor. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param resource The shader resource to write. + * */ +WISDOM_API void VKDescriptorBufferWriteShaderResource(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKShaderResource resource); + +/** + * @brief Writes the constant buffer to the constant buffer descriptor buffer. + * Must be called with Constant Buffer descriptor buffer, which was created with DescriptorHeapTypeDescriptor. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with VKDevice. + * @param index Binding index in descriptor table. + * @param buffer The buffer to write. + * @param buffer_size The size of the part of the buffer in bytes. + * @param offset Offset from buffer beginning. offset + buffer_size must be less or equal buffer overall size. + * */ +WISDOM_API void VKDescriptorBufferWriteConstantBuffer(VKDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, VKBuffer buffer, uint32_t buffer_size, uint32_t offset); + +#endif + +#ifdef WISDOM_DX12 +typedef DX12FactoryExtension DX12DescriptorBufferExtension; +typedef struct DX12DescriptorBuffer_t* DX12DescriptorBuffer; + +// DX12DescriptorBufferExtension methods -- +/** + * @brief Creates a root signature object. + * @param self valid handle to the DescriptorBufferExtension + * @param root_constants The root constants to create the root signature with. + * @param constants_count The number of root constants. Max is 5. + * @param root_descriptors The root descriptors to create the root signature with. + * @param descriptors_count The number of root descriptors. Max is 8. + * @param tables The descriptor tables to create the root signature with. + * @param tables_count The number of descriptor tables. + * @param signature DX12RootSignature on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +WISDOM_API WisResult DX12DescriptorBufferExtensionCreateRootSignature(DX12DescriptorBufferExtension self, const WisPushConstant* root_constants, uint32_t constants_count, const WisPushDescriptor* root_descriptors, uint32_t descriptors_count, const WisDescriptorTable* tables, uint32_t tables_count, DX12RootSignature* signature); + +/** + * @brief Creates a descriptor buffer object. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to create. + * @param memory Memory location of the buffer (CPU or GPU). + * @param memory_bytes The size of the descriptor buffer in bytes. + * @param buffer DX12DescriptorBuffer on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +WISDOM_API WisResult DX12DescriptorBufferExtensionCreateDescriptorBuffer(DX12DescriptorBufferExtension self, WisDescriptorHeapType type, WisDescriptorMemory memory, uint64_t memory_bytes, DX12DescriptorBuffer* buffer); + +/** + * @brief Returns the alignment of the descriptor table in bytes. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to get the alignment for. + * @return The alignment of the descriptor table in bytes. + * */ +WISDOM_API uint64_t DX12DescriptorBufferExtensionGetDescriptorTableAlignment(DX12DescriptorBufferExtension self, WisDescriptorHeapType type); + +/** + * @brief Returns the size of single descriptor in bytes. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to get the size for. + * @return The size of the descriptor table in bytes. + * */ +WISDOM_API uint64_t DX12DescriptorBufferExtensionGetDescriptorSize(DX12DescriptorBufferExtension self, WisDescriptorHeapType type); + +/** + * @brief Sets the descriptor buffers to the command list. + * @param self valid handle to the DescriptorBufferExtension + * @param list The command list to set the descriptor buffers to. + * @param resource_buffer The resource descriptor buffer to set. + * @param sampler_buffer The sampler descriptor buffer to set. + * */ +WISDOM_API void DX12DescriptorBufferExtensionSetDescriptorBuffers(DX12DescriptorBufferExtension self, DX12CommandList list, DX12DescriptorBuffer resource_buffer, DX12DescriptorBuffer sampler_buffer); + +/** + * @brief Sets the offset into the descriptor buffer + * for selected descriptor table. Pipeline will get the bindings from that offset. + * @param self valid handle to the DescriptorBufferExtension + * @param list The command list to set the descriptor buffer offset to. + * @param root_signature The root signature to get binding table from. + * @param table_index Index of the descriptor table in the root signature. + * @param buffer The descriptor buffer to set the offset for. + * @param table_aligned_byte_offset Byte offset from the buffer beginning in table alignment sizes. + * */ +WISDOM_API void DX12DescriptorBufferExtensionSetDescriptorTableOffset(DX12DescriptorBufferExtension self, DX12CommandList list, DX12RootSignature root_signature, uint32_t table_index, DX12DescriptorBuffer buffer, uint32_t table_aligned_byte_offset); + +// DX12DescriptorBuffer methods -- +/** + * @brief Destroys the DX12DescriptorBuffer. + * @param self valid handle to the DescriptorBuffer + * */ +WISDOM_API void DX12DescriptorBufferDestroy(DX12DescriptorBuffer self); + +/** + * @brief Writes the sampler to the sampler descriptor buffer. + * Must be called with Sampler descriptor buffer, which was created with DescriptorHeapTypeSampler. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param sampler The sampler to write. + * */ +WISDOM_API void DX12DescriptorBufferWriteSampler(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12Sampler sampler); + +/** + * @brief Writes the shader resource to the shader resource descriptor buffer. + * Must be called with Shader Resource descriptor buffer, which was created with DescriptorHeapTypeDescriptor. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param resource The shader resource to write. + * */ +WISDOM_API void DX12DescriptorBufferWriteShaderResource(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12ShaderResource resource); + +/** + * @brief Writes the constant buffer to the constant buffer descriptor buffer. + * Must be called with Constant Buffer descriptor buffer, which was created with DescriptorHeapTypeDescriptor. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with DX12Device. + * @param index Binding index in descriptor table. + * @param buffer The buffer to write. + * @param buffer_size The size of the part of the buffer in bytes. + * @param offset Offset from buffer beginning. offset + buffer_size must be less or equal buffer overall size. + * */ +WISDOM_API void DX12DescriptorBufferWriteConstantBuffer(DX12DescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, DX12Buffer buffer, uint32_t buffer_size, uint32_t offset); + +#endif + +#if defined(WISDOM_DX12) && !FORCEVK_SWITCH +typedef DX12DescriptorBufferExtension WisDescriptorBufferExtension; +typedef DX12DescriptorBuffer WisDescriptorBuffer; + +// WisDescriptorBufferExtension methods -- +/** + * @brief Creates a root signature object. + * @param self valid handle to the DescriptorBufferExtension + * @param root_constants The root constants to create the root signature with. + * @param constants_count The number of root constants. Max is 5. + * @param root_descriptors The root descriptors to create the root signature with. + * @param descriptors_count The number of root descriptors. Max is 8. + * @param tables The descriptor tables to create the root signature with. + * @param tables_count The number of descriptor tables. + * @param signature WisRootSignature on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +inline WisResult WisDescriptorBufferExtensionCreateRootSignature(WisDescriptorBufferExtension self, const WisPushConstant* root_constants, uint32_t constants_count, const WisPushDescriptor* root_descriptors, uint32_t descriptors_count, const WisDescriptorTable* tables, uint32_t tables_count, WisRootSignature* signature) +{ + return DX12DescriptorBufferExtensionCreateRootSignature(self, root_constants, constants_count, root_descriptors, descriptors_count, tables, tables_count, signature); +} + +/** + * @brief Creates a descriptor buffer object. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to create. + * @param memory Memory location of the buffer (CPU or GPU). + * @param memory_bytes The size of the descriptor buffer in bytes. + * @param buffer WisDescriptorBuffer on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +inline WisResult WisDescriptorBufferExtensionCreateDescriptorBuffer(WisDescriptorBufferExtension self, WisDescriptorHeapType type, WisDescriptorMemory memory, uint64_t memory_bytes, WisDescriptorBuffer* buffer) +{ + return DX12DescriptorBufferExtensionCreateDescriptorBuffer(self, type, memory, memory_bytes, buffer); +} + +/** + * @brief Returns the alignment of the descriptor table in bytes. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to get the alignment for. + * @return The alignment of the descriptor table in bytes. + * */ +inline uint64_t WisDescriptorBufferExtensionGetDescriptorTableAlignment(WisDescriptorBufferExtension self, WisDescriptorHeapType type) +{ + return DX12DescriptorBufferExtensionGetDescriptorTableAlignment(self, type); +} + +/** + * @brief Returns the size of single descriptor in bytes. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to get the size for. + * @return The size of the descriptor table in bytes. + * */ +inline uint64_t WisDescriptorBufferExtensionGetDescriptorSize(WisDescriptorBufferExtension self, WisDescriptorHeapType type) +{ + return DX12DescriptorBufferExtensionGetDescriptorSize(self, type); +} + +/** + * @brief Sets the descriptor buffers to the command list. + * @param self valid handle to the DescriptorBufferExtension + * @param list The command list to set the descriptor buffers to. + * @param resource_buffer The resource descriptor buffer to set. + * @param sampler_buffer The sampler descriptor buffer to set. + * */ +inline void WisDescriptorBufferExtensionSetDescriptorBuffers(WisDescriptorBufferExtension self, WisCommandList list, WisDescriptorBuffer resource_buffer, WisDescriptorBuffer sampler_buffer) +{ + DX12DescriptorBufferExtensionSetDescriptorBuffers(self, list, resource_buffer, sampler_buffer); +} + +/** + * @brief Sets the offset into the descriptor buffer + * for selected descriptor table. Pipeline will get the bindings from that offset. + * @param self valid handle to the DescriptorBufferExtension + * @param list The command list to set the descriptor buffer offset to. + * @param root_signature The root signature to get binding table from. + * @param table_index Index of the descriptor table in the root signature. + * @param buffer The descriptor buffer to set the offset for. + * @param table_aligned_byte_offset Byte offset from the buffer beginning in table alignment sizes. + * */ +inline void WisDescriptorBufferExtensionSetDescriptorTableOffset(WisDescriptorBufferExtension self, WisCommandList list, WisRootSignature root_signature, uint32_t table_index, WisDescriptorBuffer buffer, uint32_t table_aligned_byte_offset) +{ + DX12DescriptorBufferExtensionSetDescriptorTableOffset(self, list, root_signature, table_index, buffer, table_aligned_byte_offset); +} + +// WisDescriptorBuffer methods -- +/** + * @brief Destroys the WisDescriptorBuffer. + * @param self valid handle to the DescriptorBuffer + * */ +inline void WisDescriptorBufferDestroy(WisDescriptorBuffer self) +{ + DX12DescriptorBufferDestroy(self); +} + +/** + * @brief Writes the sampler to the sampler descriptor buffer. + * Must be called with Sampler descriptor buffer, which was created with DescriptorHeapTypeSampler. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param sampler The sampler to write. + * */ +inline void WisDescriptorBufferWriteSampler(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisSampler sampler) +{ + DX12DescriptorBufferWriteSampler(self, aligned_table_offset, index, sampler); +} + +/** + * @brief Writes the shader resource to the shader resource descriptor buffer. + * Must be called with Shader Resource descriptor buffer, which was created with DescriptorHeapTypeDescriptor. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param resource The shader resource to write. + * */ +inline void WisDescriptorBufferWriteShaderResource(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisShaderResource resource) +{ + DX12DescriptorBufferWriteShaderResource(self, aligned_table_offset, index, resource); +} + +/** + * @brief Writes the constant buffer to the constant buffer descriptor buffer. + * Must be called with Constant Buffer descriptor buffer, which was created with DescriptorHeapTypeDescriptor. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with WisDevice. + * @param index Binding index in descriptor table. + * @param buffer The buffer to write. + * @param buffer_size The size of the part of the buffer in bytes. + * @param offset Offset from buffer beginning. offset + buffer_size must be less or equal buffer overall size. + * */ +inline void WisDescriptorBufferWriteConstantBuffer(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisBuffer buffer, uint32_t buffer_size, uint32_t offset) +{ + DX12DescriptorBufferWriteConstantBuffer(self, aligned_table_offset, index, buffer, buffer_size, offset); +} + +#elif defined(WISDOM_VULKAN) + +typedef VKDescriptorBufferExtension WisDescriptorBufferExtension; +typedef VKDescriptorBuffer WisDescriptorBuffer; + +// WisDescriptorBufferExtension methods -- +/** + * @brief Creates a root signature object. + * @param self valid handle to the DescriptorBufferExtension + * @param root_constants The root constants to create the root signature with. + * @param constants_count The number of root constants. Max is 5. + * @param root_descriptors The root descriptors to create the root signature with. + * @param descriptors_count The number of root descriptors. Max is 8. + * @param tables The descriptor tables to create the root signature with. + * @param tables_count The number of descriptor tables. + * @param signature WisRootSignature on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +inline WisResult WisDescriptorBufferExtensionCreateRootSignature(WisDescriptorBufferExtension self, const WisPushConstant* root_constants, uint32_t constants_count, const WisPushDescriptor* root_descriptors, uint32_t descriptors_count, const WisDescriptorTable* tables, uint32_t tables_count, WisRootSignature* signature) +{ + return VKDescriptorBufferExtensionCreateRootSignature(self, root_constants, constants_count, root_descriptors, descriptors_count, tables, tables_count, signature); +} + +/** + * @brief Creates a descriptor buffer object. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to create. + * @param memory Memory location of the buffer (CPU or GPU). + * @param memory_bytes The size of the descriptor buffer in bytes. + * @param buffer WisDescriptorBuffer on success (StatusOk). + * @return Result with StatusOk on success. + * Error in WisResult::error otherwise. + * */ +inline WisResult WisDescriptorBufferExtensionCreateDescriptorBuffer(WisDescriptorBufferExtension self, WisDescriptorHeapType type, WisDescriptorMemory memory, uint64_t memory_bytes, WisDescriptorBuffer* buffer) +{ + return VKDescriptorBufferExtensionCreateDescriptorBuffer(self, type, memory, memory_bytes, buffer); +} + +/** + * @brief Returns the alignment of the descriptor table in bytes. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to get the alignment for. + * @return The alignment of the descriptor table in bytes. + * */ +inline uint64_t WisDescriptorBufferExtensionGetDescriptorTableAlignment(WisDescriptorBufferExtension self, WisDescriptorHeapType type) +{ + return VKDescriptorBufferExtensionGetDescriptorTableAlignment(self, type); +} + +/** + * @brief Returns the size of single descriptor in bytes. + * @param self valid handle to the DescriptorBufferExtension + * @param type The type of the descriptor buffer to get the size for. + * @return The size of the descriptor table in bytes. + * */ +inline uint64_t WisDescriptorBufferExtensionGetDescriptorSize(WisDescriptorBufferExtension self, WisDescriptorHeapType type) +{ + return VKDescriptorBufferExtensionGetDescriptorSize(self, type); +} + +/** + * @brief Sets the descriptor buffers to the command list. + * @param self valid handle to the DescriptorBufferExtension + * @param list The command list to set the descriptor buffers to. + * @param resource_buffer The resource descriptor buffer to set. + * @param sampler_buffer The sampler descriptor buffer to set. + * */ +inline void WisDescriptorBufferExtensionSetDescriptorBuffers(WisDescriptorBufferExtension self, WisCommandList list, WisDescriptorBuffer resource_buffer, WisDescriptorBuffer sampler_buffer) +{ + VKDescriptorBufferExtensionSetDescriptorBuffers(self, list, resource_buffer, sampler_buffer); +} + +/** + * @brief Sets the offset into the descriptor buffer + * for selected descriptor table. Pipeline will get the bindings from that offset. + * @param self valid handle to the DescriptorBufferExtension + * @param list The command list to set the descriptor buffer offset to. + * @param root_signature The root signature to get binding table from. + * @param table_index Index of the descriptor table in the root signature. + * @param buffer The descriptor buffer to set the offset for. + * @param table_aligned_byte_offset Byte offset from the buffer beginning in table alignment sizes. + * */ +inline void WisDescriptorBufferExtensionSetDescriptorTableOffset(WisDescriptorBufferExtension self, WisCommandList list, WisRootSignature root_signature, uint32_t table_index, WisDescriptorBuffer buffer, uint32_t table_aligned_byte_offset) +{ + VKDescriptorBufferExtensionSetDescriptorTableOffset(self, list, root_signature, table_index, buffer, table_aligned_byte_offset); +} + +// WisDescriptorBuffer methods -- +/** + * @brief Destroys the WisDescriptorBuffer. + * @param self valid handle to the DescriptorBuffer + * */ +inline void WisDescriptorBufferDestroy(WisDescriptorBuffer self) +{ + VKDescriptorBufferDestroy(self); +} + +/** + * @brief Writes the sampler to the sampler descriptor buffer. + * Must be called with Sampler descriptor buffer, which was created with DescriptorHeapTypeSampler. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param sampler The sampler to write. + * */ +inline void WisDescriptorBufferWriteSampler(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisSampler sampler) +{ + VKDescriptorBufferWriteSampler(self, aligned_table_offset, index, sampler); +} + +/** + * @brief Writes the shader resource to the shader resource descriptor buffer. + * Must be called with Shader Resource descriptor buffer, which was created with DescriptorHeapTypeDescriptor. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param resource The shader resource to write. + * */ +inline void WisDescriptorBufferWriteShaderResource(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisShaderResource resource) +{ + VKDescriptorBufferWriteShaderResource(self, aligned_table_offset, index, resource); +} + +/** + * @brief Writes the constant buffer to the constant buffer descriptor buffer. + * Must be called with Constant Buffer descriptor buffer, which was created with DescriptorHeapTypeDescriptor. + * @param self valid handle to the DescriptorBuffer + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with WisDevice. + * @param index Binding index in descriptor table. + * @param buffer The buffer to write. + * @param buffer_size The size of the part of the buffer in bytes. + * @param offset Offset from buffer beginning. offset + buffer_size must be less or equal buffer overall size. + * */ +inline void WisDescriptorBufferWriteConstantBuffer(WisDescriptorBuffer self, uint64_t aligned_table_offset, uint32_t index, WisBuffer buffer, uint32_t buffer_size, uint32_t offset) +{ + VKDescriptorBufferWriteConstantBuffer(self, aligned_table_offset, index, buffer, buffer_size, offset); +} + +#endif + +//------------------------------------------------------------------------- + #ifdef __cplusplus } #endif diff --git a/bindings/wisdom_exports.h b/bindings/wisdom_exports.h index c15d6f60..899d9ed9 100644 --- a/bindings/wisdom_exports.h +++ b/bindings/wisdom_exports.h @@ -3,40 +3,41 @@ #define WISDOM_API_H #ifdef WISDOM_STATIC -# define WISDOM_API -# define WISDOM_NO_EXPORT +#define WISDOM_API +#define WISDOM_NO_EXPORT #else -# ifndef WISDOM_API -# ifdef wisdom_bindings_EXPORTS - /* We are building this library */ -# define WISDOM_API __declspec(dllexport) -# else - /* We are using this library */ -# define WISDOM_API __declspec(dllimport) -# endif -# endif +#ifndef WISDOM_API +#ifdef wisdom_bindings_EXPORTS +/* We are building this library */ +#define WISDOM_API __declspec(dllexport) +#else +/* We are using this library */ +#define WISDOM_API __declspec(dllimport) +#endif +#endif -# ifndef WISDOM_NO_EXPORT -# define WISDOM_NO_EXPORT -# endif +#ifndef WISDOM_NO_EXPORT +#define WISDOM_NO_EXPORT +#endif #endif #ifndef WISDOM_DEPRECATED -# define WISDOM_DEPRECATED __declspec(deprecated) +#define WISDOM_DEPRECATED __declspec(deprecated) #endif #ifndef WISDOM_DEPRECATED_EXPORT -# define WISDOM_DEPRECATED_EXPORT WISDOM_API WISDOM_DEPRECATED +#define WISDOM_DEPRECATED_EXPORT WISDOM_API WISDOM_DEPRECATED #endif #ifndef WISDOM_DEPRECATED_NO_EXPORT -# define WISDOM_DEPRECATED_NO_EXPORT WISDOM_NO_EXPORT WISDOM_DEPRECATED +#define WISDOM_DEPRECATED_NO_EXPORT WISDOM_NO_EXPORT WISDOM_DEPRECATED #endif +/* NOLINTNEXTLINE(readability-avoid-unconditional-preprocessor-if) */ #if 0 /* DEFINE_NO_DEPRECATED */ -# ifndef WISDOM_NO_DEPRECATED -# define WISDOM_NO_DEPRECATED -# endif +#ifndef WISDOM_NO_DEPRECATED +#define WISDOM_NO_DEPRECATED +#endif #endif #endif /* WISDOM_API_H */ diff --git a/bindings/wisdom_ext.inl b/bindings/wisdom_ext.inl index cfc2eb88..1b0738d7 100644 --- a/bindings/wisdom_ext.inl +++ b/bindings/wisdom_ext.inl @@ -1,6 +1,7 @@ #include "wisdom.h" #include "wisdom/wisdom_debug.h" +#include "wisdom/wisdom_descriptor_buffer.h" #if defined(WISDOM_DX12) #include @@ -32,12 +33,18 @@ template struct DX12DeviceExtensionMap { using Type = wis::DX12DeviceExtension; }; +template<> +struct DX12DeviceExtensionMap { + using Type = wis::DX12DescriptorBufferExtension; +}; //------------------------------------------------------------------------- template typename Executor, typename... Args> constexpr static inline decltype(auto) DX12DeviceExtensionBridge(wis::DeviceExtID id, Args&&... args) { switch (id) { + case wis::DeviceExtID::DescriptorBufferExtension: + return Executor::Type>{}(std::forward(args)...); default: return Executor{}(std::forward(args)...); } @@ -56,6 +63,57 @@ extern "C" WisResult DX12DebugExtensionCreateDebugMessenger(DX12DebugExtension s return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::DX12DebugMessenger." }; return reinterpret_cast(res); } +// DX12DescriptorBufferExtension methods -- +extern "C" WisResult DX12DescriptorBufferExtensionCreateRootSignature(DX12DescriptorBufferExtension self, const WisPushConstant* root_constants, uint32_t constants_count, const WisPushDescriptor* root_descriptors, uint32_t descriptors_count, const WisDescriptorTable* tables, uint32_t tables_count, DX12RootSignature* signature) +{ + auto* xself = reinterpret_cast(self); + auto&& [res, value] = xself->CreateRootSignature(reinterpret_cast(root_constants), constants_count, reinterpret_cast(root_descriptors), descriptors_count, reinterpret_cast(tables), tables_count); + + if (res.status != wis::Status::Ok) + return reinterpret_cast(res); + + *signature = reinterpret_cast(new (std::nothrow) wis::DX12RootSignature(std::move(value))); + if (!*signature) + return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::DX12RootSignature." }; + return reinterpret_cast(res); +} +extern "C" WisResult DX12DescriptorBufferExtensionCreateDescriptorBuffer(DX12DescriptorBufferExtension self, WisDescriptorHeapType type, WisDescriptorMemory memory, uint64_t memory_bytes, DX12DescriptorBuffer* buffer) +{ + auto* xself = reinterpret_cast(self); + auto&& [res, value] = xself->CreateDescriptorBuffer(static_cast(type), static_cast(memory), memory_bytes); + + if (res.status != wis::Status::Ok) + return reinterpret_cast(res); + + *buffer = reinterpret_cast(new (std::nothrow) wis::DX12DescriptorBuffer(std::move(value))); + if (!*buffer) + return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::DX12DescriptorBuffer." }; + return reinterpret_cast(res); +} +extern "C" uint64_t DX12DescriptorBufferExtensionGetDescriptorTableAlignment(DX12DescriptorBufferExtension self, WisDescriptorHeapType type) +{ + auto* xself = reinterpret_cast(self); + auto res = xself->GetDescriptorTableAlignment(static_cast(type)); + ; + return res; +} +extern "C" uint64_t DX12DescriptorBufferExtensionGetDescriptorSize(DX12DescriptorBufferExtension self, WisDescriptorHeapType type) +{ + auto* xself = reinterpret_cast(self); + auto res = xself->GetDescriptorSize(static_cast(type)); + ; + return res; +} +extern "C" void DX12DescriptorBufferExtensionSetDescriptorBuffers(DX12DescriptorBufferExtension self, DX12CommandList list, DX12DescriptorBuffer resource_buffer, DX12DescriptorBuffer sampler_buffer) +{ + auto* xself = reinterpret_cast(self); + xself->SetDescriptorBuffers(*reinterpret_cast(list), *reinterpret_cast(resource_buffer), *reinterpret_cast(sampler_buffer)); +} +extern "C" void DX12DescriptorBufferExtensionSetDescriptorTableOffset(DX12DescriptorBufferExtension self, DX12CommandList list, DX12RootSignature root_signature, uint32_t table_index, DX12DescriptorBuffer buffer, uint32_t table_aligned_byte_offset) +{ + auto* xself = reinterpret_cast(self); + xself->SetDescriptorTableOffset(*reinterpret_cast(list), *reinterpret_cast(root_signature), table_index, *reinterpret_cast(buffer), table_aligned_byte_offset); +} #endif #if defined(WISDOM_VULKAN) @@ -88,12 +146,18 @@ template struct VKDeviceExtensionMap { using Type = wis::VKDeviceExtension; }; +template<> +struct VKDeviceExtensionMap { + using Type = wis::VKDescriptorBufferExtension; +}; //------------------------------------------------------------------------- template typename Executor, typename... Args> constexpr static inline decltype(auto) VKDeviceExtensionBridge(wis::DeviceExtID id, Args&&... args) { switch (id) { + case wis::DeviceExtID::DescriptorBufferExtension: + return Executor::Type>{}(std::forward(args)...); default: return Executor{}(std::forward(args)...); } @@ -112,4 +176,55 @@ extern "C" WisResult VKDebugExtensionCreateDebugMessenger(VKDebugExtension self, return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::VKDebugMessenger." }; return reinterpret_cast(res); } +// VKDescriptorBufferExtension methods -- +extern "C" WisResult VKDescriptorBufferExtensionCreateRootSignature(VKDescriptorBufferExtension self, const WisPushConstant* root_constants, uint32_t constants_count, const WisPushDescriptor* root_descriptors, uint32_t descriptors_count, const WisDescriptorTable* tables, uint32_t tables_count, VKRootSignature* signature) +{ + auto* xself = reinterpret_cast(self); + auto&& [res, value] = xself->CreateRootSignature(reinterpret_cast(root_constants), constants_count, reinterpret_cast(root_descriptors), descriptors_count, reinterpret_cast(tables), tables_count); + + if (res.status != wis::Status::Ok) + return reinterpret_cast(res); + + *signature = reinterpret_cast(new (std::nothrow) wis::VKRootSignature(std::move(value))); + if (!*signature) + return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::VKRootSignature." }; + return reinterpret_cast(res); +} +extern "C" WisResult VKDescriptorBufferExtensionCreateDescriptorBuffer(VKDescriptorBufferExtension self, WisDescriptorHeapType type, WisDescriptorMemory memory, uint64_t memory_bytes, VKDescriptorBuffer* buffer) +{ + auto* xself = reinterpret_cast(self); + auto&& [res, value] = xself->CreateDescriptorBuffer(static_cast(type), static_cast(memory), memory_bytes); + + if (res.status != wis::Status::Ok) + return reinterpret_cast(res); + + *buffer = reinterpret_cast(new (std::nothrow) wis::VKDescriptorBuffer(std::move(value))); + if (!*buffer) + return WisResult{ StatusOutOfMemory, "Failed to allocate memory for wis::VKDescriptorBuffer." }; + return reinterpret_cast(res); +} +extern "C" uint64_t VKDescriptorBufferExtensionGetDescriptorTableAlignment(VKDescriptorBufferExtension self, WisDescriptorHeapType type) +{ + auto* xself = reinterpret_cast(self); + auto res = xself->GetDescriptorTableAlignment(static_cast(type)); + ; + return res; +} +extern "C" uint64_t VKDescriptorBufferExtensionGetDescriptorSize(VKDescriptorBufferExtension self, WisDescriptorHeapType type) +{ + auto* xself = reinterpret_cast(self); + auto res = xself->GetDescriptorSize(static_cast(type)); + ; + return res; +} +extern "C" void VKDescriptorBufferExtensionSetDescriptorBuffers(VKDescriptorBufferExtension self, VKCommandList list, VKDescriptorBuffer resource_buffer, VKDescriptorBuffer sampler_buffer) +{ + auto* xself = reinterpret_cast(self); + xself->SetDescriptorBuffers(*reinterpret_cast(list), *reinterpret_cast(resource_buffer), *reinterpret_cast(sampler_buffer)); +} +extern "C" void VKDescriptorBufferExtensionSetDescriptorTableOffset(VKDescriptorBufferExtension self, VKCommandList list, VKRootSignature root_signature, uint32_t table_index, VKDescriptorBuffer buffer, uint32_t table_aligned_byte_offset) +{ + auto* xself = reinterpret_cast(self); + xself->SetDescriptorTableOffset(*reinterpret_cast(list), *reinterpret_cast(root_signature), table_index, *reinterpret_cast(buffer), table_aligned_byte_offset); +} #endif diff --git a/cmake/functions.cmake b/cmake/functions.cmake index c20dae4c..2e8b705e 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -1,6 +1,20 @@ +function(wis_make_exports_dx PROJECT) + get_property(DX12SDKVER TARGET DX12Agility PROPERTY DX12SDKVER) + + set(EXPORT_AGILITY "_declspec(dllexport) extern const unsigned D3D12SDKVersion = ${DX12SDKVER}; + _declspec(dllexport) extern const char* D3D12SDKPath = \".\\\\D3D12\\\\\";" + ) + + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/exports.c" "${EXPORT_AGILITY}") + + target_sources(${PROJECT} PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/exports.c + ) +endfunction() + # Function for installing DirectX SDK for UWP function(wis_install_dx_uwp PROJECT) - message("Installing DirectX Agility SDK Dependency") + #message("Installing DirectX Agility SDK Dependency") get_property(DX12SDKVER TARGET DX12Agility PROPERTY DX12SDKVER) @@ -29,8 +43,6 @@ endfunction() # Function for installing DirectX SDK function(wis_install_dx_win32 PROJECT) - message("Installing DirectX Agility SDK Dependency") - get_property(DX12SDKVER TARGET DX12Agility PROPERTY DX12SDKVER) set(EXPORT_AGILITY "_declspec(dllexport) extern const unsigned D3D12SDKVersion = ${DX12SDKVER}; @@ -166,7 +178,7 @@ function(wis_compile_shader) if(WISDOM_WINDOWS) add_custom_command(TARGET ${TARGET} - COMMAND "${dxc_EXECUTABLE}" -E${ENTRY} -T${TYPE}_${SHADER_MODEL} -Zi $,-Od,-O3> -Wno-ignored-attributes ${INCLUDES} ${DEFINES} -Fo${OUTPUT_DXIL} -Fd${OUTPUT_PDB} ${SHADER} + COMMAND "${dxc_EXECUTABLE}" -E${ENTRY} -T${TYPE}_${SHADER_MODEL} -Zi $,-Od,-O3> -Wno-ignored-attributes ${INCLUDES} ${DEFINES} -DDXIL=1 -Fo${OUTPUT_DXIL} -Fd${OUTPUT_PDB} ${SHADER} MAIN_DEPENDENCY ${SHADER} COMMENT "HLSL ${SHADER}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} @@ -174,7 +186,7 @@ function(wis_compile_shader) endif() add_custom_command(TARGET ${TARGET} - COMMAND "${dxc_EXECUTABLE}" -E${ENTRY} -T${TYPE}_${SHADER_MODEL} -Zi $,-Od,-O3> -spirv -Wno-ignored-attributes -fspv-target-env=vulkan1.3 ${INCLUDES} ${DEFINES} -Fo${OUTPUT_SPV} ${SHADER} + COMMAND "${dxc_EXECUTABLE}" -E${ENTRY} -T${TYPE}_${SHADER_MODEL} -Zi $,-Od,-O3> -spirv -Wno-ignored-attributes -fspv-target-env=vulkan1.3 ${INCLUDES} ${DEFINES} -DSPIRV=1 -Fo${OUTPUT_SPV} ${SHADER} MAIN_DEPENDENCY ${SHADER} COMMENT "SPV ${SHADER}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/cmake/platform/wisdom-x11-config.cmake.in b/cmake/platform/wisdom-x11-config.cmake.in new file mode 100644 index 00000000..26a19932 --- /dev/null +++ b/cmake/platform/wisdom-x11-config.cmake.in @@ -0,0 +1,19 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/ECM") +find_dependency(X11) + +if(X11_FOUND) + include( "${CMAKE_CURRENT_LIST_DIR}/wisdom-x11-targets.cmake" ) + add_alias_target(wis::x11 wis::wisdom-x11) + add_alias_target(wis::x11-headers wis::wisdom-x11-headers) +else() + add_library(wisdom-x11 INTERFACE) # Dummy target + add_library(wisdom-x11-headers INTERFACE) # Dummy target + + add_library(wis::wisdom-x11 ALIAS wisdom-x11) + add_library(wis::wisdom-x11-headers ALIAS wisdom-x11-headers) + + message(STATUS "x11 not found, skipping x11 targets") +endif() diff --git a/cmake/wisdom-deps.cmake.in b/cmake/wisdom-deps.cmake.in index 5b12385e..e889b51a 100644 --- a/cmake/wisdom-deps.cmake.in +++ b/cmake/wisdom-deps.cmake.in @@ -171,7 +171,7 @@ function(wis_compile_shader) if(WIN32) add_custom_command(TARGET ${TARGET} - COMMAND "${wis_compile_shader_DXC}" -E${ENTRY} -T${TYPE}_${SHADER_MODEL} -Zi $,-Od,-O3> -Wno-ignored-attributes ${INCLUDES} ${DEFINES} -Fo${OUTPUT_DXIL} -Fd${OUTPUT_PDB} ${SHADER} + COMMAND "${wis_compile_shader_DXC}" -E${ENTRY} -T${TYPE}_${SHADER_MODEL} -Zi $,-Od,-O3> -Wno-ignored-attributes ${INCLUDES} ${DEFINES} -DDXIL=1 -Fo${OUTPUT_DXIL} -Fd${OUTPUT_PDB} ${SHADER} MAIN_DEPENDENCY ${SHADER} COMMENT "HLSL ${SHADER}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} @@ -179,7 +179,7 @@ function(wis_compile_shader) endif() add_custom_command(TARGET ${TARGET} - COMMAND "${wis_compile_shader_DXC}" -E${ENTRY} -T${TYPE}_${SHADER_MODEL} -Zi $,-Od,-O3> -spirv -Wno-ignored-attributes -fspv-target-env=vulkan1.3 ${INCLUDES} ${DEFINES} -Fo${OUTPUT_SPV} ${SHADER} + COMMAND "${wis_compile_shader_DXC}" -E${ENTRY} -T${TYPE}_${SHADER_MODEL} -Zi $,-Od,-O3> -spirv -Wno-ignored-attributes -fspv-target-env=vulkan1.3 ${INCLUDES} ${DEFINES} -DSPIRV=1 -Fo${OUTPUT_SPV} ${SHADER} MAIN_DEPENDENCY ${SHADER} COMMENT "SPV ${SHADER}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 066a6fab..c2bfff08 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,9 +1,19 @@ -# plugins -set(FETCHCONTENT_UPDATES_DISCONNECTED ON) -include(FetchContent) +include(cmake/deps.cmake) -add_subdirectory(shaders) -add_subdirectory(deps) +function(add_example name) + if(WISDOM_VULKAN) + set(POSTFIX "vk") + add_subdirectory(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name}-${POSTFIX}) + endif() + if(WISDOM_DX12) + set(POSTFIX "dx12") + add_subdirectory(${name} ${CMAKE_CURRENT_BINARY_DIR}/${name}-${POSTFIX}) + endif() + unset(POSTFIX) +endfunction() -add_subdirectory(platform) +set(EXAMPLE_BIN_OUTPUT ${CMAKE_BINARY_DIR}/bin/examples) + +add_example(common) +add_subdirectory(basic) add_subdirectory(custom) diff --git a/examples/basic/CMakeLists.txt b/examples/basic/CMakeLists.txt new file mode 100644 index 00000000..bc52fc4b --- /dev/null +++ b/examples/basic/CMakeLists.txt @@ -0,0 +1,5 @@ +add_subdirectory(shaders) + +add_example(lut) +add_example(multiview) +add_example(descriptor_storage) diff --git a/examples/basic/descriptor_storage/CMakeLists.txt b/examples/basic/descriptor_storage/CMakeLists.txt new file mode 100644 index 00000000..092f7201 --- /dev/null +++ b/examples/basic/descriptor_storage/CMakeLists.txt @@ -0,0 +1,17 @@ +project(descriptor-storage-${POSTFIX}) + +set(HEADERS) +set(SOURCES entry_main.cpp) + +add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES}) +target_link_libraries(${PROJECT_NAME} PUBLIC common-${POSTFIX}) +add_dependencies(${PROJECT_NAME} compile_shaders_basic) +set_target_properties( + ${PROJECT_NAME} PROPERTIES CXX_STANDARD 20 RUNTIME_OUTPUT_DIRECTORY + ${EXAMPLE_BIN_OUTPUT}) + +if(POSTFIX STREQUAL "dx12") + wis_make_exports_dx(${PROJECT_NAME}) # install the d3d12 agility sdk, for + # examples this is enough + # for the main project, use wis_installdeps(${PROJECT_NAME}) instead +endif() diff --git a/examples/basic/descriptor_storage/entry_main.cpp b/examples/basic/descriptor_storage/entry_main.cpp new file mode 100644 index 00000000..40413e2b --- /dev/null +++ b/examples/basic/descriptor_storage/entry_main.cpp @@ -0,0 +1,253 @@ +#include +#include +#include +#include + +#include + +class App +{ + // Standard setup + ex::Window window; + ex::ExampleSetup setup; + ex::Swapchain swap; + ex::FramedCommandList cmd_list; + + // Resources + wis::RootSignature root; + wis::PipelineState pipeline; + wis::Shader vs; // vertex shader + wis::Shader ps; // pixel shader + + wis::Buffer vertex_buffer; // vertex buffer for triangle + wis::Buffer constant_buffersx[ex::flight_frames]; // constant buffer for triangle + wis::Buffer constant_buffersy[ex::flight_frames]; // constant buffer for triangle + + float* constant_datax[ex::flight_frames]; // constant buffer data + float* constant_datay[ex::flight_frames]; // constant buffer data + float offsetx = 0.0f; // x offset for the triangle + float offsety = 0.0f; // y offset for the triangle + + // Descriptor buffers + wis::DescriptorStorage desc_storage; + +public: + App() + : window("Descriptor Storage", 800, 600) + { + setup.InitDefault(window.GetPlatformExtension()); + auto [w, h] = window.PixelSize(); + auto swapx = window.CreateSwapchain(setup); + std::construct_at(&swap, setup.device, std::move(swapx), w, h); + cmd_list = setup.CreateLists(); + + // Only a single descriptor table with 1 descriptor + wis::DescriptorStorageDesc desc{ + .cbuffer_count = ex::flight_frames * 2, // one cbuffer per frame + .memory = wis::DescriptorMemory::ShaderVisible, // visible to shaders + }; + desc_storage = ex::Unwrap(setup.device.CreateDescriptorStorage(desc)); + } + +public: + void Run() + { + CreateResources(); + while (true) { + if (!ProcessEvents()) + break; + + Frame(); + } + } + // Process window events + bool ProcessEvents() + { + // Window events + while (true) { + auto event = window.PollEvents(); + switch (event) { + case ex::WindowEvent::Resize: { + auto [w, h] = window.PixelSize(); + swap.Resize(setup.device, w, h); + break; + } + case ex::WindowEvent::Quit: + swap.Throttle(); // wait for GPU to finish, then exit + for (size_t i = 0; i < ex::flight_frames; i++) { + constant_buffersx[i].Unmap(); + constant_buffersy[i].Unmap(); + } + return false; + case ex::WindowEvent::NoEvent: + return true; + default: + break; + } + } + // Mouse events + // Keyboard events + } + + // Render a frame + void Frame() + { + uint32_t frame_index = swap.CurrentFrame(); + + offsetx += 0.01f; + if (offsetx > 1.0f) { + offsety += 0.5f; + if (offsety > 1.0f) + offsety = -1.0f; + offsetx = -1.0f; + } + + // ------------------------------ + // Second pass + auto& cmd2 = cmd_list[frame_index]; + wis::RenderPassRenderTargetDesc targets2[]{ + { .target = swap.GetRenderTarget(frame_index), + .load_op = wis::LoadOperation::Clear, + .store_op = wis::StoreOperation::Store, + .clear_value = { 0.5f, 0.5f, 0.5f, 1.0f } } + }; + wis::RenderPassDesc rp2{ + .flags = wis::RenderPassFlags::None, + .target_count = 1, + .targets = targets2, + }; + + constant_datax[frame_index][0] = offsetx; + constant_datay[frame_index][0] = offsety; + + // Begin recording + ex::CheckResult(cmd2.Reset(pipeline)); + + // Insert barriers for the swapchain render target + cmd2.TextureBarrier( + { .sync_before = wis::BarrierSync::None, + .sync_after = wis::BarrierSync::Draw, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::RenderTarget, + .state_before = wis::TextureState::Present, + .state_after = wis::TextureState::RenderTarget }, + swap.GetTexture(frame_index)); + + cmd2.BeginRenderPass(&rp2); + cmd2.SetRootSignature(root); // always set root signature before binding resources + + // Bind descriptor storage + cmd2.SetDescriptorStorage(desc_storage); + + uint32_t root_constants[] = { frame_index, ex::flight_frames }; // frame index and frame count to get offset to the second cbuffer + cmd2.SetPushConstants(root_constants, std::size(root_constants), 0, wis::ShaderStages::All); + + cmd2.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); + wis::VertexBufferBinding vertex_binding{ + .buffer = vertex_buffer, + .size = sizeof(glm::vec3) * 3, + .stride = sizeof(glm::vec3), + }; + cmd2.IASetVertexBuffers(&vertex_binding, 1); + + auto [w, h] = window.PixelSize(); + cmd2.RSSetViewport({ 0, 0, float(w), float(h), 0, 1 }); + cmd2.RSSetScissor({ 0, 0, w, h }); + cmd2.DrawInstanced(3); + cmd2.EndRenderPass(); + + // Insert barriers for the swapchain render target + cmd2.TextureBarrier( + { .sync_before = wis::BarrierSync::Draw, + .sync_after = wis::BarrierSync::Draw, + .access_before = wis::ResourceAccess::RenderTarget, + .access_after = wis::ResourceAccess::Common, + .state_before = wis::TextureState::RenderTarget, + .state_after = wis::TextureState::Present }, + swap.GetTexture(frame_index)); + + // End recording + cmd2.Close(); + + wis::CommandListView lists[] = { cmd2 }; + setup.queue.ExecuteCommandLists(lists, std::size(lists)); + swap.Present(setup.queue); + } + void CreateResources() + { + // Load shaders + auto vs_code = ex::LoadShader("shaders/desc_storage.vs"); + auto ps_code = ex::LoadShader("shaders/desc_storage.ps"); + vs = ex::Unwrap(setup.device.CreateShader(vs_code.data(), vs_code.size())); + ps = ex::Unwrap(setup.device.CreateShader(ps_code.data(), ps_code.size())); + + // Create root for storage (it is bindless, so no reason to use tables anymore) + wis::PushConstant root_constants[]{ + { .stage = wis::ShaderStages::All, .size_bytes = 2 * sizeof(uint32_t) } + }; + root = ex::Unwrap(setup.device.CreateRootSignature(root_constants, std::size(root_constants), nullptr, 0, 2)); + // Note the 2 in the CreateRootSignature call. This is the space overlap count, which is 2 in this case. + + // Create pipeline + { + wis::InputSlotDesc input_slots[] = { + { .slot = 0, .stride_bytes = sizeof(glm::vec3), .input_class = wis::InputClass::PerVertex }, + }; + wis::InputAttribute input_attributes[] = { + { .input_slot = 0, .semantic_name = "POSITION", .semantic_index = 0, .location = 0, .format = wis::DataFormat::RGB32Float, .offset_bytes = 0 } + }; + wis::GraphicsPipelineDesc desc{ + .root_signature = root, + .input_layout = { + .slots = input_slots, + .slot_count = 1, + .attributes = input_attributes, + .attribute_count = 1, + }, + .shaders = { .vertex = vs, .pixel = ps }, + .attachments = { + .attachment_formats = { ex::swapchain_format }, + .attachments_count = 1, + }, + }; + pipeline = ex::Unwrap(setup.device.CreateGraphicsPipeline(&desc)); + } + + // Create vertex buffer + { + glm::vec3 triangle_vertices[] = { + { 0.0f, 0.5f, 0.0f }, + { 0.5f, -0.5f, 0.0f }, + { -0.5f, -0.5f, 0.0f } + }; + vertex_buffer = setup.CreateAndUploadBuffer(std::span{ triangle_vertices }, wis::BufferUsage::VertexBuffer); + } + + // Create constant buffer + { + using namespace wis; + for (size_t i = 0; i < ex::flight_frames; i++) { + constant_buffersx[i] = ex::Unwrap(setup.allocator.CreateBuffer(sizeof(float), wis::BufferUsage::CopySrc | wis::BufferUsage::ConstantBuffer, wis::MemoryType::Upload, wis::MemoryFlags::Mapped)); + constant_buffersy[i] = ex::Unwrap(setup.allocator.CreateBuffer(sizeof(float), wis::BufferUsage::CopySrc | wis::BufferUsage::ConstantBuffer, wis::MemoryType::Upload, wis::MemoryFlags::Mapped)); + desc_storage.WriteConstantBuffer(i, constant_buffersx[i], sizeof(float)); + desc_storage.WriteConstantBuffer(ex::flight_frames + i, constant_buffersy[i], sizeof(float)); + constant_datax[i] = static_cast(constant_buffersx[i].Map()); + constant_datax[i][0] = 0.0f; + + constant_datay[i] = static_cast(constant_buffersy[i].Map()); + constant_datay[i][0] = 0.0f; + } + } + } +}; + +int main(int argc, char** argv) +{ + try { + App{}.Run(); + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + return 1; + } + return 0; +} diff --git a/examples/basic/lut/CMakeLists.txt b/examples/basic/lut/CMakeLists.txt new file mode 100644 index 00000000..7304b9a8 --- /dev/null +++ b/examples/basic/lut/CMakeLists.txt @@ -0,0 +1,30 @@ +project(lut-${POSTFIX}) + +set(HEADERS lut_loader.h) +set(SOURCES entry_main.cpp lut_loader.cpp) + +add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES}) +target_link_libraries(${PROJECT_NAME} PUBLIC common-${POSTFIX}) +add_dependencies(${PROJECT_NAME} compile_shaders_basic) +set_target_properties( + ${PROJECT_NAME} PROPERTIES CXX_STANDARD 20 RUNTIME_OUTPUT_DIRECTORY + ${EXAMPLE_BIN_OUTPUT}) + +if(POSTFIX STREQUAL "dx12") + wis_make_exports_dx(${PROJECT_NAME}) # install the d3d12 agility sdk, for + # examples this is enough + # for the main project, use wis_installdeps(${PROJECT_NAME}) instead +endif() + +add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/lut.cube + $/lut.cube) +add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/image.png + $/image.png) diff --git a/examples/basic/lut/entry_main.cpp b/examples/basic/lut/entry_main.cpp new file mode 100644 index 00000000..207688fc --- /dev/null +++ b/examples/basic/lut/entry_main.cpp @@ -0,0 +1,435 @@ +#include +#include +#include +#include + +#include "lut_loader.h" + +#include + +// This example shows how to use LUT (Look-Up Table) to apply color correction to the image. +// LUT is a 3D texture, where each pixel is a color correction value. +// In this example, we will use a 3D texture with size 16x16x16, which is a common size for LUTs. +// The LUT texture will be applied to the image, and the color correction will be visible. +// The LUT texture is loaded from a file, and the image is rendered to the screen. +// This example uses descriptor buffers, which are available on NVidia>=16xx. + +#define STB_IMAGE_IMPLEMENTATION +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include +#include + +struct ImageData { + std::vector data; + uint32_t width; + uint32_t height; + uint32_t channels; +}; + +ImageData LoadPNGImage(std::filesystem::path path) +{ + ImageData data; + auto path_str = path.string(); + auto* idata = stbi_load(path_str.c_str(), (int*)&data.width, (int*)&data.height, (int*)&data.channels, 4); + + std::copy(idata, idata + data.width * data.height * 4, std::back_inserter(data.data)); + stbi_image_free(idata); + + return data; +} + +class App +{ + // Standard setup + ex::Window window; + ex::ExampleSetup setup; + ex::Swapchain swap; + ex::FramedCommandList cmd_list; + + // Resources + // First pass resources + wis::RootSignature root; // root signature for first stage + wis::PipelineState pipeline; // pipeline for first stage + wis::Shader vs; // vertex shader + wis::Shader ps; // pixel shader + + wis::Texture texture; // texture for rendering + wis::Texture texture_lut; // 3D texture for LUT (Look-Up Table) + wis::ShaderResource srv; // shader resource view for texture + wis::ShaderResource srv_lut; // shader resource view for LUT + wis::Sampler sampler; // sampler for texture (linear) + wis::Sampler sampler_lut; // sampler for LUT (point) + + // Descriptor buffers + wis::DescriptorBufferExtension desc_ext; // descriptor buffer extension for shader resources + wis::DescriptorBuffer desc_buffer; // descriptor buffer for shader resources + wis::DescriptorBuffer sampler_buffer; // descriptor buffer for samplers + +public: + App() + : window("LUT", 800, 600) + { + wis::DeviceExtension* exts[] = { &desc_ext }; + setup.InitDefault(window.GetPlatformExtension(), exts); + auto [w, h] = window.PixelSize(); + auto swapx = window.CreateSwapchain(setup); + std::construct_at(&swap, setup.device, std::move(swapx), w, h); + cmd_list = setup.CreateLists(); + + // Only a single descriptor table with 1 descriptor + uint32_t desc_increment = desc_ext.GetDescriptorSize(wis::DescriptorHeapType::Descriptor); + desc_buffer = ex::Unwrap(desc_ext.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, 2 * desc_increment)); + + // No need for multiple samplers + uint32_t samp_increment = desc_ext.GetDescriptorSize(wis::DescriptorHeapType::Sampler); + sampler_buffer = ex::Unwrap(desc_ext.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, 2 * samp_increment)); + } + +public: + void Run() + { + CreateResources(); + while (true) { + if (!ProcessEvents()) + break; + + Frame(); + } + } + // Process window events + bool ProcessEvents() + { + // Window events + while (true) { + auto event = window.PollEvents(); + switch (event) { + case ex::WindowEvent::Resize: { + auto [w, h] = window.PixelSize(); + swap.Resize(setup.device, w, h); + break; + } + case ex::WindowEvent::Quit: + swap.Throttle(); // wait for GPU to finish, then exit + return false; + case ex::WindowEvent::NoEvent: + return true; + default: + break; + } + } + // Mouse events + // Keyboard events + } + + // Render a frame + void Frame() + { + uint32_t frame_index = swap.CurrentFrame(); + // ------------------------------ + // Only pass + auto& cmd2 = cmd_list[frame_index]; + wis::RenderPassRenderTargetDesc targets2[]{ + { .target = swap.GetRenderTarget(frame_index), + .load_op = wis::LoadOperation::Clear, + .store_op = wis::StoreOperation::Store, + .clear_value = { 0.0f, 0.5f, 0.5f, 1.0f } } + }; + wis::RenderPassDesc rp2{ + .flags = wis::RenderPassFlags::None, + .view_mask = 0, // no array layers + .target_count = 1, + .targets = targets2, + }; + + // Begin recording + ex::CheckResult(cmd2.Reset(pipeline)); + + // Insert barriers for the swapchain render target + cmd2.TextureBarrier( + { .sync_before = wis::BarrierSync::None, + .sync_after = wis::BarrierSync::Draw, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::RenderTarget, + .state_before = wis::TextureState::Present, + .state_after = wis::TextureState::RenderTarget }, + swap.GetTexture(frame_index)); + + cmd2.BeginRenderPass(&rp2); + cmd2.SetRootSignature(root); // always set root signature before binding resources + + // Bind resources + desc_ext.SetDescriptorBuffers(cmd2, desc_buffer, sampler_buffer); + desc_ext.SetDescriptorTableOffset(cmd2, root, 0, desc_buffer, 0); + desc_ext.SetDescriptorTableOffset(cmd2, root, 1, sampler_buffer, 0); + + cmd2.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); + + auto [w, h] = window.PixelSize(); + cmd2.RSSetViewport({ 0, 0, float(w), float(h), 0, 1 }); + cmd2.RSSetScissor({ 0, 0, w, h }); + cmd2.DrawInstanced(3); + cmd2.EndRenderPass(); + + // Insert barriers for the swapchain render target + cmd2.TextureBarrier( + { .sync_before = wis::BarrierSync::Draw, + .sync_after = wis::BarrierSync::Draw, + .access_before = wis::ResourceAccess::RenderTarget, + .access_after = wis::ResourceAccess::Common, + .state_before = wis::TextureState::RenderTarget, + .state_after = wis::TextureState::Present }, + swap.GetTexture(frame_index)); + + // End recording + cmd2.Close(); + + wis::CommandListView lists[] = { cmd2 }; + setup.queue.ExecuteCommandLists(lists, std::size(lists)); + swap.Present(setup.queue); + } + + // Create resources + void CreateResources() + { + using namespace wis; // for flag OR operations + auto& device = setup.device; + auto& cmd = cmd_list[0]; + ex::CheckResult(cmd.Reset()); + + // Create shaders + { + auto xvs = ex::LoadShader("shaders/lut.vs"); + auto xps = ex::LoadShader("shaders/lut.ps"); + vs = ex::Unwrap(setup.device.CreateShader(xvs.data(), uint32_t(xvs.size()))); + ps = ex::Unwrap(setup.device.CreateShader(xps.data(), uint32_t(xps.size()))); + } + + // Create root signature with 2 textures and 2 samplers (pair for lut and pair for image) + { + wis::DescriptorTableEntry entries[]{ + { .type = wis::DescriptorType::Texture, // LUT texture (3D cube) + .bind_register = 0, + .binding = 0, + .count = 1 }, + { .type = wis::DescriptorType::Texture, // Image texture (2D) + .bind_register = 1, + .binding = 1, + .count = 1 }, + { .type = wis::DescriptorType::Sampler, // LUT sampler (point) + .bind_register = 0, + .binding = 0, + .count = 1 }, + { .type = wis::DescriptorType::Sampler, // image sampler (linear) + .bind_register = 1, + .binding = 1, + .count = 1 } + }; + + wis::DescriptorTable tables[]{ + { .type = wis::DescriptorHeapType::Descriptor, + .entries = entries, // first entries + .entry_count = 2, + .stage = wis::ShaderStages::Pixel }, + { .type = wis::DescriptorHeapType::Sampler, + .entries = entries + 2, // skip first 2 entries + .entry_count = 2, + .stage = wis::ShaderStages::Pixel } + }; + root = ex::Unwrap(desc_ext.CreateRootSignature(nullptr, 0, nullptr, 0, tables, std::size(tables))); + } + + // Create pipeline + { + wis::GraphicsPipelineDesc desc{ + .root_signature = root, + .shaders = { .vertex = vs, .pixel = ps }, + .attachments = { + .attachment_formats = { ex::swapchain_format }, + .attachments_count = 1, + }, + .flags = wis::PipelineFlags::DescriptorBuffer, // use descriptor buffer for root signature + }; + pipeline = ex::Unwrap(setup.device.CreateGraphicsPipeline(&desc)); + } + + // Load LUT (using uploaded buffer) + // There is a way to load Textures directly to GPU memory, but it's a topic for another example ;) + + // Load LUT from file and copy it to UploadBuffer + auto lut_data = LutLoader::LoadLut("lut.cube"); + auto [res2, lut_data_buffer] = setup.allocator.CreateUploadBuffer(lut_data.stride * lut_data.stride * lut_data.stride * 4 * sizeof(float)); + std::copy(lut_data.data.get(), lut_data.data.get() + lut_data.stride * lut_data.stride * lut_data.stride * 4, lut_data_buffer.Map()); + lut_data_buffer.Unmap(); + + { + using namespace wis; + + // Create 3D texture for LUT + wis::TextureDesc desc{ + .format = wis::DataFormat::RGBA32Float, + .size = { uint32_t(lut_data.stride), (uint32_t)lut_data.stride, (uint32_t)lut_data.stride }, + .mip_levels = 1, + .layout = wis::TextureLayout::Texture3D, + .usage = wis::TextureUsage::CopyDst | wis::TextureUsage::ShaderResource + }; + texture_lut = ex::Unwrap(setup.allocator.CreateTexture(desc)); + + // Copy LUT data to the texture + wis::BufferTextureCopyRegion region{ + .texture = { + .size = { (uint32_t)lut_data.stride, (uint32_t)lut_data.stride, (uint32_t)lut_data.stride }, + .format = wis::DataFormat::RGBA32Float, + } + }; + // Insert barrier for the LUT texture + cmd.TextureBarrier( + { .sync_before = wis::BarrierSync::All, + .sync_after = wis::BarrierSync::All, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::CopyDest, + .state_before = wis::TextureState::Undefined, + .state_after = wis::TextureState::CopyDest }, + texture_lut); + cmd.CopyBufferToTexture(lut_data_buffer, texture_lut, ®ion, 1); + // Insert barrier for the LUT texture + cmd.TextureBarrier( + { .sync_before = wis::BarrierSync::All, + .sync_after = wis::BarrierSync::All, + .access_before = wis::ResourceAccess::CopyDest, + .access_after = wis::ResourceAccess::ShaderResource, + .state_before = wis::TextureState::CopyDest, + .state_after = wis::TextureState::ShaderResource }, + texture_lut); + + // Create shader resource view for LUT + wis::ShaderResourceDesc srv_desc{ + .format = wis::DataFormat::RGBA32Float, + .view_type = wis::TextureViewType::Texture3D, + .subresource_range = { + .base_mip_level = 0, + .level_count = 1, // no need to specify array layers. It's a 3D texture + }, + }; + srv_lut = ex::Unwrap(device.CreateShaderResource(texture_lut, srv_desc)); + + // Write LUT SRV to the descriptor buffer + // desc_buffer.WriteShaderResource(0, 0, 0, 0, root, srv_lut); + desc_buffer.WriteShaderResource(0, 0, srv_lut); + + // Create sampler for LUT + wis::SamplerDesc sample_desc{ + .min_filter = wis::Filter::Point, + .mag_filter = wis::Filter::Point, + .mip_filter = wis::Filter::Point, + .anisotropic = false, + .max_anisotropy = 16, + .address_u = wis::AddressMode::ClampToEdge, + .address_v = wis::AddressMode::ClampToEdge, + .address_w = wis::AddressMode::ClampToEdge, + .min_lod = 0, + .max_lod = 1.0f, + .mip_lod_bias = 0.0f, + .comparison_op = wis::Compare::None, + }; + sampler_lut = ex::Unwrap(device.CreateSampler(&sample_desc)); + + // Write LUT sampler to the descriptor buffer + sampler_buffer.WriteSampler(0, 0, sampler_lut); + } + + // Load Image + auto png_data = LoadPNGImage("image.png"); + auto [res, img_data_buffer] = setup.allocator.CreateUploadBuffer(png_data.data.size()); + std::copy(png_data.data.begin(), png_data.data.end(), img_data_buffer.Map()); + img_data_buffer.Unmap(); + + { + // Create Texture + using namespace wis; + wis::TextureDesc desc{ + .format = wis::DataFormat::RGBA8Unorm, + .size = { png_data.width, png_data.height, 1 }, + .mip_levels = 1, + .usage = wis::TextureUsage::CopyDst | wis::TextureUsage::ShaderResource + }; + texture = ex::Unwrap(setup.allocator.CreateTexture(desc)); + + // Copy image data to the texture + wis::BufferTextureCopyRegion region{ + .texture = { + .size = { png_data.width, png_data.height, 1 }, + .format = wis::DataFormat::RGBA8Unorm, + } + }; + // Insert barrier for the image texture + cmd.TextureBarrier( + { .sync_before = wis::BarrierSync::All, + .sync_after = wis::BarrierSync::All, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::CopyDest, + .state_before = wis::TextureState::Undefined, + .state_after = wis::TextureState::CopyDest }, + texture); + cmd.CopyBufferToTexture(img_data_buffer, texture, ®ion, 1); + // Insert barrier for the image texture + cmd.TextureBarrier( + { .sync_before = wis::BarrierSync::All, + .sync_after = wis::BarrierSync::All, + .access_before = wis::ResourceAccess::CopyDest, + .access_after = wis::ResourceAccess::ShaderResource, + .state_before = wis::TextureState::CopyDest, + .state_after = wis::TextureState::ShaderResource }, + texture); + + // Create shader resource view for image + wis::ShaderResourceDesc srv_desc{ + .format = wis::DataFormat::RGBA8Unorm, + .view_type = wis::TextureViewType::Texture2D, + .subresource_range = { + .base_mip_level = 0, + .level_count = 1, // no need to specify array layers. It's a 2D texture without array layers + }, + }; + srv = ex::Unwrap(device.CreateShaderResource(texture, srv_desc)); + + // Write image SRV to the descriptor buffer + desc_buffer.WriteShaderResource(0, 1, srv); + + // Create sampler for image + wis::SamplerDesc sample_desc{ + .min_filter = wis::Filter::Linear, + .mag_filter = wis::Filter::Linear, + .mip_filter = wis::Filter::Linear, + .anisotropic = false, + .max_anisotropy = 16, + .address_u = wis::AddressMode::Repeat, + .address_v = wis::AddressMode::Repeat, + .address_w = wis::AddressMode::Repeat, + .min_lod = 0, + .max_lod = 1.0f, + .mip_lod_bias = 0.0f, + .comparison_op = wis::Compare::None, + }; + sampler = ex::Unwrap(device.CreateSampler(&sample_desc)); + + // Write image sampler to the descriptor buffer + sampler_buffer.WriteSampler(0, 1, sampler); + } + + cmd.Close(); + wis::CommandListView lists[] = { cmd }; + setup.queue.ExecuteCommandLists(lists, std::size(lists)); + setup.WaitForGPU(); + } +}; + +int main(int argc, char** argv) +{ + try { + App{}.Run(); + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + return 1; + } + return 0; +} diff --git a/examples/custom/lut/image.png b/examples/basic/lut/image.png similarity index 100% rename from examples/custom/lut/image.png rename to examples/basic/lut/image.png diff --git a/examples/custom/lut/lut.cube b/examples/basic/lut/lut.cube similarity index 100% rename from examples/custom/lut/lut.cube rename to examples/basic/lut/lut.cube diff --git a/examples/custom/lut/lut_loader.cpp b/examples/basic/lut/lut_loader.cpp similarity index 100% rename from examples/custom/lut/lut_loader.cpp rename to examples/basic/lut/lut_loader.cpp diff --git a/examples/custom/lut/lut_loader.h b/examples/basic/lut/lut_loader.h similarity index 100% rename from examples/custom/lut/lut_loader.h rename to examples/basic/lut/lut_loader.h diff --git a/examples/basic/multiview/CMakeLists.txt b/examples/basic/multiview/CMakeLists.txt new file mode 100644 index 00000000..3ac79c66 --- /dev/null +++ b/examples/basic/multiview/CMakeLists.txt @@ -0,0 +1,17 @@ +project(multiview-${POSTFIX}) + +set(HEADERS) +set(SOURCES entry_main.cpp) + +add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES}) +target_link_libraries(${PROJECT_NAME} PUBLIC common-${POSTFIX}) +add_dependencies(${PROJECT_NAME} compile_shaders_basic) +set_target_properties( + ${PROJECT_NAME} PROPERTIES CXX_STANDARD 20 RUNTIME_OUTPUT_DIRECTORY + ${EXAMPLE_BIN_OUTPUT}) + +if(POSTFIX STREQUAL "dx12") + wis_make_exports_dx(${PROJECT_NAME}) # install the d3d12 agility sdk, for + # examples this is enough + # for the main project, use wis_installdeps(${PROJECT_NAME}) instead +endif() diff --git a/examples/basic/multiview/entry_main.cpp b/examples/basic/multiview/entry_main.cpp new file mode 100644 index 00000000..2714e2ce --- /dev/null +++ b/examples/basic/multiview/entry_main.cpp @@ -0,0 +1,398 @@ +#include +#include +#include +#include + +#include + +// In order to render with multiview, we need to have texture with array layers. +// In case of stereo rendering, we need to have 2 array layers. +// Stereo example is not implemented here, but it is possible to implement it by +// creating a swapchain with stereo=true. Stereo rendering is not supported by all graphics cards. +// You can check if stereo is supported by calling swap.StereoSupported(). + +// In this example, we will render to the texture with 2 array layers, imitating stereo rendering. +// One layer will be rendered with red color, and the other with blue color. + +class App +{ + // Standard setup + ex::Window window; + ex::ExampleSetup setup; + ex::Swapchain swap; + ex::FramedCommandList cmd_list; // for first pass + ex::FramedCommandList cmd_list2; // for second pass + + // Resources + // First pass resources + wis::RootSignature root; // root signature for first stage and second stage (same) + wis::PipelineState pipeline; // pipeline for first stage + wis::Shader vs; // vertex shader + wis::Shader ps; // pixel shader + + wis::Texture textures[ex::flight_frames]; // textures for rendering, with 2 array layers + wis::ShaderResource srvs[ex::flight_frames]; // shader resource view for texture + wis::RenderTarget rts[ex::flight_frames]; // render target for texture + + wis::Buffer vertex_buffer; // vertex buffer for triangle + + // Second pass resources + wis::PipelineState fullscreen_pipeline; // pipeline for second stage + wis::Shader fullscreen_vs; // vertex shader for second stage + wis::Shader fullscreen_ps; // pixel shader for second stage + wis::Sampler sampler; // sampler for texture + + // Descriptor buffers + wis::DescriptorStorage desc_storage; // descriptor storage for shader resources + +public: + App() + : window("Multiview", 800, 600) + { + setup.InitDefault(window.GetPlatformExtension()); + auto [w, h] = window.PixelSize(); + auto swapx = window.CreateSwapchain(setup); + std::construct_at(&swap, setup.device, std::move(swapx), w, h); + cmd_list = setup.CreateLists(); + cmd_list2 = setup.CreateLists(); + + desc_storage = ex::Unwrap(setup.device.CreateDescriptorStorage({ .sampler_count = 1, + .texture_count = ex::flight_frames, + .memory = wis::DescriptorMemory::ShaderVisible })); + } + +public: + void Run() + { + CreateFirstPassResources(); + CreateSecondPassResources(); + while (true) { + if (!ProcessEvents()) + break; + + Frame(); + } + } + // Process window events + bool ProcessEvents() + { + // Window events + while (true) { + auto event = window.PollEvents(); + switch (event) { + case ex::WindowEvent::Resize: { + auto [w, h] = window.PixelSize(); + swap.Resize(setup.device, w, h); + break; + } + case ex::WindowEvent::Quit: + swap.Throttle(); // wait for GPU to finish, then exit + return false; + case ex::WindowEvent::NoEvent: + return true; + default: + break; + } + } + // Mouse events + // Keyboard events + } + + // Render a frame + void Frame() + { + uint32_t frame_index = swap.CurrentFrame(); + auto& cmd = cmd_list[frame_index]; + + wis::RenderPassRenderTargetDesc targets[]{ + { .target = rts[frame_index], + .load_op = wis::LoadOperation::Clear, + .store_op = wis::StoreOperation::Store, + .clear_value = { 0.1f, 0.1f, 0.1f, 1.0f } } // clear with gray color + }; + wis::RenderPassDesc rp1{ + .flags = wis::RenderPassFlags::None, + .view_mask = 0b11, // 2 array layers + .target_count = 1, + .targets = targets, + }; + + // Begin recording + ex::CheckResult(cmd.Reset(pipeline)); + + // Insert barriers for the texture + cmd.TextureBarrier( + { .sync_before = wis::BarrierSync::None, + .sync_after = wis::BarrierSync::Draw, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::RenderTarget, + .state_before = wis::TextureState::ShaderResource, + .state_after = wis::TextureState::RenderTarget }, + textures[frame_index]); + + // Record commands for the first pass + // ... + cmd.BeginRenderPass(&rp1); + cmd.SetRootSignature(root); // always set root signature before binding resources + cmd.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); + cmd.RSSetViewport({ 0, 0, 800, 800, 0, 1 }); + cmd.RSSetScissor({ 0, 0, 800, 800 }); + + wis::VertexBufferBinding vertex_binding{ + .buffer = vertex_buffer, + .size = sizeof(glm::vec3) * 3, + .stride = sizeof(glm::vec3), + }; + cmd.IASetVertexBuffers(&vertex_binding, 1); + cmd.DrawInstanced(3); + + cmd.EndRenderPass(); + // Insert barriers for the texture + cmd.TextureBarrier( + { .sync_before = wis::BarrierSync::Draw, + .sync_after = wis::BarrierSync::All, + .access_before = wis::ResourceAccess::RenderTarget, + .access_after = wis::ResourceAccess::ShaderResource, + .state_before = wis::TextureState::RenderTarget, + .state_after = wis::TextureState::ShaderResource }, + textures[frame_index]); + + // End recording + cmd.Close(); + + // ------------------------------ + // Second pass + auto& cmd2 = cmd_list2[frame_index]; + wis::RenderPassRenderTargetDesc targets2[]{ + { .target = swap.GetRenderTarget(frame_index), + .load_op = wis::LoadOperation::Clear, + .store_op = wis::StoreOperation::Store, + .clear_value = { 0.0f, 0.5f, 0.5f, 1.0f } } + }; + wis::RenderPassDesc rp2{ + .flags = wis::RenderPassFlags::None, + .view_mask = 0, // no array layers + .target_count = 1, + .targets = targets2, + }; + + // Begin recording + ex::CheckResult(cmd2.Reset(fullscreen_pipeline)); + + // Insert barriers for the swapchain render target + cmd2.TextureBarrier( + { .sync_before = wis::BarrierSync::None, + .sync_after = wis::BarrierSync::Draw, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::RenderTarget, + .state_before = wis::TextureState::Present, + .state_after = wis::TextureState::RenderTarget }, + swap.GetTexture(frame_index)); + + cmd2.BeginRenderPass(&rp2); + cmd2.SetRootSignature(root); // always set root signature before binding resources + + cmd2.SetDescriptorStorage(desc_storage); + cmd2.SetPushConstants(&frame_index, 1, 0, wis::ShaderStages::Pixel); + cmd2.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); + + auto [w, h] = window.PixelSize(); + cmd2.RSSetViewport({ 0, 0, float(w), float(h), 0, 1 }); + cmd2.RSSetScissor({ 0, 0, w, h }); + cmd2.DrawInstanced(3); + cmd2.EndRenderPass(); + + // Insert barriers for the swapchain render target + cmd2.TextureBarrier( + { .sync_before = wis::BarrierSync::Draw, + .sync_after = wis::BarrierSync::Draw, + .access_before = wis::ResourceAccess::RenderTarget, + .access_after = wis::ResourceAccess::Common, + .state_before = wis::TextureState::RenderTarget, + .state_after = wis::TextureState::Present }, + swap.GetTexture(frame_index)); + + // End recording + cmd2.Close(); + + wis::CommandListView lists[] = { cmd, cmd2 }; + setup.queue.ExecuteCommandLists(lists, std::size(lists)); + swap.Present(setup.queue); + } + + // Create resources + void CreateFirstPassResources() + { + using namespace wis; // for flag OR operations + auto& device = setup.device; + auto& cmd = cmd_list[0]; + ex::CheckResult(cmd.Reset()); + + // Create shaders + { + auto xvs = ex::LoadShader("shaders/multiview.vs"); + auto xps = ex::LoadShader("shaders/multiview.ps"); + vs = ex::Unwrap(setup.device.CreateShader(xvs.data(), uint32_t(xvs.size()))); + ps = ex::Unwrap(setup.device.CreateShader(xps.data(), uint32_t(xps.size()))); + } + + // Create texture with 2 array layers + { + wis::TextureDesc desc{ + .format = wis::DataFormat::BGRA8Unorm, + .size = { 800, 800, 2 }, // 2 array layers + .mip_levels = 1, + .layout = wis::TextureLayout::Texture2DArray, + .usage = wis::TextureUsage::RenderTarget | wis::TextureUsage::ShaderResource + }; + + // Create render target for texture for the first pass + wis::RenderTargetDesc rt_desc{ + .format = wis::DataFormat::BGRA8Unorm, + .layout = wis::TextureLayout::Texture2DArray, + .mip = 0, + .base_array_layer = 0, + .layer_count = 2, + }; + + // Create shader resource view for texture for the second pass + wis::ShaderResourceDesc srv_desc{ + .format = wis::DataFormat::BGRA8Unorm, + .view_type = wis::TextureViewType::Texture2DArray, + .subresource_range = { + .base_mip_level = 0, + .level_count = 1, + .base_array_layer = 0, + .layer_count = 2, + }, + }; + + for (size_t i = 0; i < ex::flight_frames; i++) { + textures[i] = ex::Unwrap(setup.allocator.CreateTexture(desc)); + rts[i] = ex::Unwrap(device.CreateRenderTarget(textures[i], rt_desc)); + srvs[i] = ex::Unwrap(device.CreateShaderResource(textures[i], srv_desc)); + // Texture is in undefined state, so we need to transition it to render target state + cmd.TextureBarrier( + { .sync_before = wis::BarrierSync::None, + .sync_after = wis::BarrierSync::None, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::NoAccess, + .state_before = wis::TextureState::Undefined, + .state_after = wis::TextureState::ShaderResource }, // we will change this later + textures[i]); + } + } + + // Create root signature with + { + wis::PushConstant root_constants[]{ + { .stage = wis::ShaderStages::Pixel, .size_bytes = sizeof(uint32_t) } + }; + root = ex::Unwrap(setup.device.CreateRootSignature(root_constants, 1, nullptr, 0, 2)); + } + + // Create pipeline + { + wis::InputSlotDesc input_slots[] = { + { .slot = 0, .stride_bytes = sizeof(glm::vec3), .input_class = wis::InputClass::PerVertex }, + }; + wis::InputAttribute input_attributes[] = { + { .input_slot = 0, .semantic_name = "POSITION", .semantic_index = 0, .location = 0, .format = wis::DataFormat::RGB32Float, .offset_bytes = 0 } + }; + wis::GraphicsPipelineDesc desc{ + .root_signature = root, + .input_layout = { + .slots = input_slots, + .slot_count = 1, + .attributes = input_attributes, + .attribute_count = 1, + }, + .shaders = { .vertex = vs, .pixel = ps }, + .attachments = { + .attachment_formats = { wis::DataFormat::BGRA8Unorm }, + .attachments_count = 1, + }, + .view_mask = 0b11, // 2 array layers + }; + pipeline = ex::Unwrap(setup.device.CreateGraphicsPipeline(&desc)); + } + + // Create vertex buffer + { + glm::vec3 triangle_vertices[] = { + { 0.0f, 0.5f, 0.0f }, + { 0.5f, -0.5f, 0.0f }, + { -0.5f, -0.5f, 0.0f } + }; + vertex_buffer = setup.CreateAndUploadBuffer(std::span{ triangle_vertices }, wis::BufferUsage::VertexBuffer); + } + + cmd.Close(); + wis::CommandListView lists[] = { cmd }; + setup.queue.ExecuteCommandLists(lists, std::size(lists)); + setup.WaitForGPU(); + } + + void CreateSecondPassResources() + { + // Create shaders + { + auto xvs = ex::LoadShader("shaders/multiview_screen.vs"); + auto xps = ex::LoadShader("shaders/multiview_screen.ps"); + fullscreen_vs = ex::Unwrap(setup.device.CreateShader(xvs.data(), uint32_t(xvs.size()))); + fullscreen_ps = ex::Unwrap(setup.device.CreateShader(xps.data(), uint32_t(xps.size()))); + } + + // Create pipeline + { + wis::GraphicsPipelineDesc desc{ + .root_signature = root, + .shaders = { .vertex = fullscreen_vs, .pixel = fullscreen_ps }, + .attachments = { + .attachment_formats = { ex::swapchain_format }, + .attachments_count = 1, + }, + // view mask is 0b00, because we will render to the back buffer + }; + fullscreen_pipeline = ex::Unwrap(setup.device.CreateGraphicsPipeline(&desc)); + } + + // Create Sampler + { + wis::SamplerDesc sample_desc{ + .min_filter = wis::Filter::Point, + .mag_filter = wis::Filter::Point, + .mip_filter = wis::Filter::Point, + .anisotropic = false, + .max_anisotropy = 16, + .address_u = wis::AddressMode::Repeat, + .address_v = wis::AddressMode::Repeat, + .address_w = wis::AddressMode::Repeat, + .min_lod = 0, + .max_lod = 1.0f, + .mip_lod_bias = 0.0f, + .comparison_op = wis::Compare::None, + }; + sampler = ex::Unwrap(setup.device.CreateSampler(&sample_desc)); + desc_storage.WriteSampler(0, sampler); + } + + // fill desc buffer + { + for (uint32_t i = 0; i < ex::flight_frames; i++) { + desc_storage.WriteTexture(i, srvs[i]); + } + } + } +}; + +int main(int argc, char** argv) +{ + try { + App{}.Run(); + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + return 1; + } + return 0; +} diff --git a/examples/shaders/CMakeLists.txt b/examples/basic/shaders/CMakeLists.txt similarity index 60% rename from examples/shaders/CMakeLists.txt rename to examples/basic/shaders/CMakeLists.txt index 7e125e9f..abed68bd 100644 --- a/examples/shaders/CMakeLists.txt +++ b/examples/basic/shaders/CMakeLists.txt @@ -1,4 +1,11 @@ -add_custom_target(compile_shaders_kd) +add_custom_target(compile_shaders_basic) + +set(SHADER_DIR + ${EXAMPLE_BIN_OUTPUT}/shaders + CACHE PATH "") + +# create folder for shaders +file(MAKE_DIRECTORY ${SHADER_DIR}) file(GLOB_RECURSE vs "${CMAKE_CURRENT_SOURCE_DIR}/*/*.vs.hlsl") file(GLOB_RECURSE ps "${CMAKE_CURRENT_SOURCE_DIR}/*/*.ps.hlsl") @@ -8,9 +15,7 @@ file(GLOB_RECURSE gs "${CMAKE_CURRENT_SOURCE_DIR}/*/*.gs.hlsl") file(GLOB_RECURSE cs "${CMAKE_CURRENT_SOURCE_DIR}/*/*.cs.hlsl") foreach(FILE ${vs} ${ps} ${ds} ${hs} ${gs}) - wis_compile_shader(TARGET compile_shaders_kd SHADER ${FILE}) + get_filename_component(FILE_WE ${FILE} NAME_WLE) + wis_compile_shader(TARGET compile_shaders_basic SHADER ${FILE} OUTPUT + ${SHADER_DIR}/${FILE_WE}) endforeach(FILE) - -set(SHADER_DIR - ${CMAKE_CURRENT_BINARY_DIR} - CACHE PATH "") diff --git a/examples/basic/shaders/descriptor_storage/desc_storage.ps.hlsl b/examples/basic/shaders/descriptor_storage/desc_storage.ps.hlsl new file mode 100644 index 00000000..60b077ac --- /dev/null +++ b/examples/basic/shaders/descriptor_storage/desc_storage.ps.hlsl @@ -0,0 +1,13 @@ +struct PSInput { + float4 position : SV_POSITION; +}; +struct PSOutput { + float4 color : SV_TARGET0; +}; + +PSOutput main(PSInput input) +{ + PSOutput output = (PSOutput)0; + output.color = float4(0,0.5,0.3,1); + return output; +} diff --git a/examples/basic/shaders/descriptor_storage/desc_storage.vs.hlsl b/examples/basic/shaders/descriptor_storage/desc_storage.vs.hlsl new file mode 100644 index 00000000..b94121ba --- /dev/null +++ b/examples/basic/shaders/descriptor_storage/desc_storage.vs.hlsl @@ -0,0 +1,34 @@ +struct PSInput { + float4 position : SV_POSITION; +}; + +struct PushConstants { + uint2 buffer; +}; +[[vk::push_constant]] ConstantBuffer pushConstants : register(b0); + +struct OffsetX { + float offset; +}; + +struct OffsetY { + float offset; +}; + +// binding 0, space 1 is used for samplers +// binding 0, space 2 is used for constant buffers +[[vk::binding(0, 2)]] ConstantBuffer offsetsx[] : register(b0, space3); +[[vk::binding(0, 2)]] ConstantBuffer offsetsy[] : register(b0, space4); //overlap with space3 +// Note: different register, for DX this has to be different register +// for Vulkan it can be the same register without offset. +// That means we have to subtract the descriptor offset in the shader for DX compilation. + +PSInput main(float3 position : POSITION) +{ + PSInput result = (PSInput)0; + + float offsetx = offsetsx[pushConstants.buffer.x].offset; + float offsety = offsetsy[pushConstants.buffer.y + pushConstants.buffer.x].offset; + result.position = float4(position.x + offsetx, position.y + offsety, position.z, 1.0f); + return result; +} diff --git a/examples/custom/lut/lut.ps.hlsl b/examples/basic/shaders/lut/lut.ps.hlsl similarity index 87% rename from examples/custom/lut/lut.ps.hlsl rename to examples/basic/shaders/lut/lut.ps.hlsl index b3381b62..9d38b9bb 100644 --- a/examples/custom/lut/lut.ps.hlsl +++ b/examples/basic/shaders/lut/lut.ps.hlsl @@ -8,8 +8,7 @@ struct PSQuadIn { [[vk::binding(0, 1)]] SamplerState sampler_lut : register(s0); [[vk::binding(1, 1)]] SamplerState sampler_tex : register(s1); - -float3 cscApplyLut3DTetra(const float3 color) +float3 Lut3DTetra(const float3 color) { float3 dims; lut.GetDimensions(dims.x, dims.y, dims.z); @@ -74,16 +73,13 @@ float3 cscApplyLut3DTetra(const float3 color) return ((1.0f - delta.x) * s1 + (delta.x - delta.y) * s2 + (delta.y - delta.z) * s3 + delta.z * s4).rgb; } -float4 main(PSQuadIn ps_in) : SV_Target0 +float4 main(PSQuadIn ps_in) + : SV_Target0 { - float4 color = tex.Sample(sampler_tex, ps_in.texcoord); - float3 color3 = color.rgb; - -#ifdef TETRA - float3 color3_lut = cscApplyLut3DTetra(color3); -#else - float3 color3_lut = lut.Sample(sampler_lut, color3).rgb; -#endif // TETRA + float2 texcoord = ps_in.texcoord * float2(2, 1); // repeat texture + float4 color = tex.Sample(sampler_tex, texcoord); - return float4(color3_lut.r, color3_lut.g, color3_lut.b, color.a); + // apply 3D LUT with tetrahedral interpolation + float3 color3_lut = (texcoord.x > 1 ? Lut3DTetra(color.rgb) : color.rgb); + return float4(color3_lut, color.a); } diff --git a/examples/custom/lut/lut.vs.hlsl b/examples/basic/shaders/lut/lut.vs.hlsl similarity index 100% rename from examples/custom/lut/lut.vs.hlsl rename to examples/basic/shaders/lut/lut.vs.hlsl diff --git a/examples/basic/shaders/multiview/multiview.ps.hlsl b/examples/basic/shaders/multiview/multiview.ps.hlsl new file mode 100644 index 00000000..a2797aa9 --- /dev/null +++ b/examples/basic/shaders/multiview/multiview.ps.hlsl @@ -0,0 +1,14 @@ +struct PSInput { + float4 position : SV_POSITION; + float4 color : COLOR0; +}; +struct PSOutput { + float4 color : SV_TARGET0; +}; + +PSOutput main(PSInput input) +{ + PSOutput output = (PSOutput)0; + output.color = input.color; + return output; +} diff --git a/examples/basic/shaders/multiview/multiview.vs.hlsl b/examples/basic/shaders/multiview/multiview.vs.hlsl new file mode 100644 index 00000000..695ed8b8 --- /dev/null +++ b/examples/basic/shaders/multiview/multiview.vs.hlsl @@ -0,0 +1,12 @@ +struct PSInput { + float4 position : SV_POSITION; + float4 color : COLOR0; +}; + +PSInput main(float3 position : POSITION, uint view : SV_VIEWID) +{ + PSInput result = (PSInput)0; + result.position = float4(position.x, position.y, position.z, 1.0f); + result.color = (view == 0 ? float4(1.0f, 1.0f, 0.0f, 1.0f) : float4(0.0f, 0.0f, 1.0f, 1.0f)); // Red for view 0, blue for view 1 + return result; +} diff --git a/examples/basic/shaders/multiview/multiview_screen.ps.hlsl b/examples/basic/shaders/multiview/multiview_screen.ps.hlsl new file mode 100644 index 00000000..ee87711c --- /dev/null +++ b/examples/basic/shaders/multiview/multiview_screen.ps.hlsl @@ -0,0 +1,28 @@ +struct PSInput { + float4 position : SV_POSITION; + float2 tc : TEXCOORD0; +}; +struct PSOutput { + float4 color : SV_TARGET0; +}; + +struct PushConstants { + uint frame; +}; +[[vk::push_constant]] ConstantBuffer pushConstants : register(b0); + +// binding 0, space 1 is used for samplers +[[vk::binding(0, 1)]] SamplerState sampler_point[] : register(s0, space1); +[[vk::binding(0, 3)]] Texture2DArray tex[] : register(t0, space5); + +PSOutput main(PSInput ps_in) +{ + PSOutput output; + + // transform the texture coordinates to the correct layer + float layer = ps_in.tc.x > 0.5f ? 1 : 0; + float3 uv = float3(ps_in.tc * float2(2, 1) - layer * float2(1, 0), layer); + + output.color = tex[pushConstants.frame].Sample(sampler_point[0], uv); + return output; +} diff --git a/examples/basic/shaders/multiview/multiview_screen.vs.hlsl b/examples/basic/shaders/multiview/multiview_screen.vs.hlsl new file mode 100644 index 00000000..ee33dfdc --- /dev/null +++ b/examples/basic/shaders/multiview/multiview_screen.vs.hlsl @@ -0,0 +1,13 @@ +struct PSInput { + float4 position : SV_POSITION; + float2 tc : TEXCOORD0; +}; + +PSInput main(uint VertexID : SV_VertexID) +{ // ouputs a full screen quad with tex coords + PSInput Out; + Out.tc = float2((VertexID << 1) & 2, VertexID & 2); + Out.position = float4(Out.tc * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f), 0.0f, 1.0f); + Out.tc = Out.tc; + return Out; +} diff --git a/examples/cmake/deps.cmake b/examples/cmake/deps.cmake new file mode 100644 index 00000000..f0e79cf0 --- /dev/null +++ b/examples/cmake/deps.cmake @@ -0,0 +1,59 @@ +include(FetchContent) +set(FETCHCONTENT_UPDATES_DISCONNECTED ON) +set(GET_CPM_FILE "${CMAKE_CURRENT_LIST_DIR}/get_cpm.cmake") + +if (NOT EXISTS ${GET_CPM_FILE}) + file(DOWNLOAD + https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake + "${GET_CPM_FILE}" + ) +endif() +include(${GET_CPM_FILE}) + +# SDL2 +CPMAddPackage( + NAME SDL3 + GITHUB_REPOSITORY libsdl-org/SDL + GIT_TAG preview-3.1.3 + OPTIONS + "SDL_WERROR OFF" +) + +# glm +CPMAddPackage( + NAME glm + GITHUB_REPOSITORY g-truc/glm + GIT_TAG origin/master +) + +# fpng +CPMAddPackage( + NAME fpng + GITHUB_REPOSITORY richgel999/fpng + GIT_TAG main + DOWNLOAD_ONLY +) + +if(WISDOM_WINDOWS) + find_program( + NUGET_EXE + NAMES nuget + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/NuGet) + if(NOT NUGET_EXE) + message("NUGET.EXE not found.") + message(FATAL_ERROR "Please install this executable, and run CMake again.") + endif() + + # Windows Implementation Library (WIL) + message("Loading WIL...") + load_nuget_dependency(${NUGET_EXE} "Microsoft.Windows.ImplementationLibrary" + WIL ${CMAKE_CURRENT_BINARY_DIR}) + + set(wil_SOURCES + ${WIL_DIR} + CACHE INTERNAL "") + add_library(Wil INTERFACE) + target_include_directories( + Wil SYSTEM BEFORE INTERFACE $ + $) +endif() diff --git a/examples/cmake/get_cpm.cmake b/examples/cmake/get_cpm.cmake new file mode 100644 index 00000000..baf2d8c3 --- /dev/null +++ b/examples/cmake/get_cpm.cmake @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: MIT +# +# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors + +set(CPM_DOWNLOAD_VERSION 0.40.2) +set(CPM_HASH_SUM "c8cdc32c03816538ce22781ed72964dc864b2a34a310d3b7104812a5ca2d835d") + +if(CPM_SOURCE_CACHE) + set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +elseif(DEFINED ENV{CPM_SOURCE_CACHE}) + set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +else() + set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +endif() + +# Expand relative path. This is important if the provided path contains a tilde (~) +get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE) + +file(DOWNLOAD + https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake + ${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM} +) + +include(${CPM_DOWNLOAD_LOCATION}) diff --git a/examples/common/CMakeLists.txt b/examples/common/CMakeLists.txt new file mode 100644 index 00000000..3fdff2c9 --- /dev/null +++ b/examples/common/CMakeLists.txt @@ -0,0 +1,45 @@ +project(common-${POSTFIX}) + +find_package(glm QUIET) + +set(HEADERS "wis_helper.h" "window.h" "keyboard.h" "mouse.h" "window_event.h" + "wis_swapchain.h") +set(SOURCES "wis_helper.cpp" "window.cpp" "keyboard.cpp" "mouse.cpp") + +add_library(${PROJECT_NAME} STATIC ${HEADERS} ${SOURCES}) +if(POSTFIX STREQUAL "vk") + target_compile_definitions(${PROJECT_NAME} PUBLIC WISDOM_FORCE_VULKAN=1) +endif() + +target_link_libraries( + ${PROJECT_NAME} PUBLIC wis::debug wis::wisdom wis::descriptor-buffer + wis::platform SDL3::SDL3 glm::glm) +target_include_directories(${PROJECT_NAME} PUBLIC ${fpng_SOURCE_DIR}/src) +target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) + +# copy SDL3.dll to the output directory +add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ + ${EXAMPLE_BIN_OUTPUT}/) + +if(POSTFIX STREQUAL "dx12") + add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ + ${EXAMPLE_BIN_OUTPUT}/D3D12/$ + COMMAND_EXPAND_LISTS + COMMENT "Copying DX12 Agility Core...") + + add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ + ${EXAMPLE_BIN_OUTPUT}/D3D12/$ + COMMAND_EXPAND_LISTS + COMMENT "Copying DX12 Agility SDKLayers...") +endif() diff --git a/examples/platform/hello-triangle-win32-t/src/keyboard.cpp b/examples/common/keyboard.cpp similarity index 95% rename from examples/platform/hello-triangle-win32-t/src/keyboard.cpp rename to examples/common/keyboard.cpp index 32db9c58..8ba51f90 100644 --- a/examples/platform/hello-triangle-win32-t/src/keyboard.cpp +++ b/examples/common/keyboard.cpp @@ -1,4 +1,6 @@ -#include +#include + +using namespace ex; bool Keyboard::KeyIsPressed(unsigned char keycode) const noexcept { @@ -94,7 +96,7 @@ void Keyboard::ClearState() noexcept template void Keyboard::TrimBuffer(std::queue& buffer) noexcept { - while (buffer.size() > bufferSize) { + while (buffer.size() > buffer_size) { buffer.pop(); } } diff --git a/examples/custom/lut_windowed/keyboard.h b/examples/common/keyboard.h similarity index 89% rename from examples/custom/lut_windowed/keyboard.h rename to examples/common/keyboard.h index 277f576f..bb706b71 100644 --- a/examples/custom/lut_windowed/keyboard.h +++ b/examples/common/keyboard.h @@ -3,6 +3,7 @@ #include #include +namespace ex { class Keyboard { friend class Window; @@ -25,6 +26,8 @@ class Keyboard : type(type), code(code) { } + + public: bool IsPress() const noexcept { return type == Type::Press; @@ -43,6 +46,8 @@ class Keyboard Keyboard() = default; Keyboard(const Keyboard&) = delete; Keyboard& operator=(const Keyboard&) = delete; + +public: // key event stuff bool KeyIsPressed(unsigned char keycode) const noexcept; std::optional ReadKey() noexcept; @@ -58,7 +63,7 @@ class Keyboard void DisableAutorepeat() noexcept; bool AutorepeatIsEnabled() const noexcept; -private: +public: void OnKeyPressed(unsigned char keycode) noexcept; void OnKeyReleased(unsigned char keycode) noexcept; void OnChar(char character) noexcept; @@ -67,10 +72,11 @@ class Keyboard static void TrimBuffer(std::queue& buffer) noexcept; private: - static constexpr unsigned int nKeys = 256u; - static constexpr unsigned int bufferSize = 16u; + static constexpr unsigned int n_keys = 256u; + static constexpr unsigned int buffer_size = 16u; bool autorepeatEnabled = false; - std::bitset keystates; + std::bitset keystates; std::queue keybuffer; std::queue charbuffer; }; +} // namespace ex diff --git a/examples/common/mouse.cpp b/examples/common/mouse.cpp new file mode 100644 index 00000000..0c4de2ae --- /dev/null +++ b/examples/common/mouse.cpp @@ -0,0 +1,129 @@ +#include "mouse.h" +#include + +std::optional ex::Mouse::ReadRawDelta() noexcept +{ + if (raw_delta_buffer.empty()) { + return {}; + } + const RawDelta d = raw_delta_buffer.front(); + raw_delta_buffer.pop(); + return d; +} + +std::optional ex::Mouse::Read() noexcept +{ + if (buffer.size() > 0u) { + ex::Mouse::Event e = buffer.front(); + buffer.pop(); + return e; + } + return {}; +} + +void ex::Mouse::BoundCursor(int width, int height) noexcept +{ + x = std::clamp(x, 0, width - 1); + y = std::clamp(y, 0, height - 1); +} + +void ex::Mouse::OnMouseMove(int newx, int newy) noexcept +{ + x = newx; + y = newy; + + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::Move, *this)); + TrimBuffer(); +} + +void ex::Mouse::OnMouseLeave() noexcept +{ + is_in_window = false; + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::Leave, *this)); + TrimBuffer(); +} + +void ex::Mouse::OnMouseEnter() noexcept +{ + is_in_window = true; + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::Enter, *this)); + TrimBuffer(); +} + +void ex::Mouse::OnRawDelta(int dx, int dy) noexcept +{ + raw_delta_buffer.push({ dx, dy }); + TrimBuffer(); +} + +void ex::Mouse::OnLeftPressed(int x, int y) noexcept +{ + left_is_pressed = true; + + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::LPress, *this)); + TrimBuffer(); +} + +void ex::Mouse::OnLeftReleased(int x, int y) noexcept +{ + left_is_pressed = false; + + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::LRelease, *this)); + TrimBuffer(); +} + +void ex::Mouse::OnRightPressed(int x, int y) noexcept +{ + right_is_pressed = true; + + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::RPress, *this)); + TrimBuffer(); +} + +void ex::Mouse::OnRightReleased(int x, int y) noexcept +{ + right_is_pressed = false; + + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::RRelease, *this)); + TrimBuffer(); +} + +void ex::Mouse::OnWheelUp(int x, int y) noexcept +{ + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::WheelUp, *this)); + TrimBuffer(); +} + +void ex::Mouse::OnWheelDown(int x, int y) noexcept +{ + buffer.push(ex::Mouse::Event(ex::Mouse::Event::Type::WheelDown, *this)); + TrimBuffer(); +} + +void ex::Mouse::TrimBuffer() noexcept +{ + while (buffer.size() > buffer_size) { + buffer.pop(); + } +} + +void ex::Mouse::TrimRawInputBuffer() noexcept +{ + while (raw_delta_buffer.size() > buffer_size) { + raw_delta_buffer.pop(); + } +} + +void ex::Mouse::OnWheelDelta(int x, int y, int delta) noexcept +{ + wheel_delta_carry += delta; + // generate Events for every 120 + while (wheel_delta_carry >= 120) { + wheel_delta_carry -= 120; + OnWheelUp(x, y); + } + while (wheel_delta_carry <= -120) { + wheel_delta_carry += 120; + OnWheelDown(x, y); + } +} diff --git a/examples/custom/lut_windowed/mouse.h b/examples/common/mouse.h similarity index 68% rename from examples/custom/lut_windowed/mouse.h rename to examples/common/mouse.h index 59f3f951..0be244a8 100644 --- a/examples/custom/lut_windowed/mouse.h +++ b/examples/common/mouse.h @@ -1,12 +1,10 @@ #pragma once #include #include -#include +namespace ex { class Mouse { - friend class Window; - public: struct RawDelta { int x, y; @@ -27,20 +25,22 @@ class Mouse }; private: - Type type; - bool leftIsPressed; - bool rightIsPressed; + Type _type; + bool left; + bool right; int x; int y; public: - Event(Type type, const Mouse& parent) noexcept - : type(type), leftIsPressed(parent.leftIsPressed), rightIsPressed(parent.rightIsPressed), x(parent.x), y(parent.y) + Event(Type atype, const Mouse& parent) noexcept + : _type(atype), left(parent.left_is_pressed), right(parent.right_is_pressed), x(parent.x), y(parent.y) { } + + public: Type GetType() const noexcept { - return type; + return _type; } std::pair GetPos() const noexcept { @@ -54,13 +54,13 @@ class Mouse { return y; } - bool LeftIsPressed() const noexcept + bool LeftPressed() const noexcept { - return leftIsPressed; + return left; } - bool RightIsPressed() const noexcept + bool RightPressed() const noexcept { - return rightIsPressed; + return right; } }; @@ -68,6 +68,8 @@ class Mouse Mouse() = default; Mouse(const Mouse&) = delete; Mouse& operator=(const Mouse&) = delete; + +public: std::pair GetPos() const noexcept { return { x, y }; @@ -83,15 +85,15 @@ class Mouse } bool IsInWindow() const noexcept { - return isInWindow; + return is_in_window; } bool LeftIsPressed() const noexcept { - return leftIsPressed; + return left_is_pressed; } bool RightIsPressed() const noexcept { - return rightIsPressed; + return right_is_pressed; } std::optional Read() noexcept; bool IsEmpty() const noexcept @@ -102,25 +104,22 @@ class Mouse { buffer = std::queue(); } - void BoundCursor(int width, int height) noexcept - { - x = std::clamp(x, 0, width - 1); - y = std::clamp(y, 0, height - 1); - } + void BoundCursor(int width, int height) noexcept; + void EnableRaw() noexcept { - rawEnabled = true; + raw_enabled = true; } void DisableRaw() noexcept { - rawEnabled = false; + raw_enabled = false; } bool RawEnabled() const noexcept { - return rawEnabled; + return raw_enabled; } -private: +public: void OnMouseMove(int x, int y) noexcept; void OnMouseLeave() noexcept; void OnMouseEnter() noexcept; @@ -136,14 +135,17 @@ class Mouse void OnWheelDelta(int x, int y, int delta) noexcept; private: - static constexpr unsigned int bufferSize = 16u; + static constexpr unsigned int buffer_size = 16u; + +private: int x; int y; - bool leftIsPressed = false; - bool rightIsPressed = false; - bool isInWindow = false; - int wheelDeltaCarry = 0; - bool rawEnabled = false; + bool left_is_pressed = false; + bool right_is_pressed = false; + bool is_in_window = false; + int wheel_delta_carry = 0; + bool raw_enabled = false; std::queue buffer; - std::queue rawDeltaBuffer; + std::queue raw_delta_buffer; }; +} // namespace ex diff --git a/examples/common/window.cpp b/examples/common/window.cpp new file mode 100644 index 00000000..3c92096d --- /dev/null +++ b/examples/common/window.cpp @@ -0,0 +1,117 @@ +#include "window.h" +#include + +ex::WindowEvent ex::Window::PollEvents() +{ + SDL_Event e; + while (SDL_PollEvent(&e)) { + switch (SDL_EventType(e.type)) { + case SDL_EVENT_QUIT: + return WindowEvent::Quit; + case SDL_EVENT_WINDOW_RESIZED: + return WindowEvent::Resize; + case SDL_EVENT_MOUSE_BUTTON_DOWN: + if (e.button.button == SDL_BUTTON_LEFT) { + _mouse.OnLeftPressed(e.button.x, e.button.y); + } else if (e.button.button == SDL_BUTTON_RIGHT) { + _mouse.OnRightPressed(e.button.x, e.button.y); + } else if (e.button.button == SDL_BUTTON_MIDDLE) { + _mouse.OnWheelDown(e.button.x, e.button.y); + } + continue; + case SDL_EVENT_MOUSE_BUTTON_UP: + if (e.button.button == SDL_BUTTON_LEFT) { + _mouse.OnLeftReleased(e.button.x, e.button.y); + } else if (e.button.button == SDL_BUTTON_RIGHT) { + _mouse.OnRightReleased(e.button.x, e.button.y); + } else if (e.button.button == SDL_BUTTON_MIDDLE) { + _mouse.OnWheelUp(e.button.x, e.button.y); + } + continue; + case SDL_EVENT_MOUSE_MOTION: + _mouse.OnRawDelta(e.motion.xrel, -e.motion.yrel); + continue; + case SDL_EVENT_KEY_DOWN: + _keyboard.OnKeyPressed(e.key.key); + continue; + case SDL_EVENT_KEY_UP: + _keyboard.OnKeyReleased(e.key.key); + continue; + } + } + return WindowEvent::NoEvent; +} + +wis::SwapChain ex::Window::CreateSwapchain(ex::ExampleSetup& setup, wis::DataFormat fmt, bool stereo) +{ + using enum PlatformExtension::Selector; + if (_platform.current == None) { + throw ex::Exception("Platform is not selected"); + } + + auto [width, height] = PixelSize(); + wis::SwapchainDesc desc{ + .size = { uint32_t(width), uint32_t(height) }, + .format = fmt, + .buffer_count = ex::swap_buffer_count, + .stereo = stereo, + .vsync = true, + .tearing = false, + }; + + switch (_platform.current) { +#if defined(SDL_PLATFORM_WIN32) + case Windows: { + HWND hwnd = (HWND)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); + if (hwnd) { + return Unwrap(static_cast(_platform.get()) + ->CreateSwapchain(setup.device, setup.queue, &desc, hwnd)); + } + } break; +#elif defined(SDL_PLATFORM_LINUX) + case X11: { + Display* xdisplay = (Display*)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_X11_DISPLAY_POINTER, NULL); + ::Window xwindow = (::Window)SDL_GetNumberProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_X11_WINDOW_NUMBER, 0); + if (xdisplay && xwindow) { + return Unwrap(static_cast(_platform.get()) + ->CreateSwapchain(setup.device, setup.queue, &desc, xdisplay, xwindow)); + } + } break; + case Wayland: { + struct wl_display* display = (struct wl_display*)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER, NULL); + struct wl_surface* surface = (struct wl_surface*)SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, NULL); + if (display && surface) { + return Unwrap(static_cast(_platform.get()) + ->CreateSwapchain(setup.device, setup.queue, &desc, display, surface)); + } + } break; +#endif + } + throw ex::Exception("Failed to create swapchain"); +} + +void ex::Window::PostQuit() +{ + SDL_Event event; + event.type = SDL_EVENT_QUIT; + SDL_PushEvent(&event); +} + +ex::PlatformExtension::PlatformExtension() +{ + current = Selector::None; + platform = {}; + const char* platform_name = SDL_GetCurrentVideoDriver(); +#if defined(SDL_PLATFORM_WIN32) + platform = std::make_unique(); + current = Selector::Windows; +#elif defined(SDL_PLATFORM_LINUX) + // if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "x11") == 0) { + platform = std::make_unique(); + current = Selector::X11; + //} else if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "wayland") == 0) { + // platform = std::make_unique(); + // current = Selector::Wayland; + //} +#endif +} diff --git a/examples/common/window.h b/examples/common/window.h new file mode 100644 index 00000000..f86bd13e --- /dev/null +++ b/examples/common/window.h @@ -0,0 +1,94 @@ +#pragma once +#include +#include "mouse.h" +#include "keyboard.h" +#include "window_event.h" +#include "wis_helper.h" + +namespace ex { +class Instance +{ +public: + Instance() + { + SDL_Init(SDL_INIT_VIDEO); + } + ~Instance() + { + SDL_Quit(); + } +}; + +class PlatformExtension +{ +public: + enum class Selector { + None, + Windows, + X11, + Wayland + }; + +public: + PlatformExtension(); + +public: + wis::FactoryExtension* get() noexcept + { + return platform.get(); + } + +public: + Selector current = Selector::None; + std::unique_ptr platform; +}; + +class Window +{ +public: + Window(const char* title, int width, int height) + { + window = SDL_CreateWindow(title, width, height, SDL_WINDOW_RESIZABLE); + } + ~Window() + { + SDL_DestroyWindow(window); + } + SDL_Window* GetWindow() const + { + return window; + } + +public: + wis::FactoryExtension* GetPlatformExtension() + { + return _platform.get(); + } + wis::SwapChain CreateSwapchain(ex::ExampleSetup& setup, wis::DataFormat fmt = ex::swapchain_format, bool stereo = false); + + void PostQuit(); + ex::WindowEvent PollEvents(); + std::pair PixelSize() const noexcept + { + int w = 0, h = 0; + SDL_GetWindowSizeInPixels(window, &w, &h); + return { w, h }; + } + +public: + Mouse& GetMouse() + { + return _mouse; + } + Keyboard& GetKeyboard() + { + return _keyboard; + } + +private: + SDL_Window* window; + Mouse _mouse; + Keyboard _keyboard; + ex::PlatformExtension _platform; +}; +} // namespace ex diff --git a/examples/common/window_event.h b/examples/common/window_event.h new file mode 100644 index 00000000..81ff1e15 --- /dev/null +++ b/examples/common/window_event.h @@ -0,0 +1,10 @@ +#pragma once + +namespace ex { +enum class WindowEvent { + NoEvent = 0, + Quit, + Resize, + Count +}; +} diff --git a/examples/common/wis_helper.cpp b/examples/common/wis_helper.cpp new file mode 100644 index 00000000..ef952dc2 --- /dev/null +++ b/examples/common/wis_helper.cpp @@ -0,0 +1,82 @@ +#include "wis_helper.h" +#include +#include + +#include + +void ex::ExampleSetup::DebugCallback(wis::Severity severity, const char* message, void* user_data) +{ + auto stream = reinterpret_cast(user_data); + *stream << message << "\n"; +} + +wis::Factory ex::ExampleSetup::InitDefaultFactory(wis::FactoryExtension* platform_ext) +{ + using namespace wis; + wis::DebugExtension debug_ext; // no need to store it, it will be destroyed when it goes out of scope + + wis::FactoryExtension* xfactory_exts[] = { &debug_ext, platform_ext }; + wis::Factory factory = Unwrap(wis::CreateFactory(true, xfactory_exts, std::size(xfactory_exts))); + info = Unwrap(debug_ext.CreateDebugMessenger(&DebugCallback, &std::cout)); + return std::move(factory); +} + +void ex::ExampleSetup::InitDefaultDevice(const wis::Factory& factory, std::span device_exts) +{ + for (size_t i = 0;; i++) { + auto [res, adapter] = factory.GetAdapter(i); + if (res.status != wis::Status::Ok) + break; + + wis::AdapterDesc desc; + res = adapter.GetDesc(&desc); + std::cout << "Adapter: " << desc.description.data() << "\n"; + + auto [res2, hdevice] = wis::CreateDevice(std::move(adapter), device_exts.data(), device_exts.size()); + if (res2.status == wis::Status::Ok) { + device = std::move(hdevice); + return; + } + } + throw Exception("No suitable adapter found"); +} + +void ex::ExampleSetup::InitDefaultQueue() +{ + queue = Unwrap(device.CreateCommandQueue(wis::QueueType::Graphics)); + fence = Unwrap(device.CreateFence(0)); + allocator = Unwrap(device.CreateAllocator()); +} + +void ex::ExampleSetup::InitDefault(wis::FactoryExtension* platform_ext, std::span device_exts) +{ + wis::Factory factory = InitDefaultFactory(platform_ext); + InitDefaultDevice(factory, device_exts); + InitDefaultQueue(); +} + +void ex::ExampleSetup::WaitForGPU() +{ + CheckResult(queue.SignalQueue(fence, ++fence_value)); + CheckResult(fence.Wait(fence_value)); +} + +std::string ex::LoadShader(std::filesystem::path p) +{ + if constexpr (wis::shader_intermediate == wis::ShaderIntermediate::DXIL) + p += u".cso"; + else + p += u".spv"; + + if (!std::filesystem::exists(p)) + throw Exception(wis::format("Shader file not found: {}", p.string())); + + std::ifstream t{ p, std::ios::binary }; + t.seekg(0, std::ios::end); + size_t size = t.tellg(); + std::string ret; + ret.resize(size); + t.seekg(0); + t.read(ret.data(), size); + return ret; +} diff --git a/examples/common/wis_helper.h b/examples/common/wis_helper.h new file mode 100644 index 00000000..f78dae82 --- /dev/null +++ b/examples/common/wis_helper.h @@ -0,0 +1,164 @@ +#pragma once +#include +#include +#include +#include +#include +#include + +namespace ex { +struct Exception : public std::exception { + Exception(std::string message) + : message(std::move(message)) + { + } + + const char* what() const noexcept override + { + return message.c_str(); + } + + std::string message; +}; + +inline void CheckResult(wis::Result res) +{ + if (res.status != wis::Status::Ok) + throw Exception(res.error); +} +template +inline T Unwrap(wis::ResultValue&& res) +{ + auto&& [status, value] = res; + CheckResult(status); + return std::move(value); +} + +// static helpers +std::string LoadShader(std::filesystem::path p); + +// constants +static inline constexpr uint32_t swap_buffer_count = 2; +static inline constexpr uint32_t flight_frames = 2; +static inline constexpr wis::DataFormat swapchain_format = wis::DataFormat::RGBA8Unorm; // supported by all APIs + +// setup helpers +struct FramedCommandList { + FramedCommandList() = default; + FramedCommandList(wis::Device& device, wis::QueueType type = wis::QueueType::Graphics) + { + for (size_t i = 0; i < flight_frames; i++) { + cmd_list[i] = Unwrap(device.CreateCommandList(type)); + } + } + +public: + wis::CommandList& operator[](size_t i) + { + return cmd_list[i]; + } + + wis::CommandList cmd_list[flight_frames]; +}; + +struct DescTable { + uint32_t descriptor_count = 0; +}; + +// Not very efficient, but good for examples. Doesn't have static tables (frame independent) +struct FramedDescriptorSetup { + + FramedDescriptorSetup() = default; + FramedDescriptorSetup(wis::DescriptorBufferExtension& device, wis::DescriptorHeapType desc_type, std::span tables) + { + auto desc_alignment = device.GetDescriptorTableAlignment(desc_type); + auto desc_increment = device.GetDescriptorSize(desc_type); + + // Create equal tables for each frame + size_t bytes = 0; + for (auto& table : tables) { + bytes += wis::detail::aligned_size(table.descriptor_count * desc_increment, desc_alignment); + } + desc_buffer = Unwrap(device.CreateDescriptorBuffer(desc_type, wis::DescriptorMemory::ShaderVisible, bytes * flight_frames)); + + // calculate offsets + for (size_t i = 0; i < flight_frames; i++) { + offsets[i] = i * bytes; + } + } + +public: + uint32_t offset_frame(uint32_t frame) const + { + return offsets[frame]; + } + +public: + wis::DescriptorBuffer desc_buffer; // rebinding the descriptor buffer is very expensive, so we keep single buffer for all frames + std::array offsets; +}; + +struct ExampleSetup { + static void DebugCallback(wis::Severity severity, const char* message, void* user_data); + +public: + ExampleSetup() = default; + +public: + wis::Factory InitDefaultFactory(wis::FactoryExtension* platform_ext); + void InitDefaultDevice(const wis::Factory& factory, std::span device_exts); + + void InitDefaultQueue(); + void InitDefault(wis::FactoryExtension* platform_ext, std::span device_exts = {}); + void WaitForGPU(); + + FramedCommandList CreateLists(wis::QueueType type = wis::QueueType::Graphics) + { + return FramedCommandList(device, type); + } + + // Not very efficient, but good for examples + template + wis::Buffer CreateAndUploadBuffer(std::span data, wis::BufferUsage usage) + { + using namespace wis; + auto upload = Unwrap(allocator.CreateUploadBuffer(data.size_bytes())); + auto buffer = Unwrap(allocator.CreateBuffer(data.size_bytes(), usage | wis::BufferUsage::CopyDst)); + + auto memory = (uint8_t*)upload.MapRaw(); + std::copy_n(reinterpret_cast(data.data()), data.size_bytes(), memory); + upload.Unmap(); + + // create command list + auto cmd = Unwrap(device.CreateCommandList(wis::QueueType::Graphics)); + ex::CheckResult(cmd.Reset()); + cmd.BufferBarrier({ .sync_before = wis::BarrierSync::None, + .sync_after = wis::BarrierSync::Copy, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::CopySource }, + upload); + cmd.BufferBarrier({ .sync_before = wis::BarrierSync::None, + .sync_after = wis::BarrierSync::Copy, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::CopyDest }, + buffer); + cmd.CopyBuffer(upload, buffer, { .size_bytes = data.size_bytes() }); + cmd.Close(); + + wis::CommandListView lists[] = { cmd }; + queue.ExecuteCommandLists(lists, std::size(lists)); + WaitForGPU(); + + return std::move(buffer); + } + +public: + wis::DebugMessenger info; + wis::Device device; + wis::CommandQueue queue; + wis::ResourceAllocator allocator; + wis::Fence fence; + uint64_t fence_value = 0; +}; + +} // namespace ex diff --git a/examples/common/wis_swapchain.h b/examples/common/wis_swapchain.h new file mode 100644 index 00000000..4ec0805f --- /dev/null +++ b/examples/common/wis_swapchain.h @@ -0,0 +1,111 @@ +#pragma once +#include "wis_helper.h" + +namespace ex { +class Swapchain +{ +public: + Swapchain() = default; + Swapchain(wis::Device& device, wis::SwapChain xswap, uint32_t width, uint32_t height, wis::DataFormat format = ex::swapchain_format, bool stereo = false) + : swap(std::move(xswap)), width(width), height(height), stereo(stereo), format(format) + { + fence = Unwrap(device.CreateFence(0)); + textures = swap.GetBufferSpan(); + + wis::RenderTargetDesc rt_desc{ + .format = format, + .layout = stereo ? wis::TextureLayout::Texture2DArray : wis::TextureLayout::Texture2D, + .layer_count = stereo ? 2u : 1u, // stereo uses multiview extension + }; + for (size_t i = 0; i < render_targets.size(); i++) { + render_targets[i] = Unwrap(device.CreateRenderTarget(textures[i], rt_desc)); + } + } + ~Swapchain() + { + if (swap) + Throttle(); + } + +public: + void Throttle() noexcept + { + CheckResult(fence.Wait(fence_values[frame_index] - 1)); + } + bool Present(wis::CommandQueue& main_queue) + { + auto res = swap.Present(); + if (res.status != wis::Status::Ok) { + return false; + } + + CheckResult(main_queue.SignalQueue(fence, fence_value)); + + frame_index = swap.GetCurrentIndex() % ex::flight_frames; + CheckResult(fence.Wait(fence_values[frame_index])); + + fence_values[frame_index] = ++fence_value; + return true; + } + void Resize(wis::Device& device, uint32_t width, uint32_t height) + { + this->width = width; + this->height = height; + CheckResult(swap.Resize(width, height)); + textures = swap.GetBufferSpan(); + + wis::RenderTargetDesc rt_desc{ + .format = format, + .layout = stereo ? wis::TextureLayout::Texture2DArray : wis::TextureLayout::Texture2D, + .layer_count = stereo ? 2u : 1u, // stereo uses multiview extension + }; + for (size_t i = 0; i < render_targets.size(); i++) { + render_targets[i] = Unwrap(device.CreateRenderTarget(textures[i], rt_desc)); + } + } + uint32_t CurrentFrame() const + { + return swap.GetCurrentIndex(); + } + const wis::SwapChain& GetSwapChain() const + { + return swap; + } + uint32_t GetWidth() const + { + return width; + } + uint32_t GetHeight() const + { + return height; + } + + std::span GetTextures() const + { + return textures; + } + const wis::Texture& GetTexture(size_t i) const + { + return textures[i]; + } + const wis::RenderTarget& GetRenderTarget(size_t i) const + { + return render_targets[i]; + } + +private: + wis::SwapChain swap; + wis::Fence fence; + uint64_t fence_value = 1; + uint64_t frame_index = 0; + std::array fence_values{ 1, 0 }; + + std::span textures; + std::array render_targets; + + wis::DataFormat format; + uint32_t width; + uint32_t height; + bool stereo; +}; +} // namespace ex diff --git a/examples/custom/CMakeLists.txt b/examples/custom/CMakeLists.txt index 3a83e693..4d87334a 100644 --- a/examples/custom/CMakeLists.txt +++ b/examples/custom/CMakeLists.txt @@ -1,8 +1,5 @@ -add_subdirectory(lut) -add_subdirectory(bindings) - if(WISDOM_WINDOWS AND NOT WISDOM_WINDOWS_STORE) - add_subdirectory(lut_windowed) + add_subdirectory(bindings) if(WISDOM_VULKAN) add_subdirectory(cross_device) diff --git a/examples/custom/bindings/entry_main.c b/examples/custom/bindings/entry_main.c index 462af77f..97aa6d28 100644 --- a/examples/custom/bindings/entry_main.c +++ b/examples/custom/bindings/entry_main.c @@ -46,6 +46,7 @@ bool CreateApp(struct AppData* uninit_app) } WisFactoryDestroy(factory); // No longer needed + return 0; } void DestroyApp(struct AppData* app) { diff --git a/examples/custom/cross_device/CMakeLists.txt b/examples/custom/cross_device/CMakeLists.txt index f898eda3..7d2ac20f 100644 --- a/examples/custom/cross_device/CMakeLists.txt +++ b/examples/custom/cross_device/CMakeLists.txt @@ -26,8 +26,10 @@ add_executable( wis_install_deps(${PROJECT_NAME}) target_link_libraries( - ${PROJECT_NAME} PRIVATE wis::debug-headers wis::platform-headers - wis::extended-allocation-headers glm::glm Wil) + ${PROJECT_NAME} + PRIVATE wis::debug-headers wis::platform-headers + wis::descriptor-buffer-headers wis::extended-allocation-headers + glm::glm Wil) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23) target_include_directories(${PROJECT_NAME} PRIVATE ${fpng_SOURCE_DIR}/src) target_compile_definitions(${PROJECT_NAME} PRIVATE WISDOM_FORCE_VULKAN) diff --git a/examples/custom/cross_device/transfer_node.h b/examples/custom/cross_device/transfer_node.h index 1f2111ec..f3bc0be1 100644 --- a/examples/custom/cross_device/transfer_node.h +++ b/examples/custom/cross_device/transfer_node.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include #include #include diff --git a/examples/custom/cross_device/work_node.cpp b/examples/custom/cross_device/work_node.cpp index 5c93b19e..cfddfc46 100644 --- a/examples/custom/cross_device/work_node.cpp +++ b/examples/custom/cross_device/work_node.cpp @@ -66,6 +66,7 @@ CreateWorkNode(wis::Adapter&& adapter) wis::DeviceExtension* extensions[] = { &node.extended_alloc, &node.ext_mem_host, + &node.desc_buffer_ext }; // Create Device @@ -224,13 +225,13 @@ CreateWorkNode(wis::Adapter&& adapter) using namespace wis; wis::DescriptorTableEntry entries[] = { { - .type = wis::DescriptorType::ShaderResource, + .type = wis::DescriptorType::Texture, .bind_register = 0, .binding = 0, .count = 1, }, { - .type = wis::DescriptorType::ShaderResource, + .type = wis::DescriptorType::Texture, .bind_register = 1, .binding = 1, .count = 1, @@ -258,7 +259,7 @@ CreateWorkNode(wis::Adapter&& adapter) }, }; - auto [result, root] = node.work_device.CreateRootSignature(nullptr, 0, tables, sizeof(tables) / sizeof(tables[0])); + auto [result, root] = node.desc_buffer_ext.CreateRootSignature(nullptr, 0, nullptr, 0, tables, sizeof(tables) / sizeof(tables[0])); if (result.status != wis::Status::Ok) return std::unexpected(result.error); node.root = std::move(root); @@ -266,15 +267,14 @@ CreateWorkNode(wis::Adapter&& adapter) // Create Pipeline { - wis::DataFormat attachment_formats[] = { wis::DataFormat::RGBA8Unorm }; - wis::GraphicsPipelineDesc desc{ .root_signature = node.root, .shaders = { .vertex = node.vertex_shader, .pixel = node.pixel_shader }, .attachments = { - .attachment_formats = attachment_formats, + .attachment_formats = { wis::DataFormat::RGBA8Unorm }, .attachments_count = 1, - } + }, + .flags = wis::PipelineFlags::DescriptorBuffer, }; auto [res2, hpipeline] = node.work_device.CreateGraphicsPipeline(&desc); if (res2.status != wis::Status::Ok) @@ -300,19 +300,19 @@ CreateWorkNode(wis::Adapter&& adapter) // Create Descriptor Buffers { - auto desc_increment = node.work_device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Descriptor); - auto [res, hdesc] = node.work_device.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, 2 * desc_increment); + auto desc_increment = node.desc_buffer_ext.GetDescriptorSize(wis::DescriptorHeapType::Descriptor); + auto [res, hdesc] = node.desc_buffer_ext.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, 2 * desc_increment); if (res.status != wis::Status::Ok) return std::unexpected(res.error); - auto sampler_increment = node.work_device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Sampler); - auto [res2, hdesc2] = node.work_device.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, 1 * sampler_increment); + auto sampler_increment = node.desc_buffer_ext.GetDescriptorSize(wis::DescriptorHeapType::Sampler); + auto [res2, hdesc2] = node.desc_buffer_ext.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, 1 * sampler_increment); if (res2.status != wis::Status::Ok) return std::unexpected(res2.error); // Set Descriptor Buffers - hdesc.WriteShaderResource2(0, 1, node.srv); - hdesc.WriteShaderResource2(0, 0, node.srv_lut); + hdesc.WriteShaderResource(0, 1, node.srv); + hdesc.WriteShaderResource(0, 0, node.srv_lut); hdesc2.WriteSampler(0, 0, node.sampler); @@ -439,10 +439,9 @@ void WorkNode::Frame() cmd_list.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); cmd_list.SetRootSignature(root); - wis::DescriptorBufferView desc_buffers[] = { desc_buffer, sampler_buffer }; - cmd_list.SetDescriptorBuffers(desc_buffers, std::size(desc_buffers)); - cmd_list.SetDescriptorTableOffset(0, desc_buffer, 0); - cmd_list.SetDescriptorTableOffset(1, sampler_buffer, 0); + desc_buffer_ext.SetDescriptorBuffers(cmd_list, desc_buffer, sampler_buffer); + desc_buffer_ext.SetDescriptorTableOffset(cmd_list, root, 0, desc_buffer, 0); + desc_buffer_ext.SetDescriptorTableOffset(cmd_list, root, 1, sampler_buffer, 0); cmd_list.RSSetViewport({ 0, 0, float(width), float(height), 0, 1 }); cmd_list.RSSetScissor({ 0, 0, int(width), int(height) }); diff --git a/examples/custom/cross_device/work_node.h b/examples/custom/cross_device/work_node.h index 2f87a850..0ec203aa 100644 --- a/examples/custom/cross_device/work_node.h +++ b/examples/custom/cross_device/work_node.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include struct ExternalBuffer { @@ -175,6 +176,7 @@ struct WorkNode { ExtMemoryHost ext_mem_host; ExternalBuffer ext_buffer; wis::ExtendedAllocation extended_alloc; + wis::DescriptorBufferExtension desc_buffer_ext; wis::ResourceAllocator allocator; wis::Texture lut; diff --git a/examples/custom/lut/CMakeLists.txt b/examples/custom/lut/CMakeLists.txt deleted file mode 100644 index 656c9f9d..00000000 --- a/examples/custom/lut/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -project(LutBenchmark) - -find_package(glm QUIET) - -add_executable(${PROJECT_NAME} entry_main.cpp app.h app.cpp lut_loader.h - lut_loader.cpp) - -wis_install_deps(${PROJECT_NAME}) - -target_link_libraries(${PROJECT_NAME} PRIVATE wis::debug glm::glm) -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) -target_include_directories(${PROJECT_NAME} PRIVATE ${fpng_SOURCE_DIR}/src) - -wis_compile_shader(TARGET ${PROJECT_NAME} SHADER - ${CMAKE_CURRENT_SOURCE_DIR}/lut.vs.hlsl) -wis_compile_shader(TARGET ${PROJECT_NAME} SHADER - ${CMAKE_CURRENT_SOURCE_DIR}/lut.ps.hlsl) -wis_compile_shader( - TARGET - ${PROJECT_NAME} - SHADER - ${CMAKE_CURRENT_SOURCE_DIR}/lut.ps.hlsl - DEFINITIONS - "TETRA" - OUTPUT - ${CMAKE_CURRENT_BINARY_DIR}/lut_tetra.ps) - -add_custom_command( - TARGET ${PROJECT_NAME} - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/lut.cube - $/lut.cube) -add_custom_command( - TARGET ${PROJECT_NAME} - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/image.png - $/image.png) diff --git a/examples/custom/lut/app.cpp b/examples/custom/lut/app.cpp deleted file mode 100644 index a1e601ec..00000000 --- a/examples/custom/lut/app.cpp +++ /dev/null @@ -1,585 +0,0 @@ -#include "app.h" -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "lut_loader.h" - -#define STB_IMAGE_IMPLEMENTATION -#define STB_IMAGE_WRITE_IMPLEMENTATION -#include -#include - -struct ImageData { - std::vector data; - uint32_t width; - uint32_t height; - uint32_t channels; -}; - -ImageData LoadPNGImage(std::filesystem::path path) -{ - ImageData data; - auto path_str = path.string(); - auto* idata = stbi_load(path_str.c_str(), (int*)&data.width, (int*)&data.height, (int*)&data.channels, 4); - - std::copy(idata, idata + data.width * data.height * 4, std::back_inserter(data.data)); - stbi_image_free(idata); - - return data; -} - -struct LogProvider : public wis::LogLayer { - virtual void Log(wis::Severity sev, std::string message, wis::source_location sl = wis::source_location::current()) override - { - std::cout << wis::format("[{}]: {}\n", wis::severity_strings[+sev], message); - }; -}; - -void DebugCallback(wis::Severity severity, const char* message, void* user_data) -{ - auto stream = reinterpret_cast(user_data); - *stream << message << "\n"; -} - -App::App(uint32_t width, uint32_t height) - : width(width), height(height) -{ - // wis::LibLogger::SetLogLayer(std::make_shared()); - - auto [result, factory] = wis::CreateFactory(false); - - // auto [resx, hinfo] = factory.CreateDebugMessenger(DebugCallback, &std::cout); - // info = std::move(hinfo); - - for (uint32_t i = 0;; i++) { - auto [res, adapter] = factory.GetAdapter(i); - if (res.status == wis::Status::Ok) { - wis::AdapterDesc desc; - res = adapter.GetDesc(&desc); - std::cout << "Adapter: " << desc.description.data() << "\n"; - - auto [res, hdevice] = wis::CreateDevice(std::move(adapter)); - if (res.status == wis::Status::Ok) { - device = std::move(hdevice); - break; - }; - - } else { - break; - } - } - - auto [res2, hqueue] = device.CreateCommandQueue(wis::QueueType::Graphics); - queue = std::move(hqueue); - - { - auto [res, alloc] = device.CreateAllocator(); - allocator = std::move(alloc); - } - - { - using namespace wis; - wis::TextureDesc desc{ - .format = wis::DataFormat::RGBA8Unorm, - .size = { width, height, 1 }, - .mip_levels = 1, - .usage = wis::TextureUsage::RenderTarget | wis::TextureUsage::CopySrc - }; - auto [res, htexture] = allocator.CreateTexture(desc); - out_texture = std::move(htexture); - - wis::RenderTargetDesc rt_desc{ - .format = wis::DataFormat::RGBA8Unorm, - .layout = wis::TextureLayout::Texture2D, - .mip = 0, - .base_array_layer = 0, - .layer_count = 1, - }; - auto [res2, hrt] = device.CreateRenderTarget(out_texture, rt_desc); - render_target = std::move(hrt); - } - - auto [res4, hfence] = device.CreateFence(); - fence = std::move(hfence); - - auto [res5, hcmd_list] = device.CreateCommandList(wis::QueueType::Graphics); - cmd_list = std::move(hcmd_list); - - CreateResources(); -} - -int App::Start() -{ - std::chrono::high_resolution_clock clock; - auto start = clock.now(); - - // Point filter - for (size_t i = 0; i < 1000; i++) { - Frame(); - } - - auto end = clock.now(); - std::cout << "Time: " << std::chrono::duration_cast(end - start).count() << "ms\n"; - - DumpFrame("out_point.png"); - - // Linear filter - pipeline_c = &pipeline2; - start = clock.now(); - for (size_t i = 0; i < 1000; i++) { - Frame(); - } - end = clock.now(); - - std::cout << "Time: " << std::chrono::duration_cast(end - start).count() << "ms\n"; - - DumpFrame("out_linear.png"); - - // Tetra + Point filter - pipeline_c = &pipeline2; - sampler_buffer.WriteSampler(0, 0, sampler); - - start = clock.now(); - for (size_t i = 0; i < 1000; i++) { - Frame(); - } - end = clock.now(); - - std::cout << "Time: " << std::chrono::duration_cast(end - start).count() << "ms\n"; - - DumpFrame("out_tetra.png"); - - return 0; -} - -std::string LoadShader(std::filesystem::path p) -{ - if constexpr (wis::shader_intermediate == wis::ShaderIntermediate::DXIL) - p += u".cso"; - else - p += u".spv"; - - std::ifstream t{ p, std::ios::binary }; - t.seekg(0, std::ios::end); - size_t size = t.tellg(); - std::string ret; - ret.resize(size); - t.seekg(0); - t.read(ret.data(), size); - return ret; -} - -void App::CreateResources() -{ - // Create descriptor buffer - { - auto desc_increment = device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Descriptor); - auto [res, hdesc] = device.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, 2 * desc_increment); - desc_buffer = std::move(hdesc); - - auto sampler_increment = device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Sampler); - auto [res2, hdesc2] = device.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, 2 * sampler_increment); - sampler_buffer = std::move(hdesc2); - } - - // Upload lut data to a buffer - { - auto png_data = LoadPNGImage("image.png"); - auto [res, img_data_buffer] = allocator.CreateUploadBuffer(png_data.data.size()); - std::copy(png_data.data.begin(), png_data.data.end(), img_data_buffer.Map()); - img_data_buffer.Unmap(); - - // Create Texture - { - using namespace wis; - wis::TextureDesc desc{ - .format = wis::DataFormat::RGBA8Unorm, - .size = { png_data.width, png_data.height, 1 }, - .mip_levels = 1, - .usage = wis::TextureUsage::CopyDst | wis::TextureUsage::ShaderResource - }; - auto [res, htexture] = allocator.CreateTexture(desc); - texture = std::move(htexture); - } - - auto lut_data = LutLoader::LoadLut("lut.cube"); - auto [res2, lut_data_buffer] = allocator.CreateUploadBuffer(lut_data.stride * lut_data.stride * lut_data.stride * 4 * sizeof(float)); - std::copy(lut_data.data.get(), lut_data.data.get() + lut_data.stride * lut_data.stride * lut_data.stride * 4, lut_data_buffer.Map()); - lut_data_buffer.Unmap(); - - { - wis::DescriptorTableEntry entries[] = { - { - .type = wis::DescriptorType::ShaderResource, - .bind_register = 0, - .binding = 0, - .count = 1, - }, - { - .type = wis::DescriptorType::ShaderResource, - .bind_register = 1, - .binding = 1, - .count = 1, - }, - { - .type = wis::DescriptorType::Sampler, - .bind_register = 0, - .binding = 0, - .count = 1, - }, - { - .type = wis::DescriptorType::Sampler, - .bind_register = 1, - .binding = 1, - .count = 1, - }, - }; - - wis::DescriptorTable tables[] = { - { - .type = wis::DescriptorHeapType::Descriptor, - .entries = entries, - .entry_count = 2, - .stage = wis::ShaderStages::Pixel, - }, - { - .type = wis::DescriptorHeapType::Sampler, - .entries = entries + 2, - .entry_count = 2, - .stage = wis::ShaderStages::Pixel, - }, - - }; - auto [result, hroot] = device.CreateRootSignature(nullptr, 0, tables, sizeof(tables) / sizeof(tables[0])); - root = std::move(hroot); - } - - // Create Texture - { - using namespace wis; - wis::TextureDesc desc{ - .format = wis::DataFormat::RGBA32Float, - .size = { uint32_t(lut_data.stride), (uint32_t)lut_data.stride, (uint32_t)lut_data.stride }, - .mip_levels = 1, - .layout = wis::TextureLayout::Texture3D, - .usage = wis::TextureUsage::CopyDst | wis::TextureUsage::ShaderResource - }; - auto [res, htexture] = allocator.CreateTexture(desc); - lut = std::move(htexture); - } - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::NoAccess, - .access_after = wis::ResourceAccess::CopyDest, - .state_before = wis::TextureState::Undefined, - .state_after = wis::TextureState::CopyDest, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - lut); - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::NoAccess, - .access_after = wis::ResourceAccess::CopyDest, - .state_before = wis::TextureState::Undefined, - .state_after = wis::TextureState::CopyDest, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - texture); - - wis::BufferTextureCopyRegion region{ - .texture = { - .size = { (uint32_t)lut_data.stride, (uint32_t)lut_data.stride, (uint32_t)lut_data.stride }, - .format = wis::DataFormat::RGBA32Float, - } - }; - cmd_list.CopyBufferToTexture(lut_data_buffer, lut, ®ion, 1); - - wis::BufferTextureCopyRegion region2{ - .texture = { - .size = { png_data.width, png_data.height, 1 }, - .format = wis::DataFormat::RGBA8Unorm, - } - }; - cmd_list.CopyBufferToTexture(img_data_buffer, texture, ®ion2, 1); - - cmd_list.TextureBarrier( - { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::CopyDest, - .access_after = wis::ResourceAccess::ShaderResource, - .state_before = wis::TextureState::CopyDest, - .state_after = wis::TextureState::ShaderResource, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - texture); - cmd_list.TextureBarrier( - { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::CopyDest, - .access_after = wis::ResourceAccess::ShaderResource, - .state_before = wis::TextureState::CopyDest, - .state_after = wis::TextureState::ShaderResource, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - lut); - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::NoAccess, - .access_after = wis::ResourceAccess::RenderTarget, - .state_before = wis::TextureState::Undefined, - .state_after = wis::TextureState::RenderTarget, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - out_texture); - cmd_list.Close(); - - wis::CommandListView cmd_lists[] = { cmd_list }; - queue.ExecuteCommandLists(cmd_lists, 1); - - WaitForGPU(); - - auto [resz2, hsrv] = device.CreateShaderResource(texture, { .format = wis::DataFormat::RGBA8Unorm, .view_type = wis::TextureViewType::Texture2D, .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - } }); - auto [res2z3, hsrv2] = device.CreateShaderResource(lut, { .format = wis::DataFormat::RGBA32Float, .view_type = wis::TextureViewType::Texture3D, .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - } }); - srv_lut = std::move(hsrv2); - srv = std::move(hsrv); - auto offset = desc_buffer.WriteShaderResource(0, 0, 0, 0, root, srv_lut); - desc_buffer.WriteShaderResource(offset, 0, 1, 0, root, srv); - } - - { - auto s1 = LoadShader("lut.vs"); - auto s2 = LoadShader("lut.ps"); - auto s3 = LoadShader("lut_tetra.ps"); - auto [result, vs] = device.CreateShader(s1.data(), uint32_t(s1.size())); - auto [result2, ps] = device.CreateShader(s2.data(), uint32_t(s2.size())); - auto [result3, ps2] = device.CreateShader(s3.data(), uint32_t(s3.size())); - - vertex_shader = std::move(vs); - pixel_shader = std::move(ps); - pixel_shader_tetra = std::move(ps2); - } - - { - wis::DataFormat attachment_formats[] = { wis::DataFormat::RGBA8Unorm }; - - wis::GraphicsPipelineDesc desc{ - .root_signature = root, - .shaders = { .vertex = vertex_shader, .pixel = pixel_shader }, - .attachments = { - .attachment_formats = attachment_formats, - .attachments_count = 1, - } - }; - auto [res2, hpipeline] = device.CreateGraphicsPipeline(&desc); - pipeline = std::move(hpipeline); - - desc.shaders.pixel = pixel_shader_tetra; - auto [res3, hpipeline2] = device.CreateGraphicsPipeline(&desc); - pipeline2 = std::move(hpipeline2); - } - - // Create Sampler - { - wis::SamplerDesc sample_desc{ - .min_filter = wis::Filter::Point, - .mag_filter = wis::Filter::Point, - .mip_filter = wis::Filter::Point, - .anisotropic = false, - .max_anisotropy = 16, - .address_u = wis::AddressMode::ClampToEdge, - .address_v = wis::AddressMode::ClampToEdge, - .address_w = wis::AddressMode::ClampToEdge, - .min_lod = 0, - .max_lod = 1.0f, - .mip_lod_bias = 0.0f, - .comparison_op = wis::Compare::None, - }; - auto [res, hsampler] = device.CreateSampler(&sample_desc); - sampler = std::move(hsampler); - - wis::SamplerDesc sample_desc2{ - .min_filter = wis::Filter::Linear, - .mag_filter = wis::Filter::Linear, - .mip_filter = wis::Filter::Linear, - .anisotropic = false, - .max_anisotropy = 16, - .address_u = wis::AddressMode::ClampToEdge, - .address_v = wis::AddressMode::ClampToEdge, - .address_w = wis::AddressMode::ClampToEdge, - .min_lod = 0, - .max_lod = 1.0f, - .mip_lod_bias = 0.0f, - .comparison_op = wis::Compare::None, - }; - auto [res2, hsampler2] = device.CreateSampler(&sample_desc2); - sampler_lut_linear = std::move(hsampler2); - - sampler_buffer.WriteSampler(0, 0, sampler); - sampler_buffer.WriteSampler(0, 1, sampler); - } - pipeline_c = &pipeline; - - WaitForGPU(); -} - -void App::Frame() -{ - auto res = cmd_list.Reset(*pipeline_c); - - wis::RenderPassRenderTargetDesc targets{ - .target = render_target, - .load_op = wis::LoadOperation::Clear, - .store_op = wis::StoreOperation::Store, - .clear_value = { 0.0f, 0.2f, 0.4f, 1.0f }, - }; - wis::RenderPassDesc rp{ - .flags = wis::RenderPassFlags::None, - .target_count = 1, - .targets = &targets, - }; - - cmd_list.BeginRenderPass(&rp); - cmd_list.SetRootSignature(root); - - wis::DescriptorBufferView desc_buffers[] = { desc_buffer, sampler_buffer }; - - cmd_list.SetDescriptorBuffers(desc_buffers, 2); - cmd_list.SetDescriptorTableOffset(0, desc_buffer, 0); - cmd_list.SetDescriptorTableOffset(1, sampler_buffer, 0); - - cmd_list.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); - - cmd_list.RSSetViewport({ 0, 0, float(width), float(height), 0, 1 }); - cmd_list.RSSetScissor({ 0, 0, int(width), int(height) }); - - cmd_list.DrawInstanced(3); - cmd_list.EndRenderPass(); - cmd_list.Close(); - - wis::CommandListView lists[] = { cmd_list }; - queue.ExecuteCommandLists(lists, 1); - - WaitForGPU(); -} - -void App::DumpFrame(const char* name) -{ - auto [res, data] = allocator.CreateReadbackBuffer(width * height * 4); - - std::ignore = cmd_list.Reset(); - - wis::TextureBarrier2 barriers[] = { - { { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::RenderTarget, - .access_after = wis::ResourceAccess::CopySource, - .state_before = wis::TextureState::RenderTarget, - .state_after = wis::TextureState::CopySource, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - out_texture }, - { { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::CopySource, - .access_after = wis::ResourceAccess::RenderTarget, - .state_before = wis::TextureState::CopySource, - .state_after = wis::TextureState::RenderTarget, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - out_texture }, - - }; - - cmd_list.TextureBarriers(barriers, 1); - - wis::BufferTextureCopyRegion region{ - .texture = { - .size = { width, height, 1 }, - .format = wis::DataFormat::RGBA8Unorm, - } - }; - - cmd_list.CopyTextureToBuffer(out_texture, data, ®ion, 1); - cmd_list.TextureBarriers(barriers + 1, 1); - cmd_list.Close(); - - wis::CommandListView lists[] = { cmd_list }; - queue.ExecuteCommandLists(lists, 1); - - WaitForGPU(); - - auto* ptr = data.Map(); - - stbi_write_png(name, width, height, 4, ptr, width * 4); - data.Unmap(); -} - -void App::WaitForGPU() -{ - const uint64_t vfence = fence_value; - queue.SignalQueue(fence, vfence); - fence_value++; - std::ignore = fence.Wait(vfence); -} diff --git a/examples/custom/lut/app.h b/examples/custom/lut/app.h deleted file mode 100644 index fecc9711..00000000 --- a/examples/custom/lut/app.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once -#include - -class App -{ -public: - App(uint32_t width, uint32_t height); - -public: - int Start(); - void CreateResources(); - - void Frame(); - void DumpFrame(const char* name); - void OnResize(uint32_t width, uint32_t height); - void WaitForGPU(); - -private: - uint32_t width; - uint32_t height; - wis::DebugMessenger info; - - wis::Device device; - wis::CommandQueue queue; - wis::CommandList cmd_list; - - wis::Texture out_texture; - wis::RenderTarget render_target; - - wis::Fence fence; - uint64_t fence_value = 1; - wis::ResourceAllocator allocator; - - wis::Shader vertex_shader; - wis::Shader pixel_shader; - wis::Shader pixel_shader_tetra; - - wis::RootSignature root; - wis::PipelineState pipeline; - wis::PipelineState pipeline2; - wis::PipelineState* pipeline_c; - - wis::Texture texture; - wis::Texture lut; - - wis::DescriptorBuffer desc_buffer; - wis::DescriptorBuffer sampler_buffer; - - wis::Sampler sampler; - wis::Sampler sampler_lut_linear; - wis::ShaderResource srv; - wis::ShaderResource srv_lut; - - wis::SwapChain swap; -}; diff --git a/examples/custom/lut/entry_main.cpp b/examples/custom/lut/entry_main.cpp deleted file mode 100644 index 402cff2b..00000000 --- a/examples/custom/lut/entry_main.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "app.h" - -int main() -{ - App{ 1920, 1080 }.Start(); - return 0; -} diff --git a/examples/custom/lut_windowed/CMakeLists.txt b/examples/custom/lut_windowed/CMakeLists.txt deleted file mode 100644 index bc5433b1..00000000 --- a/examples/custom/lut_windowed/CMakeLists.txt +++ /dev/null @@ -1,54 +0,0 @@ -project(LutBenchmark2) - -find_package(glm QUIET) - -add_executable( - ${PROJECT_NAME} - entry_main.cpp - app.h - app.cpp - lut_loader.h - lut_loader.cpp - window.h - window.cpp - keyboard.h - keyboard.cpp - mouse.h - mouse.cpp - menu.h - util.h - util.cpp) - -wis_install_deps(${PROJECT_NAME}) - -target_link_libraries( - ${PROJECT_NAME} PRIVATE wis::debug-headers wis::platform-headers glm::glm Wil) -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) -target_include_directories(${PROJECT_NAME} PRIVATE ${fpng_SOURCE_DIR}/src) - -wis_compile_shader(TARGET ${PROJECT_NAME} SHADER - ${CMAKE_CURRENT_SOURCE_DIR}/lut.vs.hlsl) -wis_compile_shader(TARGET ${PROJECT_NAME} SHADER - ${CMAKE_CURRENT_SOURCE_DIR}/lut.ps.hlsl) -wis_compile_shader( - TARGET - ${PROJECT_NAME} - SHADER - ${CMAKE_CURRENT_SOURCE_DIR}/lut.ps.hlsl - DEFINITIONS - "TETRA" - OUTPUT - ${CMAKE_CURRENT_BINARY_DIR}/lut_tetra.ps) - -add_custom_command( - TARGET ${PROJECT_NAME} - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/lut.cube - $/lut.cube) -add_custom_command( - TARGET ${PROJECT_NAME} - POST_BUILD - COMMAND - ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/image.png - $/image.png) diff --git a/examples/custom/lut_windowed/app.cpp b/examples/custom/lut_windowed/app.cpp deleted file mode 100644 index bc65159b..00000000 --- a/examples/custom/lut_windowed/app.cpp +++ /dev/null @@ -1,643 +0,0 @@ -#include "app.h" -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "lut_loader.h" - -#define STB_IMAGE_IMPLEMENTATION -#define STB_IMAGE_WRITE_IMPLEMENTATION -#include -#include - -struct ImageData { - std::vector data; - uint32_t width; - uint32_t height; - uint32_t channels; -}; - -ImageData LoadPNGImage(std::filesystem::path path) -{ - ImageData data; - auto path_str = path.string(); - auto* idata = stbi_load(path_str.c_str(), (int*)&data.width, (int*)&data.height, (int*)&data.channels, 4); - - std::copy(idata, idata + data.width * data.height * 4, std::back_inserter(data.data)); - stbi_image_free(idata); - - return data; -} - -struct LogProvider : public wis::LogLayer { - virtual void Log(wis::Severity sev, std::string message, wis::source_location sl = wis::source_location::current()) override - { - std::cout << wis::format("[{}]: {}\n", wis::severity_strings[+sev], message); - }; -}; - -void DebugCallback(wis::Severity severity, const char* message, void* user_data) -{ - auto stream = reinterpret_cast(user_data); - *stream << message << "\n"; -} - -App::App(uint32_t width, uint32_t height) - : wnd(width, height, "Lut Test"), width(width), height(height) -{ - std::array extensions = { &windows_ext }; - auto [result, factory] = wis::CreateFactory(false, extensions.data(), extensions.size()); - - for (size_t i = 0;; i++) { - auto [res, adapter] = factory.GetAdapter(i); - if (res.status == wis::Status::Ok) { - wis::AdapterDesc desc; - res = adapter.GetDesc(&desc); - std::cout << "Adapter: " << desc.description.data() << "\n"; - - auto [res, hdevice] = wis::CreateDevice(std::move(adapter)); - if (res.status == wis::Status::Ok) { - device = std::move(hdevice); - break; - }; - - } else { - break; - } - } - - auto [res2, hqueue] = device.CreateCommandQueue(wis::QueueType::Graphics); - queue = std::move(hqueue); - - { - auto [res, alloc] = device.CreateAllocator(); - allocator = std::move(alloc); - } - - { - using namespace wis; - wis::TextureDesc desc{ - .format = wis::DataFormat::RGBA8Unorm, - .size = { width, height, 1 }, - .mip_levels = 1, - .usage = wis::TextureUsage::RenderTarget | wis::TextureUsage::CopySrc - }; - auto [res, htexture] = allocator.CreateTexture(desc); - out_texture = std::move(htexture); - - wis::RenderTargetDesc rt_desc{ - .format = wis::DataFormat::RGBA8Unorm, - .layout = wis::TextureLayout::Texture2D, - .mip = 0, - .base_array_layer = 0, - .layer_count = 1, - }; - auto [res2, hrt] = device.CreateRenderTarget(out_texture, rt_desc); - render_target = std::move(hrt); - } - - auto [res4, hfence] = device.CreateFence(); - fence = std::move(hfence); - - auto [res5, hcmd_list] = device.CreateCommandList(wis::QueueType::Graphics); - cmd_list = std::move(hcmd_list); - - // Create Swapchain - { - wis::SwapchainDesc desc{ - .size = { uint32_t(wnd.GetWidth()), uint32_t(wnd.GetHeight()) }, - .format = wis::DataFormat::RGBA8Unorm, - .buffer_count = 2, - .stereo = false, - .vsync = true, - }; - - auto [res3, hswap] = windows_ext.CreateSwapchain(device, queue, &desc, - wnd.GetHandle()); - swap = std::move(hswap); - back_buffers = swap.GetBufferSpan(); - - wis::RenderTargetDesc rt_desc{ - .format = wis::DataFormat::RGBA8Unorm, - .layout = wis::TextureLayout::Texture2D, - .mip = 0, - .base_array_layer = 0, - .layer_count = 1, - }; - for (size_t i = 0; i < render_targets.size(); i++) { - auto [res, hrt] = device.CreateRenderTarget(back_buffers[i], rt_desc); - render_targets[i] = std::move(hrt); - } - } - - CreateResources(); -} - -int App::Start() -{ - std::chrono::high_resolution_clock clock; - auto start = clock.now(); - - // Point filter - for (size_t i = 0; i < 1000; i++) { - Frame(); - } - - auto end = clock.now(); - std::cout << "Time: " << std::chrono::duration_cast(end - start).count() << "ms\n"; - - // DumpFrame("out_point.png"); - - // Linear filter - pipeline_c = &pipeline2; - start = clock.now(); - for (size_t i = 0; i < 1000; i++) { - Frame(); - } - end = clock.now(); - - std::cout << "Time: " << std::chrono::duration_cast(end - start).count() << "ms\n"; - - // DumpFrame("out_linear.png"); - - // Tetra + Point filter - pipeline_c = &pipeline2; - sampler_buffer.WriteSampler(0, 0, sampler); - - start = clock.now(); - for (size_t i = 0; i < 1000; i++) { - Frame(); - } - end = clock.now(); - - std::cout << "Time: " << std::chrono::duration_cast(end - start).count() << "ms\n"; - - // DumpFrame("out_tetra.png"); - - return 0; -} - -std::string LoadShader(std::filesystem::path p) -{ - if constexpr (wis::shader_intermediate == wis::ShaderIntermediate::DXIL) - p += u".cso"; - else - p += u".spv"; - - std::ifstream t{ p, std::ios::binary }; - t.seekg(0, std::ios::end); - size_t size = t.tellg(); - std::string ret; - ret.resize(size); - t.seekg(0); - t.read(ret.data(), size); - return ret; -} - -void App::CreateResources() -{ - // Create descriptor buffer - { - auto desc_increment = device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Descriptor); - auto [res, hdesc] = device.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, 2 * desc_increment); - desc_buffer = std::move(hdesc); - - auto sampler_increment = device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Sampler); - auto [res2, hdesc2] = device.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, 2 * sampler_increment); - sampler_buffer = std::move(hdesc2); - } - - { - wis::DescriptorTableEntry entries[] = { - { - .type = wis::DescriptorType::ShaderResource, - .bind_register = 0, - .binding = 0, - .count = 1, - }, - { - .type = wis::DescriptorType::ShaderResource, - .bind_register = 1, - .binding = 1, - .count = 1, - }, - { - .type = wis::DescriptorType::Sampler, - .bind_register = 0, - .binding = 0, - .count = 1, - }, - { - .type = wis::DescriptorType::Sampler, - .bind_register = 1, - .binding = 1, - .count = 1, - }, - }; - - wis::DescriptorTable tables[] = { - { - .type = wis::DescriptorHeapType::Descriptor, - .entries = entries, - .entry_count = 2, - .stage = wis::ShaderStages::Pixel, - }, - { - .type = wis::DescriptorHeapType::Sampler, - .entries = entries + 2, - .entry_count = 2, - .stage = wis::ShaderStages::Pixel, - }, - - }; - auto [result, hroot] = device.CreateRootSignature(nullptr, 0, tables, sizeof(tables) / sizeof(tables[0])); - root = std::move(hroot); - } - - // Upload lut data to a buffer - { - auto png_data = LoadPNGImage("image.png"); - auto [res, img_data_buffer] = allocator.CreateUploadBuffer(png_data.data.size()); - std::copy(png_data.data.begin(), png_data.data.end(), img_data_buffer.Map()); - img_data_buffer.Unmap(); - - // Create Texture - { - using namespace wis; - wis::TextureDesc desc{ - .format = wis::DataFormat::RGBA8Unorm, - .size = { png_data.width, png_data.height, 1 }, - .mip_levels = 1, - .usage = wis::TextureUsage::CopyDst | wis::TextureUsage::ShaderResource - }; - auto [res, htexture] = allocator.CreateTexture(desc); - texture = std::move(htexture); - } - - auto lut_data = LutLoader::LoadLut("lut.cube"); - auto [res2, lut_data_buffer] = allocator.CreateUploadBuffer(lut_data.stride * lut_data.stride * lut_data.stride * 4 * sizeof(float)); - std::copy(lut_data.data.get(), lut_data.data.get() + lut_data.stride * lut_data.stride * lut_data.stride * 4, lut_data_buffer.Map()); - lut_data_buffer.Unmap(); - - // Create Texture - { - using namespace wis; - wis::TextureDesc desc{ - .format = wis::DataFormat::RGBA32Float, - .size = { uint32_t(lut_data.stride), (uint32_t)lut_data.stride, (uint32_t)lut_data.stride }, - .mip_levels = 1, - .layout = wis::TextureLayout::Texture3D, - .usage = wis::TextureUsage::CopyDst | wis::TextureUsage::ShaderResource - }; - auto [res, htexture] = allocator.CreateTexture(desc); - lut = std::move(htexture); - } - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::NoAccess, - .access_after = wis::ResourceAccess::CopyDest, - .state_before = wis::TextureState::Undefined, - .state_after = wis::TextureState::CopyDest, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - lut); - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::NoAccess, - .access_after = wis::ResourceAccess::CopyDest, - .state_before = wis::TextureState::Undefined, - .state_after = wis::TextureState::CopyDest, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - texture); - - wis::BufferTextureCopyRegion region{ - .texture = { - .size = { (uint32_t)lut_data.stride, (uint32_t)lut_data.stride, (uint32_t)lut_data.stride }, - .format = wis::DataFormat::RGBA32Float, - } - }; - cmd_list.CopyBufferToTexture(lut_data_buffer, lut, ®ion, 1); - - wis::BufferTextureCopyRegion region2{ - .texture = { - .size = { png_data.width, png_data.height, 1 }, - .format = wis::DataFormat::RGBA8Unorm, - } - }; - cmd_list.CopyBufferToTexture(img_data_buffer, texture, ®ion2, 1); - - cmd_list.TextureBarrier( - { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::CopyDest, - .access_after = wis::ResourceAccess::ShaderResource, - .state_before = wis::TextureState::CopyDest, - .state_after = wis::TextureState::ShaderResource, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - texture); - cmd_list.TextureBarrier( - { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::CopyDest, - .access_after = wis::ResourceAccess::ShaderResource, - .state_before = wis::TextureState::CopyDest, - .state_after = wis::TextureState::ShaderResource, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - lut); - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::NoAccess, - .access_after = wis::ResourceAccess::RenderTarget, - .state_before = wis::TextureState::Undefined, - .state_after = wis::TextureState::RenderTarget, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - out_texture); - cmd_list.Close(); - - wis::CommandListView cmd_lists[] = { cmd_list }; - queue.ExecuteCommandLists(cmd_lists, 1); - - WaitForGPU(); - - auto [resz2, hsrv] = device.CreateShaderResource(texture, { .format = wis::DataFormat::RGBA8Unorm, .view_type = wis::TextureViewType::Texture2D, .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - } }); - auto [res2z3, hsrv2] = device.CreateShaderResource(lut, { .format = wis::DataFormat::RGBA32Float, .view_type = wis::TextureViewType::Texture3D, .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - } }); - srv_lut = std::move(hsrv2); - srv = std::move(hsrv); - desc_buffer.WriteShaderResource(0, 0, 0, 0, root, srv_lut); - desc_buffer.WriteShaderResource(0, 0, 1, 0, root, srv); - } - - { - auto s1 = LoadShader("lut.vs"); - auto s2 = LoadShader("lut.ps"); - auto s3 = LoadShader("lut_tetra.ps"); - auto [result, vs] = device.CreateShader(s1.data(), uint32_t(s1.size())); - auto [result2, ps] = device.CreateShader(s2.data(), uint32_t(s2.size())); - auto [result3, ps2] = device.CreateShader(s3.data(), uint32_t(s3.size())); - - vertex_shader = std::move(vs); - pixel_shader = std::move(ps); - pixel_shader_tetra = std::move(ps2); - } - - { - wis::DataFormat attachment_formats[] = { wis::DataFormat::RGBA8Unorm }; - - wis::GraphicsPipelineDesc desc{ - .root_signature = root, - .shaders = { .vertex = vertex_shader, .pixel = pixel_shader }, - .attachments = { - .attachment_formats = attachment_formats, - .attachments_count = 1, - } - }; - auto [res2, hpipeline] = device.CreateGraphicsPipeline(&desc); - pipeline = std::move(hpipeline); - - desc.shaders.pixel = pixel_shader_tetra; - auto [res3, hpipeline2] = device.CreateGraphicsPipeline(&desc); - pipeline2 = std::move(hpipeline2); - } - - // Create Sampler - { - wis::SamplerDesc sample_desc{ - .min_filter = wis::Filter::Point, - .mag_filter = wis::Filter::Point, - .mip_filter = wis::Filter::Point, - .anisotropic = false, - .max_anisotropy = 16, - .address_u = wis::AddressMode::ClampToEdge, - .address_v = wis::AddressMode::ClampToEdge, - .address_w = wis::AddressMode::ClampToEdge, - .min_lod = 0, - .max_lod = 1.0f, - .mip_lod_bias = 0.0f, - .comparison_op = wis::Compare::None, - }; - auto [res, hsampler] = device.CreateSampler(&sample_desc); - sampler = std::move(hsampler); - - wis::SamplerDesc sample_desc2{ - .min_filter = wis::Filter::Linear, - .mag_filter = wis::Filter::Linear, - .mip_filter = wis::Filter::Linear, - .anisotropic = false, - .max_anisotropy = 16, - .address_u = wis::AddressMode::ClampToEdge, - .address_v = wis::AddressMode::ClampToEdge, - .address_w = wis::AddressMode::ClampToEdge, - .min_lod = 0, - .max_lod = 1.0f, - .mip_lod_bias = 0.0f, - .comparison_op = wis::Compare::None, - }; - auto [res2, hsampler2] = device.CreateSampler(&sample_desc2); - sampler_lut_linear = std::move(hsampler2); - - sampler_buffer.WriteSampler(0, 0, sampler); - sampler_buffer.WriteSampler(0, 1, sampler); - } - pipeline_c = &pipeline; - - WaitForGPU(); -} - -void App::Frame() -{ - auto res = cmd_list.Reset(*pipeline_c); - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::Draw, - .access_before = wis::ResourceAccess::Common, - .access_after = wis::ResourceAccess::RenderTarget, - .state_before = wis::TextureState::Present, - .state_after = wis::TextureState::RenderTarget, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - back_buffers[swap.GetCurrentIndex()]); - - wis::RenderPassRenderTargetDesc targets{ - .target = render_targets[swap.GetCurrentIndex()], - .load_op = wis::LoadOperation::Clear, - .store_op = wis::StoreOperation::Store, - .clear_value = { 0.0f, 0.2f, 0.4f, 1.0f }, - }; - wis::RenderPassDesc rp{ - .flags = wis::RenderPassFlags::None, - .target_count = 1, - .targets = &targets, - }; - - cmd_list.BeginRenderPass(&rp); - cmd_list.SetRootSignature(root); - - wis::DescriptorBufferView desc_buffers[] = { desc_buffer, sampler_buffer }; - - cmd_list.SetDescriptorBuffers(desc_buffers, 2); - cmd_list.SetDescriptorTableOffset(0, desc_buffer, 0); - cmd_list.SetDescriptorTableOffset(1, sampler_buffer, 0); - - cmd_list.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); - - cmd_list.RSSetViewport({ 0, 0, float(width), float(height), 0, 1 }); - cmd_list.RSSetScissor({ 0, 0, int(width), int(height) }); - - cmd_list.DrawInstanced(3); - cmd_list.EndRenderPass(); - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::Draw, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::RenderTarget, - .access_after = wis::ResourceAccess::Common, - .state_before = wis::TextureState::RenderTarget, - .state_after = wis::TextureState::Present, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - back_buffers[swap.GetCurrentIndex()]); - - cmd_list.Close(); - - wis::CommandListView lists[] = { cmd_list }; - queue.ExecuteCommandLists(lists, 1); - - auto result = swap.Present(); - - WaitForGPU(); -} - -void App::DumpFrame(const char* name) -{ - auto [res, data] = allocator.CreateReadbackBuffer(width * height * 4); - - std::ignore = cmd_list.Reset(); - - wis::TextureBarrier2 barriers[] = { - { { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::RenderTarget, - .access_after = wis::ResourceAccess::CopySource, - .state_before = wis::TextureState::RenderTarget, - .state_after = wis::TextureState::CopySource, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - out_texture }, - { { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::CopySource, - .access_after = wis::ResourceAccess::RenderTarget, - .state_before = wis::TextureState::CopySource, - .state_after = wis::TextureState::RenderTarget, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - out_texture }, - - }; - - cmd_list.TextureBarriers(barriers, 1); - - wis::BufferTextureCopyRegion region{ - .texture = { - .size = { width, height, 1 }, - .format = wis::DataFormat::RGBA8Unorm, - } - }; - - cmd_list.CopyTextureToBuffer(out_texture, data, ®ion, 1); - cmd_list.TextureBarriers(barriers + 1, 1); - cmd_list.Close(); - - wis::CommandListView lists[] = { cmd_list }; - queue.ExecuteCommandLists(lists, 1); - - WaitForGPU(); - - auto* ptr = data.Map(); - - stbi_write_png(name, width, height, 4, ptr, width * 4); - data.Unmap(); -} - -void App::WaitForGPU() -{ - const uint64_t vfence = fence_value; - queue.SignalQueue(fence, vfence); - fence_value++; - std::ignore = fence.Wait(vfence); -} diff --git a/examples/custom/lut_windowed/app.h b/examples/custom/lut_windowed/app.h deleted file mode 100644 index cc88b6d7..00000000 --- a/examples/custom/lut_windowed/app.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once -#include -#include "window.h" -#include - -class App -{ -public: - App(uint32_t width, uint32_t height); - -public: - int Start(); - void CreateResources(); - - void Frame(); - void DumpFrame(const char* name); - void OnResize(uint32_t width, uint32_t height); - void WaitForGPU(); - -private: - Window wnd; - - wis::platform::WindowsExtension windows_ext; - - uint32_t width; - uint32_t height; - wis::DebugMessenger info; - - wis::Device device; - wis::CommandQueue queue; - wis::CommandList cmd_list; - - wis::Texture out_texture; - wis::RenderTarget render_target; - - wis::Fence fence; - uint64_t fence_value = 1; - wis::ResourceAllocator allocator; - - wis::Shader vertex_shader; - wis::Shader pixel_shader; - wis::Shader pixel_shader_tetra; - - wis::RootSignature root; - wis::PipelineState pipeline; - wis::PipelineState pipeline2; - wis::PipelineState* pipeline_c; - - wis::Texture texture; - wis::Texture lut; - - wis::DescriptorBuffer desc_buffer; - wis::DescriptorBuffer sampler_buffer; - - wis::Sampler sampler; - wis::Sampler sampler_lut_linear; - wis::ShaderResource srv; - wis::ShaderResource srv_lut; - - wis::SwapChain swap; - - std::span back_buffers; - std::array render_targets; -}; diff --git a/examples/custom/lut_windowed/entry_main.cpp b/examples/custom/lut_windowed/entry_main.cpp deleted file mode 100644 index 402cff2b..00000000 --- a/examples/custom/lut_windowed/entry_main.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "app.h" - -int main() -{ - App{ 1920, 1080 }.Start(); - return 0; -} diff --git a/examples/custom/lut_windowed/image.png b/examples/custom/lut_windowed/image.png deleted file mode 100644 index 372c2a2777d2b4e3074d64e82a7a19b9ab85976f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26271 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 WXbNsFwl@H{myv Keyboard::ReadKey() noexcept -{ - if (keybuffer.size() > 0u) { - Keyboard::Event e = keybuffer.front(); - keybuffer.pop(); - return e; - } - return {}; -} - -bool Keyboard::KeyIsEmpty() const noexcept -{ - return keybuffer.empty(); -} - -std::optional Keyboard::ReadChar() noexcept -{ - if (charbuffer.size() > 0u) { - unsigned char charcode = charbuffer.front(); - charbuffer.pop(); - return charcode; - } - return {}; -} - -bool Keyboard::CharIsEmpty() const noexcept -{ - return charbuffer.empty(); -} - -void Keyboard::FlushKey() noexcept -{ - keybuffer = std::queue(); -} - -void Keyboard::FlushChar() noexcept -{ - charbuffer = std::queue(); -} - -void Keyboard::Flush() noexcept -{ - FlushKey(); - FlushChar(); -} - -void Keyboard::EnableAutorepeat() noexcept -{ - autorepeatEnabled = true; -} - -void Keyboard::DisableAutorepeat() noexcept -{ - autorepeatEnabled = false; -} - -bool Keyboard::AutorepeatIsEnabled() const noexcept -{ - return autorepeatEnabled; -} - -void Keyboard::OnKeyPressed(unsigned char keycode) noexcept -{ - keystates[keycode] = true; - keybuffer.push(Keyboard::Event(Keyboard::Event::Type::Press, keycode)); - TrimBuffer(keybuffer); -} - -void Keyboard::OnKeyReleased(unsigned char keycode) noexcept -{ - keystates[keycode] = false; - keybuffer.push(Keyboard::Event(Keyboard::Event::Type::Release, keycode)); - TrimBuffer(keybuffer); -} - -void Keyboard::OnChar(char character) noexcept -{ - charbuffer.push(character); - TrimBuffer(charbuffer); -} - -void Keyboard::ClearState() noexcept -{ - keystates.reset(); -} - -template -void Keyboard::TrimBuffer(std::queue& buffer) noexcept -{ - while (buffer.size() > bufferSize) { - buffer.pop(); - } -} diff --git a/examples/custom/lut_windowed/lut.cube b/examples/custom/lut_windowed/lut.cube deleted file mode 100644 index 25cd2686..00000000 --- a/examples/custom/lut_windowed/lut.cube +++ /dev/null @@ -1,32776 +0,0 @@ -#Created by: Adobe Photoshop Export Color Lookup Plugin -#Copyright: (C) Copyright 2017 RocketStock -TITLE "Untitled" - -#LUT size -LUT_3D_SIZE 32 - -#LUT data points -0.035309 0.035309 0.035309 -0.048157 0.036316 0.036621 -0.060760 0.037415 0.037903 -0.073914 0.038605 0.039307 -0.087830 0.039856 0.040771 -0.102844 0.041199 0.042297 -0.119141 0.042572 0.043884 -0.136414 0.043976 0.045471 -0.154816 0.045532 0.047180 -0.174103 0.047119 0.048981 -0.194183 0.048706 0.050751 -0.215088 0.050415 0.052643 -0.236664 0.052185 0.054596 -0.258759 0.053986 0.056580 -0.281464 0.055878 0.058685 -0.304596 0.057861 0.060822 -0.328125 0.059814 0.062988 -0.351929 0.061920 0.065308 -0.375854 0.064056 0.067596 -0.400024 0.066254 0.070007 -0.424255 0.068573 0.072540 -0.448273 0.070862 0.075043 -0.472595 0.073303 0.077698 -0.497498 0.075806 0.080444 -0.523071 0.078339 0.083191 -0.549225 0.080994 0.086090 -0.575836 0.083771 0.089081 -0.602631 0.086517 0.092072 -0.629639 0.089447 0.095245 -0.656433 0.092377 0.098450 -0.683197 0.095459 0.101807 -0.709595 0.098663 0.105255 -0.038147 0.046722 0.037872 -0.050964 0.047974 0.039276 -0.063782 0.049255 0.040710 -0.077179 0.050659 0.042236 -0.091492 0.052094 0.043823 -0.106934 0.053558 0.045441 -0.123657 0.055145 0.047150 -0.141388 0.056732 0.048889 -0.160187 0.058472 0.050720 -0.179901 0.060242 0.052582 -0.200317 0.062042 0.054535 -0.221619 0.063965 0.056549 -0.243561 0.065948 0.058624 -0.265961 0.067963 0.060699 -0.288971 0.070068 0.062927 -0.312317 0.072235 0.065186 -0.336121 0.074524 0.067535 -0.360199 0.076843 0.069946 -0.384308 0.079224 0.072388 -0.408691 0.081726 0.074982 -0.432983 0.084320 0.077637 -0.457153 0.086914 0.080292 -0.481750 0.089691 0.083099 -0.507111 0.092560 0.085999 -0.532928 0.095398 0.088898 -0.559418 0.098450 0.092010 -0.586273 0.101593 0.095154 -0.613190 0.104736 0.098358 -0.640289 0.108063 0.101715 -0.667114 0.111359 0.105072 -0.693848 0.114868 0.108643 -0.720215 0.118439 0.112244 -0.041168 0.059021 0.040680 -0.054016 0.060455 0.042206 -0.067047 0.061920 0.043732 -0.080780 0.063538 0.045410 -0.095428 0.065125 0.047058 -0.111420 0.066864 0.048828 -0.128571 0.068665 0.050690 -0.146759 0.070465 0.052521 -0.165985 0.072418 0.054474 -0.186096 0.074432 0.056519 -0.206909 0.076477 0.058533 -0.228577 0.078644 0.060638 -0.250885 0.080902 0.062897 -0.273590 0.083160 0.065125 -0.296875 0.085602 0.067474 -0.320496 0.088043 0.069855 -0.344543 0.090668 0.072327 -0.368774 0.093353 0.074921 -0.393097 0.096008 0.077484 -0.417542 0.098907 0.080231 -0.441956 0.101868 0.083038 -0.466278 0.104858 0.085876 -0.491241 0.108002 0.088837 -0.516998 0.111237 0.091919 -0.543121 0.114532 0.095001 -0.569916 0.117950 0.098267 -0.596771 0.121368 0.101562 -0.623993 0.125000 0.105011 -0.651123 0.128662 0.108551 -0.677979 0.132385 0.112091 -0.704651 0.136230 0.115814 -0.730957 0.140198 0.119629 -0.044373 0.072327 0.043701 -0.057373 0.073975 0.045349 -0.070618 0.075653 0.046997 -0.084686 0.077484 0.048767 -0.099823 0.079346 0.050598 -0.116302 0.081329 0.052490 -0.133942 0.083374 0.054413 -0.152527 0.085480 0.056366 -0.172180 0.087708 0.058472 -0.192719 0.090057 0.060608 -0.213867 0.092407 0.062775 -0.235901 0.094910 0.065063 -0.258514 0.097473 0.067413 -0.281525 0.100128 0.069763 -0.305115 0.102905 0.072296 -0.329010 0.105713 0.074768 -0.353241 0.108673 0.077423 -0.377716 0.111755 0.080139 -0.402130 0.114777 0.082886 -0.426727 0.118073 0.085785 -0.451202 0.121429 0.088776 -0.475769 0.124786 0.091766 -0.501160 0.128296 0.094940 -0.527222 0.131927 0.098175 -0.553680 0.135529 0.101440 -0.580627 0.139313 0.104919 -0.607727 0.143158 0.108368 -0.635010 0.147095 0.112000 -0.662231 0.151154 0.115723 -0.688995 0.155182 0.119415 -0.715546 0.159393 0.123352 -0.741730 0.163696 0.127319 -0.047852 0.086853 0.046967 -0.060913 0.088745 0.048676 -0.074493 0.090820 0.050507 -0.089020 0.092926 0.052429 -0.104614 0.095062 0.054321 -0.121552 0.097351 0.056305 -0.139648 0.099762 0.058411 -0.158722 0.102173 0.060486 -0.178772 0.104767 0.062714 -0.199707 0.107483 0.065002 -0.221252 0.110168 0.067322 -0.243622 0.113068 0.069702 -0.266418 0.115906 0.072144 -0.289886 0.118988 0.074707 -0.313721 0.122162 0.077362 -0.337799 0.125336 0.080048 -0.362305 0.128632 0.082855 -0.386902 0.132080 0.085724 -0.411469 0.135498 0.088623 -0.436157 0.139130 0.091675 -0.460693 0.142822 0.094879 -0.485626 0.146545 0.098022 -0.511444 0.150421 0.101379 -0.537628 0.154297 0.104736 -0.564484 0.158356 0.108307 -0.591675 0.162506 0.111908 -0.618866 0.166595 0.115540 -0.646240 0.170898 0.119324 -0.673370 0.175262 0.123230 -0.700104 0.179596 0.127106 -0.726562 0.184113 0.131165 -0.752594 0.188721 0.135284 -0.051544 0.103088 0.050476 -0.064789 0.105286 0.052307 -0.078735 0.107666 0.054260 -0.093658 0.110107 0.056274 -0.109802 0.112610 0.058319 -0.127228 0.115265 0.060455 -0.145782 0.118011 0.062653 -0.165222 0.120789 0.064880 -0.185730 0.123718 0.067261 -0.207062 0.126740 0.069672 -0.228973 0.129822 0.072052 -0.251678 0.133057 0.074646 -0.274811 0.136292 0.077240 -0.298523 0.139679 0.079956 -0.322632 0.143188 0.082764 -0.346954 0.146729 0.085571 -0.371582 0.150421 0.088562 -0.396362 0.154144 0.091583 -0.421021 0.157959 0.094727 -0.445740 0.161896 0.097961 -0.470520 0.165924 0.101288 -0.495850 0.169952 0.104645 -0.521942 0.174194 0.108215 -0.548462 0.178375 0.111725 -0.575562 0.182739 0.115417 -0.602905 0.187164 0.119232 -0.630188 0.191589 0.123047 -0.657532 0.196228 0.127045 -0.684662 0.200867 0.131073 -0.711273 0.205475 0.135101 -0.737640 0.210297 0.139313 -0.763489 0.215149 0.143616 -0.055481 0.121094 0.054230 -0.068970 0.123627 0.056152 -0.083252 0.126312 0.058258 -0.098663 0.129120 0.060425 -0.115326 0.131958 0.062561 -0.133270 0.134949 0.064819 -0.152283 0.138062 0.067200 -0.172180 0.141174 0.069519 -0.193085 0.144440 0.071991 -0.214722 0.147736 0.074524 -0.237091 0.151245 0.077148 -0.260101 0.154816 0.079865 -0.283569 0.158356 0.082611 -0.307495 0.162109 0.085480 -0.331879 0.165924 0.088470 -0.356384 0.169769 0.091461 -0.381165 0.173767 0.094635 -0.406006 0.177887 0.097870 -0.430817 0.182007 0.101135 -0.455597 0.186249 0.104553 -0.480499 0.190521 0.107971 -0.506317 0.194946 0.111664 -0.532776 0.199432 0.115356 -0.559570 0.203888 0.119049 -0.586853 0.208557 0.122925 -0.614288 0.213318 0.126953 -0.641663 0.217957 0.130890 -0.668976 0.222839 0.134979 -0.696014 0.227753 0.139221 -0.722504 0.232635 0.143402 -0.748749 0.237671 0.147766 -0.774261 0.242615 0.152100 -0.059631 0.140747 0.058197 -0.073395 0.143646 0.060303 -0.088135 0.146667 0.062500 -0.104034 0.149841 0.064758 -0.121246 0.152924 0.067078 -0.139679 0.156311 0.069458 -0.159149 0.159729 0.071960 -0.179504 0.163147 0.074432 -0.200806 0.166779 0.077118 -0.222809 0.170410 0.079742 -0.245544 0.174194 0.082520 -0.268860 0.178101 0.085419 -0.292572 0.181976 0.088318 -0.316803 0.186066 0.091370 -0.341370 0.190186 0.094513 -0.366028 0.194366 0.097687 -0.390991 0.198669 0.101044 -0.415985 0.203064 0.104492 -0.440735 0.207458 0.107910 -0.465637 0.212006 0.111542 -0.490936 0.216492 0.115173 -0.517151 0.221222 0.118958 -0.543793 0.225983 0.122803 -0.570831 0.230713 0.126678 -0.598297 0.235657 0.130798 -0.625885 0.240601 0.134888 -0.653229 0.245514 0.139038 -0.680511 0.250671 0.143311 -0.707397 0.255768 0.147675 -0.733765 0.260834 0.151978 -0.759796 0.266083 0.156464 -0.785065 0.271271 0.160919 -0.064056 0.162079 0.062439 -0.078156 0.165253 0.064636 -0.093353 0.168610 0.067017 -0.109863 0.172089 0.069397 -0.127533 0.175568 0.071838 -0.146454 0.179199 0.074402 -0.166290 0.182831 0.076965 -0.187195 0.186676 0.079681 -0.208862 0.190613 0.082458 -0.231201 0.194519 0.085297 -0.254333 0.198639 0.088226 -0.277924 0.202850 0.091309 -0.301910 0.207031 0.094360 -0.326385 0.211395 0.097626 -0.351135 0.215851 0.100983 -0.375977 0.220245 0.104279 -0.401031 0.224884 0.107819 -0.426056 0.229523 0.111450 -0.450867 0.234131 0.115082 -0.475983 0.238983 0.118835 -0.501709 0.243744 0.122650 -0.528168 0.248688 0.126617 -0.555176 0.253723 0.130646 -0.582397 0.258698 0.134674 -0.609924 0.263794 0.138916 -0.637573 0.269012 0.143188 -0.664917 0.274109 0.147461 -0.692047 0.279388 0.151886 -0.718872 0.284729 0.156372 -0.745056 0.289978 0.160828 -0.770844 0.295410 0.165436 -0.795898 0.300751 0.170013 -0.068756 0.184875 0.066956 -0.083252 0.188354 0.069275 -0.098969 0.192047 0.071747 -0.115997 0.195831 0.074310 -0.134216 0.199554 0.076904 -0.153595 0.203491 0.079590 -0.173889 0.207489 0.082336 -0.195190 0.211609 0.085205 -0.217316 0.215851 0.088165 -0.240021 0.220062 0.091156 -0.263397 0.224426 0.094299 -0.287292 0.228912 0.097534 -0.311493 0.233337 0.100800 -0.336212 0.237976 0.104187 -0.361115 0.242676 0.107727 -0.386078 0.247345 0.111267 -0.411224 0.252228 0.114990 -0.436188 0.257019 0.118652 -0.461182 0.261993 0.122559 -0.486694 0.267059 0.126526 -0.512665 0.272034 0.130463 -0.539429 0.277191 0.134583 -0.566711 0.282440 0.138824 -0.594116 0.287567 0.143005 -0.621765 0.292908 0.147339 -0.649353 0.298279 0.151764 -0.676605 0.303528 0.156128 -0.703674 0.308960 0.160706 -0.730164 0.314331 0.165222 -0.756287 0.319855 0.169922 -0.781860 0.325409 0.174683 -0.806580 0.330841 0.179321 -0.073700 0.209015 0.071686 -0.088654 0.212799 0.074188 -0.104919 0.216797 0.076813 -0.122437 0.220764 0.079437 -0.141266 0.224915 0.082245 -0.161163 0.229156 0.085083 -0.181915 0.233368 0.088013 -0.203583 0.237762 0.091064 -0.226074 0.242249 0.094238 -0.249084 0.246735 0.097382 -0.272766 0.251404 0.100708 -0.296936 0.256104 0.104126 -0.321381 0.260803 0.107574 -0.346283 0.265686 0.111176 -0.371216 0.270508 0.114777 -0.396393 0.275482 0.118591 -0.421600 0.280579 0.122467 -0.446594 0.285553 0.126312 -0.471741 0.290771 0.130371 -0.497559 0.296021 0.134491 -0.523956 0.301208 0.138611 -0.550934 0.306519 0.142914 -0.578369 0.311920 0.147247 -0.605865 0.317230 0.151520 -0.633606 0.322754 0.156036 -0.661163 0.328217 0.160583 -0.688293 0.333679 0.165100 -0.715271 0.339203 0.169800 -0.741516 0.344666 0.174408 -0.767456 0.350281 0.179199 -0.792725 0.355927 0.184052 -0.817230 0.361450 0.188843 -0.078979 0.234436 0.076752 -0.094421 0.238495 0.079407 -0.111267 0.242737 0.082184 -0.129364 0.246979 0.084961 -0.148651 0.251434 0.087921 -0.169006 0.255890 0.091003 -0.190186 0.260406 0.094055 -0.212311 0.265045 0.097290 -0.235138 0.269806 0.100647 -0.258423 0.274445 0.103943 -0.282440 0.279388 0.107483 -0.306854 0.284332 0.111084 -0.331512 0.289215 0.114685 -0.356537 0.294312 0.118469 -0.381592 0.299316 0.122284 -0.406891 0.304535 0.126221 -0.432098 0.309814 0.130249 -0.457153 0.314972 0.134277 -0.482574 0.320312 0.138489 -0.508759 0.325745 0.142761 -0.535370 0.331055 0.147003 -0.562653 0.336548 0.151428 -0.590240 0.342072 0.155945 -0.617859 0.347504 0.160370 -0.645508 0.353119 0.165009 -0.672913 0.358551 0.169556 -0.700073 0.364197 0.174286 -0.726776 0.369843 0.179108 -0.752869 0.375336 0.183807 -0.778503 0.381042 0.188690 -0.803528 0.386749 0.193634 -0.827698 0.392273 0.198517 -0.084503 0.260864 0.082062 -0.100586 0.265289 0.084930 -0.118011 0.269836 0.087860 -0.136597 0.274261 0.090851 -0.156403 0.278931 0.093964 -0.177216 0.283691 0.097198 -0.198822 0.288391 0.100464 -0.221252 0.293274 0.103851 -0.244446 0.298248 0.107361 -0.268036 0.303131 0.110931 -0.292297 0.308228 0.114624 -0.316833 0.313232 0.118286 -0.341827 0.318481 0.122192 -0.366974 0.323730 0.126099 -0.392151 0.328918 0.130066 -0.417511 0.334320 0.134186 -0.442749 0.339722 0.138397 -0.467773 0.345032 0.142548 -0.493683 0.350494 0.146912 -0.520142 0.356049 0.151306 -0.547058 0.361481 0.155701 -0.574524 0.367096 0.160248 -0.602173 0.372681 0.164886 -0.629822 0.378204 0.169434 -0.657471 0.383881 0.174164 -0.684692 0.389404 0.178864 -0.711700 0.395050 0.183655 -0.738220 0.400757 0.188599 -0.764099 0.406281 0.193359 -0.789490 0.411987 0.198364 -0.814178 0.417694 0.203400 -0.838043 0.423248 0.208282 -0.090424 0.288422 0.087708 -0.107086 0.293060 0.090759 -0.125061 0.297791 0.093903 -0.144165 0.302521 0.097046 -0.164490 0.307373 0.100372 -0.185699 0.312317 0.103760 -0.207764 0.317230 0.107208 -0.230560 0.322357 0.110809 -0.254028 0.327484 0.114532 -0.277954 0.332550 0.118195 -0.302429 0.337799 0.122070 -0.327179 0.343018 0.125916 -0.352325 0.348328 0.129974 -0.377655 0.353790 0.134064 -0.402832 0.359100 0.138153 -0.428162 0.364563 0.142456 -0.453491 0.370117 0.146790 -0.478729 0.375488 0.151062 -0.504944 0.381104 0.155548 -0.531738 0.386719 0.160156 -0.558838 0.392181 0.164642 -0.586456 0.397858 0.169312 -0.614075 0.403320 0.173920 -0.641846 0.409088 0.178741 -0.669434 0.414764 0.183563 -0.696472 0.420319 0.188324 -0.723297 0.425995 0.193268 -0.749603 0.431702 0.198242 -0.775208 0.437195 0.203156 -0.800323 0.442932 0.208191 -0.824738 0.448761 0.213257 -0.848206 0.454376 0.218231 -0.096649 0.316803 0.093719 -0.113953 0.321686 0.096954 -0.132507 0.326630 0.100281 -0.152161 0.331482 0.103577 -0.172913 0.336548 0.107117 -0.194580 0.341705 0.110748 -0.216949 0.346771 0.114288 -0.240112 0.352020 0.118103 -0.263794 0.357147 0.121887 -0.288086 0.362518 0.125793 -0.312805 0.367920 0.129852 -0.337708 0.373230 0.133881 -0.363007 0.378693 0.138031 -0.388367 0.384216 0.142334 -0.413666 0.389618 0.146545 -0.439026 0.395172 0.150970 -0.464264 0.400818 0.155457 -0.489899 0.406250 0.159882 -0.516388 0.411896 0.164551 -0.543457 0.417572 0.169189 -0.570740 0.423126 0.173798 -0.598480 0.428741 0.178619 -0.626129 0.434296 0.183350 -0.653870 0.439972 0.188202 -0.681274 0.445770 0.193146 -0.708191 0.451416 0.197998 -0.734833 0.457275 0.203003 -0.760864 0.463165 0.208038 -0.786194 0.468933 0.212982 -0.811005 0.474884 0.218079 -0.835052 0.480835 0.223267 -0.858124 0.486725 0.228241 -0.103333 0.345917 0.100098 -0.121185 0.350922 0.103516 -0.140289 0.356049 0.107025 -0.160400 0.361115 0.110535 -0.181610 0.366333 0.114197 -0.203705 0.371582 0.118011 -0.226440 0.376770 0.121765 -0.249969 0.382141 0.125702 -0.273895 0.387421 0.129669 -0.298431 0.392883 0.133759 -0.323364 0.398376 0.137939 -0.348419 0.403748 0.142120 -0.373810 0.409332 0.146454 -0.399231 0.414856 0.150879 -0.424530 0.420349 0.155243 -0.449860 0.425964 0.159790 -0.475311 0.431580 0.164429 -0.501282 0.437103 0.168976 -0.528046 0.442841 0.173706 -0.555176 0.448456 0.178375 -0.582794 0.454224 0.183228 -0.610565 0.460083 0.188080 -0.638214 0.465912 0.192902 -0.665863 0.471832 0.197876 -0.693176 0.477844 0.202881 -0.719849 0.483673 0.207794 -0.746185 0.489777 0.212860 -0.772003 0.495850 0.217957 -0.796997 0.501770 0.222961 -0.821442 0.507904 0.228088 -0.844971 0.513855 0.233154 -0.867798 0.520020 0.238312 -0.110321 0.375549 0.106873 -0.128723 0.380737 0.110443 -0.148376 0.385986 0.114105 -0.168976 0.391174 0.117798 -0.190613 0.396454 0.121643 -0.213074 0.401855 0.125610 -0.236145 0.407135 0.129517 -0.259979 0.412598 0.133636 -0.284180 0.417969 0.137726 -0.308929 0.423462 0.141998 -0.334045 0.428986 0.146362 -0.359222 0.434448 0.150665 -0.384705 0.440063 0.155121 -0.410187 0.445770 0.159637 -0.435516 0.451355 0.164154 -0.460815 0.457153 0.168854 -0.486572 0.463074 0.173584 -0.512817 0.468781 0.178284 -0.539886 0.474762 0.183105 -0.567322 0.480743 0.187958 -0.594849 0.486694 0.192780 -0.622681 0.492706 0.197754 -0.650269 0.498718 0.202637 -0.677765 0.504883 0.207672 -0.704865 0.511047 0.212738 -0.731354 0.517120 0.217712 -0.757416 0.523285 0.222870 -0.782959 0.529480 0.227997 -0.807648 0.535583 0.233032 -0.831787 0.541809 0.238220 -0.855042 0.548004 0.243347 -0.877319 0.554077 0.248413 -0.117645 0.405518 0.113953 -0.136658 0.410828 0.117706 -0.156799 0.416199 0.121552 -0.177887 0.421387 0.125427 -0.199890 0.426849 0.129425 -0.222778 0.432281 0.133545 -0.246155 0.437653 0.137634 -0.270264 0.443207 0.141907 -0.294678 0.448730 0.146149 -0.319672 0.454407 0.150543 -0.344910 0.460205 0.155029 -0.370178 0.465881 0.159454 -0.395691 0.471741 0.164062 -0.421173 0.477692 0.168732 -0.446472 0.483551 0.173340 -0.471863 0.489624 0.178131 -0.497955 0.495697 0.182983 -0.524506 0.501678 0.187714 -0.551727 0.507874 0.192657 -0.579193 0.513885 0.197510 -0.606995 0.520142 0.202515 -0.634766 0.526428 0.207550 -0.662231 0.532532 0.212494 -0.689575 0.538788 0.217560 -0.716431 0.545105 0.222717 -0.742706 0.551239 0.227692 -0.768524 0.557495 0.232910 -0.793671 0.563812 0.238068 -0.818115 0.569946 0.243103 -0.841827 0.576172 0.248291 -0.864563 0.582245 0.253357 -0.886505 0.588501 0.258514 -0.125366 0.435730 0.121368 -0.144897 0.441162 0.125336 -0.165527 0.446594 0.129333 -0.187012 0.452026 0.133362 -0.209473 0.457703 0.137512 -0.232513 0.463287 0.141663 -0.256317 0.469086 0.146027 -0.280701 0.474915 0.150421 -0.305328 0.480652 0.154816 -0.330475 0.486664 0.159332 -0.355865 0.492676 0.163940 -0.381195 0.498596 0.168518 -0.406738 0.504700 0.173218 -0.432220 0.510864 0.178009 -0.457428 0.516937 0.182739 -0.483154 0.523163 0.187622 -0.509460 0.529419 0.192505 -0.536285 0.535645 0.197357 -0.563690 0.541931 0.202393 -0.591248 0.548096 0.207306 -0.619080 0.554413 0.212372 -0.646759 0.560791 0.217468 -0.674133 0.566986 0.222473 -0.701233 0.573303 0.227570 -0.727875 0.579681 0.232758 -0.753845 0.585815 0.237762 -0.779358 0.592194 0.242950 -0.804291 0.598419 0.248138 -0.828247 0.604523 0.253204 -0.851624 0.610779 0.258392 -0.873962 0.616821 0.263397 -0.895447 0.622955 0.268585 -0.133362 0.466797 0.129150 -0.153442 0.472504 0.133240 -0.174530 0.478241 0.137421 -0.196442 0.484009 0.141541 -0.219299 0.489899 0.145905 -0.242584 0.495697 0.150238 -0.266693 0.501740 0.154694 -0.291290 0.507843 0.159210 -0.316101 0.513824 0.163727 -0.341431 0.520020 0.168365 -0.366852 0.526245 0.173126 -0.392303 0.532349 0.177765 -0.417816 0.538635 0.182587 -0.443268 0.544983 0.187500 -0.468506 0.551147 0.192261 -0.494507 0.557495 0.197266 -0.520935 0.563782 0.202118 -0.548157 0.570160 0.207153 -0.575684 0.576538 0.212280 -0.603302 0.582794 0.217194 -0.631042 0.589172 0.222321 -0.658661 0.595551 0.227478 -0.685852 0.601807 0.232513 -0.712769 0.608154 0.237671 -0.739166 0.614471 0.242828 -0.764832 0.620575 0.247925 -0.790070 0.626801 0.253082 -0.814423 0.632904 0.258118 -0.838226 0.639069 0.263306 -0.861176 0.645203 0.268463 -0.883026 0.651123 0.273529 -0.904083 0.657166 0.278656 -0.141693 0.499146 0.137207 -0.162262 0.505157 0.141479 -0.183685 0.511017 0.145721 -0.206085 0.517120 0.150116 -0.229279 0.523193 0.154572 -0.252930 0.529236 0.158966 -0.277252 0.535522 0.163605 -0.302032 0.541809 0.168243 -0.327057 0.547943 0.172882 -0.352448 0.554260 0.177643 -0.377991 0.560638 0.182465 -0.403381 0.566833 0.187195 -0.428925 0.573242 0.192139 -0.454163 0.579498 0.196991 -0.479706 0.585938 0.201996 -0.506012 0.592407 0.207031 -0.532745 0.598663 0.212006 -0.560059 0.605042 0.217102 -0.587708 0.611481 0.222198 -0.615265 0.617676 0.227173 -0.643005 0.624054 0.232361 -0.670471 0.630402 0.237549 -0.697388 0.636536 0.242584 -0.724091 0.642822 0.247772 -0.750244 0.649109 0.252991 -0.775604 0.655121 0.257996 -0.800507 0.661224 0.263184 -0.824554 0.667175 0.268188 -0.847931 0.673187 0.273407 -0.870392 0.679169 0.278503 -0.891846 0.684906 0.283478 -0.912415 0.690704 0.288574 -0.150330 0.532654 0.145630 -0.171356 0.538849 0.149994 -0.193176 0.544861 0.154327 -0.215973 0.551117 0.158875 -0.239471 0.557404 0.163483 -0.263397 0.563629 0.167999 -0.287933 0.570007 0.172729 -0.312897 0.576355 0.177521 -0.338043 0.582642 0.182251 -0.363556 0.589050 0.187103 -0.389069 0.595459 0.192047 -0.414459 0.601776 0.196869 -0.439972 0.608215 0.201843 -0.465179 0.614502 0.206787 -0.490997 0.620911 0.211884 -0.517609 0.627350 0.216919 -0.544525 0.633575 0.221954 -0.571991 0.639984 0.227081 -0.599670 0.646301 0.232208 -0.627228 0.652466 0.237274 -0.654816 0.658722 0.242462 -0.682098 0.664917 0.247650 -0.708832 0.670990 0.252686 -0.735199 0.677094 0.257874 -0.760956 0.683044 0.262909 -0.786194 0.689026 0.268066 -0.810730 0.695007 0.273285 -0.834351 0.700775 0.278259 -0.857330 0.706573 0.283356 -0.879395 0.712341 0.288452 -0.900330 0.717834 0.293396 -0.920410 0.723450 0.298401 -0.159180 0.566925 0.154236 -0.180664 0.573242 0.158752 -0.202911 0.579407 0.163269 -0.226044 0.585815 0.167877 -0.249786 0.592224 0.172638 -0.273956 0.598450 0.177277 -0.298737 0.604889 0.182129 -0.323853 0.611298 0.187012 -0.349091 0.617645 0.191803 -0.374634 0.624054 0.196747 -0.400055 0.630310 0.201599 -0.425598 0.636780 0.206665 -0.450989 0.643158 0.211731 -0.476349 0.649414 0.216675 -0.502472 0.655762 0.221832 -0.529236 0.662109 0.226959 -0.556305 0.668243 0.231964 -0.583862 0.674469 0.237152 -0.611572 0.680695 0.242310 -0.639038 0.686676 0.247375 -0.666473 0.692810 0.252594 -0.693573 0.698853 0.257751 -0.720123 0.704742 0.262787 -0.746185 0.710693 0.267944 -0.771576 0.716400 0.273010 -0.796448 0.722198 0.278137 -0.820648 0.727905 0.283234 -0.843872 0.733490 0.288208 -0.866425 0.739075 0.293243 -0.888000 0.744568 0.298279 -0.908539 0.749847 0.303162 -0.928040 0.755249 0.308105 -0.168335 0.601685 0.163147 -0.190247 0.608093 0.167786 -0.212830 0.614349 0.172394 -0.236237 0.620758 0.177155 -0.260284 0.627197 0.182007 -0.284668 0.633423 0.186737 -0.309631 0.639862 0.191650 -0.334869 0.646301 0.196625 -0.360199 0.652527 0.201508 -0.385773 0.658966 0.206512 -0.411163 0.665070 0.211456 -0.436584 0.671478 0.216553 -0.461945 0.677765 0.221680 -0.487549 0.683899 0.226685 -0.513947 0.690063 0.231842 -0.540924 0.696289 0.237030 -0.568146 0.702209 0.242065 -0.595703 0.708313 0.247192 -0.623383 0.714386 0.252411 -0.650726 0.720184 0.257477 -0.677979 0.726135 0.262665 -0.704681 0.731842 0.267700 -0.731079 0.737640 0.272858 -0.756897 0.743378 0.278015 -0.781921 0.748871 0.282990 -0.806458 0.754486 0.288086 -0.830261 0.759918 0.293121 -0.853088 0.765228 0.298004 -0.875214 0.770538 0.303040 -0.896393 0.775818 0.308014 -0.916382 0.780853 0.312805 -0.935394 0.785919 0.317657 -0.177734 0.636597 0.172272 -0.200012 0.643005 0.177063 -0.222900 0.649261 0.181763 -0.246613 0.655670 0.186615 -0.270935 0.661987 0.191528 -0.295502 0.668243 0.196411 -0.320557 0.674591 0.201324 -0.345947 0.680847 0.206421 -0.371277 0.687042 0.211365 -0.396881 0.693298 0.216461 -0.422211 0.699310 0.221436 -0.447601 0.705566 0.226562 -0.472992 0.711670 0.231720 -0.498840 0.717651 0.236755 -0.525452 0.723724 0.241943 -0.552551 0.729675 0.247070 -0.579865 0.735474 0.252197 -0.607452 0.741394 0.257355 -0.634979 0.747192 0.262543 -0.662231 0.752808 0.267517 -0.689270 0.758484 0.272736 -0.715668 0.763977 0.277740 -0.741791 0.769592 0.282867 -0.767303 0.775024 0.287964 -0.792023 0.780273 0.292877 -0.816193 0.785614 0.297913 -0.839630 0.790863 0.302917 -0.862030 0.795898 0.307770 -0.883698 0.800934 0.312653 -0.904327 0.805939 0.317505 -0.923859 0.810699 0.322205 -0.942352 0.815491 0.326996 -0.187286 0.671326 0.181610 -0.209930 0.677643 0.186493 -0.233154 0.683838 0.191284 -0.257111 0.690063 0.196259 -0.281586 0.696381 0.201233 -0.306335 0.702484 0.206146 -0.331573 0.708679 0.211212 -0.356812 0.714661 0.216187 -0.382324 0.720825 0.221313 -0.407928 0.726959 0.226440 -0.433197 0.732849 0.231445 -0.458466 0.738861 0.236633 -0.484070 0.744781 0.241821 -0.510101 0.750610 0.246857 -0.536957 0.756378 0.252075 -0.564178 0.762207 0.257233 -0.591522 0.767822 0.262238 -0.619080 0.773438 0.267456 -0.646362 0.778900 0.272491 -0.673492 0.784393 0.277618 -0.700317 0.789886 0.282745 -0.726471 0.795135 0.287689 -0.752228 0.800415 0.292755 -0.777435 0.805573 0.297791 -0.801819 0.810608 0.302643 -0.825623 0.815643 0.307617 -0.848572 0.820587 0.312531 -0.870575 0.825317 0.317291 -0.891785 0.830078 0.322083 -0.911835 0.834656 0.326721 -0.931000 0.839264 0.331451 -0.948975 0.843719 0.336090 -0.197021 0.705475 0.191162 -0.220001 0.711670 0.196136 -0.243500 0.717712 0.200989 -0.267700 0.723907 0.206024 -0.292358 0.730011 0.211090 -0.317261 0.735901 0.216034 -0.342529 0.742004 0.221161 -0.367859 0.747833 0.226196 -0.393372 0.753815 0.231323 -0.418793 0.759705 0.236511 -0.444061 0.765442 0.241547 -0.469299 0.771210 0.246735 -0.495148 0.776947 0.251892 -0.521454 0.782501 0.256989 -0.548431 0.788116 0.262146 -0.575684 0.793671 0.267303 -0.603058 0.799011 0.272339 -0.630493 0.804382 0.277496 -0.657623 0.809631 0.282471 -0.684570 0.814880 0.287567 -0.711121 0.820038 0.292633 -0.736969 0.825012 0.297546 -0.762482 0.829956 0.302551 -0.787292 0.834869 0.307495 -0.811310 0.839630 0.312317 -0.834656 0.844360 0.317169 -0.857239 0.848999 0.321960 -0.878876 0.853424 0.326630 -0.899536 0.857880 0.331329 -0.919189 0.862122 0.335876 -0.937805 0.866394 0.340454 -0.955231 0.870514 0.344971 -0.206909 0.738922 0.200867 -0.230225 0.744965 0.205902 -0.253906 0.750885 0.210815 -0.278381 0.756866 0.215912 -0.303040 0.762634 0.220917 -0.328186 0.768555 0.226074 -0.353546 0.774414 0.231171 -0.378815 0.780029 0.236237 -0.404297 0.785797 0.241425 -0.429718 0.791504 0.246613 -0.454803 0.796967 0.251648 -0.480194 0.802551 0.256836 -0.506287 0.808044 0.262024 -0.532776 0.813324 0.267059 -0.559814 0.818665 0.272217 -0.586975 0.823853 0.277252 -0.614349 0.829041 0.282349 -0.641724 0.834167 0.287445 -0.668671 0.839050 0.292389 -0.695343 0.843994 0.297424 -0.721649 0.848877 0.302429 -0.747223 0.853516 0.307220 -0.772339 0.858215 0.312195 -0.796783 0.862823 0.317017 -0.820435 0.867249 0.321747 -0.843445 0.871643 0.326508 -0.865479 0.875854 0.331085 -0.886688 0.880066 0.335754 -0.906952 0.884186 0.340363 -0.926117 0.888123 0.344727 -0.944183 0.892029 0.349182 -0.961121 0.895813 0.353546 -0.216949 0.771515 0.210693 -0.240509 0.777374 0.215790 -0.264435 0.783051 0.220825 -0.289001 0.788849 0.225891 -0.313843 0.794464 0.230927 -0.339050 0.800140 0.236115 -0.364471 0.805725 0.241272 -0.389740 0.811188 0.246338 -0.415131 0.816681 0.251556 -0.440430 0.822144 0.256714 -0.465424 0.827362 0.261749 -0.491028 0.832672 0.266937 -0.517365 0.837860 0.272095 -0.543945 0.842834 0.277100 -0.571106 0.847900 0.282227 -0.598236 0.852783 0.287201 -0.625580 0.857697 0.292267 -0.652710 0.862518 0.297272 -0.679443 0.867096 0.302185 -0.705872 0.871735 0.307129 -0.731812 0.876282 0.312042 -0.757111 0.880646 0.316772 -0.781891 0.885010 0.321625 -0.806000 0.889282 0.326416 -0.829254 0.893311 0.330994 -0.851807 0.897400 0.335602 -0.873444 0.901245 0.340088 -0.894196 0.905121 0.344604 -0.914032 0.908936 0.349091 -0.932617 0.912445 0.353333 -0.950256 0.916046 0.357635 -0.966614 0.919495 0.361847 -0.227081 0.803070 0.220642 -0.250732 0.808594 0.225677 -0.275024 0.814209 0.230774 -0.299744 0.819794 0.235992 -0.324646 0.825104 0.240997 -0.349915 0.830566 0.246216 -0.375275 0.835876 0.251404 -0.400574 0.841095 0.256470 -0.425842 0.846313 0.261627 -0.451019 0.851440 0.266785 -0.476105 0.856384 0.271820 -0.501984 0.861359 0.276978 -0.528229 0.866211 0.281982 -0.555115 0.871033 0.287048 -0.582184 0.875763 0.292145 -0.609314 0.880280 0.297028 -0.636536 0.884888 0.302063 -0.663513 0.889374 0.307007 -0.689941 0.893616 0.311798 -0.716125 0.897949 0.316681 -0.741760 0.902130 0.321503 -0.766724 0.906158 0.326141 -0.791107 0.910187 0.330872 -0.814728 0.913940 0.335419 -0.837677 0.917816 0.339996 -0.859894 0.921509 0.344513 -0.881042 0.925018 0.348846 -0.901367 0.928528 0.353210 -0.920685 0.931976 0.357544 -0.938843 0.935150 0.361603 -0.955933 0.938354 0.365753 -0.971771 0.941467 0.369812 -0.237274 0.833466 0.230682 -0.261139 0.838745 0.235718 -0.285583 0.844147 0.240906 -0.310425 0.849365 0.246063 -0.335388 0.854492 0.251129 -0.360687 0.859650 0.256287 -0.386047 0.864746 0.261505 -0.411224 0.869568 0.266541 -0.436401 0.874542 0.271729 -0.461456 0.879333 0.276825 -0.486755 0.884003 0.281860 -0.512756 0.888641 0.286926 -0.539154 0.893097 0.291870 -0.566010 0.897644 0.296906 -0.593109 0.902008 0.301910 -0.620209 0.906219 0.306763 -0.647186 0.910461 0.311676 -0.673950 0.914581 0.316559 -0.700195 0.918518 0.321259 -0.726013 0.922485 0.326050 -0.751343 0.926300 0.330750 -0.775970 0.929962 0.335297 -0.799988 0.933563 0.339874 -0.823242 0.937042 0.344299 -0.845795 0.940491 0.348724 -0.867554 0.943848 0.353119 -0.888275 0.946960 0.357300 -0.908112 0.950134 0.361511 -0.926971 0.953186 0.365662 -0.944641 0.956055 0.369568 -0.961243 0.958862 0.373535 -0.976593 0.961639 0.377441 -0.247498 0.862610 0.240753 -0.271545 0.867584 0.245819 -0.296112 0.872650 0.251007 -0.321075 0.877594 0.256165 -0.346069 0.882416 0.261230 -0.371338 0.887238 0.266357 -0.396667 0.892029 0.271576 -0.421753 0.896545 0.276581 -0.446777 0.901154 0.281708 -0.471680 0.905518 0.286682 -0.497253 0.909943 0.291748 -0.523499 0.914276 0.296783 -0.549957 0.918396 0.301666 -0.576843 0.922516 0.306610 -0.603851 0.926575 0.311554 -0.630798 0.930420 0.316315 -0.657623 0.934265 0.321136 -0.684143 0.938049 0.325928 -0.710052 0.941620 0.330505 -0.735596 0.945190 0.335205 -0.760559 0.948639 0.339752 -0.784821 0.951904 0.344147 -0.808533 0.955200 0.348633 -0.831360 0.958252 0.352875 -0.853516 0.961334 0.357178 -0.874817 0.964294 0.361420 -0.895142 0.967133 0.365448 -0.914551 0.969849 0.369476 -0.932922 0.972534 0.373474 -0.950073 0.975037 0.377228 -0.966156 0.977509 0.381012 -0.981049 0.979858 0.384674 -0.035858 0.035675 0.046478 -0.048645 0.036713 0.047729 -0.061340 0.037842 0.049103 -0.074463 0.039032 0.050446 -0.088470 0.040314 0.051971 -0.103577 0.041656 0.053497 -0.119904 0.043060 0.055115 -0.137329 0.044586 0.056793 -0.155823 0.046112 0.058563 -0.175140 0.047668 0.060364 -0.195312 0.049347 0.062256 -0.216278 0.051086 0.064240 -0.237854 0.052856 0.066284 -0.260101 0.054688 0.068359 -0.282806 0.056580 0.070526 -0.306000 0.058563 0.072784 -0.329590 0.060608 0.075134 -0.353363 0.062683 0.077515 -0.377472 0.064850 0.080017 -0.401642 0.067139 0.082611 -0.425781 0.069366 0.085236 -0.449982 0.071747 0.088013 -0.474274 0.074249 0.090851 -0.499268 0.076721 0.093719 -0.524902 0.079315 0.096741 -0.551025 0.081940 0.099823 -0.577728 0.084747 0.103088 -0.604645 0.087616 0.106415 -0.631439 0.090454 0.109741 -0.658447 0.093506 0.113281 -0.685211 0.096649 0.116882 -0.711487 0.099792 0.120483 -0.038666 0.047180 0.049042 -0.051483 0.048431 0.050415 -0.064362 0.049774 0.051941 -0.077789 0.051147 0.053436 -0.092194 0.052612 0.055084 -0.107788 0.054138 0.056763 -0.124481 0.055695 0.058472 -0.142365 0.057404 0.060333 -0.161255 0.059113 0.062225 -0.180969 0.060883 0.064148 -0.201599 0.062744 0.066223 -0.222839 0.064636 0.068268 -0.244812 0.066681 0.070435 -0.267395 0.068756 0.072723 -0.290375 0.070831 0.075012 -0.313873 0.073059 0.077423 -0.337738 0.075378 0.079956 -0.361694 0.077698 0.082489 -0.385986 0.080139 0.085144 -0.410339 0.082672 0.087891 -0.434570 0.085266 0.090698 -0.458862 0.087952 0.093628 -0.483521 0.090759 0.096680 -0.508850 0.093567 0.099762 -0.534882 0.096558 0.103027 -0.561279 0.099548 0.106262 -0.588165 0.102722 0.109680 -0.615234 0.105988 0.113190 -0.642242 0.109222 0.116699 -0.669189 0.112671 0.120392 -0.695892 0.116211 0.124146 -0.722107 0.119720 0.127960 -0.041718 0.059540 0.051819 -0.054596 0.061005 0.053406 -0.067719 0.062531 0.055023 -0.081451 0.064056 0.056671 -0.096283 0.065765 0.058441 -0.112305 0.067505 0.060272 -0.129517 0.069275 0.062134 -0.147827 0.071198 0.064087 -0.167145 0.073181 0.066162 -0.187256 0.075165 0.068207 -0.208221 0.077271 0.070374 -0.229858 0.079437 0.072632 -0.252197 0.081696 0.074951 -0.275055 0.084106 0.077362 -0.298309 0.086487 0.079834 -0.322083 0.089020 0.082428 -0.346222 0.091644 0.085052 -0.370392 0.094299 0.087769 -0.394775 0.097107 0.090607 -0.419250 0.100037 0.093567 -0.443634 0.102966 0.096527 -0.468018 0.106049 0.099670 -0.493042 0.109131 0.102844 -0.518799 0.112457 0.106201 -0.545166 0.115784 0.109589 -0.571808 0.119171 0.113037 -0.598877 0.122711 0.116638 -0.626099 0.126343 0.120300 -0.653137 0.130005 0.123993 -0.680115 0.133820 0.127869 -0.706787 0.137726 0.131836 -0.732880 0.141571 0.135773 -0.044983 0.072876 0.054932 -0.058014 0.074585 0.056641 -0.071350 0.076355 0.058411 -0.085449 0.078156 0.060181 -0.100769 0.080078 0.062073 -0.117279 0.082092 0.064056 -0.134949 0.084167 0.066040 -0.153687 0.086334 0.068176 -0.173309 0.088531 0.070282 -0.193939 0.090881 0.072571 -0.215302 0.093323 0.074890 -0.237274 0.095795 0.077240 -0.259918 0.098419 0.079742 -0.283142 0.101135 0.082336 -0.306610 0.103882 0.084930 -0.330658 0.106812 0.087677 -0.354980 0.109833 0.090546 -0.379333 0.112823 0.093445 -0.403839 0.116058 0.096466 -0.428497 0.119324 0.099609 -0.452881 0.122620 0.102753 -0.477600 0.126099 0.106079 -0.502991 0.129578 0.109375 -0.529083 0.133240 0.112946 -0.555725 0.136963 0.116516 -0.582642 0.140686 0.120117 -0.609833 0.144623 0.123901 -0.637146 0.148590 0.127777 -0.664185 0.152588 0.131622 -0.691162 0.156769 0.135681 -0.717682 0.161011 0.139832 -0.743683 0.165192 0.143860 -0.048462 0.087555 0.058289 -0.061615 0.089508 0.060120 -0.075317 0.091553 0.062042 -0.089813 0.093658 0.063965 -0.105560 0.095917 0.066010 -0.122620 0.098267 0.068115 -0.140717 0.100647 0.070221 -0.159943 0.103210 0.072510 -0.179993 0.105713 0.074768 -0.200989 0.108429 0.077209 -0.222748 0.111237 0.079712 -0.245056 0.114044 0.082214 -0.268005 0.117065 0.084869 -0.291473 0.120148 0.087616 -0.315308 0.123260 0.090393 -0.339569 0.126526 0.093353 -0.364075 0.129944 0.096405 -0.388580 0.133301 0.099457 -0.413269 0.136871 0.102692 -0.437836 0.140442 0.105865 -0.462402 0.144165 0.109314 -0.487549 0.147980 0.112823 -0.513245 0.151794 0.116333 -0.539703 0.155823 0.120056 -0.566589 0.159882 0.123779 -0.593689 0.163971 0.127563 -0.621002 0.168213 0.131561 -0.648407 0.172516 0.135590 -0.675415 0.176819 0.139618 -0.702240 0.181305 0.143799 -0.728546 0.185699 0.147949 -0.754547 0.190338 0.152313 -0.052185 0.103851 0.061951 -0.065582 0.106171 0.063904 -0.079590 0.108582 0.065948 -0.094543 0.111023 0.068024 -0.110809 0.113586 0.070160 -0.128296 0.116241 0.072388 -0.146912 0.118988 0.074707 -0.166565 0.121887 0.077148 -0.187042 0.124786 0.079559 -0.208435 0.127838 0.082153 -0.230530 0.131042 0.084839 -0.253143 0.134186 0.087494 -0.276459 0.137543 0.090363 -0.300201 0.141022 0.093292 -0.324280 0.144440 0.096222 -0.348724 0.148071 0.099365 -0.373413 0.151794 0.102600 -0.398102 0.155518 0.105804 -0.422882 0.159424 0.109222 -0.447510 0.163330 0.112640 -0.472260 0.167389 0.116241 -0.497803 0.171539 0.119965 -0.523895 0.175690 0.123596 -0.550598 0.179993 0.127472 -0.577728 0.184387 0.131409 -0.604919 0.188782 0.135345 -0.632385 0.193298 0.139496 -0.659760 0.197937 0.143677 -0.686676 0.202515 0.147858 -0.713470 0.207275 0.152191 -0.739624 0.211975 0.156525 -0.765472 0.216858 0.161041 -0.056183 0.121948 0.065826 -0.069794 0.124603 0.067963 -0.084198 0.127350 0.070099 -0.099640 0.130096 0.072327 -0.116425 0.133057 0.074677 -0.134369 0.136047 0.077026 -0.153473 0.139130 0.079498 -0.173553 0.142365 0.082092 -0.194458 0.145599 0.084656 -0.216248 0.149017 0.087433 -0.238708 0.152527 0.090271 -0.261688 0.156036 0.093109 -0.285248 0.159729 0.096161 -0.309235 0.163513 0.099274 -0.333527 0.167297 0.102448 -0.358215 0.171234 0.105713 -0.382904 0.175232 0.109039 -0.407806 0.179321 0.112549 -0.432648 0.183563 0.116150 -0.457336 0.187775 0.119751 -0.482483 0.192139 0.123505 -0.508362 0.196594 0.127380 -0.534729 0.201080 0.131226 -0.561707 0.205627 0.135223 -0.589050 0.210358 0.139374 -0.616364 0.214935 0.143463 -0.643890 0.219788 0.147736 -0.671082 0.224548 0.152008 -0.698059 0.229492 0.156403 -0.724731 0.234497 0.160889 -0.750702 0.239410 0.165344 -0.776306 0.244537 0.169983 -0.060425 0.141754 0.070007 -0.074341 0.144775 0.072296 -0.089111 0.147827 0.074615 -0.105103 0.150940 0.076965 -0.122406 0.154175 0.079437 -0.140839 0.157440 0.081940 -0.160400 0.160980 0.084625 -0.180908 0.164459 0.087341 -0.202240 0.168060 0.090118 -0.224365 0.171783 0.093048 -0.247162 0.175629 0.096069 -0.270477 0.179474 0.099121 -0.294312 0.183441 0.102325 -0.318512 0.187500 0.105560 -0.343109 0.191650 0.108978 -0.367950 0.195953 0.112488 -0.392792 0.200195 0.115936 -0.417725 0.204590 0.119659 -0.442688 0.209137 0.123413 -0.467468 0.213623 0.127197 -0.493011 0.218231 0.131104 -0.519196 0.222992 0.135162 -0.545837 0.227692 0.139160 -0.573059 0.232574 0.143372 -0.600586 0.237488 0.147644 -0.627960 0.242401 0.151917 -0.655487 0.247437 0.156311 -0.682648 0.252380 0.160675 -0.709534 0.257599 0.165253 -0.735962 0.262817 0.169891 -0.761780 0.267944 0.174469 -0.787170 0.273285 0.179199 -0.064880 0.163177 0.074493 -0.079132 0.166504 0.076874 -0.094330 0.169800 0.079315 -0.110931 0.173279 0.081879 -0.128784 0.176880 0.084564 -0.147675 0.180481 0.087219 -0.167755 0.184265 0.090057 -0.188690 0.188141 0.093018 -0.210388 0.192017 0.095947 -0.232849 0.196075 0.099030 -0.256042 0.200226 0.102234 -0.279572 0.204346 0.105469 -0.303711 0.208618 0.108887 -0.328125 0.212921 0.112274 -0.352905 0.217407 0.115875 -0.377899 0.221954 0.119568 -0.402802 0.226440 0.123230 -0.427887 0.231171 0.127106 -0.452850 0.235962 0.131042 -0.477875 0.240692 0.134949 -0.503754 0.245575 0.139069 -0.530304 0.250580 0.143280 -0.557220 0.255493 0.147400 -0.584625 0.260620 0.151764 -0.612061 0.265594 0.156097 -0.639679 0.270844 0.160583 -0.667145 0.276093 0.165131 -0.694183 0.281281 0.169647 -0.720917 0.286621 0.174347 -0.747223 0.292023 0.179108 -0.772827 0.297302 0.183807 -0.797974 0.302765 0.188690 -0.069611 0.186096 0.079254 -0.084259 0.189728 0.081818 -0.099976 0.193329 0.084412 -0.117157 0.197113 0.087128 -0.135498 0.201080 0.089996 -0.154907 0.204956 0.092834 -0.175415 0.209015 0.095886 -0.196808 0.213196 0.098969 -0.218842 0.217346 0.102081 -0.241699 0.221680 0.105377 -0.265167 0.226074 0.108795 -0.288971 0.230499 0.112183 -0.313354 0.235077 0.115784 -0.338013 0.239594 0.119354 -0.362976 0.244354 0.123138 -0.388031 0.249176 0.126984 -0.413086 0.253876 0.130829 -0.438202 0.258911 0.134827 -0.463196 0.263855 0.138947 -0.488617 0.268829 0.143066 -0.514862 0.273956 0.147308 -0.541656 0.279175 0.151642 -0.568817 0.284241 0.155975 -0.596375 0.289581 0.160461 -0.623871 0.294769 0.164917 -0.651489 0.300140 0.169525 -0.678864 0.305573 0.174194 -0.705750 0.310883 0.178894 -0.732330 0.316406 0.183655 -0.758392 0.321960 0.188538 -0.783783 0.327362 0.193298 -0.808685 0.332977 0.198303 -0.074646 0.210388 0.084351 -0.089722 0.214264 0.087067 -0.106049 0.218201 0.089813 -0.123749 0.222260 0.092773 -0.142639 0.226440 0.095795 -0.162537 0.230652 0.098816 -0.183441 0.235016 0.101990 -0.205231 0.239441 0.105316 -0.227631 0.243866 0.108612 -0.250885 0.248474 0.112091 -0.274475 0.253052 0.115601 -0.298706 0.257812 0.119293 -0.323334 0.262634 0.123047 -0.348083 0.267426 0.126801 -0.373199 0.272400 0.130707 -0.398376 0.277405 0.134766 -0.423492 0.282379 0.138763 -0.448608 0.287537 0.142944 -0.473785 0.292755 0.147186 -0.499573 0.297852 0.151428 -0.526154 0.303192 0.155884 -0.553101 0.308441 0.160217 -0.580475 0.313812 0.164795 -0.608185 0.319275 0.169403 -0.635773 0.324677 0.173981 -0.663330 0.330139 0.178741 -0.690582 0.335724 0.183533 -0.717285 0.341156 0.188324 -0.743744 0.346771 0.193207 -0.769623 0.352386 0.198181 -0.794678 0.357880 0.203064 -0.819275 0.363556 0.208099 -0.079956 0.235901 0.089752 -0.095581 0.240051 0.092682 -0.112488 0.244263 0.095642 -0.130707 0.248627 0.098724 -0.150146 0.253052 0.101929 -0.170441 0.257538 0.105133 -0.191803 0.262085 0.108551 -0.213989 0.266815 0.112030 -0.236786 0.271484 0.115509 -0.260254 0.276306 0.119171 -0.284149 0.281067 0.122803 -0.308655 0.286072 0.126678 -0.333466 0.291138 0.130615 -0.358398 0.296112 0.134552 -0.383667 0.301270 0.138672 -0.408875 0.306488 0.142822 -0.434021 0.311615 0.147003 -0.459198 0.316956 0.151337 -0.484650 0.322388 0.155731 -0.510773 0.327637 0.160126 -0.537598 0.333130 0.164703 -0.564789 0.338470 0.169189 -0.592377 0.344055 0.173859 -0.620148 0.349609 0.178619 -0.647705 0.355072 0.183350 -0.675171 0.360687 0.188141 -0.702271 0.366333 0.193054 -0.728851 0.371826 0.197937 -0.755005 0.377502 0.202911 -0.780640 0.383148 0.207977 -0.805481 0.388733 0.212952 -0.829742 0.394440 0.218048 -0.085602 0.262543 0.095551 -0.101776 0.266968 0.098663 -0.119232 0.271423 0.101746 -0.138000 0.276001 0.105042 -0.157928 0.280701 0.108459 -0.178741 0.285339 0.111847 -0.200470 0.290222 0.115417 -0.222900 0.294983 0.118988 -0.246124 0.299988 0.122742 -0.269958 0.305054 0.126587 -0.294128 0.310028 0.130432 -0.318817 0.315186 0.134460 -0.343811 0.320435 0.138550 -0.368896 0.325592 0.142639 -0.394226 0.330933 0.146912 -0.419556 0.336304 0.151245 -0.444672 0.341583 0.155518 -0.469910 0.347107 0.160034 -0.495789 0.352570 0.164551 -0.522217 0.357971 0.169098 -0.549316 0.363556 0.173737 -0.576630 0.369049 0.178375 -0.604370 0.374664 0.183197 -0.632141 0.380310 0.188019 -0.659668 0.385803 0.192841 -0.687012 0.391479 0.197815 -0.713959 0.397186 0.202820 -0.740265 0.402710 0.207703 -0.766235 0.408417 0.212799 -0.791443 0.414001 0.217773 -0.816132 0.419678 0.222961 -0.839996 0.425323 0.228119 -0.091583 0.290161 0.101685 -0.108368 0.294830 0.104950 -0.126404 0.299500 0.108307 -0.145721 0.304321 0.111755 -0.166077 0.309204 0.115356 -0.187286 0.314087 0.118896 -0.209473 0.319153 0.122650 -0.232269 0.324127 0.126404 -0.255829 0.329285 0.130310 -0.279877 0.334534 0.134369 -0.304291 0.339661 0.138336 -0.329193 0.344971 0.142548 -0.354370 0.350342 0.146790 -0.379578 0.355682 0.151001 -0.404907 0.361145 0.155396 -0.430267 0.366638 0.159882 -0.455414 0.372040 0.164337 -0.480896 0.377594 0.168945 -0.506958 0.383026 0.173523 -0.533844 0.388641 0.178284 -0.561127 0.394318 0.183105 -0.588593 0.399841 0.187775 -0.616364 0.405487 0.192719 -0.644165 0.411194 0.197693 -0.671539 0.416718 0.202545 -0.698730 0.422424 0.207581 -0.725464 0.428101 0.212708 -0.751678 0.433685 0.217682 -0.777344 0.439362 0.222839 -0.802246 0.444977 0.227875 -0.826569 0.450745 0.233093 -0.850128 0.456573 0.238312 -0.097931 0.318634 0.108215 -0.115295 0.323547 0.111664 -0.133881 0.328339 0.115143 -0.153687 0.333405 0.118805 -0.174469 0.338348 0.122467 -0.196198 0.343536 0.126312 -0.218750 0.348724 0.130219 -0.241882 0.353882 0.134155 -0.265747 0.359192 0.138245 -0.290070 0.364563 0.142426 -0.314667 0.369812 0.146576 -0.339783 0.375244 0.150879 -0.365051 0.380737 0.155304 -0.390320 0.386139 0.159637 -0.415741 0.391693 0.164215 -0.440948 0.397095 0.168732 -0.466278 0.402710 0.173401 -0.492096 0.408356 0.178162 -0.518463 0.413849 0.182831 -0.545593 0.419556 0.187714 -0.573090 0.425171 0.192566 -0.600708 0.430756 0.197418 -0.628510 0.436432 0.202423 -0.656158 0.442139 0.207489 -0.683472 0.447784 0.212433 -0.710449 0.453583 0.217529 -0.737000 0.459503 0.222717 -0.762848 0.465210 0.227753 -0.788300 0.471161 0.232971 -0.812866 0.476990 0.238037 -0.836884 0.482971 0.243286 -0.860016 0.488953 0.248535 -0.104614 0.347809 0.115082 -0.122620 0.352844 0.118713 -0.141724 0.357849 0.122406 -0.162048 0.363037 0.126221 -0.183197 0.368164 0.130035 -0.205383 0.373474 0.134064 -0.228241 0.378784 0.138123 -0.251709 0.384033 0.142181 -0.275848 0.389465 0.146454 -0.300415 0.394897 0.150787 -0.325256 0.400299 0.155090 -0.350464 0.405792 0.159546 -0.375885 0.411377 0.164093 -0.401215 0.416809 0.168579 -0.426666 0.422424 0.173279 -0.451843 0.427887 0.177887 -0.477325 0.433563 0.182739 -0.503540 0.439240 0.187531 -0.530182 0.444824 0.192322 -0.557495 0.450592 0.197296 -0.585083 0.456421 0.202301 -0.612762 0.462158 0.207184 -0.640533 0.468079 0.212311 -0.668121 0.474091 0.217377 -0.695221 0.479950 0.222412 -0.722076 0.485992 0.227600 -0.748230 0.491882 0.232697 -0.773987 0.498016 0.237885 -0.799042 0.504089 0.243134 -0.823334 0.510040 0.248291 -0.846924 0.516174 0.253540 -0.869690 0.522308 0.258850 -0.111725 0.377502 0.122284 -0.130249 0.382721 0.126099 -0.149902 0.387817 0.129944 -0.170685 0.393127 0.133972 -0.192261 0.398346 0.137909 -0.214813 0.403748 0.142120 -0.238098 0.409241 0.146362 -0.261841 0.414520 0.150604 -0.286163 0.420013 0.154968 -0.311005 0.425537 0.159454 -0.335968 0.430969 0.163879 -0.361359 0.436523 0.168488 -0.386810 0.442169 0.173157 -0.412170 0.447754 0.177795 -0.437592 0.453552 0.182587 -0.462769 0.459229 0.187286 -0.488617 0.465118 0.192200 -0.515106 0.471039 0.197144 -0.541992 0.476868 0.202057 -0.569458 0.482880 0.207092 -0.597168 0.488953 0.212158 -0.624817 0.494904 0.217163 -0.652618 0.501038 0.222290 -0.680023 0.507172 0.227478 -0.706909 0.513184 0.232574 -0.733490 0.519379 0.237762 -0.759460 0.525482 0.242889 -0.784912 0.531708 0.248138 -0.809692 0.537933 0.253418 -0.833557 0.543976 0.258545 -0.856781 0.550171 0.263824 -0.879089 0.556427 0.269104 -0.119141 0.407532 0.129852 -0.138245 0.412842 0.133850 -0.158356 0.418060 0.137817 -0.179626 0.423462 0.141998 -0.201630 0.428741 0.146149 -0.224518 0.434235 0.150452 -0.248077 0.439758 0.154877 -0.272125 0.445190 0.159180 -0.296722 0.450806 0.163757 -0.321716 0.456573 0.168365 -0.346832 0.462219 0.172943 -0.372314 0.468048 0.177673 -0.397827 0.473969 0.182465 -0.423187 0.479828 0.187164 -0.448578 0.485840 0.192078 -0.473877 0.491760 0.196930 -0.500031 0.497925 0.201935 -0.526794 0.504028 0.206909 -0.553894 0.510040 0.211914 -0.581512 0.516266 0.217041 -0.609283 0.522491 0.222198 -0.636932 0.528595 0.227203 -0.664490 0.534851 0.232452 -0.691772 0.541168 0.237640 -0.718506 0.547302 0.242737 -0.744843 0.553589 0.248047 -0.770477 0.559723 0.253174 -0.795624 0.565979 0.258423 -0.820038 0.572266 0.263702 -0.843597 0.578369 0.268829 -0.866394 0.584564 0.274139 -0.888275 0.590790 0.279419 -0.126862 0.437744 0.137726 -0.146393 0.443054 0.141754 -0.167145 0.448578 0.146057 -0.188812 0.454163 0.150330 -0.211212 0.459717 0.154663 -0.234467 0.465424 0.159088 -0.258301 0.471252 0.163666 -0.282593 0.476990 0.168121 -0.307404 0.482941 0.172821 -0.332581 0.488892 0.177551 -0.357819 0.494812 0.182220 -0.383331 0.500885 0.187073 -0.408752 0.506866 0.191833 -0.434235 0.513031 0.196808 -0.459595 0.519226 0.201782 -0.485077 0.525391 0.206696 -0.511627 0.531677 0.211792 -0.538544 0.537964 0.216888 -0.565887 0.544128 0.221924 -0.593597 0.550507 0.227081 -0.621368 0.556824 0.232269 -0.648895 0.563019 0.237366 -0.676392 0.569305 0.242615 -0.703308 0.575562 0.247772 -0.729950 0.581879 0.253052 -0.756012 0.588196 0.258301 -0.781342 0.594360 0.263428 -0.806152 0.600647 0.268707 -0.830231 0.606903 0.274017 -0.853363 0.612946 0.279114 -0.875732 0.619141 0.284393 -0.897125 0.625244 0.289612 -0.134949 0.468933 0.145905 -0.154999 0.474518 0.150146 -0.176178 0.480316 0.154541 -0.198242 0.486206 0.158966 -0.221008 0.491974 0.163422 -0.244568 0.498016 0.167999 -0.268707 0.504028 0.172699 -0.293182 0.510010 0.177307 -0.318207 0.516113 0.182129 -0.343536 0.522339 0.186981 -0.368835 0.528412 0.191742 -0.394440 0.534698 0.196655 -0.419800 0.540833 0.201538 -0.445221 0.547211 0.206604 -0.470673 0.553528 0.211670 -0.496552 0.559784 0.216614 -0.523285 0.566132 0.221802 -0.550446 0.572540 0.226959 -0.577881 0.578796 0.232025 -0.605591 0.585175 0.237244 -0.633362 0.591553 0.242493 -0.660797 0.597778 0.247650 -0.688049 0.604156 0.252899 -0.714783 0.610352 0.257996 -0.741150 0.616669 0.263275 -0.766937 0.622925 0.268585 -0.791962 0.629028 0.273743 -0.816437 0.635223 0.278992 -0.840088 0.641388 0.284210 -0.862823 0.647339 0.289337 -0.884796 0.653412 0.294556 -0.905670 0.659393 0.299774 -0.143372 0.501404 0.154419 -0.163879 0.507233 0.158783 -0.185486 0.513306 0.163300 -0.207977 0.519379 0.167877 -0.231079 0.525421 0.172455 -0.254913 0.531586 0.177185 -0.279297 0.537842 0.182007 -0.303986 0.543945 0.186707 -0.329163 0.550293 0.191620 -0.354431 0.556488 0.196442 -0.379974 0.562836 0.201416 -0.405518 0.569244 0.206451 -0.430939 0.575500 0.211395 -0.456238 0.581909 0.216492 -0.481873 0.588348 0.221680 -0.508087 0.594666 0.226685 -0.535004 0.601044 0.231873 -0.562347 0.607483 0.237122 -0.589844 0.613708 0.242218 -0.617615 0.620087 0.247467 -0.645294 0.626465 0.252777 -0.672546 0.632568 0.257904 -0.699677 0.638885 0.263184 -0.726135 0.645020 0.268280 -0.752197 0.651245 0.273590 -0.777649 0.657410 0.278870 -0.802368 0.663391 0.283966 -0.826416 0.669403 0.289185 -0.849762 0.675415 0.294434 -0.872040 0.681213 0.299500 -0.893494 0.687103 0.304657 -0.913940 0.692902 0.309784 -0.152039 0.534912 0.163208 -0.173004 0.540985 0.167694 -0.195038 0.547241 0.172363 -0.217865 0.553497 0.177094 -0.241302 0.559662 0.181763 -0.265411 0.565979 0.186584 -0.290039 0.572357 0.191437 -0.314850 0.578613 0.196289 -0.340179 0.585052 0.201263 -0.365509 0.591309 0.206207 -0.391083 0.597748 0.211304 -0.416626 0.604187 0.216400 -0.441956 0.610443 0.221405 -0.467285 0.616913 0.226562 -0.493256 0.623352 0.231750 -0.519714 0.629608 0.236847 -0.546814 0.636017 0.242126 -0.574280 0.642334 0.247345 -0.601807 0.648499 0.252502 -0.629486 0.654816 0.257782 -0.656921 0.660889 0.262909 -0.684265 0.667145 0.268158 -0.710999 0.673279 0.273468 -0.737213 0.679230 0.278625 -0.763000 0.685303 0.283844 -0.788177 0.691254 0.289093 -0.812531 0.697021 0.294189 -0.836212 0.702942 0.299377 -0.859070 0.708740 0.304504 -0.880981 0.714325 0.309570 -0.901947 0.719971 0.314667 -0.921783 0.725372 0.319550 -0.160950 0.569275 0.172211 -0.182373 0.575470 0.176849 -0.204773 0.581848 0.181610 -0.227997 0.588196 0.186432 -0.251648 0.594452 0.191223 -0.276001 0.600861 0.196198 -0.300690 0.607178 0.201050 -0.325867 0.613617 0.206055 -0.351227 0.620026 0.211151 -0.376617 0.626343 0.216125 -0.402222 0.632721 0.221313 -0.427704 0.639191 0.226440 -0.452942 0.645416 0.231506 -0.478455 0.651794 0.236755 -0.504669 0.658112 0.241974 -0.531342 0.664337 0.247040 -0.558594 0.670532 0.252350 -0.586182 0.676819 0.257629 -0.613708 0.682892 0.262787 -0.641296 0.688995 0.268036 -0.668579 0.694916 0.273193 -0.695618 0.700958 0.278442 -0.722168 0.706909 0.283722 -0.748108 0.712769 0.288788 -0.773560 0.718567 0.294006 -0.798401 0.724365 0.299225 -0.822388 0.729950 0.304260 -0.845703 0.735565 0.309448 -0.868164 0.741150 0.314545 -0.889526 0.746460 0.319458 -0.910034 0.751892 0.324463 -0.929413 0.757080 0.329376 -0.170135 0.604065 0.181519 -0.191956 0.610321 0.186218 -0.214752 0.616730 0.191101 -0.238251 0.623138 0.196075 -0.262207 0.629395 0.200897 -0.286774 0.635895 0.205963 -0.311554 0.642120 0.210907 -0.336853 0.648499 0.216034 -0.362366 0.654938 0.221130 -0.387726 0.661163 0.226196 -0.413300 0.667511 0.231384 -0.438782 0.673859 0.236603 -0.463898 0.679962 0.241699 -0.489716 0.686218 0.246948 -0.516144 0.692413 0.252228 -0.542999 0.698425 0.257355 -0.570374 0.704590 0.262634 -0.597870 0.710480 0.267792 -0.625458 0.716461 0.273071 -0.652954 0.722443 0.278320 -0.680023 0.728149 0.283447 -0.706848 0.734009 0.288666 -0.733154 0.739777 0.293915 -0.758759 0.745361 0.298950 -0.783875 0.750977 0.304138 -0.808350 0.756531 0.309296 -0.831940 0.761841 0.314301 -0.854828 0.767212 0.319336 -0.876709 0.772430 0.324249 -0.897797 0.777618 0.329254 -0.917847 0.782745 0.334198 -0.936676 0.787689 0.338928 -0.179535 0.638977 0.190979 -0.201752 0.645294 0.195831 -0.224884 0.651642 0.200806 -0.248505 0.657898 0.205688 -0.272827 0.664215 0.210754 -0.297577 0.670563 0.215851 -0.322540 0.676788 0.220917 -0.347900 0.683075 0.226074 -0.373444 0.689362 0.231232 -0.398834 0.695435 0.236359 -0.424316 0.701691 0.241577 -0.449677 0.707886 0.246826 -0.474945 0.713898 0.251984 -0.500977 0.719910 0.257233 -0.527557 0.725830 0.262360 -0.554657 0.731812 0.267609 -0.582123 0.737732 0.272949 -0.609558 0.743439 0.278076 -0.637054 0.749207 0.283325 -0.664429 0.754974 0.288544 -0.691284 0.760498 0.293640 -0.717804 0.766052 0.298859 -0.743835 0.771606 0.304016 -0.769104 0.776917 0.309052 -0.793915 0.782288 0.314178 -0.818054 0.787598 0.319214 -0.841248 0.792664 0.324127 -0.863708 0.797821 0.329132 -0.885162 0.802704 0.333923 -0.905701 0.807678 0.338806 -0.925262 0.812500 0.343658 -0.943573 0.817169 0.348297 -0.189148 0.673706 0.200653 -0.211700 0.679840 0.205566 -0.235168 0.686127 0.210632 -0.259003 0.692230 0.215607 -0.283539 0.698547 0.220734 -0.308472 0.704773 0.225891 -0.333496 0.710846 0.230957 -0.358948 0.716980 0.236206 -0.384491 0.723114 0.241455 -0.409851 0.729065 0.246582 -0.435303 0.735107 0.251831 -0.460541 0.741119 0.257111 -0.486053 0.746887 0.262238 -0.512329 0.752777 0.267517 -0.539032 0.758423 0.272675 -0.566254 0.764191 0.277954 -0.593750 0.769897 0.283203 -0.621094 0.775421 0.288300 -0.648560 0.780945 0.293549 -0.675690 0.786438 0.298737 -0.702271 0.791718 0.303741 -0.728516 0.797089 0.308899 -0.754242 0.802338 0.314056 -0.779205 0.807434 0.318970 -0.803650 0.812500 0.324005 -0.827240 0.817352 0.328918 -0.850159 0.822296 0.333832 -0.872192 0.827118 0.338684 -0.893219 0.831757 0.343384 -0.913330 0.836334 0.348175 -0.932343 0.840942 0.352875 -0.950073 0.845276 0.357422 -0.198822 0.707672 0.210358 -0.221802 0.713898 0.215454 -0.245514 0.720032 0.220612 -0.269592 0.726013 0.225677 -0.294281 0.732147 0.230835 -0.319336 0.738220 0.236084 -0.344543 0.744110 0.241180 -0.369995 0.750092 0.246429 -0.395508 0.756012 0.251709 -0.420837 0.761749 0.256836 -0.446136 0.767609 0.262085 -0.471252 0.773224 0.267273 -0.497162 0.778961 0.272552 -0.523682 0.784576 0.277832 -0.550507 0.790070 0.282928 -0.577759 0.795563 0.288177 -0.605255 0.801025 0.293396 -0.632538 0.806274 0.298492 -0.659790 0.811584 0.303619 -0.686646 0.816803 0.308777 -0.712982 0.821808 0.313751 -0.738983 0.826843 0.318878 -0.764374 0.831848 0.323853 -0.789032 0.836609 0.328766 -0.813080 0.841400 0.333710 -0.836273 0.845978 0.338440 -0.858795 0.850616 0.343292 -0.880341 0.855072 0.348053 -0.900940 0.859406 0.352631 -0.920532 0.863708 0.357300 -0.939056 0.867981 0.361908 -0.956299 0.871948 0.366241 -0.208710 0.741058 0.220337 -0.232025 0.747131 0.225555 -0.255981 0.753113 0.230713 -0.280273 0.758942 0.235809 -0.305115 0.764862 0.241028 -0.330292 0.770782 0.246307 -0.355499 0.776428 0.251434 -0.380920 0.782227 0.256714 -0.406372 0.787964 0.261993 -0.431671 0.793457 0.267120 -0.456879 0.799072 0.272400 -0.482147 0.804443 0.277527 -0.508270 0.809906 0.282806 -0.534912 0.815338 0.288055 -0.561859 0.820496 0.293121 -0.589172 0.825775 0.298309 -0.616516 0.830933 0.303497 -0.643707 0.835907 0.308533 -0.670776 0.840942 0.313629 -0.697388 0.845856 0.318726 -0.723480 0.850555 0.323639 -0.749115 0.855316 0.328644 -0.774109 0.859833 0.333435 -0.798492 0.864380 0.338318 -0.822205 0.868896 0.343170 -0.844940 0.873138 0.347839 -0.867004 0.877411 0.352539 -0.888214 0.881653 0.357178 -0.908234 0.885620 0.361664 -0.927399 0.889618 0.366150 -0.945404 0.893463 0.370575 -0.962128 0.897156 0.374847 -0.218750 0.773560 0.230469 -0.242340 0.779419 0.235718 -0.266479 0.785248 0.240906 -0.290955 0.790894 0.246033 -0.315918 0.796570 0.251312 -0.341187 0.802246 0.256592 -0.366394 0.807739 0.261719 -0.391815 0.813263 0.266998 -0.417084 0.818573 0.272156 -0.442383 0.824005 0.277435 -0.467499 0.829346 0.282684 -0.493042 0.834473 0.287781 -0.519348 0.839691 0.292969 -0.546143 0.844788 0.298187 -0.573090 0.849701 0.303223 -0.600433 0.854645 0.308380 -0.627686 0.859497 0.313507 -0.654663 0.864166 0.318481 -0.681519 0.868866 0.323517 -0.707886 0.873474 0.328522 -0.733643 0.877869 0.333344 -0.759003 0.882294 0.338226 -0.783539 0.886475 0.342926 -0.807617 0.890717 0.347717 -0.830933 0.894867 0.352417 -0.853333 0.898804 0.356964 -0.874939 0.902740 0.361542 -0.895660 0.906525 0.366028 -0.915192 0.910187 0.370392 -0.933868 0.913849 0.374756 -0.951355 0.917358 0.379028 -0.967590 0.920685 0.383118 -0.228912 0.805084 0.240662 -0.252716 0.810730 0.245880 -0.277039 0.816284 0.251160 -0.301666 0.821686 0.256287 -0.326721 0.827148 0.261597 -0.351990 0.832611 0.266846 -0.377197 0.837738 0.272003 -0.402618 0.843048 0.277283 -0.427765 0.848083 0.282410 -0.452881 0.853241 0.287628 -0.478119 0.858276 0.292847 -0.503906 0.863098 0.297913 -0.530334 0.868011 0.303101 -0.557220 0.872833 0.308258 -0.584229 0.877380 0.313232 -0.611450 0.882050 0.318359 -0.638611 0.886536 0.323364 -0.665375 0.890900 0.328247 -0.691895 0.895294 0.333191 -0.717957 0.899414 0.337952 -0.743500 0.903595 0.342804 -0.768524 0.907654 0.347595 -0.792725 0.911530 0.352203 -0.816406 0.915436 0.356842 -0.839294 0.919189 0.361450 -0.861267 0.922791 0.365845 -0.882477 0.926331 0.370270 -0.902740 0.929810 0.374664 -0.921844 0.933105 0.378815 -0.940002 0.936371 0.383026 -0.956909 0.939484 0.387024 -0.972656 0.942505 0.391022 -0.239136 0.835449 0.250946 -0.263153 0.840820 0.256165 -0.287628 0.846130 0.261444 -0.312347 0.851227 0.266602 -0.337433 0.856445 0.271881 -0.362732 0.861542 0.277161 -0.387939 0.866486 0.282288 -0.413269 0.871399 0.287506 -0.438263 0.876190 0.292603 -0.463348 0.880981 0.297791 -0.488770 0.885742 0.302979 -0.514679 0.890259 0.308014 -0.541229 0.894806 0.313110 -0.568176 0.899292 0.318207 -0.595093 0.903564 0.323120 -0.622253 0.907837 0.328156 -0.649231 0.912018 0.333069 -0.675812 0.915985 0.337830 -0.702118 0.920013 0.342651 -0.727783 0.923828 0.347351 -0.753052 0.927612 0.352051 -0.777679 0.931366 0.356720 -0.801575 0.934875 0.361237 -0.824860 0.938354 0.365723 -0.847321 0.941772 0.370178 -0.868866 0.945007 0.374451 -0.889618 0.948181 0.378723 -0.909393 0.951263 0.382904 -0.928070 0.954224 0.386902 -0.945740 0.957153 0.390930 -0.962158 0.959869 0.394775 -0.977386 0.962585 0.398621 -0.249390 0.864380 0.261200 -0.273560 0.869476 0.266449 -0.298157 0.874542 0.271759 -0.322968 0.879395 0.276886 -0.348083 0.884247 0.282135 -0.373230 0.888916 0.287262 -0.398529 0.893646 0.292480 -0.423737 0.898285 0.297668 -0.448639 0.902740 0.302704 -0.473633 0.907227 0.307892 -0.499329 0.911560 0.312988 -0.525360 0.915741 0.317963 -0.552002 0.919952 0.322998 -0.578857 0.924072 0.328033 -0.605774 0.927979 0.332855 -0.632751 0.931854 0.337708 -0.659454 0.935608 0.342438 -0.685913 0.939331 0.347229 -0.711884 0.942963 0.351959 -0.737244 0.946381 0.356506 -0.762207 0.949829 0.361115 -0.786469 0.953156 0.365631 -0.809998 0.956299 0.369934 -0.832855 0.959442 0.374359 -0.854950 0.962463 0.378601 -0.876099 0.965302 0.382660 -0.896393 0.968140 0.386810 -0.915619 0.970825 0.390717 -0.933899 0.973419 0.394684 -0.951111 0.976013 0.398529 -0.967041 0.978333 0.402130 -0.981812 0.980682 0.405731 -0.036346 0.036041 0.057617 -0.049164 0.037140 0.058960 -0.061859 0.038269 0.060364 -0.075073 0.039551 0.061829 -0.089172 0.040863 0.063385 -0.104279 0.042206 0.064941 -0.120728 0.043640 0.066681 -0.138275 0.045135 0.068481 -0.156769 0.046661 0.070251 -0.176178 0.048309 0.072235 -0.196442 0.049957 0.074188 -0.217438 0.051697 0.076263 -0.239166 0.053528 0.078461 -0.261414 0.055359 0.080688 -0.284241 0.057343 0.083038 -0.307465 0.059326 0.085480 -0.331024 0.061371 0.087921 -0.354980 0.063507 0.090546 -0.379059 0.065704 0.093262 -0.403198 0.067932 0.096008 -0.427429 0.070251 0.098907 -0.451599 0.072632 0.101837 -0.475922 0.075134 0.104919 -0.501038 0.077698 0.108093 -0.526703 0.080261 0.111298 -0.553040 0.082977 0.114685 -0.579681 0.085815 0.118195 -0.606476 0.088623 0.121643 -0.633545 0.091583 0.125305 -0.660492 0.094696 0.129089 -0.687103 0.097778 0.132843 -0.713531 0.101044 0.136749 -0.039246 0.047607 0.060303 -0.052063 0.048920 0.061768 -0.064941 0.050262 0.063293 -0.078461 0.051666 0.064911 -0.092926 0.053162 0.066650 -0.108582 0.054718 0.068390 -0.125427 0.056335 0.070221 -0.143372 0.057983 0.072113 -0.162292 0.059753 0.074127 -0.182190 0.061554 0.076233 -0.202789 0.063446 0.078369 -0.224182 0.065399 0.080627 -0.246216 0.067444 0.082977 -0.268738 0.069489 0.085327 -0.291901 0.071655 0.087860 -0.315399 0.073914 0.090485 -0.339203 0.076202 0.093140 -0.363373 0.078613 0.095947 -0.387634 0.081085 0.098846 -0.411896 0.083618 0.101746 -0.436249 0.086273 0.104828 -0.460480 0.088928 0.107941 -0.485229 0.091766 0.111237 -0.510742 0.094696 0.114624 -0.536713 0.097626 0.118011 -0.563293 0.100739 0.121552 -0.590179 0.103912 0.125214 -0.617188 0.107117 0.128845 -0.644287 0.110504 0.132721 -0.671173 0.113922 0.136536 -0.697845 0.117462 0.140533 -0.724182 0.121124 0.144623 -0.042328 0.060059 0.063232 -0.055237 0.061554 0.064880 -0.068359 0.063080 0.066559 -0.082214 0.064697 0.068329 -0.097107 0.066437 0.070190 -0.113190 0.068146 0.072052 -0.130524 0.069977 0.074066 -0.148834 0.071838 0.076111 -0.168243 0.073853 0.078308 -0.188507 0.075928 0.080566 -0.209473 0.078064 0.082886 -0.231232 0.080261 0.085297 -0.253662 0.082581 0.087799 -0.276489 0.084930 0.090363 -0.299896 0.087402 0.093048 -0.323700 0.089996 0.095886 -0.347748 0.092590 0.098663 -0.372070 0.095337 0.101685 -0.396423 0.098114 0.104675 -0.420929 0.101044 0.107819 -0.445343 0.104065 0.111115 -0.469757 0.107117 0.114410 -0.494873 0.110352 0.117889 -0.520782 0.113647 0.121460 -0.547058 0.117004 0.125031 -0.573883 0.120483 0.128754 -0.600983 0.124084 0.132629 -0.628052 0.127655 0.136444 -0.655243 0.131409 0.140442 -0.682068 0.135162 0.144409 -0.708740 0.139099 0.148590 -0.734924 0.143097 0.152832 -0.045654 0.073517 0.066498 -0.058685 0.075256 0.068298 -0.072021 0.076965 0.070099 -0.086273 0.078857 0.072021 -0.101562 0.080780 0.073975 -0.118195 0.082825 0.076080 -0.135986 0.084930 0.078247 -0.154785 0.087097 0.080444 -0.174591 0.089417 0.082825 -0.195251 0.091766 0.085236 -0.216583 0.094208 0.087677 -0.238739 0.096771 0.090271 -0.261475 0.099457 0.093018 -0.284607 0.102142 0.095734 -0.308289 0.104950 0.098602 -0.332214 0.107819 0.101532 -0.356567 0.110901 0.104584 -0.381042 0.114044 0.107788 -0.405548 0.117218 0.110992 -0.430145 0.120483 0.114288 -0.454712 0.123901 0.117828 -0.479370 0.127319 0.121277 -0.504944 0.130920 0.124908 -0.531128 0.134613 0.128693 -0.557709 0.138275 0.132416 -0.584747 0.142151 0.136322 -0.612000 0.146088 0.140320 -0.639130 0.150024 0.144318 -0.666351 0.154144 0.148499 -0.693176 0.158234 0.152649 -0.719696 0.162506 0.156982 -0.745758 0.166809 0.161377 -0.049194 0.088257 0.070038 -0.062408 0.090271 0.071960 -0.076050 0.092316 0.073944 -0.090698 0.094513 0.076019 -0.106506 0.096710 0.078156 -0.123627 0.099091 0.080414 -0.141876 0.101562 0.082764 -0.161102 0.104034 0.085083 -0.181335 0.106750 0.087616 -0.202393 0.109467 0.090240 -0.224121 0.112213 0.092865 -0.246552 0.115173 0.095642 -0.269592 0.118195 0.098541 -0.293030 0.121277 0.101440 -0.316986 0.124481 0.104523 -0.341187 0.127716 0.107635 -0.365692 0.131104 0.110931 -0.390350 0.134613 0.114258 -0.414948 0.138153 0.117645 -0.439667 0.141815 0.121216 -0.464294 0.145599 0.124817 -0.489380 0.149323 0.128479 -0.515289 0.153290 0.132294 -0.541779 0.157288 0.136230 -0.568512 0.161285 0.140106 -0.595825 0.165527 0.144196 -0.623047 0.169708 0.148285 -0.650452 0.174072 0.152557 -0.677582 0.178497 0.156891 -0.704254 0.182861 0.161163 -0.730682 0.187469 0.165649 -0.756653 0.192078 0.170197 -0.052979 0.104706 0.073883 -0.066315 0.106995 0.075928 -0.080383 0.109406 0.078094 -0.095459 0.111938 0.080353 -0.111816 0.114532 0.082611 -0.129425 0.117279 0.085022 -0.148132 0.120056 0.087555 -0.167786 0.122894 0.090118 -0.188416 0.125916 0.092773 -0.209900 0.128998 0.095581 -0.231934 0.132141 0.098389 -0.254791 0.135437 0.101349 -0.278015 0.138763 0.104370 -0.301849 0.142242 0.107544 -0.326050 0.145813 0.110809 -0.350403 0.149384 0.114105 -0.375122 0.153107 0.117554 -0.399933 0.156982 0.121124 -0.424591 0.160828 0.124664 -0.449371 0.164825 0.128387 -0.474243 0.168945 0.132202 -0.499725 0.173004 0.136078 -0.525970 0.177277 0.140045 -0.552704 0.181610 0.144104 -0.579712 0.185974 0.148193 -0.607117 0.190491 0.152435 -0.634430 0.194946 0.156647 -0.661804 0.199554 0.161072 -0.688873 0.204315 0.165497 -0.715424 0.208954 0.169952 -0.741760 0.213806 0.174622 -0.767548 0.218689 0.179291 -0.056976 0.122925 0.078033 -0.070557 0.125580 0.080231 -0.085022 0.128357 0.082550 -0.100647 0.131226 0.084961 -0.117462 0.134094 0.087402 -0.135559 0.137177 0.090027 -0.154785 0.140320 0.092712 -0.174896 0.143524 0.095428 -0.195923 0.146881 0.098297 -0.217773 0.150330 0.101288 -0.240173 0.153778 0.104279 -0.263306 0.157410 0.107483 -0.286865 0.161072 0.110657 -0.310974 0.164856 0.114014 -0.335327 0.168793 0.117462 -0.359924 0.172668 0.120911 -0.384766 0.176727 0.124573 -0.409698 0.180908 0.128296 -0.434479 0.185059 0.132019 -0.459290 0.189392 0.135986 -0.484467 0.193787 0.139954 -0.510284 0.198212 0.143890 -0.536835 0.202759 0.148102 -0.563721 0.207306 0.152191 -0.591095 0.212006 0.156525 -0.618591 0.216766 0.160950 -0.645996 0.221466 0.165314 -0.673279 0.226379 0.169861 -0.700256 0.231384 0.174500 -0.726715 0.236267 0.179047 -0.752838 0.241364 0.183807 -0.778412 0.246460 0.188629 -0.061249 0.142883 0.082520 -0.075134 0.145813 0.084869 -0.090057 0.148895 0.087341 -0.106201 0.152130 0.089966 -0.123505 0.155365 0.092590 -0.142151 0.158783 0.095367 -0.161804 0.162262 0.098206 -0.182312 0.165771 0.101135 -0.203827 0.169464 0.104187 -0.225891 0.173126 0.107330 -0.248779 0.177002 0.110565 -0.272217 0.180969 0.113922 -0.295990 0.184906 0.117310 -0.320312 0.189056 0.120850 -0.344971 0.193268 0.124481 -0.369690 0.197449 0.128113 -0.394684 0.201843 0.131927 -0.419678 0.206299 0.135864 -0.444550 0.210754 0.139740 -0.469421 0.215363 0.143799 -0.495026 0.220062 0.147980 -0.521149 0.224731 0.152100 -0.548065 0.229523 0.156433 -0.575134 0.234283 0.160736 -0.602631 0.239258 0.165222 -0.630219 0.244293 0.169769 -0.657562 0.249237 0.174225 -0.684814 0.254333 0.178925 -0.711700 0.259552 0.183655 -0.738007 0.264648 0.188354 -0.763916 0.269928 0.193237 -0.789246 0.275238 0.198181 -0.065796 0.164429 0.087311 -0.080048 0.167664 0.089813 -0.095398 0.171112 0.092529 -0.112061 0.174652 0.095276 -0.130005 0.178192 0.098083 -0.149078 0.181915 0.101074 -0.169189 0.185699 0.104126 -0.190125 0.189545 0.107208 -0.211975 0.193512 0.110474 -0.234436 0.197510 0.113739 -0.257690 0.201660 0.117218 -0.281372 0.205933 0.120758 -0.305450 0.210175 0.124329 -0.330017 0.214630 0.128021 -0.354858 0.219116 0.131836 -0.379700 0.223572 0.135651 -0.404755 0.228241 0.139648 -0.429840 0.233002 0.143707 -0.454712 0.237671 0.147736 -0.479919 0.242523 0.152008 -0.505768 0.247345 0.156219 -0.532349 0.252350 0.160614 -0.559418 0.257416 0.165070 -0.586700 0.262360 0.169525 -0.614319 0.267548 0.174133 -0.641968 0.272827 0.178833 -0.669220 0.277924 0.183441 -0.696381 0.283264 0.188263 -0.723114 0.288635 0.193146 -0.749207 0.293915 0.197937 -0.774933 0.299377 0.202881 -0.799896 0.304688 0.207794 -0.070557 0.187439 0.092438 -0.085205 0.191010 0.095154 -0.101135 0.194763 0.098022 -0.118378 0.198578 0.101013 -0.136810 0.202423 0.103973 -0.156342 0.206451 0.107117 -0.176849 0.210480 0.110321 -0.198242 0.214661 0.113647 -0.220520 0.218964 0.117126 -0.243347 0.223236 0.120575 -0.266846 0.227692 0.124176 -0.290833 0.232208 0.127899 -0.315155 0.236694 0.131622 -0.339935 0.241394 0.135559 -0.364899 0.246124 0.139526 -0.389923 0.250885 0.143524 -0.415070 0.255768 0.147644 -0.440186 0.260773 0.151917 -0.465057 0.265656 0.156128 -0.490692 0.270782 0.160492 -0.516846 0.275757 0.164856 -0.543701 0.280975 0.169403 -0.571014 0.286255 0.174011 -0.598450 0.291412 0.178589 -0.626129 0.296814 0.183350 -0.653778 0.302185 0.188110 -0.680969 0.307465 0.192902 -0.707947 0.312958 0.197815 -0.734558 0.318481 0.202789 -0.760437 0.323883 0.207642 -0.785889 0.329437 0.212738 -0.810608 0.334900 0.217743 -0.075653 0.211853 0.097961 -0.090759 0.215668 0.100830 -0.107269 0.219727 0.103882 -0.125061 0.223846 0.107056 -0.143951 0.227997 0.110229 -0.164001 0.232269 0.113556 -0.184906 0.236542 0.116943 -0.206787 0.240997 0.120483 -0.229401 0.245575 0.124115 -0.252502 0.250092 0.127747 -0.276306 0.254791 0.131561 -0.300568 0.259613 0.135406 -0.325134 0.264343 0.139313 -0.350098 0.269257 0.143402 -0.375183 0.274261 0.147552 -0.400299 0.279175 0.151672 -0.425476 0.284271 0.156006 -0.450500 0.289337 0.160278 -0.475739 0.294586 0.164734 -0.501709 0.299866 0.169281 -0.528168 0.305084 0.173767 -0.555328 0.310455 0.178436 -0.582794 0.315857 0.183197 -0.610321 0.321198 0.187897 -0.638062 0.326691 0.192749 -0.665588 0.332214 0.197662 -0.692657 0.337677 0.202545 -0.719513 0.343262 0.207550 -0.745758 0.348724 0.212494 -0.771576 0.354370 0.217560 -0.796783 0.360016 0.222778 -0.821167 0.365540 0.227814 -0.081024 0.237457 0.103821 -0.096649 0.241577 0.106903 -0.113739 0.245880 0.110138 -0.132080 0.250305 0.113495 -0.151459 0.254639 0.116852 -0.171997 0.259216 0.120392 -0.193298 0.263733 0.123932 -0.215576 0.268494 0.127655 -0.238586 0.273315 0.131439 -0.261993 0.277985 0.135223 -0.286072 0.282959 0.139252 -0.310577 0.287964 0.143311 -0.335297 0.292908 0.147339 -0.360413 0.298035 0.151550 -0.385529 0.303101 0.155792 -0.410797 0.308319 0.160187 -0.436066 0.313629 0.164642 -0.461090 0.318909 0.169067 -0.486664 0.324280 0.173676 -0.512970 0.329712 0.178345 -0.539703 0.335022 0.182983 -0.567078 0.340546 0.187744 -0.594666 0.346130 0.192657 -0.622314 0.351593 0.197418 -0.649963 0.357147 0.202393 -0.677429 0.362762 0.207428 -0.704376 0.368286 0.212372 -0.731049 0.373962 0.217468 -0.757050 0.379517 0.222504 -0.782593 0.385193 0.227631 -0.807526 0.390869 0.232910 -0.831604 0.396423 0.238007 -0.086731 0.264191 0.110077 -0.102936 0.268555 0.113342 -0.120575 0.273163 0.116760 -0.139404 0.277649 0.120239 -0.159363 0.282410 0.123810 -0.180328 0.287201 0.127533 -0.202087 0.291931 0.131226 -0.224670 0.296906 0.135162 -0.247955 0.301880 0.139130 -0.271698 0.306854 0.143097 -0.296051 0.311951 0.147278 -0.320770 0.317139 0.151459 -0.345764 0.322327 0.155701 -0.370941 0.327576 0.160065 -0.396118 0.332825 0.164429 -0.421478 0.338196 0.168945 -0.446747 0.343689 0.173553 -0.471863 0.348969 0.178131 -0.497803 0.354492 0.182861 -0.524384 0.360046 0.187653 -0.551392 0.365540 0.192352 -0.578918 0.371124 0.197296 -0.606689 0.376770 0.202271 -0.634277 0.382263 0.207153 -0.661926 0.387939 0.212250 -0.689087 0.393494 0.217194 -0.716034 0.399170 0.222351 -0.742493 0.404877 0.227539 -0.768250 0.410431 0.232635 -0.793518 0.416138 0.237854 -0.818146 0.421814 0.243134 -0.841827 0.427338 0.248322 -0.092773 0.291901 0.116699 -0.109619 0.296478 0.120117 -0.127777 0.301300 0.123718 -0.147125 0.306030 0.127380 -0.167572 0.310974 0.131165 -0.188934 0.315948 0.135040 -0.211121 0.320923 0.138916 -0.234070 0.326050 0.143005 -0.257721 0.331238 0.147156 -0.281708 0.336365 0.151245 -0.306274 0.341614 0.155548 -0.331238 0.347015 0.159973 -0.356293 0.352295 0.164307 -0.381653 0.357727 0.168854 -0.406891 0.363037 0.173340 -0.432220 0.368561 0.178009 -0.457489 0.374146 0.182739 -0.482880 0.379578 0.187408 -0.509186 0.385162 0.192261 -0.536041 0.390778 0.197174 -0.563293 0.396332 0.202026 -0.590942 0.401978 0.207031 -0.618683 0.407623 0.212097 -0.646332 0.413208 0.217102 -0.673859 0.418884 0.222198 -0.700836 0.424377 0.227264 -0.727570 0.430115 0.232513 -0.753754 0.435791 0.237762 -0.779297 0.441376 0.242889 -0.804321 0.447113 0.248169 -0.828552 0.452942 0.253510 -0.851898 0.458588 0.258728 -0.099091 0.320312 0.123535 -0.116638 0.325256 0.127289 -0.135345 0.330231 0.131073 -0.155182 0.335175 0.134857 -0.176117 0.340271 0.138855 -0.197937 0.345459 0.142914 -0.220428 0.350525 0.146912 -0.243744 0.355835 0.151154 -0.267609 0.361176 0.155457 -0.291931 0.366425 0.159729 -0.316711 0.371826 0.164185 -0.341705 0.377167 0.168579 -0.366974 0.382660 0.173218 -0.392395 0.388214 0.177887 -0.417725 0.393677 0.182495 -0.443024 0.399261 0.187256 -0.468384 0.404846 0.192108 -0.494110 0.410339 0.196930 -0.520782 0.416016 0.201904 -0.547882 0.421661 0.206879 -0.575226 0.427216 0.211853 -0.602997 0.432861 0.216980 -0.630646 0.438416 0.221985 -0.658325 0.444153 0.227112 -0.685699 0.449951 0.232361 -0.712555 0.455658 0.237488 -0.739075 0.461517 0.242737 -0.764984 0.467438 0.248077 -0.790222 0.473267 0.253235 -0.814911 0.479218 0.258575 -0.838837 0.485199 0.263916 -0.861755 0.491089 0.269135 -0.105896 0.349579 0.130890 -0.123993 0.354645 0.134766 -0.143280 0.359802 0.138733 -0.163574 0.364868 0.142731 -0.184937 0.370148 0.146851 -0.207153 0.375458 0.151062 -0.230042 0.380676 0.155273 -0.253662 0.386078 0.159637 -0.277832 0.391510 0.164062 -0.302277 0.396881 0.168488 -0.327271 0.402374 0.173096 -0.352417 0.407776 0.177643 -0.377869 0.413361 0.182373 -0.403320 0.418945 0.187134 -0.428650 0.424377 0.191895 -0.453949 0.430054 0.196838 -0.479462 0.435669 0.201752 -0.505615 0.441254 0.206665 -0.532440 0.446991 0.211731 -0.559784 0.452789 0.216797 -0.587280 0.458466 0.221832 -0.615051 0.464355 0.227020 -0.642700 0.470215 0.232086 -0.670258 0.476196 0.237335 -0.697510 0.482208 0.242615 -0.724121 0.488129 0.247803 -0.750427 0.494232 0.253113 -0.776062 0.500305 0.258423 -0.800995 0.506256 0.263611 -0.825287 0.512329 0.269012 -0.848846 0.518494 0.274353 -0.871399 0.524445 0.279602 -0.113037 0.379333 0.138519 -0.131622 0.384552 0.142578 -0.151459 0.389832 0.146729 -0.172272 0.395020 0.150848 -0.194031 0.400391 0.155121 -0.216644 0.405762 0.159515 -0.239838 0.411072 0.163879 -0.263763 0.416565 0.168365 -0.288177 0.422089 0.172974 -0.312897 0.427490 0.177521 -0.338074 0.433075 0.182251 -0.363312 0.438507 0.186951 -0.388794 0.444153 0.191772 -0.414276 0.449921 0.196655 -0.439575 0.455566 0.201508 -0.464874 0.461395 0.206512 -0.490723 0.467285 0.211609 -0.517181 0.473114 0.216553 -0.544250 0.479095 0.221710 -0.571777 0.485168 0.226898 -0.599335 0.491089 0.231964 -0.627136 0.497223 0.237213 -0.654694 0.503204 0.242371 -0.682129 0.509369 0.247681 -0.709167 0.515533 0.253021 -0.735565 0.521576 0.258179 -0.761566 0.527802 0.263489 -0.786957 0.534027 0.268860 -0.811554 0.540100 0.274109 -0.835541 0.546295 0.279480 -0.858643 0.552490 0.284790 -0.880768 0.558563 0.290039 -0.120483 0.409424 0.146515 -0.139679 0.414734 0.150696 -0.160034 0.420074 0.155029 -0.181244 0.425323 0.159302 -0.203430 0.430786 0.163727 -0.226410 0.436249 0.168243 -0.249939 0.441650 0.172729 -0.274139 0.447266 0.177368 -0.298615 0.452820 0.182037 -0.323669 0.458557 0.186798 -0.348938 0.464386 0.191650 -0.374237 0.470154 0.196442 -0.399780 0.476105 0.201355 -0.425293 0.482086 0.206421 -0.450562 0.488007 0.211334 -0.476013 0.494080 0.216461 -0.502228 0.500183 0.221588 -0.528870 0.506165 0.226624 -0.556183 0.512360 0.231812 -0.583771 0.518555 0.237091 -0.611481 0.524658 0.242218 -0.639221 0.531006 0.247498 -0.666626 0.537079 0.252716 -0.693939 0.543396 0.257996 -0.720673 0.549683 0.263367 -0.746887 0.555786 0.268585 -0.772614 0.562073 0.273956 -0.797668 0.568359 0.279358 -0.821930 0.574493 0.284546 -0.845490 0.580688 0.289886 -0.868195 0.586914 0.295258 -0.889862 0.592987 0.300385 -0.128296 0.439667 0.154816 -0.148041 0.445129 0.159149 -0.168884 0.450623 0.163635 -0.190491 0.456146 0.168030 -0.213074 0.461823 0.172638 -0.236389 0.467621 0.177277 -0.260162 0.473297 0.181915 -0.284637 0.479218 0.186676 -0.309296 0.485016 0.191406 -0.334503 0.490997 0.196289 -0.359924 0.497101 0.201263 -0.385315 0.503052 0.206146 -0.410889 0.509186 0.211212 -0.436310 0.515381 0.216309 -0.461548 0.521423 0.221313 -0.487305 0.527740 0.226471 -0.513794 0.533997 0.231689 -0.540710 0.540161 0.236816 -0.568176 0.546509 0.242126 -0.595703 0.552673 0.247253 -0.623505 0.559021 0.252563 -0.651215 0.565399 0.257904 -0.678497 0.571564 0.263092 -0.705505 0.577911 0.268463 -0.732086 0.584259 0.273834 -0.757996 0.590424 0.279053 -0.783356 0.596710 0.284424 -0.808136 0.602997 0.289734 -0.832001 0.609100 0.294952 -0.855164 0.615265 0.300293 -0.877380 0.621277 0.305450 -0.898682 0.627411 0.310760 -0.136414 0.470917 0.163391 -0.156647 0.476685 0.167877 -0.177948 0.482513 0.172485 -0.200012 0.488281 0.177063 -0.222931 0.494263 0.181763 -0.246552 0.500275 0.186554 -0.270630 0.506165 0.191284 -0.295319 0.512299 0.196198 -0.320160 0.518280 0.201019 -0.345520 0.524536 0.206024 -0.371002 0.530823 0.211060 -0.396423 0.536926 0.216064 -0.421967 0.543243 0.221191 -0.447388 0.549591 0.226349 -0.472656 0.555786 0.231415 -0.498779 0.562134 0.236694 -0.525513 0.568542 0.241974 -0.552582 0.574799 0.247070 -0.580200 0.581207 0.252472 -0.607758 0.587402 0.257599 -0.635529 0.593811 0.262970 -0.663116 0.600159 0.268311 -0.690186 0.606384 0.273560 -0.717041 0.612701 0.278931 -0.743256 0.618988 0.284271 -0.768860 0.625153 0.289490 -0.793976 0.631348 0.294800 -0.818359 0.637573 0.300140 -0.841858 0.643555 0.305328 -0.864655 0.649597 0.310638 -0.886383 0.655518 0.315796 -0.907196 0.661469 0.321014 -0.144867 0.503540 0.172272 -0.165619 0.509521 0.176941 -0.187286 0.515564 0.181610 -0.209717 0.521515 0.186310 -0.232971 0.527740 0.191162 -0.256805 0.533783 0.195984 -0.281219 0.540009 0.200897 -0.306091 0.546356 0.205902 -0.331116 0.552490 0.210815 -0.356567 0.558868 0.215912 -0.382111 0.565277 0.221100 -0.407532 0.571472 0.226135 -0.433014 0.577911 0.231293 -0.458374 0.584320 0.236572 -0.483948 0.590576 0.241699 -0.510284 0.597046 0.246979 -0.537140 0.603302 0.252197 -0.564484 0.609711 0.257477 -0.592163 0.616119 0.262817 -0.619751 0.622314 0.268036 -0.647369 0.628632 0.273438 -0.674866 0.634979 0.278778 -0.701721 0.641113 0.283997 -0.728271 0.647339 0.289337 -0.754272 0.653534 0.294678 -0.779572 0.659515 0.299896 -0.804352 0.665619 0.305206 -0.828217 0.671539 0.310364 -0.851410 0.677521 0.315643 -0.873779 0.683441 0.320862 -0.895081 0.689117 0.325958 -0.915405 0.694885 0.331116 -0.153595 0.537109 0.181396 -0.174774 0.543365 0.186188 -0.196899 0.549561 0.191040 -0.219696 0.555695 0.195831 -0.243256 0.562012 0.200745 -0.267303 0.568237 0.205658 -0.291962 0.574615 0.210693 -0.316956 0.581055 0.215790 -0.342133 0.587250 0.220856 -0.367676 0.593719 0.225952 -0.393188 0.600128 0.231171 -0.418640 0.606445 0.236298 -0.444092 0.612885 0.241577 -0.469421 0.619293 0.246857 -0.495270 0.625610 0.252075 -0.521942 0.632019 0.257355 -0.548920 0.638214 0.262573 -0.576416 0.644562 0.267914 -0.604126 0.650848 0.273315 -0.631653 0.657043 0.278503 -0.659180 0.663208 0.283875 -0.686371 0.669403 0.289215 -0.713074 0.675415 0.294434 -0.739349 0.681488 0.299774 -0.765076 0.687561 0.305084 -0.790009 0.693390 0.310242 -0.814392 0.699249 0.315491 -0.837952 0.704987 0.320618 -0.860718 0.710754 0.325836 -0.882629 0.716431 0.330994 -0.903412 0.721954 0.335999 -0.923248 0.727448 0.341095 -0.162567 0.571472 0.190826 -0.184204 0.577850 0.195709 -0.206573 0.584076 0.200500 -0.229828 0.590454 0.205505 -0.253693 0.596863 0.210571 -0.277924 0.603149 0.215546 -0.302765 0.609558 0.220642 -0.327972 0.615997 0.225830 -0.353241 0.622314 0.230896 -0.378754 0.628723 0.236176 -0.404327 0.635162 0.241425 -0.429718 0.641449 0.246582 -0.455048 0.647858 0.251892 -0.480469 0.654022 0.257111 -0.506683 0.660339 0.262451 -0.533600 0.666656 0.267761 -0.560791 0.672760 0.273010 -0.588257 0.679016 0.278381 -0.615997 0.685150 0.283752 -0.643433 0.691132 0.288910 -0.670807 0.697174 0.294281 -0.697784 0.703217 0.299622 -0.724182 0.709015 0.304810 -0.750183 0.714874 0.310089 -0.775452 0.720581 0.315216 -0.800232 0.726379 0.320496 -0.824249 0.732086 0.325684 -0.847351 0.737549 0.330750 -0.869720 0.743073 0.335907 -0.891174 0.748535 0.340973 -0.911469 0.753754 0.345886 -0.930847 0.759094 0.350891 -0.171783 0.606323 0.200409 -0.193817 0.612732 0.205383 -0.216553 0.618958 0.210327 -0.240082 0.625427 0.215393 -0.264221 0.631866 0.220520 -0.288696 0.638123 0.225586 -0.313690 0.644531 0.230774 -0.338959 0.650940 0.236023 -0.364319 0.657166 0.241180 -0.389893 0.663544 0.246460 -0.415405 0.669891 0.251770 -0.440704 0.676025 0.256989 -0.466003 0.682312 0.262299 -0.491760 0.688385 0.267517 -0.518219 0.694611 0.272888 -0.545227 0.700745 0.278259 -0.572510 0.706665 0.283447 -0.600067 0.712769 0.288788 -0.627716 0.718689 0.294189 -0.654999 0.724518 0.299316 -0.682190 0.730347 0.304657 -0.708954 0.736176 0.309967 -0.735046 0.741760 0.315125 -0.760773 0.747437 0.320343 -0.785736 0.752899 0.325439 -0.810120 0.758423 0.330597 -0.833771 0.763855 0.335754 -0.856445 0.769104 0.340698 -0.878387 0.774414 0.345795 -0.899384 0.779572 0.350769 -0.919189 0.784546 0.355591 -0.937988 0.789612 0.360474 -0.181274 0.641205 0.210205 -0.203674 0.647644 0.215302 -0.226715 0.653870 0.220276 -0.250519 0.660278 0.225464 -0.274872 0.666626 0.230682 -0.299530 0.672791 0.235779 -0.324677 0.679169 0.240997 -0.350037 0.685455 0.246338 -0.375427 0.691559 0.251526 -0.400940 0.697815 0.256836 -0.426300 0.703857 0.262024 -0.451660 0.709991 0.267395 -0.477081 0.716125 0.272766 -0.503082 0.722076 0.277985 -0.529724 0.728027 0.283325 -0.556885 0.734009 0.288666 -0.584229 0.739746 0.293884 -0.611816 0.745636 0.299194 -0.639282 0.751404 0.304535 -0.666443 0.756958 0.309723 -0.693420 0.762604 0.314972 -0.719910 0.768188 0.320221 -0.745728 0.773529 0.325317 -0.771088 0.778961 0.330475 -0.795685 0.784149 0.335480 -0.819763 0.789429 0.340607 -0.842957 0.794586 0.345673 -0.865265 0.799591 0.350494 -0.886719 0.804596 0.355499 -0.907227 0.809479 0.360382 -0.926544 0.814209 0.365112 -0.944855 0.818909 0.369873 -0.190857 0.675873 0.220154 -0.213654 0.682190 0.225342 -0.236969 0.688324 0.230408 -0.261017 0.694641 0.235687 -0.285583 0.700897 0.240906 -0.310394 0.706940 0.246063 -0.335663 0.713165 0.251373 -0.361084 0.719299 0.256714 -0.386444 0.725250 0.261932 -0.411987 0.731323 0.267242 -0.437256 0.737183 0.272522 -0.462433 0.743164 0.277863 -0.488129 0.749084 0.283203 -0.514343 0.754822 0.288422 -0.541229 0.760620 0.293762 -0.568451 0.766327 0.299072 -0.595825 0.771851 0.304260 -0.623352 0.777466 0.309570 -0.650726 0.783020 0.314850 -0.677673 0.788361 0.319977 -0.704376 0.793793 0.325195 -0.730438 0.798920 0.330231 -0.756073 0.804169 0.335388 -0.781128 0.809326 0.340485 -0.805389 0.814270 0.345398 -0.829010 0.819244 0.350433 -0.851837 0.824127 0.355377 -0.873718 0.828766 0.360168 -0.894684 0.833466 0.364990 -0.914734 0.838074 0.369720 -0.933563 0.842499 0.374359 -0.951324 0.846863 0.378998 -0.200684 0.709961 0.230286 -0.223755 0.716187 0.235535 -0.247375 0.722198 0.240631 -0.271667 0.728333 0.245911 -0.296387 0.734375 0.251251 -0.321289 0.740326 0.256439 -0.346619 0.746338 0.261749 -0.371979 0.752136 0.266998 -0.397461 0.758118 0.272339 -0.422913 0.763916 0.277710 -0.448059 0.769653 0.282959 -0.473358 0.775391 0.288300 -0.499298 0.781067 0.293640 -0.525665 0.786621 0.298828 -0.552673 0.792145 0.304138 -0.579987 0.797668 0.309448 -0.607269 0.802887 0.314575 -0.634705 0.808258 0.319824 -0.661926 0.813568 0.325073 -0.688660 0.818604 0.330078 -0.715057 0.823730 0.335266 -0.740814 0.828613 0.340210 -0.766144 0.833527 0.345245 -0.790833 0.838409 0.350311 -0.814728 0.843048 0.355133 -0.837982 0.847717 0.360046 -0.860352 0.852295 0.364838 -0.881775 0.856628 0.369507 -0.902344 0.861053 0.374237 -0.921875 0.865326 0.378845 -0.940216 0.869385 0.383331 -0.957428 0.873505 0.387787 -0.210632 0.743286 0.240509 -0.234009 0.749359 0.245789 -0.257874 0.755219 0.250977 -0.282349 0.761139 0.256287 -0.307190 0.767059 0.261627 -0.332214 0.772827 0.266846 -0.357605 0.778625 0.272217 -0.382904 0.784210 0.277466 -0.408356 0.789948 0.282806 -0.433716 0.795563 0.288147 -0.458740 0.800995 0.293335 -0.484222 0.806519 0.298706 -0.510406 0.811981 0.304016 -0.536957 0.817230 0.309174 -0.564026 0.822510 0.314453 -0.591339 0.827728 0.319702 -0.618530 0.832733 0.324768 -0.645844 0.837799 0.329956 -0.672729 0.842621 0.334991 -0.699310 0.847534 0.340088 -0.725433 0.852356 0.345154 -0.750916 0.856934 0.350037 -0.775909 0.861572 0.355011 -0.800262 0.866119 0.359924 -0.823792 0.870422 0.364624 -0.846588 0.874756 0.369385 -0.868591 0.879028 0.374115 -0.889526 0.883057 0.378601 -0.909668 0.887085 0.383209 -0.928558 0.890961 0.387543 -0.946503 0.894806 0.391998 -0.963196 0.898529 0.396332 -0.220734 0.775787 0.250885 -0.244324 0.781616 0.256134 -0.268372 0.787262 0.261353 -0.293030 0.793030 0.266724 -0.317871 0.798553 0.271973 -0.343109 0.804230 0.277313 -0.368469 0.809784 0.282684 -0.393768 0.815155 0.287872 -0.419098 0.820618 0.293213 -0.444397 0.825958 0.298584 -0.469391 0.831177 0.303741 -0.495087 0.836395 0.309052 -0.521423 0.841583 0.314331 -0.548126 0.846527 0.319427 -0.575226 0.851532 0.324646 -0.602356 0.856354 0.329742 -0.629669 0.861206 0.334869 -0.656708 0.865936 0.339966 -0.683441 0.870453 0.344910 -0.709717 0.875061 0.349915 -0.735565 0.879547 0.354889 -0.760712 0.883789 0.359650 -0.785370 0.888092 0.364502 -0.809326 0.892273 0.369263 -0.832428 0.896301 0.373871 -0.854858 0.900299 0.378510 -0.876404 0.904175 0.383087 -0.896912 0.907867 0.387451 -0.916534 0.911560 0.391846 -0.934967 0.915039 0.396118 -0.952423 0.918549 0.400360 -0.968597 0.921936 0.404480 -0.230865 0.807190 0.261230 -0.254730 0.812836 0.266571 -0.278961 0.818268 0.271820 -0.303711 0.823792 0.277191 -0.328674 0.829071 0.282410 -0.353943 0.834473 0.287750 -0.379303 0.839783 0.293091 -0.404541 0.844879 0.298279 -0.429810 0.850067 0.303619 -0.454926 0.855103 0.308899 -0.480072 0.860016 0.314087 -0.505981 0.864929 0.319305 -0.532440 0.869812 0.324524 -0.559174 0.874481 0.329559 -0.586304 0.879120 0.334747 -0.613342 0.883606 0.339691 -0.640533 0.888123 0.344727 -0.667419 0.892517 0.349823 -0.693787 0.896759 0.354645 -0.719879 0.901031 0.359558 -0.745361 0.905090 0.364380 -0.770203 0.909058 0.369049 -0.794464 0.912994 0.373718 -0.818054 0.916840 0.378387 -0.840790 0.920471 0.382843 -0.862762 0.924103 0.387329 -0.883789 0.927582 0.391632 -0.903931 0.931000 0.395996 -0.923096 0.934357 0.400269 -0.941071 0.937531 0.404297 -0.957947 0.940613 0.408356 -0.973602 0.943695 0.412384 -0.241058 0.837402 0.271667 -0.264984 0.842621 0.276886 -0.289520 0.847931 0.282257 -0.314392 0.853210 0.287628 -0.339355 0.858246 0.292816 -0.364655 0.863342 0.298157 -0.390015 0.868317 0.303467 -0.415131 0.873138 0.308655 -0.440308 0.878021 0.313934 -0.465271 0.882782 0.319183 -0.490692 0.887360 0.324249 -0.516754 0.891968 0.329437 -0.543152 0.896393 0.334473 -0.570099 0.900787 0.339600 -0.597168 0.905151 0.344635 -0.624115 0.909271 0.349548 -0.651093 0.913483 0.354492 -0.677765 0.917542 0.359436 -0.703888 0.921387 0.364166 -0.729614 0.925262 0.368896 -0.754822 0.929047 0.373627 -0.779236 0.932617 0.378174 -0.803162 0.936157 0.382721 -0.826416 0.939636 0.387207 -0.848724 0.942902 0.391541 -0.870300 0.946198 0.395874 -0.890900 0.949249 0.400085 -0.910583 0.952362 0.404175 -0.929199 0.955322 0.408295 -0.946716 0.958099 0.412170 -0.963135 0.960907 0.416077 -0.978302 0.963562 0.419861 -0.251312 0.866364 0.282135 -0.275391 0.871277 0.287354 -0.300018 0.876251 0.292664 -0.324982 0.881226 0.298004 -0.350006 0.885925 0.303192 -0.375275 0.890686 0.308533 -0.400574 0.895386 0.313782 -0.425598 0.899902 0.318939 -0.450592 0.904388 0.324127 -0.475616 0.908844 0.329346 -0.501190 0.913086 0.334381 -0.527405 0.917328 0.339417 -0.553925 0.921387 0.344391 -0.580811 0.925507 0.349426 -0.607849 0.929474 0.354370 -0.634674 0.933258 0.359192 -0.661438 0.937042 0.364014 -0.687775 0.940704 0.368774 -0.713623 0.944214 0.373413 -0.739075 0.947662 0.378052 -0.763916 0.951080 0.382599 -0.788025 0.954285 0.386993 -0.811584 0.957489 0.391418 -0.834290 0.960510 0.395691 -0.856293 0.963501 0.399994 -0.877411 0.966400 0.404083 -0.897552 0.969116 0.408081 -0.916809 0.971832 0.412079 -0.934998 0.974396 0.415985 -0.952026 0.976837 0.419647 -0.967926 0.979248 0.423370 -0.982605 0.981537 0.426971 -0.036926 0.036438 0.069153 -0.049652 0.037537 0.070526 -0.062439 0.038727 0.072021 -0.075714 0.040009 0.073608 -0.089783 0.041290 0.075226 -0.105103 0.042694 0.076965 -0.121552 0.044128 0.078766 -0.139160 0.045685 0.080658 -0.157776 0.047272 0.082642 -0.177246 0.048889 0.084686 -0.197632 0.050598 0.086853 -0.218719 0.052368 0.089111 -0.240448 0.054169 0.091461 -0.262787 0.056091 0.093872 -0.285553 0.058014 0.096375 -0.308868 0.060059 0.099030 -0.332611 0.062134 0.101715 -0.356476 0.064240 0.104523 -0.380554 0.066498 0.107452 -0.404816 0.068817 0.110474 -0.429016 0.071106 0.113495 -0.453247 0.073547 0.116730 -0.477692 0.076080 0.120087 -0.502777 0.078613 0.123383 -0.528595 0.081268 0.126923 -0.554962 0.084045 0.130524 -0.581573 0.086792 0.134094 -0.608521 0.089722 0.137878 -0.635468 0.092682 0.141663 -0.662415 0.095764 0.145660 -0.689148 0.098999 0.149689 -0.715424 0.102173 0.153717 -0.039825 0.048126 0.071991 -0.052582 0.049408 0.073517 -0.065582 0.050751 0.075195 -0.079132 0.052185 0.076874 -0.093658 0.053711 0.078705 -0.109406 0.055328 0.080627 -0.126312 0.056915 0.082550 -0.144318 0.058655 0.084625 -0.163391 0.060425 0.086792 -0.183289 0.062256 0.089020 -0.204010 0.064148 0.091370 -0.225494 0.066162 0.093811 -0.247528 0.068176 0.096313 -0.270233 0.070282 0.098938 -0.293274 0.072449 0.101593 -0.316864 0.074707 0.104431 -0.340820 0.077087 0.107361 -0.364868 0.079468 0.110321 -0.389191 0.081970 0.113464 -0.413635 0.084595 0.116669 -0.437897 0.087189 0.119904 -0.462250 0.089996 0.123322 -0.487061 0.092865 0.126862 -0.512512 0.095734 0.130310 -0.538666 0.098785 0.134033 -0.565155 0.101837 0.137695 -0.592133 0.105042 0.141541 -0.619232 0.108398 0.145538 -0.646271 0.111725 0.149475 -0.673248 0.115234 0.153625 -0.699921 0.118805 0.157837 -0.726105 0.122406 0.162018 -0.042969 0.060608 0.075134 -0.055817 0.062103 0.076843 -0.069031 0.063690 0.078674 -0.082916 0.065308 0.080536 -0.097900 0.067047 0.082520 -0.114136 0.068848 0.084595 -0.131470 0.070648 0.086700 -0.149963 0.072601 0.088959 -0.169403 0.074615 0.091309 -0.189728 0.076660 0.093719 -0.210815 0.078888 0.096252 -0.232666 0.081146 0.098907 -0.255035 0.083435 0.101532 -0.278015 0.085846 0.104401 -0.301331 0.088287 0.107208 -0.325226 0.090942 0.110260 -0.349426 0.093567 0.113342 -0.373657 0.096313 0.116516 -0.398132 0.099182 0.119843 -0.422699 0.102173 0.123230 -0.447083 0.105164 0.126648 -0.471619 0.108337 0.130219 -0.496857 0.111603 0.133972 -0.522583 0.114838 0.137604 -0.549072 0.118286 0.141479 -0.575806 0.121735 0.145325 -0.602966 0.125336 0.149384 -0.630188 0.129028 0.153503 -0.657196 0.132782 0.157654 -0.684204 0.136658 0.161926 -0.710754 0.140594 0.166290 -0.736877 0.144531 0.170624 -0.046265 0.074097 0.078552 -0.059326 0.075867 0.080475 -0.072754 0.077698 0.082458 -0.087036 0.079529 0.084473 -0.102509 0.081512 0.086639 -0.119232 0.083588 0.088898 -0.137024 0.085693 0.091187 -0.155975 0.087921 0.093628 -0.175873 0.090271 0.096161 -0.196503 0.092651 0.098755 -0.217987 0.095154 0.101471 -0.240082 0.097687 0.104187 -0.262909 0.100372 0.107147 -0.286224 0.103210 0.110168 -0.309814 0.106018 0.113220 -0.333923 0.109009 0.116425 -0.358307 0.112030 0.119720 -0.382721 0.115173 0.123047 -0.407379 0.118439 0.126556 -0.432007 0.121796 0.130157 -0.456421 0.125122 0.133759 -0.481262 0.128662 0.137512 -0.506744 0.132202 0.141296 -0.533020 0.135956 0.145233 -0.559723 0.139709 0.149261 -0.586700 0.143524 0.153290 -0.614014 0.147461 0.157501 -0.641296 0.151520 0.161804 -0.668335 0.155548 0.166046 -0.695251 0.159790 0.170502 -0.721802 0.164154 0.175079 -0.747711 0.168396 0.179535 -0.049866 0.088959 0.082336 -0.063080 0.091034 0.084412 -0.076843 0.093109 0.086578 -0.091522 0.095306 0.088806 -0.107483 0.097595 0.091125 -0.124725 0.100037 0.093536 -0.143005 0.102478 0.096069 -0.162323 0.105042 0.098663 -0.182648 0.107727 0.101410 -0.203705 0.110443 0.104126 -0.225586 0.113342 0.107056 -0.248016 0.116241 0.109985 -0.271149 0.119293 0.113159 -0.294708 0.122498 0.116364 -0.318604 0.125641 0.119568 -0.342926 0.128998 0.122986 -0.367493 0.132446 0.126465 -0.392090 0.135895 0.129974 -0.416840 0.139496 0.133636 -0.441498 0.143219 0.137421 -0.466034 0.146912 0.141205 -0.491333 0.150848 0.145172 -0.517181 0.154724 0.149048 -0.543701 0.158752 0.153198 -0.570709 0.162903 0.157410 -0.597870 0.167023 0.161591 -0.625214 0.171326 0.165955 -0.652618 0.175720 0.170410 -0.679596 0.180054 0.174805 -0.706421 0.184601 0.179382 -0.732849 0.189148 0.184052 -0.758575 0.193726 0.188690 -0.053650 0.105499 0.086456 -0.067139 0.107880 0.088745 -0.081238 0.110382 0.091095 -0.096375 0.112854 0.093445 -0.112854 0.115509 0.095978 -0.130554 0.118286 0.098602 -0.149292 0.121094 0.101227 -0.169128 0.124054 0.104065 -0.189758 0.127014 0.106934 -0.211273 0.130127 0.109924 -0.233521 0.133362 0.113098 -0.256287 0.136597 0.116150 -0.279694 0.140045 0.119507 -0.303558 0.143585 0.122894 -0.327698 0.147095 0.126282 -0.352234 0.150787 0.129883 -0.376953 0.154572 0.133575 -0.401672 0.158356 0.137238 -0.426483 0.162323 0.141113 -0.451263 0.166351 0.145050 -0.476074 0.170410 0.148956 -0.501709 0.174622 0.153046 -0.527893 0.178802 0.157227 -0.554718 0.183197 0.161499 -0.581909 0.187622 0.165802 -0.609192 0.192047 0.170166 -0.636688 0.196625 0.174683 -0.664032 0.201324 0.179291 -0.690918 0.205963 0.183838 -0.717590 0.210754 0.188568 -0.743744 0.215515 0.193237 -0.769501 0.220428 0.198090 -0.057739 0.123871 0.090973 -0.071442 0.126587 0.093384 -0.085968 0.129425 0.095917 -0.101624 0.132233 0.098480 -0.118622 0.135223 0.101166 -0.136810 0.138336 0.103973 -0.156036 0.141479 0.106873 -0.176270 0.144775 0.109863 -0.197296 0.148041 0.112885 -0.219238 0.151520 0.116089 -0.241821 0.155151 0.119415 -0.264893 0.158691 0.122681 -0.288605 0.162476 0.126190 -0.312744 0.166290 0.129791 -0.337067 0.170166 0.133362 -0.361786 0.174194 0.137115 -0.386658 0.178314 0.140991 -0.411499 0.182404 0.144806 -0.436340 0.186676 0.148834 -0.461090 0.190948 0.152893 -0.486359 0.195404 0.157104 -0.512360 0.199890 0.161346 -0.538849 0.204407 0.165619 -0.565918 0.209045 0.170044 -0.593292 0.213776 0.174591 -0.620636 0.218445 0.179077 -0.648193 0.223328 0.183685 -0.675476 0.228241 0.188446 -0.702301 0.233124 0.193115 -0.728912 0.238190 0.197968 -0.754822 0.243134 0.202789 -0.780365 0.248291 0.207764 -0.062042 0.143921 0.095795 -0.076080 0.147003 0.098419 -0.091064 0.150116 0.101135 -0.107208 0.153290 0.103851 -0.124756 0.156647 0.106812 -0.143372 0.159973 0.109711 -0.163116 0.163513 0.112823 -0.183807 0.167175 0.115997 -0.205231 0.170807 0.119232 -0.227509 0.174591 0.122620 -0.250458 0.178497 0.126099 -0.273834 0.182373 0.129639 -0.297791 0.186462 0.133270 -0.322144 0.190613 0.137024 -0.346710 0.194763 0.140808 -0.371613 0.199066 0.144714 -0.396637 0.203491 0.148743 -0.421509 0.207916 0.152771 -0.446472 0.212463 0.156982 -0.471313 0.217010 0.161133 -0.496979 0.221710 0.165466 -0.523346 0.226471 0.169922 -0.550049 0.231201 0.174347 -0.577362 0.236115 0.178925 -0.604828 0.241089 0.183594 -0.632294 0.246033 0.188202 -0.659851 0.251129 0.192993 -0.687042 0.256287 0.197876 -0.713715 0.261353 0.202637 -0.740143 0.266632 0.207581 -0.765869 0.271790 0.212494 -0.791199 0.277130 0.217560 -0.066650 0.165619 0.101013 -0.080994 0.168945 0.103790 -0.096466 0.172424 0.106720 -0.113190 0.175903 0.109650 -0.131226 0.179535 0.112732 -0.150360 0.183228 0.115875 -0.170563 0.187073 0.119141 -0.191681 0.191010 0.122559 -0.213531 0.194977 0.125946 -0.236145 0.199066 0.129517 -0.259399 0.203247 0.133179 -0.283081 0.207489 0.136871 -0.307281 0.211853 0.140686 -0.331909 0.216278 0.144623 -0.356628 0.220703 0.148560 -0.381653 0.225311 0.152679 -0.406616 0.229858 0.156799 -0.431732 0.234650 0.161041 -0.456665 0.239441 0.165375 -0.481812 0.244232 0.169739 -0.507874 0.249207 0.174225 -0.534515 0.254242 0.178833 -0.561493 0.259186 0.183380 -0.588959 0.264313 0.188049 -0.616608 0.269501 0.192902 -0.644073 0.274597 0.197601 -0.671539 0.279938 0.202515 -0.698425 0.285126 0.207367 -0.725189 0.290527 0.212402 -0.751404 0.295959 0.217438 -0.776947 0.301270 0.222473 -0.801941 0.306793 0.227570 -0.071442 0.188721 0.106567 -0.086273 0.192383 0.109589 -0.102234 0.196106 0.112610 -0.119568 0.199951 0.115753 -0.138123 0.203918 0.119049 -0.157745 0.207916 0.122375 -0.178375 0.212036 0.125854 -0.199890 0.216278 0.129425 -0.222076 0.220459 0.132996 -0.245087 0.224884 0.136780 -0.268616 0.229370 0.140564 -0.292572 0.233826 0.144409 -0.317078 0.238464 0.148438 -0.341736 0.243042 0.152466 -0.366730 0.247833 0.156647 -0.391876 0.252716 0.160919 -0.416962 0.257507 0.165192 -0.442017 0.262512 0.169617 -0.467133 0.267548 0.174133 -0.492676 0.272552 0.178589 -0.519012 0.277710 0.183228 -0.545959 0.282959 0.187958 -0.573120 0.288086 0.192596 -0.600769 0.293427 0.197510 -0.628479 0.298798 0.202393 -0.655853 0.304077 0.207214 -0.683258 0.309540 0.212280 -0.710052 0.314880 0.217194 -0.736572 0.320404 0.222290 -0.762604 0.325958 0.227478 -0.787842 0.331390 0.232574 -0.812622 0.337006 0.237762 -0.076569 0.213226 0.112518 -0.091858 0.217194 0.115723 -0.108398 0.221161 0.118866 -0.126312 0.225311 0.122284 -0.145355 0.229553 0.125763 -0.165405 0.233795 0.129242 -0.186523 0.238220 0.132904 -0.208435 0.242706 0.136658 -0.231018 0.247192 0.140381 -0.254333 0.251862 0.144348 -0.278168 0.256592 0.148346 -0.302338 0.261261 0.152374 -0.327057 0.266144 0.156555 -0.351929 0.271027 0.160706 -0.377075 0.275970 0.165070 -0.402283 0.281067 0.169525 -0.427399 0.286102 0.173920 -0.452484 0.291290 0.178467 -0.477783 0.296539 0.183167 -0.503693 0.301727 0.187714 -0.530365 0.307098 0.192505 -0.557556 0.312469 0.197357 -0.584930 0.317780 0.202148 -0.612640 0.323273 0.207092 -0.640137 0.328644 0.212036 -0.667725 0.334229 0.217072 -0.695007 0.339752 0.222198 -0.721619 0.345215 0.227173 -0.747925 0.350830 0.232452 -0.773682 0.356506 0.237671 -0.798737 0.361969 0.242798 -0.823151 0.367676 0.248108 -0.082031 0.238922 0.118805 -0.097870 0.243164 0.122223 -0.114960 0.247406 0.125580 -0.133362 0.251862 0.129150 -0.152954 0.256348 0.132843 -0.173462 0.260834 0.136475 -0.194977 0.265503 0.140289 -0.217316 0.270264 0.144226 -0.240204 0.274933 0.148163 -0.263824 0.279877 0.152283 -0.287842 0.284698 0.156342 -0.312378 0.289734 0.160614 -0.337280 0.294800 0.164978 -0.362335 0.299866 0.169281 -0.387512 0.305084 0.173767 -0.412842 0.310333 0.178375 -0.437988 0.315491 0.182892 -0.463135 0.320862 0.187622 -0.488770 0.326324 0.192352 -0.515015 0.331604 0.197083 -0.541962 0.337097 0.201996 -0.569366 0.342651 0.206940 -0.596802 0.348053 0.211884 -0.624603 0.353638 0.216919 -0.652130 0.359161 0.221924 -0.679565 0.364777 0.227081 -0.706635 0.370453 0.232269 -0.733124 0.375916 0.237366 -0.759216 0.381653 0.242676 -0.784760 0.387329 0.247986 -0.809418 0.392883 0.253174 -0.833557 0.398560 0.258545 -0.087769 0.265778 0.125519 -0.104187 0.270264 0.129089 -0.121887 0.274719 0.132629 -0.140839 0.279419 0.136383 -0.160919 0.284149 0.140198 -0.181854 0.288849 0.144012 -0.203827 0.293793 0.148071 -0.226471 0.298737 0.152161 -0.249695 0.303619 0.156219 -0.273621 0.308716 0.160492 -0.297852 0.313782 0.164734 -0.322632 0.319000 0.169159 -0.347748 0.324280 0.173676 -0.372864 0.329437 0.178131 -0.398163 0.334808 0.182770 -0.423523 0.340240 0.187500 -0.448639 0.345551 0.192139 -0.473969 0.351044 0.196991 -0.500000 0.356598 0.201904 -0.526520 0.362030 0.206726 -0.553680 0.367584 0.211761 -0.581085 0.373108 0.216675 -0.608826 0.378754 0.221802 -0.636597 0.384430 0.226959 -0.664093 0.389954 0.232025 -0.691345 0.395599 0.237274 -0.718262 0.401337 0.242554 -0.744476 0.406891 0.247711 -0.770386 0.412537 0.253052 -0.795593 0.418243 0.258423 -0.819977 0.423767 0.263611 -0.843750 0.429474 0.269073 -0.093903 0.293549 0.132568 -0.110931 0.298279 0.136292 -0.129150 0.303009 0.140015 -0.148621 0.307861 0.143921 -0.169189 0.312836 0.147949 -0.190552 0.317749 0.151947 -0.212891 0.322845 0.156128 -0.235779 0.327881 0.160278 -0.259460 0.333069 0.164642 -0.283661 0.338318 0.169067 -0.308105 0.343567 0.173431 -0.333099 0.348877 0.178009 -0.358307 0.354309 0.182678 -0.383575 0.359650 0.187225 -0.408905 0.365082 0.192047 -0.434296 0.370605 0.196869 -0.459442 0.376068 0.201660 -0.485016 0.381683 0.206635 -0.511414 0.387238 0.211639 -0.538177 0.392792 0.216553 -0.565582 0.398407 0.221680 -0.593079 0.403992 0.226685 -0.620880 0.409637 0.231873 -0.648651 0.415314 0.237122 -0.675964 0.420868 0.242279 -0.703125 0.426575 0.247589 -0.729767 0.432220 0.252930 -0.755859 0.437805 0.258118 -0.781433 0.443512 0.263519 -0.806305 0.449310 0.268890 -0.830414 0.454926 0.274231 -0.853851 0.460815 0.279633 -0.100372 0.322205 0.139923 -0.117981 0.327118 0.143829 -0.136780 0.332001 0.147736 -0.156769 0.337067 0.151855 -0.177765 0.342224 0.156036 -0.199585 0.347290 0.160187 -0.222229 0.352509 0.164551 -0.245514 0.357697 0.168854 -0.269440 0.363037 0.173340 -0.293884 0.368469 0.177887 -0.318604 0.373749 0.182434 -0.343719 0.379272 0.187134 -0.369080 0.384735 0.191895 -0.394348 0.390167 0.196625 -0.419800 0.395721 0.201508 -0.445129 0.401367 0.206451 -0.470337 0.406860 0.211365 -0.496307 0.412445 0.216431 -0.522827 0.417969 0.221405 -0.549988 0.423645 0.226562 -0.577545 0.429321 0.231750 -0.605164 0.434845 0.236847 -0.632935 0.440552 0.242126 -0.660583 0.446320 0.247437 -0.687836 0.451965 0.252655 -0.714752 0.457855 0.257996 -0.741272 0.463745 0.263367 -0.767029 0.469543 0.268646 -0.792297 0.475433 0.274109 -0.816803 0.481293 0.279388 -0.840607 0.487274 0.284760 -0.863647 0.493286 0.290222 -0.107208 0.351501 0.147644 -0.125427 0.356567 0.151733 -0.144714 0.361603 0.155823 -0.165192 0.366852 0.160065 -0.186554 0.371979 0.164307 -0.208832 0.377319 0.168732 -0.231873 0.382721 0.173218 -0.255432 0.387970 0.177673 -0.279694 0.393433 0.182343 -0.304321 0.398926 0.187042 -0.329254 0.404327 0.191650 -0.354523 0.409882 0.196503 -0.379974 0.415436 0.201355 -0.405243 0.420868 0.206238 -0.430756 0.426544 0.211212 -0.455902 0.432007 0.216187 -0.481476 0.437653 0.221313 -0.507812 0.443329 0.226440 -0.534546 0.449036 0.231476 -0.561920 0.454803 0.236725 -0.589569 0.460693 0.242004 -0.617249 0.466492 0.247131 -0.644958 0.472443 0.252533 -0.672546 0.478424 0.257874 -0.699585 0.484314 0.263123 -0.726349 0.490356 0.268524 -0.752533 0.496429 0.273926 -0.778046 0.502380 0.279205 -0.803040 0.508545 0.284637 -0.827148 0.514496 0.289948 -0.850647 0.520630 0.295380 -0.873199 0.526794 0.300812 -0.114410 0.381256 0.155701 -0.133179 0.386536 0.159973 -0.152985 0.391693 0.164185 -0.173950 0.397034 0.168640 -0.195831 0.402374 0.173126 -0.218384 0.407684 0.177551 -0.241760 0.413147 0.182220 -0.265625 0.418488 0.186798 -0.290100 0.424011 0.191559 -0.314972 0.429596 0.196411 -0.340027 0.434998 0.201111 -0.365387 0.440643 0.206085 -0.390900 0.446320 0.211121 -0.416260 0.451904 0.216034 -0.441650 0.457733 0.221161 -0.467041 0.463562 0.226288 -0.492828 0.469391 0.231354 -0.519409 0.475342 0.236633 -0.546417 0.481232 0.241730 -0.573914 0.487244 0.247009 -0.601685 0.493378 0.252350 -0.629303 0.499329 0.257599 -0.656982 0.505493 0.262970 -0.684418 0.511719 0.268341 -0.711243 0.517700 0.273682 -0.737793 0.523926 0.279083 -0.763733 0.530151 0.284515 -0.788910 0.536224 0.289795 -0.813568 0.542419 0.295258 -0.837341 0.548492 0.300507 -0.860352 0.554657 0.305939 -0.882568 0.560883 0.311371 -0.121979 0.411377 0.164093 -0.141296 0.416718 0.168518 -0.161591 0.421997 0.172882 -0.182983 0.427368 0.177429 -0.205170 0.432709 0.181976 -0.228180 0.438171 0.186646 -0.251892 0.443787 0.191437 -0.275970 0.449280 0.196136 -0.300690 0.454956 0.201050 -0.325714 0.460724 0.205994 -0.350922 0.466461 0.210876 -0.376373 0.472382 0.215912 -0.401947 0.478271 0.221039 -0.427307 0.484161 0.226074 -0.452637 0.490234 0.231232 -0.478058 0.496155 0.236359 -0.504272 0.502289 0.241638 -0.531158 0.508514 0.246918 -0.558319 0.514526 0.252136 -0.585999 0.520782 0.257446 -0.613800 0.527039 0.262848 -0.641388 0.533142 0.268066 -0.668945 0.539429 0.273529 -0.696136 0.545715 0.278961 -0.722778 0.551880 0.284241 -0.749054 0.558167 0.289673 -0.774689 0.564423 0.295135 -0.799561 0.570557 0.300385 -0.823883 0.576813 0.305786 -0.847260 0.582886 0.311096 -0.869873 0.589081 0.316498 -0.891602 0.595306 0.321869 -0.129852 0.441711 0.172760 -0.149689 0.447174 0.177307 -0.170471 0.452637 0.181854 -0.192291 0.458282 0.186523 -0.214813 0.463867 0.191193 -0.238190 0.469635 0.196045 -0.262177 0.475525 0.200897 -0.286560 0.481262 0.205719 -0.311401 0.487213 0.210724 -0.336609 0.493256 0.215790 -0.361908 0.499176 0.220825 -0.387421 0.505310 0.225922 -0.412994 0.511536 0.231079 -0.438293 0.517578 0.236237 -0.463654 0.523804 0.241486 -0.489380 0.529877 0.246643 -0.515900 0.536224 0.252014 -0.542938 0.542511 0.257324 -0.570312 0.548706 0.262573 -0.598022 0.555023 0.267944 -0.625793 0.561401 0.273407 -0.653351 0.567627 0.278717 -0.680756 0.573975 0.284088 -0.707733 0.580292 0.289551 -0.734100 0.586487 0.294800 -0.760101 0.592804 0.300232 -0.785309 0.598938 0.305542 -0.809998 0.605164 0.310974 -0.833923 0.611420 0.316376 -0.856903 0.617462 0.321594 -0.879120 0.623596 0.326965 -0.900330 0.629700 0.332306 -0.138000 0.473083 0.181671 -0.158264 0.478729 0.186310 -0.179626 0.484558 0.191071 -0.201874 0.490509 0.195923 -0.224731 0.496307 0.200653 -0.248444 0.502350 0.205627 -0.272644 0.508484 0.210602 -0.297180 0.514435 0.215546 -0.322296 0.520630 0.220612 -0.347626 0.526886 0.225769 -0.373016 0.532990 0.230835 -0.398560 0.539307 0.236084 -0.423950 0.545441 0.241211 -0.449341 0.551819 0.246521 -0.474792 0.558228 0.251831 -0.500793 0.564362 0.257050 -0.527649 0.570770 0.262451 -0.554871 0.577179 0.267822 -0.582336 0.583435 0.273132 -0.610077 0.589813 0.278564 -0.637817 0.596191 0.283966 -0.665192 0.602417 0.289246 -0.692383 0.608704 0.294678 -0.719177 0.615021 0.300110 -0.745300 0.621216 0.305389 -0.770966 0.627502 0.310822 -0.795868 0.633545 0.316071 -0.820160 0.639709 0.321472 -0.843750 0.645813 0.326843 -0.866333 0.651733 0.332031 -0.888062 0.657776 0.337280 -0.908813 0.663666 0.342560 -0.146545 0.505737 0.190948 -0.167267 0.511658 0.195679 -0.189026 0.517700 0.200531 -0.211609 0.523895 0.205475 -0.234833 0.529846 0.210358 -0.258789 0.536133 0.215393 -0.283264 0.542358 0.220459 -0.308014 0.548553 0.225525 -0.333221 0.554871 0.230713 -0.358643 0.561279 0.235931 -0.384094 0.567474 0.241058 -0.409668 0.573883 0.246368 -0.434998 0.580170 0.251617 -0.460358 0.586609 0.256958 -0.486115 0.593018 0.262299 -0.512360 0.599304 0.267548 -0.539368 0.605743 0.272980 -0.566803 0.612091 0.278381 -0.594299 0.618347 0.283691 -0.622040 0.624664 0.289124 -0.649689 0.631042 0.294556 -0.676910 0.637177 0.299866 -0.703918 0.643494 0.305267 -0.730255 0.649536 0.310577 -0.756256 0.655731 0.315979 -0.781647 0.661865 0.321320 -0.806152 0.667755 0.326569 -0.830109 0.673828 0.331909 -0.853271 0.679718 0.337128 -0.875366 0.685486 0.342316 -0.896698 0.691254 0.347565 -0.916931 0.696991 0.352753 -0.155273 0.539429 0.200409 -0.176483 0.545502 0.205231 -0.198669 0.551788 0.210236 -0.221588 0.558105 0.215271 -0.245148 0.564240 0.220245 -0.269287 0.570587 0.225403 -0.294006 0.577057 0.230560 -0.318939 0.583221 0.235718 -0.344299 0.589661 0.240967 -0.369629 0.595947 0.246124 -0.395233 0.602448 0.251434 -0.420746 0.608826 0.256805 -0.446045 0.615112 0.262024 -0.471466 0.621613 0.267426 -0.497437 0.627960 0.272858 -0.524017 0.634247 0.278137 -0.551147 0.640594 0.283539 -0.578705 0.646912 0.288971 -0.606201 0.653076 0.294281 -0.633911 0.659363 0.299744 -0.661438 0.665558 0.305145 -0.688446 0.671600 0.310394 -0.715240 0.677734 0.315826 -0.741302 0.683624 0.321075 -0.766968 0.689636 0.326416 -0.791992 0.695557 0.331757 -0.816223 0.701324 0.336884 -0.839783 0.707123 0.342224 -0.862518 0.712921 0.347443 -0.884155 0.718414 0.352478 -0.904999 0.724030 0.357666 -0.924744 0.729492 0.362762 -0.164337 0.573853 0.210144 -0.185913 0.580078 0.215027 -0.208466 0.586456 0.220123 -0.231750 0.592834 0.225250 -0.255554 0.599121 0.230347 -0.279999 0.605530 0.235596 -0.304901 0.612000 0.240845 -0.329956 0.618286 0.245941 -0.355377 0.624664 0.251312 -0.380707 0.631012 0.256531 -0.406311 0.637360 0.261932 -0.431824 0.643799 0.267303 -0.457031 0.650055 0.272583 -0.482605 0.656403 0.278015 -0.508942 0.662720 0.283417 -0.535675 0.668854 0.288696 -0.562988 0.675140 0.294159 -0.590576 0.681305 0.299561 -0.618103 0.687317 0.304901 -0.645630 0.693420 0.310272 -0.672852 0.699280 0.315552 -0.699799 0.705292 0.320953 -0.726288 0.711243 0.326324 -0.752106 0.716949 0.331482 -0.777466 0.722778 0.336761 -0.802155 0.728546 0.342041 -0.825989 0.734009 0.347168 -0.849121 0.739655 0.352356 -0.871429 0.745148 0.357544 -0.892609 0.750458 0.362518 -0.912994 0.755768 0.367554 -0.932159 0.760895 0.372467 -0.173584 0.608704 0.220001 -0.195587 0.614960 0.225037 -0.218506 0.621399 0.230194 -0.242065 0.627838 0.235413 -0.266113 0.634125 0.240540 -0.290741 0.640533 0.245819 -0.315796 0.646912 0.251190 -0.340973 0.653168 0.256378 -0.366455 0.659576 0.261749 -0.391876 0.665802 0.267029 -0.417389 0.672089 0.272430 -0.442841 0.678406 0.277893 -0.467987 0.684479 0.283142 -0.493896 0.690704 0.288574 -0.520447 0.696838 0.294006 -0.547363 0.702850 0.299286 -0.574768 0.708954 0.304718 -0.602325 0.714996 0.310120 -0.629822 0.720795 0.315399 -0.657257 0.726715 0.320770 -0.684296 0.732422 0.326019 -0.710907 0.738190 0.331360 -0.737152 0.743958 0.336639 -0.762665 0.749420 0.341797 -0.787659 0.755005 0.347046 -0.811981 0.760498 0.352234 -0.835449 0.765778 0.357269 -0.858154 0.771088 0.362396 -0.880066 0.776337 0.367432 -0.900787 0.781372 0.372314 -0.920624 0.786438 0.377258 -0.939240 0.791351 0.382050 -0.183075 0.643646 0.230042 -0.205444 0.649902 0.235199 -0.228668 0.656281 0.240417 -0.252533 0.662659 0.245728 -0.276764 0.668854 0.250946 -0.301636 0.675201 0.256256 -0.326630 0.681335 0.261505 -0.352020 0.687653 0.266876 -0.377533 0.693909 0.272308 -0.402924 0.699982 0.277588 -0.428436 0.706146 0.283020 -0.453735 0.712311 0.288452 -0.479065 0.718231 0.293732 -0.505188 0.724304 0.299164 -0.531982 0.730286 0.304565 -0.558960 0.736084 0.309875 -0.586456 0.741943 0.315247 -0.613861 0.747650 0.320526 -0.641357 0.753418 0.325897 -0.668640 0.759094 0.331238 -0.695374 0.764587 0.336395 -0.721863 0.770111 0.341675 -0.747742 0.775574 0.346924 -0.772919 0.780823 0.351990 -0.797607 0.786133 0.357117 -0.821503 0.791382 0.362244 -0.844604 0.796417 0.367157 -0.866913 0.801453 0.372192 -0.888214 0.806305 0.376984 -0.908600 0.811188 0.381927 -0.927917 0.815979 0.386688 -0.945984 0.820496 0.391357 -0.192780 0.678314 0.240295 -0.215454 0.684418 0.245422 -0.239014 0.690704 0.250824 -0.263092 0.696960 0.256104 -0.287567 0.703064 0.261383 -0.312500 0.709290 0.266754 -0.337646 0.715302 0.272034 -0.363098 0.721405 0.277466 -0.388580 0.727539 0.282898 -0.413910 0.733459 0.288177 -0.439331 0.739471 0.293610 -0.464569 0.745422 0.299011 -0.490143 0.751129 0.304321 -0.516541 0.756989 0.309753 -0.543427 0.762756 0.315155 -0.570557 0.768372 0.320404 -0.598022 0.774017 0.325745 -0.625397 0.779419 0.330963 -0.652710 0.784943 0.336273 -0.679840 0.790405 0.341522 -0.706299 0.795624 0.346649 -0.732452 0.800903 0.351807 -0.758057 0.806122 0.356995 -0.782898 0.811096 0.362030 -0.807220 0.816162 0.367004 -0.830780 0.821106 0.372070 -0.853394 0.825775 0.376862 -0.875275 0.830566 0.381805 -0.896118 0.835114 0.386475 -0.916046 0.839722 0.391235 -0.934845 0.844177 0.395905 -0.952454 0.848419 0.400452 -0.202606 0.712311 0.250641 -0.225616 0.718292 0.255859 -0.249420 0.724518 0.261230 -0.273590 0.730469 0.266479 -0.298309 0.736572 0.271912 -0.323395 0.742615 0.277313 -0.348602 0.748474 0.282623 -0.374023 0.754425 0.288055 -0.399536 0.760315 0.293488 -0.424835 0.765961 0.298767 -0.450134 0.771759 0.304199 -0.475433 0.777496 0.309601 -0.501251 0.783051 0.314880 -0.527863 0.788696 0.320251 -0.554718 0.794098 0.325500 -0.582001 0.799561 0.330811 -0.609467 0.804932 0.336121 -0.636749 0.810150 0.341278 -0.663879 0.815369 0.346527 -0.690704 0.820496 0.351685 -0.716980 0.825470 0.356750 -0.742767 0.830475 0.361877 -0.768066 0.835388 0.366913 -0.792542 0.840057 0.371826 -0.816498 0.844849 0.376770 -0.839569 0.849335 0.381531 -0.861847 0.853851 0.386353 -0.883301 0.858337 0.391144 -0.903687 0.862579 0.395691 -0.923126 0.866791 0.400330 -0.941437 0.870941 0.404846 -0.958527 0.874908 0.409180 -0.212585 0.745636 0.261078 -0.235870 0.751465 0.266327 -0.259888 0.757446 0.271790 -0.284271 0.763214 0.277069 -0.309113 0.769135 0.282471 -0.334320 0.774963 0.287903 -0.359558 0.780609 0.293182 -0.385010 0.786377 0.298645 -0.410431 0.792023 0.304047 -0.435669 0.797546 0.309326 -0.460815 0.803070 0.314728 -0.486328 0.808533 0.320129 -0.512360 0.813812 0.325378 -0.539093 0.819183 0.330719 -0.565979 0.824341 0.335876 -0.593353 0.829529 0.341156 -0.620697 0.834656 0.346405 -0.647858 0.839539 0.351471 -0.674805 0.844482 0.356628 -0.701355 0.849365 0.361755 -0.727295 0.854004 0.366669 -0.752838 0.858704 0.371704 -0.777740 0.863312 0.376648 -0.801910 0.867645 0.381439 -0.825439 0.872070 0.386261 -0.848083 0.876251 0.390869 -0.870026 0.880432 0.395569 -0.891022 0.884613 0.400238 -0.910889 0.888458 0.404602 -0.929840 0.892365 0.409088 -0.947662 0.896210 0.413452 -0.964203 0.899811 0.417633 -0.222534 0.777771 0.271484 -0.246185 0.783661 0.276886 -0.270447 0.789429 0.282349 -0.294922 0.795074 0.287628 -0.319946 0.800690 0.293060 -0.345184 0.806305 0.298523 -0.370453 0.811737 0.303772 -0.395844 0.817230 0.309204 -0.421204 0.822632 0.314606 -0.446289 0.827881 0.319855 -0.471466 0.833160 0.325256 -0.497131 0.838226 0.330414 -0.523438 0.843384 0.335754 -0.550262 0.848419 0.341003 -0.577209 0.853302 0.346130 -0.604492 0.858124 0.351318 -0.631775 0.862946 0.356506 -0.658661 0.867554 0.361481 -0.685425 0.872192 0.366516 -0.711700 0.876740 0.371552 -0.737335 0.881042 0.376404 -0.762573 0.885406 0.381287 -0.787170 0.889709 0.386108 -0.810944 0.893738 0.390747 -0.834076 0.897797 0.395447 -0.856323 0.901642 0.400024 -0.877747 0.905518 0.404480 -0.898315 0.909271 0.408997 -0.917725 0.912842 0.413269 -0.936188 0.916443 0.417542 -0.953522 0.919891 0.421753 -0.969543 0.923096 0.425781 -0.232697 0.809174 0.282074 -0.256622 0.814819 0.287506 -0.280975 0.820343 0.292908 -0.305603 0.825684 0.298218 -0.330750 0.831055 0.303650 -0.356018 0.836395 0.309082 -0.381226 0.841583 0.314362 -0.406586 0.846802 0.319733 -0.431854 0.851929 0.325104 -0.456787 0.856873 0.330292 -0.482086 0.861847 0.335602 -0.507904 0.866638 0.340729 -0.534424 0.871460 0.345978 -0.561279 0.876221 0.351196 -0.588257 0.880768 0.356262 -0.615448 0.885345 0.361389 -0.642578 0.889832 0.366394 -0.669342 0.894073 0.371307 -0.695740 0.898346 0.376282 -0.721802 0.902557 0.381165 -0.747070 0.906525 0.385864 -0.771973 0.910553 0.390625 -0.796051 0.914368 0.395233 -0.819611 0.918152 0.399902 -0.842316 0.921875 0.404388 -0.864136 0.925385 0.408783 -0.885162 0.928894 0.413177 -0.905243 0.932312 0.417419 -0.924194 0.935486 0.421539 -0.942169 0.938690 0.425690 -0.958954 0.941772 0.429718 -0.974457 0.944672 0.433533 -0.242920 0.839355 0.292633 -0.267029 0.844696 0.298065 -0.291534 0.849945 0.303528 -0.316254 0.855011 0.308777 -0.341431 0.860138 0.314209 -0.366699 0.865204 0.319550 -0.391876 0.870087 0.324799 -0.417145 0.875000 0.330139 -0.442169 0.879730 0.335358 -0.467133 0.884491 0.340607 -0.492706 0.889160 0.345856 -0.518646 0.893555 0.350922 -0.545288 0.898071 0.356110 -0.572174 0.902466 0.361267 -0.599091 0.906616 0.366150 -0.626160 0.910889 0.371185 -0.653137 0.914978 0.376129 -0.679596 0.918945 0.380951 -0.705750 0.922852 0.385742 -0.731476 0.926636 0.390503 -0.756500 0.930328 0.395111 -0.781006 0.933960 0.399780 -0.804718 0.937408 0.404144 -0.827881 0.940826 0.408630 -0.850220 0.944183 0.413025 -0.871613 0.947327 0.417236 -0.892212 0.950470 0.421478 -0.911774 0.953461 0.425598 -0.930267 0.956360 0.429535 -0.947754 0.959167 0.433441 -0.964081 0.961914 0.437286 -0.979095 0.964447 0.440948 -0.253143 0.868103 0.303223 -0.277405 0.873138 0.308655 -0.302063 0.878143 0.314087 -0.326904 0.882935 0.319305 -0.352051 0.887695 0.324677 -0.377319 0.892456 0.330017 -0.402435 0.897003 0.335236 -0.427612 0.901581 0.340485 -0.452423 0.905975 0.345612 -0.477509 0.910370 0.350800 -0.503235 0.914703 0.355988 -0.529266 0.918823 0.360992 -0.555939 0.922943 0.366028 -0.582825 0.926971 0.371033 -0.609680 0.930817 0.375916 -0.636688 0.934692 0.380829 -0.663391 0.938416 0.385620 -0.689606 0.942017 0.390320 -0.715424 0.945496 0.394989 -0.740723 0.948883 0.399506 -0.765533 0.952271 0.404022 -0.789642 0.955505 0.408539 -0.813019 0.958618 0.412842 -0.835724 0.961639 0.417114 -0.857666 0.964569 0.421326 -0.878662 0.967377 0.425354 -0.898773 0.970123 0.429443 -0.917969 0.972778 0.433350 -0.935974 0.975281 0.437073 -0.953003 0.977753 0.440826 -0.968750 0.980011 0.444366 -0.983337 0.982330 0.447906 -0.037384 0.036804 0.081207 -0.050232 0.037994 0.082764 -0.062958 0.039154 0.084320 -0.076324 0.040466 0.086060 -0.090515 0.041840 0.087830 -0.105865 0.043243 0.089661 -0.122437 0.044708 0.091644 -0.140137 0.046265 0.093719 -0.158783 0.047852 0.095856 -0.178375 0.049500 0.098083 -0.198730 0.051208 0.100372 -0.219910 0.053009 0.102905 -0.241760 0.054901 0.105408 -0.264099 0.056763 0.107971 -0.287018 0.058777 0.110779 -0.310394 0.060822 0.113617 -0.334015 0.062897 0.116486 -0.358063 0.065094 0.119537 -0.382233 0.067352 0.122681 -0.406372 0.069611 0.125854 -0.430695 0.071991 0.129211 -0.454956 0.074493 0.132629 -0.479340 0.076965 0.136078 -0.504639 0.079590 0.139679 -0.530365 0.082245 0.143311 -0.556793 0.085022 0.147095 -0.583588 0.087891 0.151001 -0.610443 0.090790 0.154907 -0.637512 0.093811 0.158936 -0.664490 0.096985 0.163116 -0.691071 0.100128 0.167267 -0.717438 0.103424 0.171600 -0.040344 0.048553 0.084290 -0.053223 0.049927 0.085999 -0.066193 0.051270 0.087708 -0.079834 0.052765 0.089630 -0.094421 0.054321 0.091583 -0.110229 0.055878 0.093567 -0.127289 0.057556 0.095795 -0.145416 0.059296 0.098022 -0.164459 0.061096 0.100342 -0.184448 0.062927 0.102814 -0.205200 0.064850 0.105286 -0.226746 0.066864 0.107941 -0.248932 0.068939 0.110718 -0.271606 0.071075 0.113464 -0.294800 0.073303 0.116425 -0.318451 0.075592 0.119476 -0.342346 0.077911 0.122559 -0.366516 0.080414 0.125763 -0.390900 0.082947 0.129089 -0.415222 0.085510 0.132446 -0.439636 0.088196 0.135986 -0.463867 0.090973 0.139496 -0.488831 0.093872 0.143188 -0.514435 0.096832 0.147003 -0.540497 0.099884 0.150818 -0.567200 0.103058 0.154785 -0.594177 0.106293 0.158875 -0.621185 0.109619 0.162903 -0.648315 0.113037 0.167175 -0.675323 0.116577 0.171448 -0.701843 0.120087 0.175720 -0.728149 0.123779 0.180237 -0.043549 0.061127 0.087677 -0.056488 0.062683 0.089569 -0.069672 0.064240 0.091492 -0.083679 0.065948 0.093536 -0.098755 0.067688 0.095734 -0.115021 0.069489 0.097931 -0.132507 0.071381 0.100281 -0.151001 0.073303 0.102692 -0.170563 0.075378 0.105225 -0.190948 0.077484 0.107849 -0.212097 0.079681 0.110565 -0.233978 0.081940 0.113403 -0.256500 0.084320 0.116364 -0.279449 0.086731 0.119293 -0.302979 0.089264 0.122467 -0.326874 0.091919 0.125671 -0.350952 0.094574 0.128906 -0.375366 0.097382 0.132355 -0.399902 0.100311 0.135895 -0.424316 0.103241 0.139404 -0.448822 0.106354 0.143127 -0.473297 0.109467 0.146820 -0.498596 0.112762 0.150696 -0.524567 0.116150 0.154694 -0.550903 0.119507 0.158661 -0.577911 0.123077 0.162811 -0.605042 0.126709 0.167023 -0.632172 0.130371 0.171234 -0.659363 0.134186 0.175598 -0.686279 0.138123 0.180115 -0.712769 0.141998 0.184570 -0.738953 0.146088 0.189178 -0.046936 0.074738 0.091461 -0.059998 0.076538 0.093506 -0.073486 0.078339 0.095612 -0.087860 0.080261 0.097870 -0.103424 0.082275 0.100220 -0.120178 0.084351 0.102631 -0.138153 0.086517 0.105164 -0.157074 0.088745 0.107727 -0.177032 0.091125 0.110474 -0.197876 0.093567 0.113342 -0.219360 0.096039 0.116211 -0.241608 0.098694 0.119202 -0.264435 0.101410 0.122375 -0.287720 0.104187 0.125519 -0.311462 0.107117 0.128815 -0.335663 0.110138 0.132263 -0.359924 0.113190 0.135712 -0.384521 0.116364 0.139313 -0.409027 0.119568 0.142914 -0.433655 0.122955 0.146729 -0.458221 0.126434 0.150604 -0.483063 0.129944 0.154480 -0.508759 0.133575 0.158539 -0.535034 0.137329 0.162689 -0.561707 0.141083 0.166809 -0.588806 0.145020 0.171143 -0.616119 0.148987 0.175507 -0.643341 0.152954 0.179901 -0.670502 0.157166 0.184448 -0.697235 0.161285 0.188934 -0.723724 0.165649 0.193634 -0.749786 0.170013 0.198425 -0.050568 0.089722 0.095581 -0.063843 0.091797 0.097839 -0.077637 0.093903 0.100098 -0.092438 0.096161 0.102600 -0.108521 0.098511 0.105103 -0.125732 0.100891 0.107666 -0.144165 0.103394 0.110413 -0.163513 0.105988 0.113190 -0.183929 0.108704 0.116119 -0.205170 0.111511 0.119141 -0.226990 0.114380 0.122223 -0.249573 0.117371 0.125458 -0.272766 0.120453 0.128723 -0.296295 0.123596 0.132080 -0.320312 0.126892 0.135620 -0.344574 0.130188 0.139130 -0.369171 0.133667 0.142822 -0.393921 0.137238 0.146637 -0.418549 0.140808 0.150421 -0.443237 0.144531 0.154388 -0.467957 0.148376 0.158447 -0.493195 0.152191 0.162476 -0.519196 0.156219 0.166718 -0.545776 0.160278 0.170990 -0.572693 0.164337 0.175293 -0.599976 0.168640 0.179779 -0.627441 0.172943 0.184326 -0.654633 0.177277 0.188843 -0.681793 0.181732 0.193512 -0.708466 0.186218 0.198181 -0.734833 0.190796 0.203003 -0.760681 0.195496 0.207886 -0.054443 0.106415 0.100037 -0.067932 0.108826 0.102509 -0.082062 0.111237 0.104950 -0.097351 0.113861 0.107605 -0.113892 0.116486 0.110291 -0.131622 0.119263 0.113129 -0.150604 0.122162 0.116058 -0.170410 0.125092 0.119019 -0.191162 0.128174 0.122131 -0.212799 0.131317 0.125366 -0.234985 0.134521 0.128601 -0.257935 0.137909 0.132019 -0.281372 0.141388 0.135498 -0.305176 0.144806 0.139038 -0.329468 0.148438 0.142731 -0.353943 0.152100 0.146454 -0.378693 0.155914 0.150330 -0.403534 0.159790 0.154266 -0.428253 0.163727 0.158234 -0.453033 0.167786 0.162384 -0.477997 0.171936 0.166595 -0.503571 0.176117 0.170807 -0.529968 0.180389 0.175171 -0.556824 0.184875 0.179688 -0.583923 0.189178 0.184082 -0.611359 0.193787 0.188721 -0.638702 0.198334 0.193298 -0.666077 0.203003 0.198059 -0.693176 0.207764 0.202881 -0.719635 0.212463 0.207642 -0.745880 0.217346 0.212585 -0.771576 0.222290 0.217590 -0.058533 0.124878 0.104889 -0.072296 0.127625 0.107544 -0.086853 0.130402 0.110229 -0.102661 0.133362 0.113037 -0.119659 0.136292 0.115875 -0.137970 0.139465 0.118896 -0.157349 0.142670 0.122070 -0.177612 0.145966 0.125183 -0.198822 0.149384 0.128479 -0.220795 0.152863 0.131897 -0.243347 0.156403 0.135315 -0.266602 0.160126 0.138947 -0.290344 0.163940 0.142639 -0.314392 0.167694 0.146332 -0.338867 0.171661 0.150238 -0.363556 0.175629 0.154083 -0.388458 0.179749 0.158112 -0.413422 0.184021 0.162292 -0.438202 0.188232 0.166412 -0.463013 0.192596 0.170715 -0.488373 0.197052 0.175079 -0.514313 0.201538 0.179443 -0.540955 0.206116 0.183990 -0.568085 0.210785 0.188629 -0.595367 0.215454 0.193176 -0.622894 0.220276 0.197937 -0.650269 0.225067 0.202667 -0.677582 0.230011 0.207550 -0.704498 0.235016 0.212494 -0.730957 0.239929 0.217346 -0.756958 0.245087 0.222412 -0.782440 0.250244 0.227539 -0.062897 0.145081 0.110138 -0.076904 0.148041 0.112885 -0.091980 0.151245 0.115814 -0.108368 0.154572 0.118835 -0.125885 0.157837 0.121887 -0.144653 0.161255 0.125122 -0.164520 0.164856 0.128418 -0.185181 0.168427 0.131744 -0.206818 0.172180 0.135223 -0.229156 0.176025 0.138855 -0.252045 0.179871 0.142456 -0.275574 0.183899 0.146271 -0.299500 0.187897 0.150055 -0.323883 0.192078 0.153992 -0.348602 0.196381 0.158020 -0.373413 0.200623 0.162079 -0.398407 0.205078 0.166290 -0.423462 0.209595 0.170593 -0.448273 0.214050 0.174896 -0.473328 0.218750 0.179352 -0.499054 0.223480 0.183868 -0.525299 0.228210 0.188385 -0.552246 0.233093 0.193054 -0.579437 0.237854 0.197693 -0.606995 0.242889 0.202515 -0.634613 0.247925 0.207397 -0.661926 0.252930 0.212250 -0.689087 0.258118 0.217224 -0.715942 0.263306 0.222260 -0.742157 0.268463 0.227264 -0.768005 0.273773 0.232452 -0.793274 0.279144 0.237640 -0.067535 0.166870 0.115753 -0.081909 0.170166 0.118683 -0.097473 0.173645 0.121826 -0.114380 0.177277 0.125031 -0.132446 0.180847 0.128265 -0.151764 0.184662 0.131653 -0.172028 0.188538 0.135162 -0.193115 0.192444 0.138672 -0.215149 0.196472 0.142365 -0.237793 0.200623 0.146149 -0.260986 0.204742 0.149933 -0.284882 0.209076 0.153870 -0.309021 0.213409 0.157867 -0.333679 0.217804 0.161987 -0.358521 0.222412 0.166199 -0.383484 0.226929 0.170380 -0.408600 0.231659 0.174744 -0.433685 0.236450 0.179199 -0.458557 0.241180 0.183624 -0.483917 0.246094 0.188232 -0.509979 0.251099 0.192932 -0.536560 0.255981 0.197571 -0.563721 0.261108 0.202393 -0.591064 0.266113 0.207123 -0.618683 0.271362 0.212097 -0.646332 0.276611 0.217102 -0.673584 0.281799 0.222046 -0.700653 0.287170 0.227112 -0.727356 0.292572 0.232269 -0.753418 0.297852 0.237335 -0.779053 0.303314 0.242615 -0.804047 0.308807 0.247925 -0.072418 0.190063 0.121735 -0.087219 0.193726 0.124847 -0.103363 0.197510 0.128204 -0.120819 0.201447 0.131561 -0.139404 0.205322 0.134979 -0.159149 0.209412 0.138611 -0.179901 0.213623 0.142273 -0.201416 0.217743 0.145966 -0.223755 0.222107 0.149841 -0.246704 0.226440 0.153687 -0.270355 0.230957 0.157745 -0.294434 0.235535 0.161835 -0.318817 0.240051 0.165955 -0.343689 0.244843 0.170258 -0.368713 0.249664 0.174652 -0.393738 0.254425 0.178986 -0.418915 0.259369 0.183502 -0.444061 0.264374 0.188110 -0.468994 0.269318 0.192688 -0.494720 0.274445 0.197449 -0.520996 0.279541 0.202148 -0.548004 0.284790 0.207031 -0.575409 0.290100 0.211945 -0.602905 0.295319 0.216827 -0.630585 0.300720 0.221893 -0.658173 0.306122 0.227020 -0.685303 0.311432 0.232025 -0.712280 0.316925 0.237244 -0.738770 0.322510 0.242493 -0.764587 0.327942 0.247681 -0.789948 0.333527 0.253021 -0.814514 0.338959 0.258179 -0.077606 0.214722 0.128082 -0.092926 0.218628 0.131409 -0.109619 0.222687 0.134888 -0.127625 0.226898 0.138489 -0.146729 0.231079 0.142090 -0.166931 0.235443 0.145874 -0.188110 0.239899 0.149719 -0.210022 0.244324 0.153595 -0.232758 0.248932 0.157654 -0.256012 0.253510 0.161682 -0.279907 0.258270 0.165833 -0.304260 0.263092 0.170166 -0.328918 0.267914 0.174438 -0.353912 0.272888 0.178894 -0.379059 0.277893 0.183441 -0.404144 0.282898 0.187897 -0.429382 0.288025 0.192566 -0.454529 0.293243 0.197327 -0.479767 0.298401 0.202026 -0.505890 0.303711 0.206879 -0.532440 0.308960 0.211731 -0.559631 0.314362 0.216705 -0.587189 0.319855 0.221771 -0.614777 0.325195 0.226746 -0.642487 0.330719 0.231873 -0.669952 0.336273 0.237122 -0.697021 0.341705 0.242218 -0.723816 0.347321 0.247498 -0.750122 0.352997 0.252838 -0.775696 0.358429 0.258026 -0.800751 0.364105 0.263428 -0.825043 0.369629 0.268707 -0.083099 0.240509 0.134796 -0.098969 0.244690 0.138306 -0.116241 0.249084 0.141968 -0.134796 0.253540 0.145752 -0.154388 0.257965 0.149536 -0.175079 0.262573 0.153473 -0.196533 0.267181 0.157440 -0.218933 0.271942 0.161560 -0.242004 0.276764 0.165710 -0.265564 0.281586 0.169922 -0.289764 0.286591 0.174286 -0.314362 0.291656 0.178741 -0.339142 0.296631 0.183197 -0.364288 0.301788 0.187775 -0.389587 0.307037 0.192474 -0.414734 0.312164 0.197083 -0.440063 0.317505 0.201935 -0.465210 0.322937 0.206757 -0.490723 0.328186 0.211609 -0.517212 0.333710 0.216583 -0.544006 0.339050 0.221527 -0.571442 0.344574 0.226624 -0.599121 0.350159 0.231781 -0.626740 0.355591 0.236847 -0.654419 0.361267 0.242126 -0.681824 0.366882 0.247345 -0.708740 0.372406 0.252594 -0.735321 0.378082 0.257935 -0.761200 0.383606 0.263184 -0.786682 0.389343 0.268585 -0.811493 0.394989 0.274048 -0.835388 0.400574 0.279358 -0.088959 0.267456 0.141907 -0.105347 0.271881 0.145599 -0.123230 0.276459 0.149414 -0.142303 0.281219 0.153381 -0.162354 0.285858 0.157318 -0.183533 0.290680 0.161438 -0.205383 0.295532 0.165497 -0.228119 0.300507 0.169830 -0.251587 0.305542 0.174164 -0.275360 0.310547 0.178528 -0.299835 0.315704 0.183105 -0.324646 0.320984 0.187683 -0.349609 0.326111 0.192230 -0.374908 0.331451 0.196991 -0.400269 0.336853 0.201782 -0.425446 0.342133 0.206512 -0.450714 0.347595 0.211456 -0.475952 0.353027 0.216339 -0.502045 0.358521 0.221375 -0.528748 0.364105 0.226440 -0.555786 0.369568 0.231506 -0.583374 0.375214 0.236725 -0.611145 0.380859 0.241943 -0.638733 0.386383 0.247070 -0.666351 0.392090 0.252411 -0.693634 0.397766 0.257812 -0.720306 0.403259 0.263031 -0.746704 0.409027 0.268433 -0.772369 0.414551 0.273773 -0.797577 0.420227 0.279205 -0.822052 0.425964 0.284668 -0.845642 0.431458 0.290039 -0.095093 0.295349 0.149353 -0.112122 0.299957 0.153168 -0.130554 0.304810 0.157227 -0.150055 0.309631 0.161224 -0.170715 0.314575 0.165405 -0.192261 0.319672 0.169739 -0.214539 0.324646 0.173981 -0.237610 0.329803 0.178406 -0.261383 0.335022 0.182983 -0.285461 0.340179 0.187439 -0.310120 0.345520 0.192078 -0.335144 0.350891 0.196869 -0.360229 0.356201 0.201538 -0.385620 0.361664 0.206421 -0.410889 0.367035 0.211212 -0.436249 0.372589 0.216217 -0.461487 0.378204 0.221283 -0.487030 0.383636 0.226227 -0.513458 0.389282 0.231384 -0.540436 0.394867 0.236572 -0.567688 0.400391 0.241699 -0.595398 0.406067 0.246979 -0.623169 0.411743 0.252319 -0.650757 0.417297 0.257507 -0.678284 0.423004 0.262878 -0.705322 0.428680 0.268280 -0.731842 0.434265 0.273621 -0.757996 0.439911 0.279083 -0.783356 0.445557 0.284424 -0.808258 0.451355 0.289886 -0.832397 0.457184 0.295380 -0.855591 0.462891 0.300720 -0.101685 0.324036 0.157135 -0.119293 0.328857 0.161133 -0.138245 0.333923 0.165314 -0.158203 0.338867 0.169525 -0.179291 0.344055 0.173828 -0.201324 0.349243 0.178314 -0.223999 0.354401 0.182739 -0.247406 0.359741 0.187286 -0.271393 0.365051 0.192017 -0.295746 0.370361 0.196625 -0.320618 0.375824 0.201416 -0.345825 0.381287 0.206268 -0.371002 0.386719 0.211090 -0.396454 0.392242 0.216095 -0.421753 0.397705 0.221039 -0.447113 0.403259 0.226135 -0.472443 0.408997 0.231232 -0.498322 0.414459 0.236328 -0.525055 0.420105 0.241577 -0.552277 0.425781 0.246857 -0.579712 0.431305 0.252045 -0.607452 0.436951 0.257385 -0.635223 0.442749 0.262756 -0.662750 0.448364 0.268005 -0.690063 0.454163 0.273499 -0.716888 0.459900 0.278809 -0.743256 0.465820 0.284241 -0.769135 0.471741 0.289734 -0.794250 0.477539 0.295135 -0.818817 0.483521 0.300568 -0.842529 0.489563 0.306061 -0.865356 0.495422 0.311432 -0.108490 0.353241 0.165131 -0.126770 0.358398 0.169373 -0.146271 0.363556 0.173767 -0.166748 0.368713 0.178101 -0.188324 0.373993 0.182648 -0.210663 0.379333 0.187195 -0.233643 0.384613 0.191772 -0.257385 0.390045 0.196503 -0.281677 0.395508 0.201294 -0.306244 0.400879 0.206024 -0.331299 0.406372 0.210999 -0.356506 0.411804 0.215851 -0.381927 0.417389 0.220917 -0.407410 0.423004 0.225983 -0.432648 0.428467 0.230988 -0.458008 0.434113 0.236206 -0.483643 0.439819 0.241425 -0.509888 0.445435 0.246582 -0.536804 0.451202 0.251892 -0.564209 0.457031 0.257233 -0.591766 0.462769 0.262482 -0.619568 0.468719 0.267883 -0.647308 0.474670 0.273376 -0.674713 0.480499 0.278687 -0.701782 0.486572 0.284119 -0.728394 0.492523 0.289490 -0.754578 0.498596 0.294922 -0.780151 0.504700 0.300446 -0.804932 0.510681 0.305786 -0.829102 0.516815 0.311310 -0.852509 0.522919 0.316803 -0.874908 0.528900 0.322113 -0.115845 0.383209 0.173676 -0.134583 0.388336 0.177979 -0.154633 0.393677 0.182495 -0.175568 0.398895 0.187012 -0.197510 0.404297 0.191650 -0.220245 0.409729 0.196411 -0.243591 0.415070 0.201080 -0.267548 0.420563 0.205933 -0.292114 0.426147 0.210876 -0.316864 0.431519 0.215698 -0.342102 0.437073 0.220734 -0.367523 0.442749 0.225830 -0.392883 0.448303 0.230835 -0.418396 0.454132 0.236084 -0.443665 0.459808 0.241180 -0.468994 0.465668 0.246460 -0.494995 0.471619 0.251770 -0.521484 0.477478 0.257019 -0.548645 0.483459 0.262329 -0.576233 0.489563 0.267761 -0.603821 0.495483 0.273071 -0.631653 0.501648 0.278503 -0.659332 0.507812 0.283997 -0.686523 0.513824 0.289307 -0.713501 0.520020 0.294800 -0.739777 0.526093 0.300171 -0.765717 0.532288 0.305664 -0.790924 0.538513 0.311188 -0.815430 0.544586 0.316528 -0.839233 0.550812 0.321991 -0.862244 0.557007 0.327484 -0.884155 0.563080 0.332825 -0.123322 0.413269 0.182281 -0.142792 0.418610 0.186890 -0.163269 0.423981 0.191528 -0.184662 0.429291 0.196167 -0.206970 0.434753 0.200897 -0.230072 0.440277 0.205811 -0.253693 0.445740 0.210571 -0.277985 0.451416 0.215576 -0.302704 0.457153 0.220612 -0.327698 0.462799 0.225616 -0.353058 0.468658 0.230743 -0.378357 0.474426 0.235809 -0.403870 0.480408 0.241028 -0.429382 0.486481 0.246307 -0.454651 0.492371 0.251526 -0.480194 0.498444 0.256836 -0.506531 0.504639 0.262207 -0.533264 0.510651 0.267487 -0.560638 0.516876 0.272949 -0.588257 0.523102 0.278381 -0.615967 0.529205 0.283722 -0.643677 0.535522 0.289185 -0.671265 0.541809 0.294678 -0.698212 0.547943 0.300049 -0.725006 0.554230 0.305542 -0.751007 0.560364 0.310913 -0.776611 0.566620 0.316406 -0.801575 0.572906 0.321869 -0.825684 0.579010 0.327209 -0.849121 0.585205 0.332672 -0.871674 0.591400 0.338104 -0.893158 0.597443 0.343353 -0.131256 0.443604 0.191284 -0.151215 0.449158 0.196045 -0.172180 0.454712 0.200806 -0.194000 0.460266 0.205566 -0.216675 0.466003 0.210449 -0.240143 0.471832 0.215454 -0.264069 0.477539 0.220337 -0.288574 0.483490 0.225464 -0.313446 0.489502 0.230591 -0.338593 0.495392 0.235718 -0.364075 0.501495 0.240906 -0.389435 0.507477 0.246063 -0.414948 0.513641 0.251373 -0.440430 0.519897 0.256714 -0.465668 0.526001 0.261963 -0.491547 0.532257 0.267365 -0.518158 0.538574 0.272797 -0.545135 0.544769 0.278137 -0.572632 0.551086 0.283569 -0.600372 0.557404 0.289062 -0.627960 0.563629 0.294403 -0.655670 0.570007 0.299896 -0.682831 0.576172 0.305267 -0.709839 0.582550 0.310760 -0.736267 0.588837 0.316254 -0.762054 0.595001 0.321625 -0.787384 0.601257 0.327087 -0.811951 0.607513 0.332550 -0.835693 0.613556 0.337830 -0.858734 0.619751 0.343231 -0.880859 0.625885 0.348663 -0.901886 0.631775 0.353851 -0.139526 0.475067 0.200562 -0.159973 0.480896 0.205414 -0.181396 0.486755 0.210358 -0.203583 0.492584 0.215210 -0.226685 0.498596 0.220245 -0.250397 0.504639 0.225342 -0.274536 0.510620 0.230377 -0.299255 0.516785 0.235565 -0.324249 0.522827 0.240662 -0.349609 0.529053 0.245880 -0.375122 0.535370 0.251251 -0.400574 0.541473 0.256470 -0.426056 0.547791 0.261810 -0.451477 0.554199 0.267212 -0.476837 0.560425 0.272552 -0.503082 0.566772 0.277985 -0.529846 0.573212 0.283417 -0.557037 0.579407 0.288757 -0.584625 0.585815 0.294281 -0.612366 0.592224 0.299774 -0.639954 0.598419 0.305145 -0.667450 0.604767 0.310638 -0.694519 0.610992 0.316010 -0.721222 0.617279 0.321472 -0.747437 0.623596 0.326965 -0.772888 0.629669 0.332306 -0.797852 0.635864 0.337708 -0.822144 0.642029 0.343109 -0.845459 0.647980 0.348358 -0.868073 0.654022 0.353699 -0.889771 0.659973 0.359039 -0.910278 0.665802 0.364197 -0.148071 0.507843 0.210114 -0.169006 0.513855 0.215118 -0.190857 0.520020 0.220123 -0.213409 0.526031 0.225098 -0.236816 0.532227 0.230225 -0.260803 0.538452 0.235413 -0.285187 0.544556 0.240509 -0.310089 0.550903 0.245789 -0.335205 0.557098 0.250977 -0.360687 0.563507 0.256287 -0.386261 0.569916 0.261688 -0.411652 0.576141 0.266968 -0.437134 0.582581 0.272369 -0.462433 0.588989 0.277863 -0.488098 0.595245 0.283173 -0.514587 0.601685 0.288635 -0.541656 0.608124 0.294159 -0.568939 0.614349 0.299469 -0.596588 0.620728 0.305023 -0.624207 0.626892 0.310364 -0.651825 0.633270 0.315857 -0.679138 0.639557 0.321320 -0.705963 0.645660 0.326660 -0.732422 0.651855 0.332123 -0.758301 0.658020 0.337555 -0.783478 0.663971 0.342834 -0.808136 0.670013 0.348236 -0.832001 0.675995 0.353577 -0.854950 0.681763 0.358765 -0.877106 0.687683 0.364044 -0.898193 0.693359 0.369171 -0.918396 0.699005 0.374390 -0.156891 0.541595 0.219879 -0.178284 0.547852 0.224976 -0.200500 0.554138 0.230072 -0.223419 0.560303 0.235168 -0.247101 0.566620 0.240387 -0.271271 0.572876 0.245483 -0.295959 0.579285 0.250885 -0.321045 0.585693 0.256165 -0.346283 0.591919 0.261414 -0.371796 0.598389 0.266815 -0.397339 0.604797 0.272247 -0.422760 0.611145 0.277557 -0.448181 0.617584 0.283020 -0.473572 0.623993 0.288513 -0.499542 0.630219 0.293854 -0.526276 0.636566 0.299316 -0.553436 0.642914 0.304840 -0.580841 0.649139 0.310211 -0.608490 0.655457 0.315704 -0.636047 0.661530 0.321075 -0.663544 0.667725 0.326538 -0.690674 0.673920 0.332001 -0.717224 0.679840 0.337280 -0.743378 0.685913 0.342712 -0.768982 0.691833 0.348083 -0.793823 0.697632 0.353302 -0.818115 0.703522 0.358643 -0.841583 0.709320 0.363953 -0.864105 0.714844 0.369019 -0.885834 0.720520 0.374237 -0.906464 0.725952 0.379303 -0.926117 0.731415 0.384399 -0.165985 0.576080 0.229828 -0.187775 0.582489 0.235046 -0.210419 0.588837 0.240265 -0.233612 0.595093 0.245361 -0.257568 0.601562 0.250702 -0.281952 0.607849 0.255890 -0.306824 0.614258 0.261292 -0.332031 0.620697 0.266663 -0.357361 0.626923 0.271973 -0.382874 0.633362 0.277435 -0.408478 0.639801 0.282898 -0.433777 0.646057 0.288239 -0.459137 0.652435 0.293732 -0.484772 0.658752 0.299194 -0.511017 0.664917 0.304565 -0.537872 0.671204 0.310059 -0.565094 0.677307 0.315399 -0.592682 0.683472 0.320923 -0.620361 0.689606 0.326416 -0.647766 0.695526 0.331696 -0.675079 0.701599 0.337097 -0.701965 0.707581 0.342529 -0.728271 0.713318 0.347839 -0.754150 0.719147 0.353180 -0.779419 0.724915 0.358521 -0.803925 0.730499 0.363647 -0.827789 0.736145 0.368896 -0.850769 0.741547 0.373993 -0.872986 0.747070 0.379150 -0.894226 0.752411 0.384247 -0.914368 0.757629 0.389130 -0.933533 0.762817 0.394135 -0.175293 0.610992 0.239990 -0.197479 0.617371 0.245270 -0.220306 0.623657 0.250458 -0.243958 0.630096 0.255768 -0.268188 0.636505 0.261169 -0.292725 0.642761 0.266418 -0.317749 0.649231 0.271851 -0.343109 0.655579 0.277313 -0.368439 0.661804 0.282623 -0.394012 0.668152 0.288116 -0.419556 0.674469 0.293579 -0.444794 0.680573 0.298950 -0.470154 0.686829 0.304413 -0.495941 0.692902 0.309814 -0.522522 0.699005 0.315277 -0.549591 0.705170 0.320770 -0.576843 0.711060 0.326111 -0.604462 0.717041 0.331543 -0.632019 0.722992 0.336975 -0.659332 0.728790 0.342285 -0.686371 0.734589 0.347717 -0.713074 0.740326 0.353058 -0.739075 0.745880 0.358246 -0.764648 0.751526 0.363525 -0.789581 0.757050 0.368774 -0.813721 0.762421 0.373871 -0.837189 0.767822 0.378998 -0.859741 0.772949 0.383972 -0.881500 0.778137 0.389008 -0.902313 0.783295 0.394012 -0.921967 0.788239 0.398865 -0.940582 0.793152 0.403656 -0.184784 0.645935 0.250305 -0.207336 0.652252 0.255615 -0.230530 0.658508 0.260864 -0.254456 0.664886 0.266266 -0.278870 0.671265 0.271729 -0.303558 0.677460 0.277039 -0.328766 0.683777 0.282501 -0.354156 0.689972 0.287964 -0.379547 0.696106 0.293304 -0.405029 0.702301 0.298798 -0.430481 0.708466 0.304291 -0.455688 0.714447 0.309662 -0.481171 0.720490 0.315155 -0.507233 0.726379 0.320526 -0.534058 0.732391 0.325989 -0.561188 0.738281 0.331451 -0.588531 0.744019 0.336731 -0.616089 0.749786 0.342133 -0.643555 0.755524 0.347565 -0.670654 0.761047 0.352783 -0.697510 0.766663 0.358124 -0.723907 0.772186 0.363434 -0.749603 0.777435 0.368500 -0.774841 0.782806 0.373718 -0.799316 0.787994 0.378754 -0.823212 0.793182 0.383850 -0.846283 0.798309 0.388916 -0.868378 0.803162 0.393768 -0.889771 0.808105 0.398712 -0.910034 0.812988 0.403534 -0.929169 0.817596 0.408264 -0.947266 0.822296 0.412964 -0.194519 0.680481 0.260742 -0.217377 0.686768 0.266113 -0.240814 0.692932 0.271423 -0.264984 0.699158 0.276886 -0.289612 0.705414 0.282349 -0.314453 0.711456 0.287689 -0.339752 0.717590 0.293182 -0.365173 0.723755 0.298676 -0.390533 0.729645 0.304047 -0.416046 0.735657 0.309540 -0.441254 0.741516 0.314911 -0.466553 0.747467 0.320404 -0.492310 0.753357 0.325867 -0.518524 0.759033 0.331146 -0.545471 0.764801 0.336578 -0.572784 0.770477 0.342010 -0.600098 0.775970 0.347290 -0.627594 0.781494 0.352631 -0.654877 0.786987 0.357971 -0.681793 0.792297 0.363159 -0.708405 0.797668 0.368378 -0.734497 0.802826 0.373596 -0.759827 0.807892 0.378601 -0.784790 0.812988 0.383728 -0.808899 0.817841 0.388641 -0.832397 0.822784 0.393677 -0.855072 0.827606 0.398590 -0.876740 0.832214 0.403290 -0.897583 0.836853 0.408173 -0.917389 0.841370 0.412872 -0.936066 0.845734 0.417358 -0.953644 0.850067 0.421967 -0.204376 0.714447 0.271301 -0.227570 0.720642 0.276733 -0.251282 0.726624 0.282104 -0.275635 0.732727 0.287567 -0.300354 0.738800 0.292999 -0.325348 0.744690 0.298370 -0.350708 0.750702 0.303894 -0.376190 0.756622 0.309387 -0.401550 0.762390 0.314728 -0.426971 0.768188 0.320221 -0.452087 0.773834 0.325592 -0.477386 0.779541 0.331024 -0.503418 0.785156 0.336487 -0.529846 0.790649 0.341766 -0.556885 0.796112 0.347137 -0.584229 0.801544 0.352509 -0.611511 0.806793 0.357727 -0.638855 0.812103 0.363037 -0.666046 0.817291 0.368256 -0.692627 0.822327 0.373352 -0.718933 0.827362 0.378479 -0.744568 0.832214 0.383484 -0.769836 0.837097 0.388519 -0.794373 0.841888 0.393524 -0.818146 0.846405 0.398346 -0.841248 0.851074 0.403168 -0.863464 0.855530 0.408020 -0.884735 0.859833 0.412598 -0.905090 0.864166 0.417267 -0.924438 0.868347 0.421844 -0.942566 0.872375 0.426270 -0.959595 0.876373 0.430634 -0.214355 0.747711 0.281952 -0.237823 0.753693 0.287415 -0.261810 0.759521 0.292755 -0.286316 0.765472 0.298248 -0.311218 0.771332 0.303741 -0.336273 0.777039 0.309113 -0.361633 0.782776 0.314606 -0.386963 0.788391 0.319977 -0.412415 0.794037 0.325439 -0.437683 0.799622 0.330902 -0.462738 0.804993 0.336212 -0.488281 0.810486 0.341614 -0.514526 0.815887 0.347015 -0.541107 0.821075 0.352264 -0.568207 0.826294 0.357605 -0.595520 0.831451 0.362915 -0.622711 0.836395 0.368011 -0.649933 0.841400 0.373199 -0.676880 0.846344 0.378357 -0.703247 0.851074 0.383362 -0.729248 0.855774 0.388367 -0.754639 0.860291 0.393280 -0.779480 0.864899 0.398193 -0.803650 0.869293 0.403046 -0.827026 0.873566 0.407745 -0.849731 0.877869 0.412537 -0.871582 0.882050 0.417145 -0.892334 0.885986 0.421600 -0.912262 0.889984 0.426178 -0.931091 0.893860 0.430542 -0.948700 0.897552 0.434753 -0.965240 0.901184 0.439026 -0.224426 0.779999 0.292603 -0.248199 0.785797 0.298126 -0.272339 0.791443 0.303497 -0.296997 0.797180 0.308960 -0.322021 0.802795 0.314484 -0.347137 0.808228 0.319824 -0.372528 0.813812 0.325317 -0.397827 0.819122 0.330627 -0.423157 0.824524 0.336060 -0.448303 0.829865 0.341492 -0.473358 0.834991 0.346741 -0.499176 0.840179 0.352112 -0.525574 0.845306 0.357452 -0.552246 0.850189 0.362610 -0.579376 0.855103 0.367859 -0.606628 0.860016 0.373077 -0.633759 0.864655 0.378143 -0.660767 0.869293 0.383209 -0.687317 0.873779 0.388153 -0.713531 0.878326 0.393158 -0.739258 0.882690 0.398071 -0.764282 0.886932 0.402802 -0.788788 0.891144 0.407654 -0.812622 0.895294 0.412384 -0.835602 0.899231 0.416901 -0.857849 0.903107 0.421478 -0.879211 0.906921 0.426025 -0.899567 0.910583 0.430328 -0.919037 0.914215 0.434631 -0.937286 0.917664 0.438843 -0.954529 0.921082 0.442963 -0.970490 0.924347 0.447083 -0.234650 0.811249 0.303345 -0.258606 0.816864 0.308838 -0.282898 0.822266 0.314209 -0.307678 0.827698 0.319702 -0.332825 0.833099 0.325195 -0.357910 0.838318 0.330475 -0.383301 0.843567 0.335938 -0.408539 0.848602 0.341217 -0.433716 0.853760 0.346619 -0.458771 0.858765 0.351959 -0.484039 0.863617 0.357178 -0.509979 0.868500 0.362518 -0.536499 0.873230 0.367737 -0.563293 0.877869 0.372803 -0.590332 0.882477 0.377991 -0.617523 0.887024 0.383118 -0.644531 0.891327 0.388000 -0.671326 0.895691 0.393005 -0.697571 0.899872 0.397858 -0.723511 0.904022 0.402710 -0.748932 0.908081 0.407501 -0.773590 0.911926 0.412170 -0.797729 0.915771 0.416809 -0.821198 0.919556 0.421417 -0.843750 0.923126 0.425781 -0.865631 0.926697 0.430206 -0.886536 0.930206 0.434570 -0.906433 0.933441 0.438751 -0.925446 0.936737 0.442871 -0.943237 0.939789 0.446869 -0.959930 0.942841 0.450836 -0.975403 0.945770 0.454712 -0.244904 0.841339 0.314087 -0.269012 0.846649 0.319519 -0.293427 0.851746 0.324921 -0.318359 0.856934 0.330353 -0.343353 0.861908 0.335693 -0.368591 0.866943 0.341064 -0.393951 0.871918 0.346497 -0.419006 0.876648 0.351685 -0.444183 0.881470 0.357025 -0.469116 0.886169 0.362366 -0.494568 0.890717 0.367462 -0.520782 0.895294 0.372650 -0.547363 0.899719 0.377899 -0.574097 0.903961 0.382843 -0.601105 0.908234 0.387909 -0.628052 0.912323 0.392731 -0.654938 0.916443 0.397736 -0.681549 0.920410 0.402557 -0.707520 0.924194 0.407318 -0.733185 0.927979 0.412048 -0.758240 0.931671 0.416687 -0.782562 0.935181 0.421173 -0.806305 0.938721 0.425690 -0.829407 0.942108 0.430084 -0.851593 0.945312 0.434326 -0.872986 0.948517 0.438629 -0.893402 0.951538 0.442688 -0.912903 0.954529 0.446747 -0.931427 0.957428 0.450745 -0.948700 0.960114 0.454529 -0.964966 0.962830 0.458344 -0.979950 0.965393 0.462097 -0.255157 0.870026 0.324738 -0.279419 0.875061 0.330231 -0.303986 0.879852 0.335541 -0.328949 0.884735 0.340942 -0.353973 0.889435 0.346222 -0.379211 0.894135 0.351562 -0.404419 0.898773 0.356873 -0.429443 0.903168 0.362091 -0.454407 0.907654 0.367310 -0.479462 0.912018 0.372559 -0.505096 0.916168 0.377625 -0.531342 0.920380 0.382721 -0.557983 0.924469 0.387756 -0.584747 0.928375 0.392670 -0.611725 0.932312 0.397614 -0.638489 0.936005 0.402344 -0.665192 0.939667 0.407196 -0.691467 0.943329 0.411896 -0.717163 0.946716 0.416504 -0.742493 0.950165 0.421051 -0.767181 0.953461 0.425568 -0.791168 0.956604 0.429840 -0.814575 0.959747 0.434235 -0.837219 0.962769 0.438477 -0.859009 0.965607 0.442566 -0.879974 0.968445 0.446686 -0.899963 0.971069 0.450531 -0.919067 0.973724 0.454437 -0.937042 0.976196 0.458282 -0.953857 0.978577 0.461945 -0.969635 0.980896 0.465546 -0.984131 0.983154 0.469147 -0.037964 0.037262 0.094147 -0.050720 0.038391 0.095764 -0.063568 0.039612 0.097534 -0.076935 0.040955 0.099365 -0.091156 0.042297 0.101288 -0.106659 0.043762 0.103333 -0.123260 0.045258 0.105408 -0.141083 0.046814 0.107666 -0.159851 0.048462 0.110046 -0.179443 0.050140 0.112457 -0.199951 0.051880 0.115021 -0.221191 0.053711 0.117615 -0.243042 0.055573 0.120331 -0.265503 0.057495 0.123169 -0.288483 0.059540 0.126099 -0.311798 0.061554 0.129089 -0.335602 0.063721 0.132233 -0.359619 0.065948 0.135437 -0.383759 0.068146 0.138733 -0.408081 0.070496 0.142181 -0.432251 0.072876 0.145630 -0.456543 0.075378 0.149231 -0.481110 0.077942 0.152924 -0.506348 0.080536 0.156677 -0.532288 0.083252 0.160583 -0.558746 0.086090 0.164551 -0.585419 0.088928 0.168549 -0.612518 0.091919 0.172729 -0.639587 0.095001 0.176971 -0.666412 0.098083 0.181152 -0.693207 0.101349 0.185638 -0.719391 0.104614 0.190002 -0.040985 0.049072 0.097473 -0.053772 0.050385 0.099274 -0.066833 0.051849 0.101227 -0.080536 0.053345 0.103302 -0.095215 0.054871 0.105377 -0.111115 0.056488 0.107635 -0.128235 0.058136 0.109924 -0.146393 0.059937 0.112396 -0.165588 0.061768 0.114960 -0.185608 0.063629 0.117493 -0.206512 0.065582 0.120239 -0.228088 0.067657 0.123077 -0.250244 0.069702 0.125977 -0.273071 0.071869 0.129028 -0.296356 0.074158 0.132141 -0.319946 0.076447 0.135284 -0.343964 0.078857 0.138672 -0.368103 0.081299 0.141998 -0.392517 0.083862 0.145538 -0.416962 0.086517 0.149109 -0.441254 0.089203 0.152771 -0.465668 0.092041 0.156586 -0.490692 0.094971 0.160492 -0.516235 0.097931 0.164368 -0.542480 0.101044 0.168457 -0.569244 0.104248 0.172607 -0.596100 0.107483 0.176788 -0.623322 0.110870 0.181061 -0.650330 0.114258 0.185394 -0.677307 0.117828 0.189911 -0.703949 0.121490 0.194489 -0.730072 0.125122 0.198975 -0.044189 0.061707 0.101166 -0.057098 0.063232 0.103210 -0.070374 0.064880 0.105316 -0.084381 0.066559 0.107513 -0.099579 0.068329 0.109863 -0.115997 0.070190 0.112305 -0.133484 0.072052 0.114807 -0.152161 0.074066 0.117432 -0.171753 0.076141 0.120148 -0.192169 0.078247 0.122925 -0.213470 0.080505 0.125916 -0.235413 0.082825 0.128906 -0.257935 0.085175 0.131989 -0.281006 0.087677 0.135223 -0.304443 0.090179 0.138489 -0.328461 0.092865 0.141907 -0.352661 0.095612 0.145447 -0.376984 0.098419 0.148956 -0.401581 0.101318 0.152679 -0.426117 0.104401 0.156464 -0.450500 0.107483 0.160278 -0.475128 0.110718 0.164307 -0.500519 0.114014 0.168335 -0.526459 0.117340 0.172394 -0.553040 0.120819 0.176697 -0.579987 0.124451 0.180969 -0.607056 0.128052 0.185272 -0.634338 0.131805 0.189789 -0.661377 0.135529 0.194214 -0.688263 0.139496 0.198853 -0.714844 0.143524 0.203613 -0.740875 0.147491 0.208252 -0.047607 0.075409 0.105255 -0.060669 0.077148 0.107483 -0.074280 0.079041 0.109802 -0.088684 0.080994 0.112183 -0.104279 0.083008 0.114746 -0.121216 0.085144 0.117371 -0.139221 0.087311 0.120056 -0.158295 0.089630 0.122894 -0.178345 0.092010 0.125854 -0.199158 0.094421 0.128754 -0.220795 0.097046 0.131897 -0.243073 0.099701 0.135162 -0.265900 0.102448 0.138428 -0.289307 0.105255 0.141815 -0.313049 0.108154 0.145264 -0.337250 0.111176 0.148834 -0.361664 0.114349 0.152557 -0.386169 0.117493 0.156311 -0.410828 0.120819 0.160187 -0.435516 0.124268 0.164154 -0.459961 0.127716 0.168152 -0.484985 0.131287 0.172302 -0.510742 0.134979 0.176544 -0.536957 0.138702 0.180756 -0.563812 0.142548 0.185181 -0.590790 0.146393 0.189575 -0.618164 0.150421 0.194122 -0.645477 0.154572 0.198730 -0.672516 0.158661 0.203369 -0.699402 0.162903 0.208130 -0.725861 0.167267 0.212982 -0.751770 0.171570 0.217773 -0.051239 0.090424 0.109680 -0.064545 0.092529 0.112122 -0.078430 0.094727 0.114685 -0.093292 0.096954 0.117249 -0.109436 0.099335 0.119995 -0.126831 0.101837 0.122803 -0.145264 0.104340 0.125671 -0.164795 0.106964 0.128693 -0.185272 0.109772 0.131836 -0.206482 0.112549 0.134979 -0.228516 0.115479 0.138306 -0.251038 0.118439 0.141632 -0.274261 0.121613 0.145172 -0.297943 0.124786 0.148743 -0.321960 0.128052 0.152374 -0.346405 0.131470 0.156189 -0.371002 0.134979 0.160095 -0.395630 0.138489 0.163971 -0.420380 0.142181 0.168030 -0.445099 0.145996 0.172180 -0.469727 0.149750 0.176331 -0.495148 0.153717 0.180664 -0.521210 0.157745 0.185028 -0.547760 0.161743 0.189453 -0.574829 0.165924 0.193970 -0.602051 0.170135 0.198547 -0.629395 0.174530 0.203247 -0.656830 0.178925 0.208008 -0.683807 0.183319 0.212738 -0.710571 0.187897 0.217621 -0.736908 0.192566 0.222656 -0.762665 0.197144 0.227539 -0.055145 0.107208 0.114532 -0.068695 0.109680 0.117157 -0.082947 0.112213 0.119934 -0.098267 0.114777 0.122650 -0.114990 0.117523 0.125610 -0.132843 0.120331 0.128632 -0.151764 0.123169 0.131653 -0.171722 0.126221 0.134888 -0.192627 0.129333 0.138245 -0.214203 0.132477 0.141541 -0.236572 0.135773 0.145081 -0.259460 0.139069 0.148560 -0.282990 0.142578 0.152283 -0.306915 0.146179 0.156128 -0.331146 0.149780 0.159882 -0.355774 0.153534 0.163879 -0.380493 0.157349 0.167908 -0.405273 0.161194 0.171967 -0.430115 0.165222 0.176239 -0.454956 0.169342 0.180542 -0.479858 0.173401 0.184814 -0.505646 0.177734 0.189331 -0.531952 0.181976 0.193726 -0.558807 0.186432 0.198425 -0.586151 0.190918 0.203125 -0.613434 0.195404 0.207764 -0.640930 0.200043 0.212616 -0.668243 0.204742 0.217529 -0.695160 0.209412 0.222351 -0.721832 0.214264 0.227417 -0.748016 0.219208 0.232513 -0.773529 0.224060 0.237518 -0.059296 0.125854 0.119751 -0.073151 0.128632 0.122620 -0.087799 0.131500 0.125549 -0.103638 0.134399 0.128479 -0.120819 0.137482 0.131592 -0.139221 0.140656 0.134796 -0.158600 0.143829 0.138031 -0.179016 0.147217 0.141479 -0.200226 0.150574 0.144897 -0.222229 0.154144 0.148499 -0.244995 0.157776 0.152191 -0.268188 0.161407 0.155945 -0.291992 0.165253 0.159790 -0.316193 0.169159 0.163757 -0.340637 0.173096 0.167755 -0.365387 0.177185 0.171906 -0.390350 0.181366 0.176147 -0.415161 0.185486 0.180298 -0.440125 0.189819 0.184723 -0.464966 0.194275 0.189209 -0.490295 0.198669 0.193665 -0.516388 0.203217 0.198303 -0.542938 0.207764 0.202881 -0.570129 0.212463 0.207642 -0.597565 0.217255 0.212494 -0.624969 0.221985 0.217285 -0.652527 0.226898 0.222229 -0.679779 0.231873 0.227264 -0.706573 0.236755 0.232208 -0.733063 0.241852 0.237335 -0.759094 0.247009 0.242554 -0.784393 0.252075 0.247681 -0.063721 0.146179 0.125397 -0.077850 0.149231 0.128387 -0.093048 0.152466 0.131500 -0.109375 0.155670 0.134613 -0.127136 0.159119 0.137970 -0.145996 0.162659 0.141388 -0.165833 0.166107 0.144806 -0.186676 0.169830 0.148376 -0.208252 0.173523 0.152008 -0.230682 0.177399 0.155823 -0.253723 0.181366 0.159668 -0.277222 0.185333 0.163574 -0.301270 0.189453 0.167664 -0.325745 0.193726 0.171783 -0.350372 0.197906 0.175903 -0.375305 0.202271 0.180206 -0.400391 0.206787 0.184631 -0.425262 0.211182 0.188995 -0.450226 0.215820 0.193512 -0.475159 0.220398 0.198059 -0.500977 0.225159 0.202789 -0.527435 0.230011 0.207550 -0.554260 0.234772 0.212280 -0.581665 0.239746 0.217163 -0.609253 0.244781 0.222137 -0.636719 0.249725 0.227020 -0.664154 0.254883 0.232117 -0.691345 0.260040 0.237244 -0.717987 0.265167 0.242310 -0.744324 0.270447 0.247528 -0.769989 0.275635 0.252716 -0.795197 0.281006 0.257996 -0.068390 0.167999 0.131378 -0.082916 0.171417 0.134583 -0.098602 0.175018 0.137878 -0.115509 0.178528 0.141205 -0.133759 0.182312 0.144714 -0.153046 0.186035 0.148224 -0.173401 0.189941 0.151947 -0.194672 0.193939 0.155701 -0.216644 0.197937 0.159515 -0.239410 0.202087 0.163483 -0.262787 0.206360 0.167572 -0.286621 0.210571 0.171570 -0.310883 0.215027 0.175781 -0.335541 0.219574 0.180084 -0.360352 0.224060 0.184418 -0.385468 0.228699 0.188873 -0.410553 0.233429 0.193390 -0.435577 0.238159 0.197937 -0.460541 0.243042 0.202667 -0.485840 0.247833 0.207306 -0.511963 0.252838 0.212128 -0.538727 0.257935 0.217041 -0.565796 0.262909 0.221893 -0.593292 0.268097 0.226898 -0.620972 0.273346 0.231964 -0.648438 0.278473 0.237000 -0.675842 0.283813 0.242188 -0.702942 0.289154 0.247406 -0.729401 0.294464 0.252563 -0.755554 0.299896 0.257904 -0.781006 0.305237 0.263092 -0.805939 0.310730 0.268494 -0.073334 0.191376 0.137726 -0.088318 0.195129 0.141144 -0.104553 0.198975 0.144623 -0.122040 0.202820 0.148132 -0.140778 0.206879 0.151855 -0.160522 0.210846 0.155518 -0.181366 0.215118 0.159393 -0.203033 0.219360 0.163361 -0.225403 0.223663 0.167328 -0.248505 0.228149 0.171448 -0.272156 0.232666 0.175690 -0.296173 0.237183 0.179901 -0.320740 0.241852 0.184296 -0.345673 0.246613 0.188782 -0.370575 0.251404 0.193207 -0.395721 0.256256 0.197845 -0.420837 0.261108 0.202393 -0.445953 0.266144 0.207153 -0.471039 0.271271 0.212036 -0.496735 0.276276 0.216766 -0.523224 0.281494 0.221771 -0.550232 0.286774 0.226807 -0.577515 0.291962 0.231720 -0.605164 0.297333 0.236847 -0.632843 0.302704 0.242035 -0.660278 0.308014 0.247101 -0.687592 0.313507 0.252411 -0.714355 0.318939 0.257599 -0.740814 0.324432 0.262970 -0.766754 0.329987 0.268341 -0.791931 0.335449 0.273682 -0.816559 0.341034 0.279114 -0.078552 0.216064 0.144440 -0.094055 0.220154 0.148071 -0.110870 0.224243 0.151733 -0.128845 0.228394 0.155457 -0.148132 0.232727 0.159302 -0.168396 0.237000 0.163177 -0.189636 0.241486 0.167236 -0.211700 0.246033 0.171387 -0.234375 0.250580 0.175476 -0.257843 0.255310 0.179779 -0.281799 0.260071 0.184174 -0.306091 0.264832 0.188568 -0.330872 0.269745 0.193054 -0.355774 0.274597 0.197601 -0.380920 0.279694 0.202301 -0.406189 0.284821 0.207062 -0.431335 0.289886 0.211792 -0.456421 0.295074 0.216644 -0.481873 0.300415 0.221619 -0.507904 0.305603 0.226471 -0.534668 0.310974 0.231567 -0.561920 0.316437 0.236725 -0.589355 0.321747 0.241791 -0.617035 0.327240 0.246979 -0.644775 0.332825 0.252319 -0.672150 0.338226 0.257477 -0.699280 0.343842 0.262848 -0.725891 0.349304 0.268066 -0.752136 0.354950 0.273560 -0.777832 0.360565 0.278992 -0.802704 0.366119 0.284302 -0.827026 0.371796 0.289825 -0.084137 0.242004 0.151520 -0.100189 0.246307 0.155334 -0.117462 0.250610 0.159088 -0.136108 0.255127 0.163055 -0.155914 0.259705 0.167145 -0.176544 0.264221 0.171143 -0.198212 0.268982 0.175323 -0.220703 0.273743 0.179688 -0.243744 0.278503 0.183960 -0.267456 0.283478 0.188446 -0.291718 0.288483 0.192963 -0.316162 0.293427 0.197510 -0.341187 0.298584 0.202148 -0.366180 0.303619 0.206787 -0.391510 0.308868 0.211639 -0.416809 0.314178 0.216522 -0.441956 0.319397 0.221375 -0.467133 0.324799 0.226379 -0.492920 0.330261 0.231445 -0.519226 0.335571 0.236481 -0.546295 0.341095 0.241669 -0.573730 0.346680 0.246887 -0.601257 0.352112 0.252045 -0.629028 0.357727 0.257324 -0.656525 0.363220 0.262573 -0.683929 0.368866 0.267944 -0.710938 0.374542 0.273407 -0.737335 0.380096 0.278717 -0.763336 0.385773 0.284180 -0.788788 0.391449 0.289673 -0.813354 0.397003 0.295044 -0.837402 0.402649 0.300568 -0.090027 0.269043 0.158966 -0.106659 0.273590 0.162964 -0.124512 0.278137 0.166931 -0.143677 0.282867 0.171051 -0.163971 0.287659 0.175262 -0.185028 0.292419 0.179443 -0.207123 0.297363 0.183838 -0.229950 0.302399 0.188324 -0.253265 0.307312 0.192719 -0.277313 0.312469 0.197357 -0.301819 0.317688 0.202026 -0.326508 0.322815 0.206665 -0.351654 0.328125 0.211517 -0.376801 0.333374 0.216278 -0.402191 0.338745 0.221283 -0.427521 0.344208 0.226257 -0.452637 0.349548 0.231201 -0.478058 0.355072 0.236359 -0.504211 0.360626 0.241516 -0.530823 0.366089 0.246613 -0.558105 0.371704 0.251892 -0.585632 0.377319 0.257202 -0.613281 0.382843 0.262421 -0.641083 0.388519 0.267822 -0.668518 0.394043 0.273132 -0.695709 0.399750 0.278595 -0.722565 0.405426 0.284027 -0.748749 0.410980 0.289429 -0.774536 0.416687 0.294891 -0.799622 0.422363 0.300446 -0.823883 0.427887 0.305847 -0.847504 0.433624 0.311401 -0.096283 0.296997 0.166809 -0.113495 0.301788 0.170929 -0.131927 0.306488 0.175079 -0.151611 0.311462 0.179352 -0.172333 0.316467 0.183716 -0.193878 0.321442 0.188080 -0.216339 0.326569 0.192596 -0.239532 0.331757 0.197266 -0.263153 0.336884 0.201782 -0.287415 0.342194 0.206573 -0.312012 0.347382 0.211273 -0.337036 0.352814 0.216187 -0.362335 0.358246 0.221130 -0.387512 0.363586 0.226013 -0.412964 0.369141 0.231049 -0.438293 0.374695 0.236237 -0.463470 0.380127 0.241272 -0.489197 0.385773 0.246490 -0.515686 0.391327 0.251770 -0.542542 0.396881 0.256989 -0.569977 0.402496 0.262268 -0.597534 0.408051 0.267517 -0.625366 0.413727 0.272980 -0.653076 0.419434 0.278442 -0.680389 0.424988 0.283783 -0.707428 0.430664 0.289246 -0.734039 0.436340 0.294769 -0.760010 0.441986 0.300171 -0.785522 0.447723 0.305695 -0.810303 0.453522 0.311279 -0.834259 0.459229 0.316681 -0.857513 0.465057 0.322266 -0.102905 0.325745 0.174927 -0.120697 0.330750 0.179230 -0.139679 0.335693 0.183502 -0.159882 0.340759 0.187958 -0.181000 0.345978 0.192474 -0.203003 0.351044 0.197021 -0.225800 0.356384 0.201691 -0.249298 0.361694 0.206451 -0.273224 0.366943 0.211151 -0.297729 0.372406 0.216034 -0.322540 0.377716 0.220886 -0.347748 0.383209 0.225861 -0.373108 0.388763 0.230957 -0.398376 0.394165 0.235931 -0.423828 0.399811 0.241119 -0.449158 0.405396 0.246368 -0.474426 0.410919 0.251526 -0.500580 0.416565 0.256836 -0.527313 0.422211 0.262146 -0.554413 0.427704 0.267426 -0.582001 0.433411 0.272858 -0.609650 0.438995 0.278168 -0.637451 0.444702 0.283661 -0.665039 0.450531 0.289124 -0.692230 0.456238 0.294495 -0.719086 0.462097 0.300049 -0.745514 0.468018 0.305573 -0.771118 0.473877 0.311005 -0.796295 0.479828 0.316559 -0.820831 0.485809 0.322083 -0.844391 0.491699 0.327515 -0.867218 0.497742 0.333069 -0.109863 0.355164 0.183411 -0.128265 0.360321 0.187866 -0.147736 0.365387 0.192261 -0.168427 0.370636 0.196899 -0.190033 0.375977 0.201538 -0.212372 0.381226 0.206207 -0.235565 0.386658 0.211029 -0.259186 0.391907 0.215790 -0.283539 0.397430 0.220734 -0.308289 0.402924 0.225769 -0.333191 0.408295 0.230713 -0.358521 0.413910 0.235840 -0.383972 0.419525 0.240967 -0.409363 0.424988 0.246094 -0.434784 0.430603 0.251373 -0.460083 0.436249 0.256683 -0.485687 0.441803 0.261932 -0.512085 0.447540 0.267273 -0.539093 0.453369 0.272705 -0.566345 0.459076 0.278046 -0.594086 0.464996 0.283478 -0.621765 0.470795 0.288818 -0.649445 0.476746 0.294373 -0.676971 0.482819 0.299927 -0.703949 0.488739 0.305298 -0.730591 0.494781 0.310852 -0.756683 0.500885 0.316437 -0.782104 0.506836 0.321808 -0.806976 0.512970 0.327393 -0.830963 0.518921 0.332825 -0.854309 0.525085 0.338318 -0.876648 0.531219 0.343811 -0.117188 0.385040 0.192139 -0.136169 0.390350 0.196808 -0.156158 0.395538 0.201324 -0.177277 0.400940 0.206085 -0.199310 0.406311 0.210938 -0.222015 0.411621 0.215668 -0.245514 0.417114 0.220612 -0.269562 0.422638 0.225647 -0.294006 0.428040 0.230560 -0.318970 0.433655 0.235718 -0.344055 0.439087 0.240753 -0.369476 0.444702 0.245941 -0.394989 0.450500 0.251251 -0.420380 0.456146 0.256439 -0.445770 0.461975 0.261749 -0.471100 0.467896 0.267151 -0.497101 0.473724 0.272430 -0.523773 0.479706 0.277893 -0.550934 0.485779 0.283356 -0.578369 0.491699 0.288696 -0.606171 0.497833 0.294250 -0.633820 0.503815 0.299622 -0.661469 0.509979 0.305176 -0.688782 0.516144 0.310730 -0.715546 0.522217 0.316132 -0.741943 0.528412 0.321686 -0.767822 0.534637 0.327240 -0.792877 0.540710 0.332642 -0.817444 0.546906 0.338196 -0.841187 0.553131 0.343689 -0.863953 0.559174 0.349091 -0.885925 0.565399 0.354584 -0.124847 0.415253 0.201202 -0.144348 0.420624 0.205994 -0.164856 0.425934 0.210663 -0.186432 0.431335 0.215576 -0.208832 0.436798 0.220459 -0.231873 0.442230 0.225403 -0.255707 0.447876 0.230469 -0.279877 0.453400 0.235443 -0.304626 0.459198 0.240631 -0.329773 0.464996 0.245819 -0.355011 0.470703 0.250977 -0.380463 0.476654 0.256256 -0.406006 0.482666 0.261627 -0.431427 0.488617 0.266846 -0.456726 0.494659 0.272308 -0.482391 0.500793 0.277740 -0.508575 0.506775 0.283081 -0.535522 0.512970 0.288574 -0.562775 0.519043 0.293945 -0.590485 0.525360 0.299500 -0.618286 0.531586 0.305054 -0.645844 0.537689 0.310455 -0.673340 0.543976 0.316010 -0.700470 0.550293 0.321564 -0.727020 0.556427 0.326965 -0.753174 0.562714 0.332520 -0.778717 0.569000 0.338074 -0.803467 0.575104 0.343414 -0.827637 0.581360 0.348938 -0.850861 0.587372 0.354279 -0.873352 0.593628 0.359741 -0.894867 0.599731 0.365173 -0.132843 0.445709 0.210571 -0.152863 0.451233 0.215393 -0.173798 0.456696 0.220215 -0.195831 0.462402 0.225220 -0.218628 0.468201 0.230316 -0.241974 0.473907 0.235321 -0.266022 0.479767 0.240479 -0.290466 0.485626 0.245575 -0.315430 0.491608 0.250885 -0.340698 0.497711 0.256134 -0.366028 0.503693 0.261353 -0.391571 0.509827 0.266754 -0.417114 0.515991 0.272186 -0.442444 0.522064 0.277466 -0.467743 0.528351 0.282959 -0.493744 0.534637 0.288452 -0.520264 0.540802 0.293823 -0.547424 0.547119 0.299316 -0.574768 0.553314 0.304749 -0.602509 0.559662 0.310303 -0.630280 0.566010 0.315857 -0.657806 0.572235 0.321259 -0.685089 0.578552 0.326843 -0.712036 0.584900 0.332397 -0.738251 0.591064 0.337769 -0.764160 0.597351 0.343292 -0.789368 0.603638 0.348785 -0.813812 0.609680 0.354156 -0.837616 0.615875 0.359619 -0.860443 0.621918 0.364899 -0.882477 0.628021 0.370331 -0.903534 0.634064 0.375641 -0.141174 0.477295 0.220123 -0.161682 0.483154 0.225098 -0.183075 0.488861 0.230042 -0.205444 0.494843 0.235199 -0.228485 0.500702 0.240234 -0.252258 0.506775 0.245422 -0.276550 0.512878 0.250702 -0.301178 0.518921 0.255859 -0.326355 0.525146 0.261230 -0.351715 0.531403 0.266602 -0.377106 0.537506 0.271912 -0.402679 0.543854 0.277344 -0.428162 0.550201 0.282837 -0.453430 0.556427 0.288177 -0.479004 0.562805 0.293671 -0.505127 0.569031 0.299072 -0.532013 0.575409 0.304626 -0.559326 0.581848 0.310150 -0.586792 0.588043 0.315582 -0.614502 0.594452 0.321136 -0.642273 0.600830 0.326691 -0.669617 0.607056 0.332123 -0.696686 0.613312 0.337646 -0.723389 0.619659 0.343140 -0.749390 0.625732 0.348541 -0.774963 0.631989 0.354004 -0.799713 0.638031 0.359375 -0.823883 0.644165 0.364777 -0.847290 0.650208 0.370178 -0.869720 0.656097 0.375366 -0.891296 0.662018 0.380707 -0.911835 0.667999 0.385986 -0.149780 0.510101 0.229919 -0.170746 0.516144 0.235077 -0.192566 0.522186 0.240051 -0.215332 0.528351 0.245331 -0.238678 0.534363 0.250458 -0.262695 0.540649 0.255737 -0.287262 0.546936 0.261078 -0.312103 0.553162 0.266327 -0.337341 0.559509 0.271790 -0.362823 0.565887 0.277222 -0.388214 0.572144 0.282532 -0.413757 0.578552 0.288055 -0.439270 0.584961 0.293549 -0.464478 0.591278 0.298920 -0.490326 0.597656 0.304443 -0.516663 0.603912 0.309875 -0.543762 0.610352 0.315430 -0.571228 0.616730 0.321014 -0.598755 0.622955 0.326416 -0.626495 0.629272 0.331970 -0.654083 0.635620 0.337494 -0.681213 0.641754 0.342865 -0.708130 0.647980 0.348389 -0.734558 0.654144 0.353882 -0.760284 0.660187 0.359222 -0.785522 0.666290 0.364655 -0.809937 0.672150 0.369873 -0.833771 0.678101 0.375244 -0.856689 0.684052 0.380585 -0.878693 0.689667 0.385712 -0.899841 0.695435 0.390961 -0.919891 0.701141 0.396149 -0.158630 0.543945 0.239960 -0.179962 0.550018 0.245056 -0.202240 0.556335 0.250336 -0.225403 0.562653 0.255615 -0.248993 0.568848 0.260834 -0.273285 0.575287 0.266174 -0.298004 0.581696 0.271606 -0.322998 0.587921 0.276917 -0.348389 0.594360 0.282410 -0.373871 0.600830 0.287872 -0.399353 0.607117 0.293243 -0.424866 0.613525 0.298798 -0.450134 0.619812 0.304199 -0.475586 0.626251 0.309753 -0.501740 0.632629 0.315277 -0.528351 0.638824 0.320709 -0.555603 0.645172 0.326263 -0.583099 0.651489 0.331818 -0.610657 0.657623 0.337158 -0.638336 0.663879 0.342743 -0.665802 0.670044 0.348267 -0.692719 0.676025 0.353607 -0.719360 0.682129 0.359100 -0.745361 0.687988 0.364380 -0.770905 0.694000 0.369781 -0.795776 0.699829 0.375122 -0.819885 0.705566 0.380310 -0.843292 0.711304 0.385559 -0.865845 0.716980 0.390808 -0.887390 0.722473 0.395874 -0.908020 0.727997 0.401062 -0.927582 0.733490 0.406067 -0.167755 0.578491 0.250214 -0.189514 0.584625 0.255371 -0.212219 0.591095 0.260712 -0.235596 0.597504 0.266052 -0.259491 0.603790 0.271362 -0.283997 0.610229 0.276794 -0.308899 0.616669 0.282257 -0.334015 0.622925 0.287628 -0.359467 0.629364 0.293121 -0.385040 0.635834 0.298676 -0.410461 0.642059 0.304077 -0.435944 0.648438 0.309631 -0.461090 0.654633 0.315033 -0.486847 0.660980 0.320587 -0.513214 0.667267 0.326141 -0.540009 0.673401 0.331512 -0.567383 0.679626 0.337036 -0.594971 0.685791 0.342590 -0.622498 0.691742 0.347961 -0.649994 0.697815 0.353424 -0.677277 0.703827 0.358917 -0.703979 0.709656 0.364227 -0.730347 0.715546 0.369598 -0.756042 0.721191 0.374847 -0.781311 0.726990 0.380188 -0.805878 0.732635 0.385437 -0.829529 0.738129 0.390533 -0.852539 0.743652 0.395782 -0.874664 0.749084 0.400909 -0.895752 0.754303 0.405823 -0.915894 0.759583 0.410919 -0.934906 0.764801 0.415863 -0.177094 0.613403 0.260559 -0.199219 0.619629 0.265808 -0.222229 0.626068 0.271210 -0.245972 0.632477 0.276672 -0.270081 0.638733 0.282013 -0.294769 0.645172 0.287476 -0.319885 0.651581 0.292969 -0.345062 0.657806 0.298370 -0.370575 0.664185 0.303925 -0.395966 0.670319 0.309326 -0.421478 0.676666 0.314880 -0.446899 0.682953 0.320465 -0.472107 0.688995 0.325867 -0.498077 0.695160 0.331390 -0.524719 0.701324 0.336914 -0.551666 0.707245 0.342316 -0.579132 0.713318 0.347839 -0.606689 0.719299 0.353302 -0.634125 0.725098 0.358643 -0.661530 0.730957 0.364075 -0.688538 0.736725 0.369476 -0.715027 0.742371 0.374725 -0.741150 0.748016 0.380066 -0.766510 0.753479 0.385223 -0.791382 0.758972 0.390411 -0.815582 0.764435 0.395630 -0.838867 0.769653 0.400665 -0.861450 0.774902 0.405701 -0.883118 0.780060 0.410767 -0.903717 0.785034 0.415649 -0.923370 0.790070 0.420471 -0.941895 0.795044 0.425323 -0.186676 0.648285 0.271057 -0.209137 0.654480 0.276398 -0.232452 0.660889 0.281860 -0.256439 0.667236 0.287354 -0.280762 0.673492 0.292694 -0.305634 0.679749 0.298248 -0.330872 0.686066 0.303772 -0.356171 0.692139 0.309204 -0.381683 0.698425 0.314728 -0.407074 0.704498 0.320160 -0.432434 0.710602 0.325714 -0.457733 0.716736 0.331268 -0.483215 0.722656 0.336639 -0.509399 0.728638 0.342194 -0.536194 0.734589 0.347717 -0.563293 0.740326 0.353058 -0.590759 0.746155 0.358521 -0.618317 0.751984 0.363953 -0.645599 0.757507 0.369202 -0.672821 0.763123 0.374573 -0.699463 0.768616 0.379791 -0.725830 0.774109 0.385071 -0.751587 0.779480 0.390320 -0.776642 0.784668 0.395386 -0.801208 0.789948 0.400543 -0.824982 0.795135 0.405579 -0.847900 0.800079 0.410522 -0.870087 0.805084 0.415497 -0.891266 0.809937 0.420380 -0.911407 0.814667 0.425079 -0.930542 0.819336 0.429810 -0.948456 0.823883 0.434387 -0.196411 0.682892 0.281708 -0.219238 0.688995 0.287048 -0.242859 0.695221 0.292572 -0.267029 0.701508 0.298065 -0.291504 0.707611 0.303497 -0.316559 0.713745 0.309052 -0.341736 0.719757 0.314484 -0.367157 0.725891 0.320038 -0.392670 0.731934 0.325562 -0.417999 0.737823 0.330963 -0.443329 0.743744 0.336517 -0.468597 0.749664 0.342041 -0.494293 0.755371 0.347443 -0.520782 0.761169 0.352905 -0.547699 0.766937 0.358398 -0.574799 0.772461 0.363678 -0.602295 0.778046 0.369080 -0.629761 0.783569 0.374451 -0.656921 0.788910 0.379639 -0.683899 0.794312 0.384949 -0.710358 0.799469 0.390045 -0.736359 0.804688 0.395264 -0.761780 0.809784 0.400391 -0.786530 0.814789 0.405365 -0.810699 0.819702 0.410400 -0.834137 0.824585 0.415375 -0.856598 0.829285 0.420135 -0.878326 0.833984 0.424988 -0.899048 0.838562 0.429718 -0.918701 0.842926 0.434265 -0.937347 0.847351 0.438934 -0.954742 0.851532 0.443298 -0.206238 0.716766 0.292450 -0.229431 0.722778 0.297821 -0.253265 0.728912 0.303375 -0.277679 0.735046 0.308899 -0.302307 0.740967 0.314331 -0.327515 0.746979 0.319916 -0.352661 0.752777 0.325317 -0.378174 0.758667 0.330841 -0.403595 0.764557 0.336395 -0.428894 0.770203 0.341766 -0.454132 0.775970 0.347260 -0.479492 0.781647 0.352783 -0.505432 0.787140 0.358093 -0.532043 0.792694 0.363556 -0.559082 0.798248 0.368927 -0.586243 0.803467 0.374207 -0.613678 0.808838 0.379517 -0.640900 0.813904 0.384705 -0.667999 0.819122 0.389923 -0.694763 0.824249 0.395081 -0.720795 0.829132 0.400116 -0.746582 0.834076 0.405212 -0.771698 0.838867 0.410248 -0.796082 0.843536 0.415100 -0.819885 0.848206 0.420013 -0.842896 0.852753 0.424835 -0.864960 0.857086 0.429504 -0.886200 0.861481 0.434174 -0.906403 0.865631 0.438721 -0.925659 0.869812 0.443207 -0.943756 0.873901 0.447693 -0.960663 0.877747 0.451935 -0.216278 0.749908 0.303223 -0.239685 0.755798 0.308624 -0.263794 0.761749 0.314209 -0.288208 0.767517 0.319580 -0.313141 0.773376 0.325195 -0.338348 0.779144 0.330719 -0.363647 0.784790 0.336090 -0.389038 0.790497 0.341614 -0.414459 0.796112 0.347137 -0.439606 0.801544 0.352478 -0.464752 0.807037 0.357971 -0.490387 0.812500 0.363434 -0.516510 0.817719 0.368652 -0.543243 0.823029 0.374023 -0.570251 0.828125 0.379272 -0.597504 0.833252 0.384552 -0.624847 0.838318 0.389801 -0.651886 0.843109 0.394836 -0.678802 0.847992 0.400055 -0.705261 0.852814 0.405090 -0.731110 0.857422 0.410004 -0.756500 0.862030 0.414948 -0.781311 0.866577 0.419891 -0.805359 0.870911 0.424591 -0.828705 0.875214 0.429382 -0.851318 0.879486 0.434052 -0.872955 0.883484 0.438568 -0.893738 0.887482 0.443054 -0.913483 0.891296 0.447449 -0.932251 0.895203 0.451843 -0.949860 0.898926 0.456116 -0.966217 0.902435 0.460266 -0.226440 0.782196 0.314087 -0.250092 0.787811 0.319458 -0.274323 0.793610 0.325073 -0.298920 0.799133 0.330444 -0.323944 0.804779 0.335968 -0.349213 0.810333 0.341492 -0.374451 0.815704 0.346863 -0.399841 0.821198 0.352356 -0.425140 0.826569 0.357819 -0.450226 0.831726 0.363190 -0.475403 0.836945 0.368500 -0.501251 0.842102 0.373932 -0.527527 0.847046 0.379120 -0.554382 0.852020 0.384430 -0.581360 0.856812 0.389526 -0.608582 0.861633 0.394745 -0.635834 0.866425 0.399933 -0.662659 0.870941 0.404846 -0.689301 0.875488 0.409882 -0.715424 0.879974 0.414856 -0.741028 0.884247 0.419617 -0.766113 0.888489 0.424469 -0.790497 0.892639 0.429260 -0.814178 0.896698 0.433807 -0.837158 0.900665 0.438446 -0.859253 0.904449 0.442871 -0.880524 0.908234 0.447327 -0.900970 0.911926 0.451721 -0.920197 0.915436 0.455933 -0.938446 0.918945 0.460175 -0.955536 0.922302 0.464355 -0.971405 0.925507 0.468384 -0.236481 0.813263 0.324738 -0.260437 0.818817 0.330292 -0.284912 0.824310 0.335846 -0.309631 0.829590 0.341248 -0.334717 0.834991 0.346741 -0.359985 0.840271 0.352234 -0.385223 0.845367 0.357574 -0.410522 0.850555 0.363007 -0.435760 0.855591 0.368378 -0.460663 0.860504 0.373627 -0.486053 0.865448 0.378998 -0.511932 0.870178 0.384155 -0.538452 0.874939 0.389374 -0.565369 0.879639 0.394592 -0.592316 0.884094 0.399658 -0.619476 0.888580 0.404694 -0.646545 0.893005 0.409790 -0.673187 0.897186 0.414612 -0.699524 0.901398 0.419525 -0.725372 0.905518 0.424347 -0.750641 0.909485 0.429047 -0.775360 0.913391 0.433716 -0.799438 0.917206 0.438354 -0.822693 0.920837 0.442749 -0.845306 0.924500 0.447235 -0.866974 0.927917 0.451477 -0.887817 0.931396 0.455841 -0.907745 0.934692 0.460052 -0.926483 0.937805 0.464203 -0.944275 0.940918 0.468262 -0.960907 0.944000 0.472321 -0.976227 0.946747 0.476196 -0.246704 0.843170 0.335571 -0.270905 0.848480 0.341064 -0.295471 0.853729 0.346619 -0.320251 0.858734 0.351959 -0.345428 0.863831 0.357422 -0.370667 0.868835 0.362885 -0.395813 0.873627 0.368134 -0.421112 0.878510 0.373505 -0.446136 0.883270 0.378845 -0.471008 0.887787 0.384003 -0.496613 0.892395 0.389282 -0.522644 0.896851 0.394318 -0.549286 0.901245 0.399506 -0.576172 0.905548 0.404602 -0.603058 0.909729 0.409515 -0.630127 0.913879 0.414490 -0.656952 0.917938 0.419373 -0.683350 0.921753 0.424103 -0.709442 0.925659 0.428925 -0.734955 0.929413 0.433563 -0.759857 0.932953 0.438110 -0.784271 0.936523 0.442657 -0.807861 0.939911 0.446991 -0.830841 0.943298 0.451416 -0.853027 0.946503 0.455688 -0.874237 0.949615 0.459869 -0.894684 0.952637 0.464050 -0.914124 0.955597 0.468170 -0.932465 0.958435 0.472137 -0.949738 0.961151 0.476105 -0.965881 0.963776 0.479980 -0.980713 0.966309 0.483704 -0.256989 0.871796 0.346313 -0.281281 0.876770 0.351776 -0.306000 0.881714 0.357300 -0.330841 0.886414 0.362610 -0.355988 0.891174 0.368011 -0.381195 0.895844 0.373383 -0.406281 0.900330 0.378571 -0.431458 0.904846 0.383881 -0.456207 0.909180 0.389008 -0.481293 0.913513 0.394196 -0.507111 0.917786 0.399384 -0.533234 0.921814 0.404327 -0.559875 0.925873 0.409363 -0.586792 0.929810 0.414337 -0.613617 0.933624 0.419159 -0.640472 0.937408 0.424011 -0.667114 0.941040 0.428802 -0.693207 0.944550 0.433350 -0.718964 0.948029 0.437988 -0.744263 0.951416 0.442505 -0.768738 0.954620 0.446899 -0.792786 0.957794 0.451324 -0.816010 0.960815 0.455505 -0.838593 0.963745 0.459747 -0.860352 0.966675 0.463928 -0.881226 0.969391 0.467957 -0.901184 0.972076 0.472015 -0.920135 0.974670 0.475983 -0.938019 0.977081 0.479767 -0.954834 0.979492 0.483582 -0.970490 0.981781 0.487274 -0.984833 0.983917 0.490814 -0.038483 0.037659 0.107910 -0.051270 0.038879 0.109772 -0.064117 0.040100 0.111633 -0.077576 0.041443 0.113617 -0.091919 0.042877 0.115753 -0.107422 0.044281 0.117950 -0.124176 0.045837 0.120239 -0.142029 0.047424 0.122650 -0.160828 0.049042 0.125153 -0.180573 0.050751 0.127777 -0.201172 0.052582 0.130524 -0.222412 0.054382 0.133270 -0.244385 0.056274 0.136200 -0.266815 0.058197 0.139130 -0.289917 0.060272 0.142273 -0.313324 0.062378 0.145508 -0.337067 0.064484 0.148743 -0.361145 0.066742 0.152161 -0.385437 0.069031 0.155701 -0.409637 0.071350 0.159180 -0.433990 0.073792 0.162903 -0.458282 0.076324 0.166748 -0.482819 0.078857 0.170502 -0.508240 0.081543 0.174530 -0.534149 0.084229 0.178467 -0.560577 0.087097 0.182678 -0.587494 0.090057 0.186890 -0.614380 0.092957 0.191162 -0.641510 0.096100 0.195557 -0.668549 0.099304 0.200043 -0.695099 0.102539 0.204529 -0.721405 0.105896 0.209137 -0.041534 0.049500 0.111603 -0.054413 0.050934 0.113556 -0.067444 0.052338 0.115662 -0.081207 0.053894 0.117859 -0.095978 0.055481 0.120178 -0.111969 0.057098 0.122559 -0.129181 0.058807 0.125061 -0.147461 0.060577 0.127716 -0.166687 0.062439 0.130371 -0.186829 0.064331 0.133209 -0.207825 0.066345 0.136108 -0.229401 0.068390 0.139069 -0.251678 0.070526 0.142181 -0.274445 0.072693 0.145325 -0.297791 0.074951 0.148651 -0.321564 0.077332 0.152100 -0.345520 0.079712 0.155487 -0.369812 0.082245 0.159119 -0.394226 0.084869 0.162811 -0.418610 0.087463 0.166565 -0.442993 0.090271 0.170410 -0.467438 0.093109 0.174408 -0.492401 0.096008 0.178375 -0.518188 0.099091 0.182556 -0.544342 0.102142 0.186707 -0.571136 0.105377 0.191010 -0.598206 0.108734 0.195435 -0.625214 0.112061 0.199829 -0.652466 0.115601 0.204407 -0.679382 0.119171 0.209045 -0.705872 0.122772 0.213684 -0.732147 0.126526 0.218445 -0.044769 0.062256 0.115601 -0.057770 0.063843 0.117828 -0.071045 0.065460 0.120087 -0.085175 0.067200 0.122498 -0.100433 0.069000 0.125031 -0.116882 0.070862 0.127563 -0.134521 0.072815 0.130280 -0.153290 0.074860 0.133118 -0.172913 0.076874 0.135986 -0.193481 0.079102 0.139008 -0.214722 0.081299 0.142029 -0.236786 0.083679 0.145264 -0.259399 0.086090 0.148560 -0.282501 0.088562 0.151917 -0.306122 0.091156 0.155396 -0.330109 0.093903 0.158997 -0.354309 0.096588 0.162628 -0.378723 0.099518 0.166443 -0.403290 0.102478 0.170319 -0.427765 0.105469 0.174194 -0.452271 0.108673 0.178284 -0.476898 0.111847 0.182373 -0.502319 0.115234 0.186584 -0.528412 0.118683 0.190918 -0.554932 0.122070 0.195221 -0.581909 0.125732 0.199677 -0.609161 0.129425 0.204315 -0.636292 0.133148 0.208832 -0.663513 0.137024 0.213531 -0.690399 0.141022 0.218323 -0.716858 0.144958 0.223053 -0.742950 0.149048 0.227997 -0.048279 0.076019 0.119995 -0.061401 0.077850 0.122437 -0.075012 0.079742 0.124878 -0.089539 0.081726 0.127502 -0.105255 0.083801 0.130188 -0.122223 0.085907 0.132965 -0.140320 0.088165 0.135895 -0.159515 0.090515 0.138916 -0.179535 0.092926 0.141937 -0.200500 0.095398 0.145172 -0.222137 0.097961 0.148376 -0.244507 0.100677 0.151794 -0.267487 0.103485 0.155334 -0.290833 0.106293 0.158813 -0.314697 0.109283 0.162567 -0.338928 0.112396 0.166351 -0.363373 0.115479 0.170105 -0.387939 0.118744 0.174072 -0.412689 0.122101 0.178223 -0.437195 0.125488 0.182251 -0.461823 0.128998 0.186462 -0.486786 0.132599 0.190704 -0.512573 0.136292 0.195129 -0.539001 0.140106 0.199585 -0.565765 0.143890 0.204071 -0.592957 0.147888 0.208679 -0.620331 0.151978 0.213409 -0.647491 0.156006 0.218079 -0.674713 0.160217 0.222931 -0.701569 0.164551 0.227875 -0.727844 0.168793 0.232758 -0.753815 0.173248 0.237762 -0.051971 0.091187 0.124786 -0.065308 0.093353 0.127441 -0.079254 0.095520 0.130066 -0.094208 0.097870 0.132874 -0.110474 0.100250 0.135834 -0.127899 0.102722 0.138763 -0.146515 0.105316 0.141876 -0.166046 0.107941 0.144989 -0.186584 0.110779 0.148315 -0.207947 0.113617 0.151733 -0.229919 0.116547 0.155151 -0.252625 0.119629 0.158752 -0.275909 0.122772 0.162445 -0.299561 0.125977 0.166138 -0.323700 0.129333 0.170013 -0.348114 0.132812 0.174011 -0.372681 0.136230 0.177979 -0.397461 0.139862 0.182129 -0.422241 0.143616 0.186340 -0.446869 0.147308 0.190613 -0.471649 0.151245 0.195007 -0.497070 0.155090 0.199371 -0.523193 0.159149 0.203918 -0.549896 0.163300 0.208588 -0.576843 0.167419 0.213165 -0.604218 0.171783 0.217957 -0.631653 0.176147 0.222839 -0.658844 0.180481 0.227600 -0.686005 0.185028 0.232635 -0.712585 0.189545 0.237518 -0.738922 0.194183 0.242615 -0.764740 0.198914 0.247803 -0.055939 0.108124 0.130005 -0.069519 0.110626 0.132843 -0.083801 0.113159 0.135681 -0.099304 0.115814 0.138702 -0.116089 0.118591 0.141785 -0.133972 0.121338 0.144897 -0.153046 0.124329 0.148224 -0.173004 0.127289 0.151520 -0.193970 0.130463 0.155090 -0.215729 0.133667 0.158691 -0.238068 0.136963 0.162292 -0.261047 0.140381 0.166046 -0.284668 0.143890 0.169922 -0.308594 0.147461 0.173798 -0.332947 0.151154 0.177887 -0.357605 0.154968 0.182068 -0.382294 0.158722 0.186157 -0.407166 0.162720 0.190460 -0.431976 0.166687 0.194763 -0.456726 0.170807 0.199219 -0.481842 0.175049 0.203827 -0.507538 0.179260 0.208344 -0.534058 0.183594 0.213043 -0.561005 0.188110 0.217834 -0.588135 0.192505 0.222595 -0.615631 0.197083 0.227509 -0.643158 0.201782 0.232483 -0.670319 0.206421 0.237366 -0.697327 0.211212 0.242493 -0.723816 0.216003 0.247528 -0.750000 0.220947 0.252747 -0.775604 0.225891 0.257996 -0.060120 0.126862 0.135590 -0.074005 0.129730 0.138611 -0.088745 0.132568 0.141632 -0.104706 0.135529 0.144806 -0.121948 0.138611 0.148071 -0.140442 0.141785 0.151459 -0.159973 0.145081 0.154968 -0.180389 0.148407 0.158508 -0.201752 0.151917 0.162201 -0.223877 0.155487 0.165955 -0.246521 0.159088 0.169769 -0.269897 0.162842 0.173706 -0.293762 0.166718 0.177795 -0.317902 0.170563 0.181824 -0.342468 0.174622 0.186066 -0.367157 0.178619 0.190277 -0.392151 0.182831 0.194641 -0.417114 0.187103 0.199127 -0.441925 0.191376 0.203613 -0.466827 0.195831 0.208191 -0.492340 0.200378 0.212952 -0.518341 0.204834 0.217590 -0.545135 0.209503 0.222473 -0.572327 0.214264 0.227386 -0.599670 0.218933 0.232208 -0.627228 0.223816 0.237274 -0.654694 0.228760 0.242371 -0.681854 0.233612 0.247375 -0.708771 0.238678 0.252625 -0.735077 0.243683 0.257751 -0.761108 0.248810 0.263031 -0.786469 0.253967 0.268341 -0.064575 0.147278 0.141541 -0.078827 0.150452 0.144745 -0.093994 0.153625 0.147980 -0.110535 0.156982 0.151367 -0.128296 0.160339 0.154816 -0.147278 0.163910 0.158386 -0.167297 0.167542 0.162140 -0.188110 0.171143 0.165771 -0.209869 0.174957 0.169647 -0.232300 0.178864 0.173615 -0.255371 0.182770 0.177582 -0.279022 0.186890 0.181763 -0.303101 0.191010 0.185944 -0.327515 0.195190 0.190186 -0.352295 0.199524 0.194550 -0.377106 0.203857 0.198914 -0.402191 0.208313 0.203461 -0.427246 0.212921 0.208130 -0.452087 0.217438 0.212708 -0.477264 0.222198 0.217499 -0.503113 0.226959 0.222321 -0.529449 0.231720 0.227112 -0.556488 0.236633 0.232086 -0.583862 0.241638 0.237152 -0.611328 0.246552 0.242126 -0.638916 0.251648 0.247253 -0.666260 0.256683 0.252350 -0.693420 0.261902 0.257599 -0.720215 0.267181 0.262909 -0.746338 0.272308 0.268097 -0.772125 0.277649 0.273529 -0.797272 0.283020 0.278931 -0.069305 0.169312 0.147919 -0.083862 0.172699 0.151215 -0.099640 0.176270 0.154724 -0.116760 0.179932 0.158295 -0.134979 0.183594 0.161896 -0.154449 0.187469 0.165649 -0.174927 0.191437 0.169556 -0.196167 0.195374 0.173401 -0.218292 0.199463 0.177490 -0.241119 0.203705 0.181610 -0.264435 0.207916 0.185730 -0.288422 0.212250 0.190033 -0.312622 0.216614 0.194336 -0.337341 0.221161 0.198792 -0.362335 0.225769 0.203369 -0.387238 0.230347 0.207886 -0.412415 0.235138 0.212555 -0.437469 0.239929 0.217346 -0.462372 0.244751 0.222107 -0.487854 0.249695 0.226990 -0.514099 0.254730 0.231964 -0.540771 0.259735 0.236877 -0.568054 0.264832 0.241974 -0.595581 0.270050 0.247101 -0.623108 0.275146 0.252228 -0.650726 0.280487 0.257446 -0.677979 0.285675 0.262634 -0.705017 0.291077 0.267944 -0.731598 0.296478 0.273407 -0.757568 0.301819 0.278687 -0.783081 0.307312 0.284119 -0.808014 0.312836 0.289612 -0.074341 0.192780 0.154633 -0.089294 0.196442 0.158112 -0.105621 0.200348 0.161804 -0.123322 0.204346 0.165588 -0.142090 0.208252 0.169342 -0.162018 0.212463 0.173309 -0.182892 0.216675 0.177368 -0.204559 0.220886 0.181366 -0.227081 0.225311 0.185638 -0.250244 0.229828 0.189941 -0.273865 0.234253 0.194214 -0.298035 0.238922 0.198700 -0.322540 0.243530 0.203156 -0.347443 0.248322 0.207764 -0.372559 0.253174 0.212494 -0.397614 0.258026 0.217133 -0.422852 0.263000 0.221985 -0.447937 0.268066 0.226898 -0.472992 0.273071 0.231720 -0.498871 0.278259 0.236755 -0.525391 0.283478 0.241852 -0.552307 0.288635 0.246857 -0.579773 0.293976 0.252106 -0.607269 0.299194 0.257202 -0.634979 0.304626 0.262512 -0.662537 0.310089 0.267853 -0.689667 0.315399 0.273102 -0.716583 0.320984 0.278564 -0.742950 0.326538 0.283966 -0.768707 0.331940 0.289307 -0.793976 0.337585 0.294800 -0.818573 0.343201 0.300354 -0.079620 0.217560 0.161743 -0.095123 0.221558 0.165375 -0.112030 0.225739 0.169220 -0.130219 0.230011 0.173218 -0.149536 0.234222 0.177155 -0.169922 0.238678 0.181274 -0.191223 0.243164 0.185486 -0.213318 0.247650 0.189728 -0.236145 0.252319 0.194122 -0.259521 0.256958 0.198486 -0.283569 0.261780 0.203033 -0.307983 0.266663 0.207642 -0.332703 0.271515 0.212250 -0.357758 0.276489 0.217010 -0.382935 0.281616 0.221832 -0.408081 0.286621 0.226624 -0.433350 0.291840 0.231567 -0.458466 0.297089 0.236633 -0.483856 0.302246 0.241638 -0.510010 0.307587 0.246735 -0.536865 0.313019 0.251984 -0.564026 0.318298 0.257080 -0.591614 0.323822 0.262329 -0.619202 0.329193 0.267548 -0.646881 0.334747 0.272980 -0.674438 0.340363 0.278381 -0.701385 0.345795 0.283722 -0.728088 0.351440 0.289185 -0.754303 0.357025 0.294678 -0.779785 0.362549 0.300079 -0.804779 0.368225 0.305634 -0.829041 0.373932 0.311218 -0.085236 0.243652 0.169128 -0.101257 0.247864 0.173035 -0.118805 0.252319 0.177063 -0.137543 0.256836 0.181152 -0.157318 0.261292 0.185303 -0.178162 0.265961 0.189606 -0.199890 0.270782 0.193970 -0.222290 0.275452 0.198364 -0.245544 0.280365 0.202911 -0.269196 0.285187 0.207428 -0.293518 0.290253 0.212097 -0.318146 0.295349 0.216858 -0.343048 0.300354 0.221588 -0.368195 0.305573 0.226471 -0.393524 0.310852 0.231476 -0.418701 0.316010 0.236389 -0.444000 0.321442 0.241455 -0.469177 0.326843 0.246613 -0.494873 0.332123 0.251678 -0.521454 0.337677 0.256989 -0.548370 0.343079 0.262085 -0.575867 0.348633 0.267456 -0.603577 0.354248 0.272827 -0.631165 0.359711 0.278137 -0.658844 0.365326 0.283569 -0.686218 0.370972 0.289062 -0.713074 0.376556 0.294434 -0.739594 0.382172 0.299957 -0.765533 0.387878 0.305511 -0.790710 0.393433 0.310974 -0.815430 0.399139 0.316528 -0.839203 0.404663 0.321960 -0.091156 0.270752 0.176971 -0.107849 0.275177 0.180969 -0.125916 0.279877 0.185211 -0.145172 0.284668 0.189514 -0.165405 0.289337 0.193787 -0.186707 0.294281 0.198242 -0.208771 0.299103 0.202698 -0.231628 0.304138 0.207306 -0.255219 0.309235 0.212036 -0.279114 0.314270 0.216614 -0.303650 0.319519 0.221466 -0.328552 0.324799 0.226379 -0.353577 0.329987 0.231201 -0.378845 0.335358 0.236267 -0.404205 0.340759 0.241333 -0.429443 0.346130 0.246368 -0.454712 0.351624 0.251587 -0.480194 0.357147 0.256805 -0.506256 0.362579 0.261993 -0.533081 0.368195 0.267303 -0.560211 0.373657 0.272583 -0.587830 0.379303 0.277985 -0.615631 0.384949 0.283417 -0.643219 0.390472 0.288757 -0.670807 0.396210 0.294312 -0.697998 0.401886 0.299835 -0.724640 0.407410 0.305237 -0.750916 0.413147 0.310791 -0.776611 0.418793 0.316406 -0.801544 0.424316 0.321838 -0.825928 0.430054 0.327454 -0.849335 0.435577 0.332916 -0.097504 0.298767 0.185059 -0.114746 0.303467 0.189301 -0.133362 0.308350 0.193665 -0.153168 0.313324 0.198151 -0.173859 0.318237 0.202576 -0.195618 0.323334 0.207153 -0.217987 0.328400 0.211761 -0.241241 0.333649 0.216492 -0.265045 0.338837 0.221344 -0.289276 0.344086 0.226166 -0.314026 0.349426 0.231079 -0.339081 0.354858 0.236145 -0.364227 0.360168 0.241058 -0.389648 0.365662 0.246246 -0.415039 0.371185 0.251434 -0.440277 0.376617 0.256561 -0.465546 0.382202 0.261841 -0.491211 0.387665 0.267059 -0.517792 0.393341 0.272430 -0.544800 0.398987 0.277863 -0.572174 0.404541 0.283173 -0.599884 0.410217 0.288635 -0.627716 0.415924 0.294159 -0.655212 0.421387 0.299530 -0.682678 0.427124 0.305115 -0.709717 0.432770 0.310669 -0.736145 0.438385 0.316101 -0.762177 0.444092 0.321686 -0.787476 0.449768 0.327148 -0.812225 0.455566 0.332794 -0.836212 0.461395 0.338348 -0.859222 0.467102 0.343811 -0.104187 0.327606 0.193542 -0.122070 0.332520 0.197937 -0.141205 0.337616 0.202454 -0.161499 0.342743 0.207062 -0.182617 0.347778 0.211639 -0.204742 0.353058 0.216400 -0.227539 0.358246 0.221100 -0.251068 0.363586 0.225983 -0.275177 0.369019 0.230957 -0.299652 0.374298 0.235870 -0.324585 0.379791 0.240967 -0.349823 0.385315 0.246094 -0.375061 0.390717 0.251160 -0.400543 0.396332 0.256378 -0.425781 0.401733 0.261566 -0.451111 0.407410 0.266876 -0.476562 0.412994 0.272278 -0.502625 0.418518 0.277588 -0.529388 0.424225 0.283020 -0.556702 0.429901 0.288483 -0.584198 0.435425 0.293854 -0.611938 0.441162 0.299408 -0.639771 0.446930 0.304962 -0.667206 0.452606 0.310394 -0.694489 0.458405 0.315979 -0.721313 0.464325 0.321564 -0.747467 0.470123 0.327026 -0.773224 0.476105 0.332642 -0.798279 0.481934 0.338104 -0.822632 0.487915 0.343689 -0.846252 0.493927 0.349304 -0.868958 0.499786 0.354706 -0.111237 0.357056 0.202332 -0.129669 0.362122 0.206818 -0.149323 0.367401 0.211517 -0.170013 0.372559 0.216156 -0.191711 0.377808 0.221008 -0.214203 0.383209 0.225861 -0.237305 0.388519 0.230713 -0.261169 0.393982 0.235748 -0.285522 0.399506 0.240845 -0.310150 0.404877 0.245819 -0.335297 0.410431 0.251038 -0.360626 0.416016 0.256256 -0.385986 0.421448 0.261444 -0.411469 0.427094 0.266754 -0.436737 0.432556 0.272034 -0.462067 0.438232 0.277435 -0.487823 0.443909 0.282898 -0.514191 0.449585 0.288239 -0.541199 0.455383 0.293732 -0.568695 0.461304 0.299255 -0.596283 0.467072 0.304688 -0.624054 0.473053 0.310242 -0.651794 0.479034 0.315857 -0.679108 0.484924 0.321289 -0.706146 0.490936 0.326904 -0.732635 0.496918 0.332367 -0.758728 0.503052 0.337952 -0.784210 0.509155 0.343567 -0.808868 0.515106 0.349030 -0.832916 0.521240 0.354584 -0.856171 0.527405 0.360168 -0.878387 0.533386 0.365540 -0.118652 0.387024 0.211395 -0.137604 0.392181 0.216034 -0.157806 0.397552 0.220886 -0.178894 0.402771 0.225647 -0.201019 0.408234 0.230591 -0.223907 0.413696 0.235657 -0.247284 0.419037 0.240540 -0.271423 0.424561 0.245728 -0.296021 0.430115 0.250946 -0.320862 0.435577 0.256042 -0.346191 0.441223 0.261322 -0.371582 0.446899 0.266632 -0.396973 0.452515 0.271912 -0.422485 0.458313 0.277313 -0.447723 0.464050 0.282623 -0.473145 0.469971 0.288086 -0.499298 0.475983 0.293610 -0.525879 0.481873 0.298981 -0.553162 0.487915 0.304535 -0.580719 0.494019 0.310089 -0.608337 0.499969 0.315552 -0.636139 0.506134 0.321167 -0.663788 0.512268 0.326721 -0.690918 0.518311 0.332214 -0.717773 0.524536 0.337799 -0.744171 0.530792 0.343384 -0.769806 0.536804 0.348846 -0.794891 0.543060 0.354431 -0.819305 0.549103 0.359894 -0.842957 0.555328 0.365387 -0.865784 0.561523 0.370911 -0.887543 0.567505 0.376282 -0.126373 0.417267 0.220734 -0.145905 0.422516 0.225525 -0.166565 0.427887 0.230469 -0.188110 0.433258 0.235382 -0.210571 0.438751 0.240448 -0.233826 0.444336 0.245605 -0.257507 0.449829 0.250641 -0.281952 0.455597 0.255890 -0.306732 0.461365 0.261200 -0.331757 0.467072 0.266357 -0.357117 0.472961 0.271759 -0.382599 0.478912 0.277191 -0.408020 0.484772 0.282471 -0.433502 0.490814 0.287964 -0.458710 0.496796 0.293304 -0.484375 0.502960 0.298828 -0.510834 0.509125 0.304382 -0.537628 0.515137 0.309814 -0.565094 0.521393 0.315399 -0.592804 0.527679 0.321014 -0.620422 0.533783 0.326477 -0.648163 0.540070 0.332092 -0.675598 0.546356 0.337677 -0.702545 0.552490 0.343140 -0.729187 0.558777 0.348724 -0.755096 0.564941 0.354187 -0.780640 0.571198 0.359741 -0.805511 0.577423 0.365265 -0.829437 0.583557 0.370605 -0.852722 0.589691 0.376129 -0.875122 0.595886 0.381592 -0.896454 0.601898 0.386902 -0.134308 0.447601 0.230225 -0.154449 0.453217 0.235260 -0.175568 0.458832 0.240326 -0.197510 0.464386 0.245331 -0.220367 0.470245 0.250549 -0.243927 0.476105 0.255737 -0.267914 0.481903 0.260895 -0.292511 0.487854 0.266205 -0.317505 0.493896 0.271606 -0.342651 0.499786 0.276886 -0.368134 0.505951 0.282349 -0.393555 0.511963 0.287689 -0.419067 0.518188 0.293182 -0.444550 0.524414 0.298706 -0.469788 0.530548 0.304108 -0.495789 0.536835 0.309692 -0.522522 0.543213 0.315247 -0.549561 0.549347 0.320740 -0.577087 0.555695 0.326355 -0.604828 0.562073 0.331970 -0.632477 0.568268 0.337341 -0.660065 0.574585 0.342987 -0.687347 0.580933 0.348602 -0.714081 0.587067 0.354004 -0.740448 0.593445 0.359589 -0.766113 0.599579 0.365021 -0.791290 0.605804 0.370514 -0.815735 0.612030 0.376038 -0.839386 0.618042 0.381317 -0.862244 0.624207 0.386719 -0.884155 0.630280 0.392151 -0.905029 0.636169 0.397369 -0.142670 0.479309 0.240051 -0.163300 0.485168 0.245209 -0.184875 0.491089 0.250397 -0.207184 0.496948 0.255493 -0.230438 0.502991 0.260803 -0.254272 0.509094 0.266083 -0.278473 0.515076 0.271362 -0.303284 0.521240 0.276764 -0.328461 0.527527 0.282196 -0.353699 0.533600 0.287537 -0.379272 0.539917 0.293060 -0.404663 0.546082 0.298462 -0.430145 0.552429 0.303986 -0.455597 0.558807 0.309570 -0.480988 0.565063 0.315002 -0.507324 0.571411 0.320587 -0.534302 0.577850 0.326202 -0.561432 0.584076 0.331635 -0.589081 0.590454 0.337219 -0.616852 0.596863 0.342834 -0.644409 0.603058 0.348297 -0.671814 0.609375 0.353882 -0.698761 0.615540 0.359314 -0.725372 0.621857 0.364838 -0.751495 0.628113 0.370392 -0.776886 0.634186 0.375732 -0.801758 0.640320 0.381195 -0.825836 0.646454 0.386627 -0.849030 0.652344 0.391876 -0.871460 0.658325 0.397247 -0.892944 0.664337 0.402527 -0.913361 0.670013 0.407684 -0.151306 0.512238 0.250153 -0.172424 0.518311 0.255402 -0.194427 0.524445 0.260620 -0.217133 0.530518 0.265839 -0.240601 0.536743 0.271210 -0.264709 0.543060 0.276611 -0.289185 0.549164 0.281952 -0.314178 0.555511 0.287415 -0.339294 0.561737 0.292755 -0.364777 0.568146 0.298279 -0.390350 0.574554 0.303833 -0.415771 0.580780 0.309265 -0.441223 0.587189 0.314880 -0.466614 0.593658 0.320465 -0.492371 0.599915 0.325897 -0.518921 0.606354 0.331512 -0.546051 0.612732 0.337067 -0.573395 0.618958 0.342560 -0.601013 0.625336 0.348145 -0.628784 0.631653 0.353729 -0.656219 0.637848 0.359192 -0.683472 0.644043 0.364716 -0.710175 0.650146 0.370117 -0.736511 0.656311 0.375580 -0.762329 0.662445 0.381104 -0.787415 0.668365 0.386353 -0.811829 0.674408 0.391754 -0.835602 0.680328 0.397095 -0.858398 0.686066 0.402283 -0.880371 0.691833 0.407532 -0.901428 0.697601 0.412750 -0.921265 0.703125 0.417786 -0.160248 0.546143 0.260376 -0.181763 0.552368 0.265717 -0.204193 0.558716 0.271057 -0.227203 0.564911 0.276367 -0.251007 0.571289 0.281799 -0.275330 0.577667 0.287292 -0.299988 0.583923 0.292633 -0.325134 0.590332 0.298157 -0.350372 0.596588 0.303558 -0.375916 0.603058 0.309143 -0.401489 0.609528 0.314697 -0.426849 0.615784 0.320160 -0.452209 0.622223 0.325745 -0.477753 0.628632 0.331360 -0.503784 0.634888 0.336823 -0.530579 0.641205 0.342407 -0.557892 0.647552 0.348022 -0.585266 0.653717 0.353424 -0.612946 0.659973 0.359039 -0.640442 0.666077 0.364471 -0.667877 0.672211 0.369934 -0.694916 0.678345 0.375458 -0.721344 0.684265 0.380829 -0.747437 0.690186 0.386200 -0.772919 0.696198 0.391571 -0.797638 0.701904 0.396881 -0.821747 0.707733 0.402161 -0.845032 0.713440 0.407440 -0.867493 0.718964 0.412537 -0.888977 0.724579 0.417664 -0.909424 0.729950 0.422638 -0.928925 0.735352 0.427704 -0.169403 0.580688 0.270782 -0.191345 0.587067 0.276184 -0.214081 0.593506 0.281677 -0.237427 0.599731 0.286987 -0.261505 0.606201 0.292480 -0.286072 0.612640 0.298004 -0.310883 0.618896 0.303436 -0.336121 0.625366 0.308960 -0.361481 0.631622 0.314453 -0.387024 0.638062 0.320038 -0.412598 0.644440 0.325623 -0.437897 0.650696 0.331085 -0.463196 0.657043 0.336700 -0.488953 0.663330 0.342285 -0.515289 0.669495 0.347748 -0.542267 0.675720 0.353302 -0.569641 0.681946 0.358887 -0.597076 0.687927 0.364319 -0.624725 0.694061 0.369812 -0.652100 0.699921 0.375183 -0.679291 0.705933 0.380646 -0.706085 0.711823 0.386078 -0.732330 0.717560 0.391327 -0.758118 0.723358 0.396698 -0.783234 0.729095 0.401978 -0.807587 0.734589 0.407166 -0.831360 0.740173 0.412384 -0.854279 0.745697 0.417542 -0.876251 0.750977 0.422516 -0.897247 0.756287 0.427582 -0.917236 0.761444 0.432404 -0.936188 0.766602 0.437347 -0.178802 0.615631 0.281403 -0.201111 0.622070 0.286865 -0.224213 0.628510 0.292358 -0.247803 0.634735 0.297729 -0.272125 0.641144 0.303284 -0.296753 0.647400 0.308716 -0.321838 0.653839 0.314301 -0.347198 0.660217 0.319916 -0.372589 0.666412 0.325378 -0.398102 0.672729 0.330933 -0.423615 0.679047 0.336548 -0.448853 0.685120 0.342010 -0.474213 0.691284 0.347595 -0.500275 0.697510 0.353180 -0.526794 0.703491 0.358612 -0.553925 0.709595 0.364166 -0.581207 0.715393 0.369537 -0.608795 0.721375 0.375061 -0.636353 0.727325 0.380493 -0.663574 0.733002 0.385803 -0.690582 0.738770 0.391205 -0.717133 0.744476 0.396606 -0.742981 0.749969 0.401764 -0.768524 0.755554 0.407043 -0.793274 0.760986 0.412262 -0.817291 0.766296 0.417267 -0.840668 0.771606 0.422363 -0.863037 0.776764 0.427307 -0.884644 0.781860 0.432281 -0.905212 0.786957 0.437256 -0.924683 0.791779 0.441986 -0.943085 0.796722 0.446747 -0.188385 0.650513 0.292084 -0.211090 0.656921 0.297607 -0.234467 0.663300 0.303131 -0.258301 0.669495 0.308563 -0.282867 0.675812 0.314178 -0.307587 0.682037 0.319580 -0.332855 0.688263 0.325226 -0.358246 0.694550 0.330811 -0.383636 0.700592 0.336273 -0.409119 0.706787 0.341858 -0.434570 0.712921 0.347473 -0.459717 0.718872 0.352875 -0.485291 0.724884 0.358490 -0.511627 0.730865 0.364014 -0.538269 0.736664 0.369385 -0.565521 0.742584 0.374908 -0.592834 0.748199 0.380249 -0.620392 0.753937 0.385651 -0.647827 0.759613 0.391052 -0.674866 0.765137 0.396271 -0.701599 0.770660 0.401672 -0.727875 0.776123 0.406891 -0.753479 0.781372 0.411987 -0.778625 0.786713 0.417145 -0.803070 0.791901 0.422272 -0.826660 0.796906 0.427155 -0.849640 0.801971 0.432159 -0.871582 0.806793 0.436981 -0.892700 0.811646 0.441833 -0.912811 0.816406 0.446625 -0.931793 0.820984 0.451233 -0.949707 0.825592 0.455902 -0.198151 0.685028 0.302887 -0.221161 0.691315 0.308441 -0.244690 0.697479 0.313843 -0.268951 0.703674 0.319458 -0.293640 0.709900 0.325104 -0.318512 0.715912 0.330505 -0.343811 0.722107 0.336121 -0.369293 0.728119 0.341736 -0.394592 0.734039 0.347168 -0.420135 0.740021 0.352753 -0.445435 0.745972 0.358337 -0.470551 0.751740 0.363739 -0.496399 0.757599 0.369263 -0.522797 0.763184 0.374634 -0.549744 0.768890 0.380127 -0.577026 0.774567 0.385529 -0.604370 0.779968 0.390778 -0.631805 0.785522 0.396149 -0.659027 0.790955 0.401489 -0.685822 0.796143 0.406586 -0.712341 0.801422 0.411835 -0.738312 0.806641 0.417023 -0.763641 0.811615 0.421997 -0.788391 0.816620 0.427063 -0.812378 0.821411 0.431946 -0.835693 0.826294 0.436890 -0.858215 0.831024 0.441772 -0.879761 0.835571 0.446381 -0.900452 0.840149 0.451111 -0.920074 0.844635 0.455780 -0.938538 0.848877 0.460266 -0.955902 0.853088 0.464844 -0.208099 0.718964 0.313721 -0.231384 0.725098 0.319336 -0.255188 0.731079 0.324768 -0.279572 0.737152 0.330383 -0.304413 0.743164 0.335999 -0.329407 0.749054 0.341431 -0.354797 0.755005 0.347046 -0.380249 0.760895 0.352600 -0.405548 0.766571 0.358063 -0.430969 0.772400 0.363586 -0.456146 0.778107 0.369110 -0.481445 0.783600 0.374481 -0.507538 0.789246 0.379974 -0.534088 0.794617 0.385254 -0.561096 0.800079 0.390656 -0.588409 0.805481 0.396057 -0.615692 0.810669 0.401276 -0.643005 0.815918 0.406464 -0.670044 0.821075 0.411743 -0.696564 0.825958 0.416748 -0.722839 0.830963 0.421875 -0.748474 0.835876 0.426971 -0.773438 0.840576 0.431793 -0.797852 0.845276 0.436737 -0.821472 0.849823 0.441498 -0.844421 0.854340 0.446259 -0.866516 0.858765 0.450989 -0.887573 0.862946 0.455536 -0.907806 0.867218 0.460175 -0.926971 0.871368 0.464691 -0.944916 0.875275 0.469147 -0.961731 0.879211 0.473602 -0.218109 0.752075 0.324646 -0.241699 0.758026 0.330261 -0.265717 0.763824 0.335724 -0.290283 0.769745 0.341309 -0.315247 0.775543 0.346924 -0.340302 0.781189 0.352325 -0.365692 0.786926 0.357910 -0.391144 0.792603 0.363464 -0.416412 0.798096 0.368835 -0.441650 0.803619 0.374390 -0.466675 0.808990 0.379669 -0.492340 0.814392 0.385101 -0.518585 0.819763 0.390503 -0.545288 0.824890 0.395782 -0.572357 0.830017 0.401093 -0.599670 0.835144 0.406342 -0.626831 0.840027 0.411499 -0.653992 0.844971 0.416595 -0.680817 0.849854 0.421753 -0.707062 0.854492 0.426697 -0.733002 0.859161 0.431671 -0.758331 0.863708 0.436584 -0.782990 0.868103 0.441345 -0.807037 0.872498 0.446198 -0.830261 0.876648 0.450775 -0.852783 0.880890 0.455414 -0.874451 0.885010 0.460022 -0.895081 0.888885 0.464478 -0.914825 0.892822 0.469025 -0.933472 0.896576 0.473511 -0.950928 0.900177 0.477753 -0.967224 0.903748 0.482117 -0.228241 0.784210 0.335571 -0.252075 0.790039 0.341187 -0.276245 0.795593 0.346619 -0.300964 0.801270 0.352203 -0.326050 0.806854 0.357788 -0.351166 0.812317 0.363220 -0.376556 0.817749 0.368713 -0.401947 0.823181 0.374237 -0.427124 0.828400 0.379547 -0.452209 0.833679 0.385010 -0.477325 0.838715 0.390259 -0.503204 0.843872 0.395630 -0.529633 0.848907 0.400940 -0.556335 0.853790 0.406097 -0.583466 0.858643 0.411316 -0.610718 0.863434 0.416504 -0.637787 0.868042 0.421478 -0.664703 0.872650 0.426544 -0.691284 0.877167 0.431519 -0.717285 0.881500 0.436401 -0.742859 0.885864 0.441254 -0.767822 0.890015 0.445923 -0.792175 0.894165 0.450623 -0.815857 0.898193 0.455292 -0.838654 0.902039 0.459839 -0.860748 0.905914 0.464386 -0.881989 0.909668 0.468903 -0.902161 0.913208 0.473297 -0.921417 0.916748 0.477631 -0.939606 0.920227 0.482025 -0.956573 0.923462 0.486115 -0.972351 0.926666 0.490326 -0.238495 0.815308 0.346497 -0.262482 0.820892 0.352051 -0.286835 0.826233 0.357513 -0.311646 0.831635 0.363098 -0.336761 0.836975 0.368530 -0.361908 0.842102 0.373932 -0.387238 0.847351 0.379425 -0.412445 0.852356 0.384735 -0.437622 0.857391 0.390137 -0.462616 0.862366 0.395508 -0.487915 0.867157 0.400757 -0.513977 0.871948 0.405945 -0.540527 0.876648 0.411224 -0.567322 0.881226 0.416290 -0.594360 0.885803 0.421387 -0.621552 0.890259 0.426483 -0.648438 0.894531 0.431305 -0.675171 0.898804 0.436249 -0.701447 0.902985 0.441162 -0.727173 0.906921 0.445770 -0.752380 0.910950 0.450531 -0.777039 0.914734 0.455048 -0.800995 0.918518 0.459717 -0.824310 0.922241 0.464294 -0.846741 0.925751 0.468719 -0.868378 0.929199 0.473175 -0.889160 0.932617 0.477539 -0.908936 0.935822 0.481812 -0.927673 0.938995 0.486053 -0.945404 0.942108 0.490234 -0.961792 0.945007 0.494232 -0.977142 0.947845 0.498260 -0.248718 0.845215 0.357361 -0.272888 0.850433 0.362915 -0.297363 0.855530 0.368286 -0.322296 0.860657 0.373810 -0.347443 0.865723 0.379303 -0.372589 0.870544 0.384613 -0.397888 0.875488 0.390015 -0.422943 0.880188 0.395233 -0.447968 0.884918 0.400574 -0.472992 0.889618 0.405792 -0.498474 0.894012 0.410950 -0.524658 0.898468 0.416168 -0.551270 0.902893 0.421234 -0.578064 0.907104 0.426208 -0.605103 0.911255 0.431183 -0.632141 0.915405 0.436127 -0.658813 0.919312 0.440918 -0.685272 0.923218 0.445709 -0.711182 0.926971 0.450317 -0.736664 0.930695 0.454926 -0.761597 0.934296 0.459595 -0.785828 0.937744 0.464050 -0.809448 0.941132 0.468597 -0.832367 0.944489 0.473053 -0.854370 0.947632 0.477356 -0.875641 0.950775 0.481689 -0.895935 0.953796 0.485931 -0.915192 0.956635 0.490021 -0.933563 0.959442 0.494110 -0.950684 0.962097 0.498047 -0.966736 0.964691 0.502045 -0.981506 0.967255 0.505829 -0.258942 0.873657 0.368164 -0.283295 0.878632 0.373657 -0.307831 0.883362 0.379028 -0.332886 0.888214 0.384491 -0.357849 0.892822 0.389709 -0.383087 0.897522 0.395081 -0.408295 0.902039 0.400452 -0.433228 0.906403 0.405548 -0.458160 0.910858 0.410828 -0.483307 0.915100 0.416016 -0.508972 0.919220 0.420959 -0.535217 0.923370 0.426056 -0.561890 0.927399 0.431030 -0.588623 0.931213 0.435913 -0.615601 0.935059 0.440765 -0.642303 0.938690 0.445465 -0.668884 0.942322 0.450195 -0.695099 0.945862 0.454803 -0.720642 0.949219 0.459412 -0.745819 0.952576 0.463928 -0.770447 0.955811 0.468445 -0.794281 0.958893 0.472839 -0.817566 0.961945 0.477234 -0.840057 0.964874 0.481567 -0.861633 0.967682 0.485718 -0.882477 0.970398 0.489899 -0.902374 0.973053 0.494019 -0.921204 0.975525 0.497955 -0.939056 0.977966 0.501923 -0.955688 0.980286 0.505676 -0.971283 0.982544 0.509399 -0.985596 0.984741 0.513031 -0.039062 0.038086 0.122711 -0.051819 0.039276 0.124634 -0.064728 0.040588 0.126678 -0.078247 0.041962 0.128845 -0.092651 0.043365 0.131073 -0.108307 0.044861 0.133453 -0.125122 0.046417 0.135986 -0.143005 0.048004 0.138458 -0.161926 0.049683 0.141144 -0.181702 0.051392 0.143860 -0.202332 0.053192 0.146759 -0.223694 0.055084 0.149780 -0.245667 0.056946 0.152771 -0.268280 0.058960 0.156006 -0.291351 0.061035 0.159302 -0.314789 0.063110 0.162598 -0.338654 0.065308 0.166077 -0.362823 0.067596 0.169678 -0.386963 0.069855 0.173279 -0.411346 0.072266 0.177094 -0.435638 0.074677 0.180878 -0.459869 0.077240 0.184814 -0.484619 0.079865 0.188873 -0.509949 0.082520 0.192932 -0.536011 0.085297 0.197144 -0.562592 0.088165 0.201477 -0.589417 0.091064 0.205780 -0.616486 0.094147 0.210266 -0.643616 0.097290 0.214874 -0.670441 0.100433 0.219360 -0.697113 0.103790 0.224091 -0.723358 0.107117 0.228760 -0.042145 0.050049 0.126648 -0.054993 0.051422 0.128723 -0.068115 0.052917 0.131042 -0.081940 0.054474 0.133392 -0.096802 0.056061 0.135864 -0.112885 0.057709 0.138428 -0.130096 0.059448 0.141022 -0.148468 0.061249 0.143799 -0.167816 0.063141 0.146698 -0.187988 0.065033 0.149628 -0.209015 0.067108 0.152710 -0.230774 0.069183 0.155945 -0.253052 0.071289 0.159088 -0.275970 0.073517 0.162476 -0.299316 0.075867 0.166016 -0.323029 0.078186 0.169525 -0.347168 0.080658 0.173187 -0.371490 0.083221 0.176971 -0.395813 0.085785 0.180756 -0.420349 0.088531 0.184723 -0.444641 0.091248 0.188690 -0.469147 0.094147 0.192810 -0.494263 0.097168 0.197052 -0.519989 0.100159 0.201263 -0.546387 0.103363 0.205688 -0.573212 0.106659 0.210144 -0.600128 0.109924 0.214630 -0.627380 0.113373 0.219238 -0.654572 0.116913 0.223999 -0.681335 0.120453 0.228668 -0.708008 0.124207 0.233490 -0.734070 0.127869 0.238312 -0.045410 0.062836 0.130981 -0.058380 0.064392 0.133270 -0.071808 0.066132 0.135773 -0.085999 0.067871 0.138336 -0.101257 0.069641 0.140961 -0.117859 0.071564 0.143707 -0.135559 0.073517 0.146545 -0.154388 0.075562 0.149536 -0.174164 0.077728 0.152618 -0.194702 0.079865 0.155731 -0.216156 0.082184 0.158997 -0.238251 0.084564 0.162415 -0.260834 0.086945 0.165802 -0.284058 0.089539 0.169403 -0.307739 0.092163 0.173096 -0.331665 0.094879 0.176788 -0.356018 0.097687 0.180664 -0.380371 0.100555 0.184540 -0.404938 0.103516 0.188599 -0.429565 0.106659 0.192719 -0.454010 0.109802 0.196869 -0.478729 0.113129 0.201141 -0.504272 0.116486 0.205566 -0.530304 0.119873 0.209900 -0.556946 0.123444 0.214508 -0.583984 0.127106 0.219116 -0.611145 0.130737 0.223755 -0.638458 0.134583 0.228516 -0.665497 0.138428 0.233246 -0.692383 0.142395 0.238220 -0.718933 0.146484 0.243164 -0.744904 0.150543 0.248108 -0.048950 0.076691 0.135712 -0.062103 0.078522 0.138184 -0.075806 0.080475 0.140900 -0.090393 0.082489 0.143646 -0.106201 0.084564 0.146484 -0.123230 0.086761 0.149445 -0.141418 0.088989 0.152466 -0.160675 0.091370 0.155670 -0.180878 0.093811 0.158936 -0.201843 0.096313 0.162262 -0.223602 0.098969 0.165710 -0.246063 0.101685 0.169342 -0.268982 0.104492 0.172913 -0.292480 0.107422 0.176727 -0.316315 0.110382 0.180450 -0.340576 0.113464 0.184418 -0.365112 0.116699 0.188477 -0.389648 0.119904 0.192474 -0.414307 0.123322 0.196716 -0.439056 0.126770 0.201050 -0.463531 0.130280 0.205322 -0.488739 0.133942 0.209778 -0.514587 0.137726 0.214386 -0.540924 0.141479 0.218903 -0.567871 0.145416 0.223602 -0.595093 0.149384 0.228363 -0.622345 0.153381 0.233154 -0.649689 0.157562 0.238037 -0.676697 0.161713 0.242920 -0.703552 0.166046 0.247955 -0.729980 0.170441 0.253082 -0.755829 0.174835 0.258087 -0.052704 0.092010 0.140839 -0.066071 0.094116 0.143555 -0.080109 0.096375 0.146423 -0.095093 0.098694 0.149323 -0.111420 0.101135 0.152374 -0.129028 0.103668 0.155548 -0.147644 0.106262 0.158783 -0.167389 0.109009 0.162201 -0.187958 0.111816 0.165619 -0.209290 0.114685 0.169128 -0.231476 0.117676 0.172821 -0.254272 0.120789 0.176605 -0.277466 0.123901 0.180328 -0.301239 0.127197 0.184326 -0.325317 0.130524 0.188263 -0.349823 0.134003 0.192352 -0.374481 0.137573 0.196625 -0.399200 0.141205 0.200836 -0.423981 0.144897 0.205200 -0.448761 0.148743 0.209686 -0.473450 0.152588 0.214142 -0.498993 0.156647 0.218750 -0.525238 0.160706 0.223480 -0.551849 0.164764 0.228119 -0.579010 0.169067 0.233032 -0.606232 0.173279 0.237793 -0.633698 0.177704 0.242767 -0.661041 0.182190 0.247864 -0.687988 0.186646 0.252808 -0.714752 0.191284 0.257996 -0.741089 0.195984 0.263214 -0.766724 0.200623 0.268311 -0.056732 0.109039 0.146362 -0.070312 0.111511 0.149231 -0.084717 0.114136 0.152313 -0.100220 0.116760 0.155396 -0.117096 0.119568 0.158691 -0.135193 0.122498 0.162140 -0.154266 0.125366 0.165466 -0.174438 0.128479 0.169067 -0.195404 0.131653 0.172729 -0.217163 0.134827 0.176392 -0.239655 0.138245 0.180267 -0.262756 0.141663 0.184204 -0.286316 0.145172 0.188141 -0.310333 0.148804 0.192261 -0.334625 0.152466 0.196411 -0.359283 0.156311 0.200714 -0.384186 0.160217 0.205139 -0.408905 0.164154 0.209473 -0.433807 0.168213 0.214020 -0.458649 0.172363 0.218658 -0.483704 0.176544 0.223297 -0.509613 0.180847 0.228027 -0.536133 0.185303 0.232910 -0.563019 0.189667 0.237671 -0.590332 0.194244 0.242645 -0.617737 0.198761 0.247559 -0.645203 0.203461 0.252716 -0.672516 0.208221 0.257874 -0.699402 0.212952 0.262939 -0.725983 0.217773 0.268188 -0.752136 0.222809 0.273560 -0.777588 0.227692 0.278778 -0.060913 0.127838 0.152161 -0.074829 0.130707 0.155334 -0.089722 0.133667 0.158600 -0.105713 0.136658 0.161926 -0.123108 0.139801 0.165375 -0.141693 0.143005 0.168945 -0.161255 0.146271 0.172546 -0.181824 0.149719 0.176300 -0.203278 0.153198 0.180145 -0.225342 0.156799 0.184021 -0.248199 0.160492 0.188049 -0.271515 0.164215 0.192078 -0.295441 0.168060 0.196289 -0.319733 0.172089 0.200592 -0.344208 0.176025 0.204895 -0.369080 0.180176 0.209320 -0.394043 0.184418 0.213898 -0.418884 0.188660 0.218414 -0.443878 0.193054 0.223145 -0.468811 0.197510 0.227905 -0.494232 0.201965 0.232666 -0.520538 0.206573 0.237549 -0.547150 0.211151 0.242401 -0.574371 0.215942 0.247437 -0.601898 0.220764 0.252563 -0.629303 0.225525 0.257568 -0.656830 0.230499 0.262787 -0.684113 0.235535 0.268066 -0.710785 0.240448 0.273285 -0.737244 0.245544 0.278656 -0.763214 0.250793 0.284027 -0.788422 0.255829 0.289307 -0.065399 0.148376 0.158447 -0.079712 0.151550 0.161835 -0.095032 0.154907 0.165314 -0.111664 0.158173 0.168793 -0.129578 0.161652 0.172455 -0.148590 0.165222 0.176239 -0.168640 0.168823 0.179993 -0.189636 0.172577 0.183929 -0.211426 0.176422 0.187958 -0.233887 0.180298 0.191986 -0.257050 0.184296 0.196228 -0.280670 0.188324 0.200409 -0.304840 0.192505 0.204773 -0.329376 0.196808 0.209259 -0.354095 0.201111 0.213715 -0.379059 0.205505 0.218292 -0.404083 0.210052 0.222992 -0.429047 0.214508 0.227631 -0.454071 0.219238 0.232544 -0.479248 0.223969 0.237396 -0.505066 0.228699 0.242279 -0.531647 0.233551 0.247314 -0.558533 0.238373 0.252319 -0.585968 0.243378 0.257446 -0.613617 0.248474 0.262695 -0.641022 0.253448 0.267792 -0.668549 0.258636 0.273132 -0.695648 0.263824 0.278473 -0.722229 0.269012 0.283752 -0.748505 0.274292 0.289185 -0.774261 0.279663 0.294647 -0.799164 0.284943 0.300049 -0.070190 0.170532 0.165131 -0.084900 0.174011 0.168671 -0.100769 0.177643 0.172363 -0.117920 0.181244 0.175995 -0.136322 0.185028 0.179871 -0.155914 0.188934 0.183807 -0.176331 0.192841 0.187744 -0.197723 0.196869 0.191864 -0.219879 0.200958 0.196014 -0.242767 0.205170 0.200287 -0.266235 0.209503 0.204651 -0.290131 0.213837 0.209015 -0.314514 0.218292 0.213593 -0.339264 0.222870 0.218231 -0.364105 0.227417 0.222809 -0.389252 0.232117 0.227539 -0.414368 0.236938 0.232391 -0.439362 0.241669 0.237183 -0.464386 0.246582 0.242157 -0.489990 0.251617 0.247162 -0.516113 0.256500 0.252197 -0.542999 0.261597 0.257324 -0.570129 0.266663 0.262421 -0.597717 0.271881 0.267670 -0.625397 0.277161 0.273010 -0.652802 0.282318 0.278229 -0.680206 0.287689 0.283630 -0.707184 0.293091 0.289062 -0.733643 0.298401 0.294403 -0.759735 0.303833 0.299896 -0.785034 0.309204 0.305298 -0.809906 0.314728 0.310852 -0.075226 0.194092 0.172180 -0.090393 0.197937 0.175934 -0.106842 0.201813 0.179749 -0.124512 0.205719 0.183594 -0.143494 0.209839 0.187653 -0.163513 0.214020 0.191803 -0.184418 0.218201 0.195923 -0.206207 0.222534 0.200165 -0.228699 0.226898 0.204468 -0.251923 0.231415 0.208893 -0.275696 0.235992 0.213470 -0.299835 0.240540 0.217957 -0.324463 0.245331 0.222656 -0.349426 0.250183 0.227448 -0.374390 0.254913 0.232147 -0.399567 0.259888 0.237061 -0.424835 0.264893 0.242035 -0.449829 0.269867 0.246948 -0.475067 0.274963 0.252075 -0.500824 0.280060 0.257080 -0.527435 0.285309 0.262268 -0.554565 0.290619 0.267517 -0.581879 0.295837 0.272736 -0.609558 0.301239 0.278107 -0.637238 0.306671 0.283478 -0.664673 0.311981 0.288757 -0.691895 0.317505 0.294250 -0.718781 0.323059 0.299774 -0.745026 0.328491 0.305145 -0.770874 0.334106 0.310730 -0.795929 0.339508 0.316162 -0.820465 0.345123 0.321747 -0.080597 0.218994 0.179565 -0.096283 0.223145 0.183533 -0.113342 0.227325 0.187531 -0.131500 0.231537 0.191559 -0.151001 0.235901 0.195801 -0.171387 0.240234 0.199951 -0.192810 0.244781 0.204346 -0.214996 0.249390 0.208801 -0.237793 0.253937 0.213226 -0.261383 0.258789 0.217834 -0.285431 0.263580 0.222565 -0.309814 0.268402 0.227173 -0.334656 0.273376 0.232025 -0.359711 0.278412 0.236908 -0.384827 0.283417 0.241791 -0.410126 0.288574 0.246826 -0.435425 0.293823 0.251923 -0.460358 0.298920 0.256958 -0.485931 0.304230 0.262115 -0.512085 0.309509 0.267273 -0.538940 0.314911 0.272614 -0.566284 0.320404 0.277954 -0.593811 0.325745 0.283203 -0.621490 0.331268 0.288635 -0.649170 0.336823 0.294128 -0.676544 0.342285 0.299469 -0.703674 0.347900 0.305054 -0.730286 0.353546 0.310608 -0.756317 0.359039 0.316040 -0.781921 0.364685 0.321625 -0.806702 0.370209 0.327087 -0.830933 0.375885 0.332733 -0.086273 0.245148 0.187317 -0.102539 0.249542 0.191437 -0.120148 0.253937 0.195679 -0.138885 0.258423 0.199829 -0.158844 0.263062 0.204254 -0.179718 0.267639 0.208588 -0.201508 0.272430 0.213104 -0.224121 0.277283 0.217743 -0.247223 0.282074 0.222290 -0.271118 0.287109 0.227051 -0.295441 0.292145 0.231873 -0.320007 0.297150 0.236694 -0.345032 0.302307 0.241669 -0.370270 0.307556 0.246674 -0.395447 0.312744 0.251648 -0.420776 0.318054 0.256805 -0.445923 0.323303 0.261871 -0.471130 0.328735 0.267151 -0.497131 0.334259 0.272491 -0.523560 0.339600 0.277679 -0.550659 0.345123 0.283081 -0.578156 0.350708 0.288513 -0.605743 0.356201 0.293823 -0.633514 0.361816 0.299316 -0.661163 0.367462 0.304901 -0.688293 0.372955 0.310303 -0.715302 0.378662 0.315887 -0.741577 0.384216 0.321320 -0.767548 0.389893 0.326965 -0.792816 0.395569 0.332611 -0.817291 0.401123 0.338104 -0.841217 0.406830 0.343719 -0.092285 0.272308 0.195465 -0.109161 0.276947 0.199707 -0.127228 0.281555 0.204041 -0.146576 0.286346 0.208435 -0.167023 0.291199 0.212982 -0.188324 0.295990 0.217499 -0.210541 0.300995 0.222198 -0.233490 0.306061 0.226959 -0.256958 0.311066 0.231659 -0.281036 0.316223 0.236572 -0.305573 0.321472 0.241516 -0.330414 0.326660 0.246429 -0.355591 0.331970 0.251556 -0.380737 0.337250 0.256561 -0.406128 0.342712 0.261749 -0.431519 0.348145 0.267029 -0.456604 0.353577 0.272186 -0.482147 0.359131 0.277527 -0.508453 0.364685 0.282959 -0.535126 0.370148 0.288239 -0.562500 0.375763 0.293701 -0.590118 0.381439 0.299194 -0.617828 0.386963 0.304626 -0.645508 0.392639 0.310150 -0.673065 0.398315 0.315765 -0.700134 0.403839 0.321198 -0.726898 0.409576 0.326843 -0.752930 0.415100 0.332336 -0.778625 0.420837 0.337921 -0.803589 0.426514 0.343597 -0.827759 0.432007 0.349091 -0.851257 0.437683 0.354736 -0.098694 0.300446 0.203888 -0.116150 0.305298 0.208344 -0.134735 0.310089 0.212769 -0.154663 0.315063 0.217346 -0.175537 0.320129 0.222076 -0.197235 0.325165 0.226715 -0.219818 0.330322 0.231506 -0.243103 0.335541 0.236420 -0.266876 0.340698 0.241272 -0.291229 0.346039 0.246307 -0.316010 0.351471 0.251404 -0.341003 0.356720 0.256439 -0.366302 0.362213 0.261627 -0.391571 0.367584 0.266724 -0.416992 0.373138 0.272064 -0.442383 0.378723 0.277435 -0.467499 0.384186 0.282684 -0.493439 0.389832 0.288116 -0.519989 0.395447 0.293579 -0.546936 0.401031 0.298920 -0.574493 0.406677 0.304443 -0.602203 0.412323 0.309998 -0.629883 0.417908 0.315430 -0.657532 0.423553 0.321075 -0.684753 0.429077 0.326538 -0.711792 0.434814 0.332184 -0.738312 0.440491 0.337799 -0.764160 0.446106 0.343292 -0.789520 0.451904 0.348938 -0.814209 0.457733 0.354584 -0.838043 0.463440 0.360077 -0.861176 0.469330 0.365692 -0.105408 0.329346 0.212646 -0.123444 0.334412 0.217255 -0.142639 0.339386 0.221832 -0.162994 0.344543 0.226562 -0.184326 0.349762 0.231415 -0.206451 0.354919 0.236206 -0.229401 0.360260 0.241150 -0.253021 0.365601 0.246185 -0.277039 0.370880 0.251160 -0.301666 0.376373 0.256287 -0.326477 0.381744 0.261353 -0.351715 0.387207 0.266602 -0.377136 0.392822 0.271942 -0.402466 0.398254 0.277161 -0.427887 0.403839 0.282532 -0.453247 0.409546 0.287994 -0.478546 0.415009 0.293274 -0.504852 0.420654 0.298798 -0.531708 0.426331 0.304321 -0.558838 0.431854 0.309753 -0.586517 0.437592 0.315308 -0.614288 0.443298 0.320923 -0.641937 0.448944 0.326416 -0.669525 0.454773 0.332031 -0.696564 0.460541 0.337524 -0.723389 0.466400 0.343170 -0.749664 0.472382 0.348816 -0.775238 0.478149 0.354309 -0.800262 0.484131 0.359955 -0.824646 0.490143 0.365570 -0.848083 0.496033 0.370972 -0.870789 0.502075 0.376617 -0.112549 0.358917 0.221710 -0.131134 0.364075 0.226440 -0.150848 0.369202 0.231171 -0.171661 0.374512 0.236084 -0.193451 0.379883 0.240997 -0.215942 0.385101 0.245911 -0.239227 0.390533 0.251038 -0.263153 0.396057 0.256165 -0.287384 0.401428 0.261230 -0.312225 0.406952 0.266479 -0.337250 0.412354 0.271667 -0.362610 0.417969 0.277039 -0.388062 0.423553 0.282410 -0.413452 0.429016 0.287689 -0.438843 0.434662 0.293152 -0.464203 0.440399 0.298676 -0.489868 0.445953 0.304047 -0.516449 0.451752 0.309631 -0.543488 0.457581 0.315186 -0.570801 0.463379 0.320648 -0.598602 0.469330 0.326233 -0.626251 0.475098 0.331757 -0.653931 0.481171 0.337341 -0.681366 0.487183 0.343018 -0.708252 0.493073 0.348541 -0.734833 0.499176 0.354156 -0.760864 0.505280 0.359802 -0.786163 0.511292 0.365265 -0.810913 0.517395 0.370850 -0.834839 0.523529 0.376465 -0.857910 0.529510 0.381927 -0.880157 0.535706 0.387421 -0.119995 0.388855 0.231018 -0.139191 0.394196 0.235931 -0.159363 0.399475 0.240784 -0.180634 0.404846 0.245819 -0.202820 0.410278 0.250916 -0.225647 0.415619 0.255890 -0.249268 0.421112 0.261078 -0.273438 0.426697 0.266327 -0.297913 0.432068 0.271515 -0.322937 0.437653 0.276855 -0.348114 0.443176 0.282135 -0.373566 0.448914 0.287567 -0.399109 0.454681 0.292999 -0.424438 0.460388 0.298370 -0.449829 0.466278 0.303925 -0.475311 0.472198 0.309479 -0.501343 0.478058 0.314911 -0.528137 0.484100 0.320526 -0.555420 0.490143 0.326111 -0.582855 0.496094 0.331573 -0.610687 0.502258 0.337219 -0.638458 0.508453 0.342865 -0.665924 0.514465 0.348389 -0.693207 0.520630 0.354004 -0.719879 0.526703 0.359528 -0.746124 0.532928 0.365143 -0.771881 0.539154 0.370697 -0.796844 0.545197 0.376160 -0.821259 0.551422 0.381775 -0.844818 0.557587 0.387268 -0.867493 0.563660 0.392700 -0.889313 0.569855 0.398163 -0.127777 0.419098 0.240662 -0.147461 0.424530 0.245697 -0.168152 0.429840 0.250641 -0.189880 0.435333 0.255768 -0.212463 0.440826 0.260956 -0.235626 0.446289 0.266052 -0.259521 0.451935 0.271393 -0.283936 0.457703 0.276733 -0.308655 0.463409 0.282013 -0.333832 0.469269 0.287415 -0.359100 0.475006 0.292725 -0.384613 0.481018 0.298248 -0.410156 0.487030 0.303772 -0.435516 0.492950 0.309204 -0.460815 0.499084 0.314789 -0.486633 0.505188 0.320343 -0.512878 0.511292 0.325836 -0.539948 0.517487 0.331451 -0.567413 0.523773 0.337067 -0.594940 0.529816 0.342560 -0.622742 0.536163 0.348236 -0.650299 0.542267 0.353729 -0.677734 0.548553 0.359406 -0.704803 0.554840 0.364990 -0.731262 0.561005 0.370483 -0.757233 0.567291 0.376068 -0.782684 0.573517 0.381653 -0.807343 0.579651 0.387024 -0.831360 0.585846 0.392578 -0.854584 0.592041 0.398041 -0.876770 0.598083 0.403320 -0.898132 0.604187 0.408783 -0.135925 0.449677 0.250519 -0.156128 0.455292 0.255646 -0.177246 0.460846 0.260742 -0.199371 0.466583 0.265930 -0.222260 0.472443 0.271271 -0.245789 0.478149 0.276489 -0.269958 0.484100 0.281891 -0.294434 0.489960 0.287140 -0.319458 0.496002 0.292603 -0.344757 0.502075 0.298065 -0.370148 0.508087 0.303497 -0.395691 0.514282 0.309052 -0.421234 0.520508 0.314606 -0.446533 0.526642 0.320099 -0.471924 0.532898 0.325684 -0.498016 0.539215 0.331329 -0.524597 0.545410 0.336792 -0.551819 0.551697 0.342438 -0.579407 0.558105 0.348083 -0.607025 0.564270 0.353607 -0.634766 0.570618 0.359253 -0.662231 0.576813 0.364716 -0.689484 0.583099 0.370331 -0.716248 0.589447 0.375916 -0.742462 0.595612 0.381378 -0.768188 0.601868 0.386871 -0.793304 0.608154 0.392426 -0.817596 0.614197 0.397766 -0.841248 0.620361 0.403198 -0.864044 0.626495 0.408630 -0.885773 0.632416 0.413910 -0.906677 0.638397 0.419189 -0.144287 0.481476 0.260559 -0.165039 0.487335 0.265839 -0.186584 0.493195 0.270966 -0.209045 0.499176 0.276337 -0.232330 0.505249 0.281708 -0.256104 0.511261 0.287018 -0.280548 0.517395 0.292480 -0.305237 0.523407 0.297821 -0.330444 0.529663 0.303375 -0.355865 0.535980 0.308899 -0.381226 0.542145 0.314362 -0.406830 0.548462 0.319946 -0.432281 0.554810 0.325562 -0.457520 0.561035 0.331024 -0.483215 0.567444 0.336700 -0.509552 0.573792 0.342316 -0.536377 0.580078 0.347839 -0.563721 0.586456 0.353424 -0.591248 0.592682 0.358948 -0.618988 0.599091 0.364594 -0.646637 0.605408 0.370178 -0.673950 0.611633 0.375641 -0.700958 0.617889 0.381195 -0.727539 0.624237 0.386719 -0.753448 0.630249 0.392120 -0.778931 0.636444 0.397644 -0.803650 0.642609 0.403046 -0.827606 0.648529 0.408356 -0.850830 0.654602 0.413727 -0.873077 0.660431 0.418915 -0.894501 0.666382 0.424225 -0.914886 0.672211 0.429504 -0.153015 0.514496 0.270844 -0.174194 0.520599 0.276184 -0.196167 0.526642 0.281464 -0.219055 0.532867 0.286896 -0.242462 0.538940 0.292206 -0.266632 0.545227 0.297699 -0.291229 0.551575 0.303223 -0.316101 0.557739 0.308624 -0.341431 0.564148 0.314209 -0.366913 0.570526 0.319794 -0.392365 0.576782 0.325287 -0.417908 0.583191 0.330902 -0.443390 0.589600 0.336517 -0.468567 0.595886 0.342010 -0.494568 0.602325 0.347656 -0.520996 0.608582 0.353180 -0.548157 0.614960 0.358826 -0.575653 0.621368 0.364471 -0.603210 0.627594 0.369904 -0.630859 0.633881 0.375488 -0.658386 0.640137 0.381104 -0.685516 0.646271 0.386475 -0.712311 0.652466 0.391998 -0.738647 0.658600 0.397491 -0.764252 0.664612 0.402802 -0.789337 0.670624 0.408264 -0.813782 0.676636 0.413635 -0.837341 0.682404 0.418762 -0.860168 0.688232 0.424103 -0.881958 0.693909 0.429199 -0.902924 0.699585 0.434357 -0.922821 0.705231 0.439514 -0.161987 0.548492 0.281342 -0.183594 0.554779 0.286743 -0.205933 0.560913 0.292084 -0.229156 0.567322 0.297577 -0.252899 0.573486 0.302948 -0.277252 0.579926 0.308502 -0.302063 0.586304 0.314087 -0.327087 0.592621 0.319489 -0.352509 0.599060 0.325165 -0.378082 0.605499 0.330750 -0.403503 0.611786 0.336273 -0.428986 0.618225 0.341888 -0.454376 0.624603 0.347534 -0.479767 0.630829 0.353027 -0.506012 0.637238 0.358673 -0.532654 0.643463 0.364166 -0.559967 0.649811 0.369720 -0.587524 0.656067 0.375336 -0.615051 0.662170 0.380829 -0.642670 0.668365 0.386353 -0.670013 0.674500 0.391846 -0.696899 0.680450 0.397217 -0.723480 0.686493 0.402649 -0.749481 0.692505 0.408142 -0.774780 0.698273 0.413300 -0.799591 0.704102 0.418640 -0.823517 0.709778 0.423798 -0.846771 0.715485 0.429108 -0.869110 0.721069 0.434235 -0.890533 0.726471 0.439270 -0.910980 0.731964 0.444305 -0.930328 0.737335 0.449341 -0.171173 0.583069 0.291931 -0.193085 0.589325 0.297272 -0.215912 0.595734 0.302795 -0.239471 0.602142 0.308350 -0.263428 0.608429 0.313782 -0.287994 0.614868 0.319366 -0.312988 0.621338 0.325043 -0.338135 0.627625 0.330475 -0.363617 0.634064 0.336090 -0.389160 0.640472 0.341736 -0.414520 0.646698 0.347229 -0.440033 0.653046 0.352875 -0.465210 0.659302 0.358398 -0.490967 0.665558 0.364014 -0.517487 0.671844 0.369598 -0.544342 0.677917 0.375092 -0.571716 0.684113 0.380646 -0.599335 0.690186 0.386200 -0.626801 0.696136 0.391571 -0.654327 0.702148 0.397064 -0.681519 0.708160 0.402496 -0.708130 0.713959 0.407806 -0.734406 0.719757 0.413239 -0.760132 0.725555 0.418518 -0.785065 0.731079 0.423676 -0.809479 0.736694 0.428986 -0.833038 0.742096 0.433990 -0.855896 0.747589 0.439117 -0.877838 0.753021 0.444183 -0.898743 0.758148 0.449066 -0.918701 0.763336 0.454010 -0.937561 0.768524 0.458923 -0.180634 0.618042 0.302643 -0.202911 0.624298 0.308075 -0.226074 0.630737 0.313660 -0.249878 0.637146 0.319244 -0.274078 0.643433 0.324707 -0.298798 0.649841 0.330353 -0.323944 0.656219 0.335968 -0.349182 0.662415 0.341461 -0.374695 0.668762 0.347107 -0.400269 0.675079 0.352753 -0.425598 0.681213 0.358246 -0.450958 0.687469 0.363892 -0.476227 0.693512 0.369354 -0.502319 0.699677 0.374939 -0.528992 0.705750 0.380493 -0.556000 0.711670 0.385895 -0.583435 0.717682 0.391418 -0.611023 0.723633 0.396942 -0.638428 0.729370 0.402252 -0.665771 0.735138 0.407684 -0.692657 0.740967 0.413086 -0.719055 0.746429 0.418243 -0.745056 0.752075 0.423615 -0.770294 0.757477 0.428711 -0.795074 0.762939 0.433838 -0.819122 0.768341 0.438995 -0.842255 0.773468 0.443909 -0.864685 0.778687 0.448914 -0.886169 0.783813 0.453888 -0.906616 0.788727 0.458710 -0.926086 0.793671 0.463623 -0.944397 0.798492 0.468445 -0.190277 0.652954 0.313507 -0.212891 0.659149 0.318970 -0.236298 0.665527 0.324585 -0.260345 0.671906 0.330200 -0.284760 0.678040 0.335693 -0.309692 0.684357 0.341339 -0.334930 0.690643 0.346985 -0.360229 0.696686 0.352448 -0.385773 0.702942 0.358093 -0.411102 0.708893 0.363586 -0.436493 0.715057 0.369171 -0.461792 0.721100 0.374786 -0.487305 0.727020 0.380249 -0.513641 0.733002 0.385773 -0.540497 0.738892 0.391327 -0.567596 0.744568 0.396698 -0.595062 0.750397 0.402130 -0.622559 0.756104 0.407532 -0.649841 0.761597 0.412811 -0.676941 0.767181 0.418121 -0.703674 0.772736 0.423462 -0.729736 0.778015 0.428558 -0.755432 0.783356 0.433716 -0.780365 0.788513 0.438782 -0.804749 0.793732 0.443817 -0.828430 0.798798 0.448853 -0.851196 0.803680 0.453613 -0.873169 0.808624 0.458588 -0.894165 0.813477 0.463470 -0.914154 0.818115 0.468201 -0.933105 0.822723 0.473053 -0.950928 0.827271 0.477753 -0.200043 0.687408 0.324402 -0.222961 0.693542 0.329926 -0.246704 0.699799 0.335541 -0.270996 0.706024 0.341187 -0.295563 0.712036 0.346680 -0.320618 0.718201 0.352325 -0.345947 0.724335 0.357941 -0.371246 0.730255 0.363464 -0.396759 0.736298 0.369049 -0.422058 0.742126 0.374512 -0.447388 0.748047 0.380127 -0.472656 0.753906 0.385620 -0.498413 0.759583 0.391022 -0.524933 0.765381 0.396515 -0.551941 0.771027 0.401978 -0.579102 0.776520 0.407318 -0.606506 0.782074 0.412659 -0.633972 0.787537 0.417969 -0.661041 0.792816 0.423157 -0.687927 0.798157 0.428436 -0.714264 0.803253 0.433472 -0.740173 0.808380 0.438629 -0.765533 0.813538 0.443665 -0.790100 0.818329 0.448578 -0.814148 0.823212 0.453522 -0.837433 0.828094 0.458435 -0.859741 0.832703 0.463226 -0.881287 0.837311 0.468048 -0.901886 0.841827 0.472900 -0.921326 0.846161 0.477509 -0.939758 0.850433 0.482239 -0.956970 0.854584 0.486786 -0.209991 0.721252 0.335419 -0.233215 0.727264 0.340912 -0.257172 0.733368 0.346558 -0.281616 0.739441 0.352142 -0.306366 0.745331 0.357697 -0.331512 0.751251 0.363373 -0.356873 0.757172 0.368896 -0.382202 0.762939 0.374390 -0.407684 0.768768 0.379944 -0.432892 0.774414 0.385315 -0.458099 0.780060 0.390900 -0.483521 0.785736 0.396393 -0.509552 0.791199 0.401703 -0.536194 0.796692 0.407166 -0.563293 0.802094 0.412537 -0.590485 0.807373 0.417725 -0.617889 0.812592 0.423096 -0.645142 0.817810 0.428314 -0.672028 0.822815 0.433350 -0.698639 0.827881 0.438446 -0.724731 0.832733 0.443390 -0.750275 0.837555 0.448425 -0.775330 0.842346 0.453430 -0.799561 0.846863 0.458191 -0.823181 0.851471 0.463135 -0.846039 0.856018 0.467926 -0.867950 0.860260 0.472656 -0.889038 0.864563 0.477386 -0.909149 0.868774 0.482147 -0.928162 0.872772 0.486694 -0.946075 0.876770 0.491241 -0.962769 0.880585 0.495697 -0.220062 0.754303 0.346405 -0.243561 0.760132 0.351868 -0.267700 0.766022 0.357544 -0.292328 0.771881 0.363190 -0.317169 0.777588 0.368591 -0.342407 0.783325 0.374237 -0.367676 0.788971 0.379669 -0.393097 0.794586 0.385223 -0.418488 0.800171 0.390747 -0.443604 0.805542 0.396118 -0.468750 0.811035 0.401642 -0.494415 0.816376 0.407043 -0.520630 0.821594 0.412292 -0.547424 0.826813 0.417603 -0.574524 0.831970 0.422943 -0.601654 0.836945 0.428040 -0.628967 0.841919 0.433228 -0.655975 0.846680 0.438232 -0.682739 0.851501 0.443298 -0.709076 0.856262 0.448303 -0.734833 0.860718 0.453156 -0.760101 0.865326 0.458069 -0.784790 0.869781 0.463013 -0.808655 0.874054 0.467712 -0.831909 0.878326 0.472504 -0.854340 0.882446 0.477295 -0.875793 0.886383 0.481934 -0.896484 0.890411 0.486542 -0.916016 0.894135 0.491028 -0.934631 0.897919 0.495544 -0.952026 0.901520 0.500031 -0.968170 0.904999 0.504303 -0.230225 0.786407 0.357391 -0.253876 0.791992 0.362915 -0.278259 0.797760 0.368469 -0.303040 0.803406 0.374115 -0.328003 0.808838 0.379547 -0.353241 0.814362 0.385071 -0.378448 0.819672 0.390442 -0.403809 0.825043 0.395966 -0.429108 0.830414 0.401459 -0.454132 0.835541 0.406738 -0.479370 0.840698 0.412140 -0.505280 0.845795 0.417450 -0.531647 0.850677 0.422638 -0.558472 0.855591 0.427887 -0.585571 0.860504 0.433105 -0.612671 0.865112 0.438110 -0.639832 0.869781 0.443176 -0.666595 0.874268 0.448059 -0.693176 0.878784 0.453064 -0.719177 0.883148 0.457947 -0.744568 0.887360 0.462738 -0.769623 0.891571 0.467621 -0.793884 0.895660 0.472443 -0.817413 0.899567 0.477051 -0.840271 0.903534 0.481812 -0.862274 0.907318 0.486420 -0.883301 0.910950 0.490906 -0.903503 0.914551 0.495453 -0.922607 0.917999 0.499817 -0.940674 0.921356 0.504242 -0.957611 0.924683 0.508514 -0.973267 0.927826 0.512634 -0.240387 0.817413 0.368347 -0.264343 0.822784 0.373810 -0.288818 0.828247 0.379395 -0.313568 0.833466 0.384827 -0.338684 0.838837 0.390320 -0.364014 0.844086 0.395874 -0.389160 0.849152 0.401184 -0.414398 0.854248 0.406555 -0.439636 0.859253 0.412018 -0.464508 0.864105 0.417236 -0.489990 0.868988 0.422516 -0.516022 0.873718 0.427795 -0.542480 0.878357 0.432800 -0.569397 0.882965 0.437958 -0.596375 0.887360 0.442902 -0.623444 0.891785 0.447937 -0.650452 0.896088 0.452942 -0.676971 0.900238 0.457703 -0.703247 0.904388 0.462585 -0.729004 0.908447 0.467468 -0.754120 0.912323 0.472198 -0.778717 0.916138 0.476929 -0.802643 0.919952 0.481689 -0.825775 0.923462 0.486176 -0.848236 0.927063 0.490814 -0.869720 0.930420 0.495209 -0.890442 0.933746 0.499725 -0.910187 0.937042 0.504120 -0.928802 0.940094 0.508301 -0.946381 0.943146 0.512543 -0.962769 0.946106 0.516663 -0.977936 0.948853 0.520630 -0.250671 0.847198 0.379272 -0.274719 0.852295 0.384705 -0.299408 0.857483 0.390198 -0.324188 0.862427 0.395569 -0.349365 0.867493 0.401062 -0.374573 0.872406 0.406403 -0.399750 0.877136 0.411743 -0.424927 0.881958 0.417084 -0.449982 0.886658 0.422363 -0.474854 0.891174 0.427521 -0.500519 0.895721 0.432709 -0.526733 0.900146 0.437866 -0.553223 0.904388 0.442780 -0.580139 0.908661 0.447784 -0.607025 0.912689 0.452667 -0.634003 0.916809 0.457550 -0.660767 0.920776 0.462524 -0.687042 0.924561 0.467224 -0.712982 0.928375 0.472046 -0.738403 0.932068 0.476776 -0.763214 0.935547 0.481445 -0.787506 0.939026 0.486084 -0.811066 0.942413 0.490723 -0.833771 0.945618 0.495087 -0.855804 0.948792 0.499573 -0.876892 0.951843 0.503906 -0.897125 0.954803 0.508240 -0.916443 0.957703 0.512451 -0.934601 0.960388 0.516510 -0.951691 0.963104 0.520569 -0.967651 0.965668 0.524536 -0.982269 0.968079 0.528290 -0.260773 0.875427 0.389954 -0.285156 0.880341 0.395416 -0.309875 0.885223 0.400909 -0.334717 0.889893 0.406189 -0.359894 0.894592 0.411621 -0.385101 0.899231 0.416962 -0.410156 0.903625 0.422119 -0.435211 0.908112 0.427368 -0.460052 0.912415 0.432556 -0.485138 0.916595 0.437592 -0.510956 0.920776 0.442688 -0.537140 0.924805 0.447601 -0.563782 0.928772 0.452515 -0.590668 0.932648 0.457489 -0.617432 0.936340 0.462280 -0.644226 0.940094 0.467102 -0.670807 0.943695 0.471954 -0.696747 0.947083 0.476532 -0.722443 0.950531 0.481323 -0.747528 0.953796 0.485992 -0.772003 0.956940 0.490479 -0.795868 0.960052 0.494995 -0.818970 0.962982 0.499359 -0.841400 0.965851 0.503784 -0.863007 0.968689 0.508118 -0.883698 0.971344 0.512238 -0.903503 0.973969 0.516449 -0.922302 0.976471 0.520508 -0.940002 0.978790 0.524353 -0.956665 0.981140 0.528198 -0.972107 0.983368 0.531952 -0.986298 0.985443 0.535553 -0.039581 0.038513 0.138306 -0.052429 0.039764 0.140381 -0.065369 0.041107 0.142609 -0.078857 0.042450 0.144836 -0.093414 0.043945 0.147278 -0.109070 0.045410 0.149780 -0.126007 0.046997 0.152374 -0.143982 0.048645 0.155121 -0.162964 0.050293 0.157898 -0.182831 0.052063 0.160828 -0.203583 0.053925 0.163879 -0.224915 0.055756 0.166962 -0.247040 0.057678 0.170197 -0.269745 0.059723 0.173553 -0.292786 0.061768 0.176941 -0.316345 0.063934 0.180481 -0.340179 0.066101 0.184052 -0.364349 0.068390 0.187805 -0.388641 0.070770 0.191650 -0.412933 0.073120 0.195496 -0.437317 0.075592 0.199493 -0.461670 0.078217 0.203674 -0.486328 0.080811 0.207764 -0.511871 0.083557 0.212067 -0.537994 0.086395 0.216431 -0.564484 0.089203 0.220825 -0.591431 0.092224 0.225281 -0.618439 0.095245 0.229828 -0.645508 0.098419 0.234558 -0.672516 0.101685 0.239319 -0.699097 0.104950 0.244019 -0.725372 0.108429 0.248962 -0.042694 0.050537 0.142517 -0.055603 0.051971 0.144806 -0.068756 0.053436 0.147156 -0.082642 0.055023 0.149689 -0.097595 0.056671 0.152283 -0.113739 0.058319 0.154968 -0.131134 0.060120 0.157837 -0.149567 0.061951 0.160736 -0.168945 0.063812 0.163727 -0.189240 0.065796 0.166870 -0.210388 0.067841 0.170105 -0.232086 0.069916 0.173370 -0.254517 0.072083 0.176880 -0.277405 0.074341 0.180298 -0.300842 0.076660 0.183960 -0.324707 0.079102 0.187714 -0.348724 0.081543 0.191437 -0.373077 0.084167 0.195374 -0.397583 0.086792 0.199402 -0.421967 0.089478 0.203430 -0.446472 0.092346 0.207642 -0.470917 0.095276 0.211914 -0.496094 0.098236 0.216187 -0.521942 0.101349 0.220642 -0.548370 0.104553 0.225159 -0.575104 0.107788 0.229706 -0.602203 0.111176 0.234406 -0.629303 0.114594 0.239075 -0.656525 0.118195 0.243896 -0.683502 0.121857 0.248840 -0.709961 0.125519 0.253723 -0.736206 0.129364 0.258759 -0.046051 0.063416 0.147095 -0.059082 0.065033 0.149628 -0.072510 0.066742 0.152191 -0.086761 0.068512 0.154907 -0.102203 0.070374 0.157745 -0.118805 0.072296 0.160614 -0.136658 0.074280 0.163635 -0.155548 0.076355 0.166779 -0.175323 0.078461 0.169952 -0.196045 0.080719 0.173309 -0.217560 0.083069 0.176788 -0.239594 0.085419 0.180206 -0.262390 0.087891 0.183868 -0.285553 0.090454 0.187500 -0.309235 0.093109 0.191345 -0.333344 0.095917 0.195282 -0.357635 0.098724 0.199188 -0.382141 0.101654 0.203339 -0.406769 0.104706 0.207550 -0.431274 0.107788 0.211731 -0.455841 0.111023 0.216095 -0.480652 0.114349 0.220520 -0.506134 0.117706 0.224976 -0.532349 0.121185 0.229584 -0.558929 0.124695 0.234161 -0.585999 0.128387 0.238953 -0.613281 0.132172 0.243774 -0.640472 0.135956 0.248566 -0.667664 0.139893 0.253540 -0.694550 0.143890 0.258606 -0.720917 0.147919 0.263550 -0.747009 0.152100 0.268738 -0.049622 0.077332 0.152100 -0.062836 0.079254 0.154846 -0.076538 0.081146 0.157623 -0.091217 0.083252 0.160492 -0.107178 0.085358 0.163544 -0.124237 0.087555 0.166626 -0.142578 0.089844 0.169891 -0.161926 0.092285 0.173218 -0.182129 0.094727 0.176605 -0.203247 0.097290 0.180115 -0.224945 0.099915 0.183655 -0.247498 0.102692 0.187408 -0.270599 0.105560 0.191223 -0.294037 0.108459 0.195099 -0.317993 0.111511 0.199097 -0.342346 0.114685 0.203247 -0.366791 0.117859 0.207336 -0.391510 0.121155 0.211639 -0.416199 0.124573 0.215973 -0.440765 0.128052 0.220306 -0.465424 0.131653 0.224884 -0.490692 0.135315 0.229462 -0.516510 0.139038 0.234039 -0.542999 0.142944 0.238831 -0.569855 0.146820 0.243530 -0.597107 0.150848 0.248474 -0.624512 0.154968 0.253418 -0.651733 0.159058 0.258331 -0.678864 0.163361 0.263428 -0.705688 0.167694 0.268616 -0.731934 0.172058 0.273712 -0.757904 0.176514 0.278961 -0.053436 0.092773 0.157532 -0.066864 0.094940 0.160431 -0.080902 0.097198 0.163422 -0.096039 0.099609 0.166565 -0.112518 0.102051 0.169800 -0.130096 0.104584 0.173065 -0.148865 0.107269 0.176514 -0.168671 0.110046 0.180023 -0.189270 0.112823 0.183594 -0.210785 0.115784 0.187286 -0.232880 0.118744 0.191071 -0.255768 0.121918 0.195007 -0.279144 0.125122 0.198975 -0.302887 0.128387 0.203033 -0.327087 0.131836 0.207184 -0.351624 0.135315 0.211517 -0.376251 0.138855 0.215729 -0.401062 0.142578 0.220215 -0.425842 0.146362 0.224731 -0.450531 0.150116 0.229248 -0.475403 0.154083 0.233948 -0.500854 0.158051 0.238586 -0.527161 0.162170 0.243408 -0.553986 0.166382 0.248352 -0.581055 0.170563 0.253174 -0.608429 0.174927 0.258209 -0.635895 0.179382 0.263306 -0.663147 0.183807 0.268311 -0.690186 0.188354 0.273590 -0.716949 0.193024 0.278870 -0.742981 0.197632 0.284027 -0.768768 0.202423 0.289368 -0.057465 0.109924 0.163330 -0.071167 0.112488 0.166473 -0.085571 0.115051 0.169617 -0.101257 0.117828 0.172974 -0.118195 0.120636 0.176422 -0.136292 0.123474 0.179840 -0.155579 0.126526 0.183502 -0.175720 0.129608 0.187134 -0.196838 0.132812 0.190979 -0.218689 0.136139 0.194885 -0.241180 0.139435 0.198792 -0.264343 0.142944 0.202911 -0.288025 0.146515 0.207092 -0.312012 0.150116 0.211273 -0.336456 0.153931 0.215637 -0.361145 0.157745 0.220093 -0.385925 0.161591 0.224518 -0.410889 0.165680 0.229126 -0.435760 0.169769 0.233856 -0.460419 0.173859 0.238464 -0.485687 0.178162 0.243286 -0.511597 0.182404 0.248108 -0.538147 0.186859 0.253052 -0.565155 0.191376 0.258057 -0.592407 0.195862 0.263062 -0.619934 0.200500 0.268188 -0.647400 0.205231 0.273468 -0.674622 0.209930 0.278595 -0.701599 0.214783 0.283905 -0.728180 0.219696 0.289246 -0.754120 0.224548 0.294525 -0.779633 0.229584 0.299988 -0.061768 0.128906 0.169556 -0.075775 0.131805 0.172882 -0.090637 0.134705 0.176270 -0.106842 0.137817 0.179749 -0.124329 0.140991 0.183411 -0.142944 0.144165 0.187042 -0.162659 0.147552 0.190857 -0.183197 0.150940 0.194641 -0.204712 0.154510 0.198700 -0.226959 0.158142 0.202820 -0.249756 0.161804 0.206879 -0.273254 0.165649 0.211151 -0.297180 0.169556 0.215546 -0.321442 0.173492 0.219879 -0.346130 0.177582 0.224426 -0.370972 0.181763 0.229004 -0.395844 0.185944 0.233582 -0.420868 0.190277 0.238342 -0.445679 0.194580 0.243042 -0.470642 0.199066 0.247955 -0.496277 0.203674 0.252930 -0.522491 0.208191 0.257843 -0.549347 0.212921 0.262909 -0.576569 0.217712 0.268066 -0.604004 0.222443 0.273193 -0.631531 0.227386 0.278442 -0.659088 0.232361 0.283752 -0.686188 0.237274 0.288971 -0.712982 0.242340 0.294373 -0.739319 0.247375 0.299683 -0.765167 0.252533 0.305176 -0.790466 0.257812 0.310699 -0.066315 0.149536 0.176178 -0.080688 0.152771 0.179688 -0.096039 0.156036 0.183228 -0.112793 0.159454 0.186951 -0.130737 0.162872 0.190674 -0.149933 0.166504 0.194580 -0.170044 0.170166 0.198578 -0.191010 0.173889 0.202606 -0.212952 0.177795 0.206787 -0.235596 0.181763 0.211060 -0.258698 0.185760 0.215332 -0.282471 0.189880 0.219757 -0.306671 0.194122 0.224274 -0.331116 0.198364 0.228760 -0.355988 0.202728 0.233459 -0.380859 0.207092 0.238098 -0.405945 0.211639 0.242920 -0.431030 0.216278 0.247833 -0.455902 0.220886 0.252686 -0.481110 0.225647 0.257721 -0.507172 0.230499 0.262817 -0.533661 0.235260 0.267822 -0.560791 0.240234 0.273041 -0.588196 0.245300 0.278320 -0.615692 0.250244 0.283478 -0.643341 0.255402 0.288818 -0.670776 0.260620 0.294281 -0.697723 0.265717 0.299561 -0.724457 0.270996 0.305054 -0.750549 0.276184 0.310425 -0.776184 0.281555 0.315979 -0.801300 0.286987 0.321564 -0.071136 0.171783 0.183136 -0.085907 0.175354 0.186859 -0.101807 0.178925 0.190613 -0.119141 0.182648 0.194489 -0.137573 0.186371 0.198364 -0.157227 0.190338 0.202515 -0.177887 0.194366 0.206665 -0.199249 0.198364 0.210876 -0.221527 0.202545 0.215210 -0.244476 0.206818 0.219635 -0.267914 0.211060 0.224091 -0.291962 0.215485 0.228668 -0.316406 0.220032 0.233368 -0.341095 0.224487 0.237976 -0.366089 0.229187 0.242798 -0.391083 0.233826 0.247589 -0.416260 0.238647 0.252563 -0.441345 0.243500 0.257568 -0.466309 0.248322 0.262543 -0.491943 0.253357 0.267700 -0.518250 0.258423 0.272919 -0.545074 0.263428 0.278076 -0.572357 0.268616 0.283356 -0.599945 0.273834 0.288696 -0.627502 0.278992 0.293976 -0.655121 0.284332 0.299438 -0.682343 0.289612 0.304779 -0.709320 0.294983 0.310303 -0.735870 0.300446 0.315857 -0.761719 0.305756 0.321259 -0.787170 0.311310 0.326904 -0.811920 0.316833 0.332520 -0.076233 0.195496 0.190460 -0.091522 0.199341 0.194366 -0.107971 0.203217 0.198303 -0.125854 0.207275 0.202393 -0.144806 0.211273 0.206451 -0.164917 0.215515 0.210724 -0.185974 0.219818 0.215118 -0.207794 0.224121 0.219421 -0.230469 0.228607 0.223999 -0.253723 0.233154 0.228577 -0.277405 0.237640 0.233124 -0.301758 0.242340 0.237823 -0.326447 0.247101 0.242676 -0.351257 0.251862 0.247467 -0.376373 0.256775 0.252411 -0.401489 0.261597 0.257324 -0.426727 0.266663 0.262421 -0.451843 0.271759 0.267517 -0.477020 0.276794 0.272675 -0.502991 0.282013 0.277924 -0.529633 0.287323 0.283234 -0.556641 0.292511 0.288452 -0.584198 0.297852 0.293854 -0.611877 0.303284 0.299286 -0.639435 0.308594 0.304657 -0.666962 0.314087 0.310120 -0.694061 0.319427 0.315552 -0.720856 0.324982 0.321136 -0.747223 0.330536 0.326721 -0.772858 0.335999 0.332214 -0.798004 0.341614 0.337860 -0.822510 0.347260 0.343506 -0.081665 0.220551 0.198212 -0.097382 0.224579 0.202179 -0.114532 0.228821 0.206360 -0.132904 0.233154 0.210602 -0.152374 0.237427 0.214905 -0.172974 0.241943 0.219299 -0.194458 0.246521 0.223846 -0.216614 0.251038 0.228302 -0.239594 0.255768 0.233002 -0.263214 0.260590 0.237762 -0.287201 0.265289 0.242432 -0.311737 0.270233 0.247314 -0.336487 0.275116 0.252197 -0.361603 0.280212 0.257202 -0.386871 0.285309 0.262268 -0.412048 0.290375 0.267303 -0.437317 0.295654 0.272552 -0.462402 0.300934 0.277802 -0.487885 0.306152 0.282959 -0.514282 0.311523 0.288330 -0.541168 0.316925 0.293701 -0.568420 0.322327 0.299011 -0.596069 0.327789 0.304474 -0.623657 0.333221 0.309875 -0.651306 0.338776 0.315399 -0.678802 0.344391 0.321014 -0.705719 0.349884 0.326477 -0.732361 0.355499 0.332092 -0.758484 0.361145 0.337708 -0.783844 0.366699 0.343201 -0.808777 0.372345 0.348877 -0.832886 0.378021 0.354584 -0.087402 0.246765 0.206238 -0.103668 0.251068 0.210388 -0.121399 0.255554 0.214752 -0.140350 0.260132 0.219177 -0.160309 0.264709 0.223572 -0.181335 0.269409 0.228180 -0.203186 0.274261 0.232910 -0.225769 0.278992 0.237518 -0.249084 0.283936 0.242310 -0.273010 0.288971 0.247162 -0.297211 0.293945 0.252075 -0.321991 0.299072 0.257080 -0.346924 0.304138 0.262024 -0.372162 0.309387 0.267181 -0.397522 0.314697 0.272400 -0.422729 0.319946 0.277527 -0.447968 0.325348 0.282837 -0.473267 0.330780 0.288177 -0.499115 0.336121 0.293457 -0.525787 0.341675 0.298889 -0.552948 0.347229 0.304352 -0.580292 0.352661 0.309753 -0.608063 0.358307 0.315277 -0.635651 0.363739 0.320709 -0.663330 0.369415 0.326324 -0.690613 0.375122 0.331970 -0.717346 0.380646 0.337402 -0.743805 0.386322 0.343079 -0.769684 0.392029 0.348755 -0.794800 0.397552 0.354279 -0.819366 0.403198 0.359955 -0.843140 0.408997 0.365631 -0.093506 0.274017 0.214661 -0.110382 0.278595 0.218994 -0.128632 0.283325 0.223511 -0.148102 0.288116 0.228058 -0.168549 0.292908 0.232666 -0.190002 0.297852 0.237366 -0.212311 0.302917 0.242188 -0.235229 0.307861 0.246979 -0.258820 0.312988 0.251923 -0.282898 0.318054 0.256836 -0.307465 0.323334 0.261932 -0.332428 0.328644 0.267059 -0.357544 0.333923 0.272125 -0.382843 0.339294 0.277374 -0.408264 0.344727 0.282715 -0.433472 0.350098 0.287903 -0.458710 0.355652 0.293304 -0.484283 0.361237 0.298737 -0.510468 0.366669 0.304077 -0.537415 0.372253 0.309601 -0.564667 0.377747 0.315033 -0.592285 0.383392 0.320587 -0.620117 0.389099 0.326172 -0.647705 0.394623 0.331635 -0.675232 0.400330 0.337250 -0.702332 0.406006 0.342926 -0.728943 0.411560 0.348450 -0.755066 0.417267 0.354156 -0.780701 0.422943 0.359802 -0.805542 0.428467 0.365326 -0.829773 0.434174 0.370972 -0.853058 0.439667 0.376526 -0.099915 0.302246 0.223389 -0.117401 0.307037 0.227844 -0.136261 0.311951 0.232544 -0.156219 0.316956 0.237274 -0.177094 0.321960 0.241974 -0.198975 0.327087 0.246826 -0.221649 0.332275 0.251801 -0.244904 0.337402 0.256714 -0.268799 0.342743 0.261780 -0.293091 0.347931 0.266785 -0.317902 0.353333 0.272003 -0.343079 0.358826 0.277283 -0.368225 0.364166 0.282440 -0.393677 0.369659 0.287750 -0.419067 0.375214 0.293182 -0.444336 0.380676 0.298492 -0.469635 0.386292 0.303955 -0.495575 0.391907 0.309479 -0.522064 0.397461 0.314880 -0.549225 0.403076 0.320465 -0.576569 0.408691 0.325897 -0.604401 0.414307 0.331512 -0.632172 0.420013 0.337097 -0.659729 0.425537 0.342621 -0.687073 0.431244 0.348328 -0.714050 0.436951 0.353973 -0.740387 0.442505 0.359528 -0.766296 0.448242 0.365173 -0.791626 0.454132 0.370789 -0.816132 0.459808 0.376373 -0.839966 0.465637 0.382050 -0.862854 0.471375 0.387482 -0.106781 0.331238 0.232391 -0.124817 0.336182 0.237030 -0.144165 0.341309 0.241852 -0.164642 0.346527 0.246735 -0.185944 0.351624 0.251587 -0.208221 0.356873 0.256561 -0.231171 0.362122 0.261536 -0.254791 0.367523 0.266663 -0.279022 0.372925 0.271881 -0.303528 0.378296 0.276978 -0.328552 0.383820 0.282288 -0.353851 0.389374 0.287659 -0.379089 0.394745 0.292877 -0.404572 0.400360 0.298340 -0.430023 0.405975 0.303802 -0.455200 0.411499 0.309174 -0.480743 0.417114 0.314728 -0.507050 0.422791 0.320312 -0.533813 0.428284 0.325745 -0.561157 0.434021 0.331390 -0.588684 0.439575 0.336823 -0.616455 0.445312 0.342499 -0.644257 0.451111 0.348145 -0.671631 0.456818 0.353699 -0.698853 0.462738 0.359406 -0.725555 0.468597 0.365051 -0.751709 0.474426 0.370544 -0.777344 0.480377 0.376190 -0.802216 0.486267 0.381744 -0.826477 0.492310 0.387329 -0.850037 0.498291 0.392944 -0.872498 0.504211 0.398407 -0.113953 0.360840 0.241699 -0.132538 0.365936 0.246460 -0.152466 0.371185 0.251434 -0.173370 0.376556 0.256470 -0.195099 0.381775 0.261383 -0.217773 0.387146 0.266541 -0.240967 0.392456 0.271606 -0.264954 0.397919 0.276855 -0.289429 0.403442 0.282166 -0.314148 0.408905 0.287384 -0.339294 0.414459 0.292755 -0.364716 0.420074 0.298218 -0.390045 0.425476 0.303528 -0.415527 0.431183 0.309052 -0.440979 0.436798 0.314575 -0.466156 0.442383 0.320038 -0.492065 0.448090 0.325623 -0.518494 0.453796 0.331085 -0.545624 0.459686 0.336700 -0.573151 0.465546 0.342377 -0.600769 0.471375 0.347900 -0.628601 0.477386 0.353546 -0.656281 0.483368 0.359253 -0.683533 0.489319 0.364777 -0.710510 0.495392 0.370422 -0.737000 0.501465 0.376068 -0.762817 0.507446 0.381592 -0.788208 0.513519 0.387177 -0.812775 0.519562 0.392700 -0.836700 0.525726 0.398285 -0.859741 0.531860 0.403778 -0.881836 0.537811 0.409241 -0.121490 0.390900 0.251312 -0.140656 0.396088 0.256165 -0.161011 0.401459 0.261261 -0.182373 0.406891 0.266357 -0.204529 0.412170 0.271484 -0.227570 0.417694 0.276733 -0.251099 0.423096 0.281921 -0.275299 0.428619 0.287262 -0.299988 0.434204 0.292633 -0.324890 0.439636 0.297913 -0.350220 0.445312 0.303406 -0.375702 0.451050 0.308899 -0.401093 0.456726 0.314331 -0.426575 0.462585 0.319855 -0.451965 0.468445 0.325470 -0.477325 0.474274 0.330933 -0.503540 0.480316 0.336578 -0.530243 0.486206 0.342072 -0.557587 0.492310 0.347778 -0.585175 0.498413 0.353394 -0.612854 0.504425 0.358948 -0.640656 0.510590 0.364624 -0.668152 0.516785 0.370270 -0.695251 0.522827 0.375793 -0.722076 0.529022 0.381439 -0.748291 0.535309 0.387054 -0.773834 0.541321 0.392548 -0.798889 0.547577 0.398132 -0.823059 0.553589 0.403534 -0.846588 0.559814 0.409088 -0.869263 0.565948 0.414612 -0.890900 0.571991 0.419922 -0.129333 0.421143 0.261108 -0.149017 0.426453 0.266113 -0.169891 0.431854 0.271362 -0.191711 0.437347 0.276581 -0.214203 0.442780 0.281738 -0.237549 0.448456 0.287109 -0.261383 0.453979 0.292358 -0.285858 0.459778 0.297791 -0.310699 0.465546 0.303253 -0.335815 0.471313 0.308624 -0.361237 0.477295 0.314209 -0.386719 0.483276 0.319733 -0.412140 0.489166 0.325226 -0.437592 0.495239 0.330811 -0.462952 0.501404 0.336456 -0.488647 0.507416 0.341949 -0.515167 0.513580 0.347595 -0.542053 0.519684 0.353119 -0.569580 0.525970 0.358826 -0.597260 0.532196 0.364502 -0.624878 0.538300 0.369965 -0.652618 0.544586 0.375641 -0.679993 0.550903 0.381287 -0.706879 0.557037 0.386749 -0.733398 0.563354 0.392395 -0.759399 0.569672 0.398010 -0.784637 0.575714 0.403381 -0.809326 0.581940 0.408966 -0.833130 0.588013 0.414307 -0.856323 0.594177 0.419800 -0.878510 0.600372 0.425201 -0.899689 0.606323 0.430420 -0.137512 0.451752 0.271210 -0.157715 0.457275 0.276337 -0.179016 0.463013 0.281647 -0.201111 0.468597 0.286835 -0.224121 0.474457 0.292236 -0.247711 0.480347 0.297638 -0.271820 0.486176 0.302979 -0.296509 0.492218 0.308502 -0.321594 0.498260 0.314056 -0.346771 0.504272 0.319458 -0.372284 0.510406 0.325073 -0.397858 0.516602 0.330658 -0.423248 0.522705 0.336182 -0.448639 0.528931 0.341797 -0.473969 0.535126 0.347321 -0.500061 0.541412 0.352997 -0.526886 0.547760 0.358673 -0.553955 0.553986 0.364197 -0.581543 0.560303 0.369843 -0.609314 0.566650 0.375519 -0.636902 0.572845 0.381012 -0.664429 0.579193 0.386627 -0.691620 0.585541 0.392273 -0.718292 0.591644 0.397736 -0.744537 0.597992 0.403259 -0.770142 0.604065 0.408691 -0.795166 0.610321 0.414185 -0.819550 0.616516 0.419647 -0.842987 0.622528 0.424988 -0.865723 0.628601 0.430328 -0.887482 0.634705 0.435699 -0.908142 0.640533 0.440887 -0.145996 0.483673 0.281494 -0.166687 0.489471 0.286713 -0.188416 0.495422 0.292114 -0.210876 0.501282 0.297363 -0.234192 0.507385 0.302826 -0.258118 0.513489 0.308350 -0.282471 0.519562 0.313751 -0.307312 0.525818 0.319305 -0.332550 0.532013 0.324921 -0.357819 0.538177 0.330383 -0.383392 0.544495 0.336029 -0.408905 0.550842 0.341675 -0.434296 0.557037 0.347168 -0.459686 0.563446 0.352844 -0.485199 0.569702 0.358398 -0.511658 0.576050 0.364044 -0.538635 0.582489 0.369690 -0.565887 0.588715 0.375214 -0.593597 0.595093 0.380890 -0.621277 0.601471 0.386536 -0.648773 0.607666 0.391998 -0.676147 0.614014 0.397583 -0.703156 0.620270 0.403076 -0.729523 0.626373 0.408539 -0.755554 0.632568 0.414062 -0.780792 0.638641 0.419373 -0.805542 0.644745 0.424805 -0.829498 0.650818 0.430176 -0.852539 0.656708 0.435394 -0.874817 0.662659 0.440704 -0.896149 0.668549 0.445953 -0.916290 0.674225 0.451019 -0.154633 0.516602 0.291809 -0.175873 0.522797 0.297241 -0.197998 0.528931 0.302704 -0.220856 0.535034 0.308075 -0.244446 0.541321 0.313599 -0.268646 0.547607 0.319183 -0.293152 0.553772 0.324646 -0.318237 0.560181 0.330261 -0.343567 0.566528 0.335876 -0.368896 0.572815 0.341370 -0.394470 0.579193 0.347046 -0.419891 0.585449 0.352539 -0.445343 0.591888 0.358246 -0.470764 0.598297 0.363922 -0.496613 0.604553 0.369446 -0.523285 0.610992 0.375092 -0.550446 0.617371 0.380737 -0.577789 0.623596 0.386200 -0.605499 0.629944 0.391815 -0.633148 0.636230 0.397461 -0.660522 0.642365 0.402832 -0.687744 0.648560 0.408417 -0.714478 0.654816 0.413940 -0.740601 0.660797 0.419250 -0.766296 0.666840 0.424652 -0.791199 0.672729 0.429901 -0.815582 0.678680 0.435242 -0.839142 0.684601 0.440552 -0.861786 0.690247 0.445709 -0.883636 0.696014 0.450897 -0.904449 0.701721 0.456055 -0.924194 0.707153 0.461090 -0.163605 0.550720 0.302460 -0.185333 0.556946 0.307953 -0.207855 0.563324 0.313446 -0.230988 0.569580 0.318939 -0.254883 0.575928 0.324524 -0.279327 0.582336 0.330109 -0.304016 0.588593 0.335602 -0.329224 0.595001 0.341248 -0.354675 0.601471 0.346924 -0.380066 0.607758 0.352417 -0.405640 0.614197 0.358093 -0.430969 0.620422 0.363617 -0.456329 0.626862 0.369293 -0.481903 0.633270 0.374969 -0.508087 0.639496 0.380463 -0.534912 0.645813 0.386078 -0.562256 0.652130 0.391693 -0.589630 0.658234 0.397156 -0.617310 0.664490 0.402710 -0.644928 0.670654 0.408295 -0.672119 0.676636 0.413635 -0.699036 0.682709 0.419067 -0.725403 0.688538 0.424377 -0.751434 0.694580 0.429810 -0.776825 0.700409 0.435150 -0.801392 0.706116 0.440338 -0.825348 0.711884 0.445557 -0.848541 0.717560 0.450775 -0.870728 0.723022 0.455811 -0.892151 0.728577 0.460938 -0.912476 0.734009 0.466034 -0.931671 0.739258 0.471039 -0.172882 0.585358 0.313202 -0.194977 0.591675 0.318756 -0.217834 0.598175 0.324341 -0.241302 0.604401 0.329834 -0.265442 0.610809 0.335449 -0.290100 0.617279 0.341095 -0.314972 0.623596 0.346619 -0.340271 0.630035 0.352295 -0.365601 0.636292 0.357819 -0.391174 0.642670 0.363495 -0.416718 0.649109 0.369141 -0.441956 0.655304 0.374664 -0.467255 0.661621 0.380310 -0.493195 0.667908 0.385925 -0.519562 0.674042 0.391418 -0.546631 0.680237 0.397003 -0.573975 0.686371 0.402527 -0.601440 0.692352 0.407990 -0.629028 0.698425 0.413483 -0.656494 0.704437 0.418945 -0.683533 0.710205 0.424286 -0.710236 0.716125 0.429657 -0.736298 0.721741 0.434845 -0.761993 0.727509 0.440155 -0.787018 0.733215 0.445435 -0.811249 0.738617 0.450500 -0.834808 0.744202 0.455658 -0.857635 0.749603 0.460815 -0.879395 0.754883 0.465759 -0.900299 0.760101 0.470886 -0.920135 0.765320 0.475952 -0.938812 0.770264 0.480896 -0.182343 0.620300 0.324097 -0.204773 0.626709 0.329712 -0.228027 0.633118 0.335327 -0.251709 0.639404 0.340790 -0.276123 0.645813 0.346497 -0.300903 0.652222 0.352112 -0.325928 0.658478 0.357666 -0.351318 0.664795 0.363403 -0.376678 0.670990 0.368835 -0.402252 0.677307 0.374512 -0.427673 0.683533 0.380188 -0.452881 0.689636 0.385620 -0.478363 0.695831 0.391266 -0.504486 0.701935 0.396912 -0.531097 0.707916 0.402283 -0.558258 0.713959 0.407867 -0.585663 0.719910 0.413361 -0.613129 0.725677 0.418671 -0.640656 0.731537 0.424164 -0.667786 0.737183 0.429443 -0.694733 0.742889 0.434723 -0.721130 0.748596 0.440063 -0.746918 0.753998 0.445129 -0.772278 0.759521 0.450409 -0.796936 0.764954 0.455536 -0.820831 0.770172 0.460571 -0.843994 0.775452 0.465668 -0.866364 0.780609 0.470795 -0.887634 0.785583 0.475739 -0.908081 0.790649 0.480743 -0.927399 0.795349 0.485626 -0.945618 0.800171 0.490601 -0.192017 0.655182 0.335022 -0.214813 0.661530 0.340668 -0.238312 0.667908 0.346313 -0.262268 0.674103 0.351837 -0.286865 0.680420 0.357544 -0.311646 0.686523 0.363098 -0.336914 0.692810 0.368713 -0.362366 0.699036 0.374390 -0.387695 0.705078 0.379883 -0.413239 0.711212 0.385498 -0.438629 0.717346 0.391144 -0.463684 0.723236 0.396606 -0.489471 0.729248 0.402161 -0.515778 0.735168 0.407715 -0.542542 0.740967 0.413116 -0.569794 0.746765 0.418549 -0.597290 0.752533 0.424011 -0.624664 0.758118 0.429291 -0.652008 0.763702 0.434601 -0.678925 0.769135 0.439789 -0.705597 0.774628 0.444977 -0.731750 0.779999 0.450256 -0.757233 0.785248 0.455261 -0.782257 0.790466 0.460449 -0.806580 0.795624 0.465546 -0.830078 0.800598 0.470520 -0.852844 0.805542 0.475586 -0.874756 0.810455 0.480621 -0.895660 0.815125 0.485474 -0.915558 0.819855 0.490479 -0.934357 0.824310 0.495209 -0.952026 0.828857 0.500061 -0.201843 0.689606 0.346039 -0.224915 0.695892 0.351685 -0.248749 0.702118 0.357391 -0.272888 0.708191 0.362946 -0.297638 0.714386 0.368561 -0.322571 0.720337 0.374115 -0.347900 0.726440 0.379761 -0.373383 0.732513 0.385345 -0.398682 0.738373 0.390808 -0.424164 0.744385 0.396454 -0.449432 0.750244 0.402008 -0.474579 0.755951 0.407471 -0.500580 0.761749 0.412933 -0.527130 0.767487 0.418427 -0.553986 0.773041 0.423706 -0.581299 0.778625 0.429169 -0.608582 0.783997 0.434326 -0.635956 0.789490 0.439636 -0.663208 0.794830 0.444885 -0.689850 0.799988 0.449982 -0.716248 0.805206 0.455139 -0.742126 0.810333 0.460327 -0.767303 0.815216 0.465271 -0.791962 0.820190 0.470398 -0.815887 0.825073 0.475433 -0.838989 0.829742 0.480377 -0.861359 0.834442 0.485321 -0.882690 0.838898 0.490173 -0.903198 0.843384 0.495087 -0.922668 0.847778 0.499969 -0.940948 0.851929 0.504608 -0.958130 0.856140 0.509369 -0.211823 0.723419 0.357086 -0.235229 0.729523 0.362762 -0.259064 0.735474 0.368286 -0.283569 0.741516 0.373932 -0.308441 0.747528 0.379608 -0.333466 0.753387 0.385071 -0.358826 0.759308 0.390686 -0.384308 0.765137 0.396332 -0.409607 0.770813 0.401733 -0.434937 0.776550 0.407318 -0.460083 0.782227 0.412811 -0.485504 0.787689 0.418121 -0.511688 0.793243 0.423615 -0.538208 0.798584 0.428894 -0.565308 0.804016 0.434204 -0.592621 0.809357 0.439545 -0.619873 0.814453 0.444641 -0.647095 0.819611 0.449860 -0.674133 0.824738 0.454987 -0.700531 0.829590 0.460022 -0.726654 0.834534 0.465179 -0.752197 0.839386 0.470245 -0.777069 0.843964 0.475220 -0.801331 0.848633 0.480225 -0.824890 0.853210 0.485260 -0.847534 0.857544 0.490082 -0.869507 0.861877 0.494934 -0.890442 0.866058 0.499725 -0.910431 0.870209 0.504486 -0.929443 0.874268 0.509216 -0.947174 0.878143 0.513733 -0.963806 0.882019 0.518341 -0.221893 0.756378 0.368164 -0.245544 0.762390 0.373840 -0.269592 0.768127 0.379333 -0.294250 0.773956 0.384979 -0.319244 0.779785 0.390533 -0.344360 0.785370 0.395996 -0.369720 0.791107 0.401642 -0.395142 0.796692 0.407166 -0.420380 0.802094 0.412537 -0.445587 0.807617 0.417969 -0.470795 0.813049 0.423462 -0.496368 0.818268 0.428741 -0.522736 0.823547 0.434082 -0.549408 0.828613 0.439270 -0.576508 0.833740 0.444458 -0.603760 0.838776 0.449707 -0.630951 0.843658 0.454742 -0.658020 0.848480 0.459900 -0.684723 0.853302 0.465027 -0.710907 0.857880 0.470032 -0.736694 0.862518 0.475067 -0.761963 0.867004 0.480133 -0.786438 0.871307 0.485016 -0.810333 0.875641 0.489960 -0.833405 0.879761 0.494690 -0.855804 0.883881 0.499573 -0.877319 0.887878 0.504333 -0.897736 0.891724 0.508972 -0.917297 0.895569 0.513611 -0.935791 0.899292 0.518250 -0.953064 0.902802 0.522644 -0.969177 0.906311 0.527100 -0.232025 0.788452 0.379211 -0.255920 0.794159 0.384827 -0.280151 0.799713 0.390320 -0.304962 0.805359 0.395874 -0.330048 0.810913 0.401489 -0.355194 0.816254 0.406891 -0.380493 0.821686 0.412415 -0.405853 0.827087 0.417847 -0.431030 0.832245 0.423187 -0.456116 0.837433 0.428619 -0.481262 0.842468 0.433807 -0.507233 0.847534 0.439117 -0.533722 0.852539 0.444366 -0.560455 0.857330 0.449432 -0.587555 0.862122 0.454620 -0.614746 0.866821 0.459778 -0.641785 0.871399 0.464783 -0.668640 0.875977 0.469910 -0.695129 0.880402 0.474915 -0.721008 0.884705 0.479889 -0.746460 0.888947 0.484863 -0.771362 0.893097 0.489838 -0.795471 0.897095 0.494598 -0.819031 0.901093 0.499481 -0.841736 0.904846 0.504120 -0.863647 0.908630 0.508881 -0.884735 0.912323 0.513519 -0.904724 0.915771 0.518036 -0.923798 0.919250 0.522522 -0.941772 0.922607 0.527008 -0.958557 0.925812 0.531189 -0.974182 0.928986 0.535492 -0.242249 0.819336 0.390137 -0.266327 0.824860 0.395782 -0.290710 0.830109 0.401215 -0.315613 0.835541 0.406708 -0.340759 0.840820 0.412292 -0.365845 0.845886 0.417603 -0.391235 0.851074 0.423096 -0.416504 0.856140 0.428467 -0.441498 0.861023 0.433685 -0.466522 0.865936 0.438995 -0.491852 0.870636 0.444122 -0.518005 0.875427 0.449371 -0.544556 0.880066 0.454498 -0.571350 0.884552 0.459503 -0.598419 0.889038 0.464630 -0.625488 0.893433 0.469757 -0.652374 0.897644 0.474701 -0.678955 0.901825 0.479767 -0.705170 0.905975 0.484711 -0.730713 0.909851 0.489594 -0.755890 0.913757 0.494507 -0.780334 0.917480 0.499207 -0.804199 0.921234 0.504028 -0.827362 0.924866 0.508759 -0.849640 0.928284 0.513336 -0.871155 0.931671 0.517944 -0.891754 0.934998 0.522430 -0.911316 0.938171 0.526794 -0.929932 0.941254 0.531097 -0.947449 0.944275 0.535370 -0.963715 0.947083 0.539429 -0.978790 0.949890 0.543518 -0.252502 0.849030 0.401062 -0.276733 0.854248 0.406586 -0.301239 0.859253 0.411987 -0.326202 0.864319 0.417450 -0.351410 0.869293 0.422943 -0.376526 0.874115 0.428192 -0.401733 0.878967 0.433533 -0.426788 0.883606 0.438751 -0.451752 0.888275 0.443970 -0.476868 0.892883 0.449219 -0.502380 0.897247 0.454224 -0.528625 0.901703 0.459412 -0.555298 0.906006 0.464508 -0.582031 0.910126 0.469543 -0.609070 0.914307 0.474579 -0.635956 0.918304 0.479614 -0.662567 0.922180 0.484467 -0.688965 0.925995 0.489502 -0.714844 0.929749 0.494385 -0.740112 0.933319 0.499084 -0.764923 0.936859 0.503906 -0.789032 0.940216 0.508514 -0.812531 0.943634 0.513214 -0.835266 0.946838 0.517792 -0.857147 0.949921 0.522186 -0.878265 0.952972 0.526672 -0.898376 0.955902 0.531006 -0.917480 0.958679 0.535156 -0.935638 0.961426 0.539337 -0.952667 0.964081 0.543427 -0.968475 0.966553 0.547302 -0.983124 0.968933 0.551208 -0.262756 0.877289 0.411835 -0.287140 0.882202 0.417297 -0.311737 0.886902 0.422638 -0.336731 0.891663 0.428070 -0.361877 0.896332 0.433411 -0.386963 0.900787 0.438599 -0.412109 0.905304 0.443848 -0.436981 0.909607 0.448914 -0.461853 0.913940 0.454102 -0.487122 0.918182 0.459290 -0.512787 0.922241 0.464264 -0.539124 0.926270 0.469391 -0.565796 0.930237 0.474457 -0.592499 0.934021 0.479340 -0.619415 0.937744 0.484375 -0.646179 0.941437 0.489349 -0.672516 0.944885 0.494110 -0.698608 0.948395 0.498993 -0.724091 0.951691 0.503693 -0.749115 0.954987 0.508362 -0.773590 0.958099 0.513092 -0.797333 0.961060 0.517578 -0.820465 0.964111 0.522064 -0.842804 0.966949 0.526550 -0.864258 0.969666 0.530792 -0.884918 0.972321 0.535065 -0.904663 0.974915 0.539215 -0.923279 0.977295 0.543243 -0.941010 0.979706 0.547211 -0.957489 0.981934 0.551025 -0.972839 0.984131 0.554779 -0.987000 0.986206 0.558441 -0.040161 0.038971 0.154724 -0.052979 0.040222 0.156891 -0.065979 0.041595 0.159180 -0.079590 0.042999 0.161682 -0.094116 0.044434 0.164154 -0.109955 0.045990 0.166809 -0.126953 0.047577 0.169586 -0.144989 0.049225 0.172424 -0.164062 0.050964 0.175354 -0.184052 0.052765 0.178467 -0.204742 0.054535 0.181580 -0.226288 0.056488 0.184875 -0.248383 0.058411 0.188202 -0.271118 0.060455 0.191742 -0.294281 0.062592 0.195312 -0.317810 0.064697 0.198914 -0.341797 0.066956 0.202728 -0.365967 0.069275 0.206635 -0.390228 0.071594 0.210480 -0.414612 0.074036 0.214600 -0.439056 0.076599 0.218719 -0.463287 0.079132 0.222900 -0.488159 0.081818 0.227203 -0.513672 0.084534 0.231567 -0.539856 0.087372 0.236084 -0.566528 0.090332 0.240692 -0.593353 0.093292 0.245239 -0.620514 0.096405 0.250000 -0.647675 0.099640 0.254822 -0.674500 0.102844 0.259583 -0.701172 0.106262 0.264526 -0.727478 0.109772 0.269531 -0.043335 0.051086 0.159149 -0.056213 0.052490 0.161560 -0.069458 0.054047 0.164093 -0.083435 0.055634 0.166779 -0.098419 0.057251 0.169434 -0.114716 0.058990 0.172333 -0.132141 0.060791 0.175293 -0.150665 0.062622 0.178345 -0.170166 0.064545 0.181519 -0.190460 0.066528 0.184753 -0.211609 0.068604 0.188110 -0.233521 0.070740 0.191650 -0.255920 0.072876 0.195160 -0.278961 0.075195 0.198822 -0.302429 0.077576 0.202637 -0.326202 0.079956 0.206421 -0.350433 0.082489 0.210388 -0.374786 0.085083 0.214478 -0.399200 0.087738 0.218506 -0.423706 0.090546 0.222809 -0.448151 0.093384 0.227020 -0.472687 0.096313 0.231445 -0.497955 0.099396 0.235931 -0.523804 0.102478 0.240448 -0.550262 0.105713 0.245117 -0.577148 0.109070 0.249878 -0.604218 0.112427 0.254547 -0.631409 0.115936 0.259460 -0.658630 0.119537 0.264404 -0.685455 0.123138 0.269287 -0.712067 0.126953 0.274384 -0.738098 0.130707 0.279449 -0.046722 0.063995 0.164001 -0.059723 0.065643 0.166626 -0.073242 0.067383 0.169373 -0.087585 0.069214 0.172241 -0.103058 0.071045 0.175171 -0.119843 0.072998 0.178284 -0.137756 0.075073 0.181427 -0.156647 0.077118 0.184662 -0.176605 0.079315 0.188019 -0.197296 0.081543 0.191437 -0.218872 0.083893 0.195068 -0.241089 0.086365 0.198730 -0.263824 0.088837 0.202454 -0.287170 0.091461 0.206268 -0.310913 0.094147 0.210297 -0.334930 0.096893 0.214264 -0.359375 0.099792 0.218445 -0.383911 0.102814 0.222717 -0.408478 0.105774 0.226929 -0.433075 0.109009 0.231323 -0.457520 0.112152 0.235748 -0.482422 0.115509 0.240326 -0.508087 0.118988 0.244965 -0.534241 0.122467 0.249603 -0.561005 0.126099 0.254456 -0.588104 0.129822 0.259308 -0.615265 0.133545 0.264160 -0.642609 0.137451 0.269196 -0.669800 0.141418 0.274261 -0.696503 0.145355 0.279327 -0.723022 0.149506 0.284515 -0.748993 0.153595 0.289612 -0.050354 0.078064 0.169312 -0.063538 0.079956 0.172089 -0.077332 0.081940 0.175079 -0.092163 0.084045 0.178192 -0.108093 0.086151 0.181274 -0.125366 0.088409 0.184570 -0.143677 0.090698 0.187866 -0.163116 0.093109 0.191345 -0.183502 0.095673 0.194977 -0.204559 0.098236 0.198578 -0.226501 0.100952 0.202393 -0.249054 0.103760 0.206207 -0.272125 0.106598 0.210114 -0.295715 0.109619 0.214172 -0.319763 0.112701 0.218323 -0.343964 0.115784 0.222504 -0.368561 0.119080 0.226837 -0.393250 0.122467 0.231201 -0.417908 0.125854 0.235657 -0.442627 0.129395 0.240204 -0.467163 0.132965 0.244751 -0.492554 0.136688 0.249512 -0.518494 0.140503 0.254333 -0.544952 0.144287 0.259064 -0.571991 0.148285 0.264038 -0.599274 0.152374 0.269073 -0.626556 0.156433 0.274048 -0.653900 0.160645 0.279175 -0.681030 0.164978 0.284393 -0.707703 0.169250 0.289490 -0.734070 0.173706 0.294800 -0.759827 0.178131 0.300018 -0.054169 0.093536 0.175049 -0.067627 0.095734 0.178009 -0.081787 0.098083 0.181152 -0.097046 0.100494 0.184479 -0.113495 0.102997 0.187775 -0.131256 0.105560 0.191254 -0.150055 0.108215 0.194763 -0.169952 0.111023 0.198486 -0.190704 0.113953 0.202240 -0.212189 0.116852 0.206024 -0.234467 0.119965 0.209991 -0.257385 0.123108 0.214050 -0.280701 0.126312 0.218109 -0.304565 0.129700 0.222351 -0.328857 0.133148 0.226685 -0.353302 0.136597 0.230988 -0.378082 0.140228 0.235535 -0.402771 0.143860 0.239990 -0.427612 0.147675 0.244659 -0.452393 0.151581 0.249390 -0.477264 0.155487 0.254059 -0.502930 0.159576 0.258942 -0.529266 0.163727 0.263916 -0.555969 0.167847 0.268799 -0.583191 0.172180 0.273895 -0.610657 0.176575 0.279022 -0.638000 0.180939 0.284088 -0.665344 0.185486 0.289337 -0.692230 0.189972 0.294525 -0.718903 0.194672 0.299896 -0.745148 0.199371 0.305298 -0.770752 0.204102 0.310608 -0.058258 0.110870 0.181091 -0.071930 0.113373 0.184296 -0.086517 0.116089 0.187714 -0.102234 0.118774 0.191101 -0.119324 0.121643 0.194641 -0.137543 0.124603 0.198364 -0.156799 0.127625 0.202057 -0.177124 0.130768 0.205933 -0.198303 0.134003 0.209869 -0.220184 0.137268 0.213867 -0.242798 0.140717 0.217987 -0.265991 0.144257 0.222229 -0.289642 0.147827 0.226440 -0.313782 0.151520 0.230865 -0.338165 0.155243 0.235291 -0.362915 0.159149 0.239868 -0.387787 0.163116 0.244507 -0.412659 0.167114 0.249146 -0.437531 0.171204 0.253937 -0.462372 0.175476 0.258850 -0.487610 0.179688 0.263672 -0.513641 0.184052 0.268677 -0.540283 0.188538 0.273773 -0.567230 0.192963 0.278809 -0.594574 0.197571 0.283966 -0.622223 0.202271 0.289215 -0.649506 0.206909 0.294403 -0.676819 0.211731 0.299774 -0.703674 0.216461 0.305023 -0.730194 0.221405 0.310455 -0.756256 0.226410 0.315979 -0.781647 0.231354 0.321320 -0.062592 0.130005 0.187622 -0.076630 0.132843 0.191010 -0.091644 0.135864 0.194580 -0.107880 0.138885 0.198181 -0.125488 0.142090 0.201965 -0.144226 0.145447 0.205811 -0.163910 0.148712 0.209686 -0.184692 0.152283 0.213776 -0.206238 0.155853 0.217896 -0.228485 0.159454 0.222046 -0.251495 0.163208 0.226349 -0.274994 0.167145 0.230774 -0.298859 0.170990 0.235199 -0.323303 0.175018 0.239746 -0.347870 0.179016 0.244263 -0.372772 0.183258 0.249023 -0.397797 0.187531 0.253815 -0.422699 0.191803 0.258575 -0.447662 0.196289 0.263519 -0.472656 0.200806 0.268555 -0.498230 0.205292 0.273529 -0.524567 0.209991 0.278656 -0.551483 0.214722 0.283844 -0.578644 0.219421 0.288971 -0.606201 0.224304 0.294281 -0.633667 0.229126 0.299469 -0.661163 0.234100 0.304901 -0.688324 0.239197 0.310333 -0.715057 0.244202 0.315674 -0.741425 0.249329 0.321198 -0.767303 0.254547 0.326752 -0.792419 0.259674 0.332184 -0.067169 0.150696 0.194397 -0.081573 0.153961 0.198090 -0.097137 0.157288 0.201843 -0.113953 0.160675 0.205627 -0.132050 0.164246 0.209564 -0.151276 0.167847 0.213684 -0.171387 0.171509 0.217712 -0.192627 0.175354 0.221954 -0.214569 0.179291 0.226257 -0.237122 0.183197 0.230530 -0.260406 0.187256 0.235077 -0.284149 0.191345 0.239532 -0.308441 0.195618 0.244171 -0.333008 0.199951 0.248901 -0.357788 0.204315 0.253571 -0.382812 0.208771 0.258453 -0.407990 0.213409 0.263397 -0.432892 0.217896 0.268250 -0.457886 0.222656 0.273407 -0.483215 0.227448 0.278503 -0.509155 0.232208 0.283569 -0.535797 0.237152 0.288818 -0.562988 0.242126 0.294159 -0.590302 0.247040 0.299316 -0.618011 0.252197 0.304749 -0.645416 0.257202 0.310059 -0.672852 0.262421 0.315552 -0.699951 0.267670 0.321075 -0.726501 0.272858 0.326477 -0.752686 0.278198 0.332062 -0.778290 0.283600 0.337677 -0.803162 0.288849 0.343140 -0.072021 0.173004 0.201660 -0.086884 0.176605 0.205536 -0.102966 0.180328 0.209473 -0.120331 0.184021 0.213470 -0.138947 0.187866 0.217560 -0.158691 0.191803 0.221832 -0.179291 0.195801 0.226074 -0.200836 0.199860 0.230438 -0.223236 0.204132 0.234955 -0.246124 0.208313 0.239410 -0.269745 0.212708 0.244080 -0.293732 0.217133 0.248688 -0.318207 0.221588 0.253448 -0.343048 0.226227 0.258362 -0.367950 0.230804 0.263184 -0.393097 0.235626 0.268158 -0.418274 0.240448 0.273285 -0.443237 0.245239 0.278259 -0.468353 0.250244 0.283447 -0.494049 0.255219 0.288666 -0.520294 0.260223 0.293854 -0.547272 0.265350 0.299194 -0.574493 0.270447 0.304474 -0.602112 0.275665 0.309906 -0.629822 0.280975 0.315369 -0.657257 0.286224 0.320770 -0.684570 0.291595 0.326355 -0.711517 0.297058 0.331940 -0.737915 0.302338 0.337341 -0.763885 0.307861 0.343018 -0.789246 0.313354 0.348663 -0.813843 0.318787 0.354187 -0.077209 0.196838 0.209259 -0.092560 0.200714 0.213348 -0.109192 0.204742 0.217499 -0.127106 0.208679 0.221619 -0.146240 0.212860 0.225922 -0.166443 0.217133 0.230347 -0.187500 0.221344 0.234772 -0.209473 0.225769 0.239288 -0.232025 0.230133 0.243805 -0.255402 0.234741 0.248566 -0.279297 0.239380 0.253357 -0.303467 0.243988 0.258057 -0.328247 0.248810 0.263031 -0.353241 0.253693 0.268036 -0.378296 0.258514 0.273010 -0.403534 0.263489 0.278137 -0.428772 0.268585 0.283325 -0.453735 0.273560 0.288422 -0.479065 0.278748 0.293732 -0.505157 0.283997 0.299072 -0.531708 0.289124 0.304321 -0.558868 0.294495 0.309784 -0.586273 0.299744 0.315125 -0.614014 0.305176 0.320648 -0.641724 0.310638 0.326202 -0.669098 0.315948 0.331604 -0.696259 0.321533 0.337219 -0.723083 0.327087 0.342865 -0.749207 0.332550 0.348389 -0.774963 0.338135 0.354065 -0.800110 0.343750 0.359711 -0.824371 0.349243 0.365265 -0.082642 0.221985 0.217285 -0.098572 0.226196 0.221527 -0.115814 0.230438 0.225800 -0.134216 0.234680 0.230103 -0.153870 0.239136 0.234650 -0.174530 0.243652 0.239166 -0.196014 0.248108 0.243713 -0.218353 0.252808 0.248444 -0.241302 0.257446 0.253113 -0.264923 0.262207 0.257965 -0.289124 0.267181 0.262909 -0.313568 0.272003 0.267761 -0.338470 0.277008 0.272888 -0.363647 0.282104 0.278015 -0.388794 0.287170 0.283081 -0.414062 0.292358 0.288300 -0.439331 0.297607 0.293610 -0.464355 0.302795 0.298828 -0.490051 0.308136 0.304199 -0.516327 0.313416 0.309540 -0.543274 0.318909 0.315002 -0.570709 0.324371 0.320526 -0.598206 0.329742 0.325928 -0.625946 0.335297 0.331482 -0.653656 0.340820 0.337036 -0.680939 0.346344 0.342560 -0.707977 0.351990 0.348236 -0.734589 0.357635 0.353882 -0.760498 0.363159 0.359467 -0.785980 0.368805 0.365112 -0.810669 0.374359 0.370605 -0.834747 0.380035 0.376343 -0.088470 0.248291 0.225616 -0.104919 0.252747 0.230011 -0.122772 0.257294 0.234497 -0.141724 0.261780 0.238953 -0.161835 0.266479 0.243591 -0.182831 0.271118 0.248169 -0.204803 0.275909 0.253021 -0.227539 0.280853 0.257874 -0.250824 0.285706 0.262665 -0.274780 0.290741 0.267670 -0.299164 0.295868 0.272736 -0.323853 0.300903 0.277740 -0.348907 0.306091 0.282928 -0.374176 0.311371 0.288177 -0.399414 0.316589 0.293335 -0.424774 0.321960 0.298676 -0.450043 0.327393 0.304077 -0.475220 0.332733 0.309357 -0.501282 0.338226 0.314880 -0.527863 0.343628 0.320221 -0.555084 0.349182 0.325806 -0.582642 0.354767 0.331360 -0.610199 0.360260 0.336792 -0.638000 0.365906 0.342438 -0.665588 0.371552 0.348083 -0.692719 0.377075 0.353607 -0.719604 0.382751 0.359283 -0.745941 0.388458 0.364990 -0.771667 0.393982 0.370514 -0.796844 0.399719 0.376190 -0.821228 0.405243 0.381775 -0.844940 0.410919 0.387421 -0.094635 0.275665 0.234253 -0.111725 0.280365 0.238831 -0.130066 0.285126 0.243469 -0.149536 0.289856 0.248077 -0.170166 0.294739 0.252869 -0.191650 0.299622 0.257599 -0.213959 0.304657 0.262543 -0.237030 0.309784 0.267517 -0.260620 0.314819 0.272522 -0.284821 0.320038 0.277618 -0.309448 0.325348 0.282806 -0.334320 0.330505 0.287903 -0.359558 0.335907 0.293213 -0.384918 0.341309 0.298553 -0.410187 0.346680 0.303802 -0.435577 0.352203 0.309235 -0.460663 0.357574 0.314575 -0.486328 0.363159 0.320099 -0.512726 0.368774 0.325653 -0.539520 0.374207 0.331055 -0.566956 0.379883 0.336700 -0.594604 0.385559 0.342316 -0.622314 0.391083 0.347809 -0.649994 0.396759 0.353455 -0.677490 0.402405 0.359161 -0.704468 0.407990 0.364685 -0.731140 0.413696 0.370392 -0.757111 0.419220 0.375916 -0.782684 0.424896 0.381592 -0.807587 0.430603 0.387238 -0.831635 0.436127 0.392822 -0.854980 0.441803 0.398468 -0.101135 0.303955 0.243225 -0.118805 0.308868 0.247955 -0.137756 0.313812 0.252747 -0.157745 0.318756 0.257477 -0.178802 0.323853 0.262421 -0.200592 0.328918 0.267303 -0.223358 0.334167 0.272339 -0.246765 0.339386 0.277496 -0.270630 0.344574 0.282532 -0.295074 0.349976 0.287781 -0.319946 0.355377 0.293060 -0.344971 0.360718 0.298279 -0.370331 0.366211 0.303650 -0.395630 0.371613 0.308960 -0.421051 0.377167 0.314453 -0.446381 0.382782 0.319977 -0.471649 0.388245 0.325378 -0.497620 0.393890 0.330933 -0.524292 0.399567 0.336548 -0.551361 0.405090 0.342010 -0.578918 0.410767 0.347656 -0.606689 0.416443 0.353302 -0.634369 0.422028 0.358856 -0.661987 0.427673 0.364563 -0.689362 0.433380 0.370239 -0.716125 0.438965 0.375793 -0.742584 0.444672 0.381470 -0.768311 0.450317 0.386993 -0.793549 0.456146 0.392670 -0.818146 0.461975 0.398346 -0.841827 0.467682 0.403778 -0.864746 0.473602 0.409454 -0.108032 0.333038 0.252502 -0.126312 0.338104 0.257355 -0.145691 0.343140 0.262146 -0.166199 0.348328 0.267181 -0.187714 0.353577 0.272217 -0.209930 0.358765 0.277222 -0.233002 0.364105 0.282410 -0.256775 0.369537 0.287659 -0.280853 0.374847 0.292786 -0.305542 0.380341 0.298157 -0.330597 0.385864 0.303528 -0.355774 0.391266 0.308807 -0.381195 0.396881 0.314331 -0.406525 0.402313 0.319672 -0.432007 0.407959 0.325256 -0.457275 0.413574 0.330811 -0.482788 0.419067 0.336273 -0.509155 0.424774 0.341888 -0.536041 0.430450 0.347534 -0.563324 0.435974 0.353058 -0.590973 0.441711 0.358704 -0.618805 0.447479 0.364441 -0.646423 0.453156 0.369934 -0.673950 0.459045 0.375610 -0.700928 0.464752 0.381165 -0.727692 0.470703 0.386841 -0.753815 0.476654 0.392548 -0.779297 0.482513 0.398041 -0.804291 0.488525 0.403656 -0.828491 0.494537 0.409302 -0.851746 0.500427 0.414795 -0.874268 0.506470 0.420349 -0.115265 0.362640 0.262024 -0.134094 0.367920 0.267059 -0.153961 0.373077 0.271973 -0.174988 0.378418 0.277130 -0.196930 0.383759 0.282288 -0.219513 0.389099 0.287384 -0.242950 0.394531 0.292664 -0.266968 0.400055 0.298004 -0.291290 0.405396 0.303253 -0.316162 0.410980 0.308685 -0.341400 0.416565 0.314178 -0.366669 0.422028 0.319519 -0.392181 0.427643 0.325104 -0.417542 0.433136 0.330505 -0.442932 0.438812 0.336090 -0.468292 0.444550 0.341736 -0.494110 0.450165 0.347229 -0.520813 0.456024 0.352905 -0.547943 0.461853 0.358582 -0.575348 0.467651 0.364105 -0.603119 0.473633 0.369812 -0.630859 0.479614 0.375488 -0.658386 0.485504 0.381042 -0.685760 0.491577 0.386688 -0.712585 0.497559 0.392242 -0.739075 0.503632 0.397919 -0.764954 0.509766 0.403534 -0.790131 0.515717 0.409058 -0.814789 0.521851 0.414642 -0.838593 0.527985 0.420166 -0.861481 0.533997 0.425629 -0.883606 0.540100 0.431061 -0.122864 0.392731 0.271851 -0.142212 0.398071 0.276947 -0.162567 0.403320 0.282043 -0.184052 0.408813 0.287262 -0.206421 0.414276 0.292542 -0.229370 0.419617 0.297729 -0.253052 0.425110 0.303131 -0.277313 0.430664 0.308563 -0.301910 0.436127 0.313873 -0.326996 0.441772 0.319397 -0.352325 0.447449 0.324951 -0.377686 0.453094 0.330383 -0.403198 0.458893 0.335968 -0.428558 0.464630 0.341461 -0.453949 0.470551 0.347107 -0.479492 0.476532 0.352753 -0.505646 0.482422 0.358307 -0.532532 0.488525 0.363983 -0.559845 0.494598 0.369629 -0.587372 0.500580 0.375214 -0.615173 0.506744 0.380920 -0.642914 0.512878 0.386597 -0.670288 0.518921 0.392090 -0.697510 0.525146 0.397766 -0.724060 0.531219 0.403229 -0.750336 0.537415 0.408875 -0.775970 0.543671 0.414490 -0.800751 0.549744 0.419922 -0.825043 0.555969 0.425446 -0.848511 0.562134 0.430969 -0.870941 0.568176 0.436310 -0.892609 0.574310 0.441772 -0.130798 0.423065 0.281921 -0.150665 0.428467 0.287109 -0.171509 0.433807 0.292297 -0.193390 0.439301 0.297607 -0.216095 0.444885 0.302979 -0.239349 0.450409 0.308258 -0.263336 0.456116 0.313751 -0.287872 0.461884 0.319244 -0.312622 0.467621 0.324677 -0.337860 0.473541 0.330231 -0.363220 0.479370 0.335724 -0.388763 0.485352 0.341309 -0.414276 0.491455 0.346985 -0.439606 0.497406 0.352448 -0.464905 0.503571 0.358154 -0.490814 0.509735 0.363800 -0.517303 0.515778 0.369385 -0.544342 0.522003 0.375061 -0.571838 0.528259 0.380737 -0.599426 0.534363 0.386292 -0.627197 0.540710 0.391968 -0.654846 0.546936 0.397614 -0.682098 0.553131 0.403076 -0.709045 0.559387 0.408752 -0.735413 0.565582 0.414215 -0.761353 0.571838 0.419800 -0.786682 0.578033 0.425323 -0.811188 0.584137 0.430664 -0.835083 0.590332 0.436157 -0.858093 0.596527 0.441620 -0.880157 0.602509 0.446869 -0.901337 0.608582 0.452209 -0.139008 0.453735 0.292145 -0.159393 0.459442 0.297485 -0.180695 0.464996 0.302704 -0.202972 0.470825 0.308167 -0.226044 0.476685 0.313629 -0.249603 0.482452 0.319000 -0.273865 0.488464 0.324524 -0.298584 0.494507 0.330078 -0.323547 0.500427 0.335541 -0.348877 0.506561 0.341187 -0.374237 0.512573 0.346680 -0.399811 0.518799 0.352325 -0.425354 0.525085 0.358032 -0.450592 0.531189 0.363556 -0.476135 0.537445 0.369202 -0.502289 0.543793 0.374939 -0.528992 0.549988 0.380463 -0.556244 0.556335 0.386139 -0.583832 0.562653 0.391785 -0.611481 0.568878 0.397339 -0.639191 0.575226 0.402985 -0.666565 0.581421 0.408478 -0.693726 0.587738 0.414062 -0.720459 0.593994 0.419617 -0.746582 0.600128 0.425049 -0.772186 0.606415 0.430542 -0.797211 0.612640 0.436005 -0.821350 0.618652 0.441345 -0.844818 0.624786 0.446747 -0.867493 0.630859 0.452087 -0.889099 0.636780 0.457275 -0.909760 0.642761 0.462616 -0.147552 0.485779 0.302582 -0.168396 0.491699 0.308014 -0.190125 0.497559 0.313324 -0.212799 0.503601 0.318878 -0.236145 0.509705 0.324371 -0.260010 0.515686 0.329834 -0.284515 0.521851 0.335419 -0.309235 0.527985 0.340881 -0.334503 0.534241 0.346558 -0.359955 0.540558 0.352203 -0.385376 0.546722 0.357727 -0.410950 0.553101 0.363434 -0.436401 0.559448 0.369080 -0.461609 0.565674 0.374634 -0.487427 0.572083 0.380341 -0.513855 0.578491 0.385986 -0.540741 0.584717 0.391510 -0.568176 0.591125 0.397217 -0.595825 0.597443 0.402802 -0.623413 0.603668 0.408295 -0.651031 0.610016 0.413940 -0.678284 0.616180 0.419373 -0.705261 0.622467 0.424896 -0.731659 0.628723 0.430420 -0.757477 0.634766 0.435760 -0.782806 0.640930 0.441254 -0.807495 0.647064 0.446594 -0.831268 0.652954 0.451843 -0.854309 0.658966 0.457153 -0.876495 0.664886 0.462524 -0.897675 0.670563 0.467682 -0.917877 0.676392 0.473022 -0.156311 0.518921 0.313202 -0.177673 0.525116 0.318726 -0.199768 0.531158 0.324127 -0.222778 0.537384 0.329712 -0.246490 0.543671 0.335297 -0.270569 0.549805 0.340729 -0.295288 0.556183 0.346405 -0.320190 0.562347 0.351868 -0.345612 0.568787 0.357605 -0.371063 0.575165 0.363281 -0.396484 0.581421 0.368774 -0.422028 0.587891 0.374481 -0.447479 0.594330 0.380188 -0.472748 0.600555 0.385712 -0.498810 0.606995 0.391357 -0.525513 0.613403 0.397034 -0.552551 0.619629 0.402527 -0.580078 0.625946 0.408203 -0.607574 0.632172 0.413666 -0.635254 0.638458 0.419220 -0.662750 0.644684 0.424774 -0.689758 0.650757 0.430115 -0.716492 0.656952 0.435638 -0.742737 0.663025 0.441071 -0.768188 0.668976 0.446320 -0.793182 0.674988 0.451691 -0.817474 0.680878 0.457001 -0.840881 0.686646 0.462250 -0.863556 0.692444 0.467529 -0.885162 0.698029 0.472748 -0.905914 0.703674 0.477997 -0.925629 0.709290 0.483276 -0.165375 0.553070 0.323944 -0.187134 0.559326 0.329529 -0.209656 0.565521 0.334991 -0.232941 0.571930 0.340607 -0.256927 0.578278 0.346252 -0.281250 0.584534 0.351746 -0.306122 0.590973 0.357422 -0.331177 0.597290 0.363007 -0.356628 0.603699 0.368622 -0.382202 0.610168 0.374390 -0.407654 0.616455 0.379913 -0.433105 0.622864 0.385559 -0.458435 0.629272 0.391266 -0.483948 0.635468 0.396790 -0.510254 0.641876 0.402374 -0.537170 0.648193 0.408051 -0.564331 0.654358 0.413483 -0.591949 0.660583 0.419067 -0.619446 0.666656 0.424500 -0.647003 0.672791 0.429993 -0.674347 0.678925 0.435486 -0.701111 0.684845 0.440796 -0.727539 0.690857 0.446198 -0.753479 0.696747 0.451569 -0.778656 0.702515 0.456757 -0.803284 0.708282 0.462097 -0.827179 0.714050 0.467407 -0.850189 0.719574 0.472595 -0.872437 0.725098 0.477875 -0.893585 0.730469 0.483032 -0.913879 0.735870 0.488251 -0.933075 0.741241 0.493439 -0.174683 0.587738 0.334869 -0.196838 0.594116 0.340485 -0.219635 0.600433 0.345947 -0.243317 0.606842 0.351624 -0.267334 0.613129 0.357147 -0.292023 0.619568 0.362854 -0.317078 0.625977 0.368500 -0.342255 0.632263 0.374084 -0.367737 0.638672 0.379761 -0.393280 0.645111 0.385437 -0.418671 0.651306 0.390961 -0.444092 0.657654 0.396637 -0.469421 0.664032 0.402283 -0.495209 0.670135 0.407776 -0.521729 0.676331 0.413361 -0.548706 0.682434 0.418762 -0.576080 0.688507 0.424377 -0.603668 0.694641 0.429840 -0.631134 0.700531 0.435211 -0.658569 0.706512 0.440674 -0.685699 0.712433 0.446075 -0.712219 0.718109 0.451324 -0.738342 0.723938 0.456604 -0.764008 0.729645 0.461975 -0.788818 0.735138 0.467133 -0.813080 0.740723 0.472473 -0.836517 0.746094 0.477600 -0.859192 0.751495 0.482880 -0.881012 0.756836 0.488098 -0.901703 0.761932 0.493225 -0.921509 0.767090 0.498352 -0.940186 0.772186 0.503448 -0.184204 0.622681 0.345825 -0.206696 0.629120 0.351501 -0.229858 0.635376 0.356995 -0.253754 0.641815 0.362701 -0.278015 0.648041 0.368225 -0.302887 0.654449 0.373932 -0.328064 0.660828 0.379608 -0.353302 0.667023 0.385162 -0.378815 0.673340 0.390808 -0.404327 0.679626 0.396484 -0.429657 0.685760 0.401978 -0.454987 0.691956 0.407623 -0.480469 0.698090 0.413239 -0.506531 0.704102 0.418640 -0.533295 0.710144 0.424225 -0.560303 0.716034 0.429626 -0.587769 0.722015 0.435089 -0.615326 0.727844 0.440521 -0.642670 0.733582 0.445770 -0.669922 0.739380 0.451172 -0.696777 0.745056 0.456451 -0.723083 0.750549 0.461731 -0.748932 0.756073 0.467010 -0.774231 0.761566 0.472321 -0.798737 0.766846 0.477478 -0.822632 0.772186 0.482788 -0.845642 0.777252 0.487854 -0.867828 0.782410 0.493073 -0.889221 0.787476 0.498230 -0.909454 0.792328 0.503204 -0.928772 0.797180 0.508270 -0.946899 0.801971 0.513336 -0.193878 0.657532 0.356842 -0.216614 0.663818 0.362427 -0.240173 0.670135 0.368103 -0.264313 0.676453 0.373749 -0.288757 0.682617 0.379333 -0.313751 0.688934 0.385010 -0.338989 0.695160 0.390656 -0.364349 0.701202 0.396210 -0.389893 0.707397 0.401886 -0.415375 0.713501 0.407501 -0.440613 0.719452 0.412964 -0.465790 0.725464 0.418518 -0.491455 0.731323 0.423950 -0.517883 0.737244 0.429474 -0.544739 0.743103 0.434937 -0.571869 0.748810 0.440277 -0.599335 0.754547 0.445679 -0.626801 0.760193 0.451019 -0.654053 0.765686 0.456207 -0.681061 0.771210 0.461578 -0.707672 0.776642 0.466858 -0.733643 0.781891 0.472046 -0.759247 0.787201 0.477356 -0.784027 0.792297 0.482483 -0.808289 0.797424 0.487701 -0.831818 0.802490 0.492920 -0.854401 0.807281 0.497955 -0.876251 0.812195 0.503082 -0.897095 0.816925 0.508209 -0.916870 0.821442 0.513092 -0.935638 0.825989 0.518036 -0.953247 0.830505 0.522919 -0.203766 0.691956 0.367981 -0.226776 0.698059 0.373505 -0.250610 0.704376 0.379211 -0.274933 0.710510 0.384888 -0.299591 0.716522 0.390381 -0.324677 0.722656 0.396057 -0.350006 0.728790 0.401703 -0.375305 0.734680 0.407196 -0.400818 0.740662 0.412811 -0.426239 0.746582 0.418365 -0.451385 0.752319 0.423798 -0.476715 0.758179 0.429352 -0.502563 0.763763 0.434631 -0.529144 0.769501 0.440094 -0.556152 0.775116 0.445526 -0.583344 0.780548 0.450745 -0.610748 0.786041 0.456085 -0.638123 0.791473 0.461395 -0.665161 0.796692 0.466583 -0.691956 0.801971 0.471924 -0.718292 0.807098 0.477234 -0.743988 0.812103 0.482361 -0.769165 0.817139 0.487549 -0.793640 0.821930 0.492676 -0.817566 0.826782 0.497803 -0.840698 0.831543 0.502930 -0.862823 0.836029 0.507904 -0.884186 0.840576 0.512939 -0.904633 0.845032 0.517883 -0.923920 0.849304 0.522675 -0.942200 0.853516 0.527527 -0.959259 0.857697 0.532288 -0.213745 0.725708 0.379059 -0.237030 0.731659 0.384613 -0.261047 0.737793 0.390228 -0.285583 0.743774 0.395905 -0.310364 0.749634 0.401459 -0.335541 0.755554 0.407074 -0.360962 0.761475 0.412659 -0.386292 0.767181 0.418091 -0.411652 0.772949 0.423645 -0.436890 0.778503 0.429077 -0.462036 0.784180 0.434540 -0.487610 0.789825 0.439972 -0.513672 0.795197 0.445221 -0.540375 0.800629 0.450592 -0.567474 0.806030 0.455933 -0.594604 0.811188 0.461182 -0.622009 0.816406 0.466492 -0.649231 0.821533 0.471771 -0.676025 0.826508 0.476929 -0.702545 0.831482 0.482208 -0.728577 0.836334 0.487427 -0.753967 0.841064 0.492554 -0.778900 0.845764 0.497711 -0.802979 0.850250 0.502716 -0.826447 0.854797 0.507812 -0.849182 0.859192 0.512787 -0.870941 0.863434 0.517670 -0.891846 0.867615 0.522552 -0.911774 0.871765 0.527405 -0.930573 0.875671 0.532043 -0.948334 0.879639 0.536743 -0.964844 0.883301 0.541321 -0.223846 0.758636 0.390106 -0.247406 0.764435 0.395660 -0.271637 0.770294 0.401306 -0.296295 0.776123 0.406921 -0.321167 0.781769 0.412384 -0.346497 0.787506 0.417938 -0.371826 0.793182 0.423523 -0.397095 0.798615 0.428955 -0.422485 0.804199 0.434387 -0.447510 0.809540 0.439697 -0.472687 0.814911 0.445099 -0.498444 0.820282 0.450470 -0.524719 0.825378 0.455658 -0.551514 0.830566 0.461029 -0.578644 0.835663 0.466339 -0.605774 0.840546 0.471527 -0.633026 0.845459 0.476776 -0.660065 0.850342 0.482086 -0.686615 0.854950 0.487183 -0.712860 0.859650 0.492401 -0.738495 0.864105 0.497467 -0.763672 0.868561 0.502563 -0.788208 0.872925 0.507660 -0.811920 0.877136 0.512543 -0.835052 0.881317 0.517517 -0.857361 0.885376 0.522430 -0.878632 0.889343 0.527161 -0.899139 0.893158 0.531952 -0.918579 0.896973 0.536652 -0.936890 0.900574 0.541199 -0.954132 0.904144 0.545685 -0.970123 0.907501 0.550079 -0.234009 0.790619 0.401154 -0.257812 0.796143 0.406616 -0.282227 0.801819 0.412292 -0.306976 0.807465 0.417816 -0.331970 0.812836 0.423248 -0.357239 0.818298 0.428772 -0.382446 0.823578 0.434113 -0.407867 0.828949 0.439575 -0.433075 0.834229 0.444946 -0.458008 0.839264 0.450226 -0.483337 0.844391 0.455566 -0.509308 0.849426 0.460876 -0.535645 0.854279 0.466034 -0.562561 0.859131 0.471405 -0.589661 0.863922 0.476685 -0.616699 0.868530 0.481873 -0.643799 0.873108 0.487061 -0.670624 0.877594 0.492310 -0.696930 0.881958 0.497345 -0.722900 0.886292 0.502472 -0.748199 0.890442 0.507416 -0.773041 0.894562 0.512451 -0.797211 0.898621 0.517426 -0.820587 0.902435 0.522186 -0.843292 0.906281 0.527100 -0.865173 0.910004 0.531799 -0.886017 0.913574 0.536407 -0.906006 0.917114 0.541077 -0.925018 0.920532 0.545593 -0.942810 0.923798 0.549988 -0.959564 0.927002 0.554352 -0.975006 0.930054 0.558502 -0.244232 0.821411 0.412109 -0.268219 0.826752 0.417542 -0.292755 0.832184 0.423126 -0.317657 0.837494 0.428650 -0.342651 0.842621 0.433990 -0.367981 0.847839 0.439423 -0.393127 0.852844 0.444702 -0.418396 0.857910 0.450073 -0.443512 0.862854 0.455414 -0.468384 0.867615 0.460663 -0.493896 0.872437 0.465912 -0.520050 0.877136 0.471283 -0.546509 0.881683 0.476410 -0.573425 0.886200 0.481720 -0.600494 0.890686 0.486938 -0.627411 0.894928 0.492035 -0.654358 0.899231 0.497192 -0.680756 0.903290 0.502228 -0.706879 0.907349 0.507263 -0.732574 0.911316 0.512299 -0.757507 0.915100 0.517151 -0.781982 0.918945 0.522064 -0.805847 0.922607 0.526947 -0.828796 0.926086 0.531586 -0.851105 0.929596 0.536285 -0.872528 0.932953 0.540955 -0.892944 0.936127 0.545349 -0.912506 0.939301 0.549866 -0.931000 0.942291 0.554138 -0.948395 0.945312 0.558380 -0.964630 0.948151 0.562561 -0.979584 0.950836 0.566589 -0.254456 0.850983 0.422974 -0.278595 0.856049 0.428345 -0.303253 0.861176 0.433838 -0.328125 0.866119 0.439209 -0.353271 0.871094 0.444550 -0.378510 0.875977 0.449951 -0.403595 0.880676 0.455139 -0.428772 0.885376 0.460480 -0.453735 0.890045 0.465759 -0.478668 0.894440 0.471008 -0.504425 0.898956 0.476257 -0.530670 0.903320 0.481567 -0.557190 0.907501 0.486664 -0.584045 0.911682 0.491882 -0.610931 0.915680 0.496948 -0.637848 0.919739 0.502075 -0.664520 0.923645 0.507172 -0.690704 0.927307 0.512024 -0.716583 0.931030 0.517029 -0.741882 0.934692 0.521973 -0.766510 0.938110 0.526703 -0.790619 0.941528 0.531433 -0.814087 0.944794 0.536194 -0.836670 0.947937 0.540741 -0.858551 0.951050 0.545227 -0.879547 0.954071 0.549713 -0.899536 0.956909 0.554016 -0.918640 0.959717 0.558319 -0.936646 0.962341 0.562378 -0.953613 0.964996 0.566498 -0.969330 0.967499 0.570465 -0.983826 0.969818 0.574249 -0.264709 0.879089 0.433716 -0.288971 0.883881 0.439056 -0.313751 0.888702 0.444397 -0.338623 0.893311 0.449677 -0.363770 0.897949 0.454987 -0.388916 0.902496 0.460388 -0.413971 0.906830 0.465546 -0.438965 0.911224 0.470886 -0.463776 0.915527 0.476166 -0.488922 0.919678 0.481293 -0.514832 0.923767 0.486542 -0.541107 0.927765 0.491760 -0.567657 0.931580 0.496796 -0.594482 0.935425 0.501984 -0.621246 0.939056 0.506866 -0.647980 0.942719 0.511932 -0.674438 0.946228 0.516876 -0.700317 0.949585 0.521698 -0.725861 0.952881 0.526581 -0.750824 0.956146 0.531342 -0.775116 0.959229 0.535950 -0.798889 0.962219 0.540588 -0.821960 0.965149 0.545135 -0.844147 0.967926 0.549500 -0.865601 0.970673 0.553894 -0.886108 0.973236 0.558105 -0.905701 0.975830 0.562286 -0.924377 0.978241 0.566376 -0.941895 0.980530 0.570221 -0.958405 0.982758 0.574127 -0.973663 0.984924 0.577881 -0.987671 0.986908 0.581390 -0.040741 0.039429 0.171783 -0.053558 0.040741 0.174072 -0.066650 0.042114 0.176605 -0.080261 0.043549 0.179108 -0.094940 0.045013 0.181793 -0.110779 0.046539 0.184509 -0.127869 0.048157 0.187408 -0.146088 0.049866 0.190430 -0.165131 0.051575 0.193451 -0.185211 0.053406 0.196686 -0.206055 0.055267 0.200043 -0.227570 0.057190 0.203400 -0.249786 0.059143 0.206879 -0.272583 0.061249 0.210571 -0.295746 0.063324 0.214203 -0.319397 0.065521 0.218018 -0.343414 0.067810 0.221954 -0.367554 0.070068 0.225861 -0.391907 0.072510 0.230011 -0.416260 0.074921 0.234100 -0.440674 0.077484 0.238403 -0.465057 0.080109 0.242767 -0.489899 0.082794 0.247101 -0.515564 0.085571 0.251678 -0.541809 0.088501 0.256287 -0.568420 0.091400 0.260895 -0.595428 0.094421 0.265686 -0.622589 0.097626 0.270538 -0.649597 0.100800 0.275330 -0.676605 0.104095 0.280365 -0.703125 0.107483 0.285278 -0.729401 0.110992 0.290405 -0.043915 0.051575 0.176483 -0.056854 0.053040 0.179047 -0.070160 0.054626 0.181671 -0.084167 0.056183 0.184448 -0.099274 0.057922 0.187286 -0.115601 0.059601 0.190277 -0.133148 0.061432 0.193359 -0.151764 0.063324 0.196625 -0.171295 0.065247 0.199829 -0.191772 0.067291 0.203308 -0.212982 0.069366 0.206818 -0.234833 0.071503 0.210358 -0.257416 0.073761 0.214111 -0.280518 0.076080 0.217926 -0.303955 0.078400 0.221771 -0.327911 0.080902 0.225769 -0.351990 0.083405 0.229797 -0.376404 0.086060 0.233978 -0.400940 0.088806 0.238281 -0.425385 0.091553 0.242554 -0.449921 0.094421 0.246979 -0.474487 0.097473 0.251587 -0.499756 0.100494 0.256104 -0.525787 0.103668 0.260803 -0.552307 0.106964 0.265564 -0.579163 0.110260 0.270264 -0.606323 0.113708 0.275238 -0.633484 0.117218 0.280090 -0.660614 0.120819 0.285156 -0.687592 0.124573 0.290283 -0.714050 0.128296 0.295349 -0.740204 0.132172 0.300537 -0.047333 0.064575 0.181580 -0.060455 0.066284 0.184357 -0.074005 0.068054 0.187256 -0.088379 0.069855 0.190216 -0.103973 0.071747 0.193298 -0.120789 0.073730 0.196442 -0.138824 0.075806 0.199738 -0.157898 0.077942 0.203217 -0.177856 0.080109 0.206665 -0.198700 0.082428 0.210266 -0.220276 0.084839 0.213989 -0.242493 0.087219 0.217743 -0.265381 0.089783 0.221649 -0.288666 0.092407 0.225586 -0.312469 0.095123 0.229675 -0.336639 0.097961 0.233887 -0.360992 0.100830 0.238068 -0.385590 0.103851 0.242432 -0.410217 0.106964 0.246887 -0.434784 0.110138 0.251343 -0.459351 0.113434 0.255981 -0.484314 0.116791 0.260681 -0.509918 0.120239 0.265320 -0.536255 0.123779 0.270172 -0.563110 0.127472 0.275116 -0.590088 0.131104 0.279968 -0.617432 0.134949 0.285004 -0.644623 0.138824 0.290039 -0.671814 0.142822 0.295227 -0.698669 0.146912 0.300415 -0.725067 0.150970 0.305573 -0.751038 0.155212 0.310974 -0.050995 0.078705 0.187103 -0.064270 0.080658 0.190155 -0.078125 0.082642 0.193146 -0.092987 0.084778 0.196381 -0.109100 0.086975 0.199646 -0.126404 0.089203 0.203033 -0.144897 0.091583 0.206573 -0.164429 0.094055 0.210175 -0.184753 0.096588 0.213837 -0.205994 0.099213 0.217621 -0.227997 0.101990 0.221558 -0.250519 0.104736 0.225464 -0.273743 0.107666 0.229584 -0.297272 0.110657 0.233673 -0.321350 0.113800 0.237976 -0.345795 0.117004 0.242340 -0.370270 0.120239 0.246674 -0.394989 0.123657 0.251221 -0.419769 0.127167 0.255829 -0.444397 0.130646 0.260437 -0.469086 0.134338 0.265198 -0.494507 0.138092 0.270050 -0.520447 0.141846 0.274872 -0.547089 0.145813 0.279846 -0.573975 0.149719 0.284790 -0.601257 0.153839 0.289886 -0.628754 0.158020 0.295044 -0.655975 0.162170 0.300171 -0.683044 0.166504 0.305450 -0.709869 0.170929 0.310822 -0.736084 0.175323 0.316071 -0.761963 0.179871 0.321503 -0.054901 0.094330 0.193054 -0.068420 0.096588 0.196259 -0.082581 0.098907 0.199493 -0.097961 0.101379 0.202942 -0.114594 0.103912 0.206451 -0.132355 0.106506 0.209991 -0.151306 0.109222 0.213745 -0.171295 0.112061 0.217529 -0.192047 0.114960 0.221344 -0.213684 0.117981 0.225372 -0.236023 0.121124 0.229462 -0.258911 0.124237 0.233551 -0.282410 0.127533 0.237823 -0.306213 0.130890 0.242126 -0.330566 0.134369 0.246582 -0.355164 0.137939 0.251099 -0.379852 0.141510 0.255615 -0.404663 0.145264 0.260315 -0.429504 0.149109 0.265076 -0.454193 0.152985 0.269806 -0.479218 0.157043 0.274750 -0.504974 0.161133 0.279755 -0.531219 0.165222 0.284668 -0.558136 0.169495 0.289764 -0.585205 0.173706 0.294800 -0.612701 0.178131 0.300049 -0.640137 0.182648 0.305328 -0.667389 0.187103 0.310516 -0.694458 0.191711 0.315948 -0.721069 0.196442 0.321350 -0.747131 0.201111 0.326691 -0.772827 0.205933 0.332214 -0.059021 0.111755 0.199432 -0.072815 0.114380 0.202850 -0.087402 0.117035 0.206238 -0.103302 0.119843 0.209900 -0.120453 0.122742 0.213654 -0.138733 0.125671 0.217346 -0.158142 0.128784 0.221283 -0.178528 0.132019 0.225250 -0.199707 0.135162 0.229248 -0.221741 0.138611 0.233459 -0.244324 0.141968 0.237640 -0.267578 0.145538 0.242004 -0.291382 0.149200 0.246460 -0.315460 0.152832 0.250916 -0.340027 0.156708 0.255493 -0.364777 0.160645 0.260193 -0.389587 0.164520 0.264832 -0.414520 0.168640 0.269684 -0.439484 0.172821 0.274597 -0.464233 0.176971 0.279510 -0.489624 0.181305 0.284515 -0.515564 0.185638 0.289520 -0.542267 0.190125 0.294678 -0.569427 0.194702 0.299927 -0.596680 0.199188 0.305084 -0.624237 0.203918 0.310394 -0.651764 0.208679 0.315826 -0.678864 0.213409 0.321106 -0.705811 0.218292 0.326538 -0.732361 0.223297 0.332092 -0.758240 0.228210 0.337433 -0.783691 0.233246 0.343048 -0.063416 0.130981 0.206177 -0.077545 0.133942 0.209778 -0.092621 0.136932 0.213440 -0.109039 0.140076 0.217255 -0.126678 0.143372 0.221161 -0.145477 0.146637 0.225067 -0.165344 0.150055 0.229156 -0.186188 0.153595 0.233368 -0.207764 0.157135 0.237518 -0.230133 0.160889 0.241882 -0.253052 0.164551 0.246216 -0.276642 0.168488 0.250824 -0.300690 0.172485 0.255402 -0.325043 0.176453 0.259949 -0.349731 0.180573 0.264709 -0.374664 0.184875 0.269531 -0.399567 0.189056 0.274353 -0.424622 0.193512 0.279388 -0.449585 0.197937 0.284424 -0.474487 0.202423 0.289368 -0.500305 0.207031 0.294556 -0.526642 0.211639 0.299652 -0.553558 0.216400 0.304962 -0.580902 0.221252 0.310272 -0.608307 0.226013 0.315491 -0.635925 0.230988 0.320953 -0.663422 0.235992 0.326447 -0.690430 0.240967 0.331787 -0.717255 0.246094 0.337311 -0.743622 0.251282 0.342896 -0.769257 0.256348 0.348358 -0.794495 0.261597 0.354004 -0.068085 0.151917 0.213348 -0.082581 0.155182 0.217133 -0.098145 0.158508 0.220978 -0.115112 0.161987 0.224976 -0.133331 0.165619 0.229034 -0.152557 0.169159 0.233185 -0.172943 0.172943 0.237396 -0.194061 0.176697 0.241669 -0.216095 0.180603 0.246124 -0.238861 0.184692 0.250671 -0.262085 0.188751 0.255157 -0.285980 0.192932 0.259857 -0.310272 0.197235 0.264587 -0.334808 0.201538 0.269287 -0.359680 0.205963 0.274261 -0.384766 0.210480 0.279236 -0.409790 0.214966 0.284119 -0.434845 0.219696 0.289246 -0.459869 0.224426 0.294434 -0.485077 0.229156 0.299500 -0.511292 0.234070 0.304810 -0.537842 0.238861 0.309998 -0.565063 0.243896 0.315369 -0.592529 0.248962 0.320801 -0.620056 0.253937 0.326141 -0.647705 0.259155 0.331635 -0.675140 0.264374 0.337158 -0.702026 0.269501 0.342590 -0.728638 0.274811 0.348236 -0.754700 0.280060 0.353699 -0.780304 0.285461 0.359406 -0.805237 0.290894 0.365051 -0.072998 0.174408 0.220886 -0.087921 0.177979 0.224884 -0.104034 0.181610 0.228851 -0.121613 0.185425 0.233063 -0.140320 0.189331 0.237305 -0.160065 0.193207 0.241577 -0.180817 0.197296 0.245972 -0.202393 0.201355 0.250427 -0.224792 0.205597 0.255035 -0.247894 0.209991 0.259735 -0.271393 0.214264 0.264343 -0.295593 0.218750 0.269196 -0.320099 0.223328 0.274139 -0.344849 0.227905 0.278992 -0.369904 0.232605 0.284027 -0.395050 0.237396 0.289124 -0.420135 0.242126 0.294159 -0.445221 0.247070 0.299377 -0.470245 0.251953 0.304535 -0.496063 0.257050 0.309875 -0.522491 0.262115 0.315247 -0.549347 0.267212 0.320557 -0.576721 0.272430 0.326019 -0.604401 0.277679 0.331512 -0.631927 0.282867 0.336884 -0.659515 0.288239 0.342468 -0.686829 0.293640 0.348083 -0.713593 0.298950 0.353577 -0.740051 0.304382 0.359222 -0.765869 0.309784 0.364746 -0.791199 0.315277 0.370422 -0.815887 0.320862 0.376099 -0.078217 0.198334 0.228729 -0.093658 0.202240 0.232971 -0.110382 0.206146 0.237091 -0.128418 0.210297 0.241455 -0.147552 0.214325 0.245789 -0.167847 0.218628 0.250305 -0.189087 0.222961 0.254913 -0.210999 0.227325 0.259491 -0.233856 0.231873 0.264252 -0.257233 0.236481 0.269104 -0.281006 0.240997 0.273865 -0.305420 0.245819 0.278870 -0.330231 0.250671 0.283905 -0.355103 0.255402 0.288849 -0.380280 0.260406 0.294037 -0.405396 0.265259 0.299103 -0.430634 0.270355 0.304382 -0.455780 0.275482 0.309723 -0.481018 0.280609 0.315002 -0.507172 0.285858 0.320435 -0.533966 0.291168 0.325897 -0.561005 0.296356 0.331238 -0.588562 0.301788 0.336761 -0.616272 0.307220 0.342346 -0.643829 0.312561 0.347839 -0.671387 0.318054 0.353424 -0.698486 0.323608 0.359100 -0.725159 0.329041 0.364624 -0.751404 0.334656 0.370270 -0.776978 0.340088 0.375824 -0.802002 0.345734 0.381531 -0.826385 0.351349 0.387177 -0.083740 0.223541 0.237000 -0.099762 0.227753 0.241333 -0.117035 0.231934 0.245667 -0.135681 0.236328 0.250214 -0.155273 0.240692 0.254700 -0.176025 0.245239 0.259338 -0.197693 0.249878 0.264130 -0.220001 0.254456 0.268829 -0.243073 0.259247 0.273773 -0.266815 0.264099 0.278748 -0.290894 0.268890 0.283630 -0.315552 0.273865 0.288727 -0.340485 0.278900 0.293884 -0.365540 0.283905 0.298981 -0.390808 0.289062 0.304260 -0.415985 0.294189 0.309479 -0.441223 0.299469 0.314850 -0.466492 0.304810 0.320282 -0.492035 0.310028 0.325592 -0.518494 0.315430 0.331085 -0.545502 0.320923 0.336609 -0.572845 0.326263 0.342041 -0.600525 0.331818 0.347656 -0.628265 0.337402 0.353302 -0.655792 0.342865 0.358826 -0.683228 0.348450 0.364502 -0.710083 0.353973 0.369995 -0.736603 0.359619 0.375702 -0.762665 0.365234 0.381378 -0.787933 0.370758 0.386932 -0.812744 0.376465 0.392639 -0.836761 0.382141 0.398346 -0.089630 0.249939 0.245544 -0.106140 0.254333 0.250000 -0.124054 0.258911 0.254547 -0.143188 0.263519 0.259247 -0.163330 0.268127 0.263885 -0.184509 0.272919 0.268707 -0.206543 0.277771 0.273651 -0.229279 0.282593 0.278473 -0.252655 0.287598 0.283508 -0.276672 0.292664 0.288605 -0.300995 0.297668 0.293640 -0.325867 0.302826 0.298859 -0.350830 0.307953 0.304016 -0.376129 0.313232 0.309326 -0.401550 0.318604 0.314697 -0.426697 0.323853 0.320007 -0.451965 0.329285 0.325470 -0.477356 0.334778 0.330963 -0.503357 0.340149 0.336365 -0.530060 0.345703 0.341919 -0.557343 0.351288 0.347534 -0.584778 0.356720 0.353027 -0.612549 0.362396 0.358673 -0.640289 0.368011 0.364319 -0.667755 0.373566 0.369843 -0.695038 0.379242 0.375549 -0.721680 0.384735 0.381104 -0.748016 0.390411 0.386749 -0.773743 0.396149 0.392517 -0.798828 0.401672 0.398041 -0.823242 0.407379 0.403717 -0.846893 0.412994 0.409393 -0.095856 0.277405 0.254456 -0.112946 0.282013 0.259003 -0.131439 0.286804 0.263763 -0.151093 0.291687 0.268585 -0.171692 0.296478 0.273407 -0.193298 0.301483 0.278351 -0.215729 0.306549 0.283386 -0.238770 0.311554 0.288361 -0.262512 0.316742 0.293518 -0.286804 0.322021 0.298737 -0.311340 0.327179 0.303894 -0.336365 0.332550 0.309204 -0.361481 0.337799 0.314453 -0.386871 0.343262 0.319855 -0.412292 0.348724 0.325348 -0.437469 0.354126 0.330658 -0.462769 0.359680 0.336243 -0.488495 0.365234 0.341797 -0.514801 0.370667 0.347229 -0.541809 0.376373 0.352875 -0.569244 0.381989 0.358521 -0.596771 0.387512 0.364044 -0.624603 0.393188 0.369690 -0.652161 0.398712 0.375244 -0.679626 0.404449 0.380981 -0.706696 0.410156 0.386627 -0.733215 0.415680 0.392181 -0.759308 0.421387 0.397919 -0.784790 0.427063 0.403564 -0.809479 0.432587 0.409119 -0.833557 0.438232 0.414795 -0.856873 0.443909 0.420410 -0.102448 0.305756 0.263611 -0.120148 0.310577 0.268311 -0.139191 0.315582 0.273285 -0.159302 0.320648 0.278229 -0.180389 0.325653 0.283142 -0.202393 0.330841 0.288239 -0.225159 0.336060 0.293396 -0.248566 0.341248 0.298492 -0.272583 0.346619 0.303741 -0.296936 0.351868 0.308899 -0.321838 0.357300 0.314301 -0.347015 0.362762 0.319702 -0.372253 0.368134 0.325073 -0.397736 0.373688 0.330536 -0.423187 0.379303 0.336090 -0.448364 0.384735 0.341522 -0.473755 0.390350 0.347107 -0.499817 0.395996 0.352722 -0.526459 0.401581 0.358246 -0.553680 0.407227 0.363922 -0.581268 0.412903 0.369568 -0.608887 0.418457 0.375122 -0.636688 0.424103 0.380829 -0.664154 0.429718 0.386353 -0.691467 0.435394 0.392059 -0.718353 0.441101 0.397797 -0.744568 0.446686 0.403259 -0.770447 0.452515 0.408997 -0.795624 0.458313 0.414642 -0.819977 0.464050 0.420166 -0.843750 0.469910 0.425751 -0.866577 0.475861 0.431335 -0.109375 0.334900 0.273132 -0.127655 0.339905 0.277985 -0.147217 0.345062 0.283020 -0.167847 0.350281 0.288116 -0.189331 0.355438 0.293121 -0.211731 0.360779 0.298340 -0.234894 0.366180 0.303619 -0.258545 0.371460 0.308807 -0.282898 0.376892 0.314209 -0.307434 0.382233 0.319427 -0.332550 0.387756 0.324921 -0.357849 0.393372 0.330414 -0.383148 0.398804 0.335815 -0.408691 0.404419 0.341370 -0.434082 0.410095 0.346985 -0.459259 0.415588 0.352448 -0.484955 0.421204 0.358093 -0.511383 0.426941 0.363739 -0.538177 0.432404 0.369293 -0.565613 0.438141 0.374969 -0.593140 0.443756 0.380554 -0.620941 0.449493 0.386200 -0.648743 0.455353 0.391907 -0.676056 0.461090 0.397491 -0.703217 0.467010 0.403107 -0.729889 0.472961 0.408844 -0.755859 0.478760 0.414337 -0.781433 0.484772 0.420013 -0.806274 0.490723 0.425629 -0.830292 0.496613 0.431061 -0.853699 0.502625 0.436615 -0.876007 0.508575 0.442078 -0.116699 0.364624 0.282898 -0.135498 0.369720 0.287842 -0.155579 0.375061 0.292969 -0.176727 0.380402 0.298187 -0.198608 0.385712 0.303345 -0.221375 0.391083 0.308655 -0.244720 0.396423 0.313873 -0.268768 0.401947 0.319305 -0.293304 0.407471 0.324768 -0.318115 0.412933 0.330109 -0.343353 0.418488 0.335693 -0.368774 0.424103 0.341248 -0.394135 0.429596 0.346680 -0.419617 0.435303 0.352295 -0.445007 0.440948 0.357941 -0.470306 0.446564 0.363495 -0.496338 0.452362 0.369141 -0.523041 0.458191 0.374817 -0.550049 0.463928 0.380371 -0.577667 0.469910 0.386078 -0.605286 0.475739 0.391602 -0.633057 0.481750 0.397339 -0.660706 0.487793 0.402985 -0.687866 0.493683 0.408539 -0.714783 0.499786 0.414215 -0.741241 0.505920 0.419861 -0.766968 0.511902 0.425354 -0.792206 0.518036 0.430939 -0.816772 0.524170 0.436493 -0.840424 0.530182 0.441925 -0.863342 0.536255 0.447418 -0.885254 0.542236 0.452789 -0.124329 0.394745 0.292847 -0.143707 0.399994 0.297943 -0.164307 0.405365 0.303192 -0.185852 0.410828 0.308533 -0.208130 0.416168 0.313751 -0.231232 0.421692 0.319183 -0.255035 0.427216 0.324646 -0.279205 0.432617 0.329987 -0.303986 0.438232 0.335541 -0.328949 0.443756 0.340942 -0.354309 0.449463 0.346558 -0.379822 0.455261 0.352142 -0.405151 0.460938 0.357666 -0.430695 0.466858 0.363373 -0.456085 0.472809 0.369019 -0.481506 0.478668 0.374512 -0.507874 0.484680 0.380249 -0.534790 0.490723 0.385895 -0.562012 0.496765 0.391479 -0.589661 0.502899 0.397186 -0.617310 0.508911 0.402710 -0.645081 0.515076 0.408417 -0.672577 0.521240 0.414062 -0.699585 0.527313 0.419556 -0.726257 0.533569 0.425171 -0.752380 0.539764 0.430786 -0.777893 0.545837 0.436218 -0.802765 0.552063 0.441772 -0.826965 0.558289 0.447266 -0.850250 0.564270 0.452637 -0.872742 0.570465 0.458099 -0.894165 0.576447 0.463470 -0.132324 0.425079 0.303070 -0.152191 0.430389 0.308258 -0.173218 0.435883 0.313629 -0.195190 0.441437 0.319061 -0.217834 0.446869 0.324341 -0.241333 0.452576 0.329865 -0.265259 0.458160 0.335266 -0.289795 0.463989 0.340790 -0.314728 0.469879 0.346436 -0.339874 0.475616 0.351837 -0.365295 0.481598 0.357544 -0.390869 0.487640 0.363220 -0.416260 0.493561 0.368713 -0.441742 0.499695 0.374451 -0.467102 0.505890 0.380127 -0.492889 0.511902 0.385620 -0.519501 0.518097 0.391327 -0.546661 0.524384 0.397034 -0.574005 0.530487 0.402557 -0.601776 0.536774 0.408295 -0.629333 0.542877 0.413788 -0.656982 0.549164 0.419403 -0.684357 0.555481 0.425079 -0.711151 0.561584 0.430481 -0.737610 0.567871 0.436066 -0.763458 0.574219 0.441650 -0.788574 0.580261 0.447052 -0.813141 0.586456 0.452515 -0.836945 0.592682 0.458008 -0.859802 0.598663 0.463348 -0.881897 0.604767 0.468781 -0.902924 0.610718 0.474152 -0.140625 0.455872 0.313507 -0.160980 0.461395 0.318787 -0.182465 0.467163 0.324219 -0.204803 0.472992 0.329742 -0.227814 0.478760 0.335144 -0.251587 0.484680 0.340668 -0.275757 0.490540 0.346130 -0.300507 0.496582 0.351715 -0.325653 0.502716 0.357391 -0.350861 0.508728 0.362915 -0.376404 0.514923 0.368561 -0.401978 0.521118 0.374268 -0.427338 0.527222 0.379822 -0.452728 0.533508 0.385498 -0.478241 0.539856 0.391205 -0.504395 0.546021 0.396759 -0.531219 0.552338 0.402405 -0.558380 0.558563 0.407990 -0.585999 0.564911 0.413635 -0.613800 0.571289 0.419281 -0.641296 0.577423 0.424774 -0.668823 0.583771 0.430359 -0.695953 0.590118 0.435974 -0.722504 0.596222 0.441376 -0.748718 0.602509 0.446869 -0.774292 0.608704 0.452362 -0.799042 0.614777 0.457672 -0.823273 0.620941 0.463165 -0.846558 0.626892 0.468536 -0.869080 0.633026 0.474030 -0.890747 0.639038 0.479492 -0.911224 0.644836 0.484802 -0.149200 0.488007 0.324097 -0.170044 0.493744 0.329437 -0.191925 0.499756 0.334961 -0.214539 0.505737 0.340424 -0.238007 0.511810 0.345978 -0.262024 0.518005 0.351593 -0.286438 0.524048 0.357086 -0.311371 0.530304 0.362762 -0.336609 0.536591 0.368378 -0.361938 0.542725 0.373962 -0.387482 0.549103 0.379669 -0.413086 0.555450 0.385315 -0.438416 0.561676 0.390900 -0.463715 0.568085 0.396637 -0.489471 0.574341 0.402161 -0.515930 0.580688 0.407867 -0.542999 0.587097 0.413513 -0.570312 0.593353 0.419006 -0.597992 0.599701 0.424622 -0.625702 0.606049 0.430206 -0.653198 0.612274 0.435699 -0.680481 0.618530 0.441254 -0.707367 0.624786 0.446747 -0.733673 0.630859 0.452087 -0.759552 0.637054 0.457520 -0.784851 0.643219 0.463074 -0.809265 0.649170 0.468384 -0.833099 0.655212 0.473907 -0.856018 0.661011 0.479218 -0.878113 0.666931 0.484650 -0.899292 0.672760 0.490082 -0.919281 0.678467 0.495392 -0.158051 0.521240 0.334869 -0.179352 0.527222 0.340240 -0.201660 0.533478 0.345856 -0.224579 0.539581 0.351318 -0.248322 0.545868 0.356964 -0.272614 0.552216 0.362640 -0.297211 0.558441 0.368164 -0.322327 0.564819 0.373840 -0.347656 0.571167 0.379517 -0.373077 0.577423 0.385071 -0.398621 0.583862 0.390747 -0.424194 0.590302 0.396484 -0.449432 0.596558 0.402008 -0.474884 0.602997 0.407715 -0.500824 0.609253 0.413239 -0.527588 0.615631 0.418823 -0.554810 0.622009 0.424500 -0.582214 0.628204 0.429932 -0.609863 0.634491 0.435516 -0.637543 0.640808 0.441101 -0.664886 0.646881 0.446472 -0.691956 0.653076 0.451965 -0.718628 0.659241 0.457428 -0.744598 0.665192 0.462769 -0.770233 0.671265 0.468231 -0.794983 0.677063 0.473602 -0.819275 0.683014 0.479095 -0.842651 0.688843 0.484497 -0.865173 0.694519 0.489807 -0.886841 0.700134 0.495239 -0.907501 0.705780 0.500641 -0.926971 0.711212 0.505890 -0.167053 0.555237 0.345551 -0.188873 0.561554 0.351166 -0.211517 0.567932 0.356781 -0.234802 0.574158 0.362366 -0.258789 0.580505 0.368011 -0.283295 0.586975 0.373688 -0.308075 0.593231 0.379272 -0.333313 0.599670 0.384949 -0.358734 0.606140 0.390625 -0.384186 0.612396 0.396179 -0.409729 0.618835 0.401886 -0.435089 0.625122 0.407440 -0.460388 0.631531 0.413116 -0.486115 0.637909 0.418701 -0.512360 0.644104 0.424225 -0.539276 0.650360 0.429810 -0.566620 0.656677 0.435394 -0.594086 0.662781 0.440826 -0.621704 0.668976 0.446320 -0.649261 0.675140 0.451843 -0.676392 0.681061 0.457153 -0.703278 0.687103 0.462616 -0.729645 0.693085 0.468079 -0.755341 0.698822 0.473450 -0.780609 0.704681 0.478912 -0.805084 0.710327 0.484283 -0.828949 0.716034 0.489716 -0.851929 0.721619 0.495087 -0.873993 0.727081 0.500366 -0.895203 0.732513 0.505737 -0.915375 0.737915 0.511047 -0.934357 0.743073 0.516235 -0.176361 0.589966 0.356537 -0.198639 0.596405 0.362213 -0.221619 0.602783 0.367859 -0.245178 0.609100 0.373413 -0.269348 0.615540 0.379089 -0.294098 0.621979 0.384796 -0.319031 0.628235 0.390320 -0.344391 0.634705 0.396057 -0.369873 0.641083 0.401733 -0.395294 0.647339 0.407318 -0.420776 0.653687 0.412933 -0.446045 0.659882 0.418427 -0.471375 0.666199 0.424072 -0.497345 0.672424 0.429657 -0.523895 0.678558 0.435150 -0.550903 0.684692 0.440674 -0.578339 0.690857 0.446228 -0.605774 0.696716 0.451538 -0.633392 0.702789 0.457001 -0.660767 0.708740 0.462524 -0.687714 0.714478 0.467865 -0.714325 0.720306 0.473328 -0.740295 0.725952 0.478668 -0.765839 0.731628 0.484161 -0.790741 0.737244 0.489594 -0.814850 0.742676 0.494812 -0.838318 0.748108 0.500275 -0.860870 0.753510 0.505615 -0.882507 0.758667 0.510803 -0.903229 0.763855 0.516083 -0.922943 0.768982 0.521271 -0.941376 0.773956 0.526367 -0.185913 0.624939 0.367554 -0.208496 0.631348 0.373291 -0.231842 0.637817 0.378967 -0.255646 0.644043 0.384521 -0.280090 0.650452 0.390198 -0.304962 0.656891 0.395874 -0.330017 0.663025 0.401459 -0.355438 0.669403 0.407135 -0.380768 0.675568 0.412659 -0.406311 0.681793 0.418274 -0.431793 0.688049 0.423950 -0.456940 0.694122 0.429443 -0.482483 0.700287 0.434967 -0.508698 0.706360 0.440521 -0.535309 0.712280 0.445923 -0.562561 0.718262 0.451416 -0.589966 0.724243 0.456879 -0.617432 0.729950 0.462250 -0.644897 0.735718 0.467712 -0.672119 0.741486 0.473236 -0.698730 0.747040 0.478485 -0.725159 0.752625 0.484039 -0.750793 0.758026 0.489319 -0.776001 0.763489 0.494659 -0.800568 0.768829 0.500122 -0.824310 0.773987 0.505310 -0.847321 0.779175 0.510681 -0.869537 0.784302 0.515930 -0.890656 0.789246 0.520996 -0.910919 0.794159 0.526276 -0.930084 0.798981 0.531342 -0.948029 0.803619 0.536285 -0.195618 0.659760 0.378662 -0.218597 0.666168 0.384399 -0.242157 0.672516 0.390076 -0.266174 0.678680 0.395630 -0.290833 0.684967 0.401337 -0.315857 0.691223 0.406982 -0.341003 0.697357 0.412537 -0.366455 0.703552 0.418152 -0.391815 0.709564 0.423645 -0.417328 0.715668 0.429291 -0.442657 0.721680 0.434814 -0.467743 0.727570 0.440277 -0.493591 0.733551 0.445770 -0.520020 0.739471 0.451263 -0.546814 0.745148 0.456573 -0.574097 0.750977 0.462067 -0.601593 0.756683 0.467590 -0.628876 0.762207 0.472961 -0.656219 0.767822 0.478394 -0.683014 0.773132 0.483704 -0.709625 0.778534 0.489166 -0.735657 0.783875 0.494568 -0.761047 0.789062 0.499817 -0.785919 0.794250 0.505157 -0.810089 0.799316 0.510559 -0.833405 0.804199 0.515686 -0.856049 0.809113 0.520874 -0.877777 0.813904 0.526154 -0.898468 0.818542 0.531097 -0.918243 0.823181 0.536194 -0.936859 0.827606 0.541107 -0.954346 0.832092 0.546051 -0.205505 0.694183 0.389801 -0.228729 0.700409 0.395508 -0.252594 0.706635 0.401184 -0.276855 0.712708 0.406677 -0.301666 0.718842 0.412384 -0.326752 0.724945 0.417969 -0.351990 0.730896 0.423523 -0.377441 0.736908 0.429169 -0.402771 0.742737 0.434570 -0.428162 0.748657 0.440125 -0.453430 0.754547 0.445679 -0.478638 0.760162 0.450989 -0.504700 0.765930 0.456451 -0.531342 0.771606 0.461975 -0.558258 0.777100 0.467316 -0.585480 0.782623 0.472809 -0.612946 0.788116 0.478241 -0.640106 0.793335 0.483582 -0.667267 0.798645 0.489014 -0.693909 0.803802 0.494293 -0.720215 0.808960 0.499695 -0.745911 0.813995 0.505066 -0.770935 0.818878 0.510254 -0.795441 0.823792 0.515533 -0.819305 0.828522 0.520752 -0.842224 0.833160 0.525848 -0.864441 0.837738 0.531006 -0.885742 0.842285 0.536041 -0.905945 0.846558 0.540985 -0.925262 0.850891 0.545929 -0.943329 0.855011 0.550720 -0.960297 0.859131 0.555450 -0.215546 0.727814 0.400909 -0.239075 0.733948 0.406525 -0.263123 0.739990 0.412262 -0.287506 0.745880 0.417725 -0.312469 0.751862 0.423401 -0.337555 0.757660 0.428894 -0.362915 0.763550 0.434448 -0.388336 0.769348 0.439941 -0.413666 0.774963 0.445374 -0.438934 0.780640 0.450867 -0.464081 0.786255 0.456329 -0.489563 0.791718 0.461700 -0.515747 0.797241 0.467133 -0.542511 0.802673 0.472626 -0.569489 0.807892 0.477966 -0.596771 0.813141 0.483459 -0.624023 0.818237 0.488739 -0.651184 0.823303 0.494141 -0.678131 0.828339 0.499573 -0.704437 0.833191 0.504791 -0.730408 0.838074 0.510101 -0.755859 0.842804 0.515381 -0.780579 0.847382 0.520538 -0.804718 0.851929 0.525726 -0.828125 0.856445 0.530853 -0.850677 0.860687 0.535797 -0.872437 0.864990 0.540833 -0.893158 0.869080 0.545654 -0.913025 0.873138 0.550568 -0.931824 0.877136 0.555359 -0.949402 0.880920 0.559967 -0.965851 0.884735 0.564575 -0.225647 0.760712 0.411926 -0.249420 0.766663 0.417572 -0.273682 0.772552 0.423218 -0.298218 0.778168 0.428711 -0.323242 0.783966 0.434265 -0.348389 0.789520 0.439697 -0.373749 0.795197 0.445190 -0.399200 0.800720 0.450745 -0.424347 0.806122 0.456055 -0.449554 0.811554 0.461548 -0.474701 0.816956 0.467010 -0.500397 0.822144 0.472382 -0.526825 0.827301 0.477844 -0.553680 0.832458 0.483307 -0.580627 0.837402 0.488617 -0.607910 0.842407 0.494049 -0.634979 0.847198 0.499298 -0.661987 0.851959 0.504639 -0.688660 0.856689 0.510010 -0.714691 0.861237 0.515137 -0.740387 0.865784 0.520416 -0.765503 0.870209 0.525604 -0.789856 0.874481 0.530579 -0.813629 0.878693 0.535706 -0.836670 0.882812 0.540710 -0.858765 0.886810 0.545471 -0.880127 0.890747 0.550446 -0.900421 0.894531 0.555115 -0.919769 0.898254 0.559845 -0.938080 0.901917 0.564484 -0.955170 0.905365 0.568909 -0.971100 0.908783 0.573425 -0.235840 0.792572 0.422974 -0.259796 0.798279 0.428558 -0.284088 0.803802 0.434021 -0.308899 0.809387 0.439575 -0.334015 0.814880 0.445068 -0.359161 0.820190 0.450439 -0.384521 0.825623 0.455933 -0.409851 0.830902 0.461395 -0.434937 0.836029 0.466736 -0.459961 0.841217 0.472229 -0.485321 0.846283 0.477692 -0.511261 0.851166 0.483063 -0.537720 0.856079 0.488495 -0.564514 0.860779 0.493774 -0.591614 0.865601 0.499146 -0.618805 0.870239 0.504486 -0.645691 0.874725 0.509735 -0.672485 0.879181 0.515015 -0.698853 0.883575 0.520264 -0.724670 0.887726 0.525360 -0.750000 0.891968 0.530457 -0.774750 0.896057 0.535553 -0.798798 0.899994 0.540466 -0.822174 0.903870 0.545380 -0.844696 0.907623 0.550201 -0.866486 0.911255 0.554993 -0.887390 0.914886 0.559723 -0.907196 0.918274 0.564270 -0.926147 0.921722 0.568817 -0.943909 0.924988 0.573303 -0.960480 0.928070 0.577545 -0.975922 0.931213 0.581787 -0.246063 0.823303 0.433838 -0.270233 0.828766 0.439392 -0.294647 0.834076 0.444794 -0.319519 0.839355 0.450317 -0.344696 0.844635 0.455780 -0.369843 0.849670 0.461151 -0.395142 0.854767 0.466583 -0.420380 0.859772 0.472107 -0.445343 0.864624 0.477386 -0.470337 0.869415 0.482941 -0.495941 0.874207 0.488342 -0.521973 0.878815 0.493652 -0.548553 0.883362 0.499054 -0.575378 0.887756 0.504272 -0.602417 0.892212 0.509583 -0.629395 0.896545 0.514893 -0.656219 0.900696 0.520020 -0.682709 0.904846 0.525208 -0.708771 0.908844 0.530334 -0.734283 0.912659 0.535309 -0.759308 0.916565 0.540344 -0.783691 0.920319 0.545288 -0.807343 0.923859 0.550079 -0.830322 0.927399 0.554840 -0.852448 0.930756 0.559509 -0.873810 0.934113 0.564178 -0.894226 0.937347 0.568695 -0.913666 0.940369 0.573090 -0.932098 0.943451 0.577423 -0.949432 0.946381 0.581696 -0.965515 0.949127 0.585785 -0.980438 0.951874 0.589874 -0.256317 0.852814 0.444641 -0.280609 0.857971 0.450195 -0.305176 0.862915 0.455505 -0.330139 0.867981 0.460999 -0.355316 0.872925 0.466492 -0.380402 0.877625 0.471832 -0.405640 0.882416 0.477295 -0.430786 0.887115 0.482788 -0.455597 0.891663 0.488068 -0.480682 0.896179 0.493500 -0.506287 0.900482 0.498779 -0.532562 0.904846 0.504120 -0.559204 0.909088 0.509460 -0.585968 0.913116 0.514587 -0.612915 0.917206 0.519897 -0.639801 0.921204 0.525085 -0.666321 0.924957 0.530060 -0.692566 0.928741 0.535156 -0.718353 0.932434 0.540222 -0.743530 0.935913 0.545013 -0.768188 0.939392 0.549957 -0.792236 0.942780 0.554749 -0.815521 0.945923 0.559418 -0.838135 0.949127 0.564056 -0.859802 0.952118 0.568481 -0.880768 0.955139 0.572998 -0.900757 0.957977 0.577332 -0.919708 0.960693 0.581482 -0.937683 0.963318 0.585693 -0.954529 0.965881 0.589752 -0.970154 0.968353 0.593658 -0.984528 0.970703 0.597443 -0.266541 0.880829 0.455353 -0.290985 0.885681 0.460846 -0.315613 0.890381 0.466187 -0.340637 0.895050 0.471710 -0.365753 0.899658 0.477142 -0.390778 0.904083 0.482483 -0.415955 0.908539 0.487915 -0.440918 0.912903 0.493378 -0.465607 0.916992 0.498627 -0.490875 0.921204 0.503998 -0.516632 0.925171 0.509186 -0.542999 0.929169 0.514496 -0.569641 0.933014 0.519745 -0.596405 0.936737 0.524811 -0.623169 0.940399 0.529968 -0.649872 0.944061 0.535065 -0.676117 0.947449 0.539978 -0.702118 0.950836 0.544861 -0.727570 0.954102 0.549805 -0.752350 0.957245 0.554535 -0.776703 0.960327 0.559235 -0.800354 0.963257 0.563782 -0.823303 0.966156 0.568359 -0.845490 0.968933 0.572845 -0.866791 0.971619 0.577087 -0.887329 0.974213 0.581390 -0.906860 0.976715 0.585571 -0.925385 0.979034 0.589569 -0.942871 0.981384 0.593506 -0.959259 0.983551 0.597382 -0.974396 0.985626 0.601013 -0.988373 0.987640 0.604614 -0.041290 0.039886 0.189545 -0.054138 0.041229 0.191895 -0.067230 0.042603 0.194519 -0.080963 0.044067 0.197205 -0.095673 0.045532 0.199921 -0.111664 0.047180 0.202850 -0.128815 0.048798 0.205902 -0.147034 0.050476 0.208923 -0.166290 0.052246 0.212189 -0.186401 0.054077 0.215546 -0.207275 0.055939 0.218933 -0.228912 0.057922 0.222504 -0.251129 0.059875 0.226074 -0.273987 0.061981 0.229828 -0.297272 0.064117 0.233673 -0.320862 0.066315 0.237518 -0.344971 0.068634 0.241577 -0.369263 0.070984 0.245728 -0.393524 0.073364 0.249878 -0.417969 0.075897 0.254150 -0.442444 0.078461 0.258575 -0.466766 0.081055 0.262970 -0.491791 0.083832 0.267517 -0.517517 0.086639 0.272217 -0.543671 0.089508 0.276825 -0.570465 0.092529 0.281647 -0.597351 0.095520 0.286438 -0.624573 0.098724 0.291351 -0.651733 0.102020 0.296387 -0.678558 0.105316 0.301331 -0.705231 0.108765 0.306488 -0.731476 0.112305 0.311676 -0.044556 0.052124 0.194427 -0.057465 0.053589 0.197083 -0.070831 0.055176 0.199860 -0.084930 0.056824 0.202820 -0.100098 0.058502 0.205750 -0.116577 0.060303 0.208862 -0.134216 0.062134 0.212128 -0.152832 0.063995 0.215363 -0.172516 0.066010 0.218811 -0.193054 0.068054 0.222382 -0.214264 0.070160 0.225952 -0.236267 0.072357 0.229706 -0.258789 0.074554 0.233459 -0.281982 0.076904 0.237396 -0.305542 0.079346 0.241486 -0.329407 0.081787 0.245483 -0.353699 0.084381 0.249756 -0.378204 0.087067 0.254059 -0.402618 0.089752 0.258362 -0.427216 0.092621 0.262848 -0.451691 0.095581 0.267426 -0.476288 0.098541 0.272003 -0.501678 0.101685 0.276703 -0.527649 0.104828 0.281403 -0.554230 0.108124 0.286316 -0.581207 0.111542 0.291229 -0.608307 0.114960 0.296082 -0.635590 0.118561 0.301208 -0.662750 0.122223 0.306366 -0.689575 0.125916 0.311432 -0.716156 0.129761 0.316681 -0.742279 0.133667 0.321991 -0.048035 0.065216 0.199799 -0.061096 0.066895 0.202667 -0.074738 0.068695 0.205658 -0.089203 0.070557 0.208801 -0.104889 0.072479 0.211945 -0.121887 0.074493 0.215302 -0.139954 0.076569 0.218719 -0.159027 0.078705 0.222198 -0.179108 0.080963 0.225861 -0.199982 0.083252 0.229523 -0.221649 0.085693 0.233398 -0.244019 0.088165 0.237305 -0.266846 0.090698 0.241272 -0.290314 0.093414 0.245392 -0.314178 0.096191 0.249634 -0.338257 0.098999 0.253845 -0.362762 0.101959 0.258270 -0.387329 0.105011 0.262726 -0.411926 0.108093 0.267212 -0.436584 0.111328 0.271881 -0.461182 0.114685 0.276581 -0.486115 0.118042 0.281281 -0.511932 0.121552 0.286163 -0.538177 0.125092 0.290955 -0.565063 0.128754 0.295990 -0.592224 0.132568 0.301086 -0.619446 0.136322 0.306091 -0.646820 0.140289 0.311310 -0.673950 0.144348 0.316559 -0.700653 0.148315 0.321747 -0.727173 0.152557 0.327087 -0.753174 0.156830 0.332520 -0.051727 0.079437 0.205597 -0.065002 0.081360 0.208618 -0.078949 0.083435 0.211884 -0.093903 0.085602 0.215210 -0.110077 0.087769 0.218536 -0.127502 0.090118 0.222137 -0.146088 0.092529 0.225769 -0.165619 0.094940 0.229431 -0.186127 0.097565 0.233276 -0.207336 0.100189 0.237122 -0.229431 0.102997 0.241180 -0.252106 0.105865 0.245300 -0.275238 0.108734 0.249451 -0.298981 0.111816 0.253754 -0.323090 0.115021 0.258118 -0.347382 0.118164 0.262512 -0.372101 0.121521 0.267090 -0.396881 0.124969 0.271759 -0.421509 0.128387 0.276367 -0.446228 0.132050 0.281189 -0.470856 0.135651 0.285889 -0.496338 0.139435 0.290833 -0.522491 0.143311 0.295868 -0.549011 0.147217 0.300842 -0.576141 0.151245 0.305969 -0.603485 0.155365 0.311188 -0.630798 0.159515 0.316315 -0.658173 0.163788 0.321594 -0.685272 0.168152 0.326965 -0.711853 0.172485 0.332275 -0.738190 0.176971 0.337677 -0.763885 0.181488 0.343048 -0.055664 0.095184 0.211823 -0.069183 0.097412 0.215088 -0.083527 0.099823 0.218445 -0.098938 0.102325 0.222046 -0.115631 0.104858 0.225586 -0.133545 0.107513 0.229340 -0.152527 0.110229 0.233124 -0.172577 0.113159 0.237030 -0.193481 0.116089 0.241028 -0.215088 0.119080 0.245087 -0.237488 0.122223 0.249329 -0.260529 0.125488 0.253632 -0.283997 0.128723 0.257935 -0.307983 0.132172 0.262421 -0.332367 0.135712 0.266968 -0.356842 0.139221 0.271515 -0.381683 0.142944 0.276215 -0.406525 0.146729 0.281036 -0.431305 0.150513 0.285767 -0.456116 0.154510 0.290710 -0.481018 0.158478 0.295624 -0.506836 0.162598 0.300690 -0.533356 0.166779 0.305817 -0.560150 0.170990 0.310913 -0.587402 0.175385 0.316162 -0.614929 0.179840 0.321472 -0.642273 0.184235 0.326691 -0.669617 0.188812 0.332123 -0.696564 0.193512 0.337524 -0.723114 0.198120 0.342896 -0.749298 0.202911 0.348419 -0.774780 0.207611 0.353851 -0.059845 0.112732 0.218384 -0.073639 0.115326 0.221863 -0.088379 0.118073 0.225494 -0.104340 0.120941 0.229248 -0.121552 0.123779 0.233002 -0.140015 0.126862 0.236908 -0.159424 0.129913 0.240845 -0.179901 0.133148 0.244965 -0.201233 0.136475 0.249207 -0.223236 0.139801 0.253418 -0.245972 0.143280 0.257812 -0.269287 0.146912 0.262268 -0.293030 0.150513 0.266724 -0.317291 0.154236 0.271393 -0.341858 0.158142 0.276093 -0.366516 0.162018 0.280792 -0.391510 0.166046 0.285645 -0.416321 0.170074 0.290466 -0.441254 0.174316 0.295502 -0.466156 0.178589 0.300537 -0.491516 0.182831 0.305573 -0.517700 0.187286 0.310791 -0.544434 0.191803 0.316040 -0.571442 0.196320 0.321198 -0.598938 0.200958 0.326569 -0.626526 0.205688 0.331970 -0.653839 0.210419 0.337250 -0.681091 0.215240 0.342743 -0.707886 0.220062 0.348145 -0.734375 0.225037 0.353699 -0.760376 0.230042 0.359314 -0.785645 0.235016 0.364777 -0.064270 0.132080 0.225403 -0.078430 0.134979 0.229034 -0.093658 0.138123 0.232910 -0.110168 0.141296 0.236816 -0.127869 0.144501 0.240753 -0.146820 0.147888 0.244873 -0.166687 0.151306 0.248993 -0.187592 0.154877 0.253296 -0.209320 0.158508 0.257721 -0.231659 0.162231 0.262054 -0.254791 0.166046 0.266632 -0.278412 0.169952 0.271271 -0.302368 0.173889 0.275879 -0.326904 0.177979 0.280670 -0.351532 0.182098 0.285431 -0.376465 0.186340 0.290375 -0.401581 0.190735 0.295380 -0.426453 0.195038 0.300293 -0.451447 0.199524 0.305450 -0.476501 0.204132 0.310638 -0.502228 0.208649 0.315765 -0.528748 0.213409 0.321075 -0.555786 0.218231 0.326447 -0.582977 0.222931 0.331665 -0.610565 0.227875 0.337097 -0.638214 0.232880 0.342590 -0.665527 0.237762 0.347992 -0.692657 0.242920 0.353577 -0.719299 0.247894 0.359009 -0.745636 0.253082 0.364655 -0.771393 0.258331 0.370270 -0.796448 0.263489 0.375793 -0.069000 0.153107 0.232788 -0.083527 0.156403 0.236633 -0.099274 0.159790 0.240662 -0.116272 0.163269 0.244659 -0.134583 0.166870 0.248901 -0.153961 0.170593 0.253204 -0.174316 0.174316 0.257477 -0.195618 0.178192 0.261963 -0.217773 0.182190 0.266510 -0.240448 0.186127 0.270996 -0.263855 0.190308 0.275757 -0.287811 0.194519 0.280579 -0.312012 0.198792 0.285278 -0.336731 0.203156 0.290253 -0.361511 0.207550 0.295135 -0.386597 0.212097 0.300171 -0.411774 0.216766 0.305328 -0.436707 0.221313 0.310364 -0.461761 0.226135 0.315643 -0.487213 0.230988 0.320953 -0.513306 0.235748 0.326172 -0.540070 0.240753 0.331543 -0.567322 0.245819 0.336975 -0.594666 0.250793 0.342346 -0.622375 0.255890 0.347870 -0.649811 0.260956 0.353271 -0.677185 0.266205 0.358887 -0.704254 0.271515 0.364532 -0.730713 0.276703 0.369965 -0.756836 0.282074 0.375610 -0.782410 0.287506 0.381287 -0.807190 0.292816 0.386841 -0.073975 0.175720 0.240540 -0.088959 0.179291 0.244598 -0.105255 0.183014 0.248810 -0.122772 0.186798 0.253021 -0.141602 0.190735 0.257355 -0.161530 0.194733 0.261841 -0.182281 0.198761 0.266235 -0.204041 0.202972 0.270905 -0.226501 0.207245 0.275635 -0.249542 0.211487 0.280334 -0.273254 0.215973 0.285156 -0.297455 0.220490 0.290131 -0.321930 0.224976 0.294952 -0.346771 0.229645 0.300049 -0.371765 0.234283 0.305084 -0.396942 0.239136 0.310272 -0.422119 0.243988 0.315460 -0.447174 0.248840 0.320679 -0.472260 0.253815 0.326019 -0.498138 0.258942 0.331421 -0.524506 0.263947 0.336700 -0.551575 0.269165 0.342224 -0.579010 0.274353 0.347748 -0.606476 0.279541 0.353149 -0.634216 0.284882 0.358734 -0.661652 0.290131 0.364227 -0.688934 0.295563 0.369843 -0.715851 0.300995 0.375488 -0.742096 0.306335 0.381042 -0.768005 0.311859 0.386688 -0.793304 0.317383 0.392395 -0.817780 0.322845 0.397980 -0.079193 0.199646 0.248566 -0.094757 0.203644 0.252869 -0.111603 0.207672 0.257233 -0.129700 0.211700 0.261597 -0.149017 0.215942 0.266144 -0.169403 0.220245 0.270782 -0.190613 0.224548 0.275391 -0.212738 0.229034 0.280182 -0.235596 0.233582 0.285034 -0.258942 0.238129 0.289856 -0.282959 0.242798 0.294861 -0.307220 0.247467 0.299805 -0.332001 0.252319 0.304932 -0.357056 0.257263 0.310089 -0.382172 0.262085 0.315247 -0.407440 0.267212 0.320557 -0.432648 0.272278 0.325897 -0.457672 0.277344 0.331146 -0.483154 0.282562 0.336578 -0.509338 0.287811 0.342072 -0.535950 0.292999 0.347473 -0.563293 0.298401 0.353027 -0.590698 0.303650 0.358459 -0.618439 0.309113 0.364075 -0.646179 0.314575 0.369659 -0.673462 0.320007 0.375214 -0.700623 0.325531 0.380920 -0.727356 0.331116 0.386597 -0.753448 0.336548 0.392090 -0.779083 0.342194 0.397827 -0.804108 0.347809 0.403503 -0.828217 0.353333 0.409088 -0.084778 0.225037 0.257050 -0.100891 0.229279 0.261505 -0.118347 0.233582 0.266022 -0.136963 0.237885 0.270569 -0.156799 0.242401 0.275269 -0.177643 0.246948 0.280060 -0.199219 0.251526 0.284790 -0.221741 0.256226 0.289734 -0.244934 0.261017 0.294708 -0.268555 0.265808 0.299652 -0.292816 0.270752 0.304779 -0.317352 0.275604 0.309845 -0.342346 0.280701 0.315094 -0.367554 0.285858 0.320435 -0.392700 0.290894 0.325623 -0.418060 0.296143 0.330994 -0.443298 0.301453 0.336456 -0.468384 0.306671 0.341797 -0.494232 0.312073 0.347321 -0.520782 0.317505 0.352875 -0.547668 0.322876 0.358337 -0.575104 0.328339 0.363922 -0.602661 0.333801 0.369415 -0.630463 0.339325 0.375092 -0.658081 0.344940 0.380737 -0.685303 0.350403 0.386292 -0.712280 0.356049 0.391968 -0.738831 0.361755 0.397705 -0.764648 0.367249 0.403198 -0.790039 0.372894 0.408905 -0.814728 0.378601 0.414612 -0.838531 0.384155 0.420166 -0.090729 0.251556 0.265839 -0.107391 0.256042 0.270447 -0.125458 0.260620 0.275146 -0.144592 0.265167 0.279846 -0.164886 0.269897 0.284668 -0.186188 0.274689 0.289612 -0.208191 0.279510 0.294495 -0.231049 0.284424 0.299530 -0.254456 0.289337 0.304535 -0.278473 0.294434 0.309723 -0.302979 0.299591 0.314972 -0.327759 0.304688 0.320160 -0.352875 0.309937 0.325500 -0.378204 0.315216 0.330872 -0.403442 0.320496 0.336212 -0.428772 0.325897 0.341675 -0.454010 0.331329 0.347168 -0.479340 0.336700 0.352570 -0.505524 0.342224 0.358185 -0.532166 0.347626 0.363647 -0.559448 0.353241 0.369293 -0.587067 0.358856 0.374939 -0.614716 0.364349 0.380463 -0.642487 0.369995 0.386139 -0.669983 0.375641 0.391815 -0.697052 0.381195 0.397369 -0.723907 0.386902 0.403046 -0.750183 0.392578 0.408783 -0.775787 0.398102 0.414307 -0.800873 0.403809 0.420044 -0.825104 0.409363 0.425537 -0.848724 0.415009 0.431183 -0.097015 0.279053 0.274933 -0.114288 0.283813 0.279724 -0.132904 0.288635 0.284576 -0.152557 0.293427 0.289337 -0.173309 0.298370 0.294373 -0.195007 0.303406 0.299438 -0.217407 0.308350 0.304413 -0.240601 0.313507 0.309601 -0.264313 0.318604 0.314697 -0.288605 0.323853 0.320007 -0.313324 0.329193 0.325378 -0.338257 0.334442 0.330597 -0.363556 0.339844 0.336029 -0.388916 0.345276 0.341522 -0.414215 0.350647 0.346924 -0.439575 0.356201 0.352448 -0.464844 0.361786 0.358063 -0.490540 0.367218 0.363525 -0.517029 0.372864 0.369141 -0.543915 0.378357 0.374664 -0.571381 0.383972 0.380310 -0.599091 0.389648 0.385986 -0.626740 0.395172 0.391510 -0.654480 0.400909 0.397247 -0.681885 0.406555 0.402924 -0.708801 0.412140 0.408478 -0.735382 0.417847 0.414185 -0.761444 0.423523 0.419891 -0.786774 0.429016 0.425385 -0.811523 0.434723 0.431030 -0.835388 0.440247 0.436523 -0.858612 0.445953 0.442169 -0.103668 0.307495 0.284302 -0.121552 0.312469 0.289246 -0.140686 0.317474 0.294250 -0.160828 0.322449 0.299133 -0.182068 0.327606 0.304260 -0.204071 0.332672 0.309326 -0.226898 0.337921 0.314575 -0.250458 0.343262 0.319855 -0.274384 0.348450 0.325104 -0.298950 0.353912 0.330475 -0.323883 0.359406 0.335938 -0.348969 0.364716 0.341278 -0.374359 0.370239 0.346771 -0.399811 0.375793 0.352295 -0.425110 0.381226 0.357758 -0.450470 0.386871 0.363403 -0.475891 0.392456 0.368988 -0.501892 0.397980 0.374481 -0.528656 0.403625 0.380188 -0.555786 0.409241 0.385712 -0.583405 0.414856 0.391357 -0.611206 0.420563 0.397064 -0.638855 0.426178 0.402649 -0.666412 0.431793 0.408325 -0.693726 0.437531 0.414062 -0.720398 0.443115 0.419586 -0.746765 0.448883 0.425262 -0.772583 0.454681 0.430939 -0.797577 0.460388 0.436432 -0.822021 0.466248 0.442078 -0.845520 0.471954 0.447479 -0.868317 0.477875 0.453064 -0.110687 0.336700 0.293976 -0.129150 0.341827 0.299011 -0.148804 0.347046 0.304169 -0.169434 0.352142 0.309204 -0.191101 0.357422 0.314453 -0.213501 0.362640 0.319580 -0.236664 0.368042 0.324951 -0.260498 0.373505 0.330353 -0.284729 0.378815 0.335663 -0.309509 0.384369 0.341095 -0.334564 0.389923 0.346619 -0.359772 0.395325 0.352020 -0.385284 0.400940 0.357635 -0.410767 0.406525 0.363251 -0.436066 0.412048 0.368713 -0.461334 0.417694 0.374390 -0.486969 0.423218 0.379883 -0.513428 0.428894 0.385529 -0.540466 0.434570 0.391266 -0.567780 0.440125 0.396820 -0.595459 0.445862 0.402466 -0.623322 0.451691 0.408234 -0.650848 0.457367 0.413757 -0.678345 0.463287 0.419403 -0.705444 0.469269 0.425140 -0.731873 0.475006 0.430603 -0.758026 0.481018 0.436249 -0.783356 0.486847 0.441772 -0.808197 0.492859 0.447357 -0.832275 0.498871 0.452942 -0.855408 0.504822 0.458344 -0.877777 0.510834 0.463989 -0.118042 0.366455 0.303925 -0.137085 0.371735 0.309082 -0.157135 0.376892 0.314209 -0.178314 0.382263 0.319458 -0.200409 0.387665 0.324799 -0.223145 0.393005 0.330048 -0.246643 0.398529 0.335510 -0.270813 0.404022 0.340973 -0.295227 0.409454 0.346344 -0.320190 0.415009 0.351868 -0.345459 0.420624 0.357452 -0.370758 0.426147 0.362976 -0.396240 0.431732 0.368530 -0.421661 0.437256 0.374115 -0.447083 0.442963 0.379761 -0.472412 0.448730 0.385376 -0.498352 0.454407 0.390961 -0.525085 0.460266 0.396667 -0.552338 0.466156 0.402344 -0.579803 0.471954 0.407928 -0.607544 0.477966 0.413635 -0.635376 0.484009 0.419281 -0.662811 0.489899 0.424835 -0.690125 0.496002 0.430450 -0.717041 0.502075 0.436127 -0.743225 0.508057 0.441620 -0.769073 0.514221 0.447205 -0.794098 0.520172 0.452637 -0.818573 0.526306 0.458191 -0.842316 0.532440 0.463837 -0.865082 0.538422 0.469299 -0.886993 0.544525 0.474884 -0.125763 0.396637 0.314087 -0.145294 0.402008 0.319336 -0.165985 0.407410 0.324677 -0.187500 0.412720 0.329926 -0.209961 0.418213 0.335388 -0.233002 0.423645 0.340698 -0.256866 0.429108 0.346222 -0.281219 0.434723 0.351746 -0.305908 0.440186 0.357178 -0.331024 0.445862 0.362823 -0.356445 0.451630 0.368378 -0.381775 0.457306 0.373932 -0.407349 0.463196 0.379608 -0.432800 0.469116 0.385284 -0.458038 0.474915 0.390808 -0.483673 0.480896 0.396515 -0.509918 0.486786 0.402039 -0.536926 0.492889 0.407776 -0.564301 0.498993 0.413452 -0.591827 0.505035 0.418976 -0.619629 0.511230 0.424652 -0.647369 0.517395 0.430359 -0.674744 0.523438 0.435883 -0.701782 0.529633 0.441498 -0.728455 0.535919 0.447083 -0.754456 0.541992 0.452515 -0.779968 0.548218 0.458069 -0.804657 0.554230 0.463531 -0.828796 0.560425 0.469147 -0.852112 0.566589 0.474731 -0.874420 0.572632 0.480225 -0.895935 0.578735 0.485840 -0.133789 0.426971 0.324402 -0.153870 0.432404 0.329803 -0.174927 0.437805 0.335083 -0.196930 0.443329 0.340546 -0.219757 0.449036 0.346069 -0.243164 0.454529 0.351471 -0.267273 0.460358 0.357056 -0.291870 0.466156 0.362671 -0.316681 0.471893 0.368134 -0.341980 0.477875 0.373810 -0.367462 0.483887 0.379517 -0.392853 0.489777 0.385010 -0.418427 0.495880 0.390686 -0.443756 0.501831 0.396240 -0.469055 0.508026 0.401947 -0.495056 0.514221 0.407654 -0.521606 0.520294 0.413208 -0.548767 0.526550 0.418823 -0.576294 0.532837 0.424530 -0.603882 0.539001 0.430054 -0.631653 0.545227 0.435699 -0.659302 0.551514 0.441315 -0.686462 0.557678 0.446747 -0.713379 0.563965 0.452362 -0.739594 0.570099 0.457825 -0.765442 0.576355 0.463409 -0.790619 0.582611 0.469025 -0.815002 0.588684 0.474487 -0.838715 0.594818 0.480103 -0.861633 0.600983 0.485687 -0.883514 0.606903 0.491150 -0.904480 0.612946 0.496765 -0.142151 0.457855 0.334961 -0.162750 0.463531 0.340424 -0.184174 0.469208 0.345795 -0.206604 0.475037 0.351318 -0.229797 0.480988 0.356903 -0.253448 0.486755 0.362396 -0.277802 0.492798 0.368011 -0.302582 0.498871 0.373627 -0.327637 0.504883 0.379211 -0.353027 0.511047 0.384888 -0.378510 0.517242 0.390503 -0.403900 0.523315 0.396088 -0.429474 0.529602 0.401825 -0.454712 0.535767 0.407379 -0.480316 0.542053 0.413086 -0.506561 0.548431 0.418701 -0.533386 0.554596 0.424286 -0.560669 0.560913 0.429901 -0.588318 0.567322 0.435577 -0.615967 0.573486 0.441071 -0.643616 0.579834 0.446625 -0.671112 0.586151 0.452209 -0.698029 0.592316 0.457642 -0.724731 0.598572 0.463257 -0.750641 0.604706 0.468750 -0.776154 0.610931 0.474365 -0.801056 0.617126 0.479980 -0.825043 0.623108 0.485413 -0.848419 0.629181 0.491028 -0.870880 0.635254 0.496613 -0.892303 0.641113 0.502106 -0.912811 0.647064 0.507629 -0.150787 0.490051 0.345673 -0.171783 0.496033 0.351196 -0.193695 0.501892 0.356628 -0.216461 0.507996 0.362244 -0.239960 0.514160 0.367859 -0.263947 0.520172 0.373383 -0.288483 0.526367 0.379028 -0.313416 0.532654 0.384735 -0.338593 0.538788 0.390228 -0.364075 0.545135 0.395935 -0.389526 0.551300 0.401550 -0.415070 0.557709 0.407227 -0.440521 0.564056 0.412903 -0.465759 0.570312 0.418427 -0.491669 0.576721 0.424164 -0.518188 0.583069 0.429779 -0.545135 0.589355 0.435303 -0.572571 0.595673 0.440918 -0.600311 0.602081 0.446503 -0.627838 0.608246 0.451935 -0.655457 0.614624 0.457520 -0.682709 0.620880 0.463135 -0.709442 0.626984 0.468597 -0.735840 0.633240 0.474213 -0.761475 0.639221 0.479675 -0.786713 0.645386 0.485260 -0.811249 0.651398 0.490875 -0.834839 0.657318 0.496338 -0.857758 0.663269 0.501984 -0.879852 0.669128 0.507507 -0.900757 0.674774 0.512878 -0.920776 0.680542 0.518433 -0.159637 0.523376 0.356506 -0.181152 0.529572 0.362122 -0.203400 0.535706 0.367584 -0.226532 0.541962 0.373230 -0.250305 0.548248 0.378876 -0.274506 0.554413 0.384460 -0.299255 0.560791 0.390106 -0.324432 0.567200 0.395844 -0.349670 0.573425 0.401398 -0.375183 0.579834 0.407074 -0.400635 0.586121 0.412628 -0.426178 0.592529 0.418274 -0.451569 0.598969 0.423981 -0.476898 0.605255 0.429535 -0.503082 0.611633 0.435150 -0.529816 0.618011 0.440765 -0.556915 0.624268 0.446228 -0.584503 0.630585 0.451843 -0.612152 0.636902 0.457367 -0.639679 0.642975 0.462860 -0.667084 0.649231 0.468414 -0.694031 0.655243 0.473938 -0.720581 0.661377 0.479523 -0.746735 0.667480 0.485168 -0.772095 0.673309 0.490631 -0.796967 0.679321 0.496216 -0.821136 0.685181 0.501831 -0.844391 0.690857 0.507202 -0.866882 0.696625 0.512756 -0.888458 0.702301 0.518280 -0.908966 0.707764 0.523590 -0.928436 0.713257 0.528992 -0.168854 0.557556 0.367432 -0.190735 0.563965 0.373108 -0.213379 0.570160 0.378601 -0.236786 0.576538 0.384308 -0.260803 0.582916 0.389984 -0.285248 0.589203 0.395538 -0.310150 0.595642 0.401215 -0.335297 0.601929 0.406769 -0.360748 0.608368 0.412476 -0.386353 0.614838 0.418152 -0.411743 0.621094 0.423706 -0.437164 0.627502 0.429352 -0.462494 0.633911 0.434998 -0.488098 0.640106 0.440491 -0.514526 0.646454 0.446075 -0.541473 0.652771 0.451660 -0.568726 0.658844 0.457062 -0.596375 0.665070 0.462708 -0.623962 0.671326 0.468292 -0.651306 0.677277 0.473785 -0.678589 0.683319 0.479370 -0.705292 0.689209 0.484863 -0.731598 0.695129 0.490479 -0.757416 0.701050 0.496063 -0.782471 0.706696 0.501526 -0.806976 0.712433 0.507050 -0.830750 0.718109 0.512604 -0.853577 0.723572 0.517975 -0.875641 0.729126 0.523438 -0.896759 0.734528 0.528839 -0.916748 0.739777 0.534149 -0.935699 0.745056 0.539490 -0.178192 0.592407 0.378479 -0.200470 0.598785 0.384155 -0.223450 0.605103 0.389709 -0.247131 0.611511 0.395386 -0.271423 0.617950 0.401093 -0.296021 0.624237 0.406586 -0.321136 0.630646 0.412354 -0.346405 0.636932 0.417847 -0.371857 0.643372 0.423553 -0.397430 0.649689 0.429230 -0.422760 0.655884 0.434662 -0.448181 0.662262 0.440399 -0.473511 0.668549 0.445953 -0.499451 0.674652 0.451416 -0.526062 0.680817 0.456970 -0.553192 0.687012 0.462555 -0.580444 0.692963 0.467987 -0.608063 0.699005 0.473633 -0.635437 0.704895 0.479126 -0.662781 0.710785 0.484680 -0.689819 0.716675 0.490326 -0.716309 0.722382 0.495789 -0.742371 0.728088 0.501404 -0.767853 0.733765 0.506958 -0.792511 0.739197 0.512329 -0.816711 0.744720 0.517853 -0.840027 0.750153 0.523315 -0.862488 0.755371 0.528625 -0.884094 0.760620 0.533997 -0.904633 0.765717 0.539215 -0.924225 0.770813 0.544525 -0.942657 0.775787 0.549744 -0.187805 0.627350 0.389557 -0.210449 0.633789 0.395233 -0.233673 0.640045 0.400848 -0.257690 0.646454 0.406464 -0.282043 0.652710 0.412048 -0.306915 0.659119 0.417725 -0.332123 0.665436 0.423431 -0.357422 0.671661 0.428986 -0.382904 0.677917 0.434570 -0.408478 0.684174 0.440186 -0.433716 0.690216 0.445679 -0.458984 0.696411 0.451233 -0.484589 0.702576 0.456818 -0.510742 0.708466 0.462280 -0.537506 0.714508 0.467896 -0.564636 0.720337 0.473358 -0.592133 0.726257 0.479004 -0.619629 0.732147 0.484558 -0.646912 0.737793 0.490051 -0.674103 0.743469 0.495636 -0.700867 0.749146 0.501251 -0.727051 0.754639 0.506653 -0.752808 0.760071 0.512177 -0.777954 0.765503 0.517700 -0.802307 0.770691 0.523041 -0.826111 0.775970 0.528503 -0.849060 0.781128 0.533844 -0.871033 0.786072 0.539093 -0.892212 0.791107 0.544373 -0.912292 0.795868 0.549438 -0.931335 0.800659 0.554657 -0.949280 0.805389 0.559723 -0.197510 0.662170 0.400665 -0.220490 0.668549 0.406342 -0.244049 0.674713 0.411896 -0.268250 0.681061 0.417603 -0.292786 0.687195 0.423126 -0.317810 0.693481 0.428802 -0.343140 0.699677 0.434448 -0.368378 0.705719 0.439911 -0.393951 0.711823 0.445526 -0.419403 0.717957 0.451080 -0.444580 0.723816 0.456512 -0.469879 0.729797 0.462128 -0.495728 0.735748 0.467743 -0.522034 0.741486 0.473236 -0.549011 0.747375 0.478821 -0.576141 0.752930 0.484314 -0.603607 0.758636 0.489899 -0.631042 0.764313 0.495483 -0.658234 0.769714 0.500977 -0.685150 0.775208 0.506500 -0.711670 0.780548 0.512024 -0.737549 0.785736 0.517426 -0.762939 0.790985 0.522888 -0.787750 0.796112 0.528351 -0.811737 0.801056 0.533600 -0.835144 0.806061 0.538940 -0.857605 0.810852 0.544128 -0.879211 0.815613 0.549347 -0.899933 0.820312 0.554535 -0.919525 0.824829 0.559570 -0.938110 0.829285 0.564545 -0.955505 0.833679 0.569519 -0.207428 0.696503 0.411774 -0.230591 0.702606 0.417297 -0.254486 0.708801 0.423004 -0.278931 0.714996 0.428680 -0.303589 0.720978 0.434113 -0.328735 0.727112 0.439789 -0.354126 0.733124 0.445374 -0.379425 0.738983 0.450836 -0.404846 0.744965 0.456390 -0.430206 0.750885 0.462006 -0.455353 0.756592 0.467468 -0.480743 0.762390 0.473083 -0.506653 0.767944 0.478516 -0.533356 0.773560 0.484192 -0.560364 0.779144 0.489777 -0.587524 0.784515 0.495209 -0.614960 0.790009 0.500824 -0.642303 0.795349 0.506378 -0.669220 0.800537 0.511780 -0.695923 0.805695 0.517303 -0.722137 0.810883 0.522736 -0.747711 0.815765 0.528046 -0.772827 0.820679 0.533447 -0.797302 0.825592 0.538818 -0.820923 0.830231 0.543976 -0.843842 0.834839 0.549194 -0.865875 0.839355 0.554260 -0.887085 0.843842 0.559418 -0.907349 0.848236 0.564453 -0.926422 0.852386 0.569275 -0.944489 0.856567 0.574219 -0.961395 0.860626 0.578949 -0.217438 0.730164 0.422882 -0.240875 0.736084 0.428345 -0.264984 0.742126 0.434021 -0.289612 0.748108 0.439636 -0.314392 0.753937 0.445099 -0.339630 0.759857 0.450714 -0.365021 0.765717 0.456238 -0.390259 0.771362 0.461731 -0.415710 0.777100 0.467316 -0.440979 0.782745 0.472961 -0.465973 0.788269 0.478424 -0.491669 0.793823 0.484070 -0.517822 0.799133 0.489532 -0.544525 0.804565 0.495056 -0.571655 0.809845 0.500702 -0.598816 0.814972 0.506104 -0.626129 0.820129 0.511658 -0.653290 0.825195 0.517151 -0.679993 0.830078 0.522491 -0.706421 0.835022 0.527954 -0.732361 0.839844 0.533295 -0.757629 0.844452 0.538513 -0.782410 0.849121 0.543854 -0.806305 0.853516 0.548950 -0.829712 0.858002 0.554138 -0.852264 0.862305 0.559235 -0.873871 0.866486 0.564209 -0.894592 0.870605 0.569122 -0.914368 0.874695 0.574097 -0.932983 0.878540 0.578735 -0.950531 0.882385 0.583466 -0.966919 0.886108 0.588135 -0.227570 0.762939 0.433838 -0.251251 0.768707 0.439362 -0.275574 0.774567 0.444916 -0.300262 0.780334 0.450531 -0.325195 0.785919 0.455933 -0.350464 0.791595 0.461578 -0.375854 0.797241 0.467163 -0.401123 0.802673 0.472656 -0.426453 0.808136 0.478271 -0.451447 0.813477 0.483795 -0.476654 0.818817 0.489380 -0.502502 0.824066 0.494904 -0.528809 0.829132 0.500397 -0.555664 0.834259 0.505981 -0.582794 0.839355 0.511505 -0.609863 0.844147 0.516846 -0.637054 0.848999 0.522339 -0.664093 0.853790 0.527802 -0.690491 0.858368 0.533051 -0.716644 0.862915 0.538361 -0.742279 0.867462 0.543732 -0.767120 0.871765 0.548798 -0.791595 0.876068 0.554016 -0.815155 0.880188 0.558990 -0.838165 0.884308 0.564087 -0.860229 0.888275 0.569031 -0.881409 0.892120 0.573792 -0.901733 0.895905 0.578613 -0.921021 0.899658 0.583344 -0.939117 0.903137 0.587891 -0.956177 0.906616 0.592438 -0.972046 0.910004 0.596863 -0.237762 0.794708 0.444824 -0.261688 0.800262 0.450287 -0.286133 0.805908 0.455872 -0.311005 0.811493 0.461456 -0.335938 0.816833 0.466888 -0.361237 0.822266 0.472504 -0.386566 0.827606 0.478149 -0.411743 0.832764 0.483643 -0.436951 0.838013 0.489227 -0.461853 0.843018 0.494629 -0.487274 0.848022 0.500305 -0.513336 0.853027 0.505829 -0.539734 0.857819 0.511230 -0.566620 0.862640 0.516754 -0.593719 0.867340 0.522217 -0.620697 0.871857 0.527527 -0.647766 0.876404 0.532898 -0.674500 0.880859 0.538239 -0.700653 0.885132 0.543457 -0.726501 0.889374 0.548645 -0.751740 0.893433 0.553772 -0.776398 0.897522 0.558868 -0.800446 0.901459 0.563934 -0.823639 0.905243 0.568787 -0.846191 0.909027 0.573700 -0.867920 0.912628 0.578522 -0.888672 0.916107 0.583099 -0.908478 0.919586 0.587769 -0.927277 0.922943 0.592316 -0.944916 0.926117 0.596649 -0.961487 0.929260 0.601013 -0.976776 0.932220 0.605164 -0.248016 0.825378 0.455688 -0.272095 0.830658 0.461182 -0.296692 0.836029 0.466736 -0.321625 0.841339 0.472382 -0.346619 0.846405 0.477875 -0.371887 0.851593 0.483459 -0.397186 0.856628 0.489044 -0.422272 0.861481 0.494537 -0.447357 0.866425 0.500153 -0.472198 0.871155 0.505554 -0.497803 0.875885 0.511078 -0.524017 0.880524 0.516632 -0.550507 0.884979 0.521942 -0.577393 0.889465 0.527374 -0.604431 0.893890 0.532776 -0.631287 0.898041 0.537994 -0.658173 0.902283 0.543304 -0.684631 0.906342 0.548553 -0.710541 0.910248 0.553650 -0.736084 0.914154 0.558746 -0.760925 0.917877 0.563660 -0.785278 0.921600 0.568665 -0.808929 0.925201 0.573578 -0.831787 0.928589 0.578247 -0.853882 0.932037 0.582977 -0.875183 0.935333 0.587646 -0.895477 0.938446 0.592102 -0.914856 0.941559 0.596527 -0.933167 0.944519 0.600922 -0.950348 0.947388 0.605042 -0.966431 0.950165 0.609192 -0.981201 0.952728 0.613159 -0.258270 0.854797 0.466583 -0.282501 0.859772 0.472107 -0.307190 0.864868 0.477692 -0.332153 0.869843 0.483307 -0.357178 0.874603 0.488770 -0.382385 0.879517 0.494385 -0.407501 0.884094 0.499847 -0.432556 0.888763 0.505432 -0.457489 0.893341 0.510925 -0.482513 0.897736 0.516357 -0.508270 0.902130 0.521790 -0.534546 0.906433 0.527222 -0.561096 0.910553 0.532532 -0.587982 0.914703 0.537872 -0.614929 0.918701 0.543213 -0.641632 0.922546 0.548309 -0.668243 0.926392 0.553436 -0.694336 0.930054 0.558502 -0.720062 0.933685 0.563507 -0.745270 0.937225 0.568512 -0.769775 0.940582 0.573303 -0.793762 0.943909 0.578156 -0.816986 0.947174 0.582855 -0.839478 0.950226 0.587402 -0.861206 0.953247 0.591980 -0.882050 0.956177 0.596436 -0.901886 0.958923 0.600708 -0.920776 0.961670 0.604950 -0.938660 0.964264 0.608978 -0.955383 0.966797 0.613037 -0.970978 0.969208 0.616974 -0.985291 0.971497 0.620697 -0.268524 0.882660 0.477539 -0.292847 0.887390 0.483063 -0.317627 0.892120 0.488647 -0.342590 0.896759 0.494263 -0.367645 0.901245 0.499725 -0.392792 0.905731 0.505280 -0.417725 0.910034 0.510742 -0.442719 0.914368 0.516235 -0.467499 0.918610 0.521637 -0.492737 0.922607 0.527039 -0.518585 0.926666 0.532379 -0.544983 0.930603 0.537720 -0.571503 0.934357 0.542938 -0.598297 0.938171 0.548157 -0.625122 0.941803 0.553345 -0.651642 0.945282 0.558380 -0.678009 0.948700 0.563416 -0.703796 0.951996 0.568237 -0.729218 0.955231 0.573212 -0.754120 0.958466 0.578033 -0.778229 0.961395 0.582642 -0.801849 0.964355 0.587311 -0.824799 0.967255 0.591827 -0.846802 0.969910 0.596222 -0.868103 0.972626 0.600586 -0.888519 0.975159 0.604828 -0.907928 0.977570 0.608856 -0.926422 0.979919 0.612946 -0.943756 0.982147 0.616760 -0.960083 0.984314 0.620575 -0.975189 0.986420 0.624268 -0.989044 0.988373 0.627716 -0.041870 0.040344 0.207794 -0.054779 0.041718 0.210358 -0.067902 0.043152 0.213074 -0.081665 0.044617 0.215790 -0.096497 0.046143 0.218689 -0.112610 0.047760 0.221771 -0.129791 0.049408 0.224823 -0.148102 0.051147 0.228058 -0.167419 0.052887 0.231354 -0.187592 0.054749 0.234833 -0.208588 0.056702 0.238403 -0.230225 0.058624 0.241974 -0.252563 0.060669 0.245758 -0.275452 0.062775 0.249634 -0.298737 0.064911 0.253510 -0.322510 0.067169 0.257568 -0.346619 0.069519 0.261719 -0.370789 0.071808 0.265869 -0.395264 0.074310 0.270203 -0.419739 0.076843 0.274628 -0.444122 0.079376 0.279083 -0.468536 0.082092 0.283661 -0.493530 0.084839 0.288208 -0.519318 0.087677 0.292938 -0.545654 0.090607 0.297791 -0.572327 0.093567 0.302551 -0.599457 0.096710 0.307556 -0.626648 0.099976 0.312561 -0.653687 0.103210 0.317535 -0.680695 0.106598 0.322754 -0.707123 0.109985 0.327789 -0.733398 0.113586 0.333099 -0.045166 0.052643 0.212952 -0.058136 0.054169 0.215729 -0.071564 0.055786 0.218658 -0.085663 0.057434 0.221619 -0.100983 0.059143 0.224762 -0.117523 0.060974 0.227997 -0.135223 0.062805 0.231262 -0.153992 0.064728 0.234772 -0.173645 0.066742 0.238220 -0.194275 0.068817 0.241882 -0.215668 0.070953 0.245667 -0.237640 0.073151 0.249481 -0.260315 0.075439 0.253418 -0.283569 0.077820 0.257477 -0.307068 0.080200 0.261536 -0.331085 0.082764 0.265778 -0.355438 0.085388 0.270111 -0.379822 0.088043 0.274414 -0.404358 0.090820 0.278961 -0.428833 0.093628 0.283417 -0.453369 0.096619 0.288116 -0.478119 0.099701 0.292816 -0.503479 0.102783 0.297546 -0.529633 0.106079 0.302460 -0.556274 0.109375 0.307404 -0.583191 0.112762 0.312347 -0.610413 0.116302 0.317413 -0.637726 0.119904 0.322601 -0.664764 0.123505 0.327667 -0.691681 0.127319 0.332977 -0.718109 0.131104 0.338135 -0.744263 0.135071 0.343506 -0.048676 0.065796 0.218475 -0.061859 0.067566 0.221527 -0.075500 0.069397 0.224670 -0.090088 0.071228 0.227844 -0.105865 0.073242 0.231171 -0.122833 0.075226 0.234589 -0.141052 0.077332 0.238129 -0.160278 0.079559 0.241791 -0.180359 0.081757 0.245453 -0.201385 0.084167 0.249390 -0.223145 0.086578 0.253326 -0.245453 0.089081 0.257263 -0.268433 0.091736 0.261414 -0.291962 0.094421 0.265686 -0.315765 0.097198 0.269897 -0.340027 0.100128 0.274323 -0.364532 0.103119 0.278839 -0.389038 0.106140 0.283295 -0.413727 0.109283 0.287994 -0.438293 0.112549 0.292603 -0.462921 0.115875 0.297455 -0.488068 0.119324 0.302338 -0.513794 0.122772 0.307159 -0.540283 0.126434 0.312225 -0.567169 0.130157 0.317291 -0.594238 0.133942 0.322357 -0.621613 0.137848 0.327545 -0.648956 0.141785 0.332825 -0.675995 0.145782 0.338043 -0.702850 0.149933 0.343353 -0.729156 0.154022 0.348663 -0.755066 0.158325 0.354126 -0.052429 0.080109 0.224518 -0.065796 0.082153 0.227753 -0.079803 0.084229 0.231140 -0.094788 0.086395 0.234467 -0.111115 0.088623 0.238037 -0.128571 0.090942 0.241638 -0.147217 0.093384 0.245361 -0.166901 0.095917 0.249268 -0.187439 0.098511 0.253113 -0.208801 0.101227 0.257172 -0.230957 0.104034 0.261322 -0.253601 0.106903 0.265442 -0.276917 0.109894 0.269775 -0.300690 0.113037 0.274231 -0.324738 0.116150 0.278625 -0.349213 0.119415 0.283203 -0.373749 0.122711 0.287750 -0.398560 0.126190 0.292480 -0.423401 0.129761 0.297302 -0.447998 0.133331 0.302094 -0.472839 0.137085 0.307037 -0.498322 0.140869 0.312073 -0.524384 0.144684 0.317017 -0.551117 0.148682 0.322205 -0.578247 0.152771 0.327423 -0.605530 0.156860 0.332581 -0.632935 0.161102 0.337860 -0.660187 0.165314 0.343109 -0.687286 0.169708 0.348541 -0.714050 0.174164 0.354004 -0.740204 0.178589 0.359375 -0.765991 0.183197 0.364868 -0.056396 0.095978 0.230927 -0.070007 0.098328 0.234406 -0.084351 0.100708 0.237854 -0.099884 0.103241 0.241516 -0.116730 0.105804 0.245300 -0.134674 0.108490 0.249054 -0.153839 0.111267 0.253052 -0.173920 0.114197 0.257080 -0.194855 0.117126 0.261078 -0.216644 0.120239 0.265350 -0.239136 0.123413 0.269623 -0.262085 0.126648 0.274017 -0.285706 0.130005 0.278503 -0.309662 0.133392 0.282990 -0.334015 0.136932 0.287628 -0.358643 0.140594 0.292358 -0.383423 0.144257 0.297058 -0.408325 0.148071 0.301941 -0.433197 0.152008 0.306915 -0.457886 0.155914 0.311829 -0.483032 0.160004 0.316895 -0.508942 0.164154 0.322052 -0.535278 0.168304 0.327148 -0.562286 0.172638 0.332428 -0.589600 0.177032 0.337738 -0.616974 0.181427 0.342987 -0.644470 0.185974 0.348389 -0.671631 0.190491 0.353699 -0.698669 0.195160 0.359222 -0.725281 0.199890 0.364746 -0.751282 0.204559 0.370148 -0.776886 0.209473 0.375763 -0.060638 0.113647 0.237762 -0.074554 0.116364 0.241425 -0.089294 0.119080 0.245117 -0.105347 0.121918 0.248962 -0.122742 0.124939 0.252930 -0.141205 0.127899 0.256866 -0.160797 0.131073 0.260986 -0.181366 0.134369 0.265228 -0.202637 0.137634 0.269440 -0.224823 0.141083 0.273895 -0.247650 0.144623 0.278381 -0.270966 0.148163 0.282867 -0.294800 0.151917 0.287506 -0.319000 0.155609 0.292145 -0.343628 0.159546 0.296936 -0.368378 0.163513 0.301819 -0.393250 0.167511 0.306671 -0.418274 0.171661 0.311676 -0.443207 0.175903 0.316772 -0.467987 0.180145 0.321808 -0.493561 0.184540 0.327026 -0.519775 0.188995 0.332306 -0.546448 0.193451 0.337433 -0.573669 0.198090 0.342834 -0.601013 0.202606 0.348114 -0.628601 0.207397 0.353577 -0.656097 0.212189 0.359100 -0.683228 0.217010 0.364471 -0.710083 0.221924 0.369995 -0.736542 0.226898 0.375610 -0.762390 0.231842 0.381104 -0.787720 0.236969 0.386688 -0.065125 0.133148 0.244995 -0.079376 0.136169 0.248871 -0.094635 0.139221 0.252716 -0.111237 0.142456 0.256775 -0.129150 0.145782 0.260895 -0.148071 0.149078 0.265045 -0.168121 0.152618 0.269318 -0.189117 0.156219 0.273773 -0.210815 0.159790 0.278168 -0.233368 0.163605 0.282745 -0.256378 0.167389 0.287292 -0.280060 0.171356 0.291992 -0.304230 0.175415 0.296844 -0.328644 0.179474 0.301575 -0.353424 0.183655 0.306549 -0.378387 0.187988 0.311554 -0.403351 0.192261 0.316528 -0.428406 0.196686 0.321686 -0.453400 0.201263 0.326904 -0.478424 0.205750 0.332031 -0.504333 0.210480 0.337311 -0.530914 0.215179 0.342712 -0.557861 0.219910 0.347992 -0.585205 0.224823 0.353424 -0.612671 0.229614 0.358765 -0.640289 0.234619 0.364319 -0.667755 0.239655 0.369873 -0.694794 0.244690 0.375305 -0.721497 0.249847 0.380951 -0.747772 0.255035 0.386597 -0.773376 0.260162 0.392090 -0.798523 0.265472 0.397766 -0.069855 0.154297 0.252625 -0.084564 0.157654 0.256653 -0.100311 0.161041 0.260712 -0.117493 0.164581 0.264923 -0.135895 0.168243 0.269226 -0.155304 0.171906 0.273560 -0.175842 0.175720 0.278046 -0.197205 0.179657 0.282623 -0.219330 0.183594 0.287140 -0.242157 0.187683 0.291901 -0.265533 0.191803 0.296570 -0.289520 0.196045 0.301453 -0.313904 0.200409 0.306427 -0.338470 0.204742 0.311310 -0.363525 0.209259 0.316406 -0.388580 0.213837 0.321564 -0.413635 0.218414 0.326630 -0.438751 0.223145 0.331909 -0.463684 0.227936 0.337128 -0.489136 0.232697 0.342438 -0.515381 0.237640 0.347839 -0.542084 0.242523 0.353149 -0.569397 0.247559 0.358643 -0.596924 0.252686 0.364197 -0.624512 0.257721 0.369598 -0.652100 0.262909 0.375183 -0.679443 0.268219 0.380829 -0.706299 0.273376 0.386292 -0.732941 0.278717 0.391907 -0.759003 0.284119 0.397614 -0.784363 0.289459 0.403107 -0.809174 0.294861 0.408844 -0.074890 0.176971 0.260590 -0.090057 0.180664 0.264801 -0.106384 0.184387 0.269043 -0.124084 0.188263 0.273468 -0.143005 0.192200 0.277924 -0.162933 0.196198 0.282379 -0.183868 0.200287 0.287018 -0.205566 0.204468 0.291656 -0.228088 0.208740 0.296448 -0.251312 0.213165 0.301331 -0.274963 0.217529 0.306183 -0.299164 0.222046 0.311188 -0.323822 0.226715 0.316254 -0.348633 0.231293 0.321289 -0.373718 0.236053 0.326508 -0.398926 0.240936 0.331757 -0.424011 0.245728 0.336914 -0.449127 0.250732 0.342285 -0.474304 0.255737 0.347717 -0.500153 0.260742 0.353027 -0.526733 0.265869 0.358521 -0.553680 0.270966 0.363922 -0.581116 0.276215 0.369446 -0.608795 0.281555 0.375061 -0.636353 0.286743 0.380493 -0.663940 0.292145 0.386139 -0.691193 0.297577 0.391785 -0.717926 0.302917 0.397308 -0.744324 0.308380 0.402985 -0.770172 0.313934 0.408722 -0.795227 0.319336 0.414215 -0.819794 0.324921 0.419922 -0.080261 0.201141 0.268890 -0.095917 0.205139 0.273346 -0.112793 0.209106 0.277710 -0.131073 0.213287 0.282288 -0.150513 0.217560 0.286926 -0.170868 0.221771 0.291504 -0.192261 0.226227 0.296326 -0.214294 0.230591 0.301086 -0.237244 0.235199 0.306030 -0.260742 0.239838 0.311066 -0.284668 0.244476 0.316010 -0.309143 0.249298 0.321167 -0.333984 0.254181 0.326385 -0.358917 0.259003 0.331482 -0.384186 0.264008 0.336761 -0.409424 0.269104 0.342133 -0.434570 0.274109 0.347443 -0.459747 0.279297 0.352875 -0.485046 0.284363 0.358215 -0.511383 0.289703 0.363739 -0.538208 0.295013 0.369324 -0.565399 0.300262 0.374756 -0.592987 0.305695 0.380371 -0.620728 0.311188 0.386017 -0.648285 0.316528 0.391479 -0.675751 0.322083 0.397186 -0.702881 0.327637 0.402832 -0.729401 0.333099 0.408417 -0.755615 0.338684 0.414093 -0.781067 0.344177 0.419617 -0.806000 0.349823 0.425323 -0.830261 0.355438 0.431000 -0.085907 0.226593 0.277588 -0.102142 0.230865 0.282166 -0.119598 0.235107 0.286713 -0.138428 0.239532 0.291382 -0.158203 0.243988 0.296082 -0.179138 0.248566 0.300995 -0.200928 0.253235 0.305908 -0.223389 0.257904 0.310822 -0.246613 0.262726 0.315918 -0.270477 0.267639 0.321045 -0.294617 0.272491 0.326111 -0.319336 0.277527 0.331360 -0.344391 0.282623 0.336700 -0.369446 0.287659 0.341888 -0.394745 0.292877 0.347290 -0.419952 0.298004 0.352600 -0.445190 0.303345 0.358124 -0.470459 0.308685 0.363617 -0.496246 0.313965 0.369049 -0.522827 0.319427 0.374634 -0.549927 0.324921 0.380249 -0.577209 0.330292 0.385712 -0.604950 0.335846 0.391357 -0.632751 0.341431 0.397034 -0.660217 0.346924 0.402527 -0.687592 0.352539 0.408295 -0.714539 0.358185 0.413971 -0.740845 0.363678 0.419464 -0.766815 0.369385 0.425171 -0.791992 0.374939 0.430695 -0.816681 0.380585 0.436401 -0.840546 0.386261 0.442078 -0.091888 0.253174 0.286591 -0.108734 0.257751 0.291290 -0.126740 0.262207 0.295959 -0.146088 0.266937 0.300873 -0.166412 0.271606 0.305664 -0.187744 0.276428 0.310699 -0.209930 0.281372 0.315796 -0.232758 0.286224 0.320770 -0.256317 0.291260 0.325989 -0.280426 0.296356 0.331238 -0.304810 0.301392 0.336395 -0.329742 0.306610 0.341766 -0.354950 0.311920 0.347168 -0.380096 0.317108 0.352448 -0.405457 0.322510 0.357941 -0.430695 0.327789 0.363403 -0.455963 0.333252 0.368866 -0.481445 0.338776 0.374481 -0.507538 0.344208 0.379974 -0.534424 0.349731 0.385559 -0.561737 0.355316 0.391235 -0.589233 0.360809 0.396759 -0.617004 0.366455 0.402405 -0.644806 0.372101 0.408142 -0.672150 0.377625 0.413666 -0.699371 0.383331 0.419373 -0.725952 0.388855 0.424896 -0.752197 0.394592 0.430573 -0.777893 0.400299 0.436249 -0.802765 0.405792 0.441772 -0.827118 0.411499 0.447418 -0.850647 0.417145 0.453064 -0.098267 0.280823 0.295837 -0.115692 0.285583 0.300720 -0.134277 0.290344 0.305542 -0.154083 0.295288 0.310577 -0.174896 0.300079 0.315460 -0.196625 0.305176 0.320648 -0.219269 0.310303 0.325867 -0.242371 0.315308 0.330963 -0.266205 0.320557 0.336273 -0.290588 0.325867 0.341614 -0.315216 0.331024 0.346863 -0.340302 0.336426 0.352325 -0.365601 0.341858 0.357819 -0.390900 0.347198 0.363220 -0.416290 0.352722 0.368744 -0.441498 0.358124 0.374207 -0.466827 0.363678 0.379822 -0.492676 0.369324 0.385437 -0.519073 0.374817 0.390961 -0.546204 0.380432 0.396637 -0.573700 0.386108 0.402283 -0.601257 0.391632 0.407867 -0.629059 0.397308 0.413513 -0.656799 0.402985 0.419189 -0.684082 0.408569 0.424774 -0.710999 0.414276 0.430420 -0.737488 0.419830 0.435974 -0.763458 0.425476 0.441650 -0.788849 0.431183 0.447266 -0.813385 0.436676 0.452789 -0.837402 0.442383 0.458405 -0.860504 0.448059 0.464111 -0.104950 0.309357 0.305420 -0.122894 0.314209 0.310303 -0.142120 0.319275 0.315369 -0.162445 0.324371 0.320526 -0.183655 0.329407 0.325592 -0.205841 0.334656 0.330841 -0.228760 0.339935 0.336121 -0.252258 0.345123 0.341370 -0.276367 0.350494 0.346771 -0.300964 0.355927 0.352203 -0.325836 0.361298 0.357574 -0.351044 0.366791 0.363129 -0.376312 0.372192 0.368469 -0.401764 0.377716 0.374084 -0.427246 0.383331 0.379669 -0.452362 0.388794 0.385162 -0.477875 0.394470 0.390778 -0.504059 0.400177 0.396484 -0.530792 0.405640 0.401978 -0.558105 0.411346 0.407684 -0.585693 0.417023 0.413391 -0.613342 0.422577 0.418915 -0.641144 0.428253 0.424591 -0.668610 0.433807 0.430145 -0.695831 0.439514 0.435852 -0.722626 0.445221 0.441498 -0.748810 0.450867 0.446991 -0.774567 0.456726 0.452637 -0.799622 0.462585 0.458282 -0.823883 0.468292 0.463867 -0.847412 0.474182 0.469513 -0.870178 0.480103 0.475220 -0.112061 0.338623 0.315247 -0.130554 0.343658 0.320251 -0.150330 0.348846 0.325470 -0.171112 0.354156 0.330719 -0.192780 0.359314 0.335876 -0.215302 0.364685 0.341217 -0.238617 0.370087 0.346619 -0.262360 0.375366 0.351929 -0.286743 0.380890 0.357391 -0.311523 0.386414 0.362946 -0.336548 0.391846 0.368347 -0.361908 0.397430 0.373932 -0.387207 0.402832 0.379395 -0.412720 0.408508 0.385040 -0.438171 0.414185 0.390656 -0.463348 0.419678 0.396179 -0.489166 0.425323 0.401886 -0.515686 0.431030 0.407532 -0.542572 0.436523 0.413116 -0.570068 0.442322 0.418762 -0.597809 0.448029 0.424469 -0.625458 0.453735 0.429993 -0.653198 0.459625 0.435699 -0.680481 0.465363 0.441254 -0.707520 0.471313 0.446869 -0.734100 0.477295 0.452484 -0.760010 0.483093 0.458008 -0.785431 0.489105 0.463684 -0.810181 0.495148 0.469360 -0.834106 0.501038 0.474915 -0.857300 0.507050 0.480652 -0.879578 0.513092 0.486389 -0.119507 0.368439 0.325348 -0.138550 0.373596 0.330444 -0.158813 0.378937 0.335754 -0.180084 0.384369 0.341095 -0.202118 0.389618 0.346344 -0.225006 0.395081 0.351776 -0.248627 0.400574 0.357269 -0.272614 0.405975 0.362671 -0.297241 0.411530 0.368195 -0.322113 0.416962 0.373627 -0.347382 0.422577 0.379272 -0.372894 0.428192 0.384918 -0.398193 0.433746 0.390350 -0.423737 0.439362 0.396057 -0.449127 0.445129 0.401733 -0.474426 0.450745 0.407318 -0.500580 0.456573 0.412964 -0.527374 0.462494 0.418610 -0.554504 0.468262 0.424194 -0.582123 0.474213 0.429840 -0.609711 0.480103 0.435394 -0.637512 0.486115 0.441071 -0.665131 0.492218 0.446716 -0.692261 0.498108 0.452209 -0.719086 0.504242 0.457855 -0.745422 0.510376 0.463531 -0.771027 0.516327 0.469086 -0.796143 0.522491 0.474792 -0.820587 0.528595 0.480499 -0.844086 0.534546 0.486084 -0.866882 0.540741 0.491852 -0.888641 0.546661 0.497467 -0.127289 0.398621 0.335602 -0.146820 0.403900 0.340790 -0.167572 0.409332 0.346222 -0.189270 0.414795 0.351624 -0.211700 0.420166 0.356995 -0.234955 0.425659 0.362518 -0.258881 0.431244 0.368073 -0.283142 0.436676 0.373505 -0.307953 0.442322 0.379120 -0.332977 0.447906 0.384613 -0.358368 0.453644 0.390228 -0.383911 0.459534 0.395905 -0.409302 0.465240 0.401459 -0.434784 0.471161 0.407135 -0.460083 0.477142 0.412811 -0.485718 0.483032 0.418365 -0.512177 0.489105 0.424042 -0.539154 0.495209 0.429749 -0.566498 0.501221 0.435242 -0.594177 0.507355 0.440948 -0.621979 0.513489 0.446564 -0.649506 0.519562 0.452087 -0.676971 0.525818 0.457703 -0.703888 0.531860 0.463226 -0.730499 0.538055 0.468933 -0.756561 0.544281 0.474640 -0.781891 0.550385 0.480225 -0.806671 0.556549 0.485992 -0.830688 0.562744 0.491730 -0.853851 0.568726 0.497284 -0.876221 0.574860 0.503052 -0.897552 0.581055 0.508759 -0.135345 0.429016 0.346069 -0.155457 0.434326 0.351349 -0.176636 0.439850 0.356842 -0.198792 0.445465 0.362396 -0.221527 0.450958 0.367767 -0.245148 0.456726 0.373383 -0.269226 0.462524 0.378967 -0.293793 0.468231 0.384491 -0.318787 0.474152 0.390106 -0.343933 0.479980 0.395630 -0.369446 0.486023 0.401337 -0.394989 0.492065 0.406982 -0.420380 0.498047 0.412537 -0.445801 0.504181 0.418182 -0.471191 0.510376 0.423920 -0.497162 0.516388 0.429474 -0.523895 0.522644 0.435150 -0.551056 0.528900 0.440796 -0.578430 0.535034 0.446289 -0.606201 0.541321 0.451935 -0.633850 0.547455 0.457458 -0.661438 0.553741 0.463135 -0.688690 0.560028 0.468781 -0.715393 0.566162 0.474396 -0.741730 0.572418 0.480103 -0.767517 0.578735 0.485840 -0.792480 0.584778 0.491455 -0.816956 0.590973 0.497162 -0.840607 0.597137 0.502899 -0.863312 0.603149 0.508484 -0.885223 0.609253 0.514191 -0.906036 0.615051 0.519745 -0.143768 0.459991 0.356720 -0.164307 0.465546 0.362122 -0.185974 0.471375 0.367645 -0.208466 0.477264 0.373230 -0.231598 0.483063 0.378693 -0.255432 0.489014 0.384369 -0.279846 0.495087 0.389954 -0.304504 0.501038 0.395447 -0.329712 0.507172 0.401154 -0.355011 0.513184 0.406677 -0.380493 0.519409 0.412415 -0.406067 0.525696 0.418060 -0.431458 0.531799 0.423615 -0.456818 0.538147 0.429321 -0.482452 0.544434 0.434967 -0.508667 0.550629 0.440491 -0.535583 0.556946 0.446136 -0.562988 0.563354 0.451813 -0.590485 0.569580 0.457275 -0.618256 0.575867 0.462982 -0.645721 0.582031 0.468536 -0.673218 0.588379 0.474243 -0.700226 0.594696 0.479950 -0.726715 0.600830 0.485535 -0.752777 0.607056 0.491302 -0.778198 0.613251 0.497009 -0.802887 0.619263 0.502594 -0.826965 0.625397 0.508301 -0.850250 0.631439 0.514008 -0.872528 0.637329 0.519592 -0.893951 0.643402 0.525269 -0.914276 0.649139 0.530731 -0.152466 0.492310 0.367493 -0.173431 0.498108 0.372925 -0.195526 0.504211 0.378540 -0.218384 0.510284 0.384186 -0.241791 0.516296 0.389679 -0.265930 0.522491 0.395325 -0.290436 0.528595 0.400909 -0.315430 0.534851 0.406525 -0.340729 0.541168 0.412292 -0.366058 0.547363 0.417786 -0.391632 0.553711 0.423492 -0.417175 0.560059 0.429169 -0.442505 0.566345 0.434662 -0.467865 0.572723 0.440399 -0.493805 0.579132 0.446014 -0.520264 0.585358 0.451477 -0.547424 0.591675 0.457153 -0.574738 0.597961 0.462646 -0.602417 0.604279 0.468353 -0.630127 0.610657 0.474121 -0.657532 0.616821 0.479675 -0.684753 0.623077 0.485352 -0.711609 0.629333 0.491150 -0.737823 0.635376 0.496735 -0.763580 0.641571 0.502472 -0.788727 0.647644 0.508240 -0.812988 0.653534 0.513702 -0.836700 0.659515 0.519440 -0.859436 0.665283 0.524994 -0.881378 0.671204 0.530579 -0.902374 0.676971 0.536224 -0.922180 0.682556 0.541656 -0.161407 0.525726 0.378418 -0.182831 0.531769 0.383911 -0.205292 0.537994 0.389557 -0.228516 0.544281 0.395172 -0.252197 0.550446 0.400787 -0.276550 0.556824 0.406403 -0.301208 0.563019 0.411926 -0.326416 0.569427 0.417633 -0.351776 0.575836 0.423370 -0.377197 0.582062 0.428925 -0.402740 0.588501 0.434540 -0.428253 0.594940 0.440186 -0.453491 0.601196 0.445709 -0.479034 0.607605 0.451385 -0.505249 0.614044 0.457001 -0.531952 0.620270 0.462555 -0.559204 0.626587 0.468201 -0.586639 0.632782 0.473816 -0.614288 0.639069 0.479523 -0.641937 0.645355 0.485260 -0.669159 0.651367 0.490845 -0.696198 0.657562 0.496582 -0.722778 0.663666 0.502350 -0.748657 0.669586 0.507904 -0.774139 0.675568 0.513580 -0.798920 0.681488 0.519318 -0.822845 0.687225 0.524841 -0.846161 0.693024 0.530457 -0.868469 0.698608 0.535950 -0.889954 0.704254 0.541504 -0.910461 0.709839 0.547028 -0.929779 0.715149 0.552338 -0.170593 0.559967 0.389374 -0.192474 0.566162 0.394897 -0.215271 0.572540 0.400604 -0.238678 0.578796 0.406097 -0.262726 0.585175 0.411804 -0.287323 0.591614 0.417511 -0.312164 0.597931 0.423096 -0.337402 0.604340 0.428741 -0.362915 0.610779 0.434387 -0.388306 0.617035 0.439911 -0.413818 0.623505 0.445587 -0.439331 0.629944 0.451233 -0.464478 0.636139 0.456726 -0.490295 0.642517 0.462402 -0.516602 0.648651 0.467926 -0.543610 0.654938 0.473633 -0.570984 0.661224 0.479370 -0.598419 0.667236 0.484955 -0.626068 0.673462 0.490723 -0.653534 0.679504 0.496399 -0.680664 0.685455 0.502075 -0.707367 0.691406 0.507751 -0.733673 0.697357 0.513458 -0.759308 0.703064 0.519043 -0.784454 0.708862 0.524719 -0.808777 0.714447 0.530182 -0.832428 0.720123 0.535797 -0.855286 0.725677 0.541382 -0.877167 0.731049 0.546783 -0.898224 0.736450 0.552246 -0.918213 0.741760 0.557709 -0.937012 0.746887 0.562927 -0.179993 0.594788 0.400482 -0.202240 0.601044 0.405975 -0.225403 0.607483 0.411713 -0.249054 0.613770 0.417236 -0.273376 0.620209 0.422943 -0.298126 0.626617 0.428619 -0.323090 0.632904 0.434113 -0.348511 0.639343 0.439819 -0.373932 0.645721 0.445465 -0.399384 0.651947 0.450958 -0.424896 0.658295 0.456573 -0.450226 0.664642 0.462280 -0.475525 0.670776 0.467804 -0.501556 0.676941 0.473511 -0.528076 0.683014 0.479095 -0.555298 0.689148 0.484833 -0.582764 0.695221 0.490601 -0.610138 0.701111 0.496124 -0.637695 0.707092 0.501923 -0.665009 0.713043 0.507629 -0.691803 0.718689 0.513184 -0.718353 0.724518 0.518890 -0.744354 0.730225 0.524567 -0.769684 0.735687 0.530029 -0.794434 0.741302 0.535675 -0.818359 0.746613 0.541107 -0.841705 0.752045 0.546631 -0.864136 0.757385 0.552155 -0.885529 0.762482 0.557404 -0.906128 0.767609 0.562775 -0.925629 0.772705 0.568085 -0.943878 0.777466 0.573242 -0.189545 0.629608 0.411377 -0.212250 0.636047 0.417084 -0.235687 0.642426 0.422760 -0.259552 0.648682 0.428345 -0.284088 0.655121 0.433990 -0.308990 0.661469 0.439667 -0.334106 0.667694 0.445129 -0.359528 0.673981 0.450806 -0.385040 0.680267 0.456421 -0.410431 0.686340 0.461975 -0.435852 0.692566 0.467651 -0.460938 0.698578 0.473267 -0.486633 0.704712 0.478973 -0.512878 0.710754 0.484650 -0.539581 0.716614 0.490265 -0.566833 0.722595 0.496002 -0.594299 0.728516 0.501740 -0.621735 0.734131 0.507355 -0.649109 0.739899 0.513031 -0.676239 0.745636 0.518738 -0.702850 0.751099 0.524261 -0.729095 0.756653 0.529877 -0.754791 0.762146 0.535522 -0.779724 0.767334 0.540955 -0.804169 0.772705 0.546509 -0.827698 0.777740 0.551849 -0.850647 0.782928 0.557312 -0.872620 0.787964 0.562622 -0.893585 0.792816 0.567810 -0.913696 0.797699 0.573120 -0.932648 0.802460 0.578278 -0.950409 0.806976 0.583282 -0.199280 0.664429 0.422485 -0.222351 0.670776 0.428162 -0.246033 0.677094 0.433838 -0.270172 0.683258 0.439392 -0.294861 0.689545 0.444977 -0.319916 0.695801 0.450684 -0.345062 0.701843 0.456146 -0.370544 0.708008 0.461823 -0.396057 0.714172 0.467499 -0.421326 0.720062 0.473114 -0.446686 0.726105 0.478821 -0.471832 0.731934 0.484406 -0.497711 0.737885 0.490112 -0.524200 0.743713 0.495880 -0.551025 0.749359 0.501465 -0.578339 0.755096 0.507202 -0.605804 0.760773 0.512878 -0.633087 0.766205 0.518463 -0.660309 0.771729 0.524139 -0.687225 0.777191 0.529724 -0.713593 0.782440 0.535217 -0.739502 0.787689 0.540802 -0.764740 0.792786 0.546204 -0.789490 0.797943 0.551697 -0.813538 0.802887 0.557129 -0.836761 0.807770 0.562378 -0.859192 0.812592 0.567688 -0.880768 0.817352 0.572998 -0.901306 0.821930 0.578033 -0.920837 0.826477 0.583130 -0.939392 0.830933 0.588196 -0.956604 0.835175 0.593048 -0.209259 0.698669 0.433533 -0.232574 0.704926 0.439240 -0.256500 0.711151 0.444885 -0.280823 0.717163 0.450409 -0.305634 0.723267 0.455963 -0.330841 0.729370 0.461731 -0.356049 0.735260 0.467255 -0.381500 0.741241 0.472961 -0.406860 0.747070 0.478485 -0.432220 0.752899 0.484283 -0.457367 0.758728 0.489990 -0.482697 0.764374 0.495575 -0.508850 0.770050 0.501343 -0.535492 0.775696 0.507050 -0.562439 0.781097 0.512604 -0.589691 0.786621 0.518311 -0.617157 0.791992 0.523987 -0.644287 0.797211 0.529449 -0.671356 0.802490 0.535095 -0.697998 0.807678 0.540710 -0.723999 0.812561 0.546051 -0.749634 0.817627 0.551575 -0.774597 0.822449 0.556885 -0.798981 0.827240 0.562286 -0.822632 0.831970 0.567566 -0.845398 0.836487 0.572723 -0.867493 0.841034 0.577911 -0.888611 0.845459 0.583008 -0.908661 0.849731 0.587952 -0.927704 0.853943 0.592957 -0.945709 0.858063 0.597809 -0.962402 0.862030 0.602509 -0.219299 0.732300 0.444580 -0.242889 0.738342 0.450256 -0.267059 0.744385 0.455872 -0.291504 0.750214 0.461395 -0.316467 0.756165 0.467072 -0.341736 0.762115 0.472809 -0.366943 0.767792 0.478394 -0.392395 0.773529 0.484131 -0.417664 0.779083 0.489716 -0.442902 0.784760 0.495422 -0.468018 0.790344 0.501190 -0.493591 0.795715 0.506775 -0.519928 0.801178 0.512482 -0.546722 0.806519 0.518188 -0.573669 0.811707 0.523712 -0.600983 0.816956 0.529297 -0.628235 0.822052 0.534943 -0.655243 0.826965 0.540436 -0.682068 0.831970 0.545959 -0.708282 0.836761 0.551300 -0.734131 0.841492 0.556732 -0.759491 0.846222 0.562134 -0.784058 0.850708 0.567322 -0.808075 0.855164 0.572571 -0.831360 0.859650 0.577789 -0.853760 0.863831 0.582764 -0.875305 0.868042 0.587860 -0.895996 0.872162 0.592834 -0.915588 0.876099 0.597595 -0.934204 0.879974 0.602356 -0.951569 0.883698 0.607025 -0.967834 0.887421 0.611572 -0.229431 0.765045 0.455597 -0.253235 0.770905 0.461243 -0.277618 0.776703 0.466919 -0.302185 0.782379 0.472504 -0.327271 0.788086 0.478241 -0.352417 0.793610 0.483856 -0.377777 0.799194 0.489594 -0.403168 0.804718 0.495270 -0.428314 0.810089 0.500885 -0.453430 0.815460 0.506592 -0.478668 0.820801 0.512329 -0.504456 0.825867 0.517883 -0.530914 0.831055 0.523560 -0.557770 0.836121 0.529144 -0.584778 0.841064 0.534698 -0.611938 0.845947 0.540283 -0.639130 0.850830 0.545807 -0.665985 0.855408 0.551147 -0.692444 0.860077 0.556641 -0.718414 0.864502 0.561859 -0.744019 0.869019 0.567169 -0.768951 0.873383 0.572479 -0.793213 0.877533 0.577545 -0.816864 0.881714 0.582642 -0.839722 0.885834 0.587708 -0.861664 0.889709 0.592590 -0.882782 0.893524 0.597443 -0.903076 0.897339 0.602203 -0.922150 0.900940 0.606842 -0.940338 0.904480 0.611481 -0.957184 0.907837 0.615875 -0.972931 0.911194 0.620300 -0.239624 0.796753 0.466644 -0.263672 0.802429 0.472382 -0.288147 0.808014 0.478119 -0.312866 0.813385 0.483704 -0.338013 0.818878 0.489471 -0.363190 0.824127 0.494995 -0.388489 0.829468 0.500763 -0.413757 0.834747 0.506470 -0.438812 0.839813 0.512024 -0.463837 0.844879 0.517731 -0.489319 0.849915 0.523407 -0.515198 0.854797 0.528870 -0.541809 0.859650 0.534546 -0.568695 0.864380 0.540131 -0.595642 0.869019 0.545471 -0.622742 0.873566 0.551025 -0.649658 0.877960 0.556305 -0.676300 0.882385 0.561737 -0.702576 0.886719 0.567078 -0.728271 0.890808 0.572205 -0.753510 0.894928 0.577393 -0.778137 0.898987 0.582550 -0.801971 0.902832 0.587463 -0.825195 0.906616 0.592438 -0.847717 0.910370 0.597321 -0.869232 0.913910 0.601990 -0.889954 0.917419 0.606720 -0.909668 0.920776 0.611237 -0.928375 0.924103 0.615784 -0.945984 0.927307 0.620209 -0.962402 0.930328 0.624390 -0.977661 0.933350 0.628601 -0.249908 0.827301 0.477783 -0.274109 0.832733 0.483551 -0.298584 0.837891 0.489136 -0.323547 0.843140 0.494843 -0.348663 0.848389 0.500641 -0.373810 0.853363 0.506195 -0.399078 0.858429 0.511932 -0.424286 0.863373 0.517609 -0.449158 0.868103 0.523132 -0.474182 0.872925 0.528748 -0.499817 0.877594 0.534363 -0.525940 0.882172 0.539856 -0.552521 0.886688 0.545349 -0.579346 0.890991 0.550781 -0.606323 0.895386 0.556183 -0.633331 0.899597 0.561554 -0.660004 0.903717 0.566803 -0.686401 0.907745 0.572052 -0.712372 0.911743 0.577271 -0.737793 0.915497 0.582275 -0.762665 0.919281 0.587341 -0.786926 0.922943 0.592316 -0.810394 0.926422 0.597076 -0.833252 0.929932 0.601868 -0.855316 0.933289 0.606628 -0.876434 0.936432 0.611145 -0.896729 0.939636 0.615631 -0.915985 0.942596 0.619965 -0.934235 0.945587 0.624298 -0.951355 0.948425 0.628510 -0.967255 0.951080 0.632507 -0.982025 0.953766 0.636505 -0.260101 0.856567 0.488983 -0.284485 0.861664 0.494690 -0.309052 0.866577 0.500336 -0.334015 0.871552 0.506042 -0.359192 0.876434 0.511749 -0.384277 0.881134 0.517334 -0.409515 0.885864 0.523010 -0.434540 0.890533 0.528656 -0.459290 0.894897 0.534149 -0.484436 0.899384 0.539734 -0.510254 0.903748 0.545197 -0.536438 0.907928 0.550629 -0.563141 0.912140 0.556061 -0.589844 0.916077 0.561310 -0.616730 0.920105 0.566650 -0.643555 0.923981 0.571930 -0.669983 0.927704 0.576996 -0.696167 0.931458 0.582123 -0.721863 0.935028 0.587250 -0.746887 0.938446 0.592041 -0.771454 0.941833 0.596954 -0.795319 0.945160 0.601776 -0.818451 0.948242 0.606415 -0.840942 0.951355 0.610992 -0.862488 0.954315 0.615417 -0.883240 0.957214 0.619873 -0.903137 0.959991 0.624207 -0.921875 0.962677 0.628265 -0.939636 0.965210 0.632416 -0.956360 0.967712 0.636383 -0.971741 0.970032 0.640137 -0.986023 0.972321 0.643921 -0.270386 0.884399 0.500183 -0.294800 0.889191 0.505920 -0.319458 0.893799 0.511475 -0.344482 0.898376 0.517181 -0.369598 0.902954 0.522858 -0.394592 0.907318 0.528351 -0.419678 0.911652 0.533997 -0.444611 0.915955 0.539581 -0.469299 0.920044 0.544952 -0.494659 0.924164 0.550507 -0.520508 0.928070 0.555786 -0.546844 0.932007 0.561157 -0.573486 0.935822 0.566559 -0.600128 0.939453 0.571655 -0.626892 0.943054 0.576874 -0.653534 0.946564 0.582001 -0.679688 0.949921 0.587006 -0.705597 0.953217 0.591949 -0.730957 0.956482 0.596802 -0.755615 0.959503 0.601562 -0.779816 0.962555 0.606262 -0.803345 0.965485 0.610901 -0.826141 0.968201 0.615295 -0.848145 0.970917 0.619781 -0.869263 0.973480 0.623962 -0.889679 0.976044 0.628143 -0.909058 0.978455 0.632294 -0.927399 0.980743 0.636169 -0.944763 0.982971 0.640045 -0.960938 0.985107 0.643829 -0.975922 0.987091 0.647339 -0.989685 0.989044 0.650848 -0.042511 0.040894 0.226624 -0.055420 0.042267 0.229309 -0.068542 0.043640 0.232025 -0.082428 0.045166 0.234955 -0.097260 0.046722 0.237946 -0.113434 0.048340 0.241028 -0.130798 0.050049 0.244293 -0.149139 0.051727 0.247589 -0.168549 0.053558 0.251068 -0.188812 0.055450 0.254639 -0.209839 0.057373 0.258240 -0.231628 0.059357 0.262024 -0.254028 0.061432 0.265869 -0.276917 0.063538 0.269775 -0.300293 0.065765 0.273865 -0.324036 0.067993 0.277924 -0.348145 0.070312 0.282196 -0.372528 0.072754 0.286530 -0.396881 0.075195 0.290833 -0.421387 0.077728 0.295380 -0.445862 0.080414 0.299988 -0.470245 0.083069 0.304535 -0.495422 0.085846 0.309296 -0.521240 0.088776 0.314148 -0.547607 0.091675 0.318939 -0.574432 0.094757 0.323883 -0.601410 0.097870 0.328827 -0.628693 0.101105 0.333954 -0.655823 0.104431 0.339081 -0.682678 0.107788 0.344177 -0.709290 0.111328 0.349487 -0.735474 0.114960 0.354767 -0.045837 0.053223 0.231964 -0.058838 0.054779 0.234894 -0.072235 0.056366 0.237823 -0.086487 0.058075 0.240967 -0.101837 0.059784 0.244171 -0.118500 0.061615 0.247498 -0.136292 0.063538 0.250977 -0.155090 0.065430 0.254456 -0.174927 0.067505 0.258118 -0.195618 0.069611 0.261932 -0.216980 0.071716 0.265717 -0.239136 0.073975 0.269623 -0.261902 0.076294 0.273773 -0.285034 0.078674 0.277832 -0.308716 0.081146 0.282074 -0.332703 0.083679 0.286346 -0.357025 0.086365 0.290710 -0.381531 0.089081 0.295288 -0.406006 0.091827 0.299744 -0.430664 0.094757 0.304413 -0.455200 0.097778 0.309174 -0.479919 0.100800 0.313873 -0.505463 0.103973 0.318787 -0.531677 0.107330 0.323761 -0.558258 0.110626 0.328705 -0.585297 0.114075 0.333832 -0.612396 0.117554 0.338806 -0.639740 0.121185 0.344025 -0.666931 0.124939 0.349335 -0.693695 0.128662 0.354523 -0.720245 0.132599 0.359924 -0.746307 0.136566 0.365295 -0.049377 0.066467 0.237762 -0.062531 0.068207 0.240814 -0.076233 0.070038 0.244110 -0.090942 0.071960 0.247437 -0.106750 0.073914 0.250854 -0.123901 0.075989 0.254395 -0.142181 0.078156 0.258026 -0.161438 0.080322 0.261719 -0.181702 0.082642 0.265594 -0.202789 0.085052 0.269531 -0.224457 0.087494 0.273560 -0.246979 0.090088 0.277710 -0.269928 0.092651 0.281860 -0.293518 0.095398 0.286224 -0.317444 0.098267 0.290619 -0.341675 0.101135 0.295013 -0.366180 0.104156 0.299622 -0.390869 0.107330 0.304291 -0.415466 0.110443 0.308929 -0.440155 0.113770 0.313751 -0.464783 0.117157 0.318665 -0.489868 0.120575 0.323517 -0.515778 0.124146 0.328583 -0.542206 0.127747 0.333527 -0.569122 0.131500 0.338684 -0.596436 0.135315 0.343903 -0.623657 0.139221 0.349091 -0.651001 0.143219 0.354370 -0.678192 0.147308 0.359772 -0.704865 0.151367 0.365051 -0.731293 0.155609 0.370483 -0.757172 0.159943 0.376007 -0.053162 0.080872 0.243988 -0.066528 0.082855 0.247253 -0.080597 0.084991 0.250763 -0.095764 0.087219 0.254303 -0.112061 0.089447 0.257874 -0.129730 0.091827 0.261627 -0.148468 0.094330 0.265503 -0.168121 0.096832 0.269348 -0.188782 0.099518 0.273468 -0.210297 0.102295 0.277588 -0.232361 0.105042 0.281738 -0.255249 0.108002 0.286072 -0.278473 0.110962 0.290405 -0.302277 0.114105 0.294891 -0.326508 0.117340 0.299500 -0.350891 0.120575 0.304077 -0.375610 0.124023 0.308807 -0.400452 0.127502 0.313629 -0.425110 0.131042 0.318451 -0.449860 0.134705 0.323364 -0.474731 0.138489 0.328461 -0.500275 0.142242 0.333435 -0.526489 0.146210 0.338562 -0.553162 0.150116 0.343658 -0.580261 0.154236 0.348907 -0.607727 0.158447 0.354248 -0.635010 0.162598 0.359528 -0.662384 0.166931 0.364899 -0.689484 0.171356 0.370361 -0.716064 0.175720 0.375732 -0.742371 0.180328 0.381226 -0.768097 0.184937 0.386749 -0.057190 0.096832 0.250641 -0.070831 0.099152 0.254089 -0.085297 0.101624 0.257782 -0.100922 0.104187 0.261536 -0.117798 0.106812 0.265289 -0.135925 0.109558 0.269257 -0.155121 0.112396 0.273376 -0.175232 0.115265 0.277405 -0.196320 0.118286 0.281616 -0.218079 0.121307 0.285858 -0.240601 0.124573 0.290283 -0.263763 0.127869 0.294769 -0.287323 0.131226 0.299255 -0.311401 0.134705 0.303955 -0.335876 0.138306 0.308716 -0.360413 0.141876 0.313385 -0.385315 0.145660 0.318298 -0.410217 0.149536 0.323273 -0.434967 0.153381 0.328217 -0.459808 0.157410 0.333313 -0.484863 0.161407 0.338287 -0.510864 0.165649 0.343536 -0.537415 0.169922 0.348785 -0.564301 0.174164 0.353973 -0.591644 0.178589 0.359375 -0.619202 0.183105 0.364777 -0.646545 0.187561 0.370087 -0.673889 0.192200 0.375549 -0.700836 0.196869 0.381104 -0.727295 0.201538 0.386536 -0.753418 0.206390 0.392090 -0.778839 0.211182 0.397583 -0.061462 0.114685 0.257690 -0.075378 0.117340 0.261353 -0.090302 0.120148 0.265198 -0.106506 0.123047 0.269165 -0.123840 0.125977 0.273132 -0.142487 0.129089 0.277283 -0.162170 0.132294 0.281525 -0.182709 0.135498 0.285736 -0.204224 0.138885 0.290192 -0.226318 0.142303 0.294556 -0.249207 0.145905 0.299133 -0.272644 0.149536 0.303833 -0.296478 0.153198 0.308472 -0.320801 0.157074 0.313263 -0.345490 0.161041 0.318176 -0.370209 0.164948 0.323029 -0.395172 0.169037 0.328094 -0.420227 0.173218 0.333160 -0.444977 0.177399 0.338165 -0.469971 0.181732 0.343384 -0.495453 0.186066 0.348541 -0.521729 0.190613 0.353851 -0.548584 0.195160 0.359222 -0.575684 0.199677 0.364502 -0.603271 0.204437 0.369934 -0.630829 0.209198 0.375458 -0.658203 0.213898 0.380859 -0.685425 0.218842 0.386383 -0.712280 0.223785 0.391968 -0.738586 0.228699 0.397430 -0.764465 0.233765 0.403015 -0.789642 0.238770 0.408539 -0.066010 0.134247 0.265106 -0.080292 0.137268 0.268982 -0.095673 0.140411 0.273041 -0.112427 0.143677 0.277191 -0.130280 0.146973 0.281342 -0.149445 0.150421 0.285645 -0.169525 0.153900 0.289948 -0.190552 0.157501 0.294464 -0.212433 0.161224 0.299042 -0.234894 0.164978 0.303589 -0.258087 0.168884 0.308319 -0.281860 0.172882 0.313141 -0.305969 0.176849 0.317963 -0.330505 0.181000 0.322906 -0.355377 0.185242 0.327942 -0.380219 0.189545 0.332916 -0.405273 0.193909 0.338074 -0.430359 0.198425 0.343262 -0.455261 0.202881 0.348389 -0.480469 0.207520 0.353699 -0.506317 0.212097 0.358948 -0.532898 0.216888 0.364349 -0.560028 0.221741 0.369812 -0.587311 0.226501 0.375153 -0.614929 0.231506 0.380676 -0.642578 0.236511 0.386261 -0.669861 0.241486 0.391632 -0.696960 0.246613 0.397278 -0.723541 0.251678 0.402740 -0.749786 0.256897 0.408417 -0.775482 0.262146 0.414062 -0.800446 0.267365 0.419556 -0.070831 0.155518 0.272919 -0.085510 0.158875 0.276947 -0.101440 0.162354 0.281219 -0.118744 0.165924 0.285522 -0.137146 0.169525 0.289825 -0.156769 0.173309 0.294342 -0.177246 0.177094 0.298798 -0.198730 0.181030 0.303497 -0.220947 0.185089 0.308197 -0.243805 0.189148 0.312927 -0.267334 0.193390 0.317841 -0.291321 0.197693 0.322784 -0.315674 0.201965 0.327667 -0.340454 0.206421 0.332794 -0.365417 0.210968 0.337921 -0.390411 0.215485 0.343018 -0.415619 0.220184 0.348267 -0.440613 0.224854 0.353424 -0.465637 0.229645 0.358826 -0.491211 0.234528 0.364227 -0.517426 0.239349 0.369537 -0.544312 0.244385 0.375031 -0.571625 0.249512 0.380554 -0.599060 0.254456 0.385925 -0.626740 0.259705 0.391510 -0.654388 0.264893 0.397156 -0.681580 0.270050 0.402618 -0.708588 0.275360 0.408264 -0.734955 0.280640 0.413788 -0.761047 0.286011 0.419434 -0.786469 0.291443 0.425110 -0.811157 0.296814 0.430603 -0.075897 0.178375 0.281128 -0.091064 0.182007 0.285309 -0.107544 0.185852 0.289734 -0.125336 0.189636 0.294128 -0.144318 0.193665 0.298706 -0.164459 0.197723 0.303375 -0.185364 0.201782 0.307983 -0.207214 0.206055 0.312805 -0.229858 0.210419 0.317688 -0.253021 0.214722 0.322540 -0.276825 0.219238 0.327545 -0.301086 0.223816 0.332642 -0.325653 0.228363 0.337677 -0.350616 0.233093 0.342865 -0.375580 0.237762 0.347992 -0.400818 0.242645 0.353302 -0.426056 0.247589 0.358673 -0.451050 0.252441 0.363953 -0.476288 0.257538 0.369385 -0.502289 0.262665 0.374908 -0.528778 0.267700 0.380280 -0.555878 0.272919 0.385803 -0.583405 0.278229 0.391357 -0.610931 0.283417 0.396881 -0.638641 0.288757 0.402435 -0.666168 0.294189 0.408142 -0.693298 0.299500 0.413666 -0.720154 0.304993 0.419281 -0.746338 0.310333 0.424835 -0.772125 0.315857 0.430450 -0.797333 0.321442 0.436157 -0.821686 0.326874 0.441711 -0.081299 0.202606 0.289642 -0.096985 0.206543 0.293976 -0.114105 0.210663 0.298615 -0.132355 0.214752 0.303131 -0.151917 0.219086 0.307892 -0.172455 0.223419 0.312653 -0.193756 0.227783 0.317444 -0.216034 0.232330 0.322418 -0.239044 0.236938 0.327423 -0.262482 0.241516 0.332397 -0.286621 0.246277 0.337524 -0.311127 0.251129 0.342743 -0.335846 0.255890 0.347870 -0.360962 0.260834 0.353180 -0.386078 0.265808 0.358429 -0.411346 0.270905 0.363800 -0.436584 0.276001 0.369263 -0.461609 0.281128 0.374573 -0.487213 0.286377 0.380157 -0.513580 0.291718 0.385651 -0.540283 0.296936 0.391083 -0.567657 0.302307 0.396729 -0.595306 0.307770 0.402313 -0.622894 0.313080 0.407867 -0.650635 0.318634 0.413483 -0.677856 0.324036 0.418976 -0.704987 0.329559 0.424652 -0.731628 0.335205 0.430359 -0.757629 0.340607 0.435913 -0.783173 0.346283 0.441559 -0.808075 0.351959 0.447235 -0.832092 0.357422 0.452759 -0.086945 0.228088 0.298340 -0.103302 0.232391 0.303009 -0.120972 0.236786 0.307770 -0.139771 0.241119 0.312439 -0.159729 0.245697 0.317322 -0.180756 0.250336 0.322296 -0.202545 0.254913 0.327179 -0.225128 0.259735 0.332275 -0.248474 0.264557 0.337372 -0.272217 0.269348 0.342468 -0.296570 0.274353 0.347748 -0.321198 0.279327 0.352905 -0.346252 0.284393 0.358307 -0.371490 0.289642 0.363678 -0.396698 0.294708 0.368988 -0.421997 0.299988 0.374481 -0.447266 0.305328 0.379974 -0.472412 0.310577 0.385345 -0.498352 0.315979 0.390961 -0.525024 0.321503 0.396606 -0.552002 0.326843 0.402008 -0.579559 0.332397 0.407684 -0.607269 0.337921 0.413300 -0.634918 0.343414 0.418823 -0.662506 0.349030 0.424530 -0.689667 0.354492 0.430054 -0.716614 0.360168 0.435730 -0.743011 0.365845 0.441437 -0.768768 0.371338 0.446930 -0.794067 0.376984 0.452606 -0.818665 0.382721 0.458282 -0.842346 0.388245 0.463898 -0.093048 0.254761 0.307495 -0.109955 0.259338 0.312317 -0.128204 0.264008 0.317200 -0.147491 0.268585 0.321991 -0.167999 0.273407 0.327057 -0.189392 0.278259 0.332123 -0.211578 0.283081 0.337097 -0.234558 0.288086 0.342346 -0.258179 0.293152 0.347595 -0.282227 0.298157 0.352783 -0.306793 0.303375 0.358154 -0.331635 0.308502 0.363434 -0.356812 0.313782 0.368835 -0.382172 0.319153 0.374359 -0.407440 0.324402 0.379700 -0.432770 0.329834 0.385254 -0.458069 0.335327 0.390808 -0.483459 0.340668 0.396271 -0.509766 0.346252 0.401947 -0.536652 0.351837 0.407532 -0.563873 0.357300 0.413086 -0.591522 0.362915 0.418701 -0.619171 0.368439 0.424255 -0.646881 0.374115 0.429871 -0.674469 0.379791 0.435608 -0.701447 0.385315 0.441162 -0.728180 0.391022 0.446777 -0.754425 0.396698 0.452454 -0.779877 0.402252 0.458038 -0.804840 0.407959 0.463745 -0.829071 0.413574 0.469482 -0.852417 0.419098 0.475098 -0.099426 0.282501 0.316925 -0.116974 0.287323 0.321899 -0.135773 0.292175 0.326935 -0.155579 0.297028 0.331909 -0.176544 0.302002 0.336975 -0.198364 0.307098 0.342224 -0.220917 0.312073 0.347321 -0.244232 0.317291 0.352631 -0.268005 0.322418 0.357849 -0.292419 0.327698 0.363281 -0.317230 0.333099 0.368713 -0.342255 0.338348 0.374084 -0.367554 0.343811 0.379578 -0.392975 0.349304 0.385101 -0.418243 0.354645 0.390503 -0.443634 0.360229 0.396149 -0.468933 0.365814 0.401764 -0.494690 0.371277 0.407318 -0.521301 0.376892 0.412933 -0.548462 0.382538 0.418549 -0.575836 0.388062 0.424103 -0.603577 0.393738 0.429779 -0.631226 0.399353 0.435303 -0.658936 0.404999 0.441010 -0.686310 0.410706 0.446625 -0.713165 0.416260 0.452179 -0.739624 0.421967 0.457855 -0.765656 0.427612 0.463562 -0.790771 0.433167 0.469177 -0.815460 0.438812 0.474915 -0.839355 0.444519 0.480743 -0.862274 0.450134 0.486420 -0.106232 0.311096 0.326660 -0.124329 0.316071 0.331757 -0.143677 0.321167 0.336853 -0.163971 0.326172 0.341949 -0.185394 0.331360 0.347198 -0.207642 0.336578 0.352478 -0.230530 0.341797 0.357758 -0.254181 0.347137 0.363159 -0.278198 0.352386 0.368378 -0.302826 0.357819 0.373901 -0.327911 0.363373 0.379486 -0.352997 0.368713 0.384827 -0.378387 0.374237 0.390381 -0.403809 0.379822 0.395966 -0.429199 0.385315 0.401550 -0.454498 0.390930 0.407135 -0.480072 0.396606 0.412811 -0.506165 0.402130 0.418274 -0.533020 0.407776 0.423981 -0.560242 0.413361 0.429535 -0.587891 0.419006 0.435181 -0.615692 0.424713 0.440887 -0.643341 0.430267 0.446350 -0.670868 0.435913 0.451996 -0.698090 0.441650 0.457703 -0.724762 0.447266 0.463287 -0.750977 0.453064 0.469025 -0.776611 0.458893 0.474792 -0.801544 0.464600 0.480469 -0.825867 0.470459 0.486267 -0.849213 0.476257 0.492004 -0.871857 0.482147 0.497803 -0.113373 0.340393 0.336609 -0.132080 0.345612 0.341827 -0.151947 0.350800 0.347076 -0.172729 0.355988 0.352264 -0.194519 0.361328 0.357605 -0.217072 0.366577 0.362885 -0.240356 0.371979 0.368286 -0.264313 0.377472 0.373810 -0.288605 0.382812 0.379150 -0.313416 0.388336 0.384705 -0.338623 0.393921 0.390259 -0.363892 0.399414 0.395721 -0.389343 0.404968 0.401367 -0.414825 0.410645 0.406982 -0.440125 0.416138 0.412537 -0.465454 0.421814 0.418152 -0.491333 0.427429 0.423798 -0.517792 0.433014 0.429382 -0.544861 0.438721 0.435028 -0.572235 0.444305 0.440552 -0.599945 0.450134 0.446228 -0.627777 0.455933 0.451904 -0.655334 0.461670 0.457428 -0.682739 0.467590 0.463135 -0.709778 0.473541 0.468872 -0.736176 0.479370 0.474518 -0.762177 0.485352 0.480347 -0.787537 0.491364 0.486115 -0.812073 0.497253 0.491852 -0.836060 0.503265 0.497650 -0.859039 0.509186 0.503387 -0.881256 0.515167 0.509216 -0.120880 0.370270 0.346802 -0.140106 0.375549 0.352081 -0.160492 0.380920 0.357452 -0.181702 0.386200 0.362732 -0.203949 0.391632 0.368164 -0.226807 0.397003 0.373505 -0.250458 0.402466 0.379028 -0.274628 0.408051 0.384583 -0.299133 0.413483 0.389984 -0.324219 0.419037 0.395599 -0.349518 0.424652 0.401215 -0.374817 0.430176 0.406677 -0.400391 0.435852 0.412384 -0.425842 0.441498 0.417969 -0.451111 0.447113 0.423553 -0.476562 0.452942 0.429230 -0.502686 0.458618 0.434723 -0.529449 0.464539 0.440460 -0.556793 0.470459 0.446075 -0.584290 0.476379 0.451599 -0.612061 0.482361 0.457275 -0.639832 0.488403 0.463013 -0.667267 0.494354 0.468628 -0.694519 0.500427 0.474396 -0.721283 0.506531 0.480164 -0.747467 0.512512 0.485840 -0.773132 0.518646 0.491699 -0.798065 0.524628 0.497406 -0.822449 0.530792 0.503204 -0.845978 0.536865 0.509094 -0.868561 0.542847 0.514801 -0.890320 0.548950 0.520599 -0.128693 0.400543 0.357178 -0.148468 0.405945 0.362610 -0.169312 0.411377 0.368042 -0.190948 0.416687 0.373383 -0.213593 0.422211 0.378876 -0.236786 0.427612 0.384277 -0.260712 0.433197 0.389862 -0.285156 0.438782 0.395447 -0.309906 0.444305 0.400940 -0.335052 0.450043 0.406525 -0.360474 0.455841 0.412201 -0.385895 0.461517 0.417725 -0.411469 0.467468 0.423431 -0.436920 0.473419 0.429108 -0.462097 0.479248 0.434601 -0.487854 0.485291 0.440277 -0.514435 0.491394 0.445953 -0.541321 0.497375 0.451477 -0.568787 0.503479 0.457153 -0.596375 0.509521 0.462708 -0.624115 0.515686 0.468506 -0.651825 0.521881 0.474243 -0.679108 0.527954 0.479919 -0.706085 0.534180 0.485687 -0.732697 0.540436 0.491577 -0.758514 0.546448 0.497223 -0.783936 0.552673 0.503082 -0.808685 0.558868 0.508942 -0.832520 0.564911 0.514587 -0.855682 0.571075 0.520508 -0.877838 0.577057 0.526184 -0.899139 0.583099 0.531952 -0.136871 0.430939 0.367767 -0.157135 0.436401 0.373230 -0.178406 0.441956 0.378754 -0.200470 0.447418 0.384155 -0.223450 0.453125 0.389709 -0.246979 0.458710 0.395142 -0.271179 0.464539 0.400818 -0.295837 0.470428 0.406403 -0.320740 0.476257 0.411926 -0.346069 0.482208 0.417572 -0.371552 0.488281 0.423279 -0.396973 0.494232 0.428802 -0.422516 0.500336 0.434448 -0.447937 0.506500 0.440125 -0.473236 0.512512 0.445679 -0.499359 0.518738 0.451355 -0.526001 0.524872 0.456879 -0.553223 0.531128 0.462585 -0.580811 0.537384 0.468292 -0.608368 0.543518 0.473969 -0.636108 0.549805 0.479736 -0.663696 0.556152 0.485535 -0.690765 0.562256 0.491241 -0.717529 0.568512 0.497101 -0.743896 0.574768 0.502930 -0.769470 0.580872 0.508667 -0.794525 0.587067 0.514496 -0.818787 0.593109 0.520203 -0.842346 0.599304 0.526031 -0.865143 0.605408 0.531799 -0.886841 0.611298 0.537415 -0.907654 0.617310 0.543243 -0.145264 0.461975 0.378448 -0.166046 0.467743 0.384003 -0.187714 0.473419 0.389435 -0.210236 0.479340 0.395020 -0.233551 0.485291 0.400665 -0.257324 0.491150 0.406097 -0.281769 0.497223 0.411774 -0.306610 0.503357 0.417419 -0.331696 0.509369 0.423004 -0.357117 0.515533 0.428680 -0.382629 0.521729 0.434296 -0.408081 0.527893 0.439850 -0.433563 0.534180 0.445526 -0.458771 0.540314 0.451019 -0.484467 0.546661 0.456726 -0.510895 0.553040 0.462433 -0.537689 0.559174 0.467987 -0.565125 0.565582 0.473816 -0.592773 0.571930 0.479584 -0.620361 0.578033 0.485260 -0.648010 0.584412 0.491119 -0.675446 0.590729 0.496948 -0.702271 0.596863 0.502625 -0.728851 0.603149 0.508484 -0.754852 0.609375 0.514313 -0.780121 0.615448 0.520050 -0.804840 0.621613 0.525879 -0.828735 0.627594 0.531525 -0.851929 0.633606 0.537292 -0.874207 0.639679 0.543091 -0.895538 0.645416 0.548615 -0.915863 0.651306 0.554352 -0.154053 0.494385 0.389282 -0.175262 0.500427 0.394867 -0.197266 0.506317 0.400360 -0.220184 0.512451 0.405975 -0.243805 0.518585 0.411652 -0.267822 0.524658 0.417175 -0.292480 0.530945 0.422882 -0.317505 0.537231 0.428528 -0.342712 0.543396 0.434052 -0.368195 0.549744 0.439697 -0.393768 0.556091 0.445374 -0.419189 0.562317 0.450897 -0.444611 0.568695 0.456543 -0.469879 0.574951 0.462128 -0.495880 0.581360 0.467896 -0.522522 0.587738 0.473663 -0.549530 0.593933 0.479309 -0.577026 0.600342 0.485138 -0.604706 0.606659 0.490936 -0.632233 0.612854 0.496643 -0.659790 0.619171 0.502502 -0.687012 0.625427 0.508331 -0.713623 0.631531 0.514038 -0.739899 0.637726 0.519928 -0.765503 0.643707 0.525604 -0.790558 0.649811 0.531372 -0.814941 0.655792 0.537140 -0.838409 0.661621 0.542816 -0.861206 0.667511 0.548523 -0.883057 0.673340 0.554199 -0.903839 0.679016 0.559723 -0.923676 0.684662 0.565369 -0.163055 0.527893 0.400238 -0.184692 0.534088 0.405823 -0.207092 0.540161 0.411377 -0.230347 0.546509 0.417023 -0.254211 0.552826 0.422699 -0.278503 0.559021 0.428253 -0.303314 0.565460 0.433929 -0.328522 0.571838 0.439575 -0.353821 0.578033 0.445068 -0.379333 0.584473 0.450775 -0.404755 0.590759 0.456299 -0.430267 0.597229 0.462006 -0.455627 0.603638 0.467743 -0.481018 0.609863 0.473358 -0.507324 0.616272 0.479187 -0.534210 0.622620 0.484985 -0.561310 0.628815 0.490692 -0.588867 0.635162 0.496521 -0.616547 0.641449 0.502380 -0.644043 0.647522 0.508087 -0.671417 0.653717 0.513885 -0.698364 0.659882 0.519775 -0.724792 0.665833 0.525452 -0.750732 0.671875 0.531219 -0.775970 0.677673 0.536835 -0.800720 0.683594 0.542664 -0.824768 0.689392 0.548370 -0.847839 0.695038 0.553955 -0.870209 0.700745 0.559631 -0.891602 0.706360 0.565216 -0.911835 0.711731 0.570618 -0.931152 0.717224 0.576141 -0.172302 0.562164 0.411224 -0.194366 0.568542 0.416870 -0.217102 0.574768 0.422363 -0.240601 0.581207 0.428101 -0.264771 0.587616 0.433746 -0.289246 0.593872 0.439301 -0.314240 0.600342 0.444916 -0.339569 0.606720 0.450592 -0.364868 0.613007 0.456116 -0.390411 0.619507 0.461853 -0.415863 0.625732 0.467438 -0.441254 0.632172 0.473267 -0.466614 0.638550 0.479034 -0.492310 0.644684 0.484650 -0.518799 0.651031 0.490509 -0.545807 0.657318 0.496338 -0.573090 0.663422 0.502106 -0.600708 0.669586 0.507904 -0.628265 0.675720 0.513702 -0.655609 0.681641 0.519501 -0.682770 0.687683 0.525269 -0.709381 0.693512 0.530914 -0.735626 0.699432 0.536713 -0.761322 0.705261 0.542511 -0.786255 0.710907 0.548096 -0.810608 0.716583 0.553772 -0.834259 0.722229 0.559479 -0.856903 0.727570 0.564911 -0.878845 0.733063 0.570496 -0.899780 0.738403 0.575989 -0.919556 0.743622 0.581329 -0.938354 0.748810 0.586700 -0.181763 0.597046 0.422272 -0.204193 0.603424 0.427917 -0.227234 0.609711 0.433441 -0.251038 0.616180 0.439148 -0.275391 0.622589 0.444794 -0.300049 0.628906 0.450348 -0.325226 0.635284 0.455963 -0.350464 0.641602 0.461578 -0.376007 0.647980 0.467316 -0.401581 0.654358 0.473114 -0.426880 0.660522 0.478729 -0.452179 0.666809 0.484497 -0.477600 0.673065 0.490356 -0.503601 0.679169 0.496063 -0.530304 0.685303 0.501923 -0.557495 0.691406 0.507751 -0.584808 0.697357 0.513458 -0.612366 0.703339 0.519318 -0.639862 0.709320 0.525116 -0.667023 0.715057 0.530792 -0.694000 0.720917 0.536591 -0.720306 0.726501 0.542236 -0.746246 0.732208 0.547943 -0.771606 0.737823 0.553650 -0.796173 0.743195 0.559174 -0.820160 0.748657 0.564789 -0.843414 0.753998 0.570312 -0.865692 0.759247 0.575714 -0.887146 0.764435 0.581207 -0.907654 0.769531 0.586548 -0.926910 0.774445 0.591766 -0.945190 0.779297 0.597015 -0.191376 0.632019 0.433350 -0.214172 0.638458 0.439026 -0.237488 0.644684 0.444519 -0.261597 0.651093 0.450195 -0.286133 0.657501 0.455872 -0.310974 0.663696 0.461456 -0.336212 0.670044 0.467163 -0.361511 0.676147 0.472809 -0.387024 0.682465 0.478546 -0.412567 0.688721 0.484406 -0.437805 0.694763 0.490082 -0.463013 0.700867 0.495911 -0.488739 0.706940 0.501770 -0.514954 0.712891 0.507477 -0.541809 0.718872 0.513336 -0.569061 0.724792 0.519165 -0.596436 0.730499 0.524841 -0.623901 0.736359 0.530640 -0.651123 0.741882 0.536285 -0.678284 0.747589 0.542084 -0.704956 0.753204 0.547791 -0.731018 0.758545 0.553345 -0.756622 0.764008 0.559021 -0.781647 0.769348 0.564636 -0.805908 0.774536 0.570068 -0.829468 0.779724 0.575592 -0.852325 0.784821 0.581085 -0.874115 0.789764 0.586304 -0.895142 0.794617 0.591614 -0.914978 0.799347 0.596741 -0.933899 0.804108 0.601929 -0.951630 0.808746 0.607086 -0.201202 0.666809 0.444366 -0.224274 0.673126 0.450043 -0.247925 0.679321 0.455566 -0.272217 0.685577 0.461243 -0.296936 0.691864 0.467010 -0.321869 0.697937 0.472656 -0.347198 0.704163 0.478455 -0.372528 0.710175 0.484161 -0.398041 0.716309 0.489960 -0.423462 0.722351 0.495758 -0.448608 0.728241 0.501495 -0.473938 0.734131 0.507355 -0.499847 0.740021 0.513184 -0.526276 0.745758 0.518890 -0.553223 0.751526 0.524719 -0.580505 0.757202 0.530487 -0.607880 0.762726 0.536163 -0.635223 0.768311 0.541931 -0.662354 0.773651 0.547516 -0.689209 0.779083 0.553192 -0.715576 0.784393 0.558868 -0.741364 0.789581 0.564362 -0.766693 0.794708 0.569916 -0.791351 0.799805 0.575409 -0.815186 0.804688 0.580811 -0.838409 0.809631 0.586182 -0.860809 0.814423 0.591461 -0.882233 0.819031 0.596649 -0.902771 0.823639 0.601807 -0.922119 0.828064 0.606812 -0.940491 0.832458 0.611847 -0.957733 0.836823 0.616760 -0.211151 0.701050 0.455414 -0.234528 0.707214 0.461151 -0.258392 0.713318 0.466736 -0.282898 0.719452 0.472504 -0.307587 0.725403 0.478149 -0.332825 0.731445 0.484009 -0.358154 0.737488 0.489777 -0.383484 0.743286 0.495483 -0.408875 0.749268 0.501373 -0.434296 0.755096 0.507202 -0.459290 0.760773 0.512848 -0.484802 0.766510 0.518738 -0.510956 0.772186 0.524567 -0.537476 0.777618 0.530212 -0.564575 0.783173 0.536011 -0.591766 0.788513 0.541656 -0.619141 0.793915 0.547394 -0.646454 0.799194 0.553070 -0.673279 0.804291 0.558594 -0.699860 0.809448 0.564240 -0.725983 0.814514 0.569763 -0.751465 0.819336 0.575165 -0.776398 0.824249 0.580688 -0.800720 0.829041 0.586029 -0.824249 0.833618 0.591278 -0.847015 0.838196 0.596497 -0.868866 0.842590 0.601593 -0.889923 0.847015 0.606689 -0.910004 0.851318 0.611725 -0.928925 0.855408 0.616516 -0.946838 0.859558 0.621399 -0.963501 0.863556 0.626129 -0.221222 0.734589 0.466583 -0.244904 0.740601 0.472382 -0.268951 0.746460 0.477997 -0.293579 0.752472 0.483856 -0.318451 0.758240 0.489532 -0.343658 0.764099 0.495361 -0.369049 0.769897 0.501190 -0.394318 0.775513 0.506866 -0.419678 0.781219 0.512756 -0.444885 0.786865 0.518585 -0.469971 0.792297 0.524261 -0.495697 0.797791 0.530060 -0.522034 0.803162 0.535889 -0.548645 0.808350 0.541473 -0.575806 0.813690 0.547241 -0.602966 0.818756 0.552795 -0.630219 0.823853 0.558472 -0.657318 0.828857 0.564087 -0.683929 0.833679 0.569489 -0.710327 0.838531 0.575012 -0.736115 0.843292 0.580536 -0.761200 0.847839 0.585785 -0.785858 0.852417 0.591125 -0.809784 0.856842 0.596375 -0.832886 0.861176 0.601471 -0.855255 0.865417 0.606537 -0.876648 0.869476 0.611481 -0.897247 0.873566 0.616394 -0.916870 0.877533 0.621246 -0.935333 0.881348 0.625916 -0.952667 0.885132 0.630615 -0.968842 0.888763 0.635162 -0.231384 0.767212 0.477875 -0.255157 0.772949 0.483521 -0.279480 0.778748 0.489380 -0.304260 0.784485 0.495178 -0.329224 0.790070 0.500885 -0.354492 0.795685 0.506744 -0.379883 0.801270 0.512573 -0.405029 0.806671 0.518280 -0.430328 0.812103 0.524139 -0.455505 0.817474 0.529938 -0.480621 0.822632 0.535583 -0.506531 0.827881 0.541351 -0.532867 0.832855 0.546936 -0.559723 0.837952 0.552643 -0.586853 0.842865 0.558319 -0.613983 0.847687 0.563782 -0.641083 0.852478 0.569366 -0.667999 0.857178 0.574860 -0.694336 0.861694 0.580231 -0.720337 0.866241 0.585632 -0.745880 0.870636 0.590973 -0.770660 0.874847 0.596069 -0.794891 0.879089 0.601318 -0.818359 0.883148 0.606323 -0.841217 0.887207 0.611359 -0.863159 0.891144 0.616302 -0.884155 0.894867 0.621002 -0.904266 0.898651 0.625793 -0.923370 0.902283 0.630463 -0.941376 0.905701 0.634949 -0.958221 0.909119 0.639404 -0.973877 0.912415 0.643768 -0.241608 0.798859 0.489197 -0.265533 0.804352 0.494873 -0.290070 0.809906 0.500763 -0.314911 0.815460 0.506592 -0.339966 0.820740 0.512299 -0.365234 0.826172 0.518158 -0.390503 0.831451 0.523987 -0.415680 0.836548 0.529633 -0.440826 0.841736 0.535431 -0.465790 0.846802 0.541229 -0.491180 0.851654 0.546814 -0.517334 0.856567 0.552490 -0.543701 0.861298 0.558014 -0.570648 0.866058 0.563660 -0.597748 0.870728 0.569244 -0.624725 0.875183 0.574585 -0.651642 0.879669 0.580078 -0.678314 0.884003 0.585480 -0.704376 0.888184 0.590668 -0.730133 0.892365 0.595947 -0.755249 0.896484 0.601227 -0.779755 0.900360 0.606201 -0.803619 0.904297 0.611206 -0.826721 0.907959 0.616058 -0.849091 0.911652 0.620911 -0.870667 0.915253 0.625702 -0.891205 0.918671 0.630219 -0.910889 0.922058 0.634796 -0.929535 0.925323 0.639282 -0.947021 0.928436 0.643524 -0.963348 0.931488 0.647827 -0.978516 0.934448 0.651947 -0.251862 0.829346 0.500610 -0.275940 0.834595 0.506317 -0.300568 0.839874 0.512146 -0.325562 0.845123 0.518005 -0.350555 0.850189 0.523712 -0.375824 0.855255 0.529449 -0.401093 0.860260 0.535278 -0.426147 0.865112 0.540924 -0.451111 0.869934 0.546661 -0.476074 0.874573 0.552246 -0.501709 0.879242 0.557922 -0.527954 0.883850 0.563507 -0.554443 0.888245 0.568939 -0.581360 0.892609 0.574493 -0.608368 0.896973 0.579987 -0.635162 0.901093 0.585266 -0.661957 0.905212 0.590546 -0.688293 0.909241 0.595825 -0.714142 0.913086 0.600922 -0.739532 0.916931 0.606049 -0.764374 0.920654 0.611084 -0.788452 0.924225 0.615906 -0.811981 0.927734 0.620789 -0.834656 0.931061 0.625458 -0.856659 0.934418 0.630127 -0.877777 0.937653 0.634705 -0.897919 0.940704 0.639099 -0.917145 0.943756 0.643463 -0.935303 0.946625 0.647705 -0.952301 0.949432 0.651764 -0.968170 0.952118 0.655792 -0.982758 0.954651 0.659607 -0.262085 0.858521 0.511993 -0.286346 0.863434 0.517700 -0.311096 0.868500 0.523529 -0.336060 0.873413 0.529358 -0.361084 0.878143 0.535004 -0.386322 0.882843 0.540771 -0.411499 0.887573 0.546539 -0.436340 0.892090 0.552094 -0.461212 0.896606 0.557770 -0.486328 0.900970 0.563232 -0.512146 0.905243 0.568817 -0.538452 0.909515 0.574341 -0.565002 0.913574 0.579681 -0.591827 0.917664 0.585083 -0.618713 0.921570 0.590424 -0.645386 0.925354 0.595581 -0.671936 0.929108 0.600800 -0.697998 0.932800 0.605896 -0.723480 0.936249 0.610809 -0.748596 0.939697 0.615814 -0.772949 0.943024 0.620544 -0.796814 0.946289 0.625366 -0.819946 0.949463 0.630005 -0.842255 0.952454 0.634491 -0.863831 0.955383 0.638947 -0.884521 0.958252 0.643372 -0.904205 0.960968 0.647491 -0.922974 0.963623 0.651611 -0.940674 0.966156 0.655731 -0.957184 0.968567 0.659515 -0.972626 0.970917 0.663300 -0.986755 0.973145 0.666870 -0.272308 0.886139 0.523376 -0.296692 0.890808 0.529022 -0.321503 0.895538 0.534851 -0.346497 0.900116 0.540619 -0.371460 0.904541 0.546234 -0.396637 0.908966 0.551971 -0.421539 0.913177 0.557495 -0.446411 0.917419 0.563110 -0.471191 0.921631 0.568695 -0.496490 0.925598 0.574097 -0.522430 0.929565 0.579559 -0.548767 0.933441 0.584961 -0.575348 0.937134 0.590179 -0.602081 0.940796 0.595428 -0.628845 0.944397 0.600677 -0.655304 0.947754 0.605652 -0.681549 0.951141 0.610718 -0.707336 0.954468 0.615662 -0.732513 0.957550 0.620422 -0.757233 0.960663 0.625214 -0.781311 0.963562 0.629761 -0.804749 0.966461 0.634399 -0.827545 0.969238 0.638855 -0.849396 0.971893 0.643127 -0.870544 0.974426 0.647369 -0.890839 0.976959 0.651520 -0.910065 0.979279 0.655487 -0.928375 0.981567 0.659424 -0.945679 0.983765 0.663208 -0.961700 0.985840 0.666809 -0.976685 0.987854 0.670319 -0.990356 0.989746 0.673676 -0.043060 0.041321 0.245850 -0.056000 0.042755 0.248657 -0.069214 0.044220 0.251587 -0.083099 0.045715 0.254486 -0.098114 0.047302 0.257629 -0.114380 0.048981 0.260864 -0.131744 0.050659 0.264130 -0.150238 0.052429 0.267578 -0.169769 0.054291 0.271149 -0.190002 0.056122 0.274780 -0.211182 0.058136 0.278564 -0.232910 0.060120 0.282318 -0.255402 0.062195 0.286316 -0.278442 0.064331 0.290375 -0.301819 0.066559 0.294434 -0.325684 0.068848 0.298706 -0.349854 0.071228 0.303040 -0.374115 0.073608 0.307343 -0.398590 0.076141 0.311890 -0.423157 0.078735 0.316498 -0.447510 0.081360 0.321075 -0.472046 0.084106 0.325806 -0.497192 0.086884 0.330505 -0.523132 0.089813 0.335419 -0.549591 0.092834 0.340393 -0.576324 0.095856 0.345276 -0.603485 0.099030 0.350403 -0.630768 0.102356 0.355560 -0.657806 0.105652 0.360626 -0.684723 0.109100 0.365906 -0.711334 0.112671 0.371216 -0.737427 0.116241 0.376465 -0.046448 0.053741 0.251404 -0.059509 0.055359 0.254425 -0.072998 0.057007 0.257538 -0.087280 0.058685 0.260712 -0.102753 0.060455 0.264069 -0.119507 0.062317 0.267517 -0.137329 0.064209 0.270996 -0.156250 0.066223 0.274658 -0.176117 0.068237 0.278351 -0.196869 0.070343 0.282227 -0.218384 0.072571 0.286224 -0.240509 0.074768 0.290161 -0.263275 0.077148 0.294312 -0.286652 0.079590 0.298584 -0.310272 0.082062 0.302795 -0.334351 0.084656 0.307220 -0.358734 0.087341 0.311768 -0.383179 0.090088 0.316254 -0.407867 0.092926 0.320953 -0.432434 0.095886 0.325684 -0.456909 0.098846 0.330383 -0.481812 0.101990 0.335327 -0.507263 0.105133 0.340149 -0.533569 0.108459 0.345154 -0.560272 0.111877 0.350281 -0.587280 0.115326 0.355316 -0.614532 0.118896 0.360504 -0.641876 0.122620 0.365784 -0.668915 0.126282 0.370941 -0.695831 0.130096 0.376343 -0.722351 0.134064 0.381744 -0.748260 0.137970 0.387024 -0.050049 0.067108 0.257385 -0.063263 0.068878 0.260620 -0.077057 0.070770 0.263977 -0.091766 0.072662 0.267334 -0.107758 0.074677 0.270905 -0.125000 0.076782 0.274567 -0.143311 0.078949 0.278259 -0.162720 0.081177 0.282135 -0.182922 0.083496 0.285980 -0.204102 0.085907 0.290070 -0.226013 0.088470 0.294220 -0.248444 0.090973 0.298340 -0.271545 0.093658 0.302673 -0.295166 0.096466 0.307129 -0.319061 0.099274 0.311523 -0.343384 0.102295 0.316132 -0.368011 0.105347 0.320801 -0.392548 0.108429 0.325470 -0.417297 0.111694 0.330292 -0.441925 0.114929 0.335052 -0.466583 0.118378 0.340027 -0.491821 0.121918 0.345032 -0.517731 0.125427 0.350037 -0.544281 0.129150 0.355194 -0.571289 0.132965 0.360382 -0.598419 0.136749 0.365540 -0.625793 0.140656 0.370789 -0.653198 0.144745 0.376190 -0.680176 0.148743 0.381470 -0.706940 0.152924 0.386902 -0.733215 0.157135 0.392273 -0.759186 0.161469 0.397797 -0.053894 0.081573 0.263824 -0.067352 0.083649 0.267273 -0.081482 0.085815 0.270813 -0.096649 0.088013 0.274384 -0.113159 0.090363 0.278168 -0.130829 0.092712 0.281952 -0.149658 0.095215 0.285889 -0.169525 0.097870 0.289948 -0.190125 0.100464 0.293976 -0.211670 0.103271 0.298248 -0.233948 0.106140 0.302582 -0.256744 0.109070 0.306915 -0.280121 0.112122 0.311401 -0.304016 0.115326 0.316010 -0.328186 0.118530 0.320587 -0.352722 0.121857 0.325348 -0.377472 0.125336 0.330139 -0.402191 0.128723 0.334930 -0.427032 0.132385 0.339905 -0.451660 0.136047 0.344818 -0.476562 0.139832 0.349915 -0.502258 0.143707 0.355072 -0.528412 0.147614 0.360168 -0.555298 0.151642 0.365387 -0.582520 0.155823 0.370667 -0.609711 0.159912 0.375916 -0.637207 0.164215 0.381317 -0.664581 0.168579 0.386749 -0.691528 0.172913 0.392090 -0.718231 0.177460 0.397614 -0.744324 0.181915 0.402985 -0.770050 0.186584 0.408600 -0.057953 0.097656 0.270630 -0.071655 0.100098 0.274292 -0.086243 0.102600 0.278076 -0.101868 0.105103 0.281860 -0.118927 0.107788 0.285767 -0.137054 0.110504 0.289764 -0.156372 0.113403 0.293884 -0.176697 0.116364 0.298157 -0.197723 0.119385 0.302368 -0.219604 0.122559 0.306824 -0.242249 0.125793 0.311310 -0.265350 0.129059 0.315796 -0.289032 0.132538 0.320465 -0.313171 0.136108 0.325226 -0.337585 0.139587 0.329926 -0.362335 0.143311 0.334808 -0.387054 0.147034 0.339630 -0.412018 0.150940 0.344666 -0.436920 0.154907 0.349762 -0.461578 0.158875 0.354797 -0.486938 0.162964 0.360016 -0.512939 0.167236 0.365265 -0.539398 0.171387 0.370453 -0.566528 0.175812 0.375824 -0.593903 0.180298 0.381195 -0.621277 0.184692 0.386475 -0.648773 0.189301 0.391998 -0.675903 0.193848 0.397339 -0.702942 0.198578 0.402893 -0.729431 0.203400 0.408447 -0.755371 0.208130 0.413910 -0.780914 0.213043 0.419464 -0.062256 0.115601 0.277893 -0.076324 0.118347 0.281738 -0.091309 0.121216 0.285675 -0.107513 0.124115 0.289642 -0.125061 0.127167 0.293793 -0.143707 0.130188 0.297913 -0.163483 0.133453 0.302277 -0.184204 0.136810 0.306702 -0.205627 0.140106 0.311096 -0.227966 0.143677 0.315674 -0.250916 0.147278 0.320343 -0.274292 0.150879 0.324982 -0.298279 0.154663 0.329803 -0.322540 0.158447 0.334564 -0.347229 0.162415 0.339508 -0.372131 0.166473 0.344543 -0.397003 0.170532 0.349518 -0.421997 0.174683 0.354675 -0.446991 0.179016 0.359894 -0.471863 0.183289 0.365021 -0.497498 0.187775 0.370331 -0.523926 0.192261 0.375641 -0.550659 0.196747 0.380951 -0.577972 0.201447 0.386383 -0.605499 0.206207 0.391815 -0.632904 0.210846 0.397217 -0.660400 0.215729 0.402740 -0.687469 0.220581 0.408203 -0.714325 0.225555 0.413757 -0.740723 0.230591 0.419373 -0.766449 0.235565 0.424835 -0.791748 0.240692 0.430420 -0.066864 0.135284 0.285492 -0.081268 0.138428 0.289551 -0.096680 0.141541 0.293579 -0.113495 0.144867 0.297821 -0.131592 0.148224 0.302185 -0.150696 0.151611 0.306458 -0.170929 0.155212 0.311005 -0.192078 0.158905 0.315552 -0.213928 0.162567 0.320099 -0.236572 0.166443 0.324860 -0.259888 0.170380 0.329681 -0.283569 0.174316 0.334442 -0.307800 0.178375 0.339386 -0.332275 0.182526 0.344299 -0.357117 0.186798 0.349396 -0.382172 0.191162 0.354523 -0.407166 0.195496 0.359619 -0.432220 0.199982 0.364868 -0.457184 0.204559 0.370178 -0.482391 0.209167 0.375366 -0.508392 0.213867 0.380829 -0.535065 0.218689 0.386200 -0.562103 0.223450 0.391541 -0.589569 0.228363 0.397064 -0.617035 0.233246 0.402435 -0.644684 0.238281 0.408051 -0.672119 0.243378 0.413635 -0.699036 0.248413 0.419037 -0.725739 0.253601 0.424713 -0.751984 0.258911 0.430328 -0.777466 0.264038 0.435852 -0.802521 0.269348 0.441498 -0.071686 0.156738 0.293488 -0.086517 0.160156 0.297699 -0.102509 0.163574 0.301941 -0.119904 0.167236 0.306335 -0.138519 0.170990 0.310852 -0.158081 0.174652 0.315308 -0.178772 0.178558 0.320007 -0.200287 0.182587 0.324738 -0.222534 0.186554 0.329437 -0.245544 0.190735 0.334320 -0.269135 0.194977 0.339264 -0.293060 0.199188 0.344147 -0.317535 0.203644 0.349243 -0.342255 0.208008 0.354279 -0.367249 0.212585 0.359497 -0.392395 0.217255 0.364746 -0.417511 0.221832 0.369904 -0.442596 0.226624 0.375244 -0.467651 0.231476 0.380676 -0.493225 0.236267 0.385925 -0.519592 0.241241 0.391418 -0.546539 0.246277 0.396942 -0.573730 0.251251 0.402313 -0.601288 0.256409 0.407898 -0.628876 0.261475 0.413300 -0.656494 0.266754 0.418915 -0.683838 0.272064 0.424561 -0.710632 0.277252 0.430023 -0.737152 0.282654 0.435699 -0.763123 0.288055 0.441345 -0.788422 0.293335 0.446869 -0.813141 0.298828 0.452515 -0.076843 0.179657 0.301819 -0.092194 0.183411 0.306244 -0.108734 0.187164 0.310638 -0.126648 0.191132 0.315186 -0.145752 0.195160 0.319855 -0.165833 0.199158 0.324463 -0.186920 0.203400 0.329315 -0.208862 0.207672 0.334198 -0.231476 0.211945 0.338989 -0.254791 0.216400 0.344055 -0.278534 0.220825 0.349030 -0.302887 0.225433 0.354156 -0.327606 0.230103 0.359375 -0.352448 0.234741 0.364502 -0.377625 0.239563 0.369781 -0.402802 0.244507 0.375122 -0.427917 0.249329 0.380371 -0.453033 0.254364 0.385803 -0.478363 0.259430 0.391266 -0.504272 0.264435 0.396667 -0.530945 0.269653 0.402161 -0.558014 0.274750 0.407623 -0.585480 0.280060 0.413208 -0.613220 0.285400 0.418762 -0.640808 0.290649 0.424286 -0.668304 0.296082 0.429871 -0.695557 0.301544 0.435577 -0.722168 0.306915 0.441071 -0.748505 0.312408 0.446716 -0.774292 0.317932 0.452362 -0.799255 0.323364 0.457916 -0.823730 0.328979 0.463654 -0.082336 0.204041 0.310486 -0.098145 0.208099 0.315094 -0.115265 0.212128 0.319641 -0.133759 0.216400 0.324371 -0.153351 0.220703 0.329193 -0.173889 0.225006 0.333954 -0.195404 0.229462 0.338898 -0.217773 0.234039 0.343903 -0.240662 0.238586 0.348877 -0.264343 0.243286 0.354004 -0.288361 0.247955 0.359100 -0.312927 0.252838 0.364349 -0.337799 0.257751 0.369598 -0.362854 0.262604 0.374847 -0.388062 0.267670 0.380249 -0.413422 0.272827 0.385651 -0.438507 0.277832 0.390991 -0.463654 0.283081 0.396515 -0.489349 0.288361 0.402039 -0.515564 0.293549 0.407471 -0.542542 0.298950 0.413086 -0.569763 0.304199 0.418488 -0.597412 0.309692 0.424164 -0.625183 0.315155 0.429779 -0.652710 0.320557 0.435242 -0.680176 0.326111 0.440948 -0.707184 0.331665 0.446564 -0.733673 0.337128 0.452087 -0.759796 0.342773 0.457733 -0.785278 0.348389 0.463501 -0.809967 0.353912 0.469116 -0.834106 0.359558 0.474915 -0.088074 0.229675 0.319489 -0.104523 0.234039 0.324249 -0.122223 0.238312 0.328979 -0.141266 0.242828 0.333832 -0.161346 0.247406 0.338776 -0.182312 0.251984 0.343658 -0.204254 0.256714 0.348755 -0.226837 0.261383 0.353729 -0.250214 0.266266 0.358948 -0.274170 0.271271 0.364227 -0.298401 0.276123 0.369385 -0.323181 0.281250 0.374725 -0.348267 0.286377 0.380127 -0.373413 0.291443 0.385376 -0.398712 0.296692 0.390869 -0.424072 0.302002 0.396393 -0.449188 0.307220 0.401764 -0.474487 0.312592 0.407379 -0.500549 0.318024 0.412933 -0.527100 0.323395 0.418365 -0.554291 0.328949 0.424011 -0.581696 0.334351 0.429504 -0.609436 0.339905 0.435120 -0.637207 0.345490 0.440796 -0.664642 0.350952 0.446259 -0.691956 0.356628 0.451965 -0.718842 0.362305 0.457581 -0.745087 0.367798 0.463196 -0.770935 0.373505 0.468994 -0.796021 0.379028 0.474640 -0.820557 0.384705 0.480469 -0.844330 0.390350 0.486328 -0.094208 0.256470 0.328827 -0.111267 0.261047 0.333710 -0.129517 0.265656 0.338531 -0.149017 0.270386 0.343536 -0.169617 0.275208 0.348633 -0.191010 0.279968 0.353638 -0.213379 0.284943 0.358826 -0.236267 0.289886 0.363953 -0.259949 0.294952 0.369263 -0.284149 0.300079 0.374542 -0.308685 0.305206 0.379852 -0.333649 0.310455 0.385254 -0.358856 0.315765 0.390717 -0.384094 0.321014 0.396088 -0.409515 0.326447 0.401672 -0.434845 0.331879 0.407196 -0.459961 0.337250 0.412628 -0.485626 0.342804 0.418213 -0.511810 0.348175 0.423706 -0.538788 0.353821 0.429352 -0.566132 0.359436 0.434998 -0.593719 0.364899 0.440491 -0.621490 0.370544 0.446136 -0.649261 0.376251 0.451843 -0.676575 0.381775 0.457306 -0.703705 0.387451 0.463104 -0.730408 0.393127 0.468842 -0.756409 0.398682 0.474518 -0.781952 0.404388 0.480347 -0.806763 0.409943 0.486084 -0.830963 0.415588 0.491974 -0.854309 0.421204 0.497864 -0.100739 0.284271 0.338379 -0.118347 0.289093 0.343384 -0.137177 0.293915 0.348358 -0.157196 0.298889 0.353516 -0.178131 0.303741 0.358551 -0.200043 0.308838 0.363770 -0.222748 0.314026 0.369080 -0.246002 0.319153 0.374359 -0.269958 0.324402 0.379700 -0.294403 0.329712 0.385101 -0.319153 0.334961 0.390442 -0.344299 0.340363 0.395935 -0.369629 0.345856 0.401550 -0.394897 0.351196 0.406921 -0.420380 0.356720 0.412537 -0.445526 0.362152 0.417908 -0.470856 0.367767 0.423615 -0.496918 0.373413 0.429230 -0.523438 0.378876 0.434662 -0.550598 0.384583 0.440399 -0.578156 0.390228 0.446014 -0.605743 0.395721 0.451538 -0.633575 0.401459 0.457184 -0.661224 0.407166 0.462952 -0.688416 0.412689 0.468567 -0.715393 0.418396 0.474365 -0.741821 0.424042 0.480194 -0.767609 0.429596 0.485901 -0.792847 0.435303 0.491821 -0.817322 0.440796 0.497589 -0.841187 0.446533 0.503479 -0.864136 0.452240 0.509430 -0.107574 0.312958 0.348236 -0.125824 0.317963 0.353333 -0.145111 0.322968 0.358429 -0.165619 0.328125 0.363678 -0.187012 0.333221 0.368835 -0.209320 0.338440 0.374176 -0.232361 0.343811 0.379578 -0.255981 0.349030 0.384888 -0.280182 0.354431 0.390320 -0.304901 0.359924 0.395844 -0.329773 0.365234 0.401276 -0.355103 0.370758 0.406769 -0.380463 0.376373 0.412384 -0.405823 0.381805 0.417786 -0.431274 0.387390 0.423431 -0.456421 0.392883 0.428955 -0.482056 0.398590 0.434570 -0.508362 0.404205 0.440186 -0.535126 0.409790 0.445709 -0.562531 0.415436 0.451385 -0.590210 0.421143 0.457031 -0.617889 0.426697 0.462616 -0.645630 0.432373 0.468414 -0.673187 0.438080 0.474213 -0.700195 0.443665 0.479919 -0.726929 0.449432 0.485779 -0.753021 0.455048 0.491516 -0.778625 0.460938 0.497437 -0.803558 0.466827 0.503357 -0.827698 0.472595 0.509155 -0.851166 0.478424 0.515106 -0.873718 0.484375 0.521027 -0.114777 0.342346 0.358337 -0.133484 0.347382 0.363434 -0.153442 0.352631 0.368652 -0.174438 0.357941 0.374023 -0.196198 0.363220 0.379333 -0.218903 0.368591 0.384735 -0.242279 0.374023 0.390167 -0.266144 0.379395 0.395569 -0.290619 0.384888 0.401093 -0.315491 0.390411 0.406586 -0.340576 0.395874 0.412079 -0.365936 0.401489 0.417664 -0.391327 0.406952 0.423157 -0.416840 0.412598 0.428802 -0.442230 0.418243 0.434387 -0.467438 0.423767 0.439911 -0.493408 0.429474 0.445587 -0.520020 0.435150 0.451233 -0.547028 0.440704 0.456757 -0.574554 0.446503 0.462524 -0.602295 0.452271 0.468231 -0.629944 0.458008 0.473938 -0.657684 0.463898 0.479767 -0.684998 0.469849 0.485626 -0.711853 0.475647 0.491394 -0.738312 0.481598 0.497284 -0.764130 0.487427 0.503052 -0.789429 0.493469 0.509033 -0.814087 0.499481 0.514923 -0.837860 0.505341 0.520721 -0.860870 0.511475 0.526733 -0.882996 0.517456 0.532623 -0.122345 0.372253 0.368530 -0.141571 0.377441 0.373749 -0.162048 0.382812 0.379150 -0.183441 0.388245 0.384613 -0.205627 0.393555 0.389923 -0.228699 0.399078 0.395416 -0.252411 0.404602 0.400940 -0.276489 0.410004 0.406342 -0.301208 0.415588 0.411926 -0.326324 0.421173 0.417542 -0.351501 0.426697 0.423065 -0.376953 0.432281 0.428680 -0.402374 0.437836 0.434113 -0.427826 0.443481 0.439789 -0.453247 0.449310 0.445465 -0.478546 0.454926 0.450958 -0.504913 0.460846 0.456604 -0.531769 0.466766 0.462341 -0.558929 0.472626 0.467957 -0.586609 0.478546 0.473785 -0.614380 0.484619 0.479614 -0.641998 0.490540 0.485321 -0.669586 0.496582 0.491211 -0.696564 0.502533 0.496979 -0.723358 0.508698 0.502899 -0.749573 0.514801 0.508850 -0.775085 0.520782 0.514648 -0.800110 0.526917 0.520569 -0.824402 0.533051 0.526550 -0.847748 0.539032 0.532288 -0.870331 0.545135 0.538239 -0.892059 0.551239 0.544220 -0.130249 0.402496 0.379028 -0.150024 0.407806 0.384308 -0.170929 0.413300 0.389801 -0.192810 0.418762 0.395294 -0.215332 0.424164 0.400726 -0.238739 0.429749 0.406219 -0.262695 0.435303 0.411804 -0.287079 0.440765 0.417267 -0.311951 0.446472 0.422913 -0.337158 0.452209 0.428497 -0.362488 0.457886 0.433990 -0.388000 0.463745 0.439636 -0.413452 0.469543 0.445129 -0.438873 0.475525 0.450806 -0.464233 0.481506 0.456451 -0.489960 0.487396 0.462067 -0.516510 0.493500 0.467804 -0.543610 0.499664 0.473633 -0.570923 0.505676 0.479309 -0.598663 0.511810 0.485199 -0.626495 0.518036 0.491089 -0.653992 0.524048 0.496857 -0.681335 0.530273 0.502777 -0.708191 0.536377 0.508545 -0.734741 0.542542 0.514496 -0.760651 0.548767 0.520508 -0.785858 0.554840 0.526276 -0.810516 0.561035 0.532196 -0.834442 0.567230 0.538086 -0.857422 0.573212 0.543884 -0.879578 0.579315 0.549774 -0.900787 0.585419 0.555634 -0.138458 0.432983 0.389648 -0.158722 0.438354 0.394989 -0.180115 0.443878 0.400543 -0.202362 0.449554 0.406067 -0.225250 0.455109 0.411530 -0.248962 0.460907 0.417114 -0.273193 0.466766 0.422729 -0.297760 0.472534 0.428253 -0.322845 0.478455 0.433838 -0.348175 0.484436 0.439514 -0.373535 0.490356 0.444977 -0.399139 0.496490 0.450684 -0.424500 0.502472 0.456177 -0.449921 0.508667 0.461884 -0.475372 0.514862 0.467682 -0.501404 0.520905 0.473328 -0.528198 0.527161 0.479187 -0.555511 0.533478 0.485046 -0.582916 0.539581 0.490753 -0.610687 0.545868 0.496704 -0.638458 0.552185 0.502625 -0.665863 0.558350 0.508392 -0.693024 0.564545 0.514313 -0.719635 0.570709 0.520203 -0.745880 0.577026 0.526154 -0.771545 0.583191 0.532013 -0.796387 0.589264 0.537811 -0.820740 0.595428 0.543732 -0.844238 0.601624 0.549652 -0.866730 0.607544 0.555359 -0.888489 0.613617 0.561157 -0.909210 0.619629 0.567017 -0.146973 0.464142 0.400391 -0.167664 0.469788 0.405762 -0.189545 0.475647 0.411377 -0.212158 0.481537 0.416992 -0.235352 0.487335 0.422424 -0.259308 0.493408 0.428101 -0.283813 0.499512 0.433716 -0.308594 0.505493 0.439270 -0.333801 0.511688 0.444855 -0.359100 0.517700 0.450409 -0.384644 0.523956 0.456055 -0.410217 0.530243 0.461792 -0.435608 0.536377 0.467407 -0.460907 0.542694 0.473236 -0.486694 0.549011 0.479034 -0.512970 0.555237 0.484711 -0.540009 0.561584 0.490662 -0.567413 0.567932 0.496521 -0.594940 0.574158 0.502350 -0.622620 0.580444 0.508270 -0.650299 0.586792 0.514191 -0.677521 0.592957 0.520020 -0.704468 0.599243 0.526001 -0.730835 0.605347 0.531738 -0.756805 0.611542 0.537659 -0.782135 0.617767 0.543610 -0.806702 0.623718 0.549347 -0.830597 0.629883 0.555206 -0.853790 0.635895 0.561035 -0.875824 0.641754 0.566742 -0.897125 0.647644 0.572479 -0.917328 0.653503 0.578186 -0.155762 0.496613 0.411255 -0.176941 0.502502 0.416687 -0.199158 0.508606 0.422272 -0.222137 0.514740 0.427917 -0.245667 0.520782 0.433441 -0.269897 0.527039 0.439087 -0.294586 0.533295 0.444702 -0.319489 0.539429 0.450256 -0.344849 0.545776 0.455902 -0.370209 0.551971 0.461517 -0.395813 0.558350 0.467255 -0.421295 0.564667 0.473083 -0.446594 0.570923 0.478699 -0.471985 0.577332 0.484589 -0.498077 0.583740 0.490509 -0.524597 0.590027 0.496246 -0.551788 0.596405 0.502228 -0.579346 0.602722 0.508118 -0.606873 0.608948 0.513885 -0.634552 0.615234 0.519897 -0.661896 0.621368 0.525665 -0.689056 0.627625 0.531586 -0.715759 0.633850 0.537476 -0.741852 0.639862 0.543304 -0.767517 0.645996 0.549164 -0.792511 0.652039 0.555084 -0.816742 0.657928 0.560730 -0.840271 0.663879 0.566589 -0.862915 0.669708 0.572327 -0.884644 0.675354 0.577942 -0.905426 0.681122 0.583588 -0.925079 0.686646 0.589050 -0.164764 0.530212 0.422150 -0.186401 0.536255 0.427673 -0.208954 0.542542 0.433289 -0.232300 0.548859 0.438965 -0.256104 0.555023 0.444397 -0.280548 0.561432 0.450134 -0.305267 0.567657 0.455627 -0.330505 0.574097 0.461334 -0.355927 0.580475 0.467102 -0.381317 0.586761 0.472778 -0.406921 0.593140 0.478607 -0.432343 0.599609 0.484436 -0.457581 0.605865 0.490173 -0.483215 0.612274 0.496063 -0.509552 0.618652 0.502075 -0.536255 0.624817 0.507843 -0.563599 0.631165 0.513733 -0.591156 0.637451 0.519745 -0.618683 0.643646 0.525513 -0.646301 0.649872 0.531433 -0.673401 0.655853 0.537201 -0.700378 0.661957 0.543152 -0.726898 0.668060 0.549011 -0.752655 0.673920 0.554779 -0.777985 0.679871 0.560577 -0.802643 0.685791 0.566467 -0.826447 0.691406 0.572021 -0.849640 0.697174 0.577789 -0.871857 0.702850 0.583435 -0.893066 0.708282 0.588898 -0.913391 0.713867 0.594513 -0.932465 0.719116 0.599884 -0.174072 0.564514 0.433167 -0.196075 0.570770 0.438660 -0.219025 0.577179 0.444305 -0.242584 0.583618 0.449982 -0.266663 0.589844 0.455475 -0.291290 0.596283 0.461212 -0.316193 0.602570 0.466797 -0.341522 0.609070 0.472626 -0.367004 0.615479 0.478455 -0.392426 0.621765 0.484192 -0.417969 0.628174 0.490051 -0.443390 0.634521 0.495941 -0.468567 0.640747 0.501740 -0.494446 0.647095 0.507660 -0.520996 0.653412 0.513580 -0.547974 0.659485 0.519409 -0.575378 0.665741 0.525391 -0.602783 0.671753 0.531128 -0.630402 0.677856 0.537079 -0.657898 0.683990 0.543030 -0.684814 0.689789 0.548737 -0.711517 0.695740 0.554626 -0.737732 0.701630 0.560455 -0.763184 0.707245 0.566132 -0.788208 0.713043 0.571930 -0.812469 0.718658 0.577637 -0.835907 0.724182 0.583191 -0.858643 0.729645 0.588776 -0.880310 0.734985 0.594238 -0.901215 0.740295 0.599731 -0.921021 0.745605 0.605194 -0.939636 0.750641 0.610413 -0.183594 0.599457 0.444153 -0.205933 0.605682 0.449646 -0.229248 0.612122 0.455322 -0.252960 0.618439 0.460907 -0.277313 0.624847 0.466644 -0.302155 0.631287 0.472473 -0.327179 0.637634 0.478180 -0.352570 0.643982 0.484070 -0.378143 0.650330 0.489868 -0.403534 0.656586 0.495667 -0.428955 0.662903 0.501617 -0.454285 0.669159 0.507507 -0.479614 0.675262 0.513336 -0.505798 0.681427 0.519287 -0.532379 0.687469 0.525055 -0.559570 0.693573 0.531006 -0.587036 0.699646 0.536926 -0.614410 0.705475 0.542694 -0.641968 0.711395 0.548584 -0.669189 0.717285 0.554443 -0.695953 0.722900 0.560181 -0.722382 0.728668 0.565979 -0.748291 0.734314 0.571777 -0.773438 0.739777 0.577362 -0.798096 0.745331 0.583038 -0.822052 0.750702 0.588684 -0.845001 0.755890 0.594116 -0.867340 0.761169 0.599640 -0.888641 0.766205 0.604950 -0.908966 0.771271 0.610291 -0.928284 0.776276 0.615601 -0.946381 0.781036 0.620728 -0.193268 0.634430 0.455170 -0.215973 0.640686 0.460754 -0.239532 0.647095 0.466522 -0.263489 0.653351 0.472198 -0.288086 0.659698 0.477997 -0.313049 0.666107 0.483887 -0.338165 0.672241 0.489624 -0.363647 0.678558 0.495483 -0.389130 0.684753 0.501434 -0.414490 0.690887 0.507233 -0.439911 0.697021 0.513184 -0.465149 0.703156 0.519135 -0.490692 0.709106 0.524902 -0.517151 0.715118 0.530853 -0.543854 0.720947 0.536621 -0.571136 0.726898 0.542542 -0.598633 0.732697 0.548462 -0.625946 0.738312 0.554169 -0.653320 0.744080 0.560028 -0.680389 0.749695 0.565857 -0.706848 0.755096 0.571442 -0.733002 0.760620 0.577179 -0.758575 0.766022 0.582886 -0.783386 0.771240 0.588379 -0.807678 0.776489 0.593964 -0.831085 0.781494 0.599335 -0.853851 0.786621 0.604797 -0.875702 0.791565 0.610168 -0.896515 0.796356 0.615326 -0.916412 0.801147 0.620605 -0.935211 0.805847 0.625763 -0.952759 0.810333 0.630737 -0.202972 0.669037 0.466248 -0.226166 0.675323 0.472015 -0.249939 0.681641 0.477875 -0.274139 0.687836 0.483582 -0.298859 0.694061 0.489471 -0.324005 0.700287 0.495361 -0.349152 0.706329 0.501160 -0.374634 0.712433 0.507050 -0.400116 0.718536 0.513000 -0.425385 0.724457 0.518829 -0.450684 0.730438 0.524780 -0.475861 0.736237 0.530518 -0.501862 0.742096 0.536499 -0.528412 0.747925 0.542419 -0.555328 0.753540 0.548157 -0.582611 0.759247 0.554016 -0.610077 0.764862 0.559875 -0.637268 0.770233 0.565582 -0.664429 0.775726 0.571350 -0.691284 0.781097 0.577057 -0.717438 0.786255 0.582611 -0.743286 0.791504 0.588226 -0.768585 0.796661 0.593842 -0.793060 0.801544 0.599213 -0.816956 0.806519 0.604675 -0.839996 0.811279 0.609924 -0.862335 0.816101 0.615204 -0.883728 0.820801 0.620483 -0.904083 0.825256 0.625519 -0.923462 0.829742 0.630585 -0.941742 0.834137 0.635559 -0.958771 0.838318 0.640320 -0.212952 0.703217 0.477539 -0.236389 0.709442 0.483429 -0.260406 0.715607 0.489319 -0.284790 0.721588 0.495056 -0.309692 0.727692 0.501007 -0.334869 0.733734 0.506897 -0.360077 0.739624 0.512726 -0.385590 0.745575 0.518677 -0.410980 0.751465 0.524628 -0.436188 0.757111 0.530365 -0.461334 0.762909 0.536346 -0.486786 0.768524 0.542145 -0.512939 0.774170 0.548004 -0.539673 0.779755 0.553894 -0.566620 0.785065 0.559631 -0.593933 0.790558 0.565430 -0.621277 0.795898 0.571198 -0.648407 0.801025 0.576782 -0.675323 0.806244 0.582489 -0.701874 0.811310 0.588135 -0.727844 0.816254 0.593536 -0.753357 0.821228 0.599091 -0.778137 0.825897 0.604401 -0.802429 0.830658 0.609802 -0.825928 0.835358 0.615112 -0.848541 0.839813 0.620239 -0.870392 0.844269 0.625397 -0.891357 0.848633 0.630463 -0.911255 0.852814 0.635315 -0.930176 0.856964 0.640228 -0.947937 0.861053 0.645020 -0.964447 0.864899 0.649628 -0.223022 0.736694 0.489014 -0.246735 0.742737 0.494873 -0.270996 0.748779 0.500824 -0.295502 0.754578 0.506622 -0.320496 0.760468 0.512543 -0.345795 0.766266 0.518524 -0.371002 0.771881 0.524292 -0.396423 0.777649 0.530243 -0.421661 0.783203 0.536041 -0.446869 0.788818 0.541992 -0.471985 0.794373 0.547882 -0.497620 0.799683 0.553558 -0.523987 0.805084 0.559448 -0.550812 0.810394 0.565277 -0.577850 0.815521 0.570923 -0.605042 0.820648 0.576630 -0.632294 0.825745 0.582336 -0.659241 0.830597 0.587830 -0.686005 0.835541 0.593384 -0.712219 0.840363 0.598969 -0.737885 0.844910 0.604248 -0.763031 0.849579 0.609650 -0.787537 0.853973 0.614868 -0.811401 0.858459 0.620117 -0.834503 0.862762 0.625244 -0.856689 0.866882 0.630188 -0.878143 0.871063 0.635193 -0.898651 0.875092 0.640076 -0.918091 0.878937 0.644836 -0.936523 0.882721 0.649506 -0.953796 0.886475 0.654114 -0.969788 0.890045 0.658508 -0.233215 0.769257 0.500580 -0.257141 0.775116 0.506470 -0.281525 0.780914 0.512451 -0.306183 0.786530 0.518219 -0.331299 0.792175 0.524170 -0.356537 0.797821 0.530090 -0.381775 0.803223 0.535889 -0.407135 0.808746 0.541840 -0.432220 0.813995 0.547577 -0.457306 0.819305 0.553406 -0.482605 0.824585 0.559326 -0.508484 0.829651 0.565002 -0.534943 0.834747 0.570770 -0.561859 0.839813 0.576477 -0.588806 0.844635 0.582001 -0.616028 0.849518 0.587677 -0.643158 0.854279 0.593262 -0.669861 0.858765 0.598663 -0.696259 0.863434 0.604126 -0.722137 0.867767 0.609375 -0.747559 0.872162 0.614685 -0.772430 0.876465 0.619965 -0.796509 0.880615 0.625000 -0.819977 0.884705 0.630035 -0.842743 0.888702 0.635071 -0.864563 0.892487 0.639862 -0.885498 0.896301 0.644684 -0.905579 0.900024 0.649384 -0.924530 0.903534 0.653900 -0.942474 0.906982 0.658356 -0.959198 0.910278 0.662628 -0.974731 0.913574 0.666962 -0.243439 0.800842 0.512115 -0.267517 0.806458 0.518066 -0.292084 0.812012 0.524017 -0.316833 0.817352 0.529816 -0.341980 0.822784 0.535767 -0.367249 0.828125 0.541656 -0.392426 0.833282 0.547424 -0.417725 0.838501 0.553284 -0.442688 0.843536 0.558990 -0.467651 0.848541 0.564850 -0.493256 0.853516 0.570618 -0.519196 0.858276 0.576202 -0.545776 0.863068 0.581879 -0.572693 0.867798 0.587524 -0.599670 0.872345 0.593018 -0.626709 0.876892 0.598480 -0.653656 0.881317 0.604004 -0.680145 0.885498 0.609222 -0.706268 0.889801 0.614532 -0.731812 0.893860 0.619720 -0.756958 0.897919 0.624847 -0.781464 0.901855 0.629944 -0.805176 0.905579 0.634796 -0.828247 0.909363 0.639709 -0.850616 0.913025 0.644592 -0.871948 0.916504 0.649170 -0.892517 0.919952 0.653809 -0.912109 0.923248 0.658264 -0.930573 0.926422 0.662506 -0.948029 0.929596 0.666870 -0.964264 0.932556 0.670990 -0.979309 0.935455 0.674988 -0.253693 0.831268 0.523743 -0.277954 0.836609 0.529633 -0.302612 0.841888 0.535583 -0.327454 0.846893 0.541382 -0.352600 0.852142 0.547272 -0.377716 0.856995 0.553009 -0.402954 0.862000 0.558838 -0.428070 0.866882 0.564697 -0.452942 0.871613 0.570312 -0.477997 0.876343 0.576050 -0.503723 0.880981 0.581726 -0.529846 0.885406 0.587280 -0.556488 0.889923 0.592865 -0.583374 0.894287 0.598389 -0.610229 0.898438 0.603699 -0.637177 0.902649 0.609100 -0.663788 0.906616 0.614319 -0.690063 0.910645 0.619568 -0.715942 0.914581 0.624725 -0.741211 0.918243 0.629700 -0.765930 0.921936 0.634674 -0.790100 0.925568 0.639587 -0.813416 0.928986 0.644287 -0.836182 0.932373 0.649048 -0.858093 0.935669 0.653656 -0.878998 0.938782 0.658020 -0.899139 0.941864 0.662415 -0.918182 0.944763 0.666656 -0.936279 0.947662 0.670868 -0.953247 0.950409 0.674896 -0.969025 0.953033 0.678802 -0.983521 0.955597 0.682617 -0.263947 0.860260 0.535309 -0.288361 0.865326 0.541229 -0.313049 0.870300 0.547119 -0.337921 0.875122 0.552856 -0.363129 0.879913 0.558716 -0.388153 0.884583 0.564423 -0.413300 0.889252 0.570160 -0.438293 0.893829 0.575928 -0.463013 0.898163 0.581482 -0.488281 0.902588 0.587128 -0.514160 0.906830 0.592743 -0.540314 0.911011 0.598114 -0.566986 0.915070 0.603577 -0.593872 0.919128 0.608978 -0.620544 0.922943 0.614166 -0.647308 0.926758 0.619446 -0.673676 0.930420 0.624481 -0.699707 0.934082 0.629608 -0.725281 0.937592 0.634552 -0.750183 0.940918 0.639343 -0.774628 0.944244 0.644196 -0.798370 0.947479 0.648895 -0.821350 0.950531 0.653412 -0.843658 0.953522 0.657928 -0.865173 0.956482 0.662292 -0.885651 0.959229 0.666565 -0.905365 0.961975 0.670715 -0.923981 0.964508 0.674683 -0.941559 0.967072 0.678680 -0.958099 0.969482 0.682495 -0.973358 0.971710 0.686096 -0.987427 0.973938 0.689667 -0.274170 0.887817 0.546844 -0.298645 0.892548 0.552704 -0.323334 0.897156 0.558441 -0.348328 0.901703 0.564270 -0.373444 0.906189 0.570007 -0.398407 0.910492 0.575653 -0.423462 0.914795 0.581329 -0.448303 0.919037 0.587006 -0.473022 0.923035 0.592438 -0.498413 0.927063 0.597961 -0.524353 0.931000 0.603394 -0.550629 0.934784 0.608673 -0.577301 0.938477 0.614075 -0.603882 0.942078 0.619202 -0.630646 0.945587 0.624359 -0.657135 0.949066 0.629456 -0.683258 0.952362 0.634338 -0.708984 0.955566 0.639252 -0.734222 0.958740 0.644073 -0.758789 0.961700 0.648682 -0.782867 0.964630 0.653290 -0.806244 0.967529 0.657806 -0.828827 0.970184 0.662140 -0.850739 0.972839 0.666443 -0.871735 0.975311 0.670502 -0.891968 0.977814 0.674591 -0.911163 0.980164 0.678589 -0.929321 0.982361 0.682312 -0.946533 0.984589 0.686035 -0.962555 0.986572 0.689575 -0.977356 0.988525 0.692993 -0.990997 0.990417 0.696289 -0.043701 0.041870 0.265564 -0.056641 0.043274 0.268463 -0.069855 0.044739 0.271393 -0.083893 0.046295 0.274475 -0.098999 0.047913 0.277710 -0.115265 0.049530 0.280975 -0.132812 0.051300 0.284424 -0.151306 0.053040 0.287872 -0.170868 0.054962 0.291534 -0.191315 0.056854 0.295319 -0.212433 0.058807 0.299042 -0.234375 0.060852 0.303040 -0.256927 0.062988 0.307098 -0.279877 0.065125 0.311157 -0.303375 0.067413 0.315369 -0.327301 0.069733 0.319733 -0.351440 0.072052 0.324066 -0.375854 0.074554 0.328583 -0.400269 0.077057 0.333038 -0.424805 0.079681 0.337708 -0.449310 0.082367 0.342438 -0.473785 0.085083 0.347137 -0.499115 0.087952 0.352020 -0.525085 0.090942 0.356995 -0.551483 0.093903 0.361908 -0.578400 0.097046 0.366943 -0.605591 0.100281 0.372131 -0.632751 0.103516 0.377197 -0.659943 0.106934 0.382446 -0.686737 0.110382 0.387604 -0.713348 0.113953 0.392944 -0.739502 0.117615 0.398346 -0.047119 0.054352 0.271362 -0.060211 0.055969 0.274414 -0.073700 0.057587 0.277557 -0.088104 0.059357 0.280914 -0.103577 0.061127 0.284241 -0.120453 0.062988 0.287781 -0.138428 0.064941 0.291443 -0.157410 0.066925 0.295135 -0.177368 0.069000 0.298950 -0.198212 0.071167 0.302948 -0.219727 0.073364 0.306885 -0.242004 0.075653 0.311066 -0.264862 0.078064 0.315277 -0.288116 0.080475 0.319489 -0.311920 0.083008 0.323914 -0.335968 0.085602 0.328339 -0.360382 0.088287 0.332916 -0.384979 0.091125 0.337585 -0.409515 0.093933 0.342224 -0.434174 0.096954 0.347046 -0.458710 0.100037 0.351929 -0.483582 0.103149 0.356750 -0.509247 0.106384 0.361786 -0.535553 0.109772 0.366821 -0.562256 0.113159 0.371857 -0.589417 0.116669 0.377075 -0.616699 0.120270 0.382324 -0.643890 0.123901 0.387451 -0.671112 0.127716 0.392822 -0.697815 0.131500 0.398071 -0.724304 0.135437 0.403473 -0.750366 0.139496 0.408966 -0.050751 0.067749 0.277496 -0.064026 0.069580 0.280823 -0.077820 0.071442 0.284149 -0.092682 0.073425 0.287689 -0.108704 0.075439 0.291260 -0.126007 0.077545 0.294983 -0.144470 0.079773 0.298859 -0.163879 0.082001 0.302734 -0.184265 0.084381 0.306793 -0.205505 0.086823 0.310913 -0.227386 0.089355 0.315063 -0.250031 0.091980 0.319397 -0.273193 0.094727 0.323822 -0.296753 0.097473 0.328247 -0.320770 0.100372 0.332825 -0.345032 0.103333 0.337311 -0.369629 0.106415 0.342072 -0.394409 0.109650 0.346924 -0.419006 0.112823 0.351654 -0.443817 0.116241 0.356628 -0.468445 0.119659 0.361633 -0.493713 0.123138 0.366608 -0.519745 0.126831 0.371735 -0.546387 0.130554 0.376923 -0.573273 0.134277 0.382080 -0.600586 0.138214 0.387329 -0.627869 0.142090 0.392578 -0.655212 0.146179 0.397980 -0.682404 0.150330 0.403320 -0.708984 0.154419 0.408691 -0.735382 0.158783 0.414124 -0.761230 0.163147 0.419647 -0.054626 0.082367 0.284088 -0.068085 0.084381 0.287537 -0.082336 0.086578 0.291168 -0.097626 0.088867 0.294891 -0.114136 0.091156 0.298676 -0.132019 0.093628 0.302612 -0.150909 0.096191 0.306702 -0.170746 0.098755 0.310730 -0.191620 0.101501 0.314972 -0.213165 0.104340 0.319275 -0.235413 0.107178 0.323608 -0.258362 0.110229 0.328125 -0.281738 0.113251 0.332581 -0.305634 0.116425 0.337219 -0.329956 0.119751 0.341949 -0.354431 0.123047 0.346680 -0.379211 0.126526 0.351532 -0.404022 0.130096 0.356506 -0.428772 0.133667 0.361389 -0.453522 0.137451 0.366455 -0.478516 0.141296 0.371582 -0.504120 0.145081 0.376678 -0.530518 0.149078 0.381958 -0.557404 0.153198 0.387177 -0.584534 0.157257 0.392426 -0.611938 0.161499 0.397827 -0.639282 0.165741 0.403046 -0.666626 0.170135 0.408539 -0.693695 0.174622 0.414032 -0.720245 0.179047 0.419373 -0.746429 0.183624 0.424927 -0.772125 0.188324 0.430450 -0.058777 0.098572 0.291077 -0.072510 0.100952 0.294708 -0.087097 0.103485 0.298584 -0.102936 0.106140 0.302521 -0.119995 0.108765 0.306488 -0.138306 0.111603 0.310638 -0.157715 0.114532 0.314880 -0.177979 0.117432 0.319092 -0.199188 0.120544 0.323486 -0.221222 0.123749 0.328033 -0.243774 0.126984 0.332489 -0.267059 0.130341 0.337067 -0.290680 0.133759 0.341736 -0.314880 0.137299 0.346558 -0.339355 0.140991 0.351410 -0.364044 0.144623 0.356262 -0.388916 0.148468 0.361298 -0.413849 0.152374 0.366333 -0.438721 0.156311 0.371338 -0.463531 0.160400 0.376556 -0.488922 0.164551 0.381805 -0.514893 0.168732 0.386932 -0.541565 0.173065 0.392303 -0.568481 0.177368 0.397552 -0.595917 0.181854 0.402924 -0.623505 0.186432 0.408417 -0.650848 0.190918 0.413757 -0.678192 0.195618 0.419250 -0.705139 0.200409 0.424805 -0.731506 0.205078 0.430176 -0.757507 0.209961 0.435791 -0.783020 0.214905 0.441376 -0.063141 0.116638 0.298492 -0.077179 0.119324 0.302338 -0.092255 0.122253 0.306396 -0.108643 0.125244 0.310516 -0.126251 0.128235 0.314636 -0.145020 0.131409 0.318970 -0.164886 0.134674 0.323364 -0.185608 0.137970 0.327759 -0.207214 0.141449 0.332367 -0.229492 0.144897 0.336853 -0.252472 0.148529 0.341614 -0.276062 0.152283 0.346436 -0.299957 0.156036 0.351166 -0.324402 0.159912 0.356171 -0.349121 0.163940 0.361145 -0.373871 0.167908 0.366058 -0.398926 0.172089 0.371216 -0.423950 0.176331 0.376404 -0.448792 0.180511 0.381531 -0.473877 0.184967 0.386810 -0.499634 0.189423 0.392120 -0.525879 0.193878 0.397430 -0.552856 0.198547 0.402802 -0.580017 0.203094 0.408142 -0.607544 0.207855 0.413635 -0.635162 0.212708 0.419098 -0.662476 0.217468 0.424500 -0.689697 0.222412 0.430054 -0.716522 0.227417 0.435669 -0.742737 0.232361 0.441162 -0.768616 0.237457 0.446716 -0.793823 0.242615 0.452362 -0.067780 0.136475 0.306274 -0.082184 0.139526 0.310303 -0.097778 0.142761 0.314545 -0.114716 0.146118 0.318878 -0.132843 0.149445 0.323151 -0.152130 0.152954 0.327637 -0.172455 0.156616 0.332214 -0.193512 0.160217 0.336731 -0.215546 0.164001 0.341492 -0.238190 0.167755 0.346191 -0.261505 0.171783 0.351013 -0.285370 0.175812 0.356018 -0.309540 0.179901 0.360870 -0.334167 0.184113 0.365936 -0.359039 0.188416 0.371063 -0.383972 0.192719 0.376129 -0.409088 0.197144 0.381409 -0.434235 0.201752 0.386658 -0.459076 0.206238 0.391876 -0.484406 0.210938 0.397247 -0.510406 0.215576 0.402496 -0.537140 0.220398 0.407990 -0.564331 0.225281 0.413483 -0.591644 0.230103 0.418793 -0.619293 0.235138 0.424377 -0.646912 0.240204 0.429901 -0.674194 0.245209 0.435364 -0.701294 0.250366 0.440979 -0.727966 0.255585 0.446564 -0.753967 0.260742 0.452026 -0.779572 0.265991 0.457703 -0.804413 0.271240 0.463257 -0.072693 0.157990 0.314453 -0.087524 0.161377 0.318634 -0.103668 0.164978 0.323059 -0.121155 0.168610 0.327545 -0.139771 0.172272 0.332001 -0.159546 0.176117 0.336639 -0.180206 0.179962 0.341278 -0.201874 0.184021 0.346039 -0.224213 0.188110 0.350891 -0.247162 0.192200 0.355774 -0.270844 0.196472 0.360748 -0.294922 0.200867 0.365814 -0.319336 0.205170 0.370789 -0.344177 0.209686 0.376038 -0.369263 0.214294 0.381256 -0.394257 0.218872 0.386414 -0.419464 0.223602 0.391724 -0.444580 0.228424 0.397095 -0.469543 0.233215 0.402374 -0.495300 0.238159 0.407867 -0.521606 0.243042 0.413208 -0.548584 0.248077 0.418671 -0.575989 0.253174 0.424255 -0.603424 0.258240 0.429657 -0.631134 0.263458 0.435211 -0.658752 0.268738 0.440826 -0.685944 0.273895 0.446289 -0.712860 0.279266 0.451935 -0.739380 0.284668 0.457520 -0.765137 0.289948 0.463135 -0.790497 0.295441 0.468872 -0.815094 0.300781 0.474548 -0.077881 0.181030 0.322968 -0.093201 0.184753 0.327301 -0.109955 0.188690 0.331909 -0.128021 0.192627 0.336517 -0.147095 0.196564 0.341156 -0.167389 0.200714 0.345947 -0.188446 0.204865 0.350677 -0.210480 0.209198 0.355682 -0.233215 0.213623 0.360596 -0.256470 0.217957 0.365601 -0.280426 0.222534 0.370667 -0.304749 0.227173 0.375885 -0.329407 0.231781 0.381012 -0.354431 0.236572 0.386292 -0.379608 0.241425 0.391602 -0.404694 0.246216 0.396881 -0.429993 0.251221 0.402252 -0.454956 0.256104 0.407593 -0.480316 0.261200 0.413086 -0.506409 0.266388 0.418549 -0.533020 0.271484 0.423981 -0.560242 0.276733 0.429535 -0.587830 0.282043 0.435120 -0.615387 0.287323 0.440552 -0.643066 0.292694 0.446136 -0.670624 0.298126 0.451752 -0.697632 0.303467 0.457275 -0.724396 0.308960 0.463013 -0.750549 0.314331 0.468628 -0.776245 0.319916 0.474426 -0.801361 0.325470 0.480225 -0.825592 0.330902 0.486023 -0.083405 0.205536 0.331757 -0.099274 0.209534 0.336304 -0.116638 0.213715 0.341003 -0.135162 0.217957 0.345825 -0.154785 0.222198 0.350525 -0.175476 0.226654 0.355530 -0.197021 0.231079 0.360382 -0.219391 0.235657 0.365448 -0.242493 0.240326 0.370544 -0.266052 0.244965 0.375641 -0.290283 0.249786 0.380890 -0.314880 0.254669 0.386139 -0.339691 0.259521 0.391327 -0.364838 0.264496 0.396729 -0.389984 0.269440 0.401978 -0.415314 0.274567 0.407471 -0.440552 0.279816 0.412933 -0.465607 0.284912 0.418243 -0.491333 0.290222 0.423798 -0.517822 0.295593 0.429382 -0.544617 0.300842 0.434784 -0.572052 0.306244 0.440430 -0.599731 0.311737 0.446014 -0.627380 0.317108 0.451477 -0.654999 0.322632 0.457153 -0.682495 0.328186 0.462891 -0.709351 0.333679 0.468445 -0.735901 0.339233 0.474274 -0.761780 0.344727 0.479980 -0.787262 0.350342 0.485840 -0.812012 0.356018 0.491791 -0.835907 0.361542 0.497589 -0.089233 0.231262 0.340912 -0.105713 0.235565 0.345551 -0.123596 0.239990 0.350464 -0.142578 0.244446 0.355255 -0.162811 0.249054 0.360260 -0.183960 0.253754 0.365326 -0.205841 0.258392 0.370331 -0.228638 0.263214 0.375519 -0.252075 0.268158 0.380737 -0.275909 0.273010 0.385864 -0.300323 0.278015 0.391205 -0.325165 0.283112 0.396606 -0.350189 0.288177 0.401886 -0.375427 0.293396 0.407318 -0.400635 0.298523 0.412628 -0.425995 0.303833 0.418121 -0.451263 0.309204 0.423676 -0.476471 0.314484 0.429169 -0.502594 0.319977 0.434631 -0.529297 0.325470 0.440277 -0.556366 0.330841 0.445709 -0.583954 0.336395 0.451385 -0.611786 0.341980 0.457001 -0.639404 0.347473 0.462585 -0.666962 0.353119 0.468292 -0.694092 0.358582 0.473999 -0.720947 0.364258 0.479828 -0.747284 0.369934 0.485687 -0.772919 0.375458 0.491486 -0.798096 0.381165 0.497437 -0.822571 0.386841 0.503387 -0.846130 0.392334 0.509216 -0.095428 0.258209 0.350342 -0.112518 0.262695 0.355133 -0.130981 0.267426 0.360168 -0.150482 0.272064 0.365082 -0.171143 0.276886 0.370178 -0.192749 0.281830 0.375336 -0.215027 0.286713 0.380463 -0.238129 0.291779 0.385742 -0.261902 0.296906 0.391052 -0.286011 0.301941 0.396332 -0.310638 0.307159 0.401703 -0.335693 0.312439 0.407196 -0.360779 0.317657 0.412537 -0.386169 0.323059 0.417969 -0.411469 0.328339 0.423431 -0.436768 0.333832 0.428986 -0.462067 0.339325 0.434540 -0.487610 0.344696 0.439972 -0.514038 0.350281 0.445587 -0.541016 0.355896 0.451202 -0.568298 0.361389 0.456726 -0.596039 0.367035 0.462433 -0.623840 0.372742 0.468170 -0.651398 0.378235 0.473877 -0.678864 0.383942 0.479675 -0.705780 0.389465 0.485352 -0.732452 0.395142 0.491333 -0.758575 0.400848 0.497253 -0.783936 0.406342 0.503082 -0.808807 0.412048 0.509094 -0.832916 0.417694 0.515106 -0.856110 0.423218 0.520935 -0.101929 0.285950 0.359924 -0.119659 0.290802 0.364960 -0.138672 0.295746 0.370056 -0.158691 0.300629 0.375122 -0.179779 0.305664 0.380341 -0.201782 0.310791 0.385590 -0.224426 0.315826 0.390778 -0.247894 0.321075 0.396179 -0.271912 0.326385 0.401611 -0.296295 0.331573 0.406891 -0.321167 0.336975 0.412384 -0.346222 0.342255 0.417725 -0.371552 0.347748 0.423248 -0.397003 0.353271 0.428833 -0.422302 0.358643 0.434235 -0.447662 0.364258 0.439850 -0.473053 0.369873 0.445465 -0.498932 0.375305 0.450958 -0.525665 0.380981 0.456543 -0.552917 0.386688 0.462280 -0.580292 0.392181 0.467896 -0.608124 0.397888 0.473724 -0.635742 0.403381 0.479370 -0.663391 0.409149 0.485260 -0.690704 0.414825 0.491180 -0.717438 0.420380 0.496979 -0.743896 0.426117 0.502930 -0.769745 0.431732 0.508942 -0.794800 0.437256 0.514801 -0.819366 0.442932 0.520782 -0.843079 0.448669 0.526886 -0.865845 0.454254 0.532745 -0.108826 0.314697 0.369812 -0.127197 0.319794 0.375000 -0.146729 0.324890 0.380219 -0.167175 0.329926 0.385315 -0.188782 0.335175 0.390656 -0.211151 0.340454 0.396057 -0.234161 0.345673 0.401337 -0.257935 0.351013 0.406738 -0.282227 0.356506 0.412262 -0.306763 0.361816 0.417603 -0.331848 0.367310 0.423157 -0.357025 0.372772 0.428558 -0.382446 0.378326 0.434113 -0.407990 0.383942 0.439697 -0.433228 0.389404 0.445129 -0.458557 0.395020 0.450775 -0.484222 0.400726 0.456421 -0.510437 0.406189 0.461975 -0.537445 0.411896 0.467743 -0.564850 0.417603 0.473541 -0.592377 0.423157 0.479248 -0.620239 0.428802 0.485138 -0.647827 0.434357 0.490875 -0.675323 0.440063 0.496857 -0.702454 0.445831 0.502838 -0.729004 0.451447 0.508606 -0.755096 0.457306 0.514648 -0.780701 0.463165 0.520630 -0.805511 0.468842 0.526550 -0.829651 0.474731 0.532562 -0.852997 0.480652 0.538574 -0.875366 0.486481 0.544525 -0.116150 0.344177 0.379944 -0.135010 0.349396 0.385223 -0.155090 0.354645 0.390503 -0.176025 0.359833 0.395782 -0.197968 0.365173 0.401184 -0.220764 0.370605 0.406586 -0.244080 0.375916 0.411926 -0.268097 0.381439 0.417419 -0.292511 0.386841 0.422882 -0.317413 0.392395 0.428436 -0.342621 0.397980 0.433990 -0.367981 0.403442 0.439423 -0.393433 0.409088 0.444977 -0.418915 0.414734 0.450623 -0.444244 0.420227 0.456116 -0.469543 0.425934 0.461823 -0.495575 0.431610 0.467621 -0.522095 0.437103 0.473267 -0.549316 0.442871 0.479095 -0.576691 0.448517 0.484802 -0.604462 0.454346 0.490753 -0.632263 0.460205 0.496643 -0.659790 0.465973 0.502502 -0.687134 0.471893 0.508484 -0.714081 0.477875 0.514496 -0.740387 0.483704 0.520416 -0.766235 0.489716 0.526428 -0.791534 0.495728 0.532440 -0.815948 0.501617 0.538300 -0.839783 0.507629 0.544342 -0.862640 0.513489 0.550232 -0.884674 0.519562 0.556213 -0.123749 0.374146 0.390259 -0.143188 0.379517 0.395660 -0.163696 0.384827 0.401062 -0.185120 0.390167 0.406342 -0.207520 0.395630 0.411835 -0.230621 0.401123 0.417297 -0.254242 0.406525 0.422729 -0.278534 0.412079 0.428284 -0.303131 0.417542 0.433685 -0.328247 0.423157 0.439301 -0.353607 0.428772 0.444885 -0.378967 0.434296 0.450409 -0.404449 0.439911 0.455963 -0.429993 0.445709 0.461731 -0.455200 0.451355 0.467316 -0.480804 0.457184 0.473114 -0.507111 0.463104 0.478973 -0.533875 0.468842 0.484650 -0.561218 0.474792 0.490601 -0.588745 0.480682 0.496368 -0.616547 0.486755 0.502380 -0.644318 0.492798 0.508331 -0.671661 0.498718 0.514191 -0.698822 0.504852 0.520233 -0.725525 0.510956 0.526276 -0.751587 0.516968 0.532135 -0.777222 0.523071 0.538147 -0.802094 0.529205 0.544220 -0.826202 0.535217 0.550079 -0.849640 0.541321 0.556061 -0.872009 0.547272 0.561920 -0.893616 0.553345 0.567841 -0.131653 0.404419 0.400818 -0.151642 0.409882 0.406219 -0.172699 0.415314 0.411713 -0.194489 0.420715 0.417053 -0.217224 0.426239 0.422577 -0.240662 0.431793 0.428131 -0.264557 0.437256 0.433533 -0.289124 0.442902 0.439148 -0.313904 0.448456 0.444580 -0.339142 0.454224 0.450226 -0.364594 0.460052 0.455872 -0.390015 0.465820 0.461456 -0.415527 0.471741 0.467163 -0.441010 0.477722 0.472992 -0.466248 0.483643 0.478638 -0.492157 0.489716 0.484497 -0.518738 0.495789 0.490448 -0.545685 0.501770 0.496216 -0.573242 0.507965 0.502228 -0.600830 0.513977 0.508057 -0.628632 0.520203 0.514038 -0.656281 0.526428 0.520081 -0.683502 0.532440 0.526001 -0.710419 0.538666 0.531982 -0.736816 0.544922 0.537994 -0.762634 0.550995 0.543915 -0.787903 0.557129 0.549957 -0.812500 0.563385 0.555939 -0.836212 0.569305 0.561768 -0.859192 0.575500 0.567688 -0.881226 0.581482 0.573517 -0.902313 0.587524 0.579437 -0.139954 0.434875 0.411438 -0.160400 0.440430 0.416901 -0.181915 0.446014 0.422394 -0.204102 0.451538 0.427856 -0.227142 0.457306 0.433411 -0.250946 0.463104 0.439026 -0.275055 0.468811 0.444427 -0.299835 0.474731 0.450073 -0.324799 0.480530 0.455566 -0.350189 0.486633 0.461243 -0.375702 0.492676 0.467010 -0.401123 0.498627 0.472656 -0.426666 0.504791 0.478485 -0.452026 0.510956 0.484375 -0.477386 0.517029 0.490112 -0.503601 0.523285 0.496063 -0.530487 0.529510 0.502075 -0.557678 0.535706 0.507904 -0.585205 0.541962 0.513885 -0.612854 0.548096 0.519806 -0.640594 0.554382 0.525818 -0.668060 0.560669 0.531799 -0.695099 0.566803 0.537689 -0.721832 0.573059 0.543762 -0.747986 0.579346 0.549774 -0.773438 0.585388 0.555603 -0.798401 0.591583 0.561584 -0.822632 0.597748 0.567566 -0.845947 0.603760 0.573395 -0.868530 0.609833 0.579315 -0.890045 0.615692 0.584991 -0.910736 0.621704 0.590790 -0.148499 0.466156 0.422150 -0.169464 0.471954 0.427704 -0.191345 0.477844 0.433289 -0.213928 0.483643 0.438751 -0.237335 0.489685 0.444336 -0.261230 0.495514 0.449829 -0.285767 0.501648 0.455414 -0.310669 0.507812 0.461151 -0.335785 0.513794 0.466736 -0.361267 0.520050 0.472504 -0.386810 0.526306 0.478363 -0.412201 0.532410 0.484131 -0.437683 0.538727 0.489990 -0.463074 0.545074 0.495941 -0.488708 0.551239 0.501740 -0.515198 0.557556 0.507751 -0.542145 0.563812 0.513580 -0.569580 0.570160 0.519653 -0.597229 0.576508 0.525665 -0.624786 0.582703 0.531525 -0.652435 0.588989 0.537567 -0.679718 0.595306 0.543610 -0.706543 0.601440 0.549438 -0.733002 0.607666 0.555481 -0.758911 0.613861 0.561432 -0.784027 0.619934 0.567291 -0.808655 0.626007 0.573242 -0.832367 0.631989 0.578979 -0.855408 0.638000 0.584808 -0.877563 0.643951 0.590668 -0.898621 0.649658 0.596313 -0.918762 0.655548 0.601990 -0.157349 0.498718 0.432983 -0.178741 0.504822 0.438599 -0.201019 0.510895 0.444183 -0.223969 0.516937 0.449646 -0.247650 0.523132 0.455292 -0.271790 0.529205 0.460846 -0.296509 0.535522 0.466583 -0.321625 0.541809 0.472382 -0.346802 0.547974 0.478088 -0.372345 0.554352 0.483948 -0.397980 0.560730 0.489838 -0.423340 0.566956 0.495636 -0.448730 0.573364 0.501617 -0.474152 0.579773 0.507599 -0.500153 0.585968 0.513458 -0.526855 0.592407 0.519501 -0.553925 0.598572 0.525360 -0.581421 0.604950 0.531372 -0.609161 0.611267 0.537384 -0.636688 0.617462 0.543304 -0.664154 0.623718 0.549316 -0.691254 0.629974 0.555328 -0.717773 0.636017 0.561127 -0.743988 0.642120 0.567139 -0.769592 0.648254 0.573090 -0.794373 0.654144 0.578827 -0.818604 0.660156 0.584717 -0.841949 0.665894 0.590393 -0.864594 0.671814 0.596161 -0.886292 0.677551 0.601868 -0.906860 0.683105 0.607483 -0.926483 0.688751 0.613068 -0.166443 0.532379 0.443878 -0.188232 0.538635 0.449493 -0.210785 0.544769 0.454987 -0.234131 0.551086 0.460724 -0.258118 0.557404 0.466461 -0.282501 0.563660 0.472107 -0.307373 0.570068 0.477905 -0.332642 0.576477 0.483826 -0.357910 0.582733 0.489563 -0.383453 0.589172 0.495483 -0.409027 0.595581 0.501465 -0.434326 0.601837 0.507324 -0.459717 0.608246 0.513306 -0.485229 0.614532 0.519196 -0.511627 0.620880 0.525238 -0.538483 0.627228 0.531189 -0.565735 0.633392 0.537109 -0.593262 0.639740 0.543152 -0.620941 0.645996 0.549164 -0.648376 0.652008 0.555023 -0.675629 0.658173 0.561035 -0.702545 0.664337 0.567017 -0.728851 0.670197 0.572815 -0.754730 0.676147 0.578705 -0.779816 0.681946 0.584412 -0.804443 0.687836 0.590240 -0.828278 0.693634 0.596008 -0.851257 0.699158 0.601654 -0.873444 0.704865 0.607330 -0.894653 0.710388 0.612946 -0.914795 0.715698 0.618347 -0.933899 0.721100 0.623840 -0.175781 0.566772 0.454834 -0.197968 0.573151 0.460602 -0.220856 0.579407 0.466125 -0.244476 0.585846 0.471954 -0.268707 0.592285 0.477753 -0.293243 0.598511 0.483490 -0.318298 0.605011 0.489410 -0.343658 0.611450 0.495300 -0.369019 0.617737 0.501160 -0.394531 0.624176 0.507141 -0.420105 0.630524 0.513153 -0.445343 0.636780 0.519043 -0.470703 0.643127 0.525055 -0.496521 0.649323 0.530914 -0.523132 0.655609 0.536957 -0.550171 0.661835 0.542999 -0.577484 0.667908 0.548859 -0.605011 0.674072 0.554871 -0.632660 0.680176 0.560852 -0.659912 0.686035 0.566742 -0.686951 0.691986 0.572662 -0.713593 0.697906 0.578552 -0.739594 0.703644 0.584259 -0.765167 0.709442 0.590088 -0.789978 0.715027 0.595703 -0.814209 0.720703 0.601501 -0.837677 0.726227 0.607208 -0.860199 0.731567 0.612671 -0.881958 0.736938 0.618225 -0.902740 0.742310 0.623688 -0.922333 0.747406 0.628967 -0.940948 0.752533 0.634338 -0.185272 0.601685 0.465973 -0.207886 0.608154 0.471832 -0.231049 0.614380 0.477417 -0.254944 0.620850 0.483337 -0.279388 0.627258 0.489258 -0.304108 0.633575 0.495026 -0.329285 0.639984 0.501007 -0.354736 0.646362 0.506989 -0.380096 0.652588 0.512817 -0.405579 0.658966 0.518890 -0.430939 0.665039 0.524750 -0.456207 0.671356 0.530792 -0.481750 0.677582 0.536804 -0.507843 0.683624 0.542694 -0.534576 0.689758 0.548737 -0.561798 0.695862 0.554749 -0.589172 0.701721 0.560547 -0.616669 0.707703 0.566559 -0.644165 0.713623 0.572510 -0.671265 0.719299 0.578217 -0.698059 0.725067 0.584106 -0.724457 0.730804 0.589935 -0.750153 0.736298 0.595581 -0.775391 0.741821 0.601349 -0.799835 0.747192 0.606873 -0.823700 0.752563 0.612488 -0.846771 0.757904 0.618073 -0.868866 0.762970 0.623413 -0.890137 0.768127 0.628845 -0.910400 0.773163 0.634186 -0.929565 0.778015 0.639313 -0.947632 0.782867 0.644562 -0.194977 0.636688 0.477325 -0.217896 0.643066 0.483215 -0.241364 0.649353 0.488953 -0.265533 0.655731 0.494843 -0.290161 0.662140 0.500854 -0.315033 0.668304 0.506653 -0.340302 0.674622 0.512665 -0.365723 0.680847 0.518707 -0.391144 0.687012 0.524597 -0.416595 0.693176 0.530579 -0.441833 0.699188 0.536530 -0.467102 0.705292 0.542542 -0.492889 0.711334 0.548553 -0.519135 0.717224 0.554413 -0.546082 0.723175 0.560425 -0.573364 0.729065 0.566437 -0.600708 0.734772 0.572205 -0.628143 0.740479 0.578125 -0.655487 0.746155 0.583954 -0.682404 0.751678 0.589661 -0.708893 0.757172 0.595428 -0.734863 0.762543 0.601044 -0.760406 0.767944 0.606720 -0.785309 0.773224 0.612366 -0.809357 0.778259 0.617767 -0.832825 0.783386 0.623230 -0.855499 0.788483 0.628723 -0.877136 0.793274 0.633881 -0.897980 0.798157 0.639191 -0.917816 0.802856 0.644379 -0.936432 0.807495 0.649384 -0.953918 0.812012 0.654358 -0.204895 0.671417 0.488831 -0.228088 0.677734 0.494690 -0.251770 0.683899 0.500580 -0.276184 0.690125 0.506531 -0.300934 0.696411 0.512543 -0.325958 0.702484 0.518433 -0.351288 0.708618 0.524445 -0.376617 0.714569 0.530304 -0.402100 0.720703 0.536377 -0.427490 0.726715 0.542419 -0.452576 0.732513 0.548279 -0.477936 0.738403 0.554260 -0.503967 0.744293 0.560242 -0.530457 0.749908 0.566101 -0.557495 0.755646 0.572021 -0.584778 0.761353 0.577942 -0.612061 0.766785 0.583710 -0.639465 0.772339 0.589539 -0.666565 0.777710 0.595306 -0.693207 0.782959 0.600922 -0.719482 0.788269 0.606598 -0.745148 0.793304 0.612091 -0.770294 0.798431 0.617645 -0.794861 0.803467 0.623138 -0.818573 0.808228 0.628418 -0.841644 0.813080 0.633759 -0.863922 0.817841 0.639099 -0.885132 0.822418 0.644104 -0.905457 0.826904 0.649261 -0.924805 0.831421 0.654266 -0.942902 0.835632 0.659088 -0.959930 0.839874 0.663879 -0.214905 0.705566 0.500427 -0.238373 0.711731 0.506378 -0.262329 0.717773 0.512268 -0.286865 0.723907 0.518280 -0.311768 0.729980 0.524292 -0.336823 0.735840 0.530182 -0.362213 0.741791 0.536194 -0.387482 0.747589 0.542084 -0.412933 0.753510 0.548126 -0.438263 0.759338 0.554138 -0.463257 0.764923 0.559967 -0.488861 0.770599 0.565948 -0.515106 0.776245 0.571869 -0.541656 0.781647 0.577667 -0.568787 0.787140 0.583496 -0.596069 0.792542 0.589355 -0.623322 0.797760 0.595001 -0.650543 0.802979 0.600769 -0.677277 0.808044 0.606323 -0.703796 0.813110 0.611938 -0.729767 0.818146 0.617493 -0.755066 0.822906 0.622864 -0.779968 0.827698 0.628265 -0.804169 0.832428 0.633636 -0.827484 0.836945 0.638763 -0.850159 0.841492 0.644012 -0.871918 0.845917 0.649109 -0.892700 0.850159 0.654022 -0.912567 0.854370 0.658875 -0.931335 0.858429 0.663635 -0.949036 0.862427 0.668365 -0.965515 0.866364 0.673004 -0.225006 0.738953 0.512085 -0.248749 0.744995 0.518158 -0.272858 0.750824 0.523987 -0.297546 0.756775 0.529999 -0.322449 0.762512 0.535919 -0.347717 0.768341 0.541962 -0.373077 0.774109 0.547943 -0.398315 0.779694 0.553802 -0.423676 0.785309 0.559814 -0.448853 0.790924 0.565796 -0.473938 0.796265 0.571594 -0.499725 0.801697 0.577515 -0.526154 0.807037 0.583374 -0.552856 0.812256 0.589050 -0.579956 0.817474 0.594879 -0.607056 0.822449 0.600494 -0.634277 0.827515 0.606171 -0.661316 0.832428 0.611816 -0.687836 0.837189 0.617218 -0.714050 0.842010 0.622742 -0.739716 0.846680 0.628143 -0.764740 0.851166 0.633392 -0.789246 0.855621 0.638672 -0.813049 0.860046 0.643890 -0.836029 0.864258 0.648865 -0.858246 0.868500 0.653900 -0.879608 0.872559 0.658783 -0.899933 0.876465 0.663513 -0.919342 0.880341 0.668243 -0.937622 0.884094 0.672791 -0.954773 0.887726 0.677307 -0.970734 0.891327 0.681671 -0.235199 0.771484 0.523865 -0.259094 0.777283 0.529846 -0.283417 0.782928 0.535767 -0.308228 0.788635 0.541809 -0.333191 0.794159 0.547668 -0.358459 0.799774 0.553711 -0.383881 0.805267 0.559692 -0.409027 0.810638 0.565491 -0.434265 0.816010 0.571442 -0.459320 0.821320 0.577362 -0.484497 0.826416 0.583069 -0.510559 0.831604 0.588898 -0.537079 0.836670 0.594727 -0.563812 0.841522 0.600342 -0.590912 0.846405 0.606018 -0.617981 0.851135 0.611511 -0.645020 0.855927 0.617096 -0.671814 0.860535 0.622559 -0.698090 0.864960 0.627869 -0.724030 0.869415 0.633270 -0.749390 0.873779 0.638550 -0.774109 0.877960 0.643616 -0.798218 0.882141 0.648712 -0.821625 0.886169 0.653717 -0.844177 0.890045 0.658539 -0.865997 0.893982 0.663391 -0.886841 0.897644 0.668030 -0.906738 0.901245 0.672668 -0.925720 0.904846 0.677185 -0.943512 0.908203 0.681488 -0.960205 0.911530 0.685822 -0.975647 0.914764 0.689972 -0.245422 0.802948 0.535583 -0.269379 0.808380 0.541504 -0.293976 0.813904 0.547516 -0.318909 0.819366 0.553497 -0.343872 0.824646 0.559418 -0.369171 0.829987 0.565399 -0.394470 0.835266 0.571320 -0.419586 0.840302 0.577057 -0.444672 0.845367 0.582916 -0.469696 0.850403 0.588776 -0.495087 0.855255 0.594452 -0.521240 0.860077 0.600189 -0.547760 0.864777 0.605743 -0.574615 0.869415 0.611359 -0.601715 0.874054 0.616974 -0.628632 0.878418 0.622314 -0.655518 0.882782 0.627747 -0.682068 0.887115 0.633087 -0.708038 0.891205 0.638306 -0.733643 0.895386 0.643463 -0.758698 0.899384 0.648560 -0.783020 0.903229 0.653473 -0.806793 0.907043 0.658447 -0.829834 0.910767 0.663269 -0.851959 0.914307 0.667908 -0.873352 0.917816 0.672546 -0.893738 0.921143 0.676971 -0.913300 0.924438 0.681366 -0.931732 0.927643 0.685730 -0.949005 0.930634 0.689789 -0.965210 0.933655 0.693939 -0.980133 0.936523 0.697876 -0.255676 0.833252 0.547394 -0.279816 0.838440 0.553192 -0.304474 0.843719 0.559235 -0.329468 0.848877 0.565216 -0.354492 0.853851 0.571014 -0.379791 0.858887 0.576904 -0.404938 0.863861 0.582794 -0.429993 0.868591 0.588501 -0.454926 0.873413 0.594330 -0.480042 0.878082 0.600067 -0.505646 0.882568 0.605591 -0.531921 0.887115 0.611237 -0.558380 0.891449 0.616669 -0.585266 0.895782 0.622192 -0.612213 0.900055 0.627625 -0.638977 0.904114 0.632874 -0.665741 0.908173 0.638153 -0.691956 0.912140 0.643372 -0.717590 0.915894 0.648376 -0.742920 0.919678 0.653351 -0.767639 0.923340 0.658325 -0.791626 0.926788 0.663025 -0.815002 0.930267 0.667755 -0.837555 0.933533 0.672302 -0.859375 0.936798 0.676880 -0.880310 0.939972 0.681244 -0.900299 0.942902 0.685486 -0.919342 0.945831 0.689667 -0.937347 0.948700 0.693787 -0.954132 0.951355 0.697662 -0.969879 0.954041 0.701569 -0.984314 0.956573 0.705292 -0.265900 0.862152 0.559082 -0.290192 0.867096 0.564911 -0.314972 0.872070 0.570831 -0.339966 0.876923 0.576782 -0.364990 0.881622 0.582520 -0.390167 0.886322 0.588348 -0.415283 0.890930 0.594147 -0.440125 0.895386 0.599792 -0.464966 0.899811 0.605469 -0.490112 0.904083 0.610962 -0.515961 0.908386 0.616516 -0.542328 0.912506 0.622040 -0.568848 0.916534 0.627380 -0.595673 0.920502 0.632751 -0.622528 0.924408 0.638062 -0.649109 0.928070 0.643127 -0.675537 0.931763 0.648193 -0.701508 0.935394 0.653229 -0.726898 0.938782 0.658051 -0.751862 0.942200 0.662903 -0.776184 0.945496 0.667664 -0.799805 0.948578 0.672180 -0.822784 0.951691 0.676727 -0.844940 0.954590 0.681030 -0.866394 0.957489 0.685394 -0.886902 0.960236 0.689575 -0.906433 0.962891 0.693634 -0.925018 0.965485 0.697571 -0.942566 0.967957 0.701447 -0.958923 0.970306 0.705048 -0.974182 0.972626 0.708740 -0.988159 0.974792 0.712219 -0.276123 0.889679 0.570709 -0.300476 0.894226 0.576477 -0.325287 0.898865 0.582367 -0.350311 0.903412 0.588196 -0.375275 0.907745 0.593872 -0.400391 0.912140 0.599640 -0.425385 0.916443 0.605316 -0.450073 0.920471 0.610809 -0.474915 0.924561 0.616364 -0.500275 0.928436 0.621765 -0.526215 0.932373 0.627228 -0.552551 0.936188 0.632629 -0.579102 0.939789 0.637787 -0.605804 0.943420 0.642975 -0.632538 0.946899 0.648102 -0.658875 0.950256 0.653015 -0.684998 0.953552 0.657928 -0.710693 0.956757 0.662781 -0.735809 0.959839 0.667450 -0.760406 0.962860 0.672089 -0.784302 0.965668 0.676514 -0.807617 0.968506 0.680939 -0.830231 0.971191 0.685272 -0.851959 0.973755 0.689392 -0.872986 0.976288 0.693512 -0.893066 0.978699 0.697479 -0.912170 0.980957 0.701233 -0.930328 0.983185 0.704987 -0.947418 0.985291 0.708618 -0.963287 0.987305 0.712036 -0.978088 0.989258 0.715393 -0.991577 0.991089 0.718567 -0.044342 0.042389 0.285675 -0.057281 0.043823 0.288574 -0.070557 0.045319 0.291656 -0.084595 0.046844 0.294769 -0.099792 0.048492 0.298065 -0.116241 0.050232 0.301483 -0.133789 0.051941 0.304962 -0.152466 0.053741 0.308563 -0.172089 0.055634 0.312317 -0.192535 0.057556 0.316071 -0.213806 0.059601 0.320007 -0.235809 0.061646 0.324036 -0.258301 0.063782 0.328094 -0.281433 0.065979 0.332336 -0.304932 0.068207 0.336487 -0.328857 0.070557 0.340912 -0.353149 0.072998 0.345398 -0.377472 0.075439 0.349884 -0.402008 0.078033 0.354492 -0.426575 0.080658 0.359253 -0.450989 0.083344 0.363922 -0.475616 0.086151 0.368744 -0.501007 0.089081 0.373688 -0.526947 0.092010 0.378571 -0.553558 0.095062 0.383667 -0.580353 0.098145 0.388611 -0.607544 0.101410 0.393799 -0.634918 0.104797 0.399078 -0.661926 0.108154 0.404114 -0.688843 0.111725 0.409454 -0.715424 0.115326 0.414825 -0.741425 0.118927 0.420105 -0.047760 0.054901 0.291473 -0.060883 0.056549 0.294678 -0.074463 0.058258 0.297974 -0.088867 0.059967 0.301331 -0.104553 0.061798 0.304840 -0.121490 0.063721 0.308472 -0.139496 0.065643 0.312134 -0.158630 0.067688 0.315979 -0.178680 0.069824 0.319916 -0.199493 0.071930 0.323822 -0.221161 0.074219 0.328003 -0.243408 0.076508 0.332092 -0.266296 0.078918 0.336395 -0.289764 0.081421 0.340759 -0.313446 0.083954 0.345154 -0.337677 0.086578 0.349731 -0.362152 0.089355 0.354370 -0.386658 0.092102 0.359009 -0.411346 0.095032 0.363770 -0.436005 0.098053 0.368622 -0.460449 0.101135 0.373474 -0.485474 0.104340 0.378448 -0.511292 0.107635 0.383545 -0.537476 0.110962 0.388489 -0.564331 0.114441 0.393707 -0.591370 0.117920 0.398804 -0.618713 0.121552 0.404022 -0.646057 0.125336 0.409332 -0.673096 0.129028 0.414551 -0.699951 0.132996 0.419952 -0.726440 0.136963 0.425385 -0.752289 0.140961 0.430664 -0.051453 0.068390 0.297821 -0.064758 0.070221 0.301239 -0.078674 0.072144 0.304749 -0.093536 0.074127 0.308289 -0.109741 0.076202 0.312012 -0.127136 0.078369 0.315887 -0.145630 0.080566 0.319702 -0.165161 0.082886 0.323730 -0.185638 0.085297 0.327881 -0.206879 0.087738 0.332001 -0.228912 0.090332 0.336304 -0.251495 0.092957 0.340576 -0.274689 0.095673 0.345062 -0.298431 0.098541 0.349640 -0.322418 0.101410 0.354187 -0.346802 0.104492 0.358887 -0.371490 0.107635 0.363678 -0.396088 0.110779 0.368378 -0.420898 0.114105 0.373352 -0.445587 0.117493 0.378326 -0.470276 0.120941 0.383301 -0.495697 0.124512 0.388336 -0.521637 0.128143 0.393433 -0.548309 0.131927 0.398651 -0.575439 0.135773 0.403870 -0.602631 0.139587 0.409088 -0.630035 0.143616 0.414398 -0.657410 0.147736 0.419830 -0.684387 0.151794 0.425110 -0.711151 0.156036 0.430542 -0.737518 0.160400 0.436035 -0.763184 0.164642 0.441437 -0.055359 0.083069 0.304565 -0.068909 0.085205 0.308197 -0.083221 0.087402 0.311920 -0.098541 0.089661 0.315674 -0.115265 0.092102 0.319580 -0.133148 0.094574 0.323639 -0.152100 0.097107 0.327637 -0.172089 0.099792 0.331909 -0.192902 0.102478 0.336060 -0.214600 0.105347 0.340454 -0.236969 0.108307 0.344940 -0.259888 0.111267 0.349426 -0.283417 0.114441 0.354065 -0.307404 0.117676 0.358734 -0.331635 0.120941 0.363434 -0.356262 0.124359 0.368286 -0.381012 0.127869 0.373199 -0.405792 0.131348 0.378082 -0.430664 0.135071 0.383148 -0.455505 0.138855 0.388245 -0.480377 0.142639 0.393280 -0.506165 0.146606 0.398529 -0.532501 0.150513 0.403595 -0.559418 0.154663 0.408966 -0.586670 0.158875 0.414276 -0.614044 0.163025 0.419556 -0.641510 0.167389 0.424988 -0.668854 0.171814 0.430420 -0.695709 0.176208 0.435760 -0.722382 0.180756 0.441284 -0.748596 0.185394 0.446777 -0.774109 0.189972 0.452209 -0.059540 0.099426 0.311768 -0.073364 0.101868 0.315582 -0.088074 0.104431 0.319489 -0.103912 0.107025 0.323395 -0.121155 0.109833 0.327545 -0.139587 0.112671 0.331757 -0.158966 0.115570 0.335968 -0.179413 0.118622 0.340363 -0.200592 0.121643 0.344696 -0.222687 0.124878 0.349304 -0.245422 0.128235 0.353912 -0.268616 0.131561 0.358521 -0.292450 0.135071 0.363312 -0.316681 0.138702 0.368164 -0.341156 0.142273 0.372955 -0.365875 0.146088 0.377960 -0.390869 0.149963 0.383026 -0.415710 0.153809 0.387970 -0.440643 0.157837 0.393158 -0.465363 0.161835 0.398254 -0.490753 0.166046 0.403473 -0.516968 0.170349 0.408813 -0.543579 0.174622 0.414032 -0.570709 0.179016 0.419373 -0.598175 0.183563 0.424835 -0.625610 0.188019 0.430145 -0.653076 0.192688 0.435638 -0.680389 0.197388 0.441162 -0.707123 0.202026 0.446503 -0.733643 0.206879 0.452026 -0.759521 0.211670 0.457520 -0.784943 0.216614 0.463165 -0.063934 0.117615 0.319305 -0.078125 0.120392 0.323303 -0.093292 0.123352 0.327454 -0.109741 0.126312 0.331543 -0.127441 0.129425 0.335846 -0.146271 0.132568 0.340118 -0.166229 0.135895 0.344604 -0.187042 0.139252 0.349152 -0.208679 0.142639 0.353668 -0.231140 0.146271 0.358429 -0.254211 0.149963 0.363220 -0.277710 0.153595 0.367950 -0.301788 0.157440 0.372833 -0.326233 0.161407 0.377869 -0.350861 0.165314 0.382751 -0.375824 0.169464 0.387878 -0.400879 0.173645 0.393005 -0.425781 0.177856 0.398102 -0.450745 0.182190 0.403320 -0.475708 0.186523 0.408539 -0.501526 0.191010 0.413910 -0.528015 0.195618 0.419281 -0.554871 0.200134 0.424561 -0.582245 0.204865 0.429993 -0.609802 0.209686 0.435486 -0.637268 0.214386 0.440887 -0.664764 0.219330 0.446350 -0.691895 0.224274 0.451965 -0.718567 0.229218 0.457367 -0.744904 0.234253 0.463074 -0.770569 0.239288 0.468628 -0.795746 0.244446 0.474396 -0.068634 0.137543 0.327209 -0.083191 0.140717 0.331421 -0.098907 0.143982 0.335754 -0.115845 0.147308 0.340027 -0.134094 0.150757 0.344482 -0.153412 0.154205 0.348907 -0.173767 0.157867 0.353546 -0.195099 0.161621 0.358307 -0.217133 0.165375 0.362976 -0.239868 0.169281 0.367798 -0.263245 0.173279 0.372681 -0.287079 0.177277 0.377594 -0.311371 0.181458 0.382599 -0.336060 0.185699 0.387726 -0.360870 0.189941 0.392731 -0.385986 0.194366 0.398010 -0.410950 0.198761 0.403046 -0.436066 0.203339 0.408417 -0.461029 0.207977 0.413757 -0.486359 0.212585 0.418976 -0.512543 0.217377 0.424438 -0.539307 0.222198 0.429840 -0.566437 0.226990 0.435211 -0.593933 0.231995 0.440735 -0.621582 0.237030 0.446228 -0.649048 0.242004 0.451660 -0.676453 0.247131 0.457245 -0.703369 0.252228 0.462769 -0.730011 0.257446 0.468506 -0.756134 0.262695 0.474243 -0.781586 0.267883 0.479919 -0.806458 0.273254 0.485779 -0.073578 0.159180 0.335510 -0.088593 0.162720 0.339905 -0.104767 0.166229 0.344238 -0.122345 0.169922 0.348816 -0.141174 0.173706 0.353424 -0.160950 0.177521 0.358063 -0.181763 0.181488 0.362854 -0.203461 0.185516 0.367676 -0.225830 0.189575 0.372498 -0.248962 0.193787 0.377472 -0.272644 0.198151 0.382507 -0.296692 0.202393 0.387451 -0.321259 0.206879 0.392639 -0.346008 0.211273 0.397736 -0.371124 0.215973 0.402985 -0.396240 0.220642 0.408295 -0.421326 0.225281 0.413483 -0.446472 0.230103 0.418823 -0.471619 0.235016 0.424286 -0.497253 0.239868 0.429626 -0.523804 0.244904 0.435089 -0.550812 0.250000 0.440613 -0.578064 0.254974 0.445953 -0.605743 0.260223 0.451538 -0.633484 0.265442 0.457092 -0.660858 0.270630 0.462616 -0.688171 0.275879 0.468292 -0.714935 0.281158 0.473969 -0.741394 0.286560 0.479767 -0.767303 0.291992 0.485626 -0.792450 0.297333 0.491394 -0.817047 0.302826 0.497375 -0.078857 0.182373 0.344147 -0.094330 0.186218 0.348724 -0.111115 0.190002 0.353210 -0.129242 0.194031 0.357910 -0.148529 0.198151 0.362701 -0.168793 0.202209 0.367432 -0.190063 0.206451 0.372345 -0.212189 0.210815 0.377350 -0.234863 0.215149 0.382263 -0.258270 0.219666 0.387329 -0.282318 0.224274 0.392548 -0.306549 0.228821 0.397583 -0.331390 0.233551 0.402802 -0.356293 0.238251 0.408020 -0.381470 0.243134 0.413361 -0.406769 0.248077 0.418701 -0.431854 0.252960 0.424011 -0.457001 0.258057 0.429504 -0.482422 0.263184 0.434937 -0.508484 0.268219 0.440308 -0.535217 0.273468 0.445831 -0.562500 0.278717 0.451385 -0.589905 0.283936 0.456818 -0.617676 0.289276 0.462494 -0.645203 0.294586 0.468018 -0.672729 0.300018 0.473816 -0.699860 0.305511 0.479614 -0.726471 0.310883 0.485321 -0.752686 0.316437 0.491241 -0.778381 0.321991 0.497192 -0.803253 0.327423 0.502991 -0.827606 0.333038 0.509064 -0.084412 0.206970 0.353119 -0.100494 0.211090 0.357788 -0.117828 0.215179 0.362488 -0.136475 0.219482 0.367279 -0.156281 0.223877 0.372223 -0.176971 0.228241 0.377075 -0.198700 0.232788 0.382141 -0.221161 0.237396 0.387207 -0.244202 0.242004 0.392273 -0.267914 0.246735 0.397461 -0.292084 0.251526 0.402557 -0.316711 0.256378 0.407898 -0.341705 0.261353 0.413239 -0.366730 0.266266 0.418457 -0.392029 0.271393 0.423889 -0.417358 0.276550 0.429321 -0.442474 0.281647 0.434631 -0.467651 0.286926 0.440155 -0.493500 0.292236 0.445709 -0.519867 0.297455 0.451080 -0.546906 0.302887 0.456696 -0.574341 0.308289 0.462341 -0.601898 0.313660 0.467896 -0.629669 0.319183 0.473663 -0.657135 0.324585 0.479309 -0.684570 0.330109 0.485199 -0.711548 0.335754 0.491119 -0.737976 0.341217 0.496918 -0.763977 0.346832 0.502899 -0.789307 0.352478 0.508911 -0.813934 0.357971 0.514801 -0.837921 0.363617 0.520813 -0.090332 0.232849 0.362366 -0.106995 0.237213 0.367157 -0.124878 0.241608 0.372009 -0.144073 0.246155 0.376923 -0.164368 0.250824 0.382019 -0.185486 0.255402 0.386963 -0.207611 0.260223 0.392120 -0.230469 0.265076 0.397308 -0.253784 0.269897 0.402435 -0.277832 0.274841 0.407745 -0.302185 0.279816 0.412964 -0.327057 0.284943 0.418335 -0.352203 0.290131 0.423737 -0.377380 0.295227 0.429077 -0.402710 0.300537 0.434509 -0.428040 0.305847 0.440033 -0.453217 0.311127 0.445435 -0.478607 0.316559 0.450958 -0.504791 0.322021 0.456512 -0.531403 0.327423 0.462036 -0.558655 0.332947 0.467743 -0.586182 0.338379 0.473389 -0.613983 0.343964 0.479218 -0.641663 0.349579 0.485046 -0.669128 0.355072 0.490814 -0.696350 0.360718 0.496735 -0.723145 0.366394 0.502747 -0.749329 0.371887 0.508575 -0.775055 0.377594 0.514648 -0.800171 0.383270 0.520660 -0.824432 0.388794 0.526672 -0.848053 0.394501 0.532745 -0.096588 0.259827 0.371857 -0.113831 0.264435 0.376831 -0.132294 0.269104 0.381744 -0.152069 0.273865 0.386841 -0.172760 0.278748 0.391998 -0.194366 0.283600 0.397064 -0.216797 0.288605 0.402283 -0.240021 0.293671 0.407623 -0.263672 0.298706 0.412842 -0.287964 0.303894 0.418182 -0.312531 0.308990 0.423492 -0.337585 0.314301 0.428955 -0.362885 0.319702 0.434357 -0.388092 0.324951 0.439789 -0.413513 0.330383 0.445221 -0.438873 0.335876 0.450806 -0.464020 0.341248 0.456238 -0.489777 0.346802 0.461884 -0.516266 0.352386 0.467621 -0.543121 0.357849 0.473267 -0.570618 0.363495 0.479065 -0.598206 0.369019 0.484711 -0.625977 0.374695 0.490692 -0.653687 0.380341 0.496582 -0.681000 0.385864 0.502411 -0.708038 0.391571 0.508453 -0.734680 0.397247 0.514465 -0.760590 0.402771 0.520416 -0.786072 0.408478 0.526489 -0.810883 0.414215 0.532562 -0.834747 0.419739 0.538513 -0.858002 0.425323 0.544617 -0.103241 0.287781 0.381653 -0.121124 0.292664 0.386688 -0.140076 0.297485 0.391724 -0.160309 0.302521 0.396942 -0.181519 0.307587 0.402161 -0.203461 0.312592 0.407379 -0.226288 0.317810 0.412659 -0.249695 0.322968 0.417908 -0.273773 0.328247 0.423340 -0.298279 0.333649 0.428802 -0.323059 0.338867 0.434113 -0.348267 0.344330 0.439606 -0.373657 0.349854 0.445099 -0.398956 0.355194 0.450531 -0.424377 0.360779 0.456116 -0.449707 0.366364 0.461792 -0.475037 0.371796 0.467316 -0.501160 0.377472 0.473083 -0.527771 0.382935 0.478729 -0.555023 0.388641 0.484589 -0.582703 0.394348 0.490540 -0.610291 0.399933 0.496277 -0.638062 0.405548 0.502319 -0.665741 0.411285 0.508270 -0.692810 0.416809 0.514191 -0.719727 0.422516 0.520264 -0.746033 0.428162 0.526337 -0.771698 0.433746 0.532257 -0.796844 0.439362 0.538330 -0.821198 0.444946 0.544342 -0.844879 0.450684 0.550446 -0.867706 0.456421 0.556549 -0.110229 0.316589 0.391571 -0.128632 0.321686 0.396790 -0.148193 0.326691 0.401917 -0.168915 0.331879 0.407227 -0.190491 0.337128 0.412537 -0.212860 0.342316 0.417786 -0.236053 0.347656 0.423218 -0.259705 0.352936 0.428497 -0.284058 0.358398 0.433990 -0.308807 0.363831 0.439484 -0.333771 0.369263 0.444855 -0.359100 0.374817 0.450439 -0.384583 0.380402 0.455933 -0.409882 0.385834 0.461487 -0.435364 0.391479 0.467163 -0.460663 0.397095 0.472961 -0.486267 0.402649 0.478607 -0.512665 0.408325 0.484467 -0.539551 0.413910 0.490234 -0.566986 0.419586 0.496124 -0.594696 0.425262 0.502197 -0.622375 0.430817 0.508026 -0.650116 0.436493 0.514008 -0.677582 0.442230 0.520142 -0.704529 0.447876 0.526062 -0.731232 0.453644 0.532074 -0.757294 0.459503 0.538208 -0.782654 0.465210 0.544220 -0.807495 0.471069 0.550293 -0.831482 0.476837 0.556244 -0.854797 0.482727 0.562347 -0.877167 0.488708 0.568420 -0.117554 0.346130 0.401764 -0.136566 0.351349 0.407104 -0.156586 0.356537 0.412292 -0.177734 0.361847 0.417633 -0.199646 0.367126 0.422943 -0.222534 0.372559 0.428406 -0.246033 0.377991 0.433838 -0.269989 0.383362 0.439240 -0.294556 0.388885 0.444702 -0.319489 0.394501 0.450287 -0.344604 0.399963 0.455688 -0.370056 0.405548 0.461334 -0.395569 0.411194 0.467041 -0.420929 0.416687 0.472656 -0.446320 0.422363 0.478455 -0.471558 0.427856 0.484192 -0.497620 0.433563 0.490051 -0.524353 0.439270 0.496002 -0.551422 0.444885 0.501862 -0.579071 0.450684 0.507843 -0.606812 0.456543 0.513855 -0.634430 0.462280 0.519806 -0.662109 0.468201 0.525879 -0.689392 0.474121 0.531952 -0.716156 0.479980 0.537872 -0.742584 0.485992 0.544006 -0.768250 0.491821 0.549988 -0.793396 0.497864 0.556061 -0.817963 0.503906 0.562225 -0.841522 0.509766 0.568085 -0.864441 0.515778 0.574249 -0.886414 0.521820 0.580231 -0.125244 0.376129 0.412140 -0.144806 0.381470 0.417511 -0.165314 0.386749 0.422791 -0.186890 0.392181 0.428253 -0.209229 0.397552 0.433533 -0.232361 0.403046 0.439056 -0.256226 0.408630 0.444580 -0.280426 0.414032 0.449982 -0.305206 0.419647 0.455566 -0.330353 0.425201 0.461212 -0.355591 0.430756 0.466736 -0.381042 0.436401 0.472504 -0.406586 0.442078 0.478333 -0.431976 0.447693 0.484070 -0.457275 0.453522 0.489899 -0.482788 0.459229 0.495697 -0.509216 0.465149 0.501709 -0.536133 0.471100 0.507690 -0.563385 0.476929 0.513519 -0.591095 0.482971 0.519684 -0.618866 0.488983 0.525726 -0.646484 0.494934 0.531647 -0.673950 0.501038 0.537720 -0.701050 0.507141 0.543884 -0.727570 0.513123 0.549805 -0.753693 0.519226 0.555939 -0.779114 0.525269 0.561890 -0.804016 0.531372 0.567963 -0.828125 0.537476 0.574066 -0.851349 0.543457 0.579956 -0.873871 0.549561 0.585968 -0.895325 0.555634 0.591949 -0.133301 0.406464 0.422638 -0.153320 0.411896 0.428101 -0.174316 0.417267 0.433411 -0.196320 0.422791 0.438965 -0.219025 0.428162 0.444305 -0.242493 0.433777 0.449860 -0.266571 0.439331 0.455383 -0.291016 0.444885 0.460907 -0.315979 0.450592 0.466583 -0.341278 0.456421 0.472382 -0.366608 0.462128 0.478058 -0.392151 0.468018 0.483887 -0.417694 0.473999 0.489777 -0.442993 0.479889 0.495544 -0.468384 0.485901 0.501526 -0.494171 0.491852 0.507416 -0.520844 0.497986 0.513428 -0.548065 0.504120 0.519531 -0.575439 0.510101 0.525421 -0.603149 0.516296 0.531494 -0.630890 0.522522 0.537598 -0.658386 0.528564 0.543579 -0.685699 0.534790 0.549683 -0.712585 0.541016 0.555786 -0.738861 0.547089 0.561737 -0.764709 0.553314 0.567810 -0.789795 0.559326 0.573730 -0.814301 0.565521 0.579803 -0.838104 0.571655 0.585815 -0.860931 0.577637 0.591614 -0.882935 0.583740 0.597595 -0.903961 0.589813 0.603546 -0.141571 0.436951 0.433289 -0.162140 0.442505 0.438812 -0.183594 0.447968 0.444153 -0.205963 0.453705 0.449707 -0.228973 0.459320 0.455139 -0.252777 0.465149 0.460754 -0.277130 0.471039 0.466492 -0.301788 0.476837 0.472107 -0.326904 0.482819 0.477875 -0.352295 0.488861 0.483734 -0.377686 0.494812 0.489502 -0.403259 0.500916 0.495392 -0.428772 0.507111 0.501404 -0.454010 0.513123 0.507233 -0.479553 0.519348 0.513306 -0.505707 0.525482 0.519196 -0.532593 0.531738 0.525269 -0.559937 0.538025 0.531342 -0.587372 0.544128 0.537292 -0.615173 0.550446 0.543427 -0.642853 0.556732 0.549530 -0.670197 0.562836 0.555450 -0.697266 0.569122 0.561554 -0.723969 0.575378 0.567627 -0.749939 0.581512 0.573608 -0.775482 0.587738 0.579651 -0.800262 0.593719 0.585480 -0.824432 0.599884 0.591461 -0.847809 0.606018 0.597443 -0.870209 0.611908 0.603180 -0.891754 0.617950 0.609039 -0.912292 0.623901 0.614899 -0.150238 0.468353 0.444031 -0.171112 0.473999 0.449402 -0.193054 0.479950 0.454987 -0.215820 0.485901 0.460663 -0.239166 0.491760 0.466156 -0.263214 0.497864 0.471924 -0.287811 0.503967 0.477722 -0.312592 0.509979 0.483429 -0.337891 0.516144 0.489349 -0.363403 0.522369 0.495239 -0.388824 0.528503 0.501068 -0.414307 0.534790 0.507111 -0.439667 0.540955 0.512970 -0.465027 0.547302 0.519073 -0.490875 0.553650 0.525116 -0.517334 0.559845 0.531067 -0.544373 0.566162 0.537140 -0.571838 0.572540 0.543274 -0.599335 0.578735 0.549194 -0.627045 0.585052 0.555328 -0.654663 0.591370 0.561401 -0.681824 0.597504 0.567352 -0.708740 0.603790 0.573456 -0.734955 0.609863 0.579346 -0.760834 0.616089 0.585388 -0.786072 0.622223 0.591339 -0.810425 0.628174 0.597137 -0.834259 0.634216 0.603027 -0.857178 0.640259 0.608887 -0.879150 0.646057 0.614624 -0.900238 0.651886 0.620361 -0.920288 0.657715 0.626068 -0.159058 0.501038 0.454803 -0.180420 0.506958 0.460358 -0.202820 0.513031 0.466003 -0.225891 0.519196 0.471771 -0.249542 0.525360 0.477386 -0.273865 0.531586 0.483307 -0.298615 0.537872 0.489197 -0.323608 0.544006 0.494904 -0.348938 0.550385 0.500916 -0.374481 0.556732 0.506958 -0.399933 0.562958 0.512817 -0.425446 0.569366 0.518890 -0.450684 0.575592 0.524811 -0.476196 0.581970 0.530884 -0.502319 0.588379 0.536987 -0.528931 0.594666 0.542938 -0.556183 0.600983 0.549072 -0.583710 0.607330 0.555176 -0.611267 0.613495 0.561096 -0.638885 0.619812 0.567200 -0.666351 0.626068 0.573303 -0.693268 0.632141 0.579193 -0.719940 0.638306 0.585205 -0.745880 0.644287 0.591064 -0.771454 0.650360 0.597015 -0.796295 0.656403 0.602905 -0.820374 0.662231 0.608643 -0.843750 0.668121 0.614410 -0.866333 0.673950 0.620270 -0.887787 0.679565 0.625793 -0.908447 0.685211 0.631439 -0.927948 0.690857 0.637054 -0.168213 0.534698 0.465881 -0.189972 0.540833 0.471497 -0.212708 0.547119 0.477295 -0.236115 0.553436 0.483154 -0.260010 0.559662 0.488892 -0.284546 0.566010 0.494781 -0.309509 0.572449 0.500793 -0.334564 0.578735 0.506622 -0.360046 0.585144 0.512665 -0.385498 0.591400 0.518585 -0.411011 0.597870 0.524658 -0.436462 0.604248 0.530731 -0.461670 0.610504 0.536713 -0.487396 0.616882 0.542816 -0.513794 0.623260 0.548920 -0.540588 0.629456 0.554871 -0.567993 0.635803 0.560944 -0.595551 0.642059 0.567078 -0.623047 0.648132 0.572998 -0.650635 0.654327 0.579010 -0.677704 0.660309 0.584900 -0.704529 0.666412 0.590881 -0.730957 0.672424 0.596863 -0.756592 0.678284 0.602631 -0.781830 0.684174 0.608459 -0.806305 0.689972 0.614319 -0.830017 0.695587 0.619965 -0.852966 0.701294 0.625671 -0.875092 0.706879 0.631317 -0.896149 0.712311 0.636749 -0.916229 0.717743 0.642273 -0.935181 0.722961 0.647552 -0.177612 0.569153 0.477142 -0.199738 0.575409 0.482880 -0.222809 0.581848 0.488739 -0.246521 0.588226 0.494629 -0.270630 0.594513 0.500519 -0.295380 0.600983 0.506500 -0.320435 0.607391 0.512512 -0.345673 0.613708 0.518433 -0.371185 0.620117 0.524536 -0.396545 0.626373 0.530426 -0.422058 0.632782 0.536560 -0.447449 0.639130 0.542664 -0.472687 0.645386 0.548584 -0.498688 0.651672 0.554718 -0.525299 0.657959 0.560822 -0.552277 0.664032 0.566772 -0.579712 0.670197 0.572845 -0.607300 0.676331 0.578857 -0.634735 0.682281 0.584747 -0.662109 0.688263 0.590729 -0.688995 0.694122 0.596558 -0.715546 0.699982 0.602478 -0.741638 0.705841 0.608337 -0.767029 0.711426 0.614044 -0.791901 0.717163 0.619812 -0.816040 0.722748 0.625519 -0.839355 0.728149 0.631012 -0.861877 0.733643 0.636597 -0.883575 0.738953 0.642120 -0.904144 0.744171 0.647461 -0.923767 0.749329 0.652802 -0.942169 0.754303 0.657959 -0.187134 0.604126 0.488556 -0.209686 0.610382 0.494354 -0.233002 0.616821 0.500366 -0.256989 0.623260 0.506317 -0.281311 0.629547 0.512238 -0.306213 0.635956 0.518280 -0.331299 0.642212 0.524200 -0.356689 0.648560 0.530273 -0.382202 0.654968 0.536377 -0.407623 0.661102 0.542328 -0.433014 0.667419 0.548462 -0.458313 0.673706 0.554565 -0.483734 0.679718 0.560486 -0.509979 0.685944 0.566620 -0.536804 0.692017 0.572693 -0.563873 0.697937 0.578583 -0.591370 0.703949 0.584595 -0.618896 0.709930 0.590576 -0.646240 0.715668 0.596436 -0.673370 0.721466 0.602325 -0.700043 0.727112 0.608063 -0.726379 0.732758 0.613892 -0.752136 0.738342 0.619659 -0.777222 0.743744 0.625214 -0.801727 0.749207 0.630890 -0.825470 0.754639 0.636444 -0.848358 0.759735 0.641876 -0.870453 0.764923 0.647308 -0.891571 0.769897 0.652527 -0.911774 0.774902 0.657806 -0.930908 0.779846 0.663025 -0.948761 0.784515 0.668030 -0.196899 0.639069 0.500183 -0.219727 0.645355 0.506042 -0.243378 0.651764 0.512024 -0.267548 0.658112 0.518158 -0.292084 0.664368 0.524048 -0.317139 0.670654 0.530151 -0.342285 0.676819 0.536072 -0.367737 0.683075 0.542206 -0.393219 0.689301 0.548309 -0.418549 0.695343 0.554230 -0.443909 0.701508 0.560333 -0.469147 0.707611 0.566498 -0.494843 0.713470 0.572357 -0.521301 0.719452 0.578400 -0.548279 0.725372 0.584442 -0.575439 0.731110 0.590271 -0.602905 0.736908 0.596252 -0.630188 0.742493 0.601990 -0.657471 0.748138 0.607910 -0.684448 0.753723 0.613770 -0.710785 0.759186 0.619385 -0.736877 0.764587 0.625092 -0.762329 0.769897 0.630768 -0.787018 0.775024 0.636200 -0.811188 0.780212 0.641754 -0.834564 0.785309 0.647156 -0.857056 0.790192 0.652405 -0.878723 0.795166 0.657684 -0.899384 0.799835 0.662750 -0.919098 0.804565 0.667908 -0.937714 0.809174 0.672943 -0.955078 0.813599 0.677765 -0.206818 0.673767 0.511932 -0.229950 0.679962 0.517822 -0.253784 0.686249 0.523895 -0.278076 0.692322 0.529816 -0.302887 0.698578 0.535919 -0.328064 0.704773 0.542053 -0.353241 0.710754 0.547974 -0.378693 0.716858 0.554077 -0.404144 0.722900 0.560211 -0.429382 0.728821 0.566132 -0.454651 0.734802 0.572235 -0.480072 0.740601 0.578247 -0.506012 0.746338 0.584137 -0.532593 0.752075 0.590118 -0.559479 0.757660 0.595917 -0.586823 0.763275 0.601868 -0.614258 0.768860 0.607819 -0.641449 0.774231 0.613464 -0.668549 0.779602 0.619232 -0.695251 0.784943 0.624939 -0.721344 0.790070 0.630463 -0.747070 0.795258 0.636047 -0.772186 0.800354 0.641571 -0.796539 0.805176 0.646881 -0.820343 0.810120 0.652252 -0.843323 0.814880 0.657562 -0.865356 0.819489 0.662628 -0.886597 0.824097 0.667755 -0.906738 0.828491 0.672699 -0.925995 0.832916 0.677643 -0.944122 0.837219 0.682465 -0.960968 0.841339 0.687073 -0.216827 0.707886 0.523743 -0.240234 0.713959 0.529663 -0.264343 0.720062 0.535767 -0.288757 0.726013 0.541718 -0.313721 0.732086 0.547852 -0.338898 0.738129 0.553955 -0.364166 0.743958 0.559875 -0.389618 0.749786 0.565979 -0.415009 0.755646 0.572052 -0.440155 0.761353 0.577972 -0.465271 0.767029 0.583984 -0.490906 0.772766 0.589966 -0.517090 0.778168 0.595795 -0.543793 0.783722 0.601715 -0.570770 0.789062 0.607483 -0.598114 0.794434 0.613281 -0.625427 0.799744 0.619110 -0.652496 0.804810 0.624664 -0.679321 0.809906 0.630310 -0.705750 0.814972 0.635895 -0.731598 0.819855 0.641296 -0.757019 0.824738 0.646759 -0.781799 0.829498 0.652161 -0.805786 0.834106 0.657288 -0.829102 0.838623 0.662476 -0.851624 0.843048 0.667511 -0.873352 0.847443 0.672546 -0.894135 0.851746 0.677490 -0.913818 0.855865 0.682159 -0.932556 0.859955 0.686920 -0.950195 0.863922 0.691559 -0.966461 0.867676 0.695984 -0.226837 0.741089 0.535492 -0.250610 0.747131 0.541595 -0.274872 0.753082 0.547668 -0.299469 0.758820 0.553680 -0.324524 0.764709 0.559723 -0.349762 0.770477 0.565857 -0.375031 0.776093 0.571777 -0.400452 0.781769 0.577850 -0.425690 0.787445 0.583862 -0.450745 0.792816 0.589691 -0.475952 0.798309 0.595642 -0.501678 0.803589 0.601471 -0.528076 0.808960 0.607330 -0.554962 0.814209 0.613159 -0.581940 0.819275 0.618805 -0.609192 0.824341 0.624542 -0.636353 0.829376 0.630157 -0.663269 0.834198 0.635651 -0.689819 0.838989 0.641174 -0.716034 0.843781 0.646606 -0.741516 0.848328 0.651855 -0.766571 0.852844 0.657135 -0.790985 0.857330 0.662384 -0.814636 0.861572 0.667389 -0.837616 0.865845 0.672424 -0.859680 0.869934 0.677216 -0.880951 0.873993 0.682068 -0.901306 0.877960 0.686829 -0.920532 0.881714 0.691345 -0.938782 0.885437 0.695892 -0.955872 0.889160 0.700287 -0.971619 0.892548 0.704590 -0.237000 0.773529 0.547394 -0.260956 0.779297 0.553436 -0.285461 0.785034 0.559631 -0.310120 0.790680 0.565582 -0.335236 0.796265 0.571594 -0.360535 0.801819 0.577698 -0.385773 0.807190 0.583496 -0.411072 0.812592 0.589569 -0.436249 0.818024 0.595520 -0.461182 0.823151 0.601318 -0.486572 0.828339 0.607208 -0.512482 0.833374 0.612915 -0.539032 0.838440 0.618652 -0.565918 0.843384 0.624359 -0.592865 0.848145 0.629883 -0.620026 0.852936 0.635529 -0.647064 0.857666 0.641022 -0.673706 0.862122 0.646362 -0.700073 0.866638 0.651672 -0.725891 0.871124 0.656982 -0.751068 0.875305 0.662140 -0.775818 0.879578 0.667267 -0.799774 0.883545 0.672180 -0.823120 0.887573 0.677124 -0.845703 0.891541 0.681946 -0.867340 0.895294 0.686554 -0.888214 0.898987 0.691223 -0.908020 0.902588 0.695740 -0.926849 0.906067 0.700073 -0.944580 0.909454 0.704468 -0.961212 0.912811 0.708679 -0.976471 0.915894 0.712646 -0.247223 0.804901 0.559326 -0.271393 0.810486 0.565399 -0.295990 0.816010 0.571442 -0.320770 0.821320 0.577362 -0.345947 0.826691 0.583405 -0.371216 0.831970 0.589386 -0.396393 0.837067 0.595215 -0.421570 0.842224 0.601105 -0.446533 0.847198 0.606873 -0.471527 0.852173 0.612732 -0.497162 0.857056 0.618530 -0.523193 0.861755 0.624084 -0.549805 0.866516 0.629761 -0.576691 0.871185 0.635376 -0.603607 0.875610 0.640808 -0.630676 0.880096 0.646210 -0.657501 0.884491 0.651581 -0.683868 0.888641 0.656769 -0.709930 0.892822 0.662018 -0.735474 0.896912 0.667175 -0.760345 0.900787 0.672028 -0.784760 0.904694 0.676971 -0.808289 0.908325 0.681702 -0.831268 0.912048 0.686462 -0.853424 0.915619 0.691071 -0.874634 0.919006 0.695526 -0.895081 0.922394 0.699982 -0.914429 0.925659 0.704376 -0.932770 0.928741 0.708466 -0.950012 0.931793 0.712555 -0.966095 0.934753 0.716522 -0.980927 0.937561 0.720337 -0.257507 0.835083 0.571167 -0.281830 0.840424 0.577179 -0.306488 0.845642 0.583221 -0.331360 0.850677 0.589081 -0.356506 0.855743 0.595062 -0.381775 0.860718 0.601013 -0.406860 0.865601 0.606720 -0.431976 0.870392 0.612640 -0.456696 0.875061 0.618225 -0.481842 0.879730 0.623962 -0.507629 0.884338 0.629639 -0.533783 0.888702 0.635071 -0.560425 0.893066 0.640625 -0.587311 0.897400 0.646057 -0.614136 0.901489 0.651306 -0.640991 0.905609 0.656647 -0.667633 0.909668 0.661896 -0.693695 0.913483 0.666870 -0.719452 0.917297 0.671936 -0.744537 0.920898 0.676727 -0.769165 0.924561 0.681580 -0.793213 0.928131 0.686340 -0.816437 0.931458 0.690887 -0.839020 0.934784 0.695404 -0.860718 0.937958 0.699860 -0.881500 0.940979 0.704163 -0.901489 0.944061 0.708344 -0.920471 0.946930 0.712433 -0.938263 0.949677 0.716370 -0.955109 0.952393 0.720245 -0.970642 0.954926 0.723969 -0.985046 0.957428 0.727539 -0.267731 0.863953 0.582916 -0.292175 0.868988 0.588898 -0.316925 0.873901 0.594940 -0.341827 0.878601 0.600708 -0.366943 0.883362 0.606598 -0.391998 0.887939 0.612274 -0.417084 0.892517 0.618073 -0.442078 0.897064 0.623810 -0.466766 0.901367 0.629333 -0.492035 0.905701 0.634949 -0.518005 0.909943 0.640472 -0.544159 0.913971 0.645813 -0.570801 0.917999 0.651215 -0.597656 0.921936 0.656525 -0.624329 0.925751 0.661621 -0.651001 0.929504 0.666748 -0.677368 0.933105 0.671814 -0.703217 0.936615 0.676605 -0.728607 0.940094 0.681488 -0.753418 0.943359 0.686096 -0.777710 0.946564 0.690765 -0.801361 0.949738 0.695312 -0.824158 0.952698 0.699707 -0.846313 0.955658 0.704041 -0.867676 0.958557 0.708252 -0.888062 0.961212 0.712280 -0.907623 0.963867 0.716248 -0.926086 0.966431 0.720154 -0.943512 0.968811 0.723816 -0.959778 0.971161 0.727478 -0.974884 0.973358 0.730957 -0.988770 0.975494 0.734314 -0.277924 0.891266 0.594604 -0.302429 0.895966 0.600586 -0.327271 0.900574 0.606445 -0.352142 0.904968 0.612122 -0.377228 0.909393 0.617950 -0.402222 0.913635 0.623505 -0.427216 0.917877 0.629181 -0.451996 0.922028 0.634796 -0.476685 0.925964 0.640167 -0.502197 0.929962 0.645660 -0.528137 0.933807 0.651062 -0.554382 0.937500 0.656250 -0.581055 0.941132 0.661530 -0.607758 0.944702 0.666626 -0.634277 0.948120 0.671539 -0.660706 0.951538 0.676514 -0.686646 0.954681 0.681213 -0.712311 0.957886 0.686005 -0.737427 0.960968 0.690643 -0.761902 0.963867 0.695129 -0.785797 0.966766 0.699554 -0.809052 0.969543 0.703918 -0.831543 0.972137 0.708038 -0.853302 0.974731 0.712158 -0.874146 0.977203 0.716156 -0.894135 0.979553 0.719971 -0.913269 0.981842 0.723724 -0.931244 0.983978 0.727325 -0.948212 0.986053 0.730835 -0.964111 0.988037 0.734222 -0.978760 0.989929 0.737427 -0.992188 0.991730 0.740570 -0.044952 0.042908 0.305969 -0.057953 0.044373 0.309021 -0.071259 0.045837 0.312134 -0.085388 0.047485 0.315369 -0.100677 0.049164 0.318756 -0.117157 0.050812 0.322144 -0.134857 0.052612 0.325806 -0.153625 0.054474 0.329498 -0.173218 0.056335 0.333191 -0.193817 0.058319 0.337067 -0.215149 0.060303 0.341003 -0.237152 0.062408 0.345123 -0.259827 0.064575 0.349365 -0.282928 0.066772 0.353455 -0.306519 0.069092 0.357849 -0.330566 0.071472 0.362366 -0.354736 0.073853 0.366730 -0.379242 0.076385 0.371399 -0.403748 0.078979 0.376068 -0.428253 0.081604 0.380737 -0.452759 0.084381 0.385529 -0.477386 0.087158 0.390320 -0.502869 0.090118 0.395294 -0.528931 0.093109 0.400330 -0.555481 0.096161 0.405243 -0.582520 0.099396 0.410431 -0.609680 0.102692 0.415649 -0.636902 0.105988 0.420715 -0.664093 0.109467 0.425995 -0.690979 0.113068 0.431274 -0.717407 0.116638 0.436493 -0.743530 0.120331 0.441925 -0.048431 0.055511 0.312012 -0.061584 0.057190 0.315277 -0.075195 0.058868 0.318604 -0.089752 0.060638 0.322052 -0.105499 0.062531 0.325684 -0.122498 0.064392 0.329315 -0.140656 0.066406 0.333099 -0.159729 0.068451 0.336884 -0.179901 0.070557 0.340912 -0.200897 0.072784 0.345032 -0.222534 0.075043 0.349121 -0.244965 0.077362 0.353363 -0.267914 0.079834 0.357758 -0.291290 0.082336 0.362122 -0.315186 0.084930 0.366638 -0.339386 0.087616 0.371246 -0.363831 0.090332 0.375854 -0.388458 0.093201 0.380615 -0.412994 0.096100 0.385284 -0.437683 0.099152 0.390198 -0.462341 0.102325 0.395142 -0.487305 0.105469 0.400116 -0.513153 0.108826 0.405121 -0.539551 0.112244 0.410278 -0.566315 0.115662 0.415375 -0.593536 0.119263 0.420563 -0.620880 0.122955 0.425842 -0.648102 0.126648 0.431000 -0.675293 0.130524 0.436401 -0.701965 0.134369 0.441620 -0.728424 0.138397 0.447052 -0.754425 0.142487 0.452484 -0.052155 0.069061 0.318512 -0.065521 0.070953 0.321991 -0.079468 0.072845 0.325500 -0.094452 0.074890 0.329224 -0.110748 0.076996 0.333008 -0.128235 0.079163 0.336792 -0.146820 0.081421 0.340790 -0.166412 0.083740 0.344818 -0.186951 0.086151 0.349030 -0.208313 0.088684 0.353271 -0.230347 0.091248 0.357544 -0.253052 0.093964 0.362030 -0.276367 0.096741 0.366486 -0.299988 0.099609 0.371002 -0.324158 0.102570 0.375732 -0.348633 0.105652 0.380463 -0.373169 0.108734 0.385193 -0.397980 0.112000 0.390076 -0.422638 0.115265 0.394897 -0.447388 0.118713 0.399963 -0.472168 0.122284 0.404968 -0.497498 0.125824 0.410004 -0.523773 0.129547 0.415222 -0.550446 0.133331 0.420441 -0.577423 0.137115 0.425598 -0.604767 0.141083 0.430908 -0.632233 0.145142 0.436218 -0.659454 0.149170 0.441498 -0.686554 0.153381 0.446899 -0.713165 0.157562 0.452209 -0.739471 0.161926 0.457703 -0.765259 0.166321 0.463287 -0.056122 0.083862 0.325409 -0.069733 0.086060 0.329132 -0.084045 0.088196 0.332825 -0.099579 0.090576 0.336700 -0.116302 0.092957 0.340607 -0.134277 0.095490 0.344696 -0.153381 0.098083 0.348877 -0.173370 0.100739 0.353088 -0.194366 0.103516 0.357422 -0.216125 0.106445 0.361877 -0.238525 0.109344 0.366302 -0.261536 0.112457 0.370880 -0.285126 0.115631 0.375580 -0.309052 0.118835 0.380249 -0.333405 0.122223 0.385071 -0.357941 0.125580 0.389862 -0.382782 0.129120 0.394806 -0.407715 0.132782 0.399841 -0.432404 0.136383 0.404755 -0.457214 0.140198 0.409882 -0.482361 0.144073 0.415070 -0.508118 0.148010 0.420166 -0.534576 0.152069 0.425415 -0.561554 0.156219 0.430756 -0.588745 0.160339 0.435974 -0.616180 0.164642 0.441345 -0.643555 0.168945 0.446625 -0.670898 0.173370 0.452087 -0.697906 0.177917 0.457550 -0.724396 0.182373 0.463013 -0.750610 0.187042 0.468658 -0.776154 0.191772 0.474396 -0.060364 0.100311 0.332703 -0.074280 0.102844 0.336609 -0.088989 0.105377 0.340515 -0.104980 0.108063 0.344604 -0.122284 0.110809 0.348694 -0.140747 0.113678 0.352936 -0.160339 0.116699 0.357330 -0.180756 0.119659 0.361633 -0.202148 0.122833 0.366150 -0.224274 0.126160 0.370758 -0.246979 0.129425 0.375336 -0.270386 0.132874 0.380127 -0.294220 0.136383 0.384979 -0.318390 0.139984 0.389709 -0.343018 0.143677 0.394684 -0.367706 0.147430 0.399567 -0.392639 0.151337 0.404633 -0.417633 0.155273 0.409790 -0.442444 0.159271 0.414825 -0.467316 0.163391 0.420074 -0.492889 0.167633 0.425323 -0.518921 0.171844 0.430450 -0.545654 0.176270 0.435852 -0.572906 0.180725 0.441254 -0.600281 0.185120 0.446503 -0.627838 0.189789 0.451965 -0.655182 0.194336 0.457275 -0.682495 0.199036 0.462891 -0.709351 0.203888 0.468536 -0.735687 0.208618 0.474121 -0.761627 0.213562 0.479858 -0.787018 0.218506 0.485657 -0.064850 0.118683 0.340424 -0.078979 0.121429 0.344421 -0.094299 0.124420 0.348602 -0.110870 0.127472 0.352844 -0.128632 0.130524 0.357086 -0.147614 0.133789 0.361542 -0.167664 0.137146 0.366058 -0.188507 0.140472 0.370544 -0.210297 0.143982 0.375244 -0.232758 0.147644 0.380035 -0.255798 0.151245 0.384705 -0.279449 0.155029 0.389587 -0.303467 0.158813 0.394440 -0.328033 0.162811 0.399445 -0.352783 0.166870 0.404480 -0.377655 0.170929 0.409515 -0.402679 0.175140 0.414673 -0.427765 0.179474 0.419922 -0.452576 0.183716 0.425049 -0.477753 0.188232 0.430359 -0.503601 0.192749 0.435699 -0.530029 0.197235 0.440979 -0.557098 0.201935 0.446350 -0.584503 0.206665 0.451843 -0.611908 0.211365 0.457153 -0.639557 0.216248 0.462738 -0.666870 0.221069 0.468231 -0.694031 0.226044 0.473969 -0.720764 0.231079 0.479706 -0.746948 0.236053 0.485321 -0.772705 0.241211 0.491211 -0.797791 0.246399 0.497162 -0.069550 0.138763 0.348511 -0.084137 0.141846 0.352600 -0.099915 0.145172 0.356995 -0.117035 0.148590 0.361450 -0.135345 0.152008 0.365845 -0.154846 0.155548 0.370453 -0.175323 0.159271 0.375122 -0.196594 0.162933 0.379791 -0.218719 0.166779 0.384583 -0.241608 0.170807 0.389465 -0.264923 0.174683 0.394287 -0.288879 0.178802 0.399292 -0.313141 0.182922 0.404266 -0.337860 0.187195 0.409363 -0.362854 0.191589 0.414551 -0.387756 0.195953 0.419647 -0.412933 0.200470 0.424896 -0.438080 0.205078 0.430206 -0.462921 0.209625 0.435425 -0.488464 0.214355 0.440826 -0.514709 0.219177 0.446228 -0.541351 0.223938 0.451538 -0.568573 0.228882 0.457001 -0.596039 0.233765 0.462494 -0.623718 0.238800 0.468048 -0.651306 0.243896 0.473785 -0.678589 0.248932 0.479370 -0.705597 0.254150 0.485229 -0.732178 0.259399 0.491089 -0.758179 0.264526 0.496857 -0.783661 0.269897 0.502838 -0.808563 0.275238 0.508820 -0.074585 0.160522 0.356873 -0.089600 0.163971 0.361237 -0.105988 0.167603 0.365723 -0.123657 0.171326 0.370361 -0.142456 0.175079 0.374908 -0.162415 0.178986 0.379639 -0.183350 0.182983 0.384491 -0.204987 0.186951 0.389191 -0.227539 0.191162 0.394165 -0.250610 0.195282 0.399078 -0.274353 0.199646 0.404114 -0.298584 0.204102 0.409271 -0.323029 0.208435 0.414276 -0.347961 0.213043 0.419525 -0.373077 0.217682 0.424805 -0.398132 0.222290 0.429932 -0.423370 0.227112 0.435303 -0.448456 0.231964 0.440704 -0.473511 0.236755 0.445953 -0.499451 0.241730 0.451416 -0.526001 0.246796 0.456909 -0.552917 0.251770 0.462311 -0.580322 0.256958 0.467926 -0.607880 0.262024 0.473511 -0.635590 0.267303 0.479279 -0.663177 0.272583 0.485046 -0.690308 0.277771 0.490753 -0.717163 0.283173 0.496704 -0.743561 0.288605 0.502686 -0.769257 0.293945 0.508514 -0.794525 0.299408 0.514526 -0.819122 0.304901 0.520569 -0.079895 0.183807 0.365631 -0.095398 0.187561 0.370117 -0.112396 0.191528 0.374786 -0.130615 0.195557 0.379517 -0.149933 0.199585 0.384247 -0.170319 0.203827 0.389099 -0.191711 0.208099 0.394043 -0.213745 0.212372 0.398956 -0.236633 0.216858 0.403992 -0.260010 0.221283 0.409027 -0.284027 0.225861 0.414124 -0.308533 0.230591 0.419373 -0.333191 0.235229 0.424500 -0.358246 0.240051 0.429810 -0.383484 0.244995 0.435181 -0.408691 0.249847 0.440460 -0.433899 0.254852 0.445801 -0.459045 0.259949 0.451263 -0.484375 0.264984 0.456604 -0.510620 0.270172 0.462158 -0.537354 0.275299 0.467682 -0.564636 0.280609 0.473358 -0.592224 0.285950 0.479126 -0.619812 0.291199 0.484772 -0.647491 0.296631 0.490662 -0.675018 0.302063 0.496521 -0.701996 0.307434 0.502380 -0.728668 0.312958 0.508331 -0.754883 0.318512 0.514343 -0.780365 0.323944 0.520355 -0.805359 0.329498 0.526428 -0.829437 0.334961 0.532349 -0.085541 0.208496 0.374664 -0.101624 0.212555 0.379303 -0.119141 0.216797 0.384125 -0.137939 0.221130 0.389008 -0.157745 0.225433 0.393799 -0.178589 0.229919 0.398834 -0.200256 0.234344 0.403748 -0.222809 0.239075 0.408875 -0.246033 0.243774 0.414032 -0.269684 0.248444 0.419098 -0.294006 0.253326 0.424377 -0.318695 0.258240 0.429657 -0.343567 0.263123 0.434875 -0.368744 0.268188 0.440277 -0.394073 0.273346 0.445709 -0.419250 0.278381 0.450989 -0.444550 0.283600 0.456451 -0.469757 0.288879 0.462036 -0.495483 0.294098 0.467499 -0.522064 0.299500 0.473267 -0.548981 0.304749 0.478821 -0.576477 0.310242 0.484619 -0.604218 0.315704 0.490509 -0.631805 0.321106 0.496246 -0.659454 0.326660 0.502258 -0.686829 0.332214 0.508240 -0.713623 0.337708 0.514069 -0.740143 0.343323 0.520172 -0.766052 0.348938 0.526276 -0.791290 0.354462 0.532196 -0.815948 0.360107 0.538330 -0.839752 0.365631 0.544342 -0.091522 0.234436 0.383972 -0.108185 0.238770 0.388733 -0.126312 0.243286 0.393707 -0.145599 0.247894 0.398682 -0.165863 0.252411 0.403595 -0.187195 0.257172 0.408752 -0.209259 0.261902 0.413788 -0.232147 0.266785 0.418976 -0.255707 0.271759 0.424286 -0.279663 0.276642 0.429474 -0.304169 0.281738 0.434753 -0.329071 0.286865 0.440125 -0.354126 0.291962 0.445435 -0.379425 0.297241 0.450836 -0.404755 0.302521 0.456329 -0.430023 0.307770 0.461761 -0.455292 0.313141 0.467407 -0.480621 0.318481 0.472961 -0.506805 0.323944 0.478668 -0.533691 0.329468 0.484467 -0.560852 0.334869 0.490173 -0.588470 0.340454 0.496094 -0.616241 0.346069 0.502106 -0.643829 0.351562 0.507904 -0.671417 0.357178 0.513885 -0.698578 0.362854 0.520020 -0.725250 0.368347 0.525970 -0.751495 0.374084 0.532043 -0.777100 0.379608 0.538025 -0.802094 0.385254 0.544220 -0.826416 0.390930 0.550385 -0.849854 0.396454 0.556366 -0.097870 0.261505 0.393555 -0.115143 0.266083 0.398438 -0.133789 0.270874 0.403473 -0.153473 0.275543 0.408478 -0.174316 0.280487 0.413666 -0.196075 0.285431 0.418823 -0.218506 0.290375 0.423981 -0.241730 0.295502 0.429291 -0.265594 0.300659 0.434631 -0.289795 0.305695 0.439880 -0.314545 0.311005 0.445221 -0.339630 0.316315 0.450714 -0.364777 0.321564 0.456055 -0.390167 0.326965 0.461609 -0.415466 0.332306 0.467072 -0.440796 0.337799 0.472809 -0.466095 0.343353 0.478516 -0.491791 0.348755 0.484192 -0.518311 0.354370 0.490051 -0.545441 0.359985 0.496002 -0.572784 0.365448 0.501770 -0.600525 0.371124 0.507751 -0.628265 0.376770 0.513733 -0.655853 0.382324 0.519714 -0.683289 0.388000 0.525818 -0.710358 0.393707 0.531891 -0.736694 0.399292 0.537872 -0.762695 0.404938 0.544067 -0.787994 0.410492 0.550079 -0.812775 0.416138 0.556213 -0.836761 0.421814 0.562439 -0.859741 0.427277 0.568420 -0.104553 0.289642 0.403320 -0.122406 0.294403 0.408325 -0.141602 0.299377 0.413513 -0.161835 0.304260 0.418549 -0.183075 0.309387 0.423889 -0.205231 0.314514 0.429169 -0.228027 0.319672 0.434326 -0.251617 0.324921 0.439758 -0.275726 0.330261 0.445129 -0.300140 0.335480 0.450439 -0.325134 0.340912 0.455902 -0.350342 0.346405 0.461487 -0.375580 0.351746 0.466919 -0.401093 0.357300 0.472656 -0.426392 0.362701 0.478241 -0.451691 0.368317 0.484100 -0.477234 0.373962 0.489899 -0.503235 0.379486 0.495667 -0.530029 0.385101 0.501648 -0.557343 0.390778 0.507629 -0.584808 0.396332 0.513489 -0.612579 0.402008 0.519562 -0.640381 0.407715 0.525665 -0.667847 0.413269 0.531586 -0.695099 0.418976 0.537689 -0.721802 0.424469 0.543732 -0.748077 0.430176 0.549927 -0.773773 0.435852 0.556061 -0.798828 0.441437 0.562103 -0.823212 0.447113 0.568237 -0.846832 0.452820 0.574432 -0.869415 0.458435 0.580444 -0.111511 0.318359 0.413269 -0.130066 0.323486 0.418457 -0.149780 0.328644 0.423737 -0.170441 0.333771 0.428925 -0.192139 0.338989 0.434204 -0.214722 0.344330 0.439606 -0.237793 0.349579 0.444855 -0.261719 0.354980 0.450317 -0.286072 0.360443 0.455811 -0.310699 0.365814 0.461212 -0.335846 0.371338 0.466797 -0.361053 0.376740 0.472382 -0.386536 0.382324 0.478119 -0.412048 0.387970 0.483917 -0.437317 0.393463 0.489624 -0.462616 0.399109 0.495483 -0.488403 0.404816 0.501465 -0.514801 0.410339 0.507324 -0.541840 0.416046 0.513367 -0.569305 0.421722 0.519409 -0.596863 0.427246 0.525360 -0.624725 0.432953 0.531433 -0.652435 0.438629 0.537567 -0.679688 0.444244 0.543610 -0.706787 0.450012 0.549744 -0.733215 0.455750 0.555725 -0.759308 0.461517 0.561951 -0.784790 0.467407 0.568085 -0.809387 0.473145 0.574158 -0.833435 0.479065 0.580261 -0.856659 0.484985 0.586395 -0.878876 0.490723 0.592377 -0.118927 0.347931 0.423462 -0.138000 0.353210 0.428772 -0.158203 0.358459 0.434082 -0.179382 0.363708 0.439362 -0.201508 0.369141 0.444702 -0.224396 0.374573 0.450195 -0.247803 0.379913 0.455505 -0.272003 0.385468 0.461090 -0.296570 0.390991 0.466644 -0.321442 0.396423 0.472229 -0.346710 0.402039 0.477966 -0.372040 0.407501 0.483643 -0.397552 0.413177 0.489502 -0.423096 0.418823 0.495361 -0.448273 0.424316 0.501190 -0.473724 0.430054 0.507172 -0.499847 0.435730 0.513184 -0.526489 0.441284 0.519104 -0.553741 0.447083 0.525208 -0.581329 0.452881 0.531281 -0.609009 0.458588 0.537231 -0.636780 0.464478 0.543457 -0.664215 0.470276 0.549408 -0.691498 0.476227 0.555603 -0.718353 0.482208 0.561768 -0.744507 0.488068 0.567780 -0.770325 0.494080 0.573975 -0.795471 0.500122 0.580139 -0.819794 0.505981 0.586121 -0.843475 0.511993 0.592224 -0.866302 0.518066 0.598297 -0.888000 0.523956 0.604218 -0.126648 0.377991 0.433807 -0.146301 0.383362 0.439209 -0.167023 0.388763 0.444580 -0.188568 0.394104 0.449921 -0.211090 0.399628 0.455353 -0.234344 0.405151 0.460907 -0.258026 0.410553 0.466370 -0.282440 0.416138 0.472046 -0.307251 0.421753 0.477783 -0.332306 0.427216 0.483459 -0.357666 0.432861 0.489319 -0.383057 0.438385 0.495056 -0.408630 0.444092 0.501007 -0.434082 0.449860 0.506989 -0.459290 0.455597 0.512848 -0.484985 0.461456 0.518951 -0.511444 0.467377 0.525024 -0.538269 0.473175 0.531006 -0.565704 0.479187 0.537109 -0.593384 0.485229 0.543274 -0.621002 0.491119 0.549286 -0.648773 0.497223 0.555450 -0.676056 0.503174 0.561432 -0.703156 0.509308 0.567627 -0.729736 0.515381 0.573792 -0.755737 0.521393 0.579834 -0.781189 0.527557 0.585968 -0.806000 0.533661 0.592041 -0.829956 0.539642 0.597992 -0.853241 0.545776 0.604034 -0.875580 0.551849 0.610077 -0.896912 0.557739 0.615906 -0.134705 0.408356 0.444336 -0.154907 0.413818 0.449768 -0.176056 0.419312 0.455200 -0.198029 0.424713 0.460663 -0.220886 0.430267 0.466248 -0.244446 0.435883 0.471954 -0.268463 0.441345 0.477509 -0.293060 0.447052 0.483307 -0.318085 0.452789 0.489166 -0.343231 0.458435 0.494873 -0.368713 0.464325 0.500854 -0.394135 0.470154 0.506683 -0.419647 0.476135 0.512726 -0.445099 0.482147 0.518829 -0.470337 0.488068 0.524750 -0.496399 0.494141 0.530823 -0.523132 0.500305 0.536957 -0.550171 0.506287 0.542999 -0.577728 0.512451 0.549133 -0.605499 0.518585 0.555298 -0.633057 0.524719 0.561310 -0.660675 0.530945 0.567474 -0.687775 0.536987 0.573517 -0.714600 0.543213 0.579651 -0.741058 0.549408 0.585785 -0.766693 0.555450 0.591736 -0.791809 0.561676 0.597870 -0.816315 0.567810 0.603882 -0.839874 0.573761 0.609741 -0.862732 0.579956 0.615784 -0.884644 0.585999 0.621704 -0.905457 0.591888 0.627441 -0.143127 0.438934 0.454956 -0.163757 0.444458 0.460541 -0.185394 0.450134 0.466095 -0.207764 0.455750 0.471680 -0.230957 0.461487 0.477356 -0.254791 0.467316 0.483185 -0.279053 0.473114 0.488892 -0.303833 0.479065 0.494720 -0.328857 0.484924 0.500580 -0.354309 0.490997 0.506561 -0.379852 0.497131 0.512573 -0.405212 0.503113 0.518494 -0.430786 0.509308 0.524597 -0.456116 0.515442 0.530670 -0.481567 0.521515 0.536652 -0.507965 0.527863 0.542847 -0.534851 0.534058 0.548950 -0.562073 0.540222 0.554993 -0.589691 0.546509 0.561127 -0.617432 0.552795 0.567322 -0.644958 0.558929 0.573364 -0.672424 0.565247 0.579498 -0.699371 0.571350 0.585480 -0.725983 0.577576 0.591583 -0.752075 0.583862 0.597717 -0.777405 0.589874 0.603607 -0.802246 0.596069 0.609650 -0.826324 0.602173 0.615601 -0.849548 0.608154 0.621399 -0.871887 0.614197 0.627289 -0.893402 0.620209 0.633118 -0.913727 0.625977 0.638763 -0.151764 0.470337 0.465790 -0.172882 0.476257 0.471527 -0.194916 0.482178 0.477264 -0.217590 0.488037 0.482941 -0.241119 0.494080 0.488708 -0.265289 0.500153 0.494598 -0.289734 0.506104 0.500427 -0.314697 0.512268 0.506378 -0.339905 0.518311 0.512268 -0.365356 0.524597 0.518341 -0.390930 0.530884 0.524414 -0.416321 0.536987 0.530334 -0.441803 0.543365 0.536530 -0.467133 0.549683 0.542664 -0.492950 0.555847 0.548645 -0.519531 0.562225 0.554840 -0.546661 0.568542 0.561005 -0.573975 0.574768 0.567078 -0.601654 0.581116 0.573212 -0.629181 0.587250 0.579224 -0.656799 0.593597 0.585358 -0.684082 0.599854 0.591431 -0.710693 0.605957 0.597382 -0.737061 0.612183 0.603424 -0.762848 0.618347 0.609467 -0.787903 0.624359 0.615295 -0.812378 0.630432 0.621246 -0.836090 0.636444 0.627136 -0.858887 0.642334 0.632874 -0.880859 0.648224 0.638641 -0.901733 0.653931 0.644226 -0.921692 0.659698 0.649872 -0.160736 0.503143 0.476929 -0.182251 0.509216 0.482727 -0.204681 0.515350 0.488556 -0.227722 0.521393 0.494324 -0.251556 0.527679 0.500305 -0.275726 0.533783 0.506134 -0.300537 0.540070 0.512115 -0.325684 0.546387 0.518188 -0.350922 0.552582 0.524078 -0.376465 0.558960 0.530212 -0.402100 0.565399 0.536377 -0.427429 0.571594 0.542358 -0.452789 0.577972 0.548523 -0.478333 0.584412 0.554718 -0.504395 0.590607 0.560699 -0.531189 0.597015 0.566864 -0.558472 0.603363 0.573059 -0.585815 0.609528 0.579010 -0.613556 0.615875 0.585175 -0.641022 0.622009 0.591156 -0.668396 0.628235 0.597229 -0.695435 0.634460 0.603302 -0.721924 0.640472 0.609161 -0.747986 0.646545 0.615143 -0.773438 0.652649 0.621124 -0.798126 0.658508 0.626862 -0.822266 0.664459 0.632721 -0.845551 0.670288 0.638489 -0.867859 0.675964 0.644073 -0.889435 0.681641 0.649719 -0.909882 0.687195 0.655182 -0.929291 0.692780 0.660706 -0.169891 0.536926 0.488312 -0.191833 0.543213 0.494171 -0.214600 0.549530 0.500122 -0.237976 0.555664 0.505951 -0.262054 0.562073 0.511963 -0.286469 0.568298 0.517883 -0.311432 0.574707 0.523956 -0.336731 0.581146 0.530060 -0.362061 0.587372 0.536041 -0.387543 0.593811 0.542206 -0.413177 0.600281 0.548370 -0.438446 0.606476 0.554382 -0.463715 0.612885 0.560516 -0.489594 0.619293 0.566742 -0.515869 0.625519 0.572784 -0.542816 0.631805 0.578857 -0.570099 0.638000 0.584839 -0.597717 0.644257 0.591034 -0.625336 0.650452 0.597076 -0.652679 0.656525 0.602997 -0.679901 0.662628 0.609009 -0.706696 0.668671 0.615021 -0.732880 0.674530 0.620850 -0.758636 0.680481 0.626740 -0.783752 0.686340 0.632568 -0.808105 0.691986 0.638214 -0.831818 0.697754 0.643951 -0.854614 0.703278 0.649506 -0.876617 0.708832 0.655029 -0.897675 0.714355 0.660553 -0.917633 0.719666 0.665894 -0.936584 0.725006 0.671265 -0.179291 0.571411 0.499817 -0.201660 0.577789 0.505798 -0.224731 0.584259 0.511871 -0.248383 0.590485 0.517700 -0.272675 0.596954 0.523804 -0.297272 0.603210 0.529724 -0.322418 0.609680 0.535919 -0.347778 0.616119 0.542053 -0.373138 0.622375 0.548065 -0.398682 0.628784 0.554230 -0.424194 0.635162 0.560364 -0.449402 0.641388 0.566467 -0.474762 0.647736 0.572571 -0.500702 0.653870 0.578583 -0.527374 0.660156 0.584717 -0.554535 0.666351 0.590790 -0.581848 0.672363 0.596771 -0.609375 0.678497 0.602814 -0.636932 0.684540 0.608856 -0.664154 0.690430 0.614685 -0.691162 0.696350 0.620697 -0.717651 0.702179 0.626587 -0.743561 0.707886 0.632294 -0.768951 0.713593 0.638092 -0.793793 0.719238 0.643799 -0.817780 0.724731 0.649353 -0.841095 0.730225 0.654938 -0.863464 0.735474 0.660309 -0.885071 0.740814 0.665771 -0.905609 0.746094 0.671143 -0.925079 0.751129 0.676300 -0.943512 0.756165 0.681488 -0.188904 0.606354 0.511536 -0.211578 0.612762 0.517578 -0.234863 0.619080 0.523499 -0.258911 0.625519 0.529602 -0.283386 0.631989 0.535736 -0.308136 0.638184 0.541718 -0.333374 0.644592 0.547882 -0.358765 0.651031 0.554047 -0.384216 0.657196 0.560089 -0.409729 0.663544 0.566284 -0.435150 0.669769 0.572449 -0.460266 0.675873 0.578430 -0.485901 0.682098 0.584564 -0.512024 0.688049 0.590515 -0.538879 0.694214 0.596588 -0.566071 0.700195 0.602692 -0.593475 0.706055 0.608582 -0.620941 0.711975 0.614532 -0.648407 0.717834 0.620514 -0.675415 0.723511 0.626312 -0.702148 0.729248 0.632172 -0.728394 0.734894 0.637939 -0.753998 0.740326 0.643494 -0.779083 0.745819 0.649231 -0.803406 0.751099 0.654663 -0.827118 0.756409 0.660187 -0.850098 0.761688 0.665619 -0.871979 0.766724 0.670868 -0.893097 0.771759 0.676147 -0.913208 0.776794 0.681366 -0.932159 0.781555 0.686340 -0.949982 0.786316 0.691345 -0.198700 0.641296 0.523346 -0.221680 0.647766 0.529419 -0.245239 0.653992 0.535431 -0.269470 0.660400 0.541595 -0.294159 0.666687 0.547729 -0.319092 0.672913 0.553772 -0.344391 0.679169 0.559937 -0.369843 0.685455 0.566101 -0.395172 0.691467 0.572144 -0.420654 0.697662 0.578247 -0.445984 0.703796 0.584412 -0.471100 0.709717 0.590393 -0.497070 0.715759 0.596497 -0.523376 0.721527 0.602417 -0.550354 0.727448 0.608398 -0.577637 0.733276 0.614410 -0.604919 0.738922 0.620239 -0.632355 0.744598 0.626099 -0.659607 0.750244 0.631958 -0.686371 0.755646 0.637634 -0.712891 0.761169 0.643372 -0.738861 0.766571 0.649048 -0.764130 0.771729 0.654480 -0.788879 0.776978 0.660034 -0.812866 0.781982 0.665375 -0.836182 0.787109 0.670685 -0.858673 0.792053 0.676025 -0.880157 0.796814 0.681061 -0.900787 0.801575 0.686218 -0.920441 0.806305 0.691193 -0.938873 0.810791 0.696014 -0.956207 0.815216 0.700867 -0.208588 0.675995 0.535278 -0.231903 0.682312 0.541443 -0.255707 0.688416 0.547455 -0.280121 0.694733 0.553558 -0.304962 0.700897 0.559784 -0.329987 0.706909 0.565796 -0.355377 0.713074 0.571960 -0.380768 0.719147 0.578125 -0.406097 0.725037 0.584106 -0.431488 0.731049 0.590210 -0.456573 0.736786 0.596161 -0.482025 0.742706 0.602203 -0.508179 0.748535 0.608246 -0.534637 0.754089 0.614136 -0.561707 0.759796 0.620056 -0.588989 0.765411 0.625977 -0.616272 0.770813 0.631714 -0.643555 0.776276 0.637482 -0.670624 0.781616 0.643219 -0.697113 0.786835 0.648743 -0.723358 0.791992 0.654358 -0.748901 0.797028 0.659729 -0.773956 0.802094 0.665192 -0.798370 0.807007 0.670563 -0.821960 0.811768 0.675751 -0.844849 0.816528 0.680969 -0.866943 0.821259 0.686066 -0.887970 0.825714 0.690948 -0.908142 0.830170 0.695923 -0.927277 0.834564 0.700775 -0.945190 0.838684 0.705414 -0.962067 0.842865 0.710052 -0.218658 0.710083 0.547272 -0.242218 0.716217 0.553406 -0.266205 0.722229 0.559479 -0.290802 0.728333 0.565643 -0.315796 0.734314 0.571808 -0.340881 0.740173 0.577789 -0.366241 0.746124 0.583954 -0.391693 0.752014 0.590057 -0.416962 0.757721 0.596008 -0.442230 0.763519 0.602081 -0.467163 0.769043 0.607971 -0.492889 0.774689 0.614014 -0.519165 0.780243 0.619934 -0.545807 0.785645 0.625671 -0.572937 0.791107 0.631561 -0.600281 0.796448 0.637329 -0.627411 0.801544 0.642914 -0.654572 0.806763 0.648590 -0.681335 0.811890 0.654205 -0.707642 0.816772 0.659607 -0.733490 0.821686 0.665039 -0.758759 0.826416 0.670319 -0.783417 0.831116 0.675598 -0.807495 0.835785 0.680817 -0.830658 0.840240 0.685822 -0.853210 0.844727 0.690857 -0.874847 0.849091 0.695740 -0.895477 0.853241 0.700531 -0.915131 0.857391 0.705292 -0.933777 0.861450 0.709900 -0.951202 0.865295 0.714355 -0.967499 0.869141 0.718781 -0.228760 0.743378 0.559326 -0.252594 0.749329 0.565491 -0.276764 0.755157 0.571472 -0.301514 0.761047 0.577667 -0.326569 0.766876 0.583832 -0.351715 0.772552 0.589752 -0.377075 0.778229 0.595825 -0.402344 0.783752 0.601776 -0.427643 0.789368 0.607849 -0.452759 0.794922 0.613861 -0.477844 0.800201 0.619629 -0.503754 0.805603 0.625580 -0.530212 0.810944 0.631378 -0.556885 0.816040 0.637054 -0.584045 0.821198 0.642792 -0.611298 0.826263 0.648468 -0.638336 0.831085 0.653931 -0.665253 0.835999 0.659485 -0.691772 0.840820 0.664917 -0.717804 0.845367 0.670197 -0.743378 0.850037 0.675507 -0.768280 0.854401 0.680573 -0.792603 0.858856 0.685730 -0.816315 0.863190 0.690735 -0.839111 0.867310 0.695526 -0.861176 0.871429 0.700409 -0.882385 0.875488 0.705139 -0.902527 0.879333 0.709686 -0.921783 0.883118 0.714264 -0.939819 0.886810 0.718567 -0.956818 0.890411 0.722900 -0.972626 0.893921 0.727173 -0.239014 0.775726 0.571350 -0.263031 0.781494 0.577515 -0.287354 0.787048 0.583466 -0.312195 0.792755 0.589630 -0.337311 0.798370 0.595673 -0.362488 0.803772 0.601654 -0.387787 0.809265 0.607697 -0.412994 0.814545 0.613525 -0.438171 0.819855 0.619476 -0.463196 0.825104 0.625427 -0.488495 0.830170 0.631104 -0.514526 0.835297 0.636902 -0.541107 0.840302 0.642670 -0.567871 0.845123 0.648163 -0.594971 0.849945 0.653839 -0.622070 0.854767 0.659363 -0.648956 0.859253 0.664673 -0.675690 0.863831 0.670044 -0.701782 0.868225 0.675232 -0.727631 0.872620 0.680420 -0.752899 0.876923 0.685547 -0.777435 0.880981 0.690460 -0.801453 0.885101 0.695404 -0.824738 0.889160 0.700256 -0.847107 0.892883 0.704926 -0.868805 0.896698 0.709595 -0.889526 0.900330 0.714172 -0.909210 0.903839 0.718475 -0.927979 0.907349 0.722778 -0.945587 0.910614 0.726959 -0.962097 0.913910 0.731049 -0.977356 0.917023 0.735016 -0.249237 0.807007 0.583344 -0.273407 0.812531 0.589417 -0.297852 0.817871 0.595398 -0.322815 0.823273 0.601501 -0.347839 0.828522 0.607361 -0.373108 0.833801 0.613342 -0.398376 0.839020 0.619354 -0.423462 0.843994 0.625092 -0.448456 0.849060 0.630951 -0.473511 0.854004 0.636749 -0.499054 0.858765 0.642365 -0.525238 0.863586 0.648010 -0.551849 0.868256 0.653656 -0.578613 0.872772 0.659088 -0.605652 0.877319 0.664520 -0.632538 0.881653 0.669769 -0.659332 0.885956 0.675079 -0.685791 0.890198 0.680298 -0.711670 0.894226 0.685303 -0.737152 0.898285 0.690369 -0.762115 0.902283 0.695312 -0.786255 0.906006 0.700012 -0.809875 0.909760 0.704773 -0.832794 0.913391 0.709503 -0.854797 0.916840 0.713959 -0.876007 0.920288 0.718353 -0.896332 0.923645 0.722687 -0.915558 0.926758 0.726807 -0.933838 0.929871 0.730988 -0.950958 0.932831 0.734863 -0.966980 0.935791 0.738770 -0.981781 0.938568 0.742554 -0.259491 0.837097 0.595245 -0.283813 0.842377 0.601349 -0.308380 0.847443 0.607269 -0.333374 0.852631 0.613220 -0.358398 0.857544 0.619080 -0.383636 0.862518 0.624939 -0.408783 0.867401 0.630798 -0.433777 0.872101 0.636505 -0.458679 0.876831 0.642242 -0.483856 0.881439 0.647919 -0.509460 0.885864 0.653351 -0.535767 0.890381 0.658936 -0.562469 0.894714 0.664368 -0.589203 0.898895 0.669678 -0.616089 0.903076 0.674957 -0.642822 0.907104 0.680023 -0.669403 0.911041 0.685181 -0.695557 0.914917 0.690216 -0.721130 0.918640 0.695099 -0.746307 0.922333 0.699921 -0.770874 0.925903 0.704712 -0.794678 0.929321 0.709259 -0.817963 0.932739 0.713776 -0.840454 0.935974 0.718262 -0.862030 0.939056 0.722473 -0.882782 0.942169 0.726715 -0.902618 0.945068 0.730774 -0.921509 0.947937 0.734772 -0.939331 0.950714 0.738647 -0.955994 0.953308 0.742340 -0.971466 0.955872 0.745972 -0.985779 0.958374 0.749573 -0.269684 0.865845 0.607086 -0.294037 0.870728 0.612946 -0.318787 0.875580 0.618896 -0.343811 0.880402 0.624786 -0.368835 0.885040 0.630524 -0.393982 0.889709 0.636322 -0.419037 0.894226 0.642090 -0.443878 0.898621 0.647644 -0.468658 0.903015 0.653229 -0.494049 0.907318 0.658783 -0.519806 0.911377 0.664124 -0.546173 0.915497 0.669495 -0.572693 0.919403 0.674713 -0.599487 0.923340 0.679901 -0.626282 0.927155 0.685089 -0.652771 0.930786 0.689941 -0.679108 0.934387 0.694946 -0.705017 0.937927 0.699829 -0.730225 0.941254 0.704468 -0.755066 0.944550 0.709137 -0.779266 0.947784 0.713684 -0.802734 0.950836 0.718018 -0.825623 0.953888 0.722382 -0.847687 0.956757 0.726624 -0.868866 0.959503 0.730621 -0.889252 0.962219 0.734650 -0.908630 0.964783 0.738434 -0.927032 0.967285 0.742279 -0.944397 0.969696 0.745911 -0.960602 0.971954 0.749359 -0.975677 0.974182 0.752838 -0.989471 0.976288 0.756104 -0.279877 0.893036 0.618744 -0.304291 0.897644 0.624512 -0.329132 0.902130 0.630371 -0.354156 0.906616 0.636169 -0.379089 0.910950 0.641815 -0.404114 0.915222 0.647491 -0.429077 0.919434 0.653076 -0.453735 0.923462 0.658508 -0.478546 0.927490 0.663971 -0.504059 0.931427 0.669373 -0.529968 0.935120 0.674591 -0.556305 0.938873 0.679779 -0.582825 0.942383 0.684845 -0.609528 0.945923 0.689850 -0.636139 0.949432 0.694855 -0.662415 0.952637 0.699554 -0.688446 0.955902 0.704376 -0.714020 0.959015 0.709015 -0.738983 0.962036 0.713470 -0.763458 0.964996 0.717926 -0.787323 0.967804 0.722290 -0.810394 0.970490 0.726410 -0.832886 0.973145 0.730499 -0.854492 0.975586 0.734467 -0.875305 0.978058 0.738373 -0.895294 0.980408 0.742157 -0.914215 0.982605 0.745758 -0.932190 0.984772 0.749298 -0.949127 0.986816 0.752747 -0.964874 0.988708 0.755951 -0.979492 0.990601 0.759094 -0.992828 0.992371 0.762146 -0.045624 0.043457 0.326599 -0.058563 0.044922 0.329620 -0.071960 0.046448 0.332886 -0.086151 0.048035 0.336121 -0.101532 0.049744 0.339600 -0.118164 0.051483 0.343140 -0.135864 0.053253 0.346710 -0.154724 0.055115 0.350494 -0.174530 0.057068 0.354370 -0.195068 0.059021 0.358246 -0.216492 0.061096 0.362335 -0.238647 0.063232 0.366425 -0.261261 0.065369 0.370575 -0.284485 0.067657 0.374939 -0.308044 0.069885 0.379272 -0.332092 0.072327 0.383728 -0.356506 0.074799 0.388306 -0.380829 0.077301 0.392853 -0.405426 0.079956 0.397583 -0.430054 0.082642 0.402344 -0.454498 0.085388 0.407135 -0.479279 0.088226 0.412048 -0.504822 0.091217 0.417023 -0.530853 0.094238 0.421936 -0.557556 0.097351 0.427032 -0.584595 0.100616 0.432159 -0.611725 0.103851 0.437195 -0.638977 0.107300 0.442413 -0.666077 0.110718 0.447601 -0.693024 0.114319 0.452942 -0.719513 0.118011 0.458282 -0.745514 0.121674 0.463623 -0.049133 0.056122 0.332825 -0.062286 0.057770 0.336029 -0.075989 0.059540 0.339478 -0.090576 0.061310 0.342987 -0.106445 0.063171 0.346619 -0.123535 0.065155 0.350403 -0.141724 0.067139 0.354187 -0.161011 0.069214 0.358154 -0.181244 0.071411 0.362213 -0.202179 0.073578 0.366211 -0.223999 0.075897 0.370514 -0.246490 0.078308 0.374817 -0.269379 0.080719 0.379120 -0.292938 0.083252 0.383667 -0.316772 0.085846 0.388062 -0.341064 0.088593 0.392731 -0.365570 0.091400 0.397491 -0.390137 0.094238 0.402130 -0.414825 0.097260 0.406982 -0.439545 0.100342 0.411896 -0.464081 0.103424 0.416748 -0.489227 0.106750 0.421783 -0.515167 0.110077 0.426941 -0.541473 0.113464 0.431885 -0.568451 0.117004 0.437073 -0.595551 0.120544 0.442200 -0.622894 0.124298 0.447449 -0.650269 0.128082 0.452789 -0.677277 0.131927 0.458038 -0.704102 0.135895 0.463470 -0.730530 0.139923 0.469025 -0.756348 0.143921 0.474487 -0.052948 0.069763 0.339386 -0.066254 0.071594 0.342865 -0.080322 0.073608 0.346527 -0.095337 0.075592 0.350220 -0.111725 0.077759 0.354095 -0.129333 0.079987 0.358063 -0.147980 0.082245 0.362030 -0.167664 0.084625 0.366119 -0.188324 0.087097 0.370392 -0.209686 0.089600 0.374573 -0.231842 0.092255 0.379028 -0.254547 0.094910 0.383423 -0.277893 0.097778 0.387939 -0.301727 0.100708 0.392639 -0.325806 0.103638 0.397217 -0.350311 0.106750 0.402008 -0.375000 0.109955 0.406860 -0.399689 0.113190 0.411713 -0.424500 0.116577 0.416626 -0.449219 0.120056 0.421661 -0.473999 0.123535 0.426666 -0.499573 0.127197 0.431763 -0.525818 0.130951 0.436951 -0.552429 0.134674 0.442078 -0.579590 0.138611 0.447327 -0.606842 0.142487 0.452515 -0.634277 0.146576 0.457886 -0.661652 0.150757 0.463348 -0.688599 0.154907 0.468750 -0.715332 0.159180 0.474304 -0.741577 0.163574 0.480042 -0.767212 0.167908 0.485565 -0.056854 0.084625 0.346344 -0.070526 0.086792 0.350159 -0.084991 0.089111 0.353973 -0.100494 0.091431 0.357819 -0.117371 0.093903 0.361908 -0.135498 0.096466 0.366028 -0.154602 0.098999 0.370178 -0.174774 0.101776 0.374481 -0.195831 0.104584 0.378876 -0.217560 0.107483 0.383301 -0.240082 0.110504 0.387878 -0.263123 0.113556 0.392395 -0.286774 0.116760 0.397095 -0.310822 0.120056 0.401917 -0.335083 0.123383 0.406586 -0.359772 0.126892 0.411560 -0.384674 0.130463 0.416534 -0.409424 0.134033 0.421448 -0.434326 0.137848 0.426514 -0.459198 0.141632 0.431610 -0.484222 0.145477 0.436707 -0.510162 0.149506 0.441925 -0.536560 0.153534 0.447083 -0.563599 0.157715 0.452393 -0.590942 0.161957 0.457733 -0.618317 0.166168 0.463104 -0.645782 0.170593 0.468597 -0.673126 0.175079 0.474213 -0.700012 0.179504 0.479736 -0.726562 0.184113 0.485413 -0.752686 0.188782 0.491241 -0.778107 0.193420 0.496948 -0.061127 0.101166 0.353790 -0.075104 0.103729 0.357727 -0.089996 0.106384 0.361816 -0.106049 0.109039 0.365814 -0.123444 0.111877 0.370087 -0.142090 0.114777 0.374420 -0.161652 0.117767 0.378693 -0.182220 0.120911 0.383179 -0.203674 0.124084 0.387726 -0.225769 0.127289 0.392273 -0.248657 0.130707 0.396973 -0.271942 0.134094 0.401672 -0.295898 0.137695 0.406464 -0.320190 0.141388 0.411438 -0.344727 0.145020 0.416290 -0.369568 0.148834 0.421295 -0.394531 0.152771 0.426422 -0.419434 0.156738 0.431396 -0.444397 0.160858 0.436554 -0.469330 0.165009 0.441803 -0.494781 0.169128 0.446930 -0.521027 0.173492 0.452209 -0.547760 0.177795 0.457489 -0.574982 0.182312 0.462952 -0.602478 0.186890 0.468445 -0.629913 0.191406 0.473938 -0.657440 0.196106 0.479553 -0.684662 0.200867 0.485291 -0.711395 0.205566 0.490936 -0.737854 0.210480 0.496796 -0.763763 0.215393 0.502716 -0.789001 0.220245 0.508484 -0.065674 0.119629 0.361572 -0.079956 0.122559 0.365723 -0.095337 0.125549 0.369934 -0.111938 0.128571 0.374176 -0.129883 0.131744 0.378571 -0.148926 0.134979 0.383057 -0.169006 0.138306 0.387482 -0.190033 0.141754 0.392151 -0.211792 0.145264 0.396759 -0.234344 0.148865 0.401550 -0.257538 0.152649 0.406372 -0.281158 0.156403 0.411194 -0.305328 0.160309 0.416168 -0.329895 0.164337 0.421173 -0.354614 0.168304 0.426147 -0.379578 0.172485 0.431244 -0.404633 0.176727 0.436432 -0.429565 0.180969 0.441528 -0.454559 0.185394 0.446777 -0.479675 0.189819 0.451996 -0.505615 0.194366 0.457306 -0.532196 0.198975 0.462799 -0.559143 0.203583 0.468170 -0.586548 0.208374 0.473785 -0.614136 0.213196 0.479401 -0.641632 0.217957 0.485016 -0.669098 0.222900 0.490814 -0.696228 0.227936 0.496643 -0.722839 0.232880 0.502380 -0.749084 0.237976 0.508331 -0.774658 0.243042 0.514191 -0.799744 0.248199 0.520264 -0.070404 0.139862 0.369720 -0.085144 0.143097 0.374084 -0.101074 0.146454 0.378448 -0.118195 0.149811 0.382843 -0.136749 0.153320 0.387390 -0.156250 0.156952 0.392029 -0.176727 0.160583 0.396667 -0.198151 0.164368 0.401428 -0.220276 0.168182 0.406097 -0.243225 0.172180 0.411041 -0.266724 0.176239 0.416046 -0.290588 0.180298 0.420929 -0.315063 0.184540 0.425995 -0.339783 0.188873 0.431122 -0.364655 0.193146 0.436188 -0.389801 0.197632 0.441376 -0.414917 0.202179 0.446686 -0.439911 0.206665 0.451843 -0.464905 0.211395 0.457184 -0.490448 0.216034 0.462524 -0.516724 0.220886 0.468018 -0.543579 0.225769 0.473633 -0.570709 0.230621 0.479187 -0.598297 0.235626 0.484863 -0.625977 0.240723 0.490692 -0.653442 0.245697 0.496338 -0.680817 0.250916 0.502289 -0.707794 0.256104 0.508240 -0.734283 0.261230 0.514038 -0.760315 0.266541 0.520081 -0.785645 0.271759 0.526031 -0.810425 0.277130 0.532074 -0.075500 0.161743 0.378265 -0.090698 0.165314 0.382721 -0.107178 0.169006 0.387268 -0.124878 0.172668 0.391785 -0.143829 0.176514 0.396515 -0.163818 0.180359 0.401184 -0.184784 0.184387 0.405975 -0.206665 0.188538 0.410950 -0.229156 0.192627 0.415771 -0.252411 0.196869 0.420837 -0.276215 0.201294 0.425903 -0.300293 0.205597 0.430847 -0.324982 0.210175 0.436035 -0.349945 0.214752 0.441284 -0.374939 0.219330 0.446381 -0.400177 0.224091 0.451691 -0.425201 0.228790 0.456940 -0.450348 0.233673 0.462372 -0.475586 0.238647 0.467896 -0.501434 0.243500 0.473358 -0.528015 0.248566 0.479004 -0.555176 0.253723 0.484711 -0.582520 0.258789 0.490356 -0.610168 0.264008 0.496216 -0.637878 0.269257 0.502136 -0.665283 0.274414 0.507965 -0.692535 0.279816 0.513885 -0.719238 0.285065 0.519806 -0.745605 0.290497 0.525879 -0.771393 0.295959 0.531952 -0.796478 0.301300 0.537933 -0.821014 0.306854 0.544128 -0.080872 0.185150 0.387054 -0.096558 0.189056 0.391693 -0.113647 0.193024 0.396393 -0.131927 0.196991 0.401062 -0.151398 0.201172 0.405853 -0.171783 0.205292 0.410706 -0.193207 0.209625 0.415680 -0.215485 0.214050 0.420685 -0.238312 0.218445 0.425629 -0.261902 0.222961 0.430756 -0.285950 0.227631 0.435944 -0.310303 0.232239 0.441010 -0.335175 0.237061 0.446259 -0.360260 0.241913 0.451569 -0.385437 0.246704 0.456787 -0.410706 0.251709 0.462250 -0.435791 0.256622 0.467621 -0.460907 0.261749 0.473236 -0.486542 0.266937 0.478882 -0.512634 0.272003 0.484436 -0.539551 0.277283 0.490234 -0.566864 0.282593 0.496033 -0.594360 0.287811 0.501831 -0.622131 0.293213 0.507751 -0.649841 0.298676 0.513702 -0.677124 0.304016 0.519684 -0.704224 0.309509 0.525696 -0.730743 0.314911 0.531677 -0.756897 0.320465 0.537781 -0.782471 0.326019 0.543945 -0.807251 0.331482 0.550018 -0.831451 0.337067 0.556183 -0.086548 0.209961 0.396149 -0.102844 0.214081 0.400909 -0.120392 0.218292 0.405640 -0.139282 0.222656 0.410553 -0.159241 0.227112 0.415588 -0.180145 0.231537 0.420410 -0.201965 0.236115 0.425476 -0.224579 0.240814 0.430603 -0.247711 0.245422 0.435669 -0.271606 0.250275 0.440887 -0.295929 0.255157 0.446136 -0.320557 0.259979 0.451324 -0.345612 0.265015 0.456665 -0.370667 0.269989 0.461975 -0.395966 0.275116 0.467468 -0.421326 0.280334 0.473083 -0.446472 0.285431 0.478546 -0.471710 0.290741 0.484314 -0.497650 0.296112 0.490082 -0.524078 0.301361 0.495758 -0.551239 0.306824 0.501678 -0.578766 0.312256 0.507629 -0.606354 0.317657 0.513458 -0.634155 0.323212 0.519501 -0.661743 0.328735 0.525574 -0.688965 0.334229 0.531494 -0.715881 0.339844 0.537628 -0.742157 0.345276 0.543671 -0.768097 0.350891 0.549805 -0.793335 0.356567 0.556030 -0.817871 0.362091 0.562103 -0.841736 0.367737 0.568268 -0.092621 0.235992 0.405518 -0.109497 0.240448 0.410431 -0.127594 0.244904 0.415283 -0.147003 0.249542 0.420288 -0.167480 0.254211 0.425354 -0.188782 0.258911 0.430359 -0.210999 0.263702 0.435516 -0.233978 0.268646 0.440765 -0.257446 0.273499 0.445862 -0.281555 0.278534 0.451172 -0.306152 0.283661 0.456512 -0.330963 0.288696 0.461823 -0.356171 0.293945 0.467377 -0.381317 0.299072 0.472809 -0.406738 0.304382 0.478455 -0.432098 0.309784 0.484192 -0.457184 0.315033 0.489777 -0.482727 0.320526 0.495636 -0.509064 0.326019 0.501526 -0.535736 0.331390 0.507324 -0.563141 0.336975 0.513336 -0.590759 0.342560 0.519348 -0.618378 0.348022 0.525269 -0.646179 0.353668 0.531342 -0.673492 0.359192 0.537323 -0.700684 0.364838 0.543488 -0.727417 0.370483 0.549683 -0.753510 0.376038 0.555695 -0.779144 0.381744 0.561951 -0.804169 0.387390 0.568146 -0.828278 0.392914 0.574249 -0.851776 0.398590 0.580444 -0.099030 0.263184 0.415131 -0.116516 0.267883 0.420166 -0.135162 0.272552 0.425110 -0.155090 0.277405 0.430206 -0.175995 0.282318 0.435394 -0.197723 0.287231 0.440491 -0.220306 0.292297 0.445740 -0.243622 0.297394 0.451019 -0.267395 0.302460 0.456238 -0.291809 0.307709 0.461731 -0.316406 0.312836 0.467041 -0.341553 0.318176 0.472626 -0.366852 0.323578 0.478271 -0.392120 0.328857 0.483887 -0.417572 0.334381 0.489685 -0.442932 0.339905 0.495453 -0.468048 0.345276 0.501251 -0.494019 0.350830 0.507172 -0.520599 0.356476 0.513153 -0.547607 0.361938 0.519073 -0.575104 0.367584 0.525116 -0.602844 0.373291 0.531189 -0.630493 0.378784 0.537170 -0.658173 0.384491 0.543365 -0.685425 0.390015 0.549347 -0.712372 0.395691 0.555573 -0.738922 0.401428 0.561768 -0.764740 0.406921 0.567810 -0.790100 0.412598 0.574097 -0.814789 0.418274 0.580292 -0.838531 0.423767 0.586334 -0.861633 0.429382 0.592529 -0.105774 0.291321 0.424988 -0.123871 0.296234 0.430084 -0.143066 0.301117 0.435150 -0.163422 0.306183 0.440399 -0.184784 0.311310 0.445648 -0.206909 0.316376 0.450775 -0.229919 0.321625 0.456116 -0.253510 0.326935 0.461578 -0.277527 0.332123 0.466888 -0.302185 0.337555 0.472504 -0.327026 0.342834 0.477997 -0.352295 0.348297 0.483734 -0.377716 0.353851 0.489532 -0.403015 0.359253 0.495178 -0.428467 0.364807 0.501068 -0.453796 0.370453 0.507019 -0.479187 0.375916 0.512848 -0.505432 0.381561 0.518890 -0.532257 0.387238 0.524933 -0.559448 0.392792 0.530884 -0.587097 0.398438 0.536987 -0.614777 0.404022 0.543060 -0.642548 0.409698 0.549194 -0.670074 0.415405 0.555420 -0.697174 0.420929 0.561432 -0.723969 0.426666 0.567657 -0.750244 0.432281 0.573944 -0.775787 0.437836 0.579987 -0.800873 0.443481 0.586182 -0.825165 0.449280 0.592407 -0.848572 0.454834 0.598419 -0.871277 0.460632 0.604553 -0.112915 0.320282 0.434998 -0.131531 0.325409 0.440247 -0.151245 0.330444 0.445343 -0.172089 0.335693 0.450623 -0.193939 0.340973 0.455933 -0.216431 0.346222 0.461243 -0.239716 0.351593 0.466766 -0.263519 0.356842 0.472229 -0.287933 0.362366 0.477875 -0.312775 0.367859 0.483582 -0.337769 0.373322 0.489197 -0.363190 0.378845 0.495026 -0.388641 0.384491 0.500916 -0.413971 0.389954 0.506683 -0.439392 0.395569 0.512665 -0.464752 0.401276 0.518738 -0.490509 0.406830 0.524658 -0.517029 0.412445 0.530731 -0.544098 0.418152 0.536835 -0.571442 0.423706 0.542877 -0.599213 0.429382 0.549072 -0.626831 0.434937 0.555115 -0.654572 0.440674 0.561310 -0.681976 0.446411 0.567505 -0.708832 0.451996 0.573608 -0.735413 0.457886 0.579834 -0.761414 0.463715 0.586029 -0.786713 0.469482 0.592041 -0.811432 0.475342 0.598236 -0.835358 0.481262 0.604431 -0.858429 0.487000 0.610382 -0.880646 0.492920 0.616516 -0.120392 0.349915 0.445160 -0.139587 0.355164 0.450500 -0.159821 0.360382 0.455750 -0.181091 0.365753 0.461151 -0.203308 0.371185 0.466614 -0.226196 0.376526 0.472107 -0.249786 0.381989 0.477722 -0.273834 0.387390 0.483276 -0.298492 0.392914 0.489044 -0.323547 0.398560 0.494873 -0.348663 0.404022 0.500641 -0.374115 0.409637 0.506561 -0.399658 0.415283 0.512543 -0.425049 0.420837 0.518433 -0.450439 0.426514 0.524506 -0.475891 0.432159 0.530579 -0.501923 0.437714 0.536560 -0.528748 0.443420 0.542725 -0.555847 0.449097 0.548737 -0.583496 0.454926 0.554962 -0.611298 0.460754 0.561127 -0.638885 0.466553 0.567200 -0.666473 0.472504 0.573456 -0.693756 0.478455 0.579651 -0.720398 0.484314 0.585693 -0.746704 0.490295 0.591919 -0.772430 0.496307 0.598114 -0.797424 0.502228 0.604126 -0.821747 0.508240 0.610229 -0.845215 0.514160 0.616241 -0.867950 0.520172 0.622314 -0.889771 0.526215 0.628357 -0.128235 0.380035 0.455566 -0.147919 0.385376 0.460999 -0.168610 0.390686 0.466370 -0.190369 0.396179 0.471954 -0.212830 0.401581 0.477386 -0.236115 0.407074 0.483154 -0.260040 0.412628 0.488922 -0.284363 0.418091 0.494598 -0.309174 0.423706 0.500519 -0.334381 0.429321 0.506409 -0.359619 0.434845 0.512238 -0.385193 0.440491 0.518280 -0.410736 0.446259 0.524353 -0.436066 0.451904 0.530273 -0.461395 0.457794 0.536407 -0.487030 0.463501 0.542419 -0.513519 0.469482 0.548584 -0.540527 0.475403 0.554779 -0.567871 0.481293 0.560852 -0.595581 0.487305 0.567108 -0.623383 0.493408 0.573303 -0.650909 0.499329 0.579376 -0.678345 0.505463 0.585571 -0.705353 0.511627 0.591766 -0.731781 0.517578 0.597778 -0.757874 0.523743 0.603973 -0.783234 0.529816 0.610107 -0.807861 0.535858 0.616089 -0.831879 0.541962 0.622192 -0.854950 0.547882 0.628021 -0.877258 0.553986 0.634003 -0.898529 0.560028 0.639984 -0.136292 0.410431 0.466248 -0.156555 0.415924 0.471832 -0.177734 0.421234 0.477295 -0.199860 0.426788 0.483032 -0.222809 0.432312 0.488739 -0.246307 0.437836 0.494446 -0.270508 0.443451 0.500366 -0.294983 0.449066 0.506134 -0.320038 0.454803 0.512085 -0.345398 0.460663 0.518158 -0.370697 0.466400 0.524017 -0.396271 0.472412 0.530151 -0.421814 0.478363 0.536255 -0.447113 0.484222 0.542267 -0.472504 0.490295 0.548431 -0.498596 0.496399 0.554626 -0.525208 0.502380 0.560669 -0.552429 0.508575 0.566925 -0.579865 0.514587 0.572998 -0.607544 0.520782 0.579193 -0.635376 0.527039 0.585419 -0.662750 0.533081 0.591431 -0.689972 0.539307 0.597626 -0.716858 0.545563 0.603821 -0.742981 0.551575 0.609802 -0.768738 0.557800 0.615906 -0.793854 0.563965 0.621979 -0.818146 0.569977 0.627869 -0.841766 0.576080 0.633850 -0.864410 0.582031 0.639679 -0.886200 0.588135 0.645599 -0.907104 0.594147 0.651459 -0.144745 0.440948 0.477142 -0.165497 0.446564 0.482880 -0.187042 0.452087 0.488495 -0.209595 0.457855 0.494293 -0.232758 0.463501 0.500031 -0.256683 0.469421 0.505981 -0.281067 0.475311 0.511963 -0.305756 0.481171 0.517822 -0.330994 0.487183 0.523895 -0.356445 0.493256 0.529968 -0.381805 0.499207 0.535950 -0.407410 0.505432 0.542145 -0.432892 0.511627 0.548279 -0.458130 0.517639 0.554291 -0.483795 0.523926 0.560516 -0.509979 0.530029 0.566620 -0.536987 0.536285 0.572845 -0.564362 0.542572 0.579102 -0.591827 0.548706 0.585083 -0.619598 0.554993 0.591309 -0.647247 0.561310 0.597504 -0.674591 0.567413 0.603516 -0.701569 0.573669 0.609650 -0.728119 0.579956 0.615784 -0.753998 0.585999 0.621704 -0.779419 0.592224 0.627716 -0.804230 0.598358 0.633698 -0.828094 0.604340 0.639526 -0.851318 0.610413 0.645447 -0.873566 0.616302 0.651123 -0.894928 0.622284 0.656891 -0.915314 0.628204 0.662628 -0.153473 0.472595 0.488342 -0.174683 0.478455 0.494171 -0.196655 0.484222 0.499908 -0.219543 0.490265 0.505829 -0.243011 0.496124 0.511658 -0.267181 0.502258 0.517670 -0.291840 0.508453 0.523743 -0.316711 0.514465 0.529663 -0.342010 0.520660 0.535797 -0.367493 0.526917 0.541962 -0.392944 0.533081 0.547974 -0.418488 0.539368 0.554169 -0.443970 0.545715 0.560364 -0.469147 0.551880 0.566467 -0.495148 0.558289 0.572693 -0.521606 0.564423 0.578735 -0.548767 0.570770 0.584930 -0.576263 0.577148 0.591156 -0.603790 0.583344 0.597168 -0.631439 0.589600 0.603333 -0.659027 0.595917 0.609497 -0.686127 0.602051 0.615448 -0.712891 0.608307 0.621552 -0.739197 0.614502 0.627594 -0.764771 0.620514 0.633423 -0.789886 0.626617 0.639404 -0.814148 0.632538 0.645142 -0.837830 0.638611 0.651031 -0.860626 0.644562 0.656799 -0.882416 0.650269 0.662354 -0.903320 0.656128 0.668060 -0.923187 0.661865 0.673584 -0.162445 0.505432 0.499756 -0.183960 0.511414 0.505524 -0.206451 0.517517 0.511505 -0.229706 0.523743 0.517487 -0.253418 0.529816 0.523407 -0.277802 0.536133 0.529480 -0.302612 0.542419 0.535645 -0.327698 0.548615 0.541656 -0.353088 0.554962 0.547791 -0.378601 0.561371 0.554016 -0.404022 0.567596 0.560059 -0.429535 0.573975 0.566284 -0.454773 0.580231 0.572357 -0.480347 0.586639 0.578583 -0.506561 0.593018 0.584778 -0.533295 0.599243 0.590790 -0.560547 0.605560 0.597015 -0.588135 0.611908 0.603180 -0.615662 0.618073 0.609192 -0.643250 0.624329 0.615265 -0.670654 0.630585 0.621399 -0.697510 0.636597 0.627289 -0.724030 0.642761 0.633301 -0.750061 0.648865 0.639252 -0.775330 0.654755 0.645020 -0.800110 0.660736 0.650848 -0.823975 0.666534 0.656555 -0.847260 0.672363 0.662231 -0.869598 0.678131 0.667908 -0.890961 0.683716 0.673279 -0.911377 0.689301 0.678864 -0.930756 0.694855 0.684296 -0.171661 0.539276 0.511383 -0.193542 0.545410 0.517212 -0.216461 0.551697 0.523285 -0.239990 0.558105 0.529358 -0.263977 0.564270 0.535339 -0.288544 0.570648 0.541473 -0.313538 0.577118 0.547668 -0.338684 0.583374 0.553711 -0.364197 0.589813 0.559937 -0.389740 0.596222 0.566132 -0.415131 0.602509 0.572235 -0.440552 0.608887 0.578400 -0.465729 0.615112 0.584473 -0.491577 0.621552 0.590668 -0.518066 0.627869 0.596863 -0.544952 0.634064 0.602905 -0.572327 0.640320 0.609009 -0.599945 0.646576 0.615173 -0.627411 0.652618 0.621094 -0.654877 0.658783 0.627136 -0.682068 0.664886 0.633118 -0.708710 0.670807 0.638947 -0.734924 0.676788 0.644897 -0.760529 0.682556 0.650574 -0.785614 0.688385 0.656342 -0.809998 0.694214 0.662140 -0.833496 0.699738 0.667633 -0.856354 0.705353 0.673218 -0.878296 0.710938 0.678772 -0.899170 0.716309 0.684052 -0.919128 0.721619 0.689392 -0.937927 0.726990 0.694672 -0.181091 0.573792 0.523132 -0.203400 0.580078 0.529022 -0.226562 0.586487 0.535187 -0.250397 0.592896 0.541351 -0.274567 0.599213 0.547363 -0.299408 0.605652 0.553528 -0.324524 0.612091 0.559723 -0.349731 0.618347 0.565796 -0.375244 0.624756 0.572021 -0.400665 0.631042 0.578125 -0.426178 0.637360 0.584320 -0.451538 0.643768 0.590515 -0.476776 0.649933 0.596558 -0.502930 0.656219 0.602722 -0.529572 0.662445 0.608856 -0.556549 0.668518 0.614868 -0.584045 0.674652 0.620911 -0.611633 0.680756 0.626984 -0.638977 0.686646 0.632874 -0.666321 0.692627 0.638824 -0.693268 0.698547 0.644775 -0.719604 0.704224 0.650452 -0.745605 0.710052 0.656250 -0.770844 0.715607 0.661804 -0.795563 0.721222 0.667480 -0.819611 0.726776 0.673065 -0.842743 0.732117 0.678467 -0.865173 0.737518 0.683899 -0.886627 0.742828 0.689240 -0.906982 0.747925 0.694397 -0.926453 0.753082 0.699585 -0.944794 0.758057 0.704712 -0.190765 0.608704 0.535034 -0.213409 0.615021 0.541016 -0.236847 0.621490 0.547211 -0.260864 0.627930 0.553375 -0.285339 0.634216 0.559479 -0.310272 0.640625 0.565674 -0.335480 0.647034 0.571869 -0.360779 0.653229 0.577942 -0.386353 0.659576 0.584198 -0.411652 0.665710 0.590210 -0.437103 0.671997 0.596436 -0.462341 0.678253 0.602570 -0.487854 0.684265 0.608582 -0.514221 0.690399 0.614685 -0.541077 0.696442 0.620789 -0.568176 0.702301 0.626709 -0.595642 0.708282 0.632690 -0.623169 0.714233 0.638672 -0.650421 0.719910 0.644409 -0.677521 0.725647 0.650299 -0.704071 0.731232 0.655945 -0.730286 0.736816 0.661682 -0.755951 0.742401 0.667358 -0.780884 0.747711 0.672791 -0.805267 0.753113 0.678314 -0.828918 0.758392 0.683777 -0.851624 0.763519 0.688995 -0.873596 0.768646 0.694305 -0.894623 0.773651 0.699463 -0.914581 0.778473 0.704468 -0.933472 0.783325 0.709503 -0.951172 0.787994 0.714294 -0.200531 0.643738 0.547058 -0.223541 0.649963 0.553070 -0.247223 0.656403 0.559296 -0.271515 0.662750 0.565521 -0.296082 0.668915 0.571564 -0.321167 0.675232 0.577789 -0.346405 0.681366 0.583862 -0.371826 0.687622 0.590057 -0.397308 0.693787 0.596252 -0.422638 0.699799 0.602264 -0.447937 0.705933 0.608429 -0.473236 0.711975 0.614532 -0.498993 0.717804 0.620514 -0.525513 0.723785 0.626556 -0.552521 0.729645 0.632568 -0.579681 0.735321 0.638397 -0.607178 0.741089 0.644287 -0.634552 0.746765 0.650146 -0.661652 0.752197 0.655823 -0.688507 0.757751 0.661560 -0.714752 0.763031 0.667084 -0.740723 0.768463 0.672668 -0.766022 0.773743 0.678223 -0.790588 0.778778 0.683502 -0.814606 0.783936 0.688843 -0.837860 0.788971 0.694183 -0.860199 0.793793 0.699188 -0.881683 0.798615 0.704376 -0.902252 0.803406 0.709351 -0.921692 0.807953 0.714203 -0.940155 0.812469 0.719025 -0.957275 0.816833 0.723572 -0.210541 0.678375 0.559143 -0.233765 0.684479 0.565216 -0.257751 0.690765 0.571411 -0.282196 0.696991 0.577667 -0.306885 0.703064 0.583710 -0.332092 0.709259 0.589905 -0.357330 0.715210 0.595917 -0.382751 0.721283 0.602112 -0.408234 0.727295 0.608246 -0.433472 0.733124 0.614288 -0.458649 0.739044 0.620331 -0.484131 0.744843 0.626434 -0.510071 0.750549 0.632263 -0.536774 0.756256 0.638214 -0.563873 0.761902 0.644104 -0.591034 0.767303 0.649841 -0.618439 0.772858 0.655701 -0.645569 0.778137 0.661255 -0.672546 0.783478 0.666901 -0.699219 0.788788 0.672546 -0.725220 0.793854 0.677948 -0.750763 0.798920 0.683350 -0.775818 0.803955 0.688721 -0.800049 0.808777 0.693939 -0.823639 0.813599 0.699097 -0.846466 0.818298 0.704224 -0.868347 0.822815 0.709106 -0.889465 0.827393 0.714050 -0.909424 0.831726 0.718750 -0.928497 0.836029 0.723480 -0.946411 0.840302 0.728119 -0.963043 0.844360 0.732574 -0.220551 0.712372 0.571289 -0.244080 0.718323 0.577332 -0.268250 0.724518 0.583496 -0.292877 0.730530 0.589722 -0.317719 0.736481 0.595734 -0.342987 0.742462 0.601929 -0.368195 0.748199 0.607971 -0.393646 0.754089 0.614105 -0.419006 0.759888 0.620239 -0.444153 0.765503 0.626099 -0.469269 0.771179 0.632141 -0.494934 0.776825 0.638092 -0.521118 0.782196 0.643829 -0.547974 0.787659 0.649689 -0.574951 0.792969 0.655334 -0.602203 0.798279 0.661102 -0.629486 0.803528 0.666748 -0.656494 0.808533 0.672241 -0.683289 0.813629 0.677795 -0.709625 0.818604 0.683258 -0.735321 0.823334 0.688446 -0.760590 0.828217 0.693756 -0.785248 0.832886 0.698944 -0.809082 0.837402 0.703949 -0.832336 0.841949 0.709015 -0.854797 0.846375 0.713928 -0.876251 0.850586 0.718597 -0.896851 0.854828 0.723389 -0.916382 0.858795 0.727875 -0.934906 0.862823 0.732452 -0.952332 0.866730 0.736877 -0.968445 0.870422 0.741089 -0.230713 0.745605 0.583374 -0.254456 0.751434 0.589417 -0.278809 0.757324 0.595612 -0.303406 0.763062 0.601685 -0.328522 0.768890 0.607849 -0.353821 0.774658 0.613983 -0.379028 0.780212 0.619873 -0.404358 0.785858 0.625916 -0.429657 0.791443 0.631958 -0.454651 0.796844 0.637787 -0.479919 0.802277 0.643707 -0.505829 0.807617 0.649567 -0.532166 0.812775 0.655212 -0.559021 0.817963 0.660950 -0.586029 0.822968 0.666534 -0.613220 0.828003 0.672119 -0.640381 0.832947 0.677643 -0.667145 0.837677 0.682953 -0.693665 0.842438 0.688293 -0.719727 0.847168 0.693634 -0.745117 0.851624 0.698700 -0.770050 0.856079 0.703827 -0.794342 0.860504 0.708862 -0.817841 0.864716 0.713654 -0.840668 0.868866 0.718506 -0.862579 0.872864 0.723145 -0.883698 0.876892 0.727783 -0.903839 0.880768 0.732330 -0.922913 0.884491 0.736664 -0.940979 0.888153 0.740997 -0.957886 0.891693 0.745239 -0.973511 0.895111 0.749207 -0.240967 0.777893 0.595459 -0.264862 0.783478 0.601501 -0.289368 0.789246 0.607666 -0.314117 0.794708 0.613617 -0.339203 0.800354 0.619751 -0.364532 0.805847 0.625763 -0.389709 0.811157 0.631622 -0.415009 0.816498 0.637634 -0.440155 0.821808 0.643524 -0.465027 0.826935 0.649292 -0.490540 0.832123 0.655090 -0.516602 0.837158 0.660797 -0.543030 0.842041 0.666382 -0.569946 0.846893 0.671967 -0.596893 0.851624 0.677368 -0.624023 0.856384 0.682800 -0.651001 0.861023 0.688202 -0.677521 0.865417 0.693390 -0.703766 0.869904 0.698578 -0.729492 0.874237 0.703674 -0.754578 0.878387 0.708588 -0.779144 0.882538 0.713531 -0.803101 0.886566 0.718384 -0.826202 0.890503 0.723022 -0.848602 0.894318 0.727631 -0.870117 0.897980 0.732117 -0.890778 0.901611 0.736572 -0.910461 0.905151 0.740875 -0.929077 0.908539 0.745026 -0.946655 0.911865 0.749115 -0.963043 0.915070 0.753143 -0.978149 0.918121 0.756958 -0.251068 0.808990 0.607361 -0.275269 0.814514 0.613464 -0.299896 0.819946 0.619598 -0.324738 0.825165 0.625488 -0.349884 0.830536 0.631531 -0.375153 0.835754 0.637482 -0.400299 0.840851 0.643250 -0.425446 0.845886 0.649109 -0.450500 0.850922 0.654938 -0.475372 0.855743 0.660522 -0.501038 0.860565 0.666260 -0.527130 0.865204 0.671692 -0.553772 0.869904 0.677216 -0.580658 0.874512 0.682709 -0.607513 0.878845 0.687927 -0.634521 0.883270 0.693237 -0.661316 0.887543 0.698456 -0.687561 0.891663 0.703430 -0.713501 0.895782 0.708466 -0.738922 0.899780 0.713409 -0.763702 0.903595 0.718140 -0.787903 0.907410 0.722900 -0.811371 0.911011 0.727448 -0.834198 0.914642 0.731964 -0.856201 0.918121 0.736450 -0.877258 0.921478 0.740692 -0.897461 0.924744 0.744904 -0.916718 0.927948 0.749023 -0.934845 0.930939 0.752930 -0.951935 0.933929 0.756897 -0.967865 0.936829 0.760620 -0.982452 0.939514 0.764252 -0.261322 0.838959 0.619263 -0.285645 0.844208 0.625366 -0.310394 0.849365 0.631348 -0.335266 0.854340 0.637207 -0.360413 0.859375 0.643127 -0.385651 0.864349 0.648956 -0.410675 0.869080 0.654663 -0.435730 0.873901 0.660400 -0.460602 0.878571 0.666077 -0.485657 0.883057 0.671539 -0.511505 0.887543 0.677094 -0.537628 0.891876 0.682434 -0.564331 0.896240 0.687775 -0.591156 0.900482 0.693115 -0.618011 0.904541 0.698151 -0.644775 0.908569 0.703339 -0.671326 0.912476 0.708344 -0.697235 0.916290 0.713196 -0.722900 0.920044 0.718018 -0.748016 0.923676 0.722778 -0.772430 0.927124 0.727325 -0.796234 0.930573 0.731873 -0.819397 0.933868 0.736206 -0.841797 0.937103 0.740570 -0.863342 0.940247 0.744781 -0.884003 0.943237 0.748810 -0.903778 0.946167 0.752869 -0.922607 0.948975 0.756775 -0.940277 0.951660 0.760468 -0.956879 0.954285 0.764130 -0.972321 0.956787 0.767731 -0.986481 0.959167 0.771027 -0.271545 0.867584 0.631042 -0.295990 0.872528 0.637024 -0.320801 0.877380 0.642975 -0.345734 0.882080 0.648682 -0.370850 0.886810 0.654480 -0.395935 0.891418 0.660248 -0.420898 0.895782 0.665802 -0.445770 0.900269 0.671387 -0.470459 0.904541 0.676819 -0.495850 0.908783 0.682281 -0.521729 0.912964 0.687653 -0.548004 0.916901 0.692810 -0.574646 0.920868 0.698029 -0.601440 0.924744 0.703156 -0.628052 0.928436 0.708130 -0.654633 0.932129 0.713074 -0.680939 0.935760 0.717926 -0.706635 0.939087 0.722565 -0.731903 0.942474 0.727203 -0.756622 0.945679 0.731628 -0.780762 0.948914 0.736115 -0.804291 0.951965 0.740479 -0.826935 0.954865 0.744568 -0.848999 0.957794 0.748718 -0.870178 0.960510 0.752808 -0.890381 0.963135 0.756592 -0.909760 0.965729 0.760376 -0.928040 0.968201 0.764038 -0.945312 0.970551 0.767548 -0.961487 0.972809 0.770935 -0.976379 0.974945 0.774200 -0.990082 0.977020 0.777374 -0.281708 0.894684 0.642670 -0.306274 0.899353 0.648529 -0.331116 0.903839 0.654358 -0.355988 0.908203 0.659973 -0.381012 0.912537 0.665649 -0.406036 0.916809 0.671295 -0.430908 0.920868 0.676636 -0.455597 0.924957 0.682098 -0.480377 0.928894 0.687378 -0.505920 0.932770 0.692657 -0.531921 0.936584 0.697906 -0.558167 0.940155 0.702942 -0.584747 0.943787 0.707947 -0.611420 0.947266 0.712921 -0.637878 0.950623 0.717651 -0.664215 0.953918 0.722443 -0.690216 0.957123 0.727081 -0.715576 0.960114 0.731537 -0.740601 0.963135 0.735992 -0.764893 0.965973 0.740234 -0.788727 0.968781 0.744476 -0.811798 0.971436 0.748596 -0.834167 0.974030 0.752563 -0.855743 0.976532 0.756500 -0.876495 0.978912 0.760284 -0.896332 0.981171 0.763855 -0.915192 0.983429 0.767456 -0.933136 0.985535 0.770874 -0.949890 0.987488 0.774139 -0.965637 0.989410 0.777313 -0.980103 0.991241 0.780304 -0.993408 0.992981 0.783264 -0.046234 0.043976 0.347351 -0.059296 0.045471 0.350494 -0.072693 0.047028 0.353729 -0.086975 0.048676 0.357117 -0.102417 0.050385 0.360626 -0.119080 0.052124 0.364197 -0.136963 0.053955 0.367920 -0.155914 0.055817 0.371735 -0.175690 0.057739 0.375549 -0.196411 0.059784 0.379547 -0.217804 0.061829 0.383606 -0.240021 0.063995 0.387756 -0.262787 0.066223 0.392059 -0.285980 0.068451 0.396332 -0.309723 0.070801 0.400818 -0.333801 0.073242 0.405273 -0.358093 0.075684 0.409821 -0.382599 0.078278 0.414490 -0.407227 0.080933 0.419189 -0.431763 0.083618 0.423920 -0.456299 0.086456 0.428802 -0.481110 0.089355 0.433685 -0.506592 0.092285 0.438568 -0.532867 0.095367 0.443604 -0.559448 0.098480 0.448578 -0.586548 0.101776 0.453644 -0.613861 0.105103 0.458923 -0.641022 0.108521 0.464142 -0.668213 0.112030 0.469543 -0.695099 0.115692 0.474945 -0.721497 0.119293 0.480408 -0.747559 0.123108 0.486023 -0.049805 0.056702 0.353638 -0.063019 0.058411 0.357056 -0.076752 0.060150 0.360474 -0.091492 0.062012 0.364075 -0.107422 0.063934 0.367798 -0.124573 0.065857 0.371521 -0.142914 0.067902 0.375458 -0.162262 0.070007 0.379486 -0.182465 0.072144 0.383484 -0.203613 0.074463 0.387665 -0.225403 0.076721 0.391815 -0.247925 0.079163 0.396210 -0.271027 0.081665 0.400665 -0.294495 0.084198 0.405029 -0.318512 0.086853 0.409668 -0.342804 0.089630 0.414337 -0.367249 0.092438 0.418945 -0.391968 0.095337 0.423767 -0.416718 0.098389 0.428680 -0.441254 0.101440 0.433441 -0.465942 0.104645 0.438416 -0.491028 0.107880 0.443298 -0.517029 0.111267 0.448425 -0.543579 0.114746 0.453552 -0.570435 0.118286 0.458679 -0.597717 0.121918 0.464020 -0.625092 0.125702 0.469391 -0.652344 0.129425 0.474701 -0.679443 0.133362 0.480225 -0.706268 0.137360 0.485870 -0.732513 0.141388 0.491455 -0.758423 0.145508 0.497162 -0.053619 0.070435 0.360382 -0.067078 0.072388 0.364014 -0.081116 0.074341 0.367645 -0.096313 0.076447 0.371429 -0.112793 0.078583 0.375336 -0.130402 0.080780 0.379272 -0.149200 0.083130 0.383392 -0.168945 0.085480 0.387421 -0.189667 0.087952 0.391724 -0.211182 0.090576 0.396088 -0.233337 0.093201 0.400452 -0.256165 0.095978 0.404907 -0.279572 0.098846 0.409576 -0.303314 0.101715 0.414093 -0.327606 0.104767 0.418823 -0.352112 0.107941 0.423645 -0.376709 0.111084 0.428406 -0.401581 0.114441 0.433350 -0.426422 0.117859 0.438354 -0.451019 0.121277 0.443207 -0.475922 0.124878 0.448303 -0.501434 0.128479 0.453339 -0.527740 0.132263 0.458557 -0.554565 0.136169 0.463898 -0.581635 0.140015 0.469116 -0.609039 0.144012 0.474579 -0.636536 0.148102 0.480103 -0.663696 0.152252 0.485565 -0.690765 0.156494 0.491302 -0.717468 0.160858 0.497009 -0.743622 0.165131 0.502716 -0.769348 0.169617 0.508545 -0.057648 0.085419 0.367523 -0.071381 0.087677 0.371307 -0.085846 0.089905 0.375153 -0.101532 0.092346 0.379150 -0.118530 0.094849 0.383301 -0.136658 0.097351 0.387329 -0.155945 0.100067 0.391602 -0.176086 0.102753 0.395874 -0.197205 0.105652 0.400330 -0.219116 0.108612 0.404846 -0.241608 0.111603 0.409332 -0.264771 0.114746 0.414001 -0.288483 0.117981 0.418701 -0.312469 0.121277 0.423431 -0.336945 0.124664 0.428314 -0.361664 0.128235 0.433197 -0.386444 0.131744 0.438080 -0.411346 0.135437 0.443054 -0.436157 0.139130 0.448029 -0.460938 0.143036 0.453217 -0.486206 0.147003 0.458405 -0.512115 0.150940 0.463623 -0.538696 0.155060 0.468933 -0.565765 0.159271 0.474457 -0.592987 0.163483 0.479858 -0.620544 0.167786 0.485443 -0.648041 0.172241 0.491119 -0.675201 0.176636 0.496735 -0.702179 0.181213 0.502533 -0.728577 0.185760 0.508270 -0.754700 0.190460 0.514191 -0.780243 0.195190 0.520203 -0.061981 0.102142 0.375061 -0.075989 0.104706 0.379059 -0.090912 0.107330 0.383057 -0.107178 0.110107 0.387207 -0.124573 0.112885 0.391357 -0.143280 0.115845 0.395782 -0.162994 0.118896 0.400238 -0.183594 0.121979 0.404602 -0.205139 0.125244 0.409180 -0.227417 0.128571 0.413910 -0.250244 0.131927 0.418488 -0.273743 0.135406 0.423340 -0.297668 0.139038 0.428162 -0.321930 0.142639 0.432953 -0.346619 0.146454 0.437927 -0.371338 0.150238 0.442841 -0.396362 0.154175 0.447906 -0.421387 0.158264 0.453064 -0.446198 0.162292 0.458130 -0.471161 0.166473 0.463470 -0.496857 0.170807 0.468811 -0.523071 0.175049 0.474152 -0.549927 0.179504 0.479706 -0.577179 0.184021 0.485291 -0.604553 0.188507 0.490845 -0.632172 0.193146 0.496582 -0.659698 0.197876 0.502380 -0.686737 0.202545 0.508118 -0.713593 0.207428 0.514038 -0.739807 0.212158 0.519897 -0.765778 0.217163 0.525940 -0.791016 0.222137 0.531952 -0.066559 0.120728 0.382935 -0.080933 0.123657 0.387115 -0.096344 0.126587 0.391296 -0.113159 0.129761 0.395660 -0.131104 0.132874 0.400024 -0.150269 0.136200 0.404480 -0.170471 0.139587 0.409088 -0.191467 0.143036 0.413666 -0.213409 0.146637 0.418365 -0.236023 0.150330 0.423187 -0.259125 0.153992 0.427887 -0.282959 0.157867 0.432800 -0.307190 0.161804 0.437805 -0.331635 0.165771 0.442719 -0.356506 0.169861 0.447784 -0.381409 0.173981 0.452820 -0.406494 0.178284 0.458038 -0.431580 0.182648 0.463348 -0.456390 0.186951 0.468567 -0.481720 0.191467 0.474091 -0.507721 0.196106 0.479553 -0.534271 0.200623 0.485046 -0.561340 0.205383 0.490723 -0.588806 0.210144 0.496429 -0.616272 0.214905 0.502136 -0.643951 0.219818 0.507996 -0.671204 0.224670 0.513702 -0.698303 0.229706 0.519745 -0.725067 0.234772 0.525787 -0.751068 0.239777 0.531647 -0.776794 0.244965 0.537689 -0.801819 0.250214 0.543884 -0.071381 0.141083 0.391205 -0.086121 0.144257 0.395416 -0.102142 0.147644 0.399933 -0.119507 0.151123 0.404358 -0.137970 0.154602 0.408875 -0.157623 0.158264 0.413513 -0.178284 0.161987 0.418213 -0.199646 0.165741 0.422943 -0.221985 0.169678 0.427826 -0.244965 0.173676 0.432709 -0.268402 0.177704 0.437561 -0.292450 0.181885 0.442596 -0.316803 0.186066 0.447540 -0.341614 0.190399 0.452667 -0.366608 0.194794 0.457886 -0.391602 0.199188 0.463104 -0.416809 0.203796 0.468414 -0.441925 0.208435 0.473907 -0.466858 0.213074 0.479279 -0.492523 0.217804 0.484863 -0.518860 0.222717 0.490601 -0.545624 0.227509 0.496124 -0.572998 0.232513 0.502014 -0.600586 0.237518 0.507843 -0.628113 0.242523 0.513580 -0.655731 0.247650 0.519592 -0.682922 0.252716 0.525452 -0.709900 0.257965 0.531494 -0.736450 0.263214 0.537567 -0.762299 0.268433 0.543610 -0.787689 0.273773 0.549744 -0.812500 0.279175 0.555939 -0.076538 0.163055 0.399780 -0.091736 0.166595 0.404114 -0.108337 0.170319 0.408752 -0.126221 0.174072 0.413391 -0.145172 0.177887 0.417969 -0.165314 0.181854 0.422852 -0.186401 0.185944 0.427673 -0.208221 0.189972 0.432434 -0.230896 0.194244 0.437439 -0.254211 0.198578 0.442444 -0.277924 0.202850 0.447418 -0.302246 0.207336 0.452576 -0.326782 0.211761 0.457581 -0.351746 0.216400 0.462921 -0.376892 0.221100 0.468262 -0.402039 0.225769 0.473602 -0.427246 0.230591 0.479187 -0.452362 0.235535 0.484711 -0.477539 0.240387 0.490295 -0.503540 0.245392 0.496002 -0.530243 0.250488 0.501862 -0.557281 0.255493 0.507507 -0.584778 0.260712 0.513458 -0.612274 0.265839 0.519287 -0.640015 0.271118 0.525299 -0.667542 0.276428 0.531311 -0.694641 0.281708 0.537292 -0.721466 0.287109 0.543427 -0.747772 0.292542 0.549591 -0.773407 0.297852 0.555603 -0.798553 0.303375 0.561859 -0.823029 0.308868 0.568024 -0.081940 0.186584 0.408600 -0.097687 0.190430 0.413177 -0.114868 0.194458 0.417877 -0.133301 0.198578 0.422699 -0.152740 0.202637 0.427429 -0.173370 0.206909 0.432312 -0.194885 0.211243 0.437317 -0.217102 0.215576 0.442200 -0.240082 0.220154 0.447266 -0.263580 0.224609 0.452271 -0.287720 0.229309 0.457489 -0.312256 0.234039 0.462769 -0.337036 0.238739 0.467987 -0.362152 0.243652 0.473450 -0.387390 0.248596 0.479034 -0.412598 0.253479 0.484467 -0.437836 0.258545 0.490112 -0.462982 0.263672 0.495880 -0.488495 0.268738 0.501526 -0.514893 0.273956 0.507416 -0.541809 0.279297 0.513336 -0.569031 0.284454 0.519135 -0.596649 0.289856 0.525116 -0.624268 0.295135 0.531036 -0.651978 0.300568 0.537109 -0.679382 0.306061 0.543274 -0.706299 0.311432 0.549286 -0.732941 0.316956 0.555450 -0.759064 0.322571 0.561707 -0.784454 0.328003 0.567719 -0.809296 0.333618 0.574005 -0.833405 0.339203 0.580261 -0.087677 0.211487 0.417786 -0.104004 0.215607 0.422424 -0.121735 0.219940 0.427307 -0.140747 0.224304 0.432220 -0.160706 0.228699 0.437073 -0.181763 0.233215 0.442078 -0.203674 0.237854 0.447174 -0.226227 0.242462 0.452148 -0.249573 0.247223 0.457336 -0.273376 0.251984 0.462555 -0.297729 0.256897 0.467896 -0.322510 0.261871 0.473328 -0.347473 0.266785 0.478699 -0.372742 0.271912 0.484344 -0.398071 0.277039 0.489990 -0.423279 0.282166 0.495575 -0.448517 0.287445 0.501404 -0.473816 0.292755 0.507233 -0.499725 0.297974 0.513000 -0.526367 0.303406 0.519012 -0.553375 0.308716 0.524841 -0.580933 0.314209 0.530884 -0.608643 0.319733 0.536957 -0.636292 0.325134 0.542999 -0.663940 0.330719 0.549133 -0.691223 0.336304 0.555328 -0.717957 0.341766 0.561340 -0.744354 0.347382 0.567596 -0.770233 0.353058 0.573883 -0.795319 0.358521 0.579956 -0.819885 0.364227 0.586212 -0.843536 0.369690 0.592285 -0.093811 0.237671 0.427155 -0.110718 0.242065 0.431976 -0.129028 0.246613 0.436951 -0.148529 0.251282 0.441986 -0.168976 0.255859 0.446899 -0.190430 0.260712 0.452026 -0.212769 0.265533 0.457214 -0.235718 0.270386 0.462402 -0.259308 0.275360 0.467743 -0.283386 0.280334 0.473083 -0.307983 0.285431 0.478546 -0.332977 0.290649 0.484192 -0.358063 0.295776 0.489716 -0.383392 0.301056 0.495422 -0.408783 0.306396 0.501251 -0.434021 0.311646 0.506958 -0.459290 0.317108 0.512848 -0.484924 0.322601 0.518860 -0.511108 0.327972 0.524719 -0.538025 0.333527 0.530731 -0.565277 0.338928 0.536713 -0.592896 0.344513 0.542816 -0.620697 0.350128 0.548950 -0.648285 0.355652 0.554993 -0.675812 0.361328 0.561188 -0.702972 0.366943 0.567413 -0.729492 0.372498 0.573517 -0.755707 0.378204 0.579803 -0.781311 0.383911 0.586060 -0.806091 0.389404 0.592163 -0.830292 0.395050 0.598389 -0.853577 0.400574 0.604462 -0.100281 0.264923 0.436798 -0.117828 0.269531 0.441742 -0.136658 0.274353 0.446777 -0.156647 0.279266 0.451935 -0.177521 0.284058 0.456970 -0.199402 0.289062 0.462250 -0.222015 0.294067 0.467468 -0.245392 0.299194 0.472961 -0.269287 0.304382 0.478455 -0.293640 0.309540 0.483917 -0.318481 0.314850 0.489594 -0.343628 0.320221 0.495270 -0.368805 0.325500 0.500977 -0.394226 0.330933 0.506805 -0.419647 0.336395 0.512665 -0.444824 0.341797 0.518524 -0.470215 0.347351 0.524536 -0.496063 0.352814 0.530426 -0.522675 0.358398 0.536530 -0.549866 0.364044 0.542664 -0.577209 0.369568 0.548645 -0.604980 0.375214 0.554840 -0.632751 0.380890 0.561035 -0.660309 0.386475 0.567139 -0.687683 0.392120 0.573395 -0.714600 0.397858 0.579651 -0.740967 0.403351 0.585754 -0.766876 0.409088 0.591980 -0.792023 0.414581 0.598083 -0.816681 0.420288 0.604340 -0.840515 0.425934 0.610535 -0.863403 0.431396 0.616608 -0.107117 0.293152 0.446686 -0.125244 0.297974 0.451660 -0.144623 0.303009 0.456818 -0.165100 0.308105 0.462128 -0.186432 0.313110 0.467377 -0.208740 0.318298 0.472809 -0.231628 0.323486 0.478180 -0.255341 0.328766 0.483795 -0.279541 0.334198 0.489471 -0.304077 0.339417 0.494995 -0.329102 0.344879 0.500793 -0.354370 0.350372 0.506622 -0.379669 0.355774 0.512390 -0.405121 0.361359 0.518372 -0.430573 0.366913 0.524384 -0.455780 0.372406 0.530273 -0.481323 0.378021 0.536377 -0.507477 0.383545 0.542328 -0.534424 0.389252 0.548492 -0.561768 0.394897 0.554718 -0.589325 0.400482 0.560730 -0.617096 0.406097 0.566986 -0.644867 0.411835 0.573242 -0.672241 0.417389 0.579346 -0.699432 0.423096 0.585571 -0.726196 0.428772 0.591827 -0.752228 0.434296 0.597931 -0.777924 0.439911 0.604156 -0.802765 0.445526 0.610199 -0.827026 0.451263 0.616455 -0.850494 0.457001 0.622589 -0.872986 0.462616 0.628601 -0.114319 0.322235 0.456696 -0.132965 0.327209 0.461853 -0.152893 0.332428 0.467224 -0.173676 0.337555 0.472504 -0.195587 0.342865 0.478058 -0.218262 0.348175 0.483643 -0.241516 0.353516 0.489136 -0.265472 0.358948 0.494843 -0.289978 0.364441 0.500671 -0.314667 0.369812 0.506348 -0.339905 0.375336 0.512268 -0.365265 0.380951 0.518219 -0.390625 0.386444 0.524048 -0.416138 0.392059 0.530090 -0.441376 0.397583 0.536072 -0.466766 0.403229 0.542206 -0.492676 0.408966 0.548340 -0.519104 0.414459 0.554382 -0.546234 0.420166 0.560547 -0.573761 0.425842 0.566833 -0.601318 0.431396 0.572906 -0.629150 0.437073 0.579193 -0.656860 0.442841 0.585419 -0.684143 0.448456 0.591522 -0.711121 0.454224 0.597778 -0.737488 0.459900 0.603851 -0.763397 0.465790 0.610077 -0.788788 0.471649 0.616272 -0.813293 0.477417 0.622314 -0.837189 0.483337 0.628479 -0.860229 0.489227 0.634552 -0.882324 0.495056 0.640503 -0.121887 0.351868 0.467072 -0.141083 0.357025 0.472412 -0.161499 0.362396 0.477905 -0.182739 0.367645 0.483337 -0.205017 0.373077 0.488983 -0.228027 0.378571 0.494690 -0.251648 0.383942 0.500397 -0.275818 0.389465 0.506195 -0.300537 0.395050 0.512115 -0.325470 0.400513 0.517944 -0.350769 0.406067 0.523926 -0.376251 0.411743 0.529968 -0.401642 0.417297 0.535919 -0.427155 0.422943 0.542053 -0.452362 0.428467 0.548004 -0.477875 0.434174 0.554230 -0.504120 0.439850 0.560425 -0.530853 0.445496 0.566528 -0.558228 0.451263 0.572784 -0.585785 0.457153 0.578979 -0.613434 0.462860 0.585083 -0.641205 0.468781 0.591339 -0.668823 0.474731 0.597595 -0.695862 0.480530 0.603699 -0.722626 0.486572 0.609924 -0.748749 0.492432 0.615997 -0.774445 0.498444 0.622192 -0.799408 0.504486 0.628326 -0.823608 0.510376 0.634277 -0.847107 0.516388 0.640320 -0.869751 0.522430 0.646423 -0.891327 0.528290 0.652252 -0.129639 0.381866 0.477600 -0.149445 0.387268 0.483215 -0.170319 0.392731 0.488861 -0.192047 0.398071 0.494415 -0.214722 0.403595 0.500214 -0.238068 0.409180 0.506104 -0.261932 0.414581 0.511810 -0.286407 0.420197 0.517792 -0.311279 0.425812 0.523773 -0.336334 0.431305 0.529633 -0.361786 0.436951 0.535767 -0.387146 0.442505 0.541718 -0.412720 0.448242 0.547882 -0.438202 0.454132 0.554077 -0.463409 0.459839 0.560089 -0.489197 0.465698 0.566376 -0.515717 0.471680 0.572632 -0.542694 0.477509 0.578705 -0.570160 0.483551 0.584930 -0.597900 0.489594 0.591187 -0.625519 0.495514 0.597290 -0.653198 0.501617 0.603546 -0.680573 0.507751 0.609741 -0.707428 0.513702 0.615814 -0.733978 0.519897 0.621979 -0.759796 0.525879 0.627991 -0.785156 0.531982 0.634155 -0.809875 0.538147 0.640228 -0.833679 0.544067 0.646088 -0.856781 0.550171 0.652100 -0.878998 0.556244 0.658020 -0.900116 0.562134 0.663788 -0.137939 0.412445 0.488708 -0.158142 0.417847 0.494293 -0.179504 0.423340 0.500061 -0.201630 0.428741 0.505768 -0.224609 0.434326 0.511688 -0.248260 0.439880 0.517639 -0.272369 0.445465 0.523438 -0.297058 0.451202 0.529480 -0.322113 0.457001 0.535583 -0.347321 0.462738 0.541595 -0.372864 0.468628 0.547729 -0.398376 0.474579 0.553925 -0.423767 0.480438 0.559967 -0.449188 0.486542 0.566223 -0.474487 0.492462 0.572296 -0.500671 0.498566 0.578522 -0.527496 0.504761 0.584778 -0.554596 0.510773 0.590881 -0.582153 0.516937 0.597137 -0.609894 0.523132 0.603363 -0.637512 0.529205 0.609467 -0.665039 0.535431 0.615631 -0.692261 0.541626 0.621826 -0.718872 0.547699 0.627838 -0.745148 0.553925 0.633911 -0.770691 0.559967 0.639893 -0.795715 0.566132 0.645966 -0.820038 0.572266 0.651978 -0.843475 0.578247 0.657745 -0.866211 0.584320 0.663666 -0.887939 0.590424 0.669464 -0.908600 0.596252 0.675140 -0.146301 0.442932 0.499786 -0.167114 0.448578 0.505646 -0.188873 0.454254 0.511536 -0.211365 0.459869 0.517334 -0.234711 0.465698 0.523315 -0.258667 0.471619 0.529358 -0.283020 0.477417 0.535309 -0.307861 0.483368 0.541412 -0.333069 0.489471 0.547577 -0.358368 0.495392 0.553558 -0.383942 0.501526 0.559814 -0.409363 0.507538 0.565887 -0.434845 0.513733 0.572174 -0.460205 0.519989 0.578369 -0.485840 0.526093 0.584473 -0.512268 0.532349 0.590729 -0.539215 0.538635 0.596954 -0.566498 0.544769 0.603058 -0.594147 0.551056 0.609253 -0.621918 0.557343 0.615479 -0.649353 0.563477 0.621490 -0.676788 0.569794 0.627686 -0.703644 0.575867 0.633636 -0.730133 0.582123 0.639740 -0.756104 0.588348 0.645813 -0.781342 0.594360 0.651611 -0.806030 0.600525 0.657623 -0.830017 0.606598 0.663483 -0.852997 0.612518 0.669189 -0.875275 0.618591 0.674957 -0.896606 0.624512 0.680664 -0.916718 0.630249 0.686127 -0.155090 0.474579 0.511230 -0.176331 0.480499 0.517181 -0.198547 0.486511 0.523163 -0.221313 0.492401 0.529053 -0.245026 0.498444 0.535156 -0.269196 0.504578 0.541290 -0.293762 0.510590 0.547272 -0.318787 0.516785 0.553406 -0.344147 0.523041 0.559692 -0.369507 0.529114 0.565735 -0.395050 0.535431 0.571960 -0.420471 0.541565 0.578064 -0.445923 0.547943 0.584320 -0.471283 0.554260 0.590546 -0.497192 0.560486 0.596680 -0.523895 0.566803 0.602905 -0.551025 0.573151 0.609100 -0.578369 0.579376 0.615204 -0.606049 0.585663 0.621399 -0.633789 0.592010 0.627563 -0.661102 0.598145 0.633514 -0.688263 0.604370 0.639557 -0.714874 0.610443 0.645477 -0.741150 0.616669 0.651489 -0.766846 0.622833 0.657471 -0.791718 0.628754 0.663177 -0.816101 0.634827 0.669067 -0.839691 0.640808 0.674805 -0.862274 0.646576 0.680328 -0.884064 0.652496 0.686035 -0.904907 0.658295 0.691589 -0.924530 0.663910 0.696960 -0.164062 0.507507 0.522858 -0.185822 0.513641 0.528870 -0.208344 0.519867 0.535004 -0.231537 0.525970 0.540985 -0.255402 0.532196 0.547119 -0.279846 0.538483 0.553284 -0.304565 0.544617 0.559357 -0.329773 0.550995 0.565582 -0.355103 0.557190 0.571655 -0.380585 0.563599 0.577911 -0.406189 0.570007 0.584198 -0.431549 0.576233 0.590271 -0.456879 0.582611 0.596497 -0.482483 0.589020 0.602753 -0.508667 0.595215 0.608795 -0.535522 0.601624 0.615021 -0.562836 0.607971 0.621216 -0.590240 0.614136 0.627228 -0.617981 0.620422 0.633362 -0.645477 0.626648 0.639435 -0.672729 0.632721 0.645325 -0.699677 0.638916 0.651337 -0.726013 0.644897 0.657135 -0.751984 0.651001 0.663025 -0.777344 0.657043 0.668915 -0.801880 0.662811 0.674530 -0.825867 0.668671 0.680206 -0.849030 0.674530 0.685913 -0.871185 0.680115 0.691254 -0.892517 0.685822 0.696808 -0.912781 0.691223 0.702057 -0.932068 0.696747 0.707428 -0.173340 0.541443 0.534698 -0.195435 0.547760 0.540833 -0.218353 0.554077 0.546936 -0.241821 0.560333 0.552948 -0.265961 0.566711 0.559204 -0.290619 0.573090 0.565430 -0.315491 0.579346 0.571472 -0.340820 0.585785 0.577759 -0.366150 0.592041 0.583862 -0.391724 0.598450 0.590088 -0.417267 0.604889 0.596375 -0.442505 0.611145 0.602448 -0.467865 0.617584 0.608673 -0.493744 0.623901 0.614899 -0.520172 0.630127 0.620911 -0.547211 0.636383 0.627075 -0.574585 0.642639 0.633209 -0.602051 0.648712 0.639130 -0.629669 0.654938 0.645172 -0.656952 0.660950 0.651062 -0.684113 0.666992 0.656952 -0.710754 0.673035 0.662903 -0.736877 0.678864 0.668610 -0.762543 0.684692 0.674377 -0.787567 0.690613 0.680054 -0.811707 0.696198 0.685577 -0.835297 0.701874 0.691162 -0.858063 0.707489 0.696655 -0.879822 0.712891 0.701935 -0.900696 0.718262 0.707306 -0.920441 0.723541 0.712433 -0.939148 0.728821 0.717590 -0.182831 0.576050 0.546661 -0.205322 0.582489 0.552826 -0.228546 0.588867 0.559021 -0.252258 0.595184 0.565094 -0.276642 0.601624 0.571350 -0.301300 0.607910 0.577423 -0.326508 0.614349 0.583710 -0.351868 0.620758 0.589935 -0.377258 0.627014 0.596039 -0.402771 0.633392 0.602264 -0.428253 0.639801 0.608490 -0.453430 0.645996 0.614532 -0.478882 0.652252 0.620758 -0.505096 0.658569 0.626923 -0.531677 0.664642 0.632904 -0.558807 0.670837 0.639038 -0.586304 0.676941 0.645050 -0.613770 0.682922 0.650940 -0.641205 0.688934 0.656830 -0.668335 0.694733 0.662567 -0.695221 0.700562 0.668427 -0.721741 0.706421 0.674255 -0.747467 0.712036 0.679840 -0.772797 0.717712 0.685455 -0.797485 0.723297 0.691010 -0.821289 0.728699 0.696381 -0.844482 0.734131 0.701843 -0.866760 0.739532 0.707153 -0.888092 0.744629 0.712311 -0.908508 0.749817 0.717468 -0.927734 0.754852 0.722443 -0.945923 0.759827 0.727448 -0.192505 0.611023 0.558746 -0.215332 0.617462 0.564941 -0.238831 0.623901 0.571198 -0.262817 0.630188 0.577271 -0.287384 0.636597 0.583557 -0.312225 0.642822 0.589630 -0.337494 0.649292 0.595856 -0.362946 0.655609 0.602112 -0.388306 0.661804 0.608215 -0.413757 0.668060 0.614410 -0.439209 0.674377 0.620605 -0.464264 0.680389 0.626617 -0.490021 0.686523 0.632751 -0.516388 0.692657 0.638855 -0.543091 0.698547 0.644775 -0.570435 0.704590 0.650757 -0.597748 0.710358 0.656586 -0.625214 0.716248 0.662445 -0.652618 0.722076 0.668304 -0.679504 0.727631 0.673950 -0.706116 0.733368 0.679657 -0.732330 0.738922 0.685303 -0.757782 0.744324 0.690735 -0.782745 0.749725 0.696228 -0.807068 0.755096 0.701691 -0.830505 0.760254 0.706909 -0.853333 0.765442 0.712158 -0.875092 0.770416 0.717255 -0.895996 0.775421 0.722351 -0.915955 0.780304 0.727356 -0.934692 0.785004 0.732147 -0.952393 0.789764 0.736938 -0.202362 0.645996 0.570862 -0.225494 0.652374 0.577118 -0.249146 0.658600 0.583221 -0.273438 0.664948 0.589447 -0.298187 0.671326 0.595703 -0.323120 0.677460 0.601807 -0.348450 0.683746 0.608063 -0.373901 0.689911 0.614288 -0.399261 0.695953 0.620331 -0.424713 0.702057 0.626495 -0.450012 0.708191 0.632629 -0.475159 0.714142 0.638550 -0.501129 0.720062 0.644623 -0.527557 0.725830 0.650482 -0.554565 0.731659 0.656433 -0.581879 0.737488 0.662292 -0.609192 0.743011 0.668030 -0.636566 0.748749 0.673767 -0.663757 0.754303 0.679504 -0.690430 0.759644 0.685028 -0.716797 0.765106 0.690613 -0.742676 0.770416 0.696106 -0.767853 0.775574 0.701416 -0.792419 0.780701 0.706757 -0.816406 0.785828 0.712036 -0.839447 0.790741 0.717133 -0.861755 0.795593 0.722198 -0.883087 0.800354 0.727081 -0.903595 0.804993 0.732025 -0.923035 0.809631 0.736816 -0.941315 0.814026 0.741455 -0.958435 0.818451 0.746063 -0.212311 0.680573 0.583069 -0.235718 0.686859 0.589325 -0.259613 0.692963 0.595398 -0.284088 0.699188 0.601685 -0.308990 0.705353 0.607910 -0.334015 0.711395 0.613983 -0.359406 0.717499 0.620148 -0.384888 0.723541 0.626343 -0.410156 0.729401 0.632294 -0.435516 0.735321 0.638397 -0.460663 0.741241 0.644440 -0.486084 0.746918 0.650330 -0.512268 0.752655 0.656281 -0.538818 0.758240 0.662079 -0.565887 0.763855 0.667847 -0.593170 0.769440 0.673676 -0.620422 0.774750 0.679199 -0.647705 0.780121 0.684906 -0.674683 0.785461 0.690460 -0.701050 0.790649 0.695801 -0.727203 0.795746 0.701294 -0.752686 0.800842 0.706604 -0.777496 0.805664 0.711761 -0.801819 0.810608 0.716980 -0.825195 0.815216 0.721924 -0.848022 0.819946 0.726959 -0.869873 0.824524 0.731873 -0.890808 0.828979 0.736603 -0.910828 0.833344 0.741302 -0.929749 0.837646 0.745941 -0.947479 0.841766 0.750366 -0.964111 0.845886 0.754822 -0.222382 0.714508 0.595245 -0.246063 0.720703 0.601501 -0.270142 0.726624 0.607574 -0.294800 0.732666 0.613831 -0.319824 0.738647 0.619995 -0.344910 0.744507 0.625977 -0.370331 0.750427 0.632172 -0.395721 0.756256 0.638275 -0.420959 0.761902 0.644165 -0.446136 0.767639 0.650177 -0.471161 0.773163 0.656006 -0.496979 0.778748 0.661926 -0.523315 0.784241 0.667725 -0.549988 0.789612 0.673340 -0.577087 0.794983 0.679077 -0.604370 0.800232 0.684723 -0.631439 0.805359 0.690186 -0.658569 0.810455 0.695679 -0.685303 0.815521 0.701141 -0.711456 0.820343 0.706360 -0.737213 0.825165 0.711609 -0.762482 0.829956 0.716888 -0.786896 0.834564 0.721802 -0.810852 0.839111 0.726837 -0.833832 0.843536 0.731598 -0.856201 0.847870 0.736481 -0.877625 0.852173 0.741211 -0.898132 0.856262 0.745728 -0.917664 0.860321 0.750244 -0.936127 0.864288 0.754700 -0.953339 0.868073 0.758911 -0.969452 0.871857 0.763123 -0.232574 0.747681 0.607452 -0.256439 0.753632 0.613647 -0.280701 0.759430 0.619720 -0.305481 0.765320 0.625854 -0.330597 0.771057 0.631989 -0.355743 0.776672 0.638000 -0.381042 0.782379 0.644012 -0.406464 0.787994 0.650055 -0.431549 0.793365 0.655853 -0.456604 0.798859 0.661713 -0.481812 0.804169 0.667450 -0.507812 0.809479 0.673248 -0.534302 0.814728 0.678955 -0.561035 0.819794 0.684448 -0.588135 0.824890 0.690033 -0.615295 0.829865 0.695557 -0.642334 0.834656 0.700867 -0.669159 0.839478 0.706238 -0.695618 0.844238 0.711487 -0.721497 0.848785 0.716583 -0.746948 0.853333 0.721649 -0.771729 0.857666 0.726562 -0.795959 0.862000 0.731506 -0.819489 0.866302 0.736359 -0.842102 0.870300 0.740967 -0.864044 0.874390 0.745636 -0.885101 0.878357 0.750122 -0.905060 0.882141 0.754486 -0.924164 0.885864 0.758789 -0.942108 0.889496 0.763000 -0.958832 0.892914 0.766998 -0.974396 0.896362 0.771027 -0.242798 0.779907 0.619507 -0.266846 0.785645 0.625702 -0.291260 0.791229 0.631714 -0.316132 0.796844 0.637787 -0.341309 0.802429 0.643829 -0.366425 0.807770 0.649689 -0.391754 0.813202 0.655701 -0.416901 0.818390 0.661438 -0.442017 0.823700 0.667297 -0.467072 0.828918 0.673096 -0.492432 0.833893 0.678741 -0.518494 0.838898 0.684326 -0.545135 0.843872 0.689911 -0.571869 0.848602 0.695282 -0.598969 0.853394 0.700745 -0.626007 0.858093 0.706085 -0.652863 0.862610 0.711243 -0.679443 0.867126 0.716431 -0.705658 0.871490 0.721558 -0.731262 0.875702 0.726471 -0.756348 0.879944 0.731384 -0.780762 0.884003 0.736115 -0.804657 0.887970 0.740845 -0.827728 0.891937 0.745514 -0.850037 0.895630 0.749908 -0.871552 0.899384 0.754364 -0.892120 0.902985 0.758667 -0.911621 0.906372 0.762756 -0.930176 0.909790 0.766907 -0.947693 0.913086 0.770935 -0.963928 0.916168 0.774750 -0.979065 0.919281 0.778534 -0.253052 0.811066 0.631531 -0.277283 0.816498 0.637634 -0.301819 0.821808 0.643524 -0.326752 0.827209 0.649567 -0.351929 0.832489 0.655548 -0.377045 0.837555 0.661316 -0.402313 0.842682 0.667175 -0.427307 0.847687 0.672791 -0.452271 0.852661 0.678558 -0.477356 0.857574 0.684174 -0.502960 0.862244 0.689636 -0.529144 0.867004 0.695160 -0.555786 0.871643 0.700592 -0.582611 0.876068 0.705811 -0.609589 0.880524 0.711121 -0.636536 0.884888 0.716339 -0.663116 0.889099 0.721313 -0.689484 0.893250 0.726349 -0.715240 0.897156 0.731140 -0.740570 0.901184 0.735962 -0.765381 0.905060 0.740723 -0.789398 0.908722 0.745239 -0.812927 0.912384 0.749817 -0.835632 0.915955 0.754242 -0.857513 0.919342 0.758453 -0.878571 0.922699 0.762665 -0.898712 0.925934 0.766815 -0.917816 0.929047 0.770782 -0.935913 0.932098 0.774658 -0.952850 0.934967 0.778351 -0.968689 0.937775 0.782013 -0.983307 0.940521 0.785583 -0.263245 0.840942 0.643402 -0.287689 0.846191 0.649414 -0.312286 0.851196 0.655212 -0.337280 0.856293 0.661163 -0.362335 0.861145 0.666870 -0.387451 0.866058 0.672699 -0.412659 0.870911 0.678406 -0.437531 0.875519 0.683899 -0.462372 0.880188 0.689514 -0.487610 0.884766 0.695038 -0.513367 0.889160 0.700317 -0.539673 0.893494 0.705688 -0.566315 0.897858 0.710999 -0.593048 0.901917 0.716095 -0.619934 0.906067 0.721191 -0.646545 0.909943 0.726074 -0.673035 0.913879 0.731049 -0.699097 0.917694 0.735870 -0.724548 0.921326 0.740479 -0.749603 0.924927 0.745117 -0.774109 0.928436 0.749725 -0.797729 0.931763 0.753998 -0.820862 0.935089 0.758362 -0.843201 0.938293 0.762573 -0.864624 0.941315 0.766602 -0.885254 0.944305 0.770691 -0.904968 0.947235 0.774567 -0.923584 0.949921 0.778229 -0.941315 0.952637 0.781921 -0.957733 0.955200 0.785400 -0.973053 0.957642 0.788818 -0.987213 0.960052 0.792175 -0.273468 0.869415 0.655090 -0.297974 0.874390 0.661011 -0.322662 0.879059 0.666718 -0.347656 0.883850 0.672516 -0.372681 0.888397 0.678131 -0.397797 0.893005 0.683807 -0.422791 0.897522 0.689392 -0.447540 0.901794 0.694763 -0.472382 0.906128 0.700195 -0.497772 0.910339 0.705566 -0.523651 0.914368 0.710693 -0.549988 0.918427 0.715942 -0.576569 0.922363 0.721039 -0.603271 0.926117 0.725922 -0.629974 0.929840 0.730896 -0.656403 0.933411 0.735626 -0.682678 0.936920 0.740387 -0.708435 0.940369 0.745026 -0.733521 0.943695 0.749451 -0.758240 0.946899 0.753906 -0.782349 0.950043 0.758270 -0.805664 0.953033 0.762390 -0.828339 0.955994 0.766510 -0.850281 0.958832 0.770569 -0.871307 0.961517 0.774384 -0.891541 0.964142 0.778137 -0.910767 0.966614 0.781769 -0.928986 0.969055 0.785309 -0.946198 0.971375 0.788727 -0.962219 0.973602 0.792023 -0.977112 0.975739 0.795227 -0.990753 0.977753 0.798309 -0.283661 0.896454 0.666595 -0.308228 0.901062 0.672363 -0.332916 0.905426 0.678009 -0.357910 0.909821 0.683655 -0.382843 0.914062 0.689087 -0.407928 0.918274 0.694641 -0.432770 0.922455 0.700043 -0.457336 0.926361 0.705322 -0.482239 0.930328 0.710571 -0.507812 0.934204 0.715790 -0.533691 0.937866 0.720764 -0.560059 0.941528 0.725830 -0.586517 0.945007 0.730682 -0.613190 0.948456 0.735474 -0.639740 0.951843 0.740234 -0.665924 0.955048 0.744781 -0.691803 0.958160 0.749359 -0.717285 0.961273 0.753754 -0.742096 0.964172 0.758026 -0.766479 0.967072 0.762268 -0.790192 0.969788 0.766418 -0.813141 0.972382 0.770386 -0.835510 0.974976 0.774292 -0.857025 0.977448 0.778046 -0.877594 0.979767 0.781677 -0.897400 0.982056 0.785187 -0.916199 0.984161 0.788544 -0.934021 0.986267 0.791931 -0.950714 0.988251 0.795135 -0.966339 0.990082 0.798157 -0.980804 0.991882 0.801117 -0.993958 0.993591 0.803955 -0.046875 0.044525 0.368286 -0.059937 0.046051 0.371460 -0.073456 0.047638 0.374786 -0.087830 0.049286 0.378265 -0.103333 0.050995 0.381744 -0.120117 0.052795 0.385345 -0.137970 0.054596 0.389038 -0.156982 0.056519 0.392914 -0.176971 0.058533 0.396912 -0.197693 0.060486 0.400879 -0.219299 0.062622 0.404968 -0.241516 0.064819 0.409241 -0.264252 0.067017 0.413422 -0.287598 0.069305 0.417786 -0.311371 0.071686 0.422272 -0.335388 0.074097 0.426758 -0.359802 0.076630 0.431335 -0.384277 0.079193 0.435944 -0.408875 0.081909 0.440674 -0.433533 0.084656 0.445496 -0.458038 0.087433 0.450256 -0.482971 0.090393 0.455139 -0.508606 0.093445 0.460236 -0.534790 0.096497 0.465240 -0.561554 0.099701 0.470459 -0.588684 0.103027 0.475739 -0.615875 0.106323 0.481018 -0.643188 0.109833 0.486481 -0.670227 0.113312 0.491882 -0.697083 0.117004 0.497498 -0.723633 0.120758 0.503174 -0.749542 0.124481 0.508820 -0.050507 0.057343 0.374725 -0.063751 0.059021 0.378082 -0.077576 0.060822 0.381653 -0.092346 0.062683 0.385284 -0.108368 0.064575 0.388977 -0.125641 0.066620 0.392822 -0.143982 0.068665 0.396698 -0.163422 0.070801 0.400787 -0.183838 0.072998 0.404846 -0.204956 0.075256 0.409027 -0.226868 0.077637 0.413300 -0.249512 0.080078 0.417694 -0.272522 0.082581 0.422058 -0.296143 0.085175 0.426605 -0.320190 0.087891 0.431213 -0.344452 0.090607 0.435791 -0.369049 0.093506 0.440521 -0.393677 0.096405 0.445221 -0.418427 0.099487 0.450134 -0.443146 0.102631 0.455048 -0.467682 0.105804 0.459961 -0.493042 0.109161 0.465118 -0.519073 0.112579 0.470306 -0.545502 0.116028 0.475494 -0.572540 0.119629 0.480896 -0.599854 0.123352 0.486328 -0.627106 0.127045 0.491791 -0.654480 0.130920 0.497375 -0.681519 0.134766 0.502899 -0.708252 0.138824 0.508667 -0.734680 0.142914 0.514465 -0.760437 0.147003 0.520233 -0.054382 0.071136 0.381561 -0.067810 0.073059 0.385101 -0.082001 0.075104 0.388885 -0.097229 0.077179 0.392670 -0.113800 0.079376 0.396606 -0.131561 0.081635 0.400665 -0.150421 0.083954 0.404663 -0.170319 0.086395 0.408905 -0.191071 0.088959 0.413239 -0.212585 0.091522 0.417450 -0.234894 0.094238 0.421967 -0.257812 0.097046 0.426514 -0.281158 0.099884 0.430969 -0.305084 0.102875 0.435669 -0.329254 0.105896 0.440338 -0.353821 0.109039 0.445099 -0.378540 0.112366 0.449982 -0.403290 0.115601 0.454773 -0.428101 0.119080 0.459839 -0.452881 0.122650 0.464966 -0.477753 0.126190 0.470062 -0.503448 0.129944 0.475342 -0.529816 0.133728 0.480743 -0.556519 0.137512 0.486084 -0.583740 0.141510 0.491608 -0.611053 0.145447 0.497101 -0.638580 0.149597 0.502777 -0.665924 0.153839 0.508514 -0.692810 0.157990 0.514191 -0.719513 0.162384 0.520081 -0.745728 0.166809 0.526031 -0.771301 0.171173 0.531799 -0.058472 0.086273 0.388794 -0.072174 0.088470 0.392578 -0.086792 0.090820 0.396484 -0.102509 0.093201 0.400482 -0.119598 0.095734 0.404572 -0.137939 0.098358 0.408813 -0.157166 0.101013 0.412994 -0.177460 0.103821 0.417328 -0.198730 0.106750 0.421814 -0.220551 0.109680 0.426270 -0.243256 0.112762 0.430908 -0.266479 0.115997 0.435577 -0.290131 0.119141 0.440186 -0.314270 0.122559 0.444946 -0.338654 0.125916 0.449768 -0.363464 0.129517 0.454651 -0.388306 0.133148 0.459717 -0.413147 0.136780 0.464661 -0.438080 0.140594 0.469940 -0.462921 0.144501 0.475220 -0.488098 0.148407 0.480469 -0.514191 0.152496 0.485931 -0.540802 0.156647 0.491486 -0.567810 0.160797 0.496948 -0.595215 0.165100 0.502625 -0.622589 0.169342 0.508240 -0.650116 0.173798 0.514038 -0.677429 0.178375 0.519928 -0.704224 0.182831 0.525696 -0.730743 0.187500 0.531677 -0.756805 0.192230 0.537689 -0.782166 0.196869 0.543671 -0.062775 0.103058 0.396271 -0.076843 0.105652 0.400360 -0.091919 0.108368 0.404449 -0.108185 0.111084 0.408569 -0.125824 0.113983 0.412903 -0.144592 0.117004 0.417267 -0.164307 0.119995 0.421570 -0.185089 0.123169 0.426178 -0.206665 0.126465 0.430756 -0.228912 0.129761 0.435333 -0.251923 0.133240 0.440063 -0.275330 0.136688 0.444733 -0.299316 0.140320 0.449615 -0.323792 0.144043 0.454559 -0.348358 0.147827 0.459473 -0.373291 0.151703 0.464539 -0.398285 0.155701 0.469788 -0.423218 0.159698 0.474915 -0.448181 0.163849 0.480347 -0.473175 0.168060 0.485809 -0.498779 0.172302 0.491180 -0.525146 0.176666 0.496796 -0.552094 0.181152 0.502502 -0.579315 0.185608 0.508118 -0.606842 0.190216 0.513885 -0.634247 0.194763 0.519653 -0.661743 0.199524 0.525574 -0.688965 0.204346 0.531525 -0.715607 0.209106 0.537384 -0.742004 0.214020 0.543488 -0.767883 0.218994 0.549591 -0.792999 0.223907 0.555603 -0.067413 0.121735 0.404205 -0.081848 0.124695 0.408478 -0.097412 0.127777 0.412750 -0.114227 0.130859 0.417053 -0.132385 0.134094 0.421478 -0.151611 0.137451 0.426056 -0.171814 0.140839 0.430481 -0.193024 0.144348 0.435181 -0.214996 0.147980 0.439911 -0.237579 0.151611 0.444611 -0.260864 0.155426 0.449493 -0.284637 0.159210 0.454285 -0.308899 0.163177 0.459351 -0.333527 0.167267 0.464417 -0.358246 0.171326 0.469543 -0.383362 0.175568 0.474792 -0.408508 0.179901 0.480194 -0.433441 0.184204 0.485504 -0.458405 0.188690 0.491028 -0.483734 0.193176 0.496613 -0.509705 0.197723 0.502228 -0.536377 0.202393 0.507965 -0.563385 0.207031 0.513580 -0.590912 0.211884 0.519501 -0.618530 0.216705 0.525421 -0.646057 0.221527 0.531219 -0.673401 0.226501 0.537231 -0.700531 0.231628 0.543365 -0.727051 0.236572 0.549286 -0.753296 0.241699 0.555420 -0.778900 0.246918 0.561584 -0.803741 0.252045 0.567657 -0.072296 0.142181 0.412567 -0.087189 0.145508 0.416962 -0.103302 0.148895 0.421417 -0.120667 0.152344 0.425812 -0.139313 0.155945 0.430389 -0.159058 0.159637 0.435089 -0.179718 0.163330 0.439697 -0.201294 0.167206 0.444458 -0.223541 0.171082 0.449280 -0.246582 0.175110 0.454163 -0.270233 0.179260 0.459229 -0.294189 0.183350 0.464203 -0.318695 0.187653 0.469391 -0.343536 0.192047 0.474670 -0.368439 0.196411 0.479950 -0.393616 0.200897 0.485352 -0.418762 0.205536 0.490906 -0.443817 0.210114 0.496368 -0.468872 0.214844 0.502075 -0.494598 0.219666 0.507812 -0.520874 0.224426 0.513458 -0.547882 0.229370 0.519348 -0.575104 0.234222 0.525116 -0.602692 0.239288 0.531067 -0.630402 0.244446 0.537109 -0.657898 0.249481 0.543030 -0.685181 0.254669 0.549133 -0.712097 0.259918 0.555298 -0.738434 0.265076 0.561279 -0.764435 0.270416 0.567505 -0.789825 0.275757 0.573761 -0.814362 0.281036 0.579834 -0.077454 0.164307 0.421173 -0.092834 0.167969 0.425690 -0.109558 0.171692 0.430298 -0.127441 0.175476 0.434814 -0.146606 0.179382 0.439606 -0.166870 0.183380 0.444366 -0.187927 0.187378 0.449127 -0.209900 0.191559 0.454071 -0.232483 0.195740 0.458923 -0.255890 0.200043 0.464081 -0.279785 0.204498 0.469269 -0.304016 0.208893 0.474426 -0.328766 0.213501 0.479828 -0.353790 0.218170 0.485260 -0.378784 0.222778 0.490662 -0.404022 0.227570 0.496216 -0.429291 0.232452 0.501923 -0.454285 0.237274 0.507507 -0.479614 0.242249 0.513336 -0.505554 0.247162 0.519043 -0.532257 0.252289 0.524933 -0.559479 0.257477 0.530914 -0.586884 0.262543 0.536774 -0.614563 0.267792 0.542877 -0.642334 0.273163 0.548981 -0.669708 0.278320 0.554962 -0.696838 0.283722 0.561127 -0.723663 0.289124 0.567352 -0.749786 0.294464 0.573456 -0.775543 0.299927 0.579712 -0.800507 0.305298 0.585785 -0.824890 0.310822 0.592041 -0.082947 0.187958 0.430054 -0.098907 0.191895 0.434723 -0.116180 0.195984 0.439484 -0.134583 0.199982 0.444122 -0.154266 0.204254 0.449005 -0.174835 0.208435 0.453796 -0.196442 0.212799 0.458832 -0.218811 0.217316 0.463928 -0.241760 0.221741 0.468994 -0.265442 0.226349 0.474274 -0.289642 0.231079 0.479675 -0.314117 0.235718 0.484985 -0.338989 0.240540 0.490509 -0.364197 0.245453 0.496063 -0.389313 0.250336 0.501648 -0.414581 0.255402 0.507385 -0.439911 0.260498 0.513184 -0.464874 0.265472 0.518921 -0.490662 0.270721 0.524811 -0.516937 0.275818 0.530640 -0.543884 0.281158 0.536652 -0.571320 0.286499 0.542725 -0.598816 0.291748 0.548645 -0.626587 0.297180 0.554810 -0.654297 0.302643 0.561005 -0.681519 0.307983 0.567078 -0.708588 0.313538 0.573303 -0.735138 0.319092 0.579559 -0.761078 0.324524 0.585632 -0.786530 0.330048 0.591919 -0.811218 0.335541 0.598022 -0.835266 0.341156 0.604279 -0.088776 0.212982 0.439270 -0.105255 0.217224 0.444031 -0.123138 0.221558 0.448883 -0.142090 0.225861 0.453644 -0.162262 0.230408 0.458710 -0.183319 0.234833 0.463715 -0.205261 0.239471 0.468872 -0.228027 0.244263 0.474182 -0.251312 0.248932 0.479370 -0.275269 0.253784 0.484833 -0.299713 0.258789 0.490356 -0.324371 0.263611 0.495789 -0.349487 0.268707 0.501495 -0.374756 0.273804 0.507233 -0.399963 0.278870 0.512848 -0.425293 0.284119 0.518738 -0.450470 0.289276 0.524536 -0.475769 0.294617 0.530457 -0.501862 0.299988 0.536499 -0.528442 0.305298 0.542450 -0.555664 0.310760 0.548523 -0.583221 0.316254 0.554657 -0.610809 0.321655 0.560669 -0.638611 0.327209 0.566925 -0.666199 0.332825 0.573120 -0.693298 0.338257 0.579224 -0.720215 0.343903 0.585480 -0.746399 0.349396 0.591583 -0.772247 0.355011 0.597870 -0.797424 0.360687 0.604156 -0.821747 0.366211 0.610229 -0.845459 0.371826 0.616516 -0.094940 0.239258 0.448669 -0.112061 0.243744 0.453552 -0.130371 0.248230 0.458435 -0.149963 0.252930 0.463562 -0.170563 0.257690 0.468750 -0.192047 0.262329 0.473907 -0.214386 0.267303 0.479279 -0.237518 0.272247 0.484680 -0.261139 0.277161 0.490082 -0.285339 0.282227 0.495667 -0.309998 0.287415 0.501373 -0.334839 0.292480 0.506897 -0.360077 0.297729 0.512726 -0.385345 0.302948 0.518463 -0.410767 0.308258 0.524353 -0.436127 0.313690 0.530304 -0.461212 0.319031 0.536194 -0.486938 0.324524 0.542267 -0.513336 0.330017 0.548370 -0.540161 0.335449 0.554382 -0.567566 0.341003 0.560516 -0.595245 0.346649 0.566772 -0.622894 0.352142 0.572845 -0.650665 0.357758 0.579102 -0.678131 0.363403 0.585327 -0.705078 0.368988 0.591431 -0.731659 0.374634 0.597717 -0.757721 0.380157 0.603821 -0.783234 0.385834 0.610107 -0.808136 0.391510 0.616364 -0.832123 0.397034 0.622467 -0.855469 0.402649 0.628693 -0.101501 0.266571 0.458313 -0.119202 0.271362 0.463440 -0.138062 0.276031 0.468506 -0.158112 0.280975 0.473785 -0.179230 0.285950 0.479126 -0.201080 0.290863 0.484436 -0.223877 0.295990 0.489960 -0.247253 0.301147 0.495514 -0.271179 0.306244 0.501068 -0.295624 0.311493 0.506775 -0.320496 0.316833 0.512573 -0.345551 0.322113 0.518311 -0.370911 0.327545 0.524231 -0.396179 0.332886 0.530029 -0.421600 0.338348 0.536041 -0.446960 0.343903 0.542145 -0.472168 0.349335 0.548065 -0.498230 0.354919 0.554199 -0.524872 0.360535 0.560364 -0.551971 0.366058 0.566467 -0.579559 0.371704 0.572662 -0.607330 0.377380 0.578918 -0.634979 0.382874 0.584991 -0.662567 0.388580 0.591278 -0.689789 0.394135 0.597412 -0.716705 0.399841 0.603668 -0.743103 0.405487 0.609924 -0.768829 0.411041 0.616058 -0.794098 0.416718 0.622314 -0.818634 0.422363 0.628540 -0.842316 0.427826 0.634552 -0.865265 0.433441 0.640747 -0.108429 0.294861 0.468353 -0.126648 0.299866 0.473633 -0.146088 0.304779 0.478851 -0.166656 0.309906 0.484314 -0.188141 0.315063 0.489807 -0.210449 0.320160 0.495239 -0.233521 0.325439 0.500885 -0.257263 0.330780 0.506622 -0.281403 0.336029 0.512299 -0.306091 0.341431 0.518158 -0.331024 0.346802 0.523926 -0.356354 0.352356 0.529877 -0.381775 0.357849 0.535919 -0.407104 0.363281 0.541809 -0.432526 0.368896 0.547913 -0.457855 0.374512 0.554047 -0.483368 0.380035 0.560059 -0.509735 0.385712 0.566284 -0.536652 0.391327 0.572510 -0.563934 0.396912 0.578583 -0.591583 0.402557 0.584808 -0.619415 0.408264 0.591125 -0.647003 0.413818 0.597229 -0.674591 0.419556 0.603546 -0.701569 0.425079 0.609650 -0.728271 0.430756 0.615906 -0.754456 0.436401 0.622131 -0.779877 0.441956 0.628174 -0.804810 0.447662 0.634430 -0.829010 0.453400 0.640594 -0.852295 0.459045 0.646606 -0.874786 0.464783 0.652710 -0.115662 0.324005 0.478699 -0.134491 0.329163 0.484192 -0.154419 0.334290 0.489563 -0.175446 0.339508 0.495087 -0.197388 0.344879 0.500763 -0.220032 0.350098 0.506348 -0.243439 0.355530 0.512146 -0.267456 0.360992 0.518005 -0.291840 0.366364 0.523773 -0.316742 0.371857 0.529694 -0.341827 0.377319 0.535583 -0.367218 0.382874 0.541656 -0.392731 0.388550 0.547760 -0.418091 0.394012 0.553741 -0.443512 0.399719 0.559937 -0.468872 0.405365 0.566132 -0.494690 0.410919 0.572205 -0.521301 0.416595 0.578430 -0.548523 0.422272 0.584686 -0.575928 0.427795 0.590759 -0.603668 0.433533 0.597076 -0.631317 0.439087 0.603180 -0.658997 0.444824 0.609467 -0.686371 0.450592 0.615753 -0.713196 0.456299 0.621826 -0.739624 0.462097 0.628021 -0.765594 0.467987 0.634277 -0.790680 0.473755 0.640289 -0.815308 0.479675 0.646454 -0.839142 0.485535 0.652527 -0.861969 0.491333 0.658478 -0.884064 0.497284 0.664490 -0.123230 0.353729 0.489380 -0.142639 0.359039 0.494934 -0.163025 0.364258 0.500519 -0.184509 0.369659 0.506256 -0.206879 0.375122 0.511963 -0.229858 0.380463 0.517700 -0.253571 0.385986 0.523590 -0.277863 0.391541 0.529572 -0.302429 0.397003 0.535431 -0.327576 0.402557 0.541504 -0.352753 0.408081 0.547455 -0.378265 0.413727 0.553558 -0.403748 0.419403 0.559784 -0.429108 0.424896 0.565796 -0.454498 0.430603 0.572021 -0.480072 0.436249 0.578247 -0.506195 0.441864 0.584412 -0.533112 0.447632 0.590607 -0.560486 0.453491 0.596924 -0.587982 0.459198 0.603027 -0.615814 0.465057 0.609314 -0.643402 0.470856 0.615417 -0.670929 0.476837 0.621643 -0.698090 0.482819 0.627899 -0.724670 0.488678 0.633911 -0.750885 0.494690 0.640137 -0.776459 0.500702 0.646301 -0.801331 0.506592 0.652252 -0.825592 0.512604 0.658325 -0.848999 0.518646 0.664337 -0.871460 0.524536 0.670166 -0.893066 0.530548 0.676086 -0.131165 0.383942 0.500366 -0.151093 0.389374 0.506104 -0.171967 0.394684 0.511719 -0.193848 0.400208 0.517578 -0.216583 0.405701 0.523438 -0.239868 0.411102 0.529236 -0.263947 0.416687 0.535309 -0.288269 0.422150 0.541199 -0.313202 0.427765 0.547302 -0.338440 0.433411 0.553406 -0.363770 0.438965 0.559479 -0.389313 0.444672 0.565674 -0.414825 0.450470 0.571869 -0.440155 0.456146 0.577972 -0.465485 0.462006 0.584229 -0.491394 0.467957 0.590485 -0.517883 0.473785 0.596588 -0.544952 0.479828 0.602905 -0.572296 0.485687 0.608978 -0.600006 0.491760 0.615234 -0.627838 0.497833 0.621490 -0.655365 0.503815 0.627625 -0.682709 0.509949 0.633789 -0.709656 0.515991 0.639984 -0.735992 0.522003 0.645996 -0.761932 0.528168 0.652130 -0.787231 0.534271 0.658203 -0.811676 0.540253 0.664062 -0.835602 0.546387 0.670013 -0.858521 0.552277 0.675781 -0.880615 0.558380 0.681671 -0.901794 0.564362 0.687469 -0.139404 0.414368 0.511597 -0.159882 0.419891 0.517426 -0.181122 0.425262 0.523163 -0.203461 0.430817 0.529083 -0.226532 0.436401 0.535156 -0.250153 0.441925 0.541077 -0.274384 0.447601 0.547150 -0.298981 0.453247 0.553101 -0.324097 0.459045 0.559296 -0.349457 0.464905 0.565491 -0.374817 0.470703 0.571564 -0.400452 0.476715 0.577850 -0.425934 0.482727 0.584076 -0.451172 0.488678 0.590179 -0.476685 0.494720 0.596466 -0.502899 0.500885 0.602722 -0.529572 0.506866 0.608826 -0.556854 0.513031 0.615112 -0.584503 0.519226 0.621368 -0.612061 0.525360 0.627441 -0.639801 0.531555 0.633636 -0.667175 0.537598 0.639679 -0.694366 0.543793 0.645844 -0.721039 0.550018 0.651947 -0.747131 0.556091 0.657898 -0.772766 0.562256 0.663910 -0.797699 0.568451 0.669891 -0.821899 0.574463 0.675629 -0.845337 0.580505 0.681519 -0.867950 0.586609 0.687317 -0.889526 0.592499 0.692932 -0.910187 0.598480 0.698639 -0.147980 0.445068 0.523041 -0.168915 0.450684 0.528931 -0.190582 0.456299 0.534851 -0.213318 0.462067 0.540924 -0.236664 0.467926 0.546997 -0.260498 0.473724 0.552948 -0.285065 0.479675 0.559143 -0.309845 0.485535 0.565216 -0.335052 0.491608 0.571411 -0.360504 0.497742 0.577667 -0.385925 0.503723 0.583740 -0.411530 0.509918 0.590027 -0.436951 0.516083 0.596283 -0.462219 0.522186 0.602448 -0.487976 0.528442 0.608673 -0.514465 0.534698 0.614960 -0.541351 0.540833 0.621063 -0.568787 0.547119 0.627258 -0.596313 0.553284 0.633331 -0.624023 0.559570 0.639496 -0.651642 0.565857 0.645660 -0.678864 0.571991 0.651611 -0.705780 0.578217 0.657715 -0.732300 0.584473 0.663788 -0.758057 0.590515 0.669586 -0.783325 0.596680 0.675507 -0.808014 0.602783 0.681366 -0.831787 0.608704 0.687042 -0.854797 0.614777 0.692780 -0.876862 0.620605 0.698334 -0.898102 0.626587 0.703949 -0.918274 0.632446 0.709534 -0.156799 0.476776 0.534698 -0.178131 0.482727 0.540771 -0.200256 0.488647 0.546722 -0.223297 0.494629 0.552795 -0.246887 0.500610 0.558838 -0.271118 0.506683 0.565033 -0.295807 0.512878 0.571289 -0.320740 0.518921 0.577332 -0.346161 0.525238 0.583588 -0.371613 0.531494 0.589874 -0.397064 0.537628 0.595947 -0.422607 0.543945 0.602203 -0.447998 0.550293 0.608490 -0.473297 0.556488 0.614624 -0.499420 0.562836 0.620911 -0.525970 0.569031 0.626984 -0.553192 0.575378 0.633209 -0.580658 0.581726 0.639343 -0.608215 0.587921 0.645386 -0.635895 0.594177 0.651489 -0.663391 0.600494 0.657562 -0.690369 0.606537 0.663422 -0.717072 0.612762 0.669434 -0.743225 0.618958 0.675354 -0.768707 0.624939 0.681061 -0.793732 0.631042 0.686890 -0.817993 0.637054 0.692627 -0.841339 0.642883 0.698181 -0.863983 0.648773 0.703827 -0.885590 0.654541 0.709259 -0.906342 0.660309 0.714691 -0.926025 0.666016 0.720062 -0.165863 0.509827 0.546539 -0.187683 0.515961 0.552643 -0.210144 0.522003 0.558655 -0.233490 0.528259 0.564880 -0.257324 0.534363 0.570953 -0.281799 0.540710 0.577148 -0.306702 0.547058 0.583435 -0.331787 0.553223 0.589569 -0.357178 0.559601 0.595795 -0.382751 0.565979 0.602081 -0.408203 0.572235 0.608215 -0.433655 0.578613 0.614471 -0.458984 0.585052 0.620758 -0.484467 0.591278 0.626831 -0.510864 0.597626 0.633026 -0.537598 0.603851 0.639099 -0.564941 0.610168 0.645172 -0.592499 0.616486 0.651306 -0.620026 0.622589 0.657257 -0.647614 0.628845 0.663300 -0.674927 0.635040 0.669250 -0.701691 0.641083 0.675079 -0.728119 0.647186 0.680939 -0.753998 0.653229 0.686737 -0.779144 0.659119 0.692352 -0.803802 0.665009 0.698059 -0.827576 0.670776 0.703552 -0.850677 0.676575 0.709106 -0.872864 0.682281 0.714539 -0.894012 0.687775 0.719879 -0.914276 0.693359 0.725128 -0.933441 0.698822 0.730347 -0.175171 0.543793 0.558533 -0.197296 0.550140 0.564728 -0.220184 0.556335 0.570801 -0.243805 0.562714 0.577026 -0.267883 0.568909 0.583099 -0.292572 0.575348 0.589386 -0.317627 0.581757 0.595642 -0.342804 0.588013 0.601776 -0.368286 0.594482 0.608093 -0.393829 0.600922 0.614349 -0.419220 0.607178 0.620422 -0.444641 0.613556 0.626709 -0.470001 0.619934 0.632874 -0.495789 0.626129 0.638916 -0.522339 0.632446 0.645050 -0.549286 0.638611 0.651031 -0.576691 0.644836 0.657074 -0.604340 0.651093 0.663147 -0.631744 0.657104 0.668976 -0.659180 0.663208 0.674927 -0.686249 0.669250 0.680786 -0.712769 0.675140 0.686462 -0.738922 0.681061 0.692230 -0.764526 0.686951 0.697906 -0.789307 0.692596 0.703400 -0.813599 0.698334 0.708984 -0.836945 0.703827 0.714294 -0.859650 0.709412 0.719696 -0.881409 0.714874 0.725006 -0.902069 0.720184 0.730072 -0.921875 0.725464 0.735199 -0.940491 0.730774 0.740326 -0.184692 0.578430 0.570618 -0.207092 0.584717 0.576691 -0.230408 0.591156 0.582977 -0.254303 0.597565 0.589203 -0.278564 0.603882 0.595337 -0.303406 0.610321 0.601654 -0.328613 0.616760 0.607941 -0.353882 0.622986 0.614044 -0.379395 0.629395 0.620300 -0.404877 0.635834 0.626526 -0.430206 0.642029 0.632568 -0.455566 0.648315 0.638733 -0.480896 0.654480 0.644806 -0.507111 0.660767 0.650909 -0.533875 0.666962 0.656921 -0.560883 0.672974 0.662811 -0.588379 0.679108 0.668854 -0.615967 0.685120 0.674744 -0.643280 0.690979 0.680511 -0.670502 0.696899 0.686310 -0.697327 0.702789 0.692047 -0.723633 0.708435 0.697632 -0.749451 0.714203 0.703278 -0.774628 0.719696 0.708679 -0.799164 0.725250 0.714172 -0.823090 0.730774 0.719574 -0.846039 0.736023 0.724762 -0.868317 0.741394 0.729980 -0.889648 0.746582 0.735077 -0.909882 0.751617 0.740021 -0.929077 0.756714 0.745056 -0.947205 0.761658 0.749939 -0.194397 0.613434 0.582794 -0.217133 0.619751 0.588898 -0.240692 0.626129 0.595184 -0.264832 0.632568 0.601501 -0.289337 0.638855 0.607605 -0.314331 0.645294 0.613892 -0.339630 0.651642 0.620148 -0.364899 0.657837 0.626251 -0.390381 0.664154 0.632446 -0.415924 0.670410 0.638611 -0.441162 0.676544 0.644653 -0.466400 0.682709 0.650757 -0.492004 0.688721 0.656677 -0.518372 0.694794 0.662659 -0.545349 0.700836 0.668671 -0.572449 0.706635 0.674469 -0.599915 0.712585 0.680328 -0.627441 0.718414 0.686188 -0.654602 0.724060 0.691772 -0.681641 0.729767 0.697479 -0.708221 0.735413 0.703094 -0.734222 0.740845 0.708527 -0.759735 0.746338 0.714020 -0.784546 0.751617 0.719299 -0.808777 0.756958 0.724609 -0.832245 0.762207 0.729797 -0.854828 0.767212 0.734863 -0.876617 0.772339 0.739929 -0.897461 0.777252 0.744904 -0.917236 0.781982 0.749725 -0.935944 0.786804 0.754517 -0.953583 0.791473 0.759216 -0.204254 0.648376 0.595032 -0.227325 0.654602 0.601196 -0.251129 0.660980 0.607452 -0.275452 0.667358 0.613770 -0.300110 0.673523 0.619812 -0.325226 0.679779 0.626007 -0.350555 0.686066 0.632294 -0.375916 0.692078 0.638336 -0.401398 0.698273 0.644440 -0.426666 0.704254 0.650452 -0.451935 0.710327 0.656555 -0.477264 0.716339 0.662506 -0.503174 0.722168 0.668396 -0.529694 0.727997 0.674347 -0.556732 0.733856 0.680206 -0.583893 0.739502 0.685913 -0.611359 0.745178 0.691620 -0.638733 0.750824 0.697327 -0.665771 0.756226 0.702820 -0.692505 0.761688 0.708405 -0.718658 0.766968 0.713745 -0.744446 0.772308 0.719147 -0.769714 0.777496 0.724487 -0.794128 0.782532 0.729584 -0.818054 0.787598 0.734772 -0.841095 0.792542 0.739807 -0.863251 0.797302 0.744690 -0.884644 0.802063 0.749603 -0.904999 0.806732 0.754395 -0.924286 0.811188 0.758972 -0.942505 0.815704 0.763611 -0.959473 0.819977 0.768005 -0.214233 0.682953 0.607300 -0.237549 0.689056 0.613403 -0.261658 0.695312 0.619659 -0.286163 0.701508 0.625885 -0.310974 0.707581 0.631958 -0.336121 0.713684 0.638153 -0.361511 0.719788 0.644287 -0.386841 0.725647 0.650299 -0.412262 0.731628 0.656342 -0.437439 0.737366 0.662231 -0.462555 0.743256 0.668243 -0.488129 0.749084 0.674164 -0.514252 0.754730 0.679901 -0.540955 0.760345 0.685760 -0.568054 0.765930 0.691498 -0.595215 0.771332 0.697052 -0.622559 0.776825 0.702698 -0.649811 0.782135 0.708252 -0.676605 0.787323 0.713623 -0.703125 0.792542 0.719055 -0.729004 0.797546 0.724243 -0.754486 0.802582 0.729431 -0.779327 0.807556 0.734619 -0.803436 0.812286 0.739594 -0.826904 0.817017 0.744537 -0.849640 0.821686 0.749451 -0.871338 0.826172 0.754120 -0.892242 0.830627 0.758850 -0.912170 0.834991 0.763489 -0.930939 0.839142 0.767914 -0.948639 0.843292 0.772278 -0.965088 0.847290 0.776520 -0.224335 0.716858 0.619476 -0.247925 0.722809 0.625610 -0.272186 0.728912 0.631805 -0.296875 0.734955 0.638031 -0.321747 0.740784 0.644012 -0.347015 0.746735 0.650146 -0.372253 0.752472 0.656067 -0.397644 0.758301 0.662140 -0.423004 0.764038 0.668091 -0.448059 0.769653 0.673889 -0.473236 0.775269 0.679749 -0.499054 0.780823 0.685577 -0.525269 0.786163 0.691193 -0.552094 0.791595 0.696930 -0.579224 0.796936 0.702545 -0.606354 0.802094 0.707947 -0.633606 0.807251 0.713470 -0.660614 0.812378 0.718872 -0.687164 0.817230 0.724091 -0.713440 0.822205 0.729340 -0.738983 0.826874 0.734344 -0.764160 0.831665 0.739441 -0.788696 0.836243 0.744446 -0.812408 0.840729 0.749207 -0.835480 0.845154 0.753998 -0.857727 0.849548 0.758728 -0.879028 0.853668 0.763275 -0.899445 0.857819 0.767792 -0.918823 0.861725 0.772064 -0.937195 0.865662 0.776398 -0.954437 0.869507 0.780609 -0.970398 0.873108 0.784576 -0.234528 0.749908 0.631622 -0.258301 0.755737 0.637665 -0.282776 0.761627 0.643829 -0.307526 0.767456 0.649933 -0.332550 0.773102 0.655945 -0.357788 0.778809 0.661987 -0.383026 0.784302 0.667755 -0.408356 0.789948 0.673706 -0.433563 0.795441 0.679596 -0.458496 0.800751 0.685272 -0.483887 0.806152 0.691040 -0.509888 0.811462 0.696777 -0.536194 0.816528 0.702240 -0.563141 0.821686 0.707855 -0.590210 0.826752 0.713348 -0.617249 0.831604 0.718597 -0.644379 0.836487 0.723969 -0.671082 0.841125 0.729095 -0.697388 0.845886 0.734222 -0.723389 0.850464 0.739319 -0.748657 0.854889 0.744202 -0.773468 0.859253 0.749084 -0.797668 0.863647 0.753876 -0.821014 0.867737 0.758484 -0.843658 0.871857 0.763123 -0.865509 0.875885 0.767670 -0.886383 0.879730 0.771973 -0.906342 0.883514 0.776306 -0.925262 0.887115 0.780396 -0.943115 0.890717 0.784485 -0.959869 0.894226 0.788452 -0.975250 0.897552 0.792297 -0.244751 0.782013 0.643707 -0.268738 0.787659 0.649658 -0.293274 0.793304 0.655792 -0.318085 0.798767 0.661652 -0.343231 0.804321 0.667664 -0.368469 0.809784 0.673584 -0.393677 0.815033 0.679321 -0.418884 0.820374 0.685181 -0.444061 0.825653 0.690918 -0.468903 0.830658 0.696472 -0.494415 0.835785 0.702118 -0.520599 0.840820 0.707672 -0.547058 0.845612 0.713074 -0.573944 0.850433 0.718475 -0.600922 0.855072 0.723694 -0.627960 0.859772 0.728943 -0.654846 0.864288 0.734131 -0.681274 0.868652 0.739075 -0.707397 0.873047 0.744080 -0.733063 0.877350 0.748993 -0.758026 0.881409 0.753662 -0.782471 0.885468 0.758392 -0.806244 0.889496 0.763000 -0.829193 0.893280 0.767456 -0.851440 0.897064 0.771820 -0.872894 0.900726 0.776184 -0.893311 0.904205 0.780273 -0.912842 0.907684 0.784363 -0.931274 0.910980 0.788269 -0.948669 0.914246 0.792206 -0.964905 0.917358 0.795990 -0.979828 0.920349 0.799561 -0.255005 0.813110 0.655609 -0.279144 0.818451 0.661530 -0.303802 0.823883 0.667511 -0.328674 0.829071 0.673279 -0.353821 0.834320 0.679169 -0.379059 0.839539 0.684998 -0.404114 0.844513 0.690643 -0.429321 0.849579 0.696350 -0.454254 0.854523 0.701965 -0.479218 0.859253 0.707397 -0.504944 0.864075 0.712952 -0.531189 0.868744 0.718323 -0.557739 0.873199 0.723541 -0.584625 0.877747 0.728821 -0.611481 0.882080 0.733856 -0.638367 0.886383 0.738953 -0.665039 0.890625 0.743927 -0.691223 0.894653 0.748718 -0.717041 0.898743 0.753540 -0.742371 0.902618 0.758270 -0.766968 0.906372 0.762756 -0.791077 0.910095 0.767303 -0.814453 0.913727 0.771729 -0.837036 0.917175 0.776001 -0.858948 0.920624 0.780121 -0.879822 0.923859 0.784180 -0.899872 0.927063 0.788239 -0.918976 0.930237 0.792084 -0.936890 0.933105 0.795776 -0.953796 0.936005 0.799438 -0.969574 0.938843 0.803009 -0.984009 0.941467 0.806366 -0.265106 0.842743 0.667206 -0.289551 0.847961 0.673126 -0.314270 0.853088 0.679047 -0.339142 0.858002 0.684692 -0.364288 0.862946 0.690491 -0.389465 0.867859 0.696198 -0.414459 0.872559 0.701691 -0.439484 0.877289 0.707306 -0.464325 0.881927 0.712830 -0.489502 0.886322 0.718079 -0.515320 0.890778 0.723419 -0.541504 0.895111 0.728577 -0.568207 0.899323 0.733734 -0.595032 0.903503 0.738831 -0.621765 0.907471 0.743713 -0.648468 0.911407 0.748596 -0.674957 0.915344 0.753448 -0.700775 0.919006 0.758057 -0.726349 0.922668 0.762665 -0.751282 0.926270 0.767181 -0.775543 0.929657 0.771515 -0.799286 0.933014 0.775818 -0.822327 0.936310 0.780029 -0.844482 0.939392 0.784088 -0.865936 0.942444 0.788116 -0.886414 0.945374 0.791901 -0.906067 0.948212 0.795685 -0.924683 0.950989 0.799347 -0.942200 0.953552 0.802795 -0.958649 0.956146 0.806244 -0.973907 0.958588 0.809631 -0.987823 0.960876 0.812744 -0.275299 0.871185 0.678802 -0.299835 0.876099 0.684570 -0.324646 0.880890 0.690369 -0.349518 0.885468 0.695923 -0.374634 0.890137 0.701569 -0.399719 0.894684 0.707153 -0.424591 0.899048 0.712494 -0.449463 0.903442 0.717957 -0.474274 0.907745 0.723267 -0.499634 0.911804 0.728424 -0.525574 0.915894 0.733582 -0.551788 0.919830 0.738556 -0.578400 0.923737 0.743561 -0.605194 0.927521 0.748474 -0.631775 0.931122 0.753174 -0.658264 0.934784 0.757935 -0.684418 0.938263 0.762543 -0.710052 0.941620 0.766968 -0.735168 0.944885 0.771393 -0.759827 0.948120 0.775726 -0.783752 0.951111 0.779846 -0.807159 0.954132 0.784027 -0.829712 0.956970 0.787933 -0.851501 0.959778 0.791779 -0.872559 0.962463 0.795593 -0.892609 0.965057 0.799164 -0.911804 0.967529 0.802734 -0.929993 0.969940 0.806183 -0.947083 0.972168 0.809448 -0.963043 0.974365 0.812683 -0.977875 0.976501 0.815735 -0.991364 0.978424 0.818634 -0.285461 0.898071 0.690063 -0.310028 0.902588 0.695709 -0.334869 0.907104 0.701447 -0.359741 0.911316 0.706879 -0.384766 0.915649 0.712372 -0.409821 0.919861 0.717804 -0.434509 0.923859 0.723022 -0.459229 0.927887 0.728271 -0.484039 0.931671 0.733368 -0.509552 0.935516 0.738434 -0.535583 0.939240 0.743469 -0.561859 0.942780 0.748291 -0.588409 0.946289 0.753082 -0.615051 0.949738 0.757843 -0.641449 0.953003 0.762299 -0.667725 0.956207 0.766846 -0.693573 0.959351 0.771301 -0.718872 0.962280 0.775513 -0.743744 0.965240 0.779755 -0.768036 0.968079 0.783936 -0.791595 0.970764 0.787811 -0.814575 0.973358 0.791718 -0.836761 0.975861 0.795410 -0.858154 0.978302 0.799072 -0.878815 0.980652 0.802673 -0.898407 0.982819 0.806000 -0.917206 0.984985 0.809357 -0.934906 0.987000 0.812561 -0.951569 0.988953 0.815582 -0.967102 0.990784 0.818573 -0.981415 0.992554 0.821411 -0.994537 0.994202 0.824036 -0.047546 0.045074 0.389252 -0.060638 0.046631 0.392548 -0.074158 0.048218 0.395844 -0.088623 0.049927 0.399384 -0.104248 0.051666 0.402954 -0.121094 0.053436 0.406525 -0.139130 0.055328 0.410370 -0.158203 0.057281 0.414246 -0.178162 0.059204 0.418121 -0.199066 0.061310 0.422241 -0.220703 0.063446 0.426422 -0.242920 0.065582 0.430481 -0.265839 0.067871 0.434845 -0.289093 0.070160 0.439148 -0.312927 0.072571 0.443634 -0.337097 0.075073 0.448212 -0.361450 0.077576 0.452759 -0.386078 0.080200 0.457458 -0.410736 0.082916 0.462280 -0.435303 0.085663 0.467072 -0.459839 0.088562 0.472107 -0.484833 0.091522 0.477203 -0.510437 0.094513 0.482239 -0.536804 0.097687 0.487518 -0.563477 0.100861 0.492798 -0.590668 0.104187 0.498230 -0.618042 0.107635 0.503754 -0.645203 0.111053 0.509216 -0.672394 0.114685 0.514893 -0.699249 0.118378 0.520630 -0.725555 0.122040 0.526337 -0.751617 0.125946 0.532166 -0.051178 0.057922 0.395782 -0.064484 0.059692 0.399261 -0.078339 0.061462 0.402740 -0.093201 0.063385 0.406403 -0.109375 0.065338 0.410248 -0.126678 0.067352 0.414062 -0.145203 0.069427 0.417999 -0.164734 0.071594 0.422119 -0.185089 0.073792 0.426208 -0.206390 0.076141 0.430420 -0.228271 0.078461 0.434631 -0.250946 0.080963 0.439056 -0.274200 0.083557 0.443512 -0.297729 0.086121 0.447968 -0.321838 0.088867 0.452606 -0.346252 0.091675 0.457306 -0.370758 0.094513 0.462036 -0.395508 0.097534 0.466919 -0.420288 0.100677 0.471954 -0.444855 0.103760 0.476929 -0.469574 0.107025 0.482117 -0.494995 0.110443 0.487396 -0.520935 0.113831 0.492676 -0.547668 0.117371 0.498077 -0.574554 0.120941 0.503479 -0.601868 0.124664 0.509094 -0.629303 0.128479 0.514740 -0.656525 0.132263 0.520416 -0.683655 0.136261 0.526215 -0.710419 0.140320 0.532013 -0.736633 0.144348 0.537811 -0.762543 0.148590 0.543793 -0.055084 0.071808 0.402649 -0.068634 0.073792 0.406342 -0.082825 0.075836 0.410065 -0.098206 0.078003 0.413971 -0.114899 0.080200 0.417908 -0.132721 0.082489 0.421875 -0.151642 0.084869 0.426117 -0.171631 0.087341 0.430328 -0.192444 0.089844 0.434540 -0.214050 0.092529 0.438934 -0.236359 0.095215 0.443298 -0.259308 0.098022 0.447815 -0.282867 0.100983 0.452484 -0.306702 0.103943 0.457062 -0.331024 0.107025 0.461884 -0.355682 0.110291 0.466797 -0.380310 0.113495 0.471710 -0.405151 0.116882 0.476776 -0.430054 0.120392 0.482025 -0.454681 0.123901 0.487183 -0.479736 0.127533 0.492554 -0.505341 0.131226 0.497803 -0.531799 0.135071 0.503357 -0.558655 0.139008 0.508942 -0.585785 0.142914 0.514465 -0.613251 0.147003 0.520233 -0.640808 0.151154 0.526062 -0.667999 0.155273 0.531738 -0.695068 0.159637 0.537628 -0.721680 0.164032 0.543671 -0.747711 0.168396 0.549530 -0.773376 0.172882 0.555603 -0.059265 0.087036 0.409943 -0.073059 0.089355 0.413849 -0.087677 0.091644 0.417725 -0.103577 0.094147 0.421783 -0.120789 0.096710 0.425964 -0.139038 0.099304 0.430084 -0.158539 0.102051 0.434387 -0.178955 0.104889 0.438843 -0.200104 0.107788 0.443176 -0.222168 0.110809 0.447754 -0.244751 0.113892 0.452240 -0.268036 0.117096 0.456970 -0.291901 0.120392 0.461792 -0.315948 0.123749 0.466583 -0.340515 0.127258 0.471619 -0.365265 0.130859 0.476654 -0.390106 0.134430 0.481750 -0.415039 0.138214 0.487030 -0.440033 0.142029 0.492401 -0.464691 0.145905 0.497650 -0.490112 0.149933 0.503204 -0.516113 0.153961 0.508667 -0.542816 0.158112 0.514313 -0.569977 0.162384 0.520081 -0.597290 0.166595 0.525726 -0.624817 0.171051 0.531586 -0.652405 0.175537 0.537506 -0.679474 0.179962 0.543396 -0.706421 0.184601 0.549377 -0.732941 0.189240 0.555420 -0.758820 0.193909 0.561371 -0.784271 0.198730 0.567566 -0.063660 0.103973 0.417633 -0.077789 0.106659 0.421692 -0.092896 0.109344 0.425751 -0.109283 0.112152 0.429993 -0.127075 0.115112 0.434296 -0.145813 0.118042 0.438629 -0.165771 0.121155 0.443054 -0.186493 0.124329 0.447510 -0.208191 0.127655 0.452148 -0.230591 0.131042 0.456879 -0.253510 0.134460 0.461548 -0.277100 0.138062 0.466461 -0.301147 0.141693 0.471466 -0.325531 0.145386 0.476440 -0.350250 0.149231 0.481598 -0.375183 0.153168 0.486908 -0.400116 0.157135 0.492157 -0.425110 0.161224 0.497559 -0.450012 0.165314 0.502930 -0.475067 0.169586 0.508514 -0.500824 0.173950 0.514191 -0.527161 0.178284 0.519806 -0.554138 0.182739 0.525604 -0.581512 0.187317 0.531433 -0.608948 0.191864 0.537201 -0.636536 0.196533 0.543213 -0.664062 0.201324 0.549225 -0.691040 0.206055 0.555145 -0.717834 0.210938 0.561218 -0.744049 0.215790 0.567230 -0.769867 0.220764 0.573456 -0.795044 0.225800 0.579651 -0.068329 0.122803 0.425659 -0.082855 0.125854 0.429840 -0.098450 0.128845 0.434082 -0.115448 0.132080 0.438477 -0.133698 0.135315 0.442932 -0.152924 0.138672 0.447388 -0.173309 0.142151 0.451996 -0.194489 0.145630 0.456573 -0.216553 0.149261 0.461456 -0.239288 0.153015 0.466309 -0.262573 0.156799 0.471191 -0.286469 0.160706 0.476288 -0.310730 0.164734 0.481476 -0.335297 0.168732 0.486633 -0.360229 0.172913 0.492004 -0.385315 0.177185 0.497437 -0.410339 0.181458 0.502838 -0.435425 0.185852 0.508362 -0.460266 0.190216 0.513885 -0.485687 0.194794 0.519684 -0.511810 0.199432 0.525452 -0.538452 0.204071 0.531158 -0.565674 0.208832 0.537079 -0.593140 0.213715 0.543060 -0.620636 0.218445 0.548920 -0.648285 0.223419 0.554993 -0.675720 0.228424 0.561096 -0.702606 0.233368 0.567139 -0.729279 0.238495 0.573273 -0.755249 0.243530 0.579376 -0.780853 0.248749 0.585571 -0.805847 0.253967 0.591797 -0.073273 0.143463 0.433990 -0.088226 0.146790 0.438385 -0.104370 0.150146 0.442719 -0.121948 0.153717 0.447266 -0.140625 0.157227 0.451813 -0.160461 0.160980 0.456451 -0.181274 0.164764 0.461304 -0.202820 0.168579 0.466034 -0.225250 0.172577 0.471069 -0.248383 0.176636 0.476166 -0.271912 0.180695 0.481232 -0.296051 0.184967 0.486481 -0.320618 0.189301 0.491852 -0.345398 0.193634 0.497162 -0.370453 0.198090 0.502686 -0.395447 0.202545 0.508118 -0.420685 0.207153 0.513733 -0.445801 0.211884 0.519531 -0.470795 0.216522 0.525146 -0.496582 0.221344 0.531006 -0.523102 0.226257 0.536926 -0.549957 0.231140 0.542786 -0.577362 0.236115 0.548767 -0.604980 0.241211 0.554840 -0.632538 0.246216 0.560791 -0.660126 0.251434 0.566956 -0.687286 0.256500 0.572998 -0.714233 0.261780 0.579193 -0.740662 0.267090 0.585419 -0.766449 0.272278 0.591522 -0.791748 0.277679 0.597778 -0.816437 0.283081 0.604034 -0.078461 0.165710 0.442627 -0.093964 0.169342 0.447174 -0.110718 0.173004 0.451660 -0.128784 0.176880 0.456360 -0.147980 0.180756 0.461029 -0.168243 0.184784 0.465942 -0.189545 0.188934 0.470917 -0.211426 0.193054 0.475922 -0.234314 0.197327 0.481110 -0.257721 0.201752 0.486328 -0.281525 0.206085 0.491577 -0.305969 0.210602 0.497009 -0.330750 0.215210 0.502533 -0.355652 0.219818 0.507996 -0.380768 0.224548 0.513611 -0.405914 0.229309 0.519226 -0.431183 0.234131 0.525024 -0.456299 0.239136 0.530853 -0.481567 0.244019 0.536621 -0.507721 0.249084 0.542572 -0.534515 0.254211 0.548615 -0.561584 0.259277 0.554535 -0.589203 0.264496 0.560638 -0.616882 0.269806 0.566803 -0.644470 0.274933 0.572815 -0.671967 0.280365 0.579010 -0.698944 0.285583 0.585083 -0.725708 0.291046 0.591339 -0.752014 0.296509 0.597626 -0.777496 0.301849 0.603760 -0.802582 0.307373 0.610016 -0.826904 0.312897 0.616302 -0.084045 0.189423 0.451569 -0.099976 0.193329 0.456116 -0.117371 0.197388 0.460938 -0.136017 0.201569 0.465790 -0.155701 0.205719 0.470703 -0.176453 0.210083 0.475769 -0.198120 0.214478 0.480988 -0.220428 0.218872 0.486084 -0.243591 0.223450 0.491455 -0.267303 0.228119 0.496887 -0.291382 0.232727 0.502258 -0.316040 0.237518 0.507843 -0.340912 0.242279 0.513367 -0.366058 0.247192 0.519073 -0.391357 0.252228 0.524872 -0.416534 0.257141 0.530548 -0.441803 0.262238 0.536499 -0.467010 0.267456 0.542450 -0.492645 0.272552 0.548309 -0.519104 0.277802 0.554382 -0.546173 0.283142 0.560486 -0.573425 0.288361 0.566498 -0.601074 0.293793 0.572662 -0.628876 0.299194 0.578827 -0.656403 0.304565 0.584930 -0.683807 0.310059 0.591187 -0.710632 0.315430 0.597290 -0.737213 0.321014 0.603577 -0.763214 0.326599 0.609863 -0.788483 0.332031 0.615997 -0.813263 0.337646 0.622284 -0.837280 0.343292 0.628540 -0.089966 0.214539 0.460815 -0.106506 0.218719 0.465546 -0.124451 0.223114 0.470551 -0.143616 0.227570 0.475647 -0.163727 0.231964 0.480682 -0.184937 0.236572 0.485992 -0.207031 0.241272 0.491302 -0.229767 0.245911 0.496582 -0.253143 0.250763 0.502136 -0.277191 0.255646 0.507690 -0.301514 0.260498 0.513214 -0.326416 0.265503 0.518951 -0.351410 0.270477 0.524597 -0.376678 0.275635 0.530426 -0.402039 0.280853 0.536346 -0.427246 0.285980 0.542175 -0.452484 0.291290 0.548157 -0.477905 0.296661 0.554230 -0.503906 0.301910 0.560181 -0.530670 0.307343 0.566345 -0.557953 0.312836 0.572510 -0.585358 0.318176 0.578552 -0.613159 0.323730 0.584747 -0.640747 0.329163 0.590820 -0.668335 0.334747 0.597107 -0.695618 0.340363 0.603394 -0.722229 0.345856 0.609528 -0.748596 0.351532 0.615845 -0.774414 0.357117 0.622070 -0.799347 0.362640 0.628174 -0.823792 0.368286 0.634491 -0.847382 0.373962 0.640686 -0.096191 0.240906 0.470428 -0.113312 0.245361 0.475372 -0.131836 0.250000 0.480591 -0.151489 0.254700 0.485840 -0.172089 0.259338 0.491028 -0.193756 0.264221 0.496429 -0.216217 0.269165 0.502014 -0.239258 0.273987 0.507416 -0.263031 0.279053 0.513092 -0.287170 0.284027 0.518646 -0.311859 0.289185 0.524414 -0.336884 0.294434 0.530273 -0.362061 0.299622 0.536041 -0.387390 0.304962 0.542023 -0.412842 0.310333 0.548004 -0.438019 0.315582 0.553925 -0.463348 0.321075 0.560028 -0.489044 0.326569 0.566162 -0.515381 0.331970 0.572235 -0.542419 0.337555 0.578400 -0.569855 0.343140 0.584595 -0.597382 0.348602 0.590698 -0.625183 0.354248 0.596954 -0.652740 0.359741 0.603058 -0.680237 0.365387 0.609375 -0.707306 0.371033 0.615631 -0.733765 0.376617 0.621796 -0.759827 0.382263 0.628021 -0.785370 0.387939 0.634338 -0.810059 0.393494 0.640381 -0.834137 0.399139 0.646606 -0.857391 0.404755 0.652802 -0.102783 0.268372 0.480438 -0.120483 0.273041 0.485535 -0.139587 0.277893 0.490906 -0.159729 0.282837 0.496307 -0.180786 0.287689 0.501709 -0.202881 0.292786 0.507263 -0.225677 0.297882 0.512878 -0.249054 0.302979 0.518494 -0.273102 0.308197 0.524261 -0.297485 0.313354 0.529968 -0.322388 0.318726 0.535889 -0.347595 0.324158 0.541870 -0.372833 0.329407 0.547699 -0.398254 0.334900 0.553772 -0.423706 0.340393 0.559845 -0.448914 0.345825 0.565887 -0.474274 0.351440 0.572021 -0.500397 0.357025 0.578247 -0.527039 0.362518 0.584320 -0.554260 0.368164 0.590546 -0.581726 0.373688 0.596680 -0.609497 0.379364 0.602936 -0.637268 0.385010 0.609222 -0.664764 0.390594 0.615326 -0.692017 0.396271 0.621613 -0.718933 0.401978 0.627899 -0.745178 0.407501 0.634003 -0.770996 0.413177 0.640228 -0.796143 0.418823 0.646484 -0.820557 0.424316 0.652496 -0.844269 0.429993 0.658630 -0.866974 0.435425 0.664642 -0.109772 0.296753 0.490753 -0.128052 0.301636 0.496033 -0.147644 0.306702 0.501556 -0.168304 0.311829 0.507141 -0.189819 0.316895 0.512634 -0.212280 0.322144 0.518341 -0.235291 0.327301 0.523987 -0.259064 0.332672 0.529816 -0.283386 0.338104 0.535767 -0.307983 0.343384 0.541565 -0.333069 0.348846 0.547577 -0.358398 0.354401 0.553650 -0.383728 0.359802 0.559601 -0.409180 0.365356 0.565704 -0.434631 0.370972 0.571869 -0.459808 0.376526 0.577942 -0.485504 0.382141 0.584198 -0.511932 0.387756 0.590393 -0.538788 0.393372 0.596527 -0.566223 0.399017 0.602783 -0.593811 0.404602 0.608887 -0.621582 0.410278 0.615173 -0.649323 0.415985 0.621460 -0.676666 0.421509 0.627594 -0.703796 0.427216 0.633820 -0.730438 0.432861 0.640076 -0.756439 0.438385 0.646149 -0.781952 0.444092 0.652374 -0.806824 0.449799 0.658508 -0.830841 0.455414 0.664490 -0.854187 0.461182 0.670532 -0.876434 0.466858 0.676453 -0.117065 0.325928 0.501434 -0.135956 0.330963 0.506836 -0.156036 0.336212 0.512482 -0.177185 0.341492 0.518219 -0.199097 0.346741 0.523865 -0.221924 0.352142 0.529663 -0.245270 0.357422 0.535431 -0.269287 0.362915 0.541412 -0.293884 0.368439 0.547424 -0.318665 0.373840 0.553284 -0.343903 0.379425 0.559448 -0.369354 0.385010 0.565582 -0.394684 0.390472 0.571564 -0.420227 0.396179 0.577789 -0.445587 0.401825 0.583984 -0.470825 0.407379 0.590088 -0.496948 0.412994 0.596375 -0.523499 0.418549 0.602478 -0.550659 0.424286 0.608734 -0.578217 0.429993 0.615021 -0.605835 0.435486 0.621155 -0.633667 0.441254 0.627441 -0.661316 0.446991 0.633667 -0.688507 0.452667 0.639771 -0.715393 0.458435 0.645996 -0.741821 0.464294 0.652191 -0.767548 0.470032 0.658203 -0.792755 0.475952 0.664307 -0.817139 0.481720 0.670258 -0.840942 0.487610 0.676300 -0.863831 0.493530 0.682312 -0.885681 0.499329 0.688110 -0.124756 0.355713 0.512329 -0.144165 0.360901 0.517944 -0.164734 0.366302 0.523712 -0.186188 0.371582 0.529358 -0.208588 0.377045 0.535309 -0.231720 0.382538 0.541229 -0.255402 0.387939 0.547089 -0.279755 0.393494 0.553131 -0.304474 0.399109 0.559296 -0.329498 0.404602 0.565277 -0.354889 0.410217 0.571411 -0.380341 0.415863 0.577637 -0.405762 0.421387 0.583710 -0.431274 0.427063 0.589935 -0.456451 0.432587 0.596039 -0.482086 0.438263 0.602325 -0.508453 0.444000 0.608582 -0.535187 0.449677 0.614716 -0.562622 0.455505 0.621002 -0.590302 0.461395 0.627289 -0.617981 0.467163 0.633362 -0.645691 0.473114 0.639618 -0.673218 0.479065 0.645844 -0.700195 0.484924 0.651886 -0.726898 0.490875 0.658020 -0.753052 0.496979 0.664154 -0.778412 0.502838 0.670074 -0.803314 0.508881 0.676147 -0.827393 0.514740 0.681946 -0.850739 0.520752 0.687927 -0.873230 0.526825 0.693817 -0.894653 0.532654 0.699493 -0.132751 0.385925 0.523560 -0.152649 0.391266 0.529236 -0.173676 0.396729 0.535156 -0.195587 0.402100 0.540955 -0.218353 0.407623 0.546936 -0.241821 0.413208 0.553009 -0.265808 0.418640 0.558960 -0.290344 0.424255 0.565094 -0.315308 0.429901 0.571289 -0.340454 0.435394 0.577332 -0.365845 0.441101 0.583496 -0.391449 0.446869 0.589752 -0.416840 0.452484 0.595856 -0.442291 0.458344 0.602112 -0.467499 0.464111 0.608307 -0.493469 0.470032 0.614532 -0.520142 0.476074 0.620880 -0.547119 0.481934 0.626984 -0.574615 0.487976 0.633240 -0.602356 0.494049 0.639465 -0.629974 0.499969 0.645508 -0.657623 0.506104 0.651672 -0.684937 0.512177 0.657898 -0.711731 0.518188 0.663879 -0.738159 0.524353 0.669952 -0.763885 0.530304 0.675842 -0.789154 0.536438 0.681854 -0.813690 0.542542 0.687775 -0.837372 0.548492 0.693542 -0.860260 0.554565 0.699371 -0.882385 0.560638 0.705139 -0.903320 0.566498 0.710663 -0.141083 0.416443 0.535004 -0.161438 0.421814 0.540802 -0.182922 0.427338 0.546814 -0.205200 0.432739 0.552704 -0.228302 0.438354 0.558807 -0.252136 0.444031 0.564941 -0.276306 0.449615 0.570953 -0.301056 0.455383 0.577118 -0.326202 0.461243 0.583374 -0.351471 0.467041 0.589447 -0.376953 0.472992 0.595703 -0.402527 0.478973 0.601959 -0.427887 0.484833 0.608124 -0.453308 0.490906 0.614410 -0.478668 0.496918 0.620544 -0.504974 0.503052 0.626831 -0.531891 0.509216 0.633057 -0.558990 0.515198 0.639130 -0.586639 0.521423 0.645386 -0.614349 0.527679 0.651550 -0.641968 0.533691 0.657623 -0.669464 0.539917 0.663757 -0.696533 0.546173 0.669800 -0.723114 0.552216 0.675690 -0.749207 0.558441 0.681671 -0.774780 0.564545 0.687653 -0.799591 0.570587 0.693420 -0.823792 0.576721 0.699219 -0.847046 0.582703 0.704865 -0.869598 0.588745 0.710541 -0.891174 0.594757 0.716217 -0.911652 0.600555 0.721619 -0.149658 0.447144 0.546661 -0.170532 0.452728 0.552521 -0.192444 0.458435 0.558655 -0.215057 0.464111 0.564636 -0.238525 0.470001 0.570801 -0.262573 0.475952 0.576996 -0.286987 0.481750 0.583038 -0.311920 0.487793 0.589325 -0.337219 0.493896 0.595581 -0.362518 0.499817 0.601685 -0.388062 0.506012 0.607971 -0.413666 0.512177 0.614288 -0.438995 0.518280 0.620392 -0.464294 0.524536 0.626648 -0.490021 0.530670 0.632751 -0.516541 0.536926 0.639038 -0.543610 0.543213 0.645203 -0.570862 0.549316 0.651245 -0.598602 0.555634 0.657440 -0.626312 0.561920 0.663544 -0.653778 0.568054 0.669464 -0.681061 0.574341 0.675537 -0.707977 0.580536 0.681549 -0.734283 0.586639 0.687347 -0.760132 0.592834 0.693268 -0.785248 0.598846 0.698944 -0.809814 0.604950 0.704742 -0.833618 0.611023 0.710419 -0.856476 0.616882 0.715942 -0.878571 0.622864 0.721527 -0.899719 0.628784 0.727020 -0.919708 0.634491 0.732330 -0.158386 0.478912 0.558350 -0.179871 0.484833 0.564484 -0.202148 0.490845 0.570648 -0.225098 0.496765 0.576660 -0.248871 0.502899 0.582886 -0.273163 0.509064 0.589111 -0.297760 0.515076 0.595245 -0.322876 0.521271 0.601593 -0.348267 0.527588 0.607849 -0.373627 0.533691 0.613983 -0.399200 0.539978 0.620239 -0.424591 0.546204 0.626373 -0.450012 0.552521 0.632629 -0.475433 0.558868 0.638855 -0.501434 0.565094 0.644928 -0.528168 0.571411 0.651093 -0.555450 0.577759 0.657288 -0.582794 0.583923 0.663269 -0.610504 0.590271 0.669373 -0.638153 0.596558 0.675415 -0.665497 0.602692 0.681244 -0.692566 0.608948 0.687195 -0.719208 0.615112 0.693146 -0.745239 0.621094 0.698822 -0.770782 0.627228 0.704620 -0.795502 0.633148 0.710144 -0.819794 0.639130 0.715790 -0.843170 0.645142 0.721375 -0.865631 0.650848 0.726776 -0.887299 0.656677 0.732208 -0.907928 0.662445 0.737549 -0.927399 0.667999 0.742737 -0.167542 0.511963 0.570312 -0.189362 0.518158 0.576508 -0.212097 0.524384 0.582764 -0.235321 0.530457 0.588806 -0.259308 0.536774 0.595093 -0.283875 0.543091 0.601410 -0.308655 0.549225 0.607513 -0.333862 0.555634 0.613831 -0.359314 0.561981 0.620056 -0.384735 0.568237 0.626160 -0.410278 0.574615 0.632477 -0.435669 0.580872 0.638550 -0.460938 0.587189 0.644806 -0.486694 0.593658 0.650970 -0.512878 0.599854 0.656921 -0.539856 0.606201 0.663055 -0.567230 0.612549 0.669189 -0.594604 0.618713 0.675140 -0.622314 0.624939 0.681061 -0.649841 0.631165 0.687042 -0.676941 0.637207 0.692810 -0.703827 0.643402 0.698639 -0.730042 0.649323 0.704315 -0.755920 0.655365 0.709991 -0.781158 0.661346 0.715637 -0.805603 0.667114 0.721100 -0.829376 0.672943 0.726624 -0.852417 0.678741 0.732086 -0.874420 0.684265 0.737274 -0.895630 0.689850 0.742584 -0.915771 0.695374 0.747772 -0.934723 0.700745 0.752808 -0.176880 0.546021 0.582428 -0.199127 0.552338 0.588684 -0.222137 0.558716 0.594940 -0.245697 0.564941 0.601044 -0.269928 0.571350 0.607361 -0.294647 0.577728 0.613617 -0.319550 0.583984 0.619781 -0.344940 0.590454 0.626007 -0.370331 0.596710 0.632172 -0.395844 0.603149 0.638397 -0.421387 0.609558 0.644653 -0.446625 0.615814 0.650696 -0.471954 0.622192 0.656799 -0.497955 0.628510 0.662933 -0.524414 0.634705 0.668915 -0.551483 0.640930 0.674927 -0.578949 0.647186 0.680939 -0.606384 0.653229 0.686737 -0.633972 0.659393 0.692627 -0.661377 0.665497 0.698486 -0.688232 0.671387 0.704163 -0.714844 0.677368 0.709869 -0.740845 0.683105 0.715363 -0.766388 0.688995 0.720978 -0.791229 0.694763 0.726471 -0.815338 0.700317 0.731812 -0.838715 0.705933 0.737152 -0.861328 0.711456 0.742432 -0.882904 0.716797 0.747528 -0.903625 0.722198 0.752686 -0.923248 0.727478 0.757690 -0.941711 0.732574 0.762512 -0.186401 0.580688 0.594666 -0.208984 0.587097 0.600922 -0.232330 0.593536 0.607208 -0.256165 0.599854 0.613312 -0.280640 0.606262 0.619598 -0.305481 0.612732 0.625885 -0.330566 0.618988 0.631989 -0.355988 0.625427 0.638275 -0.381378 0.631653 0.644287 -0.406921 0.638062 0.650513 -0.432312 0.644409 0.656677 -0.457489 0.650543 0.662628 -0.483032 0.656830 0.668701 -0.509247 0.663055 0.674774 -0.535919 0.669128 0.680664 -0.563141 0.675262 0.686584 -0.590607 0.681335 0.692505 -0.618042 0.687225 0.698181 -0.645447 0.693207 0.703979 -0.672516 0.698944 0.709595 -0.699371 0.704865 0.715240 -0.725647 0.710602 0.720795 -0.751343 0.716187 0.726227 -0.776520 0.721771 0.731628 -0.801056 0.727325 0.737000 -0.824799 0.732666 0.742188 -0.847778 0.738068 0.747406 -0.869934 0.743378 0.752563 -0.891113 0.748474 0.757446 -0.911316 0.753540 0.762390 -0.930328 0.758423 0.767090 -0.948364 0.763397 0.771881 -0.196136 0.615692 0.606873 -0.219116 0.622131 0.613159 -0.242676 0.628571 0.619446 -0.266754 0.634827 0.625580 -0.291382 0.641205 0.631805 -0.316254 0.647491 0.637939 -0.341553 0.653870 0.644165 -0.367004 0.660217 0.650360 -0.392395 0.666382 0.656403 -0.417847 0.672638 0.662445 -0.443207 0.678833 0.668579 -0.468353 0.684875 0.674500 -0.494141 0.690979 0.680511 -0.520630 0.697021 0.686462 -0.547424 0.702942 0.692230 -0.574646 0.708862 0.698059 -0.602142 0.714752 0.703857 -0.629456 0.720459 0.709442 -0.656708 0.726196 0.715057 -0.683624 0.731812 0.720520 -0.710175 0.737366 0.726074 -0.736206 0.742920 0.731506 -0.761536 0.748260 0.736755 -0.786407 0.753632 0.742065 -0.810577 0.758942 0.747253 -0.833893 0.764008 0.752258 -0.856476 0.769135 0.757324 -0.878204 0.774170 0.762238 -0.898865 0.778961 0.766968 -0.918610 0.783813 0.771759 -0.937164 0.788452 0.776367 -0.954651 0.793091 0.780914 -0.206024 0.650574 0.619141 -0.229309 0.657043 0.625427 -0.253143 0.663391 0.631653 -0.277374 0.669586 0.637787 -0.302185 0.675873 0.643982 -0.327179 0.681976 0.650055 -0.352539 0.688202 0.656219 -0.378021 0.694397 0.662292 -0.403351 0.700409 0.668304 -0.428741 0.706543 0.674347 -0.454010 0.712585 0.680328 -0.479218 0.718384 0.686127 -0.505280 0.724365 0.692047 -0.531921 0.730225 0.697906 -0.558777 0.735870 0.703583 -0.586121 0.741608 0.709320 -0.613342 0.747192 0.714813 -0.640717 0.752777 0.720398 -0.667877 0.758301 0.725922 -0.694458 0.763611 0.731262 -0.720673 0.768951 0.736633 -0.746429 0.774261 0.741913 -0.771484 0.779297 0.747040 -0.795990 0.784454 0.752136 -0.819794 0.789490 0.757172 -0.842651 0.794312 0.761993 -0.864838 0.799103 0.766876 -0.886017 0.803741 0.771545 -0.906342 0.808350 0.776276 -0.925568 0.812927 0.780823 -0.943604 0.817230 0.785156 -0.960541 0.821594 0.789581 -0.216034 0.685120 0.631348 -0.239594 0.691406 0.637573 -0.263672 0.697632 0.643829 -0.288086 0.703674 0.649872 -0.313019 0.709869 0.656067 -0.338104 0.715820 0.662079 -0.363495 0.721924 0.668121 -0.388916 0.727844 0.674164 -0.414185 0.733704 0.680023 -0.439484 0.739655 0.686005 -0.464600 0.745514 0.691895 -0.490112 0.751099 0.697632 -0.516357 0.756836 0.703430 -0.542938 0.762329 0.709045 -0.570068 0.767914 0.714661 -0.597351 0.773407 0.720276 -0.624573 0.778687 0.725647 -0.651764 0.784027 0.731110 -0.678650 0.789307 0.736511 -0.704987 0.794342 0.741638 -0.730988 0.799438 0.746918 -0.756378 0.804443 0.752045 -0.781067 0.809265 0.756958 -0.805206 0.814087 0.761902 -0.828583 0.818787 0.766754 -0.851135 0.823273 0.771393 -0.872833 0.827820 0.776123 -0.893524 0.832184 0.780609 -0.913391 0.836487 0.785065 -0.932190 0.840729 0.789429 -0.949707 0.844757 0.793640 -0.966125 0.848785 0.797821 -0.226196 0.719025 0.643494 -0.249939 0.725098 0.649719 -0.274109 0.731018 0.655762 -0.298767 0.737030 0.661926 -0.323822 0.742981 0.667999 -0.348938 0.748810 0.673889 -0.374298 0.754700 0.679901 -0.399719 0.760468 0.685852 -0.424896 0.766052 0.691589 -0.450073 0.771729 0.697479 -0.475281 0.777344 0.703308 -0.500977 0.782745 0.708893 -0.527374 0.788269 0.714508 -0.554077 0.793488 0.720001 -0.581207 0.798798 0.725525 -0.608429 0.804047 0.730988 -0.635559 0.809082 0.736206 -0.662506 0.814148 0.741516 -0.689148 0.819092 0.746735 -0.715240 0.823883 0.751770 -0.740875 0.828644 0.756836 -0.765961 0.833374 0.761780 -0.790314 0.837860 0.766510 -0.814087 0.842377 0.771301 -0.836945 0.846680 0.775848 -0.859161 0.851013 0.780518 -0.880463 0.855225 0.784973 -0.900726 0.859222 0.789215 -0.920105 0.863220 0.793549 -0.938354 0.867126 0.797729 -0.955414 0.870850 0.801727 -0.971344 0.874542 0.805664 -0.236359 0.752045 0.655609 -0.260315 0.757965 0.661713 -0.284668 0.763672 0.667694 -0.309448 0.769501 0.673737 -0.334564 0.775269 0.679749 -0.359711 0.780762 0.685547 -0.385071 0.786438 0.691467 -0.410400 0.791992 0.697327 -0.435516 0.797363 0.703003 -0.460541 0.802765 0.708740 -0.485901 0.808136 0.714417 -0.511810 0.813293 0.719910 -0.538300 0.818481 0.725372 -0.565063 0.823486 0.730713 -0.592194 0.828491 0.736115 -0.619354 0.833435 0.741425 -0.646271 0.838165 0.746460 -0.673035 0.842926 0.751617 -0.699402 0.847565 0.756683 -0.725159 0.852112 0.761536 -0.750519 0.856567 0.766418 -0.775269 0.860962 0.771210 -0.799194 0.865143 0.775757 -0.822601 0.869263 0.780365 -0.845093 0.873260 0.784760 -0.866882 0.877289 0.789124 -0.887726 0.881165 0.793396 -0.907562 0.884827 0.797546 -0.926422 0.888458 0.801636 -0.944214 0.892059 0.805573 -0.960785 0.895416 0.809357 -0.976166 0.898773 0.813141 -0.246582 0.784088 0.667542 -0.270782 0.789825 0.673553 -0.295197 0.795288 0.679443 -0.320099 0.800873 0.685425 -0.345245 0.806396 0.691315 -0.370422 0.811707 0.697021 -0.395691 0.817078 0.702820 -0.420929 0.822418 0.708557 -0.445862 0.827515 0.714142 -0.470856 0.832642 0.719727 -0.496338 0.837524 0.725128 -0.522491 0.842529 0.730591 -0.549133 0.847412 0.735962 -0.575867 0.852142 0.741119 -0.602966 0.856812 0.746338 -0.629974 0.861481 0.751495 -0.656677 0.865845 0.756439 -0.683258 0.870300 0.761444 -0.709320 0.874664 0.766296 -0.734772 0.878815 0.770935 -0.759766 0.882996 0.775604 -0.784027 0.886902 0.780090 -0.807739 0.890808 0.784607 -0.830750 0.894684 0.789032 -0.852844 0.898315 0.793213 -0.874146 0.901978 0.797455 -0.894623 0.905518 0.801514 -0.913940 0.908844 0.805420 -0.932404 0.912201 0.809296 -0.949677 0.915405 0.813049 -0.965759 0.918427 0.816620 -0.980652 0.921478 0.820129 -0.256866 0.815033 0.679291 -0.281158 0.820465 0.685272 -0.305664 0.825745 0.691010 -0.330719 0.831024 0.696899 -0.355865 0.836273 0.702698 -0.380920 0.841339 0.708282 -0.406128 0.846375 0.713989 -0.431305 0.851410 0.719604 -0.456116 0.856201 0.724945 -0.481201 0.861084 0.730438 -0.506805 0.865692 0.735687 -0.533081 0.870331 0.740997 -0.559723 0.874939 0.746216 -0.586487 0.879303 0.751251 -0.613434 0.883698 0.756317 -0.640320 0.887939 0.761322 -0.666870 0.892090 0.766052 -0.693146 0.896179 0.770874 -0.718842 0.900177 0.775482 -0.743988 0.903961 0.779968 -0.768677 0.907776 0.784515 -0.792542 0.911377 0.788788 -0.815918 0.914978 0.793121 -0.838501 0.918488 0.797333 -0.860199 0.921783 0.801300 -0.881134 0.925079 0.805328 -0.901123 0.928284 0.809174 -0.920013 0.931305 0.812866 -0.937958 0.934235 0.816528 -0.954773 0.937103 0.820068 -0.970398 0.939789 0.823425 -0.984772 0.942444 0.826721 -0.267090 0.844757 0.690887 -0.291473 0.849884 0.696747 -0.316132 0.854889 0.702423 -0.341187 0.859924 0.708160 -0.366302 0.864838 0.713806 -0.391327 0.869537 0.719330 -0.416473 0.874298 0.724823 -0.441284 0.878906 0.730164 -0.466125 0.883514 0.735565 -0.491394 0.888000 0.740845 -0.517181 0.892334 0.745941 -0.543488 0.896667 0.751099 -0.570221 0.900940 0.756226 -0.596863 0.904938 0.761047 -0.623688 0.908966 0.765930 -0.650360 0.912933 0.770752 -0.676636 0.916656 0.775299 -0.702576 0.920380 0.779877 -0.728088 0.924042 0.784393 -0.752869 0.927490 0.788696 -0.777191 0.930939 0.793030 -0.800720 0.934174 0.797089 -0.823700 0.937439 0.801208 -0.845886 0.940552 0.805206 -0.867126 0.943512 0.808990 -0.887634 0.946442 0.812775 -0.907196 0.949219 0.816437 -0.925659 0.951935 0.819885 -0.943115 0.954529 0.823303 -0.959442 0.956970 0.826569 -0.974640 0.959412 0.829742 -0.988556 0.961700 0.832855 -0.277252 0.873016 0.702240 -0.301819 0.877869 0.708008 -0.326508 0.882568 0.713531 -0.351501 0.887238 0.719177 -0.376617 0.891846 0.724731 -0.401611 0.896240 0.730011 -0.426514 0.900696 0.735413 -0.451202 0.904938 0.740601 -0.476074 0.909180 0.745819 -0.501526 0.913361 0.751007 -0.527374 0.917328 0.755951 -0.553741 0.921295 0.760895 -0.580353 0.925140 0.765839 -0.606995 0.928833 0.770508 -0.633636 0.932495 0.775208 -0.660126 0.936096 0.779785 -0.686127 0.939484 0.784180 -0.711731 0.942841 0.788574 -0.736755 0.946045 0.792786 -0.761353 0.949188 0.796997 -0.785309 0.952271 0.801117 -0.808533 0.955200 0.804993 -0.831055 0.958038 0.808929 -0.852844 0.960815 0.812683 -0.873718 0.963409 0.816254 -0.893768 0.965973 0.819824 -0.912903 0.968475 0.823212 -0.930908 0.970764 0.826447 -0.947937 0.973022 0.829712 -0.963776 0.975159 0.832703 -0.978516 0.977203 0.835663 -0.991974 0.979187 0.838501 -0.287384 0.899750 0.713409 -0.311981 0.904297 0.719055 -0.336731 0.908630 0.724457 -0.361694 0.912994 0.729889 -0.386597 0.917114 0.735107 -0.411560 0.921295 0.740479 -0.436401 0.925385 0.745728 -0.460907 0.929230 0.750732 -0.485901 0.933105 0.755829 -0.511505 0.936920 0.760803 -0.537384 0.940521 0.765594 -0.563721 0.944122 0.770416 -0.590302 0.947601 0.775085 -0.616760 0.950928 0.779572 -0.643250 0.954224 0.784058 -0.669373 0.957336 0.788361 -0.695160 0.960388 0.792694 -0.720459 0.963409 0.796906 -0.745239 0.966278 0.800903 -0.769470 0.969055 0.804932 -0.793030 0.971741 0.808838 -0.815826 0.974274 0.812469 -0.838043 0.976776 0.816193 -0.859406 0.979187 0.819702 -0.879883 0.981415 0.823059 -0.899475 0.983612 0.826355 -0.918152 0.985779 0.829590 -0.935760 0.987701 0.832642 -0.952393 0.989624 0.835571 -0.967804 0.991425 0.838379 -0.982056 0.993164 0.841095 -0.995087 0.994781 0.843719 -0.048218 0.045654 0.410339 -0.061340 0.047211 0.413544 -0.074921 0.048828 0.416992 -0.089447 0.050568 0.420502 -0.105133 0.052277 0.424042 -0.122131 0.054108 0.427826 -0.140259 0.056061 0.431580 -0.159363 0.057953 0.435425 -0.179474 0.059998 0.439423 -0.200317 0.062042 0.443420 -0.222046 0.064178 0.447632 -0.244415 0.066437 0.451904 -0.267273 0.068695 0.456116 -0.290710 0.071045 0.460632 -0.314606 0.073486 0.465210 -0.338715 0.075928 0.469757 -0.363251 0.078552 0.474548 -0.387817 0.081207 0.479401 -0.412415 0.083893 0.484314 -0.437073 0.086731 0.489349 -0.461578 0.089569 0.494385 -0.486694 0.092590 0.499664 -0.512451 0.095703 0.504944 -0.538727 0.098816 0.510284 -0.565643 0.102112 0.515778 -0.592804 0.105469 0.521301 -0.620026 0.108887 0.526886 -0.647339 0.112427 0.532562 -0.674591 0.116089 0.538330 -0.701233 0.119690 0.544067 -0.727722 0.123474 0.549988 -0.753540 0.127289 0.555786 -0.051941 0.058624 0.416870 -0.065216 0.060364 0.420319 -0.079193 0.062195 0.423950 -0.094147 0.064087 0.427704 -0.110352 0.066040 0.431427 -0.127808 0.068115 0.435333 -0.146362 0.070190 0.439270 -0.165955 0.072418 0.443298 -0.186493 0.074677 0.447510 -0.207764 0.076965 0.451660 -0.229828 0.079407 0.456024 -0.252533 0.081909 0.460541 -0.275696 0.084442 0.464966 -0.299438 0.087128 0.469635 -0.323578 0.089905 0.474426 -0.347900 0.092682 0.479218 -0.372559 0.095642 0.484192 -0.397339 0.098724 0.489227 -0.421997 0.101746 0.494263 -0.446747 0.104950 0.499512 -0.471405 0.108215 0.504700 -0.496918 0.111664 0.510162 -0.523071 0.115143 0.515656 -0.549591 0.118683 0.521027 -0.576691 0.122314 0.526733 -0.604065 0.126099 0.532410 -0.631348 0.129852 0.538025 -0.658722 0.133759 0.543915 -0.685822 0.137787 0.549805 -0.712433 0.141754 0.555603 -0.738800 0.145966 0.561584 -0.764435 0.150055 0.567505 -0.055878 0.072571 0.423889 -0.069397 0.074524 0.427521 -0.083710 0.076599 0.431305 -0.099213 0.078827 0.435211 -0.115906 0.081024 0.439148 -0.133911 0.083344 0.443207 -0.152863 0.085724 0.447327 -0.172943 0.088226 0.451569 -0.193878 0.090851 0.455933 -0.215515 0.093475 0.460266 -0.237946 0.096252 0.464844 -0.260956 0.099121 0.469543 -0.284454 0.102020 0.474182 -0.308472 0.105072 0.479065 -0.332855 0.108276 0.484070 -0.357361 0.111420 0.488983 -0.382172 0.114746 0.494110 -0.406921 0.118134 0.499207 -0.431824 0.121643 0.504578 -0.456604 0.125244 0.510010 -0.481537 0.128845 0.515320 -0.507416 0.132660 0.520874 -0.533936 0.136536 0.526581 -0.560730 0.140381 0.532135 -0.588013 0.144440 0.537872 -0.615479 0.148529 0.543762 -0.642853 0.152649 0.549500 -0.670197 0.156921 0.555481 -0.697021 0.161163 0.561310 -0.723694 0.165619 0.567383 -0.749847 0.170074 0.573486 -0.775360 0.174530 0.579468 -0.060059 0.087860 0.431213 -0.073883 0.090179 0.435028 -0.088654 0.092590 0.439056 -0.104584 0.095032 0.442993 -0.121887 0.097626 0.447205 -0.140350 0.100311 0.451477 -0.159821 0.103058 0.455688 -0.180298 0.105927 0.460175 -0.201660 0.108917 0.464691 -0.223633 0.111908 0.469299 -0.246460 0.115082 0.474121 -0.269775 0.118347 0.478973 -0.293549 0.121613 0.483826 -0.317780 0.125031 0.488861 -0.342255 0.128479 0.493866 -0.367035 0.132111 0.499084 -0.392029 0.135864 0.504425 -0.416870 0.139526 0.509735 -0.441772 0.143433 0.515198 -0.466675 0.147400 0.520752 -0.492035 0.151337 0.526306 -0.518219 0.155487 0.531982 -0.544983 0.159729 0.537720 -0.572052 0.163910 0.543488 -0.599518 0.168243 0.549377 -0.627045 0.172729 0.555328 -0.654449 0.177094 0.561157 -0.681702 0.181671 0.567230 -0.708496 0.186249 0.573212 -0.734924 0.190948 0.579346 -0.760925 0.195740 0.585480 -0.786224 0.200439 0.591522 -0.064514 0.104950 0.438965 -0.078674 0.107605 0.442902 -0.093933 0.110382 0.447113 -0.110382 0.113190 0.451233 -0.128235 0.116180 0.455597 -0.147186 0.119232 0.460022 -0.167053 0.122284 0.464478 -0.187988 0.125580 0.469177 -0.209747 0.128906 0.473969 -0.232117 0.132263 0.478668 -0.255249 0.135803 0.483673 -0.278900 0.139404 0.488708 -0.302887 0.143036 0.493744 -0.327393 0.146820 0.498993 -0.352020 0.150635 0.504181 -0.376953 0.154602 0.509583 -0.402039 0.158661 0.515076 -0.427002 0.162720 0.520508 -0.451965 0.166901 0.526184 -0.477112 0.171173 0.531860 -0.502838 0.175507 0.537445 -0.529266 0.179932 0.543304 -0.556305 0.184479 0.549194 -0.583588 0.188965 0.555023 -0.611206 0.193634 0.561035 -0.638641 0.198242 0.566956 -0.666107 0.203033 0.573059 -0.693268 0.207855 0.579193 -0.719940 0.212677 0.585175 -0.746185 0.217590 0.591370 -0.771973 0.222656 0.597595 -0.796967 0.227600 0.603668 -0.069244 0.123932 0.446991 -0.083771 0.126923 0.451111 -0.099579 0.130066 0.455475 -0.116577 0.133209 0.459839 -0.134918 0.136536 0.464355 -0.154388 0.139984 0.469055 -0.174713 0.143372 0.473724 -0.196045 0.147003 0.478546 -0.218170 0.150696 0.483551 -0.240875 0.154358 0.488495 -0.264343 0.158264 0.493591 -0.288147 0.162140 0.498718 -0.312500 0.166138 0.504028 -0.337219 0.170319 0.509430 -0.362061 0.174438 0.514801 -0.387115 0.178711 0.520386 -0.412323 0.183105 0.526031 -0.437286 0.187439 0.531555 -0.462280 0.191925 0.537323 -0.487701 0.196503 0.543213 -0.513824 0.201111 0.548920 -0.540619 0.205811 0.554871 -0.567871 0.210602 0.560852 -0.595306 0.215363 0.566803 -0.622925 0.220306 0.572876 -0.650421 0.225159 0.578827 -0.677795 0.230194 0.584991 -0.704895 0.235291 0.591248 -0.731354 0.240295 0.597260 -0.757416 0.245483 0.603546 -0.782959 0.250732 0.609802 -0.807709 0.255829 0.615906 -0.074188 0.144592 0.455261 -0.089233 0.147980 0.459717 -0.105560 0.151459 0.464264 -0.123138 0.154968 0.468811 -0.141968 0.158600 0.473572 -0.161926 0.162384 0.478455 -0.182709 0.166107 0.483276 -0.204468 0.170044 0.488342 -0.226959 0.174072 0.493469 -0.250031 0.178131 0.498596 -0.273743 0.182312 0.503937 -0.297791 0.186462 0.509155 -0.322418 0.190826 0.514648 -0.347290 0.195251 0.520233 -0.372284 0.199646 0.525726 -0.397491 0.204285 0.531403 -0.422699 0.208893 0.537170 -0.447693 0.213562 0.542877 -0.472870 0.218292 0.548767 -0.498688 0.223206 0.554718 -0.525085 0.228027 0.560547 -0.552155 0.233002 0.566620 -0.579468 0.237885 0.572571 -0.607117 0.243042 0.578705 -0.634827 0.248138 0.584839 -0.662231 0.253204 0.590881 -0.689545 0.258484 0.597107 -0.716431 0.263733 0.603363 -0.742706 0.268982 0.609467 -0.768616 0.274292 0.615753 -0.793854 0.279694 0.621979 -0.818298 0.284973 0.628113 -0.079468 0.166962 0.464050 -0.095032 0.170685 0.468719 -0.111938 0.174500 0.473450 -0.130066 0.178314 0.478210 -0.149384 0.182281 0.483185 -0.169800 0.186340 0.488190 -0.191010 0.190430 0.493256 -0.213165 0.194611 0.498444 -0.236023 0.198975 0.503784 -0.259399 0.203247 0.509064 -0.283417 0.207764 0.514496 -0.307739 0.212219 0.519958 -0.332581 0.216888 0.525604 -0.357605 0.221558 0.531219 -0.382660 0.226227 0.536865 -0.407990 0.231110 0.542725 -0.433228 0.236023 0.548615 -0.458191 0.240875 0.554413 -0.483673 0.245880 0.560425 -0.509888 0.251007 0.566498 -0.536560 0.256042 0.572418 -0.563873 0.261230 0.578552 -0.591309 0.266327 0.584534 -0.619080 0.271667 0.590729 -0.646759 0.276978 0.596954 -0.674103 0.282227 0.603027 -0.701233 0.287659 0.609314 -0.727966 0.293091 0.615540 -0.753998 0.298431 0.621704 -0.779633 0.303925 0.627930 -0.804657 0.309479 0.634247 -0.828766 0.314850 0.640320 -0.085083 0.190826 0.473267 -0.101196 0.194824 0.478088 -0.118713 0.198975 0.483063 -0.137360 0.203033 0.487976 -0.157227 0.207367 0.493103 -0.178070 0.211700 0.498322 -0.199707 0.216064 0.503479 -0.222198 0.220612 0.508911 -0.245300 0.225098 0.514221 -0.269073 0.229767 0.519806 -0.293335 0.234528 0.525452 -0.317871 0.239227 0.531006 -0.342896 0.244141 0.536743 -0.368073 0.249084 0.542572 -0.393250 0.253937 0.548340 -0.418610 0.259064 0.554260 -0.443878 0.264221 0.560272 -0.468933 0.269257 0.566162 -0.494781 0.274475 0.572296 -0.521118 0.279663 0.578217 -0.548248 0.285004 0.584412 -0.575714 0.290375 0.590576 -0.603271 0.295685 0.596649 -0.631012 0.301117 0.602844 -0.658722 0.306580 0.609161 -0.685913 0.311981 0.615234 -0.712891 0.317535 0.621552 -0.739410 0.323120 0.627777 -0.765198 0.328552 0.633881 -0.790588 0.334198 0.640167 -0.815125 0.339630 0.646301 -0.839111 0.345215 0.652496 -0.091064 0.216034 0.482819 -0.107788 0.220367 0.487823 -0.125854 0.224792 0.492950 -0.144958 0.229156 0.498047 -0.165314 0.233704 0.503357 -0.186615 0.238342 0.508759 -0.208618 0.242950 0.514099 -0.231537 0.247711 0.519684 -0.254944 0.252441 0.525146 -0.278992 0.257385 0.530853 -0.303467 0.262329 0.536591 -0.328278 0.267334 0.542297 -0.353394 0.272430 0.548157 -0.378723 0.277588 0.554138 -0.403900 0.282684 0.559967 -0.429321 0.287964 0.566010 -0.454559 0.293274 0.572144 -0.479919 0.298523 0.578064 -0.506134 0.303955 0.584259 -0.532776 0.309235 0.590271 -0.560059 0.314728 0.596497 -0.587677 0.320251 0.602753 -0.615295 0.325684 0.608826 -0.643066 0.331268 0.615112 -0.670654 0.336853 0.621399 -0.697662 0.342316 0.627472 -0.724487 0.347961 0.633759 -0.750763 0.353607 0.640015 -0.776337 0.359161 0.646149 -0.801422 0.364777 0.652374 -0.825653 0.370270 0.658447 -0.849213 0.375916 0.664612 -0.097321 0.242523 0.492706 -0.114685 0.247070 0.497925 -0.133301 0.251740 0.503204 -0.152954 0.256348 0.508484 -0.173767 0.261169 0.513977 -0.195374 0.265900 0.519379 -0.217865 0.270874 0.524994 -0.241089 0.275848 0.530670 -0.264801 0.280823 0.536346 -0.289154 0.285980 0.542175 -0.313873 0.291168 0.548004 -0.338806 0.296295 0.553864 -0.364075 0.301575 0.559814 -0.389526 0.306976 0.565887 -0.414764 0.312164 0.571808 -0.440125 0.317657 0.577942 -0.465271 0.322998 0.583923 -0.491028 0.328522 0.590118 -0.517609 0.334045 0.596375 -0.544525 0.339478 0.602448 -0.571991 0.345062 0.608673 -0.599731 0.350708 0.614960 -0.627411 0.356201 0.621094 -0.655090 0.361847 0.627350 -0.682556 0.367523 0.633606 -0.709412 0.373077 0.639709 -0.735992 0.378723 0.645966 -0.761871 0.384277 0.652039 -0.787323 0.389954 0.658264 -0.812042 0.395599 0.664459 -0.835968 0.401123 0.670441 -0.859131 0.406769 0.676575 -0.104004 0.270020 0.502930 -0.121948 0.274811 0.508331 -0.141113 0.279724 0.513794 -0.161255 0.284546 0.519226 -0.182495 0.289612 0.524872 -0.204529 0.294556 0.530426 -0.227417 0.299713 0.536163 -0.250977 0.304962 0.542023 -0.274933 0.310059 0.547729 -0.299500 0.315338 0.553680 -0.324432 0.320740 0.559692 -0.349518 0.326019 0.565582 -0.374939 0.331482 0.571655 -0.400391 0.336975 0.577789 -0.425629 0.342346 0.583771 -0.451019 0.347900 0.589935 -0.476349 0.353363 0.596008 -0.502472 0.359009 0.602264 -0.529266 0.364624 0.608490 -0.556366 0.370148 0.614624 -0.583984 0.375793 0.620911 -0.611847 0.381500 0.627197 -0.639465 0.387024 0.633301 -0.667084 0.392700 0.639557 -0.694336 0.398407 0.645813 -0.721008 0.403992 0.651886 -0.747375 0.409637 0.658112 -0.772980 0.415131 0.664124 -0.798096 0.420837 0.670288 -0.822540 0.426483 0.676422 -0.846008 0.431946 0.682404 -0.868835 0.437531 0.688385 -0.111084 0.298492 0.513519 -0.129578 0.303497 0.519104 -0.149109 0.308502 0.524597 -0.169891 0.313629 0.530243 -0.191620 0.318878 0.536011 -0.213959 0.324036 0.541718 -0.237183 0.329315 0.547607 -0.260986 0.334686 0.553497 -0.285278 0.339996 0.559418 -0.310028 0.345428 0.565430 -0.335144 0.350891 0.571472 -0.360352 0.356323 0.577484 -0.385834 0.361877 0.583618 -0.411194 0.367371 0.589661 -0.436584 0.372955 0.595856 -0.461884 0.378601 0.602081 -0.487549 0.384155 0.608215 -0.514038 0.389832 0.614471 -0.541077 0.395508 0.620758 -0.568359 0.401062 0.626862 -0.596100 0.406738 0.633118 -0.623901 0.412384 0.639404 -0.651489 0.417969 0.645477 -0.678955 0.423676 0.651764 -0.706024 0.429321 0.657959 -0.732513 0.434845 0.663971 -0.758575 0.440521 0.670166 -0.783875 0.446075 0.676117 -0.808777 0.451843 0.682251 -0.832794 0.457550 0.688232 -0.855927 0.463226 0.694122 -0.878296 0.469055 0.700043 -0.118439 0.327728 0.524445 -0.137512 0.332947 0.530090 -0.157593 0.338074 0.535736 -0.178802 0.343384 0.541565 -0.200897 0.348755 0.547455 -0.223633 0.354065 0.553192 -0.247162 0.359497 0.559204 -0.271332 0.364960 0.565277 -0.295776 0.370392 0.571198 -0.320740 0.375916 0.577332 -0.346039 0.381531 0.583466 -0.371307 0.386993 0.589539 -0.396881 0.392639 0.595703 -0.422211 0.398132 0.601807 -0.447601 0.403778 0.608063 -0.473022 0.409515 0.614319 -0.498962 0.415009 0.620422 -0.525726 0.420715 0.626740 -0.553009 0.426422 0.632996 -0.580353 0.431976 0.639130 -0.608185 0.437653 0.645325 -0.636017 0.443390 0.651581 -0.663483 0.449036 0.657654 -0.690735 0.454803 0.663849 -0.717438 0.460541 0.669861 -0.743835 0.466370 0.675995 -0.769653 0.472229 0.682037 -0.794647 0.477997 0.687958 -0.819122 0.483917 0.694000 -0.842834 0.489838 0.699860 -0.865540 0.495575 0.705627 -0.887421 0.501526 0.711487 -0.126190 0.357574 0.535583 -0.145782 0.362915 0.541412 -0.166321 0.368164 0.547119 -0.187988 0.373627 0.553070 -0.210480 0.379120 0.559113 -0.233551 0.384521 0.565002 -0.257416 0.390045 0.571075 -0.281769 0.395599 0.577148 -0.306427 0.401093 0.583130 -0.331573 0.406708 0.589355 -0.356812 0.412140 0.595398 -0.382294 0.417847 0.601654 -0.407928 0.423492 0.607910 -0.433228 0.429016 0.614044 -0.458588 0.434723 0.620300 -0.484222 0.440430 0.626556 -0.510529 0.446045 0.632690 -0.537476 0.451843 0.638916 -0.564941 0.457703 0.645172 -0.592468 0.463440 0.651276 -0.620300 0.469391 0.657501 -0.648010 0.475311 0.663696 -0.675323 0.481171 0.669708 -0.702423 0.487152 0.675812 -0.728912 0.493011 0.681763 -0.755005 0.499054 0.687836 -0.780518 0.505096 0.693817 -0.805206 0.510956 0.699646 -0.829315 0.517029 0.705505 -0.852631 0.523041 0.711334 -0.874908 0.528870 0.717010 -0.896362 0.534882 0.722748 -0.134216 0.387787 0.546997 -0.154327 0.393280 0.552917 -0.175323 0.398651 0.558777 -0.197418 0.404144 0.564819 -0.220245 0.409729 0.570923 -0.243713 0.415131 0.576843 -0.267792 0.420746 0.583008 -0.292389 0.426392 0.589172 -0.317261 0.431854 0.595245 -0.342529 0.437531 0.601501 -0.367859 0.443054 0.607574 -0.393402 0.448883 0.613892 -0.418945 0.454681 0.620148 -0.444305 0.460419 0.626282 -0.469635 0.466339 0.632507 -0.495667 0.472260 0.638763 -0.522217 0.478119 0.644897 -0.549377 0.484131 0.651093 -0.576935 0.490234 0.657349 -0.604523 0.496124 0.663361 -0.632263 0.502258 0.669495 -0.659760 0.508240 0.675507 -0.687073 0.514343 0.681610 -0.713928 0.520447 0.687653 -0.740173 0.526489 0.693542 -0.765961 0.532623 0.699463 -0.791138 0.538696 0.705353 -0.815521 0.544708 0.711060 -0.839233 0.550812 0.716888 -0.862122 0.556854 0.722626 -0.883942 0.562744 0.728119 -0.904968 0.568726 0.733734 -0.142548 0.418365 0.558624 -0.163147 0.423889 0.564667 -0.184631 0.429291 0.570587 -0.207092 0.434845 0.576691 -0.230286 0.440460 0.582855 -0.253937 0.446014 0.588867 -0.278351 0.451752 0.595062 -0.303131 0.457550 0.601349 -0.328186 0.463348 0.607483 -0.353577 0.469269 0.613708 -0.378967 0.475037 0.619812 -0.404480 0.481049 0.626099 -0.430054 0.487122 0.632385 -0.455292 0.493042 0.638458 -0.480865 0.499176 0.644775 -0.507172 0.505310 0.650970 -0.533997 0.511414 0.656982 -0.561310 0.517578 0.663208 -0.588898 0.523773 0.669373 -0.616516 0.529816 0.675354 -0.644226 0.536041 0.681427 -0.671539 0.542145 0.687347 -0.698608 0.548340 0.693390 -0.725250 0.554535 0.699280 -0.751190 0.560577 0.705048 -0.776703 0.566742 0.710907 -0.801575 0.572906 0.716736 -0.825592 0.578857 0.722351 -0.848877 0.584961 0.727997 -0.871368 0.591034 0.733582 -0.892731 0.596863 0.738983 -0.913269 0.602783 0.744446 -0.151215 0.449127 0.570465 -0.172302 0.454803 0.576538 -0.194153 0.460480 0.582550 -0.216980 0.466309 0.588715 -0.240509 0.472198 0.594940 -0.264435 0.477997 0.601044 -0.289032 0.484039 0.607300 -0.314056 0.490082 0.613525 -0.339172 0.496033 0.619659 -0.364655 0.502136 0.625916 -0.390076 0.508179 0.632080 -0.415649 0.514374 0.638336 -0.441101 0.520599 0.644623 -0.466309 0.526703 0.650665 -0.492218 0.532990 0.656830 -0.518799 0.539276 0.663055 -0.545715 0.545441 0.669098 -0.573242 0.551697 0.675232 -0.600922 0.558014 0.681274 -0.628510 0.564148 0.687195 -0.656067 0.570435 0.693237 -0.683197 0.576508 0.699005 -0.710052 0.582733 0.704926 -0.736420 0.588959 0.710724 -0.762054 0.595001 0.716431 -0.787231 0.601105 0.722168 -0.811707 0.607239 0.727844 -0.835327 0.613159 0.733307 -0.858246 0.619171 0.738892 -0.880249 0.625122 0.744324 -0.901215 0.630829 0.749634 -0.921204 0.636719 0.754913 -0.160126 0.481110 0.582397 -0.181610 0.487061 0.588562 -0.203918 0.492920 0.594666 -0.227051 0.499054 0.600861 -0.250885 0.505188 0.607178 -0.275055 0.511230 0.613220 -0.299835 0.517426 0.619507 -0.324829 0.523438 0.625641 -0.350250 0.529724 0.631897 -0.375793 0.536072 0.638184 -0.401215 0.542236 0.644257 -0.426727 0.548553 0.650513 -0.452118 0.554871 0.656677 -0.477478 0.561096 0.662750 -0.503601 0.567444 0.668915 -0.530457 0.573761 0.675018 -0.557556 0.579987 0.681000 -0.585083 0.586304 0.687042 -0.612762 0.592621 0.693115 -0.640289 0.598785 0.698883 -0.667725 0.605042 0.704773 -0.694611 0.611084 0.710480 -0.721222 0.617249 0.716309 -0.747284 0.623413 0.722046 -0.772675 0.629333 0.727570 -0.797516 0.635406 0.733185 -0.821625 0.641388 0.738708 -0.844849 0.647186 0.744019 -0.867340 0.653046 0.749451 -0.888794 0.658722 0.754669 -0.909332 0.664459 0.759888 -0.928833 0.670074 0.765045 -0.169312 0.514282 0.594482 -0.191223 0.520447 0.600708 -0.213837 0.526550 0.606812 -0.237305 0.532837 0.613068 -0.261383 0.539124 0.619354 -0.285797 0.545288 0.625458 -0.310730 0.551636 0.631744 -0.335876 0.557892 0.637878 -0.361328 0.564209 0.644104 -0.386902 0.570618 0.650360 -0.412323 0.576874 0.656433 -0.437744 0.583252 0.662567 -0.463074 0.589630 0.668793 -0.488708 0.595886 0.674744 -0.515137 0.602203 0.680817 -0.542084 0.608582 0.686890 -0.569366 0.614746 0.692749 -0.596893 0.621002 0.698730 -0.624451 0.627136 0.704498 -0.651947 0.633362 0.710358 -0.679169 0.639587 0.716156 -0.705811 0.645508 0.721741 -0.732178 0.651611 0.727448 -0.757965 0.657623 0.733063 -0.782990 0.663422 0.738434 -0.807495 0.669250 0.743896 -0.831207 0.675079 0.749298 -0.854034 0.680695 0.754517 -0.876129 0.686340 0.759766 -0.897064 0.691772 0.764801 -0.917175 0.697266 0.769897 -0.936127 0.702759 0.774902 -0.178680 0.548370 0.606659 -0.200989 0.554749 0.612946 -0.223969 0.560913 0.619019 -0.247681 0.567352 0.625305 -0.271851 0.573578 0.631409 -0.296570 0.580017 0.637695 -0.321716 0.586426 0.643951 -0.346924 0.592682 0.650085 -0.372406 0.599152 0.656281 -0.398010 0.605530 0.662415 -0.423370 0.611816 0.668488 -0.448669 0.618164 0.674622 -0.474121 0.624542 0.680695 -0.500000 0.630676 0.686584 -0.526672 0.637024 0.692596 -0.553589 0.643127 0.698425 -0.581085 0.649384 0.704376 -0.608643 0.655579 0.710205 -0.636047 0.661530 0.715851 -0.663422 0.667633 0.721588 -0.690399 0.673615 0.727295 -0.716858 0.679443 0.732758 -0.742859 0.685364 0.738312 -0.768372 0.691132 0.743774 -0.793060 0.696716 0.749054 -0.817169 0.702484 0.754425 -0.840546 0.708008 0.759613 -0.862885 0.713409 0.764679 -0.884521 0.718842 0.769775 -0.905029 0.724060 0.774658 -0.924591 0.729309 0.779541 -0.943024 0.734467 0.784332 -0.188263 0.583069 0.618866 -0.210968 0.589539 0.625153 -0.234192 0.595825 0.631287 -0.258179 0.602203 0.637512 -0.282562 0.608521 0.643677 -0.307465 0.614960 0.649872 -0.332703 0.621399 0.656097 -0.357941 0.627686 0.662170 -0.383484 0.634064 0.668304 -0.408997 0.640442 0.674438 -0.434326 0.646606 0.680389 -0.459595 0.652954 0.686462 -0.485168 0.659210 0.692444 -0.511322 0.665253 0.698273 -0.538147 0.671417 0.704193 -0.565216 0.677429 0.709900 -0.592682 0.683472 0.715668 -0.620270 0.689514 0.721466 -0.647491 0.695251 0.726990 -0.674713 0.701172 0.732635 -0.701447 0.706970 0.738190 -0.727539 0.712585 0.743500 -0.753357 0.718262 0.748901 -0.778473 0.723907 0.754272 -0.802795 0.729279 0.759399 -0.826508 0.734741 0.764557 -0.849365 0.739899 0.769501 -0.871460 0.745178 0.774536 -0.892578 0.750397 0.779449 -0.912628 0.755310 0.784119 -0.931702 0.760315 0.788849 -0.949615 0.765228 0.793518 -0.198029 0.618103 0.631104 -0.220886 0.624390 0.637238 -0.244568 0.630798 0.643463 -0.268768 0.637238 0.649719 -0.293304 0.643524 0.655823 -0.318390 0.649872 0.661987 -0.343689 0.656250 0.668152 -0.368988 0.662415 0.674133 -0.394470 0.668671 0.680206 -0.419952 0.674957 0.686279 -0.445129 0.680969 0.692108 -0.470428 0.687164 0.698120 -0.496155 0.693115 0.703888 -0.522644 0.699158 0.709778 -0.549591 0.705170 0.715546 -0.576721 0.710968 0.721191 -0.604218 0.716797 0.726837 -0.631653 0.722656 0.732483 -0.658783 0.728271 0.737915 -0.685699 0.733917 0.743408 -0.712219 0.739502 0.748779 -0.738037 0.744843 0.753967 -0.763489 0.750275 0.759247 -0.788269 0.755615 0.764404 -0.812256 0.760773 0.769379 -0.835602 0.765930 0.774414 -0.858032 0.770935 0.779205 -0.879669 0.775879 0.784027 -0.900330 0.780762 0.788727 -0.919891 0.785461 0.793243 -0.938446 0.790192 0.797821 -0.955841 0.794800 0.802277 -0.207947 0.653015 0.643341 -0.231140 0.659241 0.649414 -0.255035 0.665588 0.655670 -0.279449 0.671936 0.661835 -0.304138 0.678040 0.667786 -0.329285 0.684357 0.673981 -0.354675 0.690582 0.680054 -0.379974 0.696564 0.686005 -0.405426 0.702728 0.691986 -0.430817 0.708801 0.697937 -0.455902 0.714661 0.703766 -0.481293 0.720642 0.709625 -0.507263 0.726410 0.715271 -0.533936 0.732300 0.721008 -0.560944 0.738068 0.726715 -0.588135 0.743652 0.732208 -0.615509 0.749298 0.737793 -0.642853 0.754883 0.743256 -0.669800 0.760193 0.748505 -0.696472 0.765656 0.753845 -0.722717 0.770966 0.759094 -0.748260 0.776093 0.764160 -0.773315 0.781281 0.769226 -0.797668 0.786194 0.774170 -0.821381 0.791229 0.779083 -0.844330 0.796082 0.783936 -0.866333 0.800751 0.788483 -0.887482 0.805481 0.793152 -0.907745 0.810120 0.797729 -0.926758 0.814514 0.802032 -0.944855 0.818909 0.806396 -0.961670 0.823181 0.810669 -0.217957 0.687500 0.655487 -0.241425 0.693634 0.661560 -0.265564 0.699799 0.667694 -0.290161 0.705994 0.673828 -0.314972 0.712006 0.679749 -0.340179 0.718079 0.685822 -0.365570 0.724182 0.691833 -0.390869 0.729980 0.697662 -0.416260 0.735901 0.703613 -0.441376 0.741638 0.709351 -0.466583 0.747498 0.715118 -0.492188 0.753296 0.720917 -0.518311 0.758789 0.726440 -0.545105 0.764404 0.732056 -0.572235 0.769958 0.737610 -0.599365 0.775330 0.742981 -0.626648 0.780670 0.748383 -0.653870 0.785980 0.753693 -0.680542 0.791138 0.758820 -0.706940 0.796265 0.764038 -0.732880 0.801331 0.769135 -0.758148 0.806183 0.774017 -0.782867 0.811066 0.778961 -0.806824 0.815735 0.783691 -0.830139 0.820404 0.788391 -0.852692 0.825012 0.793060 -0.874207 0.829407 0.797516 -0.894958 0.833771 0.801941 -0.914734 0.838074 0.806274 -0.933350 0.842163 0.810425 -0.950806 0.846252 0.814606 -0.967133 0.850250 0.818665 -0.228088 0.721283 0.667542 -0.251770 0.727264 0.673523 -0.276123 0.733276 0.679596 -0.300842 0.739349 0.685730 -0.325745 0.745087 0.691528 -0.351013 0.751007 0.697510 -0.376373 0.756866 0.703491 -0.401642 0.762512 0.709167 -0.426971 0.768250 0.714966 -0.451965 0.773743 0.720551 -0.477234 0.779266 0.726288 -0.503082 0.784821 0.731903 -0.529358 0.790131 0.737335 -0.556213 0.795471 0.742859 -0.583344 0.800751 0.748291 -0.610413 0.805847 0.753448 -0.637634 0.810974 0.758698 -0.664581 0.816010 0.763885 -0.691040 0.820831 0.768860 -0.717163 0.825684 0.773895 -0.742676 0.830353 0.778717 -0.767670 0.834991 0.783539 -0.792023 0.839569 0.788269 -0.815643 0.843933 0.792816 -0.838531 0.848358 0.797363 -0.860687 0.852631 0.801849 -0.881805 0.856659 0.806091 -0.902039 0.860718 0.810333 -0.921356 0.864716 0.814514 -0.939453 0.868500 0.818481 -0.956512 0.872192 0.822418 -0.972229 0.875763 0.826141 -0.238342 0.754211 0.679443 -0.262207 0.760010 0.685394 -0.286713 0.765869 0.691406 -0.311493 0.771637 0.697357 -0.336487 0.777252 0.703156 -0.361786 0.782928 0.709076 -0.386993 0.788391 0.714691 -0.412323 0.793945 0.720428 -0.437469 0.799408 0.726166 -0.462372 0.804657 0.731598 -0.487793 0.809967 0.737213 -0.513855 0.815216 0.742737 -0.540283 0.820282 0.747986 -0.567169 0.825348 0.753326 -0.594238 0.830383 0.758545 -0.621277 0.835144 0.763672 -0.648285 0.839966 0.768738 -0.675018 0.844727 0.773743 -0.701202 0.849213 0.778564 -0.727020 0.853760 0.783417 -0.752197 0.858063 0.788055 -0.776886 0.862427 0.792694 -0.800903 0.866669 0.797272 -0.824066 0.870758 0.801636 -0.846588 0.874756 0.805969 -0.868286 0.878723 0.810242 -0.888977 0.882477 0.814301 -0.908844 0.886200 0.818329 -0.927612 0.889832 0.822296 -0.945221 0.893280 0.826050 -0.961731 0.896698 0.829803 -0.976990 0.899933 0.833344 -0.248596 0.786194 0.691223 -0.272614 0.791748 0.697052 -0.297211 0.797424 0.703003 -0.322144 0.802887 0.708893 -0.347168 0.808258 0.714539 -0.372467 0.813721 0.720306 -0.397583 0.818939 0.725861 -0.422791 0.824249 0.731476 -0.447876 0.829407 0.737061 -0.472748 0.834412 0.742401 -0.498322 0.839417 0.747833 -0.524536 0.844391 0.753174 -0.551025 0.849121 0.758331 -0.577972 0.853882 0.763550 -0.604980 0.858582 0.768616 -0.631866 0.863037 0.773529 -0.658661 0.867554 0.778473 -0.684998 0.871857 0.783203 -0.710999 0.876190 0.787933 -0.736542 0.880371 0.792542 -0.761383 0.884399 0.797028 -0.785706 0.888367 0.801483 -0.809357 0.892303 0.805878 -0.832153 0.895996 0.809998 -0.854309 0.899719 0.814209 -0.875549 0.903351 0.818237 -0.895813 0.906708 0.822113 -0.915131 0.910095 0.825928 -0.933411 0.913330 0.829620 -0.950623 0.916534 0.833282 -0.966644 0.919556 0.836823 -0.981384 0.922485 0.840149 -0.258789 0.817078 0.702850 -0.283020 0.822418 0.708588 -0.307739 0.827728 0.714417 -0.332611 0.832886 0.720032 -0.357758 0.838104 0.725708 -0.382935 0.843201 0.731354 -0.408020 0.848206 0.736786 -0.433105 0.853180 0.742310 -0.458038 0.858032 0.747711 -0.483032 0.862732 0.752899 -0.508850 0.867462 0.758209 -0.535095 0.872101 0.763397 -0.561646 0.876495 0.768372 -0.588501 0.880951 0.773407 -0.615295 0.885193 0.778198 -0.642151 0.889496 0.783051 -0.668793 0.893616 0.787811 -0.694855 0.897644 0.792358 -0.720490 0.901550 0.796936 -0.745728 0.905426 0.801392 -0.770233 0.909088 0.805634 -0.794159 0.912750 0.809937 -0.817444 0.916351 0.814087 -0.839874 0.919708 0.818085 -0.861542 0.923035 0.822021 -0.882385 0.926270 0.825867 -0.902222 0.929321 0.829529 -0.921143 0.932404 0.833221 -0.938934 0.935242 0.836609 -0.955627 0.938049 0.840027 -0.971252 0.940796 0.843323 -0.985504 0.943359 0.846405 -0.269043 0.846680 0.714294 -0.293335 0.851685 0.719910 -0.318146 0.856781 0.725586 -0.343048 0.861633 0.731079 -0.368134 0.866547 0.736664 -0.393280 0.871368 0.742157 -0.418274 0.876007 0.747467 -0.443207 0.880676 0.752838 -0.468018 0.885223 0.758057 -0.493256 0.889618 0.763123 -0.519135 0.893982 0.768250 -0.545471 0.898254 0.773254 -0.572021 0.902374 0.778076 -0.598846 0.906433 0.782959 -0.625519 0.910339 0.787598 -0.652161 0.914276 0.792267 -0.678528 0.918060 0.796814 -0.704254 0.921692 0.801178 -0.729675 0.925262 0.805573 -0.754517 0.928802 0.809845 -0.778687 0.932098 0.813873 -0.802277 0.935394 0.817993 -0.825134 0.938629 0.821930 -0.847168 0.941620 0.825684 -0.868439 0.944580 0.829468 -0.888763 0.947449 0.833008 -0.908234 0.950226 0.836517 -0.926666 0.952942 0.839935 -0.944031 0.955414 0.843140 -0.960297 0.957886 0.846313 -0.975403 0.960266 0.849396 -0.989197 0.962463 0.852325 -0.279236 0.874847 0.725403 -0.303619 0.879578 0.730957 -0.328491 0.884338 0.736542 -0.353333 0.888885 0.741882 -0.378418 0.893463 0.747284 -0.403503 0.897949 0.752686 -0.428314 0.902252 0.757782 -0.453094 0.906494 0.762970 -0.477936 0.910797 0.768097 -0.503357 0.914764 0.773041 -0.529266 0.918823 0.777954 -0.555695 0.922760 0.782806 -0.582184 0.926483 0.787476 -0.608887 0.930237 0.792145 -0.635406 0.933746 0.796631 -0.661835 0.937286 0.801056 -0.687866 0.940765 0.805450 -0.713379 0.944031 0.809631 -0.738373 0.947235 0.813751 -0.762909 0.950378 0.817871 -0.786743 0.953308 0.821716 -0.809937 0.956268 0.825592 -0.832428 0.959106 0.829376 -0.854034 0.961731 0.832916 -0.874939 0.964386 0.836426 -0.894806 0.966858 0.839783 -0.913849 0.969269 0.843048 -0.931885 0.971619 0.846252 -0.948761 0.973785 0.849274 -0.964600 0.975952 0.852264 -0.979218 0.977936 0.855072 -0.992584 0.979858 0.857697 -0.289215 0.901367 0.736237 -0.313812 0.905884 0.741760 -0.338654 0.910278 0.747162 -0.363525 0.914459 0.752380 -0.388519 0.918701 0.757660 -0.413483 0.922852 0.762817 -0.438171 0.926758 0.767883 -0.462769 0.930756 0.772919 -0.487762 0.934570 0.777863 -0.513245 0.938232 0.782593 -0.539276 0.941895 0.787323 -0.565521 0.945374 0.791901 -0.592041 0.948792 0.796478 -0.618622 0.952179 0.800934 -0.644928 0.955322 0.805206 -0.671143 0.958527 0.809540 -0.696838 0.961578 0.813660 -0.722076 0.964417 0.817657 -0.746765 0.967316 0.821655 -0.770935 0.970062 0.825470 -0.794373 0.972687 0.829193 -0.817200 0.975220 0.832825 -0.839203 0.977631 0.836243 -0.860535 0.979950 0.839691 -0.881012 0.982269 0.842987 -0.900513 0.984406 0.846130 -0.919098 0.986450 0.849182 -0.936676 0.988434 0.852173 -0.953125 0.990295 0.854950 -0.968506 0.992065 0.857635 -0.982697 0.993744 0.860260 -0.995605 0.995361 0.862701 -0.048859 0.046173 0.431274 -0.062042 0.047791 0.434631 -0.075745 0.049469 0.438110 -0.090271 0.051147 0.441559 -0.106110 0.052979 0.445160 -0.123108 0.054779 0.448853 -0.141357 0.056702 0.452728 -0.160583 0.058716 0.456665 -0.180695 0.060730 0.460693 -0.201752 0.062836 0.464813 -0.223511 0.065033 0.469116 -0.245819 0.067230 0.473419 -0.268860 0.069550 0.477966 -0.292389 0.071930 0.482605 -0.316193 0.074371 0.487183 -0.340485 0.076874 0.492035 -0.364868 0.079468 0.496796 -0.389526 0.082153 0.501862 -0.414246 0.084961 0.506958 -0.438812 0.087738 0.511993 -0.463470 0.090698 0.517334 -0.488617 0.093750 0.522675 -0.514313 0.096802 0.528015 -0.540771 0.100037 0.533508 -0.567719 0.103363 0.539154 -0.594818 0.106689 0.544647 -0.622223 0.110168 0.550446 -0.649384 0.113647 0.556091 -0.676575 0.117340 0.561981 -0.703400 0.121124 0.567871 -0.729675 0.124817 0.573730 -0.755707 0.128784 0.579773 -0.052612 0.059204 0.437897 -0.066010 0.061035 0.441498 -0.079956 0.062836 0.444977 -0.095032 0.064819 0.448792 -0.111359 0.066833 0.452606 -0.128845 0.068848 0.456451 -0.147552 0.071014 0.460571 -0.167297 0.073273 0.464691 -0.187805 0.075470 0.468903 -0.209229 0.077850 0.473328 -0.231354 0.080353 0.477844 -0.254028 0.082825 0.482361 -0.277344 0.085449 0.487061 -0.301025 0.088104 0.491791 -0.325226 0.090881 0.496704 -0.349670 0.093811 0.501709 -0.374237 0.096710 0.506653 -0.399078 0.099792 0.511902 -0.423889 0.102966 0.517181 -0.448456 0.106140 0.522369 -0.473358 0.109497 0.527893 -0.498871 0.112946 0.533386 -0.524933 0.116364 0.538879 -0.551697 0.119995 0.544556 -0.578827 0.123718 0.550293 -0.606110 0.127441 0.555969 -0.633575 0.131287 0.561859 -0.660767 0.135162 0.567596 -0.687866 0.139221 0.573608 -0.714569 0.143311 0.579620 -0.740753 0.147430 0.585541 -0.766541 0.151672 0.591614 -0.056641 0.073273 0.444885 -0.070221 0.075317 0.448669 -0.084595 0.077362 0.452423 -0.100189 0.079590 0.456360 -0.117035 0.081909 0.460449 -0.135010 0.084198 0.464508 -0.154205 0.086639 0.468811 -0.174316 0.089203 0.473267 -0.195251 0.091766 0.477600 -0.217072 0.094513 0.482208 -0.239594 0.097321 0.486969 -0.262543 0.100159 0.491699 -0.286163 0.103210 0.496552 -0.310089 0.106201 0.501465 -0.334503 0.109375 0.506561 -0.359161 0.112671 0.511749 -0.383911 0.115997 0.516876 -0.408783 0.119446 0.522278 -0.433716 0.122986 0.527740 -0.458374 0.126526 0.533112 -0.483551 0.130280 0.538727 -0.509460 0.134094 0.544434 -0.535858 0.137909 0.550018 -0.562866 0.141876 0.555817 -0.590057 0.145874 0.561493 -0.617523 0.150024 0.567413 -0.645081 0.154236 0.573456 -0.672241 0.158447 0.579346 -0.699249 0.162811 0.585388 -0.725861 0.167267 0.591461 -0.751862 0.171661 0.597443 -0.777435 0.176239 0.603638 -0.060852 0.088684 0.452301 -0.074768 0.091064 0.456238 -0.089569 0.093445 0.460236 -0.105652 0.095978 0.464417 -0.123047 0.098633 0.468750 -0.141541 0.101288 0.473022 -0.161163 0.104095 0.477478 -0.181763 0.107025 0.482117 -0.203064 0.109985 0.486725 -0.225250 0.113129 0.491547 -0.247986 0.116211 0.496307 -0.271362 0.119507 0.501343 -0.295319 0.122894 0.506409 -0.319458 0.126312 0.511505 -0.344116 0.129852 0.516785 -0.368927 0.133484 0.522156 -0.393799 0.137177 0.527435 -0.418762 0.140991 0.532990 -0.443787 0.144897 0.538544 -0.468506 0.148773 0.544128 -0.494080 0.152893 0.549866 -0.520355 0.157074 0.555634 -0.547058 0.161194 0.561371 -0.574280 0.165527 0.567322 -0.601593 0.169800 0.573120 -0.629150 0.174286 0.579163 -0.656647 0.178802 0.585266 -0.683807 0.183319 0.591156 -0.710663 0.187988 0.597290 -0.737091 0.192719 0.603516 -0.762909 0.197388 0.609528 -0.788300 0.202240 0.615753 -0.065338 0.105896 0.460114 -0.079651 0.108643 0.464294 -0.094910 0.111389 0.468506 -0.111542 0.114258 0.472900 -0.129486 0.117310 0.477356 -0.148438 0.120331 0.481903 -0.168518 0.123505 0.486572 -0.189545 0.126770 0.491394 -0.211212 0.130096 0.496155 -0.233765 0.133575 0.501221 -0.256866 0.137054 0.506195 -0.280548 0.140686 0.511383 -0.304688 0.144440 0.516632 -0.329132 0.148193 0.521851 -0.353943 0.152100 0.527313 -0.378937 0.156097 0.532837 -0.403839 0.160126 0.538269 -0.428925 0.164276 0.543976 -0.453949 0.168549 0.549713 -0.478973 0.172729 0.555389 -0.504913 0.177124 0.561188 -0.531342 0.181519 0.567017 -0.558380 0.186066 0.572998 -0.585815 0.190704 0.579010 -0.613251 0.195251 0.584900 -0.640930 0.200012 0.591034 -0.668335 0.204834 0.597137 -0.695343 0.209595 0.603149 -0.722107 0.214508 0.609344 -0.748352 0.219543 0.615540 -0.773956 0.224426 0.621643 -0.799042 0.229492 0.627899 -0.070099 0.125000 0.468384 -0.084839 0.128082 0.472809 -0.100616 0.131134 0.477142 -0.117828 0.134460 0.481812 -0.136200 0.137817 0.486481 -0.155701 0.141205 0.491150 -0.176239 0.144714 0.496063 -0.197510 0.148254 0.500977 -0.219757 0.152008 0.506042 -0.242584 0.155823 0.511230 -0.265991 0.159637 0.516388 -0.290009 0.163605 0.521698 -0.314392 0.167694 0.527161 -0.338989 0.171783 0.532562 -0.364014 0.175995 0.538147 -0.389099 0.180328 0.543854 -0.414124 0.184631 0.549408 -0.439270 0.189087 0.555206 -0.464264 0.193695 0.561066 -0.489716 0.198181 0.566864 -0.515961 0.202881 0.572845 -0.542694 0.207520 0.578705 -0.569977 0.212341 0.584747 -0.597534 0.217255 0.590820 -0.625092 0.222015 0.596802 -0.652679 0.227081 0.602997 -0.680054 0.232117 0.609192 -0.706909 0.237091 0.615234 -0.733490 0.242218 0.621490 -0.759583 0.247437 0.627716 -0.784912 0.252502 0.633820 -0.809784 0.257843 0.640076 -0.075165 0.145844 0.477051 -0.090332 0.149261 0.481659 -0.106689 0.152710 0.486206 -0.124451 0.156311 0.491028 -0.143433 0.160034 0.495941 -0.163300 0.163727 0.500824 -0.184265 0.167603 0.505920 -0.205994 0.171448 0.510956 -0.228577 0.175537 0.516296 -0.251770 0.179657 0.521576 -0.275421 0.183807 0.526917 -0.299713 0.188110 0.532410 -0.324341 0.192474 0.537994 -0.349152 0.196838 0.543579 -0.374237 0.201385 0.549286 -0.399475 0.205994 0.555084 -0.424561 0.210571 0.560791 -0.449677 0.215363 0.566742 -0.474731 0.220032 0.572540 -0.500671 0.224915 0.578552 -0.527283 0.229828 0.584595 -0.554230 0.234741 0.590546 -0.581726 0.239807 0.596680 -0.609436 0.244934 0.602844 -0.636963 0.249969 0.608887 -0.664490 0.255188 0.615112 -0.691772 0.260468 0.621338 -0.718506 0.265594 0.627441 -0.744873 0.270996 0.633667 -0.770569 0.276184 0.639771 -0.795776 0.281586 0.646027 -0.820343 0.287048 0.652252 -0.080536 0.168365 0.486084 -0.096222 0.172089 0.490906 -0.113159 0.175842 0.495697 -0.131439 0.179749 0.500702 -0.150787 0.183655 0.505676 -0.171295 0.187805 0.510834 -0.192688 0.191986 0.516144 -0.214783 0.196198 0.521301 -0.237671 0.200500 0.526825 -0.261261 0.204956 0.532257 -0.285187 0.209351 0.537689 -0.309692 0.213928 0.543427 -0.334503 0.218628 0.549133 -0.359467 0.223267 0.554779 -0.384705 0.228088 0.560638 -0.409851 0.232819 0.566437 -0.435120 0.237762 0.572418 -0.460236 0.242737 0.578400 -0.485657 0.247681 0.584290 -0.511932 0.252808 0.590393 -0.538818 0.257996 0.596527 -0.565948 0.263062 0.602539 -0.593628 0.268341 0.608704 -0.621368 0.273651 0.614960 -0.648895 0.278839 0.621063 -0.676392 0.284241 0.627258 -0.703522 0.289703 0.633545 -0.730042 0.294983 0.639587 -0.756165 0.300476 0.645874 -0.781647 0.305817 0.651978 -0.806549 0.311371 0.658203 -0.830780 0.316925 0.664398 -0.086182 0.192291 0.495544 -0.102448 0.196381 0.500580 -0.119965 0.200439 0.505524 -0.138824 0.204620 0.510773 -0.158630 0.208862 0.515869 -0.179535 0.213257 0.521149 -0.201385 0.217712 0.526672 -0.223877 0.222198 0.531982 -0.247101 0.226837 0.537598 -0.270996 0.231567 0.543274 -0.295166 0.236206 0.548828 -0.319885 0.241028 0.554626 -0.344879 0.245941 0.560486 -0.369995 0.250854 0.566284 -0.395294 0.255859 0.572235 -0.420471 0.260834 0.578064 -0.445770 0.265991 0.584137 -0.471008 0.271240 0.590240 -0.496796 0.276337 0.596252 -0.523407 0.281647 0.602417 -0.550537 0.287048 0.608582 -0.577881 0.292297 0.614624 -0.605560 0.297699 0.620880 -0.633362 0.303192 0.627106 -0.660828 0.308563 0.633240 -0.688171 0.314087 0.639465 -0.714996 0.319489 0.645569 -0.741455 0.325073 0.651794 -0.767365 0.330627 0.658020 -0.792511 0.336090 0.664093 -0.817169 0.341705 0.670288 -0.841034 0.347351 0.676453 -0.092224 0.217621 0.505402 -0.108978 0.221893 0.510468 -0.127167 0.226318 0.515717 -0.146515 0.230804 0.521027 -0.166840 0.235291 0.526367 -0.188171 0.239960 0.531860 -0.210419 0.244720 0.537415 -0.233215 0.249451 0.542999 -0.256805 0.254303 0.548706 -0.280914 0.259247 0.554504 -0.305359 0.264160 0.560211 -0.330292 0.269196 0.566101 -0.355316 0.274231 0.571930 -0.380615 0.279419 0.577942 -0.406006 0.284668 0.583984 -0.431274 0.289825 0.589935 -0.456512 0.295166 0.596039 -0.482056 0.300568 0.602203 -0.508179 0.305817 0.608307 -0.535004 0.311310 0.614471 -0.562347 0.316803 0.620728 -0.589813 0.322235 0.626831 -0.617645 0.327759 0.633057 -0.645386 0.333405 0.639313 -0.672791 0.338806 0.645416 -0.699951 0.344452 0.651611 -0.726532 0.349945 0.657715 -0.752808 0.355591 0.663940 -0.778473 0.361267 0.670135 -0.803345 0.366760 0.676147 -0.827637 0.372406 0.682312 -0.851166 0.378021 0.688416 -0.098602 0.244202 0.515594 -0.115936 0.248688 0.520782 -0.134674 0.253387 0.526245 -0.154541 0.258148 0.531708 -0.175323 0.262848 0.537140 -0.197083 0.267761 0.542847 -0.219696 0.272766 0.548553 -0.242889 0.277649 0.554199 -0.266724 0.282745 0.560028 -0.291107 0.287903 0.565948 -0.315765 0.292999 0.571777 -0.340881 0.298279 0.577789 -0.365967 0.303436 0.583710 -0.391449 0.308807 0.589752 -0.416870 0.314240 0.595886 -0.442078 0.319550 0.601898 -0.467377 0.325073 0.608124 -0.493286 0.330566 0.614349 -0.519684 0.335968 0.620422 -0.546814 0.341553 0.626648 -0.574310 0.347198 0.632904 -0.601898 0.352661 0.639038 -0.629730 0.358368 0.645233 -0.657196 0.363800 0.651306 -0.684631 0.369507 0.657562 -0.711670 0.375183 0.663818 -0.738037 0.380737 0.669861 -0.764038 0.386414 0.676025 -0.789368 0.392090 0.682129 -0.813934 0.397583 0.688110 -0.837921 0.403198 0.694214 -0.861023 0.408905 0.700195 -0.105347 0.271820 0.526093 -0.123260 0.276520 0.531433 -0.142548 0.281464 0.537018 -0.162903 0.286469 0.542694 -0.184082 0.291382 0.548279 -0.206360 0.296478 0.554047 -0.229309 0.301666 0.559937 -0.252747 0.306793 0.565674 -0.276917 0.312042 0.571625 -0.301361 0.317261 0.577515 -0.326385 0.322662 0.583557 -0.351593 0.328064 0.589630 -0.376862 0.333435 0.595612 -0.402344 0.338898 0.601776 -0.427765 0.344452 0.607971 -0.452942 0.349884 0.614044 -0.478455 0.355469 0.620270 -0.504700 0.361115 0.626526 -0.531372 0.366608 0.632568 -0.558716 0.372284 0.638855 -0.586334 0.377930 0.645081 -0.614014 0.383453 0.651184 -0.641785 0.389191 0.657440 -0.669189 0.394745 0.663483 -0.696442 0.400391 0.669678 -0.723236 0.406067 0.675842 -0.749390 0.411621 0.681824 -0.775085 0.417297 0.687958 -0.800171 0.422943 0.694061 -0.824402 0.428406 0.699860 -0.847961 0.434021 0.705841 -0.870636 0.439636 0.711823 -0.112457 0.300385 0.536865 -0.130981 0.305298 0.542419 -0.150757 0.310425 0.548126 -0.171570 0.315582 0.553925 -0.193207 0.320679 0.559631 -0.215790 0.325989 0.565521 -0.239105 0.331329 0.571472 -0.262848 0.336548 0.577332 -0.287262 0.341980 0.583374 -0.311951 0.347351 0.589325 -0.337067 0.352844 0.595459 -0.362488 0.358398 0.601654 -0.387787 0.363831 0.607697 -0.413300 0.369446 0.613892 -0.438751 0.375092 0.620117 -0.463867 0.380585 0.626160 -0.489746 0.386261 0.632446 -0.516266 0.391907 0.638702 -0.543152 0.397461 0.644806 -0.570709 0.403168 0.651031 -0.598267 0.408752 0.657074 -0.626099 0.414398 0.663330 -0.653809 0.420105 0.669495 -0.681061 0.425629 0.675537 -0.708130 0.431305 0.681671 -0.734741 0.436951 0.687836 -0.760590 0.442566 0.693756 -0.785980 0.448212 0.699768 -0.810760 0.453979 0.705750 -0.834595 0.459625 0.711548 -0.857758 0.465363 0.717438 -0.879944 0.471039 0.723175 -0.119904 0.329681 0.547974 -0.138947 0.334778 0.553650 -0.159241 0.340057 0.559509 -0.180542 0.345398 0.565399 -0.202606 0.350616 0.571167 -0.225555 0.356079 0.577179 -0.249146 0.361542 0.583221 -0.273163 0.366913 0.589172 -0.297791 0.372467 0.595306 -0.322662 0.377869 0.601318 -0.347961 0.383453 0.607513 -0.373444 0.389130 0.613770 -0.398834 0.394623 0.619812 -0.424316 0.400299 0.626007 -0.449677 0.405945 0.632294 -0.475037 0.411499 0.638397 -0.501190 0.417145 0.644653 -0.527954 0.422882 0.650909 -0.555145 0.428406 0.656921 -0.582764 0.434082 0.663147 -0.610352 0.439667 0.669220 -0.638153 0.445435 0.675415 -0.665802 0.451202 0.681549 -0.692871 0.456879 0.687469 -0.719696 0.462708 0.693573 -0.745972 0.468567 0.699646 -0.771606 0.474304 0.705475 -0.796722 0.480225 0.711395 -0.821106 0.486145 0.717316 -0.844604 0.491943 0.723022 -0.867340 0.497864 0.728851 -0.889038 0.503632 0.734406 -0.127686 0.359589 0.559326 -0.147278 0.364807 0.565094 -0.168030 0.370239 0.571075 -0.189789 0.375641 0.577026 -0.212219 0.381012 0.582916 -0.235474 0.386597 0.589020 -0.259247 0.391998 0.595001 -0.283691 0.397552 0.601196 -0.308533 0.403168 0.607361 -0.333527 0.408691 0.613403 -0.358917 0.414276 0.619629 -0.384491 0.419952 0.625885 -0.409851 0.425446 0.631958 -0.435394 0.431183 0.638275 -0.460693 0.436829 0.644470 -0.486298 0.442444 0.650574 -0.512756 0.448181 0.656769 -0.539642 0.453918 0.662842 -0.567108 0.459778 0.669067 -0.594788 0.465637 0.675232 -0.622467 0.471405 0.681213 -0.650146 0.477417 0.687347 -0.677582 0.483368 0.693451 -0.704498 0.489258 0.699310 -0.731110 0.495270 0.705322 -0.757111 0.501282 0.711243 -0.782440 0.507202 0.717041 -0.807220 0.513214 0.722900 -0.831085 0.519104 0.728577 -0.854309 0.525146 0.734283 -0.876617 0.531158 0.739929 -0.897919 0.536987 0.745453 -0.135803 0.389893 0.570862 -0.155914 0.395233 0.576721 -0.177124 0.400757 0.582794 -0.199249 0.406219 0.588837 -0.222046 0.411652 0.594879 -0.245636 0.417267 0.601013 -0.269653 0.422729 0.607056 -0.294312 0.428314 0.613251 -0.319336 0.433990 0.619476 -0.344513 0.439514 0.625580 -0.369995 0.445221 0.631805 -0.395569 0.451019 0.638092 -0.420959 0.456726 0.644165 -0.446381 0.462616 0.650452 -0.471771 0.468536 0.656647 -0.497711 0.474365 0.662659 -0.524445 0.480377 0.668915 -0.551483 0.486298 0.674927 -0.579132 0.492371 0.681061 -0.606842 0.498444 0.687195 -0.634430 0.504425 0.693146 -0.662018 0.510529 0.699158 -0.689270 0.516602 0.705139 -0.715973 0.522644 0.710968 -0.742310 0.528778 0.716919 -0.768066 0.534882 0.722748 -0.793060 0.540833 0.728394 -0.817474 0.546936 0.734131 -0.840973 0.552917 0.739685 -0.863800 0.558960 0.745300 -0.885651 0.565033 0.750885 -0.906464 0.570831 0.756256 -0.144196 0.420410 0.582611 -0.164764 0.425812 0.588562 -0.186462 0.431396 0.594696 -0.208954 0.436951 0.600830 -0.232117 0.442474 0.606873 -0.256012 0.448181 0.613129 -0.280243 0.453796 0.619171 -0.305115 0.459686 0.625427 -0.330322 0.465515 0.631653 -0.355560 0.471313 0.637787 -0.381104 0.477295 0.644012 -0.406677 0.483337 0.650269 -0.432037 0.489227 0.656342 -0.457367 0.495361 0.662506 -0.483063 0.501465 0.668793 -0.509247 0.507477 0.674744 -0.536194 0.513641 0.680939 -0.563416 0.519745 0.686890 -0.591095 0.525970 0.692963 -0.618835 0.532166 0.699005 -0.646362 0.538239 0.704865 -0.673767 0.544434 0.710846 -0.700806 0.550659 0.716736 -0.727264 0.556702 0.722443 -0.753357 0.562866 0.728271 -0.778778 0.569031 0.734039 -0.803406 0.575073 0.739532 -0.827484 0.581177 0.745148 -0.850616 0.587067 0.750610 -0.872986 0.593079 0.756073 -0.894379 0.599121 0.761536 -0.914703 0.604828 0.766724 -0.152893 0.451263 0.594543 -0.173920 0.456879 0.600555 -0.196045 0.462646 0.606720 -0.218903 0.468506 0.612976 -0.242340 0.474274 0.619019 -0.266479 0.480316 0.625244 -0.290985 0.486145 0.631348 -0.315979 0.492218 0.637573 -0.341309 0.498291 0.643829 -0.366638 0.504303 0.649933 -0.392242 0.510529 0.656158 -0.417786 0.516724 0.662384 -0.443054 0.522827 0.668427 -0.468445 0.529053 0.674622 -0.494263 0.535217 0.680603 -0.520874 0.541443 0.686737 -0.548065 0.547760 0.692810 -0.575378 0.553925 0.698700 -0.603058 0.560211 0.704742 -0.630768 0.566498 0.710632 -0.658173 0.572632 0.716431 -0.685394 0.578857 0.722321 -0.712158 0.585083 0.728088 -0.738312 0.591125 0.733704 -0.764130 0.597290 0.739410 -0.789215 0.603424 0.745026 -0.813538 0.609344 0.750458 -0.837189 0.615417 0.755951 -0.859924 0.621216 0.761261 -0.881836 0.627197 0.766571 -0.902832 0.633057 0.771820 -0.922607 0.638702 0.776947 -0.161865 0.483337 0.606598 -0.183350 0.489197 0.612671 -0.205780 0.495239 0.618866 -0.228912 0.501221 0.624939 -0.252716 0.507355 0.631226 -0.277130 0.513489 0.637451 -0.301819 0.519592 0.643524 -0.326965 0.525848 0.649780 -0.352386 0.532135 0.656036 -0.377777 0.538269 0.662109 -0.403351 0.544556 0.668304 -0.428833 0.550934 0.674469 -0.454102 0.557098 0.680450 -0.479584 0.563477 0.686554 -0.505737 0.569702 0.692535 -0.532562 0.576019 0.698578 -0.559814 0.582367 0.704590 -0.587250 0.588531 0.710388 -0.614929 0.594849 0.716309 -0.642548 0.601105 0.722168 -0.669769 0.607239 0.727814 -0.696747 0.613434 0.733582 -0.723358 0.619629 0.739258 -0.749207 0.625610 0.744751 -0.774658 0.631653 0.750336 -0.799286 0.637482 0.755646 -0.823364 0.643524 0.761108 -0.846649 0.649414 0.766449 -0.868958 0.655121 0.771576 -0.890442 0.660858 0.776825 -0.910858 0.666595 0.781921 -0.930145 0.672028 0.786804 -0.171082 0.516571 0.618713 -0.192963 0.522644 0.624756 -0.215790 0.528870 0.631042 -0.239166 0.535034 0.637146 -0.263245 0.541351 0.643402 -0.287872 0.547668 0.649628 -0.312683 0.553894 0.655731 -0.338013 0.560272 0.661957 -0.363495 0.566620 0.668121 -0.388885 0.572876 0.674133 -0.414368 0.579285 0.680267 -0.439880 0.585663 0.686401 -0.465027 0.591888 0.692352 -0.490845 0.598267 0.698425 -0.517212 0.604462 0.704315 -0.544220 0.610809 0.710236 -0.571594 0.617096 0.716125 -0.599030 0.623260 0.721863 -0.626648 0.629517 0.727692 -0.654144 0.635681 0.733429 -0.681152 0.641724 0.738983 -0.707947 0.647827 0.744568 -0.734253 0.653839 0.750183 -0.759796 0.659668 0.755524 -0.784943 0.665619 0.760956 -0.809204 0.671356 0.766205 -0.832916 0.677094 0.771484 -0.855774 0.682892 0.776672 -0.877594 0.688293 0.781677 -0.898621 0.693848 0.786713 -0.918579 0.699310 0.791656 -0.937378 0.704651 0.796417 -0.180389 0.550629 0.630737 -0.202789 0.556946 0.636993 -0.225922 0.563354 0.643250 -0.249573 0.569611 0.649323 -0.273926 0.575989 0.655579 -0.298676 0.582397 0.661804 -0.323669 0.588715 0.667786 -0.349060 0.595093 0.673981 -0.374542 0.601562 0.680145 -0.399963 0.607819 0.686096 -0.425415 0.614166 0.692230 -0.450623 0.620392 0.698090 -0.476074 0.626740 0.704132 -0.502197 0.633087 0.710083 -0.528717 0.639221 0.715851 -0.555847 0.645477 0.721680 -0.583344 0.651733 0.727539 -0.610748 0.657715 0.733154 -0.638306 0.663849 0.738831 -0.665588 0.669891 0.744476 -0.692383 0.675720 0.749878 -0.718903 0.681610 0.755371 -0.744781 0.687378 0.760681 -0.770203 0.693176 0.766052 -0.794922 0.698883 0.771332 -0.818878 0.704437 0.776428 -0.842133 0.709961 0.781555 -0.864594 0.715485 0.786591 -0.885986 0.720734 0.791412 -0.906525 0.726013 0.796265 -0.925964 0.731262 0.801025 -0.944244 0.736298 0.805603 -0.190002 0.585358 0.642914 -0.212769 0.591766 0.649170 -0.236176 0.598236 0.655396 -0.260071 0.604492 0.661469 -0.284637 0.610931 0.667664 -0.309570 0.617371 0.673859 -0.334656 0.623657 0.679840 -0.360077 0.630096 0.685974 -0.385620 0.636414 0.692017 -0.410980 0.642639 0.697937 -0.436340 0.649017 0.703949 -0.461517 0.655151 0.709808 -0.487183 0.661377 0.715668 -0.513489 0.667572 0.721558 -0.540222 0.673584 0.727234 -0.567444 0.679688 0.733032 -0.594940 0.685760 0.738678 -0.622314 0.691559 0.744202 -0.649689 0.697510 0.749756 -0.676819 0.703339 0.755249 -0.703400 0.709015 0.760559 -0.729614 0.714722 0.765930 -0.755157 0.720245 0.771057 -0.780273 0.725830 0.776306 -0.804657 0.731293 0.781433 -0.828156 0.736572 0.786316 -0.851074 0.741852 0.791260 -0.873047 0.747162 0.796173 -0.893982 0.752136 0.800842 -0.914062 0.757172 0.805511 -0.933044 0.762177 0.810089 -0.950714 0.766876 0.814514 -0.199799 0.620361 0.655090 -0.222870 0.626801 0.661346 -0.246582 0.633240 0.667511 -0.270691 0.639496 0.673523 -0.295441 0.645935 0.679688 -0.320465 0.652252 0.685822 -0.345703 0.658478 0.691742 -0.371155 0.664764 0.697815 -0.396484 0.670898 0.703674 -0.421936 0.677094 0.709625 -0.447205 0.683319 0.715546 -0.472321 0.689270 0.721283 -0.498291 0.695374 0.727081 -0.524780 0.701416 0.732880 -0.551636 0.707214 0.738403 -0.578918 0.713165 0.744019 -0.606384 0.719025 0.749634 -0.633667 0.724640 0.754974 -0.660889 0.730347 0.760437 -0.687683 0.735840 0.765686 -0.714142 0.741425 0.770935 -0.740021 0.746918 0.776154 -0.765259 0.752167 0.781158 -0.789978 0.757477 0.786163 -0.814056 0.762726 0.791168 -0.837158 0.767792 0.795929 -0.859619 0.772797 0.800690 -0.881226 0.777740 0.805420 -0.901642 0.782501 0.809875 -0.921234 0.787262 0.814362 -0.939636 0.791809 0.818726 -0.956879 0.796417 0.822998 -0.209747 0.655243 0.667206 -0.233093 0.661652 0.673370 -0.257050 0.667999 0.679504 -0.281372 0.674164 0.685516 -0.306213 0.680450 0.691589 -0.331390 0.686676 0.697662 -0.356598 0.692749 0.703552 -0.382080 0.698853 0.709503 -0.407410 0.704865 0.715240 -0.432739 0.710938 0.721130 -0.457947 0.716919 0.726959 -0.483276 0.722717 0.732574 -0.509399 0.728638 0.738281 -0.536041 0.734406 0.743896 -0.562988 0.740021 0.749329 -0.590271 0.745758 0.754852 -0.617737 0.751404 0.760315 -0.644867 0.756805 0.765533 -0.671906 0.762268 0.770844 -0.698364 0.767487 0.775848 -0.724548 0.772827 0.781036 -0.750183 0.778046 0.786072 -0.775055 0.783020 0.790894 -0.799408 0.788086 0.795776 -0.823090 0.793060 0.800598 -0.845825 0.797791 0.805145 -0.867828 0.802582 0.809784 -0.888947 0.807220 0.814270 -0.908966 0.811676 0.818573 -0.928070 0.816162 0.822906 -0.945892 0.820374 0.826965 -0.962708 0.824646 0.831116 -0.219818 0.689697 0.679230 -0.243439 0.695923 0.685364 -0.267548 0.702118 0.691437 -0.292053 0.708160 0.697327 -0.317017 0.714294 0.703369 -0.342133 0.720215 0.709229 -0.367523 0.726227 0.715088 -0.392944 0.732208 0.720978 -0.418182 0.738007 0.726654 -0.443451 0.743835 0.732422 -0.468567 0.749664 0.738159 -0.494141 0.755249 0.743652 -0.520508 0.760895 0.749176 -0.547272 0.766510 0.754730 -0.574249 0.771851 0.760040 -0.601501 0.777313 0.765411 -0.628845 0.782684 0.770721 -0.655792 0.787811 0.775726 -0.682648 0.793060 0.780884 -0.708801 0.798065 0.785797 -0.734741 0.803070 0.790802 -0.759918 0.808044 0.795654 -0.784576 0.812775 0.800385 -0.808563 0.817505 0.805054 -0.831787 0.822174 0.809662 -0.854126 0.826630 0.814056 -0.875732 0.831055 0.818481 -0.896393 0.835449 0.822784 -0.915955 0.839569 0.826904 -0.934540 0.843719 0.830994 -0.951874 0.847687 0.834961 -0.968109 0.851624 0.838867 -0.229950 0.723419 0.691132 -0.253754 0.729492 0.697205 -0.278107 0.735535 0.703247 -0.302734 0.741394 0.709076 -0.327820 0.747314 0.714966 -0.352997 0.753082 0.720673 -0.378357 0.758911 0.726501 -0.403717 0.764648 0.732300 -0.428833 0.770172 0.737854 -0.453979 0.775818 0.743500 -0.479248 0.781372 0.749054 -0.505035 0.786743 0.754456 -0.531494 0.792145 0.759888 -0.558319 0.797485 0.765259 -0.585297 0.802612 0.770447 -0.612518 0.807770 0.775574 -0.639557 0.812744 0.780640 -0.666443 0.817719 0.785675 -0.693024 0.822632 0.790649 -0.718933 0.827362 0.795410 -0.744476 0.832123 0.800232 -0.769470 0.836761 0.804932 -0.793640 0.841125 0.809418 -0.817261 0.845551 0.813904 -0.840149 0.849915 0.818329 -0.862061 0.854034 0.822571 -0.883209 0.858215 0.826813 -0.903320 0.862122 0.830811 -0.922485 0.866058 0.834808 -0.940582 0.869904 0.838745 -0.957458 0.873505 0.842438 -0.973206 0.877136 0.846191 -0.240143 0.756317 0.702942 -0.264221 0.762238 0.708893 -0.288574 0.767944 0.714691 -0.313385 0.773651 0.720520 -0.338562 0.779327 0.726379 -0.363708 0.784882 0.732025 -0.389038 0.790497 0.737701 -0.414276 0.795990 0.743378 -0.439362 0.801300 0.748779 -0.464355 0.806671 0.754303 -0.489838 0.811981 0.759766 -0.515747 0.817047 0.764954 -0.542328 0.822205 0.770294 -0.569122 0.827118 0.775360 -0.596191 0.832123 0.780518 -0.623352 0.836975 0.785583 -0.650177 0.841583 0.790405 -0.676849 0.846344 0.795319 -0.703125 0.850922 0.800110 -0.728790 0.855316 0.804718 -0.753967 0.859772 0.809296 -0.778564 0.864075 0.813782 -0.802460 0.868134 0.818115 -0.825684 0.872253 0.822479 -0.848083 0.876251 0.826691 -0.869629 0.880096 0.830688 -0.890320 0.883881 0.834717 -0.910004 0.887482 0.838562 -0.928711 0.891052 0.842346 -0.946289 0.894592 0.846069 -0.962708 0.897888 0.849609 -0.977905 0.901123 0.853027 -0.250427 0.788239 0.714508 -0.274597 0.793915 0.720367 -0.299072 0.799347 0.726074 -0.324066 0.804871 0.731842 -0.349213 0.810333 0.737549 -0.374298 0.815613 0.743103 -0.399628 0.820923 0.748627 -0.424805 0.826172 0.754181 -0.449677 0.831177 0.759491 -0.474701 0.836273 0.764832 -0.500366 0.841309 0.770172 -0.526489 0.846069 0.775269 -0.553131 0.850922 0.780396 -0.579865 0.855530 0.785309 -0.606873 0.860168 0.790283 -0.633850 0.864777 0.795197 -0.660522 0.869110 0.799866 -0.686920 0.873474 0.804596 -0.712891 0.877747 0.809174 -0.738190 0.881866 0.813599 -0.763092 0.885895 0.818054 -0.787415 0.889893 0.822388 -0.810883 0.893646 0.826477 -0.833679 0.897400 0.830597 -0.855621 0.901031 0.834564 -0.876801 0.904572 0.838470 -0.897034 0.908051 0.842255 -0.916229 0.911255 0.845886 -0.934540 0.914551 0.849518 -0.951630 0.917694 0.852966 -0.967499 0.920624 0.856323 -0.982239 0.923584 0.859558 -0.260651 0.819000 0.725922 -0.285034 0.824371 0.731689 -0.309601 0.829590 0.737274 -0.334564 0.834839 0.742920 -0.359711 0.840027 0.748505 -0.384827 0.845001 0.753876 -0.410004 0.850067 0.759369 -0.435089 0.854980 0.764709 -0.459808 0.859772 0.769928 -0.485016 0.864471 0.775116 -0.510681 0.869080 0.780090 -0.536987 0.873688 0.785156 -0.563660 0.878204 0.790161 -0.590332 0.882507 0.794952 -0.617279 0.886841 0.799744 -0.644104 0.891022 0.804474 -0.670532 0.895111 0.808990 -0.696686 0.899078 0.813507 -0.722321 0.903046 0.817932 -0.747375 0.906738 0.822144 -0.771851 0.910492 0.826355 -0.795746 0.914154 0.830505 -0.818848 0.917542 0.834442 -0.841309 0.920990 0.838379 -0.862793 0.924194 0.842072 -0.883606 0.927399 0.845764 -0.903381 0.930481 0.849396 -0.922150 0.933441 0.852814 -0.939941 0.936310 0.856201 -0.956604 0.939087 0.859497 -0.972015 0.941742 0.862579 -0.986237 0.944305 0.865631 -0.270905 0.848480 0.737152 -0.295380 0.853607 0.742798 -0.320007 0.858551 0.748291 -0.345001 0.863464 0.753723 -0.370148 0.868347 0.759216 -0.395142 0.873047 0.764435 -0.420227 0.877747 0.769775 -0.445129 0.882385 0.774994 -0.469849 0.886810 0.779968 -0.495178 0.891205 0.785034 -0.520935 0.895477 0.789917 -0.547363 0.899719 0.794830 -0.573975 0.903900 0.799652 -0.600677 0.907867 0.804230 -0.627441 0.911804 0.808868 -0.654053 0.915680 0.813385 -0.680206 0.919373 0.817719 -0.706024 0.923035 0.822021 -0.731415 0.926575 0.826263 -0.756073 0.929993 0.830322 -0.780273 0.933380 0.834320 -0.803650 0.936523 0.838165 -0.826447 0.939697 0.841980 -0.848511 0.942780 0.845703 -0.869629 0.945618 0.849213 -0.889954 0.948486 0.852722 -0.909332 0.951233 0.856140 -0.927673 0.953827 0.859283 -0.944977 0.956390 0.862518 -0.961182 0.958801 0.865540 -0.976135 0.961060 0.868378 -0.989899 0.963287 0.871277 -0.281036 0.876556 0.748108 -0.305573 0.881378 0.753601 -0.330322 0.885956 0.758942 -0.355316 0.890625 0.764343 -0.380371 0.895172 0.769623 -0.405273 0.899475 0.774750 -0.430206 0.903870 0.779846 -0.454834 0.908051 0.784821 -0.479736 0.912231 0.789795 -0.505249 0.916351 0.794678 -0.531128 0.920227 0.799377 -0.557526 0.924103 0.804138 -0.584106 0.927917 0.808777 -0.610687 0.931519 0.813202 -0.637238 0.935089 0.817596 -0.663635 0.938629 0.821930 -0.689545 0.941895 0.826050 -0.715057 0.945221 0.830170 -0.740051 0.948425 0.834229 -0.764374 0.951447 0.838074 -0.788239 0.954468 0.841888 -0.811279 0.957275 0.845490 -0.833710 0.960052 0.849121 -0.855316 0.962769 0.852661 -0.876068 0.965271 0.855957 -0.895935 0.967773 0.859253 -0.914886 0.970154 0.862396 -0.932770 0.972382 0.865387 -0.949615 0.974579 0.868317 -0.965363 0.976685 0.871185 -0.979889 0.978638 0.873810 -0.993195 0.980560 0.876404 -0.291138 0.903046 0.758789 -0.315765 0.907501 0.764191 -0.340485 0.911774 0.769379 -0.365417 0.916077 0.774628 -0.390411 0.920288 0.779755 -0.415222 0.924255 0.784668 -0.440033 0.928284 0.789673 -0.464508 0.932098 0.794464 -0.489532 0.935913 0.799255 -0.515137 0.939606 0.804016 -0.541016 0.943146 0.808502 -0.567413 0.946655 0.813049 -0.593964 0.950073 0.817505 -0.620361 0.953308 0.821686 -0.646759 0.956543 0.825928 -0.672852 0.959686 0.830078 -0.698425 0.962646 0.834045 -0.723663 0.965515 0.837982 -0.748260 0.968323 0.841705 -0.772369 0.970978 0.845428 -0.795776 0.973663 0.849030 -0.818451 0.976105 0.852478 -0.840515 0.978516 0.855896 -0.861725 0.980835 0.859161 -0.882050 0.983002 0.862244 -0.901489 0.985168 0.865295 -0.920013 0.987213 0.868225 -0.937469 0.989105 0.871033 -0.953888 0.990997 0.873749 -0.969177 0.992676 0.876251 -0.983307 0.994354 0.878815 -0.996185 0.995911 0.881165 -0.049561 0.046783 0.452271 -0.062714 0.048370 0.455566 -0.076508 0.050079 0.459076 -0.091156 0.051849 0.462738 -0.107025 0.053619 0.466370 -0.124176 0.055511 0.470245 -0.142517 0.057465 0.474243 -0.161774 0.059418 0.478241 -0.182037 0.061493 0.482452 -0.203125 0.063660 0.486786 -0.224884 0.065796 0.491119 -0.247406 0.068085 0.495667 -0.270386 0.070374 0.500214 -0.293945 0.072815 0.504944 -0.317902 0.075287 0.509827 -0.342102 0.077820 0.514648 -0.366669 0.080475 0.519714 -0.391357 0.083191 0.524841 -0.415955 0.085938 0.529938 -0.440643 0.088867 0.535217 -0.465332 0.091827 0.540649 -0.490448 0.094849 0.545990 -0.516357 0.097992 0.551575 -0.542725 0.101166 0.557068 -0.569702 0.104553 0.562714 -0.596954 0.107971 0.568481 -0.624237 0.111420 0.574219 -0.651581 0.115051 0.580048 -0.678741 0.118744 0.585968 -0.705414 0.122467 0.591797 -0.731781 0.126312 0.597809 -0.757751 0.130280 0.603882 -0.053375 0.059875 0.458954 -0.066742 0.061646 0.462555 -0.080841 0.063568 0.466309 -0.095978 0.065552 0.470154 -0.112366 0.067535 0.474091 -0.130035 0.069641 0.478149 -0.148804 0.071808 0.482361 -0.168488 0.074036 0.486572 -0.189178 0.076355 0.490997 -0.210571 0.078735 0.495422 -0.232788 0.081207 0.500122 -0.255646 0.083801 0.504852 -0.278931 0.086395 0.509583 -0.302734 0.089111 0.514496 -0.326996 0.091980 0.519592 -0.351410 0.094849 0.524597 -0.376129 0.097870 0.529785 -0.400909 0.100983 0.535095 -0.425629 0.104065 0.540375 -0.450409 0.107361 0.545837 -0.475128 0.110687 0.551270 -0.500793 0.114166 0.556915 -0.527039 0.117767 0.562592 -0.553711 0.121277 0.568176 -0.580902 0.125031 0.574066 -0.608307 0.128845 0.579865 -0.635620 0.132690 0.585663 -0.662964 0.136688 0.591614 -0.690033 0.140717 0.597656 -0.716614 0.144806 0.603577 -0.742859 0.148987 0.609680 -0.768524 0.153168 0.615631 -0.057404 0.074005 0.466187 -0.071045 0.076050 0.469971 -0.085541 0.078217 0.473969 -0.101166 0.080475 0.478058 -0.118073 0.082703 0.482147 -0.136200 0.085083 0.486420 -0.155457 0.087616 0.490906 -0.175598 0.090118 0.495300 -0.196716 0.092804 0.499969 -0.218506 0.095490 0.504608 -0.241028 0.098358 0.509460 -0.264221 0.101257 0.514374 -0.287781 0.104248 0.519318 -0.311890 0.107361 0.524445 -0.336334 0.110626 0.529633 -0.360901 0.113831 0.534851 -0.385803 0.117249 0.540253 -0.410736 0.120789 0.545685 -0.435516 0.124268 0.551117 -0.460327 0.127930 0.556793 -0.485413 0.131622 0.562286 -0.511414 0.135437 0.567993 -0.537964 0.139404 0.573883 -0.564911 0.143311 0.579620 -0.592255 0.147430 0.585541 -0.619781 0.151581 0.591461 -0.647125 0.155731 0.597382 -0.674500 0.160065 0.603394 -0.701447 0.164459 0.609528 -0.727875 0.168823 0.615479 -0.753967 0.173340 0.621643 -0.779358 0.177887 0.627655 -0.061707 0.089569 0.473877 -0.075592 0.091919 0.477844 -0.090576 0.094391 0.482056 -0.106781 0.096985 0.486328 -0.124176 0.099609 0.490692 -0.142822 0.102325 0.495209 -0.162445 0.105103 0.499725 -0.183105 0.108093 0.504456 -0.204590 0.111115 0.509338 -0.226746 0.114197 0.514160 -0.249664 0.117432 0.519196 -0.273132 0.120789 0.524292 -0.296967 0.124084 0.529388 -0.321289 0.127625 0.534698 -0.345978 0.131195 0.540100 -0.370697 0.134796 0.545380 -0.395721 0.138611 0.550995 -0.420593 0.142365 0.556458 -0.445526 0.146301 0.562134 -0.470490 0.150330 0.567871 -0.496033 0.154327 0.573608 -0.522308 0.158539 0.579437 -0.549194 0.162811 0.585388 -0.576294 0.167023 0.591187 -0.603821 0.171448 0.597229 -0.631378 0.175964 0.603271 -0.658783 0.180389 0.609222 -0.686035 0.185028 0.615326 -0.712708 0.189636 0.621368 -0.739136 0.194397 0.627502 -0.765045 0.199188 0.633667 -0.790222 0.203949 0.639740 -0.066254 0.106903 0.481964 -0.080536 0.109619 0.486115 -0.095947 0.112457 0.490601 -0.112732 0.115417 0.495056 -0.130676 0.118378 0.499634 -0.149811 0.121490 0.504333 -0.169861 0.124634 0.509094 -0.190918 0.127960 0.514008 -0.212860 0.131409 0.519073 -0.235352 0.134796 0.524048 -0.258575 0.138428 0.529236 -0.282349 0.142090 0.534546 -0.306427 0.145782 0.539856 -0.330994 0.149658 0.545288 -0.355865 0.153595 0.550842 -0.380707 0.157501 0.556305 -0.405823 0.161652 0.562012 -0.430817 0.165741 0.567596 -0.455780 0.170013 0.573425 -0.480988 0.174408 0.579346 -0.506866 0.178711 0.585083 -0.533508 0.183228 0.591064 -0.560577 0.187805 0.597046 -0.587921 0.192291 0.602966 -0.615509 0.197052 0.609039 -0.643188 0.201813 0.615173 -0.670441 0.206543 0.621185 -0.697571 0.211426 0.627380 -0.724121 0.216278 0.633392 -0.750397 0.221283 0.639587 -0.776062 0.226318 0.645813 -0.800995 0.231262 0.651886 -0.071075 0.126160 0.490479 -0.085754 0.129150 0.494843 -0.101715 0.132385 0.499512 -0.118958 0.135590 0.504120 -0.137512 0.139008 0.508942 -0.157135 0.142487 0.513855 -0.177673 0.145996 0.518829 -0.199158 0.149689 0.523926 -0.221405 0.153412 0.529114 -0.244263 0.157166 0.534302 -0.267792 0.161133 0.539703 -0.291870 0.165161 0.545135 -0.316162 0.169128 0.550598 -0.340973 0.173309 0.556183 -0.365784 0.177521 0.561707 -0.390961 0.181885 0.567444 -0.416168 0.186310 0.573273 -0.441101 0.190704 0.578979 -0.466156 0.195251 0.584900 -0.491791 0.199890 0.590881 -0.518005 0.204529 0.596741 -0.544861 0.209290 0.602814 -0.572235 0.214142 0.608887 -0.599670 0.218933 0.614899 -0.627380 0.223907 0.621063 -0.654816 0.228821 0.627075 -0.682159 0.233887 0.633270 -0.709167 0.239044 0.639465 -0.735565 0.244049 0.645508 -0.761566 0.249268 0.651672 -0.787018 0.254486 0.657959 -0.811646 0.259705 0.663971 -0.076172 0.147125 0.499420 -0.091370 0.150513 0.503998 -0.107880 0.154022 0.508850 -0.125671 0.157593 0.513611 -0.144714 0.161285 0.518677 -0.164795 0.165161 0.523804 -0.185791 0.169006 0.528839 -0.207672 0.172974 0.534180 -0.230316 0.177063 0.539551 -0.253479 0.181152 0.544830 -0.277313 0.185394 0.550446 -0.301636 0.189758 0.556030 -0.326141 0.194031 0.561523 -0.351135 0.198547 0.567322 -0.376129 0.203003 0.572998 -0.401367 0.207611 0.578827 -0.426575 0.212341 0.584747 -0.451599 0.217041 0.590576 -0.476868 0.221863 0.596588 -0.502869 0.226776 0.602692 -0.529358 0.231628 0.608612 -0.556488 0.236664 0.614716 -0.583984 0.241699 0.620911 -0.611542 0.246735 0.626892 -0.639252 0.251923 0.633087 -0.666626 0.257050 0.639130 -0.693939 0.262268 0.645325 -0.720673 0.267609 0.651550 -0.746918 0.272858 0.657654 -0.772705 0.278229 0.663849 -0.797852 0.283630 0.670044 -0.822235 0.288910 0.676086 -0.081512 0.169647 0.508575 -0.097290 0.173401 0.513519 -0.114410 0.177277 0.518555 -0.132751 0.181152 0.523529 -0.152283 0.185211 0.528748 -0.172882 0.189362 0.534027 -0.194214 0.193481 0.539307 -0.216492 0.197784 0.544708 -0.239532 0.202179 0.550293 -0.263000 0.206543 0.555725 -0.287079 0.211060 0.561401 -0.311493 0.215576 0.567078 -0.336365 0.220276 0.572845 -0.361481 0.225067 0.578705 -0.386597 0.229767 0.584473 -0.411865 0.234650 0.590424 -0.437134 0.239594 0.596466 -0.462158 0.244537 0.602356 -0.487762 0.249603 0.608429 -0.514099 0.254730 0.614563 -0.540863 0.259827 0.620575 -0.568268 0.265045 0.626770 -0.595886 0.270325 0.632935 -0.623505 0.275513 0.639038 -0.651184 0.280884 0.645172 -0.678528 0.286133 0.651245 -0.705597 0.291565 0.657501 -0.732208 0.297089 0.663696 -0.758209 0.302429 0.669739 -0.783722 0.307922 0.675873 -0.808624 0.313446 0.682068 -0.832672 0.318909 0.688049 -0.087280 0.193726 0.518280 -0.103577 0.197845 0.523407 -0.121307 0.201965 0.528625 -0.140137 0.206177 0.533783 -0.160187 0.210510 0.539154 -0.181213 0.214935 0.544617 -0.203003 0.219330 0.550018 -0.225647 0.223938 0.555603 -0.248962 0.228607 0.561279 -0.272766 0.233215 0.566925 -0.297089 0.238007 0.572693 -0.321747 0.242767 0.578400 -0.346771 0.247711 0.584320 -0.372040 0.252716 0.590271 -0.397247 0.257660 0.596161 -0.422577 0.262756 0.602173 -0.447815 0.267975 0.608307 -0.472992 0.273071 0.614288 -0.498962 0.278351 0.620422 -0.525604 0.283661 0.626617 -0.552643 0.288879 0.632660 -0.580170 0.294312 0.638855 -0.607758 0.299652 0.644928 -0.635559 0.305115 0.651123 -0.663147 0.310608 0.657318 -0.690338 0.315979 0.663391 -0.717224 0.321564 0.669586 -0.743652 0.327148 0.675751 -0.769409 0.332611 0.681763 -0.794617 0.338226 0.687927 -0.819183 0.343842 0.694061 -0.842865 0.349335 0.699951 -0.093353 0.219177 0.528351 -0.110291 0.223541 0.533630 -0.128571 0.228027 0.539032 -0.147888 0.232452 0.544342 -0.168427 0.237061 0.549866 -0.189880 0.241730 0.555450 -0.212097 0.246399 0.561005 -0.235077 0.251221 0.566772 -0.258575 0.256042 0.572418 -0.282776 0.260986 0.578247 -0.307343 0.266022 0.584198 -0.332153 0.271027 0.589966 -0.357361 0.276154 0.595947 -0.382721 0.281403 0.602051 -0.407990 0.286530 0.608032 -0.433350 0.291809 0.614136 -0.458588 0.297211 0.620300 -0.484070 0.302460 0.626312 -0.510315 0.307892 0.632477 -0.537292 0.313354 0.638672 -0.564484 0.318756 0.644806 -0.592163 0.324310 0.650970 -0.619812 0.329712 0.656982 -0.647522 0.335327 0.663208 -0.675049 0.340912 0.669403 -0.702057 0.346436 0.675476 -0.728790 0.352081 0.681610 -0.754974 0.357697 0.687775 -0.780426 0.363220 0.693726 -0.805420 0.368866 0.699829 -0.829620 0.374512 0.705841 -0.852905 0.380066 0.711731 -0.099762 0.245819 0.538788 -0.117340 0.250458 0.544220 -0.136169 0.255157 0.549713 -0.156036 0.259857 0.555176 -0.177002 0.264709 0.560852 -0.198853 0.269653 0.566620 -0.221405 0.274475 0.572266 -0.244720 0.279572 0.578125 -0.268555 0.284546 0.583893 -0.292969 0.289764 0.589844 -0.317780 0.294952 0.595825 -0.342773 0.300110 0.601715 -0.368073 0.305450 0.607880 -0.393524 0.310852 0.614014 -0.418762 0.316101 0.619965 -0.444183 0.321625 0.626129 -0.469513 0.327118 0.632355 -0.495270 0.332520 0.638397 -0.521942 0.338104 0.644623 -0.548920 0.343567 0.650665 -0.576447 0.349152 0.656830 -0.604248 0.354797 0.663055 -0.631897 0.360291 0.669128 -0.659515 0.365967 0.675293 -0.686920 0.371674 0.681488 -0.713715 0.377167 0.687439 -0.740234 0.382843 0.693634 -0.766144 0.388519 0.699677 -0.791351 0.394043 0.705566 -0.815979 0.399719 0.711548 -0.839752 0.405212 0.717407 -0.862762 0.410828 0.723389 -0.106598 0.273499 0.549438 -0.124725 0.278381 0.555023 -0.144073 0.283325 0.560699 -0.164459 0.288208 0.566345 -0.185852 0.293274 0.572144 -0.208038 0.298309 0.577850 -0.231018 0.303467 0.583740 -0.254700 0.308746 0.589691 -0.278748 0.313904 0.595551 -0.303375 0.319275 0.601624 -0.328430 0.324677 0.607697 -0.353546 0.329956 0.613647 -0.378967 0.335449 0.619812 -0.404419 0.340973 0.625977 -0.429718 0.346405 0.631989 -0.455048 0.351990 0.638214 -0.480621 0.357574 0.644440 -0.506744 0.363098 0.650513 -0.533661 0.368744 0.656677 -0.560852 0.374237 0.662750 -0.588501 0.379913 0.668945 -0.616302 0.385620 0.675171 -0.643951 0.391174 0.681122 -0.671539 0.396881 0.687317 -0.698669 0.402496 0.693451 -0.725281 0.408081 0.699371 -0.751556 0.413757 0.705444 -0.777222 0.419403 0.711426 -0.802063 0.424896 0.717285 -0.826385 0.430542 0.723206 -0.849762 0.435974 0.728973 -0.872375 0.441589 0.734802 -0.113739 0.302124 0.560425 -0.132446 0.307220 0.566162 -0.152374 0.312317 0.571960 -0.173126 0.317413 0.577698 -0.194977 0.322723 0.583588 -0.217529 0.327881 0.589386 -0.240875 0.333221 0.595398 -0.264832 0.338623 0.601471 -0.289154 0.343933 0.607391 -0.314026 0.349426 0.613495 -0.339172 0.354950 0.619659 -0.364441 0.360352 0.625671 -0.389923 0.365936 0.631897 -0.415405 0.371552 0.638092 -0.440674 0.377045 0.644104 -0.466003 0.382660 0.650360 -0.491791 0.388214 0.656403 -0.518311 0.393890 0.662567 -0.545471 0.399628 0.668823 -0.572845 0.405151 0.674805 -0.600647 0.410828 0.681000 -0.628387 0.416534 0.687134 -0.656006 0.422089 0.693176 -0.683380 0.427765 0.699219 -0.710388 0.433411 0.705261 -0.736725 0.438995 0.711151 -0.762695 0.444641 0.717163 -0.787933 0.450256 0.722931 -0.812622 0.456024 0.728851 -0.836548 0.461761 0.734650 -0.859497 0.467407 0.740295 -0.881683 0.473236 0.746063 -0.121277 0.331482 0.571655 -0.140533 0.336761 0.577545 -0.160797 0.341888 0.583282 -0.182190 0.347260 0.589203 -0.204437 0.352661 0.595245 -0.227295 0.357971 0.601196 -0.250946 0.363464 0.607269 -0.275177 0.369019 0.613342 -0.299713 0.374390 0.619354 -0.324768 0.379974 0.625519 -0.350098 0.385590 0.631714 -0.375427 0.391083 0.637787 -0.400940 0.396729 0.643982 -0.426300 0.402252 0.650055 -0.451660 0.407928 0.656250 -0.477203 0.413574 0.662415 -0.503265 0.419098 0.668488 -0.530090 0.424835 0.674683 -0.557404 0.430542 0.680847 -0.584930 0.436066 0.686859 -0.612701 0.441803 0.692963 -0.640472 0.447540 0.699036 -0.667908 0.453247 0.704956 -0.695099 0.459045 0.710968 -0.721893 0.464874 0.716980 -0.748016 0.470642 0.722778 -0.773682 0.476532 0.728699 -0.798615 0.482300 0.734375 -0.822937 0.488251 0.740143 -0.846466 0.494171 0.745911 -0.869049 0.499939 0.751465 -0.890808 0.505829 0.757080 -0.129150 0.361481 0.583130 -0.148895 0.366852 0.589081 -0.169647 0.372101 0.594940 -0.191437 0.377594 0.601013 -0.214050 0.383087 0.607117 -0.237305 0.388489 0.613037 -0.261261 0.394043 0.619202 -0.285675 0.399689 0.625397 -0.310425 0.405151 0.631409 -0.335663 0.410767 0.637573 -0.361084 0.416443 0.643829 -0.386444 0.421967 0.649872 -0.412018 0.427612 0.656097 -0.437347 0.433167 0.662170 -0.462646 0.438843 0.668335 -0.488495 0.444611 0.674530 -0.514893 0.450256 0.680542 -0.541931 0.456085 0.686646 -0.569427 0.461975 0.692810 -0.596954 0.467743 0.698761 -0.624725 0.473663 0.704773 -0.652466 0.479675 0.710846 -0.679688 0.485504 0.716705 -0.706696 0.491516 0.722626 -0.733124 0.497406 0.728394 -0.759094 0.503418 0.734222 -0.784515 0.509460 0.739990 -0.809052 0.515320 0.745636 -0.833038 0.521362 0.751312 -0.856171 0.527405 0.756958 -0.878296 0.533264 0.762390 -0.899567 0.539215 0.767883 -0.137268 0.391785 0.594818 -0.157593 0.397278 0.600861 -0.178802 0.402618 0.606750 -0.200989 0.408203 0.612915 -0.223999 0.413757 0.619080 -0.247498 0.419189 0.625031 -0.271698 0.424805 0.631256 -0.296387 0.430450 0.637451 -0.321289 0.435944 0.643494 -0.346649 0.441650 0.649719 -0.372009 0.447235 0.655792 -0.397583 0.453094 0.662018 -0.423126 0.458954 0.668213 -0.448364 0.464661 0.674225 -0.473816 0.470642 0.680389 -0.499939 0.476624 0.686523 -0.526581 0.482483 0.692505 -0.553802 0.488556 0.698608 -0.581390 0.494629 0.704681 -0.609009 0.500610 0.710541 -0.636780 0.506683 0.716522 -0.664307 0.512787 0.722473 -0.691406 0.518799 0.728241 -0.718140 0.524933 0.734100 -0.744324 0.530945 0.739746 -0.769989 0.537018 0.745514 -0.795044 0.543152 0.751190 -0.819305 0.549103 0.756683 -0.842865 0.555206 0.762238 -0.865631 0.561218 0.767761 -0.887299 0.567139 0.773071 -0.908020 0.573090 0.778412 -0.145782 0.422363 0.606628 -0.166565 0.427887 0.612762 -0.188141 0.433289 0.618744 -0.210754 0.438965 0.624878 -0.234070 0.444611 0.631073 -0.257874 0.450195 0.637177 -0.282318 0.455963 0.643372 -0.307190 0.461823 0.649567 -0.332275 0.467590 0.655670 -0.357697 0.473572 0.661835 -0.383209 0.479553 0.668030 -0.408722 0.485443 0.674072 -0.434174 0.491547 0.680206 -0.459351 0.497498 0.686249 -0.485046 0.503693 0.692352 -0.511505 0.509827 0.698456 -0.538330 0.515869 0.704407 -0.565735 0.522034 0.710388 -0.593384 0.528259 0.716370 -0.620941 0.534302 0.722198 -0.648651 0.540558 0.728088 -0.676025 0.546783 0.733978 -0.702881 0.552826 0.739594 -0.729401 0.559021 0.745331 -0.755249 0.565063 0.750916 -0.780670 0.571228 0.756561 -0.805420 0.577332 0.762115 -0.829224 0.583252 0.767487 -0.852417 0.589325 0.772888 -0.874695 0.595337 0.778259 -0.895935 0.601196 0.783447 -0.916199 0.607086 0.788605 -0.154510 0.453278 0.618591 -0.175720 0.459045 0.624756 -0.197754 0.464691 0.630798 -0.220734 0.470551 0.636993 -0.244324 0.476501 0.643188 -0.268372 0.482391 0.649292 -0.293060 0.488464 0.655487 -0.318115 0.494537 0.661682 -0.343292 0.500519 0.667725 -0.368774 0.506622 0.673889 -0.394196 0.512634 0.679932 -0.419769 0.518890 0.686066 -0.445190 0.525146 0.692230 -0.470428 0.531281 0.698151 -0.496490 0.537506 0.704254 -0.523132 0.543854 0.710236 -0.550140 0.549988 0.716095 -0.577667 0.556274 0.722046 -0.605347 0.562561 0.727966 -0.632843 0.568665 0.733643 -0.660339 0.574951 0.739441 -0.687592 0.581207 0.745178 -0.714203 0.587189 0.750732 -0.740479 0.593445 0.756409 -0.765991 0.599457 0.761841 -0.791077 0.605560 0.767303 -0.815460 0.611633 0.772797 -0.838928 0.617523 0.778015 -0.861664 0.623474 0.783325 -0.883514 0.629364 0.788483 -0.904236 0.635071 0.793518 -0.924103 0.640869 0.798584 -0.163483 0.485443 0.630615 -0.185181 0.491486 0.636810 -0.207581 0.497406 0.642883 -0.230865 0.503479 0.649109 -0.254761 0.509674 0.655334 -0.279053 0.515686 0.661377 -0.303894 0.521881 0.667572 -0.329102 0.528198 0.673737 -0.354370 0.534302 0.679749 -0.379944 0.540649 0.685944 -0.405304 0.546814 0.691864 -0.430847 0.553162 0.697998 -0.456177 0.559509 0.704102 -0.481598 0.565704 0.709900 -0.507965 0.572052 0.715942 -0.534790 0.578400 0.721863 -0.561951 0.584564 0.727631 -0.589539 0.590881 0.733521 -0.617157 0.597168 0.739319 -0.644623 0.603302 0.744904 -0.671967 0.609528 0.750641 -0.698761 0.615601 0.756104 -0.725281 0.621765 0.761688 -0.751282 0.627869 0.767181 -0.776489 0.633789 0.772461 -0.801270 0.639771 0.777893 -0.825195 0.645691 0.783203 -0.848297 0.651459 0.788269 -0.870605 0.657288 0.793365 -0.892029 0.662994 0.798462 -0.912292 0.668549 0.803345 -0.931580 0.674133 0.808197 -0.172760 0.518738 0.642761 -0.194855 0.525024 0.648926 -0.217560 0.531128 0.654999 -0.241180 0.537384 0.661224 -0.265320 0.543701 0.667419 -0.289795 0.549896 0.673401 -0.314819 0.556274 0.679596 -0.339996 0.562500 0.685577 -0.365417 0.568878 0.691742 -0.391022 0.575287 0.697845 -0.416412 0.581512 0.703766 -0.441833 0.587921 0.709808 -0.467133 0.594238 0.715759 -0.492889 0.600494 0.721588 -0.519409 0.606842 0.727509 -0.546448 0.613190 0.733368 -0.573700 0.619293 0.739044 -0.601257 0.625610 0.744751 -0.628876 0.631805 0.750458 -0.656250 0.637878 0.755981 -0.683380 0.643982 0.761566 -0.709961 0.649933 0.766907 -0.736176 0.655945 0.772369 -0.761871 0.661926 0.777740 -0.786774 0.667664 0.782928 -0.811127 0.673523 0.788116 -0.834686 0.679291 0.793243 -0.857391 0.684753 0.798248 -0.879242 0.690430 0.803223 -0.900177 0.695923 0.808105 -0.919983 0.701233 0.812805 -0.938751 0.706604 0.817535 -0.182220 0.553040 0.654877 -0.204681 0.559357 0.661072 -0.227753 0.565582 0.667145 -0.251617 0.571991 0.673279 -0.275940 0.578400 0.679443 -0.300629 0.584625 0.685455 -0.325806 0.591095 0.691559 -0.351013 0.597351 0.697510 -0.376556 0.603790 0.703613 -0.402100 0.610168 0.709656 -0.427399 0.616394 0.715485 -0.452728 0.622772 0.721405 -0.478180 0.629120 0.727356 -0.504211 0.635254 0.733093 -0.530914 0.641602 0.738892 -0.558105 0.647858 0.744598 -0.585388 0.653870 0.750183 -0.612976 0.660004 0.755859 -0.640350 0.665985 0.761322 -0.667664 0.671997 0.766785 -0.694550 0.677948 0.772186 -0.720856 0.683746 0.777466 -0.746796 0.689545 0.782776 -0.772125 0.695312 0.787994 -0.796722 0.700867 0.793030 -0.820709 0.706512 0.798096 -0.843872 0.712036 0.803070 -0.866150 0.717377 0.807861 -0.887543 0.722717 0.812683 -0.907928 0.727844 0.817261 -0.927277 0.733063 0.821930 -0.945526 0.738190 0.826447 -0.191895 0.587830 0.666962 -0.214691 0.594177 0.673126 -0.238037 0.600494 0.679138 -0.262146 0.606903 0.685303 -0.286591 0.613220 0.691254 -0.311523 0.619659 0.697357 -0.336792 0.626068 0.703491 -0.362091 0.632294 0.709351 -0.387543 0.638672 0.715302 -0.413116 0.645050 0.721283 -0.438354 0.651215 0.727051 -0.463623 0.657501 0.732971 -0.489319 0.663696 0.738708 -0.515533 0.669739 0.744354 -0.542419 0.675873 0.750061 -0.569519 0.681793 0.755554 -0.596954 0.687866 0.761139 -0.624512 0.693817 0.766663 -0.651733 0.699554 0.771912 -0.678833 0.705414 0.777344 -0.705475 0.711182 0.782654 -0.731537 0.716736 0.787750 -0.757141 0.722382 0.792877 -0.782135 0.727844 0.797974 -0.806305 0.733215 0.802795 -0.829956 0.738556 0.807739 -0.852753 0.743835 0.812531 -0.874573 0.748932 0.817169 -0.895538 0.754028 0.821777 -0.915375 0.758972 0.826233 -0.934265 0.763855 0.830688 -0.951965 0.768707 0.835052 -0.201721 0.622772 0.679016 -0.224823 0.629181 0.685150 -0.248474 0.635437 0.691132 -0.272766 0.641937 0.697235 -0.297363 0.648132 0.703125 -0.322418 0.654480 0.709229 -0.347778 0.660828 0.715149 -0.373077 0.666962 0.720978 -0.398560 0.673218 0.726898 -0.424011 0.679443 0.732758 -0.449158 0.685486 0.738434 -0.474426 0.691559 0.744232 -0.500397 0.697632 0.749878 -0.526855 0.703552 0.755432 -0.553802 0.709442 0.760956 -0.581024 0.715210 0.766388 -0.608429 0.721039 0.771790 -0.635864 0.726837 0.777222 -0.662903 0.732361 0.782410 -0.689697 0.737976 0.787598 -0.716156 0.743500 0.792755 -0.741852 0.748810 0.797699 -0.767120 0.754150 0.802704 -0.791809 0.759460 0.807617 -0.815674 0.764557 0.812317 -0.838898 0.769653 0.817047 -0.861176 0.774567 0.821594 -0.882599 0.779480 0.826111 -0.903137 0.784271 0.830566 -0.922485 0.788910 0.834808 -0.940857 0.793579 0.839081 -0.958069 0.798096 0.843262 -0.211670 0.657654 0.690948 -0.235107 0.664032 0.697052 -0.258942 0.670197 0.703003 -0.283417 0.676544 0.709076 -0.308136 0.682648 0.714874 -0.333344 0.688843 0.720795 -0.358673 0.695068 0.726776 -0.384003 0.701050 0.732483 -0.409454 0.707092 0.738281 -0.434814 0.713165 0.744019 -0.459839 0.719025 0.749634 -0.485321 0.724915 0.755249 -0.511414 0.730682 0.760681 -0.538055 0.736481 0.766235 -0.565155 0.742188 0.771667 -0.592316 0.747742 0.776947 -0.619720 0.753357 0.782257 -0.646973 0.758820 0.787476 -0.673859 0.764130 0.792480 -0.700378 0.769501 0.797577 -0.726501 0.774750 0.802582 -0.751984 0.779846 0.807373 -0.776947 0.784943 0.812225 -0.801239 0.789978 0.816925 -0.824677 0.794769 0.821442 -0.847412 0.799591 0.825958 -0.869263 0.804199 0.830353 -0.890320 0.808838 0.834686 -0.910370 0.813354 0.838959 -0.929230 0.817657 0.843018 -0.947083 0.822021 0.847107 -0.963745 0.826233 0.851105 -0.221741 0.692017 0.702850 -0.245300 0.698090 0.708740 -0.269470 0.704346 0.714752 -0.294098 0.710480 0.720673 -0.318970 0.716431 0.726471 -0.344208 0.722473 0.732330 -0.369598 0.728516 0.738159 -0.394867 0.734283 0.743774 -0.420288 0.740173 0.749451 -0.445465 0.746033 0.755096 -0.470490 0.751678 0.760559 -0.496246 0.757385 0.766113 -0.522461 0.762848 0.771393 -0.549286 0.768463 0.776825 -0.576355 0.773956 0.782135 -0.603516 0.779205 0.787231 -0.630829 0.784546 0.792389 -0.657898 0.789825 0.797455 -0.684479 0.794861 0.802338 -0.710754 0.799927 0.807251 -0.736603 0.804932 0.812073 -0.761719 0.809723 0.816711 -0.786346 0.814545 0.821350 -0.810120 0.819122 0.825775 -0.833313 0.823792 0.830261 -0.855682 0.828278 0.834625 -0.877106 0.832642 0.838776 -0.897644 0.836914 0.842926 -0.917236 0.841125 0.847015 -0.935638 0.845154 0.850891 -0.952972 0.849152 0.854767 -0.969147 0.853058 0.858551 -0.231873 0.725708 0.714569 -0.255676 0.731628 0.720398 -0.280029 0.737701 0.726349 -0.304810 0.743622 0.732178 -0.329742 0.749390 0.737885 -0.355042 0.755249 0.743652 -0.380402 0.761047 0.749329 -0.405579 0.766663 0.754852 -0.430939 0.772339 0.760437 -0.456024 0.777924 0.765961 -0.481110 0.783295 0.771271 -0.507050 0.788788 0.776642 -0.533447 0.794037 0.781860 -0.560303 0.799347 0.787109 -0.587402 0.804565 0.792267 -0.614471 0.809601 0.797211 -0.641632 0.814636 0.802216 -0.668518 0.819580 0.807098 -0.694885 0.824341 0.811798 -0.720856 0.829132 0.816620 -0.746338 0.833832 0.821259 -0.771088 0.838348 0.825684 -0.795349 0.842804 0.830109 -0.818817 0.847107 0.834412 -0.841583 0.851410 0.838654 -0.863556 0.855591 0.842834 -0.884521 0.859650 0.846832 -0.904633 0.863647 0.850800 -0.923706 0.867523 0.854645 -0.941650 0.871216 0.858368 -0.958496 0.874847 0.862000 -0.974121 0.878479 0.865540 -0.242126 0.758484 0.726166 -0.266052 0.764282 0.731903 -0.290588 0.770050 0.737732 -0.315460 0.775818 0.743500 -0.340485 0.781372 0.749023 -0.365753 0.786987 0.754730 -0.391083 0.792542 0.760315 -0.416229 0.797943 0.765717 -0.441345 0.803345 0.771118 -0.466248 0.808533 0.776428 -0.491760 0.813812 0.781738 -0.517883 0.819000 0.786957 -0.544281 0.823975 0.791992 -0.571198 0.829010 0.797058 -0.598267 0.833954 0.802063 -0.625214 0.838623 0.806885 -0.652191 0.843414 0.811737 -0.678833 0.848083 0.816467 -0.704926 0.852539 0.821014 -0.730591 0.856964 0.825562 -0.755646 0.861237 0.829895 -0.780243 0.865540 0.834290 -0.804108 0.869720 0.838562 -0.827118 0.873657 0.842621 -0.849548 0.877625 0.846741 -0.871063 0.881531 0.850708 -0.891571 0.885193 0.854492 -0.911224 0.888885 0.858246 -0.929840 0.892365 0.861908 -0.947266 0.895782 0.865356 -0.963654 0.899139 0.868805 -0.978668 0.902283 0.872070 -0.252380 0.790344 0.737549 -0.276489 0.795837 0.743195 -0.301117 0.801422 0.748901 -0.326080 0.806915 0.754578 -0.351074 0.812256 0.760040 -0.376343 0.817596 0.765594 -0.401642 0.822906 0.770996 -0.426666 0.828003 0.776276 -0.451660 0.833130 0.781616 -0.476532 0.838074 0.786713 -0.502258 0.843018 0.791870 -0.528503 0.847870 0.796936 -0.554993 0.852631 0.801819 -0.581909 0.857330 0.806763 -0.608948 0.861908 0.811615 -0.635742 0.866364 0.816254 -0.662445 0.870789 0.820892 -0.688812 0.875092 0.825409 -0.714569 0.879211 0.829803 -0.739990 0.883331 0.834167 -0.764709 0.887299 0.838379 -0.788910 0.891205 0.842529 -0.812408 0.895142 0.846588 -0.835083 0.898743 0.850494 -0.857056 0.902374 0.854401 -0.878113 0.905884 0.858124 -0.898224 0.909180 0.861725 -0.917419 0.912506 0.865265 -0.935577 0.915710 0.868744 -0.952545 0.918732 0.871979 -0.968414 0.921722 0.875244 -0.982971 0.924530 0.878326 -0.262634 0.821014 0.748749 -0.286896 0.826294 0.754272 -0.311584 0.831604 0.759888 -0.336578 0.836823 0.765442 -0.361603 0.841858 0.770782 -0.386841 0.846893 0.776154 -0.411835 0.851776 0.781342 -0.436920 0.856689 0.786591 -0.461761 0.861511 0.791718 -0.486877 0.866211 0.796722 -0.512634 0.870850 0.801727 -0.539001 0.875366 0.806641 -0.565521 0.879761 0.811371 -0.592377 0.884125 0.816132 -0.619263 0.888397 0.820770 -0.645874 0.892487 0.825195 -0.672424 0.896576 0.829712 -0.698456 0.900574 0.834076 -0.723969 0.904388 0.838257 -0.749054 0.908173 0.842438 -0.773376 0.911774 0.846375 -0.797241 0.915375 0.850403 -0.820343 0.918823 0.854279 -0.842590 0.922119 0.857971 -0.864166 0.925385 0.861633 -0.884857 0.928558 0.865204 -0.904480 0.931580 0.868561 -0.923248 0.934540 0.871887 -0.940857 0.937286 0.875092 -0.957428 0.940094 0.878204 -0.972809 0.942719 0.881287 -0.986908 0.945190 0.884094 -0.272858 0.850403 0.759766 -0.297180 0.855377 0.765137 -0.321991 0.860413 0.770660 -0.347015 0.865326 0.776031 -0.372009 0.870056 0.781189 -0.397156 0.874786 0.786438 -0.422028 0.879395 0.791504 -0.446930 0.884003 0.796631 -0.471741 0.888428 0.801575 -0.497009 0.892792 0.806396 -0.522949 0.897095 0.811218 -0.549316 0.901306 0.815979 -0.575806 0.905334 0.820587 -0.602631 0.909363 0.825104 -0.629333 0.913300 0.829590 -0.655792 0.916992 0.833893 -0.682037 0.920776 0.838135 -0.707672 0.924286 0.842224 -0.732971 0.927856 0.846283 -0.757690 0.931305 0.850311 -0.781738 0.934479 0.854065 -0.805176 0.937744 0.857880 -0.827911 0.940857 0.861542 -0.849792 0.943817 0.864990 -0.870911 0.946686 0.868500 -0.891144 0.949554 0.871796 -0.910370 0.952179 0.875031 -0.928711 0.954773 0.878143 -0.945831 0.957245 0.881134 -0.961975 0.959656 0.884033 -0.976868 0.961945 0.886810 -0.990509 0.964111 0.889435 -0.283020 0.878387 0.770508 -0.307434 0.883057 0.775696 -0.332275 0.887695 0.781067 -0.357147 0.892181 0.786163 -0.382202 0.896698 0.791382 -0.407227 0.901154 0.796478 -0.432037 0.905396 0.801331 -0.456696 0.909607 0.806244 -0.481598 0.913727 0.811127 -0.507019 0.917725 0.815735 -0.533051 0.921661 0.820435 -0.559418 0.925568 0.824982 -0.585907 0.929199 0.829376 -0.612549 0.932892 0.833740 -0.638947 0.936310 0.837921 -0.665283 0.939819 0.842072 -0.691284 0.943176 0.846222 -0.716644 0.946350 0.850128 -0.741547 0.949554 0.854004 -0.765930 0.952576 0.857758 -0.789612 0.955444 0.861359 -0.812744 0.958374 0.864960 -0.835052 0.961060 0.868378 -0.856506 0.963654 0.871704 -0.877258 0.966278 0.874969 -0.897034 0.968689 0.878082 -0.915863 0.970978 0.881012 -0.933685 0.973236 0.883972 -0.950409 0.975311 0.886658 -0.966064 0.977386 0.889374 -0.980560 0.979370 0.891968 -0.993744 0.981171 0.894348 -0.293060 0.904755 0.780914 -0.317535 0.909058 0.786041 -0.342407 0.913422 0.791229 -0.367249 0.917572 0.796204 -0.392242 0.921692 0.801208 -0.417114 0.925812 0.806122 -0.441742 0.929657 0.810883 -0.466339 0.933533 0.815643 -0.491364 0.937286 0.820312 -0.516876 0.940887 0.824799 -0.542908 0.944458 0.829285 -0.569275 0.947937 0.833649 -0.595642 0.951233 0.837830 -0.622223 0.954529 0.842010 -0.648438 0.957642 0.846008 -0.674500 0.960724 0.850037 -0.700134 0.963684 0.853912 -0.725189 0.966522 0.857605 -0.749786 0.969299 0.861267 -0.773834 0.971985 0.864868 -0.797089 0.974518 0.868195 -0.819824 0.977051 0.871613 -0.841797 0.979401 0.874847 -0.862823 0.981628 0.877930 -0.883118 0.983856 0.880920 -0.902466 0.985901 0.883789 -0.920868 0.987915 0.886566 -0.938324 0.989807 0.889313 -0.954651 0.991577 0.891815 -0.969879 0.993317 0.894287 -0.983917 0.994965 0.896637 -0.996674 0.996490 0.898834 -0.050232 0.047363 0.473511 -0.063477 0.049011 0.477020 -0.077271 0.050720 0.480652 -0.092010 0.052490 0.484314 -0.108032 0.054321 0.488190 -0.125183 0.056152 0.492157 -0.143616 0.058136 0.496216 -0.163025 0.060211 0.500488 -0.183319 0.062256 0.504669 -0.204498 0.064392 0.509155 -0.226379 0.066681 0.513672 -0.248871 0.068909 0.518280 -0.272003 0.071289 0.523041 -0.295624 0.073730 0.527924 -0.319489 0.076172 0.532745 -0.343842 0.078796 0.537781 -0.368439 0.081482 0.542999 -0.393066 0.084198 0.548065 -0.417786 0.087036 0.553375 -0.442413 0.089874 0.558655 -0.467102 0.092926 0.564178 -0.492401 0.096008 0.569702 -0.518219 0.099121 0.575165 -0.544830 0.102448 0.580933 -0.571838 0.105804 0.586670 -0.598999 0.109192 0.592316 -0.626373 0.112762 0.598175 -0.653778 0.116394 0.604126 -0.680756 0.120056 0.609924 -0.707581 0.123901 0.615906 -0.733765 0.127716 0.621796 -0.759705 0.131653 0.627869 -0.054077 0.060516 0.480438 -0.067566 0.062378 0.484222 -0.081726 0.064301 0.488098 -0.096893 0.066254 0.492035 -0.113434 0.068329 0.496094 -0.131104 0.070404 0.500275 -0.149994 0.072632 0.504578 -0.169830 0.074890 0.509064 -0.190521 0.077209 0.513489 -0.212097 0.079681 0.518188 -0.234375 0.082184 0.522919 -0.257172 0.084717 0.527679 -0.280609 0.087402 0.532623 -0.304443 0.090179 0.537659 -0.328674 0.092987 0.542725 -0.353180 0.095947 0.547913 -0.377869 0.098938 0.553101 -0.402679 0.102081 0.558563 -0.427521 0.105316 0.564026 -0.452179 0.108551 0.569427 -0.477112 0.111969 0.575012 -0.502777 0.115509 0.580780 -0.528992 0.119019 0.586334 -0.555817 0.122681 0.592194 -0.583038 0.126434 0.598022 -0.610352 0.130188 0.603821 -0.637817 0.134155 0.609741 -0.665009 0.138092 0.615601 -0.692047 0.142181 0.621643 -0.718750 0.146362 0.627716 -0.744873 0.150513 0.633667 -0.770599 0.154846 0.639771 -0.058136 0.074738 0.487915 -0.071899 0.076843 0.491943 -0.086426 0.078979 0.495911 -0.102173 0.081238 0.500153 -0.119202 0.083588 0.504456 -0.137390 0.085968 0.508820 -0.156708 0.088531 0.513367 -0.177032 0.091125 0.518036 -0.198120 0.093750 0.522675 -0.220062 0.096527 0.527527 -0.242676 0.099457 0.532501 -0.265808 0.102325 0.537415 -0.289551 0.105408 0.542572 -0.313538 0.108490 0.547668 -0.338043 0.111755 0.553009 -0.362823 0.115112 0.558441 -0.387512 0.118500 0.563721 -0.412537 0.121979 0.569275 -0.437408 0.125641 0.574860 -0.462097 0.129242 0.580475 -0.487457 0.133057 0.586212 -0.513489 0.136902 0.592010 -0.539978 0.140778 0.597748 -0.567078 0.144836 0.603668 -0.594452 0.148956 0.609589 -0.621857 0.153046 0.615448 -0.649353 0.157318 0.621490 -0.676544 0.161591 0.627441 -0.703522 0.166046 0.633514 -0.730042 0.170532 0.639618 -0.755981 0.174957 0.645630 -0.781494 0.179596 0.651794 -0.062500 0.090393 0.495789 -0.076569 0.092834 0.500031 -0.091522 0.095276 0.504272 -0.107819 0.097900 0.508698 -0.125427 0.100616 0.513245 -0.144043 0.103333 0.517792 -0.163849 0.106262 0.522522 -0.184601 0.109192 0.527405 -0.206055 0.112213 0.532227 -0.228363 0.115417 0.537292 -0.251373 0.118683 0.542450 -0.274719 0.121918 0.547577 -0.298737 0.125397 0.552856 -0.323029 0.128815 0.558136 -0.347748 0.132477 0.563599 -0.372620 0.136200 0.569122 -0.397522 0.139923 0.574615 -0.422546 0.143799 0.580322 -0.447510 0.147797 0.586060 -0.472321 0.151764 0.591736 -0.498077 0.155884 0.597595 -0.524445 0.160126 0.603546 -0.551208 0.164337 0.609314 -0.578522 0.168671 0.615295 -0.605896 0.173004 0.621216 -0.633545 0.177551 0.627289 -0.661011 0.182159 0.633392 -0.688049 0.186676 0.639343 -0.714874 0.191406 0.645477 -0.741302 0.196198 0.651611 -0.767029 0.200897 0.657654 -0.792297 0.205780 0.663818 -0.067108 0.107849 0.504181 -0.081512 0.110687 0.508575 -0.096985 0.113464 0.513031 -0.113831 0.116486 0.517670 -0.131927 0.119507 0.522430 -0.151093 0.122650 0.527161 -0.171326 0.125916 0.532074 -0.192505 0.129242 0.537140 -0.214355 0.132629 0.542206 -0.237000 0.136169 0.547424 -0.260193 0.139679 0.552551 -0.284027 0.143402 0.557983 -0.308289 0.147217 0.563446 -0.332825 0.151031 0.568878 -0.357666 0.154999 0.574493 -0.382660 0.159058 0.580200 -0.407715 0.163116 0.585785 -0.432739 0.167328 0.591583 -0.457733 0.171661 0.597443 -0.482941 0.175934 0.603180 -0.509033 0.180359 0.609161 -0.535675 0.184906 0.615173 -0.562653 0.189392 0.621094 -0.590118 0.194092 0.627106 -0.617645 0.198700 0.633057 -0.645294 0.203491 0.639221 -0.672729 0.208374 0.645325 -0.699677 0.213165 0.651337 -0.726349 0.218140 0.657501 -0.752502 0.223145 0.663666 -0.778046 0.228119 0.669678 -0.803070 0.233215 0.675812 -0.071960 0.127228 0.512878 -0.086823 0.130371 0.517578 -0.102844 0.133545 0.522186 -0.120239 0.136871 0.527100 -0.138855 0.140289 0.531982 -0.158508 0.143738 0.536865 -0.179169 0.147369 0.542053 -0.200745 0.151062 0.547272 -0.222961 0.154785 0.552460 -0.246002 0.158661 0.557892 -0.269470 0.162537 0.563171 -0.293610 0.166595 0.568726 -0.318085 0.170715 0.574341 -0.342773 0.174805 0.579926 -0.367798 0.179108 0.585632 -0.392944 0.183472 0.591431 -0.417999 0.187866 0.597137 -0.443115 0.192383 0.603058 -0.468201 0.197021 0.609009 -0.493744 0.201538 0.614899 -0.520172 0.206299 0.620911 -0.546997 0.210999 0.626831 -0.574341 0.215881 0.632935 -0.601929 0.220825 0.639069 -0.629456 0.225677 0.645050 -0.657074 0.230713 0.651184 -0.684418 0.235779 0.657349 -0.711243 0.240814 0.663361 -0.737762 0.246002 0.669495 -0.763733 0.251251 0.675690 -0.789001 0.256348 0.681671 -0.813690 0.261688 0.687836 -0.077148 0.148315 0.522064 -0.092499 0.151855 0.526947 -0.109039 0.155334 0.531738 -0.127045 0.158997 0.536774 -0.146149 0.162781 0.541962 -0.166260 0.166534 0.547028 -0.187408 0.170502 0.552338 -0.209320 0.174530 0.557739 -0.231903 0.178528 0.563080 -0.255310 0.182739 0.568573 -0.279053 0.186890 0.574097 -0.303375 0.191254 0.579773 -0.328125 0.195740 0.585480 -0.352997 0.200104 0.591156 -0.378174 0.204742 0.597015 -0.403351 0.209381 0.602905 -0.428467 0.213989 0.608704 -0.453583 0.218811 0.614716 -0.478912 0.223694 0.620758 -0.504883 0.228546 0.626709 -0.531586 0.233490 0.632782 -0.558594 0.238434 0.638733 -0.586151 0.243530 0.644897 -0.613861 0.248688 0.651031 -0.641388 0.253754 0.656982 -0.668915 0.259003 0.663177 -0.696136 0.264282 0.669373 -0.722809 0.269470 0.675415 -0.749084 0.274811 0.681549 -0.774811 0.280243 0.687683 -0.799805 0.285522 0.693665 -0.824249 0.290985 0.699768 -0.082581 0.171051 0.531647 -0.098480 0.174866 0.536652 -0.115662 0.178680 0.541656 -0.134125 0.182678 0.546875 -0.153778 0.186768 0.552216 -0.174316 0.190826 0.557434 -0.195862 0.195068 0.562927 -0.218109 0.199280 0.568268 -0.241180 0.203735 0.573944 -0.264832 0.208191 0.579620 -0.288849 0.212708 0.585205 -0.313416 0.217346 0.591034 -0.338348 0.222015 0.596863 -0.363403 0.226746 0.602631 -0.388641 0.231598 0.608582 -0.413910 0.236511 0.614532 -0.439087 0.241394 0.620483 -0.464233 0.246399 0.626556 -0.489777 0.251434 0.632477 -0.516174 0.256531 0.638611 -0.543121 0.261749 0.644775 -0.570374 0.266876 0.650757 -0.598083 0.272186 0.656860 -0.625793 0.277527 0.663025 -0.653320 0.282776 0.669067 -0.680756 0.288208 0.675232 -0.707794 0.293640 0.681366 -0.734283 0.298981 0.687347 -0.760376 0.304474 0.693512 -0.785706 0.309875 0.699432 -0.810516 0.315369 0.705505 -0.834595 0.320984 0.711548 -0.088379 0.195251 0.541565 -0.104858 0.199341 0.546783 -0.122589 0.203461 0.551971 -0.141602 0.207764 0.557312 -0.161743 0.212128 0.562775 -0.182739 0.216492 0.568146 -0.204712 0.221069 0.573761 -0.227325 0.225555 0.579346 -0.250702 0.230225 0.585052 -0.274628 0.235016 0.590820 -0.298920 0.239716 0.596558 -0.323730 0.244659 0.602478 -0.348816 0.249573 0.608429 -0.373901 0.254456 0.614288 -0.399261 0.259583 0.620331 -0.424591 0.264709 0.626373 -0.449707 0.269775 0.632355 -0.475098 0.274994 0.638428 -0.500977 0.280212 0.644409 -0.527710 0.285522 0.650574 -0.554932 0.290955 0.656708 -0.582275 0.296204 0.662750 -0.610077 0.301697 0.668915 -0.637848 0.307190 0.675079 -0.665283 0.312531 0.681061 -0.692566 0.318054 0.687195 -0.719421 0.323669 0.693359 -0.745697 0.329102 0.699280 -0.771545 0.334717 0.705353 -0.796570 0.340179 0.711243 -0.821106 0.345795 0.717316 -0.844818 0.351440 0.723297 -0.094543 0.220825 0.551819 -0.111603 0.225189 0.557190 -0.129913 0.229584 0.562531 -0.149445 0.234131 0.568024 -0.169952 0.238678 0.573517 -0.191467 0.243408 0.579193 -0.213837 0.248199 0.584930 -0.236786 0.252960 0.590546 -0.260437 0.257874 0.596436 -0.284698 0.262878 0.602325 -0.309174 0.267792 0.608124 -0.334198 0.272949 0.614136 -0.359406 0.278107 0.620209 -0.384644 0.283203 0.626068 -0.410004 0.288483 0.632202 -0.435303 0.293701 0.638153 -0.460541 0.299072 0.644257 -0.486176 0.304504 0.650452 -0.512390 0.309814 0.656433 -0.539368 0.315277 0.662537 -0.566803 0.320831 0.668793 -0.594299 0.326233 0.674744 -0.622131 0.331818 0.680878 -0.649841 0.337402 0.687073 -0.677185 0.342896 0.693085 -0.704315 0.348541 0.699127 -0.730835 0.354065 0.705048 -0.756989 0.359711 0.711121 -0.782532 0.365326 0.717163 -0.807312 0.370850 0.722992 -0.831482 0.376526 0.728973 -0.854828 0.382141 0.734863 -0.101074 0.247528 0.562378 -0.118744 0.252228 0.567871 -0.137543 0.256836 0.573395 -0.157623 0.261627 0.579010 -0.178558 0.266418 0.584595 -0.200470 0.271393 0.590424 -0.223236 0.276367 0.596252 -0.246521 0.281342 0.601990 -0.270508 0.286499 0.607971 -0.294952 0.291718 0.614014 -0.319702 0.296844 0.619843 -0.344849 0.302124 0.625916 -0.370178 0.307465 0.632080 -0.395447 0.312744 0.638031 -0.420929 0.318176 0.644104 -0.446106 0.323547 0.650116 -0.471497 0.329071 0.656281 -0.497467 0.334656 0.662415 -0.524017 0.340057 0.668427 -0.551208 0.345673 0.674622 -0.578766 0.351288 0.680756 -0.606384 0.356750 0.686737 -0.634186 0.362427 0.692871 -0.661865 0.368103 0.698975 -0.689026 0.373627 0.704895 -0.715973 0.379333 0.710968 -0.742279 0.384796 0.716888 -0.768158 0.390472 0.722870 -0.793396 0.396179 0.728821 -0.817871 0.401672 0.734589 -0.841705 0.407349 0.740479 -0.864655 0.412933 0.746307 -0.107941 0.275330 0.573242 -0.126099 0.280121 0.578766 -0.145569 0.285065 0.584473 -0.166077 0.290131 0.590271 -0.187500 0.295044 0.595947 -0.209808 0.300232 0.601868 -0.232880 0.305450 0.607849 -0.256470 0.310608 0.613708 -0.280731 0.315887 0.619720 -0.305420 0.321289 0.625763 -0.330353 0.326569 0.631714 -0.355652 0.332001 0.637878 -0.380890 0.337372 0.643799 -0.406372 0.342926 0.649933 -0.431854 0.348511 0.656128 -0.457001 0.353943 0.662140 -0.482605 0.359558 0.668304 -0.508972 0.365143 0.674469 -0.535736 0.370667 0.680420 -0.563171 0.376404 0.686584 -0.590820 0.382050 0.692719 -0.618469 0.387604 0.698669 -0.646271 0.393280 0.704742 -0.673767 0.398956 0.710785 -0.700775 0.404541 0.716705 -0.727478 0.410217 0.722687 -0.753540 0.415741 0.728546 -0.779144 0.421387 0.734406 -0.804138 0.427032 0.740295 -0.828217 0.432495 0.745972 -0.851654 0.438110 0.751801 -0.874146 0.443695 0.757507 -0.115173 0.304016 0.584351 -0.133911 0.308990 0.589966 -0.153870 0.314178 0.595825 -0.174896 0.319366 0.601715 -0.196686 0.324554 0.607544 -0.219391 0.329834 0.613495 -0.242828 0.335236 0.619568 -0.266663 0.340485 0.625458 -0.291168 0.345978 0.631561 -0.316040 0.351501 0.637665 -0.341156 0.356842 0.643677 -0.366516 0.362457 0.649811 -0.391876 0.367920 0.655823 -0.417389 0.373535 0.661987 -0.442841 0.379150 0.668152 -0.467987 0.384705 0.674133 -0.494019 0.390350 0.680267 -0.520630 0.396088 0.686462 -0.547638 0.401611 0.692383 -0.575165 0.407318 0.698547 -0.602936 0.412933 0.704651 -0.630615 0.418518 0.710510 -0.658264 0.424225 0.716522 -0.685486 0.429779 0.722412 -0.712402 0.435394 0.728333 -0.738922 0.441101 0.734283 -0.764679 0.446625 0.739960 -0.790009 0.452393 0.745850 -0.814636 0.458160 0.751678 -0.838379 0.463776 0.757202 -0.861389 0.469574 0.762909 -0.883514 0.475372 0.768555 -0.122772 0.333466 0.595642 -0.141998 0.338623 0.601471 -0.162476 0.343933 0.607391 -0.183960 0.349304 0.613342 -0.206116 0.354584 0.619263 -0.229248 0.360016 0.625305 -0.252930 0.365540 0.631409 -0.277039 0.370911 0.637360 -0.301758 0.376526 0.643494 -0.326691 0.381927 0.649506 -0.352051 0.387543 0.655701 -0.377502 0.393188 0.661835 -0.402924 0.398682 0.667786 -0.428436 0.404388 0.673981 -0.453796 0.410095 0.680145 -0.479218 0.415619 0.686127 -0.505493 0.421265 0.692261 -0.532349 0.427002 0.698364 -0.559570 0.432526 0.704346 -0.587189 0.438202 0.710388 -0.614990 0.443970 0.716400 -0.642609 0.449585 0.722229 -0.670166 0.455383 0.728180 -0.697174 0.461090 0.734009 -0.723938 0.466949 0.739838 -0.750153 0.472839 0.745697 -0.775635 0.478607 0.751343 -0.800629 0.484497 0.757080 -0.824890 0.490448 0.762726 -0.848236 0.496216 0.768250 -0.870850 0.502136 0.773834 -0.892456 0.508057 0.779297 -0.130676 0.363464 0.607269 -0.150452 0.368744 0.613068 -0.171387 0.374176 0.619141 -0.193268 0.379669 0.625153 -0.215851 0.385040 0.631104 -0.239227 0.390594 0.637238 -0.263214 0.396179 0.643372 -0.287628 0.401611 0.649353 -0.312500 0.407227 0.655548 -0.337616 0.412720 0.661530 -0.363037 0.418427 0.667694 -0.388580 0.424042 0.673828 -0.413971 0.429596 0.679840 -0.439423 0.435303 0.685974 -0.464783 0.440979 0.692078 -0.490540 0.446594 0.698059 -0.517120 0.452454 0.704193 -0.544220 0.458282 0.710205 -0.571564 0.464050 0.716095 -0.599274 0.469971 0.722107 -0.626862 0.475769 0.727875 -0.654572 0.481750 0.733826 -0.681946 0.487762 0.739716 -0.708771 0.493591 0.745392 -0.735291 0.499664 0.751221 -0.761200 0.505707 0.756958 -0.786407 0.511627 0.762482 -0.811066 0.517609 0.768097 -0.834961 0.523590 0.773651 -0.857880 0.529480 0.779053 -0.880066 0.535522 0.784454 -0.901154 0.541321 0.789673 -0.138885 0.393799 0.618958 -0.159149 0.399231 0.624847 -0.180573 0.404724 0.630951 -0.202850 0.410278 0.637085 -0.225769 0.415710 0.643036 -0.249512 0.421295 0.649231 -0.273621 0.426788 0.655182 -0.298309 0.432404 0.661377 -0.323395 0.438080 0.667511 -0.348602 0.443665 0.673523 -0.374115 0.449432 0.679688 -0.399689 0.455261 0.685822 -0.425079 0.460968 0.691772 -0.450500 0.466919 0.697906 -0.475952 0.472870 0.703979 -0.502045 0.478760 0.709900 -0.528839 0.484772 0.715942 -0.556061 0.490814 0.721924 -0.583557 0.496796 0.727783 -0.611328 0.502899 0.733704 -0.638855 0.508850 0.739410 -0.666412 0.514954 0.745270 -0.693573 0.521057 0.751038 -0.720215 0.527069 0.756653 -0.746429 0.533234 0.762329 -0.772064 0.539337 0.767975 -0.796906 0.545288 0.773407 -0.821228 0.551392 0.778931 -0.844727 0.557404 0.784302 -0.867249 0.563354 0.789551 -0.888916 0.569305 0.794861 -0.909515 0.575165 0.799957 -0.147400 0.424438 0.630798 -0.168152 0.429840 0.636749 -0.189972 0.435425 0.642883 -0.212646 0.441040 0.649048 -0.235870 0.446594 0.655029 -0.259888 0.452362 0.661224 -0.284393 0.458191 0.667389 -0.309113 0.463898 0.673340 -0.334351 0.469849 0.679504 -0.359650 0.475647 0.685486 -0.385254 0.481689 0.691620 -0.410797 0.487701 0.697754 -0.436188 0.493652 0.703705 -0.461487 0.499786 0.709778 -0.487274 0.505951 0.715790 -0.513611 0.511963 0.721649 -0.540588 0.518188 0.727600 -0.568024 0.524384 0.733551 -0.595551 0.530457 0.739258 -0.623260 0.536652 0.745087 -0.650757 0.542725 0.750763 -0.678131 0.548950 0.756531 -0.705078 0.555145 0.762177 -0.731415 0.561157 0.767670 -0.757355 0.567383 0.773254 -0.782684 0.573486 0.778778 -0.807220 0.579468 0.784058 -0.831085 0.585571 0.789398 -0.854218 0.591583 0.794708 -0.876312 0.597443 0.799835 -0.897552 0.603394 0.804993 -0.917664 0.609192 0.809937 -0.156219 0.455383 0.642761 -0.177399 0.461029 0.648712 -0.199615 0.466888 0.654907 -0.222656 0.472809 0.661072 -0.246185 0.478607 0.667084 -0.270447 0.484619 0.673218 -0.294983 0.490540 0.679199 -0.320068 0.496613 0.685364 -0.345428 0.502747 0.691498 -0.370789 0.508820 0.697449 -0.396362 0.515015 0.703552 -0.421936 0.521240 0.709625 -0.447205 0.527374 0.715485 -0.472595 0.533630 0.721497 -0.498657 0.539917 0.727478 -0.525208 0.546051 0.733246 -0.552368 0.552307 0.739136 -0.579956 0.558624 0.744965 -0.607452 0.564697 0.750641 -0.635101 0.571014 0.756378 -0.662476 0.577148 0.761902 -0.689636 0.583374 0.767578 -0.716370 0.589569 0.773132 -0.742432 0.595581 0.778473 -0.768066 0.601715 0.783966 -0.793060 0.607880 0.789276 -0.817200 0.613770 0.794464 -0.840759 0.619781 0.799713 -0.863281 0.625580 0.804749 -0.885101 0.631409 0.809814 -0.905853 0.637238 0.814819 -0.925446 0.642853 0.819580 -0.165283 0.487671 0.654724 -0.186890 0.493561 0.660736 -0.209503 0.499664 0.666901 -0.232788 0.505798 0.673065 -0.256653 0.511810 0.679077 -0.281097 0.518036 0.685211 -0.305847 0.524139 0.691162 -0.331055 0.530365 0.697296 -0.356506 0.536713 0.703400 -0.381927 0.542847 0.709320 -0.407471 0.549164 0.715302 -0.432983 0.555573 0.721344 -0.458160 0.561737 0.727173 -0.483795 0.568085 0.733124 -0.510101 0.574493 0.738983 -0.536865 0.580627 0.744690 -0.564209 0.586914 0.750458 -0.591614 0.593079 0.756104 -0.619293 0.599426 0.761780 -0.646851 0.605652 0.767395 -0.674072 0.611725 0.772858 -0.700928 0.617889 0.778381 -0.727417 0.624054 0.783813 -0.753204 0.630005 0.789032 -0.778503 0.636047 0.794342 -0.803131 0.642029 0.799591 -0.826935 0.647827 0.804626 -0.850098 0.653656 0.809692 -0.872192 0.659332 0.814575 -0.893494 0.664978 0.819458 -0.913757 0.670624 0.824341 -0.932892 0.676056 0.828979 -0.174561 0.521088 0.666748 -0.196594 0.527161 0.672791 -0.219543 0.533447 0.678894 -0.243042 0.539581 0.684937 -0.267212 0.545929 0.691010 -0.291901 0.552277 0.697113 -0.316772 0.558502 0.703064 -0.342102 0.564911 0.709167 -0.367584 0.571289 0.715149 -0.393005 0.577515 0.721039 -0.418549 0.583923 0.727020 -0.443970 0.590302 0.732971 -0.469116 0.596527 0.738678 -0.495026 0.602844 0.744537 -0.521454 0.609100 0.750183 -0.548523 0.615417 0.755951 -0.575958 0.621704 0.761658 -0.603394 0.627777 0.767090 -0.630981 0.634003 0.772705 -0.658386 0.640137 0.778198 -0.685394 0.646149 0.783539 -0.712067 0.652191 0.788879 -0.738220 0.658203 0.794189 -0.763733 0.664032 0.799316 -0.788727 0.669891 0.804535 -0.812958 0.675690 0.809570 -0.836365 0.681274 0.814423 -0.859070 0.686951 0.819397 -0.880768 0.692352 0.824066 -0.901581 0.697845 0.828827 -0.921387 0.703278 0.833466 -0.939972 0.708466 0.837952 -0.184052 0.555389 0.678802 -0.206482 0.561584 0.684723 -0.229767 0.567963 0.690857 -0.253479 0.574249 0.696838 -0.277893 0.580627 0.702942 -0.302704 0.587036 0.709045 -0.327759 0.593292 0.714844 -0.353149 0.599731 0.720917 -0.378662 0.606171 0.726898 -0.404053 0.612427 0.732666 -0.429535 0.618835 0.738556 -0.454834 0.625183 0.744385 -0.480194 0.631348 0.750061 -0.506378 0.637695 0.755829 -0.532990 0.643768 0.761383 -0.560181 0.649994 0.766968 -0.587646 0.656158 0.772552 -0.615051 0.662170 0.777954 -0.642548 0.668243 0.783386 -0.669800 0.674225 0.788757 -0.696503 0.680023 0.793945 -0.722931 0.685944 0.799164 -0.748810 0.691711 0.804352 -0.773987 0.697266 0.809326 -0.798584 0.703003 0.814301 -0.822388 0.708435 0.819122 -0.845490 0.713989 0.823944 -0.867767 0.719391 0.828735 -0.889008 0.724579 0.833282 -0.909363 0.729797 0.837860 -0.928680 0.735016 0.842316 -0.946716 0.739929 0.846588 -0.193634 0.590057 0.690582 -0.216492 0.596466 0.696655 -0.240051 0.602905 0.702789 -0.264038 0.609222 0.708710 -0.288635 0.615631 0.714752 -0.313599 0.622070 0.720703 -0.338745 0.628326 0.726562 -0.364197 0.634705 0.732483 -0.389709 0.641022 0.738403 -0.415039 0.647247 0.744110 -0.440430 0.653534 0.749908 -0.465546 0.659668 0.755524 -0.491302 0.665894 0.761230 -0.517731 0.672089 0.766846 -0.544464 0.678009 0.772278 -0.571716 0.684113 0.777832 -0.599213 0.690063 0.783264 -0.626556 0.695862 0.788483 -0.653900 0.701752 0.793823 -0.680878 0.707611 0.799042 -0.707367 0.713165 0.804108 -0.733521 0.718872 0.809174 -0.759094 0.724457 0.814178 -0.783875 0.729767 0.819000 -0.808167 0.735199 0.823853 -0.831604 0.740448 0.828491 -0.854309 0.745728 0.833191 -0.876160 0.750885 0.837708 -0.896912 0.755798 0.842072 -0.916748 0.760803 0.846466 -0.935547 0.765717 0.850800 -0.953094 0.770325 0.854919 -0.203461 0.625031 0.702484 -0.226654 0.631439 0.708557 -0.250488 0.637909 0.714569 -0.274658 0.644165 0.720428 -0.299438 0.650513 0.726440 -0.324554 0.656891 0.732361 -0.349731 0.663025 0.738129 -0.375183 0.669312 0.743927 -0.400665 0.675568 0.749756 -0.425964 0.681580 0.755371 -0.451233 0.687775 0.761078 -0.476440 0.693726 0.766541 -0.502411 0.699768 0.772125 -0.529022 0.705780 0.777679 -0.555847 0.711517 0.782990 -0.583191 0.717438 0.788361 -0.610657 0.723206 0.793671 -0.637878 0.728821 0.798828 -0.665009 0.734406 0.804016 -0.691772 0.739990 0.809052 -0.718018 0.745422 0.813934 -0.743835 0.750824 0.818878 -0.768921 0.756042 0.823608 -0.793518 0.761322 0.828400 -0.817444 0.766479 0.833038 -0.840454 0.771393 0.837494 -0.862732 0.776398 0.841980 -0.884125 0.781311 0.846375 -0.904419 0.785950 0.850616 -0.923828 0.790710 0.854797 -0.942108 0.795288 0.858887 -0.959106 0.799652 0.862793 -0.213501 0.659912 0.714325 -0.236908 0.666290 0.720306 -0.260925 0.672546 0.726257 -0.285339 0.678741 0.732086 -0.310242 0.684967 0.738007 -0.335419 0.691162 0.743774 -0.360626 0.697174 0.749451 -0.386139 0.703308 0.755219 -0.411438 0.709259 0.760773 -0.436737 0.715271 0.766418 -0.461884 0.721252 0.772003 -0.487305 0.727020 0.777374 -0.513519 0.732849 0.782867 -0.540253 0.738586 0.788239 -0.567200 0.744232 0.793396 -0.594482 0.749817 0.798676 -0.621857 0.755432 0.803864 -0.648926 0.760773 0.808838 -0.675873 0.766174 0.813812 -0.702423 0.771515 0.818787 -0.728363 0.776611 0.823486 -0.753845 0.781769 0.828247 -0.778656 0.786743 0.832825 -0.802826 0.791656 0.837372 -0.826355 0.796570 0.841858 -0.848938 0.801239 0.846161 -0.870819 0.805939 0.850464 -0.891754 0.810577 0.854706 -0.911621 0.814911 0.858673 -0.930481 0.819305 0.862701 -0.948273 0.823608 0.866608 -0.964783 0.827698 0.870331 -0.223541 0.694244 0.725952 -0.247253 0.700409 0.731934 -0.271515 0.706604 0.737823 -0.296021 0.712616 0.743530 -0.321045 0.718689 0.749329 -0.346313 0.724762 0.755066 -0.371552 0.730560 0.760620 -0.396942 0.736542 0.766296 -0.422150 0.742218 0.771698 -0.447388 0.748047 0.777252 -0.472534 0.753815 0.782715 -0.498199 0.759369 0.787964 -0.524567 0.764984 0.793274 -0.551392 0.770508 0.798553 -0.578339 0.775818 0.803589 -0.605621 0.781219 0.808685 -0.632874 0.786591 0.813690 -0.659790 0.791626 0.818512 -0.686493 0.796783 0.823334 -0.712616 0.801697 0.828003 -0.738342 0.806671 0.832703 -0.763580 0.811554 0.837280 -0.787964 0.816193 0.841614 -0.811798 0.820892 0.846039 -0.834961 0.825470 0.850372 -0.857147 0.829865 0.854492 -0.878540 0.834259 0.858582 -0.899017 0.838531 0.862640 -0.918457 0.842560 0.866425 -0.936829 0.846649 0.870209 -0.953979 0.850555 0.873901 -0.970032 0.854370 0.877472 -0.233734 0.727814 0.737518 -0.257690 0.733917 0.743408 -0.282104 0.739868 0.749146 -0.306732 0.745697 0.754791 -0.331818 0.751587 0.760498 -0.356964 0.757233 0.765991 -0.382294 0.763031 0.771576 -0.407715 0.768768 0.777130 -0.432800 0.774292 0.782471 -0.457855 0.779846 0.787811 -0.483215 0.785370 0.793152 -0.509064 0.790710 0.798309 -0.535492 0.796021 0.803467 -0.562439 0.801300 0.808563 -0.589417 0.806396 0.813477 -0.616547 0.811493 0.818359 -0.643677 0.816498 0.823242 -0.670349 0.821320 0.827911 -0.696777 0.826172 0.832581 -0.722626 0.830811 0.837067 -0.748047 0.835480 0.841522 -0.772888 0.840027 0.845947 -0.796936 0.844391 0.850159 -0.820435 0.848755 0.854370 -0.843140 0.853027 0.858521 -0.864929 0.857056 0.862396 -0.885925 0.861176 0.866364 -0.905914 0.865112 0.870148 -0.924866 0.868835 0.873749 -0.942749 0.872589 0.877380 -0.959442 0.876160 0.880798 -0.974945 0.879700 0.884216 -0.243958 0.760590 0.748871 -0.268066 0.766449 0.754669 -0.292603 0.772278 0.760376 -0.317383 0.777771 0.765869 -0.342529 0.783447 0.771454 -0.367676 0.788971 0.776855 -0.392975 0.794495 0.782349 -0.418243 0.799957 0.787720 -0.443207 0.805206 0.792877 -0.468201 0.810516 0.798157 -0.493774 0.815765 0.803345 -0.519775 0.820801 0.808289 -0.546387 0.825836 0.813354 -0.573273 0.830841 0.818237 -0.600189 0.835632 0.822998 -0.627289 0.840454 0.827789 -0.654053 0.845032 0.832336 -0.680664 0.849701 0.836945 -0.706818 0.854218 0.841431 -0.732330 0.858551 0.845734 -0.757416 0.862854 0.850067 -0.781921 0.867126 0.854279 -0.805603 0.871185 0.858276 -0.828705 0.875214 0.862305 -0.850983 0.879089 0.866241 -0.872345 0.882812 0.869934 -0.892853 0.886536 0.873657 -0.912384 0.890106 0.877167 -0.930908 0.893616 0.880707 -0.948303 0.897034 0.884125 -0.964508 0.900238 0.887329 -0.979553 0.903442 0.890503 -0.254242 0.792358 0.760071 -0.278503 0.797974 0.765747 -0.303162 0.803497 0.771301 -0.328003 0.808868 0.776703 -0.353149 0.814270 0.782196 -0.378296 0.819458 0.787445 -0.403503 0.824738 0.792755 -0.428650 0.829895 0.798035 -0.453491 0.834869 0.803070 -0.478546 0.839905 0.808167 -0.504272 0.844879 0.813232 -0.530365 0.849609 0.818024 -0.557068 0.854340 0.822906 -0.583771 0.858917 0.827545 -0.610779 0.863525 0.832214 -0.637695 0.868011 0.836853 -0.664246 0.872314 0.841217 -0.690582 0.876587 0.845642 -0.716431 0.880798 0.849945 -0.741638 0.884796 0.854034 -0.766418 0.888794 0.858154 -0.790497 0.892639 0.862183 -0.813843 0.896423 0.866028 -0.836548 0.900116 0.869843 -0.858459 0.903687 0.873566 -0.879395 0.907104 0.877106 -0.899445 0.910461 0.880615 -0.918488 0.913635 0.883972 -0.936584 0.916809 0.887207 -0.953522 0.919891 0.890411 -0.969208 0.922791 0.893494 -0.983734 0.925629 0.896423 -0.264435 0.822937 0.771027 -0.288849 0.828278 0.776581 -0.313446 0.833435 0.781921 -0.338440 0.838593 0.787292 -0.363647 0.843781 0.792603 -0.388733 0.848663 0.797760 -0.413788 0.853668 0.802948 -0.438843 0.858551 0.808044 -0.463531 0.863190 0.812958 -0.488831 0.867950 0.817871 -0.514679 0.872559 0.822754 -0.540833 0.876984 0.827423 -0.567505 0.881409 0.832123 -0.594238 0.885620 0.836609 -0.621094 0.889893 0.841095 -0.647858 0.894043 0.845490 -0.674164 0.898010 0.849731 -0.700195 0.901947 0.853973 -0.725739 0.905823 0.858093 -0.750641 0.909485 0.862030 -0.775024 0.913086 0.865936 -0.798798 0.916687 0.869751 -0.821747 0.920044 0.873413 -0.843994 0.923370 0.876984 -0.865387 0.926514 0.880402 -0.886017 0.929657 0.883850 -0.905640 0.932678 0.887146 -0.924255 0.935547 0.890259 -0.941833 0.938354 0.893402 -0.958344 0.941040 0.896362 -0.973572 0.943634 0.899200 -0.987610 0.946106 0.901917 -0.274628 0.852203 0.781769 -0.299133 0.857300 0.787170 -0.323853 0.862122 0.792358 -0.348846 0.867035 0.797638 -0.373932 0.871857 0.802795 -0.398956 0.876434 0.807800 -0.423981 0.881104 0.812836 -0.448822 0.885651 0.817780 -0.473511 0.890045 0.822540 -0.498932 0.894409 0.827271 -0.524872 0.898712 0.832001 -0.551117 0.902771 0.836487 -0.577789 0.906830 0.840973 -0.604431 0.910767 0.845276 -0.631104 0.914642 0.849640 -0.657684 0.918427 0.853851 -0.683716 0.922058 0.857880 -0.709442 0.925659 0.861908 -0.734650 0.929138 0.865845 -0.759247 0.932465 0.869568 -0.783234 0.935760 0.873291 -0.806641 0.938904 0.876923 -0.829193 0.941956 0.880341 -0.851135 0.944885 0.883759 -0.872070 0.947723 0.886993 -0.892242 0.950531 0.890167 -0.911469 0.953186 0.893341 -0.929596 0.955658 0.896179 -0.946747 0.958130 0.899078 -0.962769 0.960510 0.901825 -0.977570 0.962738 0.904419 -0.991150 0.964874 0.906982 -0.284821 0.880066 0.792267 -0.309357 0.884796 0.797516 -0.334106 0.889374 0.802582 -0.359100 0.893951 0.807678 -0.384155 0.898376 0.812714 -0.408997 0.902649 0.817535 -0.433899 0.906982 0.822418 -0.458588 0.911163 0.827179 -0.483429 0.915222 0.831757 -0.508942 0.919220 0.836365 -0.534851 0.923035 0.840790 -0.561188 0.926880 0.845215 -0.587769 0.930573 0.849518 -0.614288 0.934143 0.853607 -0.640839 0.937653 0.857727 -0.667114 0.941071 0.861816 -0.692902 0.944305 0.865662 -0.718323 0.947571 0.869476 -0.743164 0.950714 0.873199 -0.767395 0.953583 0.876740 -0.791077 0.956573 0.880249 -0.814026 0.959290 0.883575 -0.836273 0.962036 0.886932 -0.857727 0.964600 0.890137 -0.878326 0.967133 0.893158 -0.898071 0.969543 0.896118 -0.916840 0.971863 0.899017 -0.934601 0.974030 0.901733 -0.951263 0.976135 0.904388 -0.966858 0.978149 0.906952 -0.981201 0.980011 0.909302 -0.994324 0.981903 0.911621 -0.294861 0.906311 0.802460 -0.319489 0.910736 0.807556 -0.344208 0.914886 0.812469 -0.369171 0.919128 0.817413 -0.394104 0.923218 0.822266 -0.418823 0.927185 0.826935 -0.443604 0.931091 0.831635 -0.468140 0.934967 0.836243 -0.493103 0.938629 0.840698 -0.518738 0.942230 0.845093 -0.544647 0.945679 0.849304 -0.571075 0.949127 0.853516 -0.597504 0.952515 0.857635 -0.623871 0.955658 0.861603 -0.650177 0.958801 0.865540 -0.676147 0.961884 0.869354 -0.701691 0.964722 0.873016 -0.726776 0.967621 0.876648 -0.751312 0.970337 0.880157 -0.775208 0.972900 0.883514 -0.798492 0.975464 0.886841 -0.821075 0.977875 0.889984 -0.842926 0.980194 0.893097 -0.863983 0.982483 0.896027 -0.884155 0.984619 0.898865 -0.903503 0.986633 0.901642 -0.921844 0.988617 0.904358 -0.939117 0.990479 0.906799 -0.955383 0.992249 0.909241 -0.970551 0.993896 0.911591 -0.984467 0.995544 0.913757 -0.997192 0.997009 0.915863 -0.050934 0.047943 0.495300 -0.064178 0.049591 0.498901 -0.078033 0.051331 0.502625 -0.092926 0.053162 0.506531 -0.108978 0.054993 0.510437 -0.126312 0.056885 0.514526 -0.144806 0.058899 0.518829 -0.164185 0.060913 0.523041 -0.184631 0.063049 0.527496 -0.205872 0.065247 0.532013 -0.227783 0.067474 0.536621 -0.250427 0.069794 0.541382 -0.273529 0.072113 0.546143 -0.297150 0.074615 0.551117 -0.321228 0.077148 0.556152 -0.345520 0.079742 0.561157 -0.370148 0.082458 0.566467 -0.394836 0.085236 0.571716 -0.419556 0.088043 0.576996 -0.444305 0.091034 0.582489 -0.468994 0.094055 0.588013 -0.494232 0.097137 0.593475 -0.520294 0.100372 0.599152 -0.546936 0.103699 0.604919 -0.573853 0.107025 0.610565 -0.601135 0.110535 0.616394 -0.628479 0.114044 0.622131 -0.655792 0.117706 0.628021 -0.682953 0.121490 0.634003 -0.709595 0.125244 0.639893 -0.735931 0.129150 0.645935 -0.761780 0.133179 0.651978 -0.054871 0.061218 0.502533 -0.068298 0.063019 0.506317 -0.082550 0.065002 0.510376 -0.097900 0.067017 0.514435 -0.114471 0.069061 0.518585 -0.132263 0.071228 0.522919 -0.151245 0.073456 0.527374 -0.171112 0.075714 0.531799 -0.191925 0.078125 0.536530 -0.213593 0.080597 0.541290 -0.235809 0.083069 0.546021 -0.258789 0.085724 0.550995 -0.282196 0.088379 0.555878 -0.306122 0.091156 0.561035 -0.330444 0.094055 0.566284 -0.354919 0.097015 0.571442 -0.379700 0.100128 0.576874 -0.404541 0.103271 0.582336 -0.429291 0.106445 0.587738 -0.454071 0.109833 0.593323 -0.479065 0.113281 0.599030 -0.504700 0.116730 0.604614 -0.531097 0.120361 0.610382 -0.557861 0.124023 0.616089 -0.585083 0.127808 0.621979 -0.612549 0.131653 0.627899 -0.639862 0.135559 0.633698 -0.667206 0.139618 0.639709 -0.694305 0.143738 0.645782 -0.720795 0.147827 0.651642 -0.747009 0.152100 0.657745 -0.772705 0.156464 0.663849 -0.058960 0.075531 0.510254 -0.072693 0.077637 0.514221 -0.087372 0.079834 0.518494 -0.103241 0.082123 0.522827 -0.120331 0.084442 0.527130 -0.138641 0.086914 0.531708 -0.158081 0.089447 0.536377 -0.178375 0.092041 0.541016 -0.199615 0.094788 0.545868 -0.221527 0.097534 0.550751 -0.244202 0.100464 0.555725 -0.267487 0.103485 0.560913 -0.291168 0.106506 0.566010 -0.315369 0.109711 0.571350 -0.339935 0.113037 0.576721 -0.364563 0.116302 0.582031 -0.389465 0.119781 0.587616 -0.414368 0.123352 0.593170 -0.439240 0.126923 0.598755 -0.464081 0.130646 0.604462 -0.489502 0.134491 0.610229 -0.515411 0.138275 0.615967 -0.542145 0.142273 0.621826 -0.569122 0.146271 0.627625 -0.596527 0.150421 0.633575 -0.624084 0.154663 0.639557 -0.651459 0.158875 0.645447 -0.678772 0.163269 0.651520 -0.705688 0.167694 0.657623 -0.732056 0.172119 0.663513 -0.758118 0.176697 0.669647 -0.783508 0.181366 0.675720 -0.063354 0.091309 0.518372 -0.077393 0.093689 0.522583 -0.092560 0.096252 0.527069 -0.108948 0.098907 0.531586 -0.126556 0.101562 0.536133 -0.145355 0.104401 0.540924 -0.165222 0.107330 0.545776 -0.185974 0.110291 0.550629 -0.207642 0.113373 0.555634 -0.229919 0.116547 0.560638 -0.252960 0.119843 0.565887 -0.276520 0.123199 0.571198 -0.300446 0.126648 0.576447 -0.324890 0.130188 0.581909 -0.349609 0.133850 0.587463 -0.374420 0.137543 0.592957 -0.399445 0.141388 0.598602 -0.424469 0.145264 0.604340 -0.449310 0.149200 0.609955 -0.474365 0.153290 0.615814 -0.500031 0.157349 0.621552 -0.526459 0.161621 0.627472 -0.553406 0.165924 0.633423 -0.580566 0.170227 0.639282 -0.608154 0.174713 0.645294 -0.635773 0.179291 0.651337 -0.663116 0.183807 0.657288 -0.690308 0.188477 0.663361 -0.717133 0.193176 0.669464 -0.743286 0.197876 0.675446 -0.769135 0.202728 0.681519 -0.794250 0.207520 0.687439 -0.068024 0.108917 0.526947 -0.082458 0.111664 0.531342 -0.098053 0.114594 0.536011 -0.115051 0.117615 0.540771 -0.133148 0.120636 0.545471 -0.152496 0.123840 0.550507 -0.172729 0.127106 0.555389 -0.193939 0.130463 0.560516 -0.216003 0.133942 0.565735 -0.238647 0.137421 0.570953 -0.261993 0.141083 0.576294 -0.285858 0.144806 0.581757 -0.309998 0.148560 0.587158 -0.334686 0.152496 0.592804 -0.359558 0.156494 0.598450 -0.384521 0.160492 0.604034 -0.409637 0.164642 0.609833 -0.434753 0.168945 0.615631 -0.459595 0.173157 0.621399 -0.484985 0.177582 0.627350 -0.511017 0.181976 0.633118 -0.537689 0.186523 0.639130 -0.564911 0.191193 0.645142 -0.592255 0.195770 0.651062 -0.619934 0.200470 0.657104 -0.647522 0.205292 0.663208 -0.674805 0.210114 0.669159 -0.701874 0.214996 0.675293 -0.728516 0.220001 0.681366 -0.754578 0.224945 0.687317 -0.780151 0.230011 0.693451 -0.804962 0.235016 0.699310 -0.072937 0.128387 0.535919 -0.087799 0.131500 0.540558 -0.103973 0.134766 0.545349 -0.121490 0.138153 0.550385 -0.140137 0.141510 0.555298 -0.159943 0.145081 0.560364 -0.180634 0.148651 0.565491 -0.202240 0.152374 0.570801 -0.224670 0.156219 0.576202 -0.247650 0.160034 0.581482 -0.271332 0.164032 0.587067 -0.295471 0.168091 0.592651 -0.319885 0.172180 0.598175 -0.344696 0.176453 0.603882 -0.369781 0.180756 0.609680 -0.394775 0.185059 0.615326 -0.420013 0.189575 0.621246 -0.444946 0.194000 0.627045 -0.470123 0.198639 0.632996 -0.495880 0.203339 0.639038 -0.522217 0.207977 0.644897 -0.549194 0.212799 0.650940 -0.576569 0.217712 0.656952 -0.604065 0.222534 0.662903 -0.631775 0.227570 0.669037 -0.659363 0.232635 0.675140 -0.686523 0.237610 0.681061 -0.713470 0.242767 0.687164 -0.739777 0.247833 0.693146 -0.765747 0.253052 0.699188 -0.791016 0.258362 0.705261 -0.815613 0.263519 0.711182 -0.078156 0.149628 0.545227 -0.093536 0.153076 0.550140 -0.110291 0.156708 0.555145 -0.128265 0.160309 0.560150 -0.147461 0.164124 0.565399 -0.167755 0.167999 0.570648 -0.188873 0.171875 0.575928 -0.210907 0.175934 0.581360 -0.233704 0.180115 0.586914 -0.256989 0.184204 0.592377 -0.280914 0.188538 0.598022 -0.305298 0.192902 0.603760 -0.329956 0.197266 0.609375 -0.354980 0.201843 0.615204 -0.380035 0.206329 0.620972 -0.405243 0.211029 0.626892 -0.430481 0.215820 0.632874 -0.455536 0.220520 0.638702 -0.480865 0.225403 0.644775 -0.507019 0.230347 0.650787 -0.533630 0.235260 0.656677 -0.560852 0.240326 0.662781 -0.588379 0.245422 0.668884 -0.616028 0.250488 0.674805 -0.643677 0.255707 0.680939 -0.671265 0.260956 0.687042 -0.698212 0.266144 0.692963 -0.725037 0.271484 0.699036 -0.751099 0.276733 0.704956 -0.776825 0.282135 0.710999 -0.801880 0.287567 0.717072 -0.826141 0.292908 0.722931 -0.083679 0.172485 0.554993 -0.099609 0.176239 0.559998 -0.116943 0.180145 0.565247 -0.135437 0.184082 0.570435 -0.155182 0.188232 0.575775 -0.175903 0.192383 0.581268 -0.197449 0.196564 0.586639 -0.219879 0.200958 0.592224 -0.243011 0.205414 0.597900 -0.266571 0.209839 0.603424 -0.290771 0.214386 0.609222 -0.315399 0.219116 0.615051 -0.340240 0.223724 0.620850 -0.365356 0.228577 0.626740 -0.390503 0.233307 0.632538 -0.415863 0.238251 0.638550 -0.441101 0.243256 0.644623 -0.466156 0.248199 0.650482 -0.491882 0.253326 0.656586 -0.518341 0.258514 0.662567 -0.545227 0.263580 0.668549 -0.572662 0.268890 0.674652 -0.600372 0.274200 0.680756 -0.627960 0.279419 0.686676 -0.655670 0.284790 0.692810 -0.682892 0.290100 0.698730 -0.709930 0.295563 0.704803 -0.736481 0.301025 0.710876 -0.762390 0.306396 0.716766 -0.787781 0.311920 0.722778 -0.812561 0.317474 0.728790 -0.836487 0.322937 0.734558 -0.089447 0.196655 0.565002 -0.106049 0.200867 0.570251 -0.123993 0.205078 0.575623 -0.143005 0.209290 0.580994 -0.163208 0.213715 0.586456 -0.184418 0.218201 0.592041 -0.206360 0.222656 0.597595 -0.229095 0.227295 0.603302 -0.252563 0.232025 0.609070 -0.276428 0.236694 0.614746 -0.300873 0.241547 0.620636 -0.325592 0.246338 0.626465 -0.350708 0.251343 0.632416 -0.376007 0.256378 0.638397 -0.401215 0.261353 0.644257 -0.426544 0.266541 0.650330 -0.451843 0.271759 0.656403 -0.477081 0.276855 0.662292 -0.503204 0.282196 0.668396 -0.529938 0.287567 0.674500 -0.557037 0.292816 0.680450 -0.584625 0.298248 0.686554 -0.612366 0.303711 0.692657 -0.639984 0.309082 0.698608 -0.667542 0.314606 0.704681 -0.694733 0.320038 0.710541 -0.721527 0.325592 0.716614 -0.747833 0.331177 0.722626 -0.773499 0.336639 0.728516 -0.798645 0.342285 0.734406 -0.823090 0.347900 0.740326 -0.846649 0.353394 0.746094 -0.095673 0.222321 0.575348 -0.112854 0.226776 0.580872 -0.131317 0.231262 0.586334 -0.150879 0.235748 0.591797 -0.171570 0.240448 0.597443 -0.193176 0.245209 0.603149 -0.215515 0.249908 0.608795 -0.238678 0.254791 0.614624 -0.262390 0.259766 0.620544 -0.286560 0.264648 0.626312 -0.311218 0.269745 0.632263 -0.336060 0.274689 0.638123 -0.361359 0.279907 0.644104 -0.386719 0.285156 0.650177 -0.412018 0.290344 0.656097 -0.437347 0.295715 0.662170 -0.462585 0.301086 0.668274 -0.488190 0.306396 0.674225 -0.514648 0.311859 0.680267 -0.541626 0.317352 0.686401 -0.568939 0.322815 0.692352 -0.596649 0.328339 0.698456 -0.624298 0.333801 0.704407 -0.652008 0.339386 0.710419 -0.679443 0.345001 0.716461 -0.706421 0.350464 0.722351 -0.733032 0.356171 0.728302 -0.759186 0.361816 0.734283 -0.784546 0.367310 0.740021 -0.809357 0.372955 0.745941 -0.833435 0.378662 0.751801 -0.856598 0.384155 0.757446 -0.102264 0.249176 0.586060 -0.120026 0.253815 0.591644 -0.139069 0.258636 0.597290 -0.159088 0.263336 0.602905 -0.180237 0.268280 0.608643 -0.202240 0.273285 0.614471 -0.224915 0.278168 0.620239 -0.248444 0.283264 0.626129 -0.272461 0.288452 0.632141 -0.296814 0.293549 0.638000 -0.321747 0.298828 0.643982 -0.346741 0.303986 0.649872 -0.372131 0.309357 0.655945 -0.397583 0.314789 0.662018 -0.422882 0.320099 0.667938 -0.448212 0.325592 0.674042 -0.473602 0.331116 0.680145 -0.499573 0.336548 0.686096 -0.526276 0.342102 0.692230 -0.553497 0.347748 0.698303 -0.580933 0.353241 0.704254 -0.608673 0.358887 0.710266 -0.636353 0.364441 0.716156 -0.664032 0.370087 0.722168 -0.691315 0.375763 0.728149 -0.718048 0.381287 0.734009 -0.744415 0.386963 0.739868 -0.770264 0.392639 0.745789 -0.795319 0.398132 0.751495 -0.819885 0.403778 0.757324 -0.843628 0.409454 0.763031 -0.866364 0.414886 0.768646 -0.109192 0.277008 0.597015 -0.127563 0.281952 0.602753 -0.147125 0.286987 0.608490 -0.167664 0.291901 0.614197 -0.189178 0.297028 0.620056 -0.211609 0.302155 0.625977 -0.234650 0.307281 0.631805 -0.258423 0.312561 0.637817 -0.282593 0.317780 0.643677 -0.307312 0.323181 0.649689 -0.332397 0.328613 0.655792 -0.357605 0.333984 0.661713 -0.383026 0.339447 0.667755 -0.408539 0.345001 0.673889 -0.433777 0.350403 0.679840 -0.459137 0.356018 0.685974 -0.484802 0.361664 0.692017 -0.511078 0.367188 0.697998 -0.538025 0.372864 0.704102 -0.565308 0.378387 0.709961 -0.592987 0.384033 0.716034 -0.620789 0.389740 0.722046 -0.648407 0.395294 0.727844 -0.675903 0.401031 0.733826 -0.703064 0.406677 0.739746 -0.729523 0.412140 0.745514 -0.755737 0.417877 0.751343 -0.781281 0.423492 0.757141 -0.806030 0.428986 0.762756 -0.830170 0.434601 0.768524 -0.853394 0.440063 0.774017 -0.875854 0.445709 0.779602 -0.116516 0.305786 0.608215 -0.135406 0.310913 0.614075 -0.155487 0.316071 0.619934 -0.176483 0.321228 0.625702 -0.198456 0.326508 0.631622 -0.221252 0.331848 0.637665 -0.244598 0.337097 0.643494 -0.268646 0.342560 0.649567 -0.293030 0.347900 0.655487 -0.317963 0.353394 0.661560 -0.343231 0.358978 0.667664 -0.368469 0.364380 0.673584 -0.394012 0.369995 0.679688 -0.419525 0.375610 0.685791 -0.444794 0.381134 0.691742 -0.470184 0.386841 0.697845 -0.496155 0.392517 0.703918 -0.522705 0.398010 0.709839 -0.549927 0.403717 0.715851 -0.577332 0.409302 0.721680 -0.605103 0.414948 0.727722 -0.632874 0.420654 0.733704 -0.660339 0.426208 0.739441 -0.687744 0.431854 0.745331 -0.714661 0.437561 0.751221 -0.740967 0.443054 0.756897 -0.766846 0.448822 0.762634 -0.792053 0.454529 0.768341 -0.816498 0.460175 0.773895 -0.840271 0.465973 0.779480 -0.863068 0.471619 0.784882 -0.885132 0.477417 0.790375 -0.124115 0.335297 0.619629 -0.143616 0.340546 0.625580 -0.164154 0.345917 0.631531 -0.185577 0.351166 0.637329 -0.208008 0.356598 0.643372 -0.230988 0.361938 0.649292 -0.254761 0.367462 0.655334 -0.279083 0.373016 0.661407 -0.303680 0.378448 0.667358 -0.328796 0.384033 0.673401 -0.354187 0.389679 0.679504 -0.379517 0.395172 0.685486 -0.404999 0.400848 0.691559 -0.430542 0.406494 0.697662 -0.455780 0.412048 0.703613 -0.481354 0.417786 0.709686 -0.507538 0.423248 0.715546 -0.534485 0.428955 0.721558 -0.561859 0.434662 0.727570 -0.589417 0.440247 0.733398 -0.617188 0.445984 0.739319 -0.644928 0.451752 0.745178 -0.672272 0.457428 0.750916 -0.699432 0.463287 0.756714 -0.726135 0.469177 0.762482 -0.752167 0.474915 0.768066 -0.777740 0.480835 0.773743 -0.802521 0.486633 0.779205 -0.826721 0.492554 0.784760 -0.850128 0.498444 0.790222 -0.872528 0.504242 0.795563 -0.894073 0.510162 0.800903 -0.132141 0.365326 0.631226 -0.152100 0.370728 0.637207 -0.173126 0.376251 0.643219 -0.194977 0.381592 0.649109 -0.217712 0.387115 0.655182 -0.241028 0.392548 0.661102 -0.265106 0.398102 0.667206 -0.289673 0.403717 0.673279 -0.314453 0.409241 0.679230 -0.339722 0.414825 0.685303 -0.365173 0.420502 0.691437 -0.390533 0.426056 0.697327 -0.416168 0.431732 0.703491 -0.441559 0.437439 0.709564 -0.466797 0.442993 0.715363 -0.492737 0.448822 0.721405 -0.519196 0.454468 0.727295 -0.546356 0.460388 0.733246 -0.573853 0.466278 0.739166 -0.601440 0.472015 0.744904 -0.629181 0.477997 0.750763 -0.656860 0.484009 0.756592 -0.684082 0.489838 0.762207 -0.710938 0.495850 0.767944 -0.737427 0.501892 0.773590 -0.763184 0.507812 0.779083 -0.788452 0.513824 0.784607 -0.812897 0.519745 0.789978 -0.836761 0.525787 0.795410 -0.859711 0.531738 0.800781 -0.881683 0.537567 0.805939 -0.902771 0.543579 0.811157 -0.140411 0.395721 0.642914 -0.160889 0.401276 0.648956 -0.182220 0.406677 0.654877 -0.204590 0.412201 0.660950 -0.227692 0.417847 0.667084 -0.251312 0.423279 0.673004 -0.275635 0.428894 0.679077 -0.300354 0.434540 0.685181 -0.325348 0.440063 0.691071 -0.350739 0.445801 0.697235 -0.376251 0.451630 0.703339 -0.401672 0.457306 0.709229 -0.427246 0.463226 0.715240 -0.452423 0.469025 0.721100 -0.477966 0.475006 0.727112 -0.504211 0.480988 0.733093 -0.530945 0.486877 0.738892 -0.558289 0.492920 0.744751 -0.585907 0.499054 0.750641 -0.613495 0.505035 0.756317 -0.641174 0.511108 0.762024 -0.668671 0.517303 0.767822 -0.695679 0.523224 0.773346 -0.722351 0.529358 0.778961 -0.748383 0.535370 0.784302 -0.773987 0.541443 0.789825 -0.798920 0.547577 0.795258 -0.822998 0.553497 0.800507 -0.846405 0.559570 0.805756 -0.869019 0.565613 0.811035 -0.890533 0.571442 0.816101 -0.911133 0.577393 0.821167 -0.148926 0.426392 0.654724 -0.169952 0.431946 0.660767 -0.191833 0.437531 0.666901 -0.214417 0.443024 0.672852 -0.237823 0.448761 0.678925 -0.261780 0.454376 0.684906 -0.286316 0.460236 0.690948 -0.311249 0.466156 0.697052 -0.336365 0.471924 0.703003 -0.361816 0.477905 0.709076 -0.387329 0.483917 0.715088 -0.412811 0.489838 0.720978 -0.438263 0.495941 0.726959 -0.463501 0.501923 0.732849 -0.489319 0.508087 0.738708 -0.515778 0.514282 0.744598 -0.542725 0.520355 0.750336 -0.570160 0.526550 0.756165 -0.597870 0.532776 0.761902 -0.625427 0.538879 0.767517 -0.652985 0.545074 0.773193 -0.680328 0.551270 0.778778 -0.707092 0.557312 0.784180 -0.733521 0.563507 0.789673 -0.759430 0.569702 0.795166 -0.784576 0.575653 0.800385 -0.809113 0.581757 0.805634 -0.832855 0.587708 0.810760 -0.855896 0.593689 0.815948 -0.878021 0.599670 0.821014 -0.899048 0.605469 0.825897 -0.919189 0.611359 0.830811 -0.157806 0.457428 0.666595 -0.179199 0.463257 0.672699 -0.201416 0.468994 0.678650 -0.224426 0.474884 0.684723 -0.248169 0.480835 0.690796 -0.272339 0.486755 0.696777 -0.297058 0.492798 0.702850 -0.322144 0.498901 0.708954 -0.347382 0.504944 0.714783 -0.372925 0.511108 0.720795 -0.398468 0.517365 0.726807 -0.423889 0.523407 0.732635 -0.449280 0.529663 0.738556 -0.474548 0.535858 0.744324 -0.500702 0.542145 0.750183 -0.527435 0.548431 0.756012 -0.554535 0.554535 0.761658 -0.582031 0.560822 0.767334 -0.609711 0.567139 0.773041 -0.637238 0.573242 0.778503 -0.664703 0.579437 0.784058 -0.691803 0.585693 0.789551 -0.718353 0.591736 0.794861 -0.744476 0.597931 0.800232 -0.769958 0.603882 0.805420 -0.794861 0.609955 0.810638 -0.819122 0.615997 0.815826 -0.842438 0.621857 0.820770 -0.865082 0.627747 0.825775 -0.886688 0.633636 0.830688 -0.907288 0.639252 0.835449 -0.926880 0.645050 0.840210 -0.166901 0.489807 0.678497 -0.188782 0.495850 0.684570 -0.211243 0.501770 0.690491 -0.234680 0.507965 0.696564 -0.258667 0.514160 0.702698 -0.283051 0.520203 0.708588 -0.307922 0.526459 0.714661 -0.333160 0.532776 0.720642 -0.358459 0.538910 0.726532 -0.384033 0.545227 0.732483 -0.409607 0.551575 0.738403 -0.434937 0.557800 0.744202 -0.460236 0.564087 0.750061 -0.485809 0.570312 0.755737 -0.512177 0.576660 0.761505 -0.539093 0.582977 0.767181 -0.566315 0.589172 0.772766 -0.593903 0.595428 0.778381 -0.621582 0.601776 0.783966 -0.648926 0.607849 0.789276 -0.676239 0.614075 0.794708 -0.703125 0.620209 0.800110 -0.729370 0.626160 0.805267 -0.755219 0.632263 0.810486 -0.780365 0.638123 0.815552 -0.804932 0.644043 0.820679 -0.828796 0.649994 0.825653 -0.851685 0.655701 0.830444 -0.873901 0.661438 0.835297 -0.895081 0.667145 0.840057 -0.915161 0.672638 0.844635 -0.934265 0.678131 0.849213 -0.176270 0.523285 0.690369 -0.198456 0.529510 0.696442 -0.221313 0.535675 0.702423 -0.245026 0.541992 0.708466 -0.269226 0.548309 0.714478 -0.293823 0.554504 0.720367 -0.318909 0.560883 0.726379 -0.344208 0.567291 0.732361 -0.369568 0.573486 0.738159 -0.395111 0.579926 0.744019 -0.420502 0.586151 0.749756 -0.445923 0.592529 0.755554 -0.471252 0.598938 0.761383 -0.497131 0.605133 0.766907 -0.523743 0.611450 0.772614 -0.550751 0.617767 0.778198 -0.578033 0.623871 0.783661 -0.605621 0.630127 0.789154 -0.633209 0.636292 0.794586 -0.660492 0.642334 0.799835 -0.687561 0.648407 0.805145 -0.714050 0.654327 0.810242 -0.740143 0.660278 0.815399 -0.765747 0.666260 0.820557 -0.790466 0.671936 0.825378 -0.814697 0.677704 0.830322 -0.838165 0.683380 0.835175 -0.860687 0.688873 0.839844 -0.882385 0.694489 0.844513 -0.903137 0.699860 0.849091 -0.922699 0.705139 0.853485 -0.941315 0.710480 0.857910 -0.185822 0.557556 0.702209 -0.208374 0.563965 0.708313 -0.231567 0.570251 0.714233 -0.255493 0.576630 0.720215 -0.279938 0.583038 0.726227 -0.304657 0.589325 0.732056 -0.329895 0.595734 0.738007 -0.355286 0.602142 0.743835 -0.380615 0.608398 0.749634 -0.406189 0.614838 0.755432 -0.431488 0.621002 0.761047 -0.456787 0.627411 0.766785 -0.482330 0.633759 0.772430 -0.508392 0.639862 0.777954 -0.535156 0.646149 0.783508 -0.562378 0.652313 0.789001 -0.589691 0.658295 0.794342 -0.617249 0.664429 0.799713 -0.644775 0.670471 0.804993 -0.671814 0.676331 0.810120 -0.698608 0.682251 0.815308 -0.724884 0.687927 0.820282 -0.750671 0.693756 0.825287 -0.775879 0.699463 0.830170 -0.800354 0.704956 0.834961 -0.824158 0.710510 0.839722 -0.847229 0.715973 0.844391 -0.869293 0.721252 0.848846 -0.890564 0.726532 0.853363 -0.910828 0.731812 0.857758 -0.929932 0.736755 0.862000 -0.947937 0.741791 0.866241 -0.195526 0.592438 0.714050 -0.218414 0.598877 0.720062 -0.241913 0.605164 0.725891 -0.266052 0.611633 0.731903 -0.290680 0.618042 0.737854 -0.315582 0.624298 0.743622 -0.340881 0.630676 0.749420 -0.366150 0.636963 0.755157 -0.391693 0.643341 0.760925 -0.417145 0.649597 0.766663 -0.442413 0.655762 0.772156 -0.467651 0.661987 0.777832 -0.493469 0.668243 0.783386 -0.519745 0.674194 0.788727 -0.546722 0.680298 0.794189 -0.573944 0.686340 0.799591 -0.601227 0.692139 0.804779 -0.628784 0.698090 0.809967 -0.656067 0.703949 0.815155 -0.682922 0.709625 0.820129 -0.709503 0.715302 0.825134 -0.735382 0.720795 0.829956 -0.760925 0.726379 0.834808 -0.785797 0.731873 0.839630 -0.809875 0.737061 0.844177 -0.833313 0.742432 0.848785 -0.855927 0.747650 0.853241 -0.877594 0.752625 0.857574 -0.898376 0.757721 0.861908 -0.918060 0.762543 0.865997 -0.936768 0.767365 0.870178 -0.954285 0.772156 0.874176 -0.205383 0.627441 0.725739 -0.228638 0.633881 0.731750 -0.252350 0.640106 0.737518 -0.276703 0.646515 0.743439 -0.301514 0.652924 0.749298 -0.326477 0.659119 0.754974 -0.351837 0.665405 0.760773 -0.377167 0.671539 0.766388 -0.402649 0.677765 0.772034 -0.427979 0.683929 0.777679 -0.453156 0.689911 0.783142 -0.478516 0.695984 0.788574 -0.504578 0.701996 0.794037 -0.531067 0.707855 0.799316 -0.558075 0.713715 0.804657 -0.585358 0.719604 0.809875 -0.612671 0.725220 0.814941 -0.640015 0.730957 0.820007 -0.666992 0.736450 0.824921 -0.693726 0.742004 0.829834 -0.720062 0.747467 0.834686 -0.745667 0.752686 0.839355 -0.770844 0.758026 0.844086 -0.795349 0.763245 0.848633 -0.819061 0.768280 0.853027 -0.842102 0.773315 0.857452 -0.864319 0.778229 0.861786 -0.885498 0.782959 0.865906 -0.905884 0.787720 0.870056 -0.925049 0.792297 0.873993 -0.943268 0.796844 0.877930 -0.960205 0.801300 0.881775 -0.215393 0.662262 0.737366 -0.238892 0.668610 0.743286 -0.262848 0.674744 0.748993 -0.287384 0.681061 0.754852 -0.312195 0.687134 0.760468 -0.337372 0.693359 0.766235 -0.362762 0.699493 0.771881 -0.388062 0.705475 0.777374 -0.413513 0.711487 0.782990 -0.438812 0.717529 0.788452 -0.463776 0.723297 0.793793 -0.489410 0.729187 0.799133 -0.515686 0.735046 0.804535 -0.542236 0.740601 0.809601 -0.569366 0.746307 0.814789 -0.596527 0.751801 0.819763 -0.623871 0.757324 0.824799 -0.651031 0.762787 0.829712 -0.677826 0.768066 0.834473 -0.704315 0.773346 0.839203 -0.730286 0.778534 0.843933 -0.755615 0.783539 0.848419 -0.780426 0.788574 0.852936 -0.804626 0.793518 0.857330 -0.827942 0.798279 0.861572 -0.850586 0.803009 0.865814 -0.872345 0.807678 0.869934 -0.893066 0.812103 0.873932 -0.912933 0.816559 0.877869 -0.931671 0.820862 0.881622 -0.949310 0.825073 0.885345 -0.965790 0.829254 0.889008 -0.225525 0.696533 0.748840 -0.249268 0.702759 0.754700 -0.273407 0.708771 0.760345 -0.298065 0.714844 0.766052 -0.322968 0.720825 0.771606 -0.348267 0.726898 0.777252 -0.373627 0.732788 0.782806 -0.398895 0.738556 0.788208 -0.424225 0.744446 0.793640 -0.449402 0.750214 0.799011 -0.474426 0.755798 0.804260 -0.500275 0.761475 0.809479 -0.526703 0.767029 0.814636 -0.553375 0.772461 0.819611 -0.580475 0.777893 0.824646 -0.607574 0.783081 0.829468 -0.634888 0.788391 0.834320 -0.661865 0.793610 0.839111 -0.688324 0.798523 0.843719 -0.714539 0.803558 0.848297 -0.740234 0.808502 0.852814 -0.765228 0.813232 0.857117 -0.789703 0.817963 0.861450 -0.813507 0.822601 0.865723 -0.836426 0.827026 0.869751 -0.858643 0.831482 0.873779 -0.879883 0.835724 0.877625 -0.900299 0.839966 0.881500 -0.919708 0.844147 0.885254 -0.937897 0.848022 0.888824 -0.955078 0.851990 0.892365 -0.971008 0.855835 0.895782 -0.235718 0.730133 0.760193 -0.259521 0.735962 0.765808 -0.283966 0.742004 0.771484 -0.308777 0.747925 0.777130 -0.333740 0.753632 0.782562 -0.358978 0.759460 0.788055 -0.384399 0.765198 0.793518 -0.409576 0.770782 0.798798 -0.434814 0.776367 0.804108 -0.459839 0.781891 0.809326 -0.485046 0.787292 0.814392 -0.511108 0.792694 0.819489 -0.537445 0.797882 0.824402 -0.564362 0.803101 0.829376 -0.591461 0.808258 0.834198 -0.618500 0.813263 0.838898 -0.645569 0.818268 0.843597 -0.672394 0.823151 0.848206 -0.698608 0.827820 0.852570 -0.724518 0.832520 0.856995 -0.749908 0.837189 0.861359 -0.774567 0.841583 0.865479 -0.798645 0.846008 0.869629 -0.822083 0.850372 0.873688 -0.844604 0.854492 0.877563 -0.866394 0.858612 0.881409 -0.887177 0.862549 0.885071 -0.907135 0.866455 0.888733 -0.926025 0.870239 0.892242 -0.943756 0.873901 0.895630 -0.960449 0.877472 0.898987 -0.975861 0.880951 0.902222 -0.245941 0.762756 0.771301 -0.269958 0.768524 0.776855 -0.294525 0.774261 0.782440 -0.319427 0.779938 0.787933 -0.344452 0.785431 0.793213 -0.369690 0.791077 0.798645 -0.395020 0.796539 0.803955 -0.420135 0.801849 0.809113 -0.445190 0.807190 0.814240 -0.470245 0.812500 0.819397 -0.495667 0.817566 0.824280 -0.521820 0.822693 0.829254 -0.548279 0.827606 0.833954 -0.575195 0.832611 0.838745 -0.602264 0.837433 0.843445 -0.629120 0.842102 0.847961 -0.656067 0.846802 0.852509 -0.682648 0.851379 0.856903 -0.708557 0.855774 0.861145 -0.734100 0.860168 0.865387 -0.759216 0.864441 0.869537 -0.783447 0.868561 0.873474 -0.807220 0.872681 0.877472 -0.830109 0.876556 0.881226 -0.852386 0.880432 0.884979 -0.873718 0.884277 0.888641 -0.894073 0.887817 0.892090 -0.913574 0.891449 0.895538 -0.932037 0.894897 0.898895 -0.949280 0.898193 0.902039 -0.965454 0.901459 0.905182 -0.980377 0.904633 0.908203 -0.256195 0.794464 0.782257 -0.280334 0.799896 0.787659 -0.305023 0.805420 0.793091 -0.330017 0.810913 0.798523 -0.355072 0.816162 0.803680 -0.380280 0.821411 0.808960 -0.405487 0.826691 0.814117 -0.430481 0.831726 0.819122 -0.455475 0.836823 0.824158 -0.480408 0.841614 0.828979 -0.506165 0.846527 0.833832 -0.532410 0.851379 0.838623 -0.558929 0.856018 0.843201 -0.585815 0.860657 0.847870 -0.612793 0.865204 0.852386 -0.639557 0.869537 0.856659 -0.666199 0.873932 0.861023 -0.692444 0.878174 0.865265 -0.718140 0.882263 0.869324 -0.743378 0.886322 0.873413 -0.768097 0.890259 0.877350 -0.792023 0.894043 0.881134 -0.815399 0.897797 0.884857 -0.837952 0.901367 0.888458 -0.859741 0.904907 0.891998 -0.880646 0.908386 0.895447 -0.900635 0.911621 0.898743 -0.919617 0.914825 0.901947 -0.937622 0.917999 0.905090 -0.954407 0.920868 0.908051 -0.970093 0.923828 0.911011 -0.984497 0.926605 0.913818 -0.266418 0.824951 0.792969 -0.290710 0.830109 0.798248 -0.315460 0.835388 0.803558 -0.340515 0.840546 0.808838 -0.365509 0.845490 0.813843 -0.390686 0.850555 0.819000 -0.415802 0.855469 0.824005 -0.440643 0.860199 0.828857 -0.465454 0.864990 0.833710 -0.490662 0.869507 0.838409 -0.516510 0.874146 0.843109 -0.542816 0.878632 0.847748 -0.569397 0.882935 0.852142 -0.596252 0.887238 0.856567 -0.623047 0.891449 0.860931 -0.649597 0.895477 0.865082 -0.676025 0.899475 0.869232 -0.701996 0.903412 0.873260 -0.727356 0.907135 0.877136 -0.752258 0.910858 0.881012 -0.776520 0.914368 0.884705 -0.800232 0.917877 0.888367 -0.823212 0.921295 0.891937 -0.845306 0.924530 0.895264 -0.866699 0.927704 0.898651 -0.887238 0.930817 0.901886 -0.906708 0.933716 0.904938 -0.925354 0.936615 0.908020 -0.942810 0.939392 0.910919 -0.959167 0.942017 0.913696 -0.974365 0.944550 0.916412 -0.988281 0.946960 0.918976 -0.276611 0.854095 0.803436 -0.300995 0.859009 0.808563 -0.325867 0.863953 0.813721 -0.350861 0.868835 0.818878 -0.375824 0.873535 0.823792 -0.400909 0.878265 0.828735 -0.425781 0.882690 0.833466 -0.450592 0.887238 0.838318 -0.475403 0.891663 0.842987 -0.500763 0.895874 0.847473 -0.526733 0.900146 0.852051 -0.553131 0.904327 0.856476 -0.579620 0.908234 0.860687 -0.606323 0.912231 0.864990 -0.632996 0.916077 0.869141 -0.659363 0.919800 0.873077 -0.685516 0.923401 0.877045 -0.711182 0.926971 0.880890 -0.736237 0.930328 0.884613 -0.760834 0.933685 0.888275 -0.784729 0.936859 0.891724 -0.808014 0.940033 0.895172 -0.830597 0.943054 0.898560 -0.852356 0.945892 0.901733 -0.873260 0.948761 0.904846 -0.893402 0.951538 0.907959 -0.912445 0.954071 0.910797 -0.930573 0.956604 0.913605 -0.947662 0.959015 0.916351 -0.963531 0.961304 0.918854 -0.978271 0.963531 0.921387 -0.991760 0.965607 0.923737 -0.286804 0.881897 0.813599 -0.311218 0.886414 0.818604 -0.336060 0.891052 0.823700 -0.361053 0.895630 0.828613 -0.385986 0.899933 0.833344 -0.410950 0.904297 0.838165 -0.435669 0.908447 0.842773 -0.460266 0.912567 0.847382 -0.485260 0.916718 0.851929 -0.510742 0.920593 0.856293 -0.536743 0.924500 0.860565 -0.563141 0.928284 0.864868 -0.589539 0.931854 0.868896 -0.616150 0.935455 0.872986 -0.642670 0.938965 0.876953 -0.668793 0.942261 0.880737 -0.694611 0.945557 0.884521 -0.719879 0.948639 0.888092 -0.744629 0.951782 0.891663 -0.768890 0.954742 0.895081 -0.792419 0.957550 0.898407 -0.815399 0.960327 0.901642 -0.837585 0.963043 0.904785 -0.858948 0.965515 0.907806 -0.879456 0.968018 0.910767 -0.899170 0.970398 0.913574 -0.917786 0.972656 0.916199 -0.935486 0.974823 0.918823 -0.952026 0.976837 0.921265 -0.967529 0.978821 0.923676 -0.981873 0.980743 0.925964 -0.994873 0.982483 0.928162 -0.296814 0.907959 0.823517 -0.321289 0.912231 0.828400 -0.346191 0.916534 0.833252 -0.370972 0.920593 0.837921 -0.395874 0.924683 0.842621 -0.420715 0.928680 0.847290 -0.445282 0.932465 0.851715 -0.469879 0.936279 0.856171 -0.494934 0.940002 0.860474 -0.520538 0.943512 0.864655 -0.546570 0.946960 0.868774 -0.572876 0.950409 0.872925 -0.599243 0.953613 0.876770 -0.625671 0.956848 0.880615 -0.651825 0.959900 0.884308 -0.677765 0.962921 0.887939 -0.703339 0.965820 0.891571 -0.728271 0.968567 0.894897 -0.752747 0.971283 0.898315 -0.776611 0.973907 0.901550 -0.799805 0.976349 0.904663 -0.822327 0.978760 0.907715 -0.844177 0.981079 0.910645 -0.865112 0.983246 0.913422 -0.885254 0.985382 0.916138 -0.904449 0.987427 0.918732 -0.922699 0.989288 0.921234 -0.939972 0.991150 0.923645 -0.956085 0.992828 0.925873 -0.971191 0.994537 0.928070 -0.985077 0.996094 0.930176 -0.997681 0.997528 0.932098 -0.051636 0.048553 0.517578 -0.064972 0.050262 0.521271 -0.078888 0.052032 0.525208 -0.093781 0.053802 0.529053 -0.109985 0.055695 0.533203 -0.127441 0.057648 0.537384 -0.145935 0.059631 0.541656 -0.165527 0.061707 0.546082 -0.185913 0.063812 0.550568 -0.207245 0.066040 0.555176 -0.229340 0.068329 0.559967 -0.251892 0.070618 0.564697 -0.275116 0.073059 0.569641 -0.298859 0.075562 0.574646 -0.322876 0.078094 0.579681 -0.347290 0.080719 0.584900 -0.371979 0.083496 0.590210 -0.396606 0.086243 0.595428 -0.421387 0.089142 0.600922 -0.446014 0.092072 0.606262 -0.470795 0.095123 0.611847 -0.496216 0.098358 0.617462 -0.522217 0.101501 0.623047 -0.548859 0.104889 0.628815 -0.575989 0.108337 0.634613 -0.603210 0.111786 0.640289 -0.630646 0.115417 0.646179 -0.658020 0.119141 0.652130 -0.684937 0.122803 0.657898 -0.711731 0.126678 0.663879 -0.737976 0.130585 0.669739 -0.763763 0.134583 0.675720 -0.055542 0.061859 0.524994 -0.069122 0.063782 0.528931 -0.083435 0.065765 0.533081 -0.098816 0.067749 0.537170 -0.115540 0.069855 0.541565 -0.133484 0.072052 0.545990 -0.152466 0.074280 0.550446 -0.172485 0.076599 0.555084 -0.193268 0.078949 0.559723 -0.214996 0.081482 0.564545 -0.237396 0.084076 0.569519 -0.260315 0.086670 0.574432 -0.283875 0.089417 0.579559 -0.307861 0.092255 0.584747 -0.332092 0.095123 0.589905 -0.356720 0.098145 0.595306 -0.381531 0.101257 0.600769 -0.406281 0.104401 0.606171 -0.431183 0.107697 0.611725 -0.455841 0.111023 0.617218 -0.480896 0.114532 0.622894 -0.506683 0.118103 0.628693 -0.533051 0.121643 0.634338 -0.559998 0.125427 0.640137 -0.587280 0.129242 0.646027 -0.614563 0.133057 0.651794 -0.642090 0.137085 0.657745 -0.669464 0.141174 0.663757 -0.696289 0.145172 0.669525 -0.722961 0.149414 0.675568 -0.749023 0.153625 0.681427 -0.774658 0.157990 0.687439 -0.059753 0.076233 0.532867 -0.073578 0.078400 0.537079 -0.088318 0.080688 0.541412 -0.104218 0.082947 0.545776 -0.121490 0.085358 0.550293 -0.139862 0.087769 0.554840 -0.159302 0.090393 0.559601 -0.179779 0.093048 0.564453 -0.201019 0.095764 0.569275 -0.223114 0.098633 0.574310 -0.245880 0.101562 0.579437 -0.269104 0.104553 0.584503 -0.292938 0.107666 0.589813 -0.317169 0.110931 0.595154 -0.341614 0.114197 0.600494 -0.366425 0.117615 0.606018 -0.391235 0.121033 0.611450 -0.416199 0.124603 0.617096 -0.441162 0.128296 0.622742 -0.465881 0.132019 0.628357 -0.491364 0.135864 0.634186 -0.517517 0.139801 0.639984 -0.544128 0.143707 0.645721 -0.571320 0.147827 0.651611 -0.598785 0.152008 0.657623 -0.626160 0.156189 0.663391 -0.653687 0.160492 0.669403 -0.680786 0.164795 0.675262 -0.707733 0.169281 0.681274 -0.734253 0.173798 0.687317 -0.760101 0.178345 0.693207 -0.785522 0.182983 0.699219 -0.064148 0.092163 0.541199 -0.078369 0.094635 0.545624 -0.093567 0.097260 0.550201 -0.110016 0.099823 0.554718 -0.127777 0.102631 0.559479 -0.146637 0.105408 0.564209 -0.166626 0.108368 0.569122 -0.187500 0.111420 0.574219 -0.209076 0.114532 0.579193 -0.231567 0.117767 0.584351 -0.254669 0.121124 0.589661 -0.278137 0.124451 0.594940 -0.302246 0.127960 0.600342 -0.326752 0.131561 0.605865 -0.351410 0.135162 0.611267 -0.376343 0.138947 0.616943 -0.401306 0.142731 0.622498 -0.426331 0.146698 0.628235 -0.451324 0.150726 0.634003 -0.476257 0.154785 0.639709 -0.502136 0.158966 0.645599 -0.528595 0.163269 0.651489 -0.555481 0.167511 0.657318 -0.582825 0.171906 0.663269 -0.610413 0.176422 0.669250 -0.637878 0.180847 0.675140 -0.665375 0.185516 0.681122 -0.692383 0.190094 0.687042 -0.719177 0.194855 0.693085 -0.745514 0.199677 0.699097 -0.771118 0.204468 0.704926 -0.796265 0.209351 0.710968 -0.068878 0.109894 0.549988 -0.083435 0.112762 0.554596 -0.099121 0.115631 0.559204 -0.116180 0.118683 0.564087 -0.134460 0.121826 0.569031 -0.153809 0.125000 0.573944 -0.174225 0.128296 0.579010 -0.195526 0.131744 0.584259 -0.217529 0.135162 0.589386 -0.240326 0.138794 0.594788 -0.263733 0.142456 0.600220 -0.287567 0.146179 0.605560 -0.311890 0.150055 0.611145 -0.336456 0.153931 0.616638 -0.361420 0.157928 0.622345 -0.386475 0.162079 0.628052 -0.411499 0.166138 0.633698 -0.436554 0.170441 0.639557 -0.461578 0.174805 0.645447 -0.486938 0.179169 0.651215 -0.513123 0.183655 0.657135 -0.539917 0.188293 0.663116 -0.566986 0.192810 0.668945 -0.594513 0.197510 0.674957 -0.622223 0.202301 0.680969 -0.649658 0.207031 0.686859 -0.677063 0.211945 0.692902 -0.703949 0.216766 0.698761 -0.730560 0.221771 0.704773 -0.756683 0.226837 0.710846 -0.782104 0.231781 0.716705 -0.807007 0.236969 0.722687 -0.073853 0.129517 0.559113 -0.088867 0.132721 0.563965 -0.105103 0.135956 0.568787 -0.122711 0.139313 0.573792 -0.141510 0.142822 0.578918 -0.161346 0.146362 0.583984 -0.182190 0.150024 0.589233 -0.203918 0.153809 0.594604 -0.226288 0.157562 0.599915 -0.249451 0.161499 0.605408 -0.273132 0.165558 0.610992 -0.297180 0.169556 0.616486 -0.321808 0.173767 0.622223 -0.346527 0.177948 0.627747 -0.371582 0.182312 0.633575 -0.396790 0.186737 0.639435 -0.421875 0.191162 0.645142 -0.446991 0.195740 0.651062 -0.472168 0.200409 0.656952 -0.497864 0.204987 0.662811 -0.524353 0.209808 0.668854 -0.551422 0.214661 0.674805 -0.578705 0.219421 0.680695 -0.606354 0.224396 0.686676 -0.633881 0.229340 0.692596 -0.661530 0.234344 0.698639 -0.688782 0.239502 0.704681 -0.715515 0.244629 0.710510 -0.741943 0.249786 0.716522 -0.767883 0.255035 0.722565 -0.793030 0.260223 0.728394 -0.817627 0.265533 0.734314 -0.079163 0.150879 0.568634 -0.094666 0.154388 0.573669 -0.111420 0.157959 0.578644 -0.129608 0.161713 0.583862 -0.148926 0.165558 0.589081 -0.169189 0.169373 0.594360 -0.190491 0.173370 0.599792 -0.212616 0.177490 0.605286 -0.235321 0.181549 0.610748 -0.258789 0.185852 0.616333 -0.282654 0.190033 0.621918 -0.307068 0.194489 0.627655 -0.331879 0.198975 0.633423 -0.356812 0.203461 0.639130 -0.382019 0.208099 0.645020 -0.407318 0.212799 0.650940 -0.432373 0.217499 0.656677 -0.457520 0.222321 0.662659 -0.483002 0.227264 0.668640 -0.509064 0.232117 0.674530 -0.535858 0.237152 0.680542 -0.563141 0.242218 0.686554 -0.590546 0.247253 0.692413 -0.618286 0.252411 0.698486 -0.645813 0.257568 0.704407 -0.673340 0.262817 0.710388 -0.700470 0.268158 0.716400 -0.727051 0.273376 0.722229 -0.753296 0.278748 0.728180 -0.778961 0.284180 0.734192 -0.803802 0.289520 0.739929 -0.828094 0.294922 0.745880 -0.084686 0.173767 0.578522 -0.100800 0.177704 0.583710 -0.118164 0.181580 0.588837 -0.136902 0.185638 0.594208 -0.156677 0.189789 0.599640 -0.177368 0.193878 0.605011 -0.199127 0.198212 0.610596 -0.221619 0.202606 0.616241 -0.244659 0.206970 0.621765 -0.268433 0.211517 0.627502 -0.292572 0.216034 0.633118 -0.317230 0.220764 0.638947 -0.342224 0.225525 0.644897 -0.367279 0.230225 0.650665 -0.392578 0.235168 0.656586 -0.417877 0.240082 0.662476 -0.443024 0.245056 0.668365 -0.468231 0.250122 0.674377 -0.494080 0.255249 0.680389 -0.520447 0.260345 0.686249 -0.547516 0.265564 0.692291 -0.574799 0.270752 0.698151 -0.602509 0.276031 0.704224 -0.630249 0.281433 0.710236 -0.657806 0.286682 0.716095 -0.685181 0.292114 0.722107 -0.712128 0.297607 0.728058 -0.738495 0.302979 0.733856 -0.764526 0.308502 0.739807 -0.789917 0.314026 0.745728 -0.814453 0.319427 0.751495 -0.838409 0.325043 0.757324 -0.090637 0.198242 0.588715 -0.107330 0.202423 0.594116 -0.125244 0.206604 0.599365 -0.144470 0.210968 0.604889 -0.164795 0.215393 0.610413 -0.185944 0.219788 0.615967 -0.208069 0.224365 0.621613 -0.230774 0.228912 0.627228 -0.254333 0.233704 0.632996 -0.278351 0.238495 0.638855 -0.302704 0.243256 0.644592 -0.327606 0.248199 0.650513 -0.352753 0.253174 0.656433 -0.377930 0.258179 0.662231 -0.403290 0.263275 0.668243 -0.428650 0.268494 0.674225 -0.453735 0.273590 0.680054 -0.479218 0.278870 0.686096 -0.505402 0.284210 0.692108 -0.532043 0.289490 0.698029 -0.559326 0.294830 0.704102 -0.586792 0.300140 0.709900 -0.614502 0.305634 0.715942 -0.642303 0.311157 0.721924 -0.669708 0.316559 0.727753 -0.696930 0.322144 0.733734 -0.723724 0.327698 0.739685 -0.749908 0.333160 0.745453 -0.775604 0.338776 0.751312 -0.800720 0.344391 0.757172 -0.824982 0.349884 0.762817 -0.848572 0.355499 0.768616 -0.096924 0.223999 0.599243 -0.114197 0.228455 0.604736 -0.132721 0.232910 0.610138 -0.152466 0.237488 0.615814 -0.173187 0.242218 0.621460 -0.194794 0.246857 0.627075 -0.217285 0.251709 0.632874 -0.240356 0.256500 0.638550 -0.264191 0.261475 0.644440 -0.288483 0.266541 0.650360 -0.313049 0.271515 0.656128 -0.338135 0.276672 0.662109 -0.363464 0.281891 0.668091 -0.388702 0.287048 0.673920 -0.414062 0.292389 0.679932 -0.439423 0.297699 0.685974 -0.464569 0.303009 0.691803 -0.490356 0.308441 0.697876 -0.516724 0.313782 0.703766 -0.543732 0.319305 0.709808 -0.571228 0.324860 0.715759 -0.598816 0.330292 0.721619 -0.626617 0.335876 0.727600 -0.654358 0.341461 0.733582 -0.681610 0.347015 0.739380 -0.708679 0.352600 0.745270 -0.735199 0.358307 0.751190 -0.761139 0.363770 0.756897 -0.786621 0.369446 0.762665 -0.811279 0.374969 0.768341 -0.835266 0.380615 0.774048 -0.858521 0.386200 0.779724 -0.103577 0.250946 0.610046 -0.121460 0.255646 0.615631 -0.140503 0.260345 0.621185 -0.160736 0.265167 0.626923 -0.181824 0.270020 0.632568 -0.203949 0.274963 0.638397 -0.226807 0.280060 0.644257 -0.250214 0.285065 0.650055 -0.274261 0.290253 0.655975 -0.298828 0.295532 0.661957 -0.323639 0.300690 0.667755 -0.348816 0.306000 0.673767 -0.374207 0.311371 0.679779 -0.399506 0.316681 0.685669 -0.424988 0.322205 0.691681 -0.450165 0.327545 0.697571 -0.475586 0.333099 0.703613 -0.501740 0.338654 0.709625 -0.528351 0.344116 0.715485 -0.555634 0.349701 0.721497 -0.583252 0.355377 0.727478 -0.610901 0.360870 0.733276 -0.638672 0.366516 0.739227 -0.666290 0.372223 0.745117 -0.693420 0.377716 0.750885 -0.720245 0.383392 0.756775 -0.746643 0.389130 0.762543 -0.772278 0.394623 0.768158 -0.797455 0.400299 0.773926 -0.821747 0.405762 0.779480 -0.845398 0.411438 0.785065 -0.868195 0.416992 0.790680 -0.110596 0.278870 0.621063 -0.129059 0.283844 0.626801 -0.148590 0.288727 0.632446 -0.169342 0.293823 0.638306 -0.190857 0.298828 0.643982 -0.213379 0.304016 0.649872 -0.236542 0.309235 0.655823 -0.260223 0.314423 0.661652 -0.284576 0.319824 0.667633 -0.309326 0.325226 0.673584 -0.334320 0.330505 0.679443 -0.359650 0.335999 0.685486 -0.385162 0.341492 0.691528 -0.410492 0.346985 0.697388 -0.435944 0.352509 0.703491 -0.461090 0.358032 0.709351 -0.486877 0.363617 0.715332 -0.513306 0.369293 0.721313 -0.540161 0.374817 0.727203 -0.567596 0.380463 0.733154 -0.595337 0.386169 0.739075 -0.622955 0.391724 0.744843 -0.650726 0.397430 0.750732 -0.678223 0.403076 0.756592 -0.705170 0.408691 0.762238 -0.731750 0.414307 0.768036 -0.757721 0.419830 0.773621 -0.783234 0.425446 0.779297 -0.808075 0.431122 0.784943 -0.832001 0.436523 0.790375 -0.855286 0.442169 0.795929 -0.877625 0.447784 0.801392 -0.117950 0.307739 0.632294 -0.136902 0.312744 0.638000 -0.157013 0.317932 0.643829 -0.178223 0.323212 0.649719 -0.200165 0.328400 0.655548 -0.222992 0.333771 0.661469 -0.246521 0.339172 0.667480 -0.270538 0.344482 0.673279 -0.295044 0.349976 0.679321 -0.320068 0.355499 0.685364 -0.345154 0.360901 0.691193 -0.370605 0.366486 0.697266 -0.395966 0.371979 0.703125 -0.421509 0.377594 0.709229 -0.446899 0.383270 0.715149 -0.472168 0.388794 0.721039 -0.498260 0.394501 0.727020 -0.524933 0.400208 0.733002 -0.552032 0.405701 0.738800 -0.579651 0.411438 0.744690 -0.607391 0.417114 0.750610 -0.635010 0.422638 0.756317 -0.662659 0.428284 0.762115 -0.689972 0.434021 0.767914 -0.716736 0.439545 0.773499 -0.743103 0.445221 0.779175 -0.768768 0.450806 0.784637 -0.793976 0.456573 0.790222 -0.818451 0.462372 0.795776 -0.842072 0.467987 0.801117 -0.864929 0.473816 0.806519 -0.886871 0.479584 0.811829 -0.125641 0.337280 0.643707 -0.145081 0.342438 0.649445 -0.165771 0.347809 0.655365 -0.187347 0.353210 0.661346 -0.209717 0.358490 0.667175 -0.232880 0.364014 0.673187 -0.256744 0.369537 0.679169 -0.280945 0.374969 0.685028 -0.305725 0.380554 0.691040 -0.330902 0.386139 0.697083 -0.356110 0.391632 0.703003 -0.381653 0.397278 0.709045 -0.407043 0.402771 0.714844 -0.432495 0.408478 0.720856 -0.457886 0.414215 0.726898 -0.483429 0.419769 0.732697 -0.509796 0.425385 0.738617 -0.536743 0.431152 0.744537 -0.564026 0.436615 0.750275 -0.591675 0.442383 0.756165 -0.619476 0.448090 0.761932 -0.647064 0.453796 0.767609 -0.674591 0.459625 0.773346 -0.701508 0.465332 0.778900 -0.728180 0.471252 0.784515 -0.754303 0.477142 0.790100 -0.779694 0.482941 0.795502 -0.804565 0.488831 0.800964 -0.828674 0.494781 0.806396 -0.851837 0.500549 0.811615 -0.874268 0.506470 0.816895 -0.895813 0.512329 0.822113 -0.133698 0.367401 0.655212 -0.153656 0.372681 0.661041 -0.174774 0.378174 0.666992 -0.196808 0.383636 0.673004 -0.219513 0.389069 0.678864 -0.243042 0.394623 0.684906 -0.267120 0.400269 0.690918 -0.291534 0.405670 0.696808 -0.316559 0.411316 0.702820 -0.341705 0.416809 0.708710 -0.367157 0.422516 0.714752 -0.392700 0.428162 0.720703 -0.418121 0.433746 0.726562 -0.443542 0.439392 0.732574 -0.468933 0.445190 0.738495 -0.494781 0.450806 0.744263 -0.521423 0.456696 0.750153 -0.548615 0.462585 0.756012 -0.576019 0.468353 0.761688 -0.603760 0.474274 0.767487 -0.631500 0.480255 0.773193 -0.658997 0.486115 0.778748 -0.686279 0.492096 0.784332 -0.713074 0.498016 0.789825 -0.739441 0.504028 0.795380 -0.765259 0.510071 0.800842 -0.790344 0.515930 0.806091 -0.814880 0.521973 0.811493 -0.838593 0.528015 0.816772 -0.861389 0.533844 0.821808 -0.883423 0.539856 0.826965 -0.904388 0.545807 0.832092 -0.141998 0.397827 0.666870 -0.162476 0.403168 0.672729 -0.184021 0.408783 0.678772 -0.206451 0.414307 0.684723 -0.229523 0.419800 0.690613 -0.253296 0.425385 0.696655 -0.277679 0.431030 0.702698 -0.302307 0.436493 0.708557 -0.327454 0.442230 0.714569 -0.352722 0.447815 0.720428 -0.378265 0.453644 0.726440 -0.403778 0.459564 0.732422 -0.429199 0.465271 0.738190 -0.454559 0.471252 0.744110 -0.480164 0.477234 0.750000 -0.506317 0.483154 0.755737 -0.533203 0.489166 0.761566 -0.560516 0.495239 0.767303 -0.588013 0.501221 0.772919 -0.615753 0.507324 0.778625 -0.643341 0.513245 0.784088 -0.670807 0.519379 0.789673 -0.697876 0.525574 0.795227 -0.724365 0.531525 0.800568 -0.750519 0.537628 0.805969 -0.776031 0.543762 0.811371 -0.800751 0.549713 0.816498 -0.824921 0.555786 0.821686 -0.848297 0.561798 0.826874 -0.870636 0.567688 0.831818 -0.892212 0.573669 0.836853 -0.912567 0.579437 0.841583 -0.150665 0.428467 0.678619 -0.171570 0.433899 0.684418 -0.193512 0.439514 0.690460 -0.216370 0.445190 0.696472 -0.239685 0.450745 0.702423 -0.263794 0.456573 0.708435 -0.288361 0.462433 0.714417 -0.313171 0.468201 0.720276 -0.338440 0.474152 0.726257 -0.363800 0.480042 0.732117 -0.389374 0.486084 0.738068 -0.414886 0.492157 0.743958 -0.440277 0.498077 0.749725 -0.465607 0.504272 0.755554 -0.491486 0.510437 0.761444 -0.517944 0.516449 0.766998 -0.544983 0.522675 0.772797 -0.572449 0.528870 0.778442 -0.599976 0.534912 0.783997 -0.627716 0.541168 0.789551 -0.655304 0.547394 0.795105 -0.682465 0.553436 0.800446 -0.709290 0.559631 0.805847 -0.735535 0.565674 0.811066 -0.761353 0.571838 0.816376 -0.786591 0.577942 0.821594 -0.810974 0.583893 0.826599 -0.834717 0.589905 0.831696 -0.857666 0.595917 0.836700 -0.879608 0.601776 0.841492 -0.900696 0.607666 0.846313 -0.920685 0.613525 0.851135 -0.159546 0.459595 0.690338 -0.180908 0.465271 0.696198 -0.203278 0.471161 0.702240 -0.226410 0.477112 0.708282 -0.250092 0.483002 0.714172 -0.274353 0.488983 0.720154 -0.299103 0.495148 0.726105 -0.324158 0.501129 0.731934 -0.349518 0.507233 0.737915 -0.374939 0.513306 0.743683 -0.400513 0.519501 0.749603 -0.426025 0.525818 0.755432 -0.451263 0.531891 0.761108 -0.476715 0.538177 0.766876 -0.502930 0.544464 0.772614 -0.529510 0.550598 0.778168 -0.556793 0.556885 0.783844 -0.584351 0.563202 0.789398 -0.611877 0.569275 0.794800 -0.639526 0.575592 0.800323 -0.666809 0.581665 0.805573 -0.693909 0.587891 0.810944 -0.720459 0.594025 0.816254 -0.746460 0.600067 0.821350 -0.771973 0.606171 0.826447 -0.796844 0.612274 0.831573 -0.820892 0.618103 0.836426 -0.844269 0.624054 0.841370 -0.866730 0.630005 0.846222 -0.888245 0.635651 0.850861 -0.908844 0.641479 0.855530 -0.928253 0.647034 0.860046 -0.168671 0.492065 0.702057 -0.190460 0.498016 0.707947 -0.213226 0.504089 0.714020 -0.236633 0.510254 0.720001 -0.260529 0.516296 0.725830 -0.285095 0.522552 0.731812 -0.309906 0.528656 0.737579 -0.335144 0.534912 0.743530 -0.360596 0.541290 0.749390 -0.386047 0.547455 0.755157 -0.411591 0.553772 0.760956 -0.437042 0.560181 0.766724 -0.462219 0.566345 0.772339 -0.487976 0.572723 0.778046 -0.514374 0.579071 0.783691 -0.541199 0.585205 0.789124 -0.568542 0.591522 0.794647 -0.596161 0.597778 0.800171 -0.623657 0.603912 0.805450 -0.651184 0.610168 0.810791 -0.678314 0.616180 0.815979 -0.705139 0.622345 0.821228 -0.731476 0.628479 0.826355 -0.757141 0.634399 0.831329 -0.782349 0.640350 0.836304 -0.806854 0.646301 0.841248 -0.830475 0.652039 0.845947 -0.853455 0.657837 0.850739 -0.875549 0.663605 0.855438 -0.896576 0.669098 0.859924 -0.916656 0.674683 0.864410 -0.935547 0.680054 0.868713 -0.178101 0.525635 0.713867 -0.200226 0.531738 0.719696 -0.223328 0.538025 0.725677 -0.247009 0.544312 0.731628 -0.271179 0.550537 0.737457 -0.295898 0.556885 0.743378 -0.320831 0.563141 0.749115 -0.346252 0.569580 0.754974 -0.371735 0.575928 0.760803 -0.397156 0.582153 0.766449 -0.422638 0.588531 0.772156 -0.447998 0.594940 0.777924 -0.473236 0.601105 0.783417 -0.499268 0.607483 0.789001 -0.525940 0.613831 0.794525 -0.552887 0.619965 0.799896 -0.580292 0.626251 0.805328 -0.607727 0.632294 0.810516 -0.635315 0.638489 0.815857 -0.662659 0.644592 0.821106 -0.689575 0.650513 0.826080 -0.716125 0.656555 0.831177 -0.742188 0.662537 0.836182 -0.767578 0.668304 0.841003 -0.792389 0.674103 0.845825 -0.816559 0.679840 0.850647 -0.839813 0.685394 0.855164 -0.862335 0.690979 0.859772 -0.883881 0.696381 0.864197 -0.904541 0.701782 0.868591 -0.924164 0.707123 0.872955 -0.942535 0.712280 0.877075 -0.187683 0.559998 0.725525 -0.210175 0.566223 0.731354 -0.233551 0.572632 0.737305 -0.257507 0.579071 0.743225 -0.281891 0.585297 0.748932 -0.306763 0.591736 0.754852 -0.331848 0.597992 0.760529 -0.357269 0.604401 0.766327 -0.382782 0.610809 0.772034 -0.408203 0.617035 0.777618 -0.433563 0.623413 0.783264 -0.458862 0.629761 0.788849 -0.484283 0.635925 0.794281 -0.510590 0.642212 0.799744 -0.537292 0.648254 0.805054 -0.564484 0.654449 0.810394 -0.591980 0.660583 0.815704 -0.619354 0.666565 0.820831 -0.646820 0.672577 0.825928 -0.673950 0.678558 0.831055 -0.700592 0.684326 0.835968 -0.726929 0.690094 0.840881 -0.752655 0.695892 0.845734 -0.777679 0.701447 0.850372 -0.802185 0.707031 0.855072 -0.825958 0.712585 0.859711 -0.848816 0.717865 0.864075 -0.870941 0.723236 0.868530 -0.891998 0.728424 0.872711 -0.912170 0.733582 0.876953 -0.931274 0.738647 0.881134 -0.949127 0.743561 0.885101 -0.197388 0.594849 0.737152 -0.220245 0.601105 0.742920 -0.243896 0.607574 0.748810 -0.267975 0.613861 0.754547 -0.292633 0.620300 0.760376 -0.317688 0.626709 0.766174 -0.342834 0.632935 0.771729 -0.368256 0.639282 0.777466 -0.393799 0.645660 0.783142 -0.419098 0.651825 0.788544 -0.444458 0.658081 0.794128 -0.469727 0.664368 0.799622 -0.495453 0.670349 0.804932 -0.521942 0.676453 0.810272 -0.548706 0.682434 0.815460 -0.575989 0.688416 0.820679 -0.603485 0.694397 0.825836 -0.630798 0.700104 0.830811 -0.658051 0.705994 0.835815 -0.684998 0.711731 0.840790 -0.711395 0.717316 0.845459 -0.737366 0.722870 0.850250 -0.762787 0.728424 0.854980 -0.787567 0.733734 0.859467 -0.811615 0.739105 0.863983 -0.834930 0.744293 0.868256 -0.857483 0.749451 0.872589 -0.879120 0.754578 0.876862 -0.899750 0.759460 0.880890 -0.919434 0.764374 0.884979 -0.938019 0.769165 0.888947 -0.955353 0.773773 0.892700 -0.207306 0.629883 0.748657 -0.230499 0.636139 0.754425 -0.254364 0.642548 0.760254 -0.278625 0.648712 0.765869 -0.303406 0.655151 0.771606 -0.328613 0.661438 0.777313 -0.353821 0.667633 0.782867 -0.379272 0.673889 0.788422 -0.404724 0.680054 0.793976 -0.429993 0.686066 0.799347 -0.455200 0.692139 0.804810 -0.480621 0.698273 0.810120 -0.506561 0.704132 0.815308 -0.533203 0.710083 0.820587 -0.560089 0.715820 0.825592 -0.587402 0.721588 0.830688 -0.614838 0.727386 0.835693 -0.641998 0.732880 0.840515 -0.669098 0.738495 0.845337 -0.695801 0.744049 0.850159 -0.721924 0.749359 0.854736 -0.747589 0.754761 0.859314 -0.772705 0.759979 0.863861 -0.797028 0.765076 0.868134 -0.820831 0.770172 0.872498 -0.843658 0.775024 0.876648 -0.865814 0.779938 0.880829 -0.887024 0.784760 0.884888 -0.907166 0.789398 0.888763 -0.926361 0.794006 0.892578 -0.944427 0.798523 0.896393 -0.961273 0.802795 0.899963 -0.217224 0.664490 0.759918 -0.240723 0.670837 0.765747 -0.264862 0.677124 0.771484 -0.289307 0.683258 0.777069 -0.314270 0.689423 0.782715 -0.339447 0.695648 0.788300 -0.364716 0.701660 0.793732 -0.390167 0.707733 0.799164 -0.415588 0.713745 0.804657 -0.440704 0.719635 0.809875 -0.465820 0.725555 0.815155 -0.491364 0.731262 0.820312 -0.517670 0.737030 0.825439 -0.544373 0.742767 0.830536 -0.571381 0.748291 0.835449 -0.598663 0.753876 0.840393 -0.625977 0.759399 0.845276 -0.652985 0.764709 0.849915 -0.679901 0.770020 0.854584 -0.706299 0.775330 0.859222 -0.732117 0.780334 0.863647 -0.757477 0.785431 0.868042 -0.782135 0.790344 0.872253 -0.806213 0.795258 0.876556 -0.829590 0.800079 0.880707 -0.852051 0.804657 0.884705 -0.873749 0.809326 0.888672 -0.894501 0.813812 0.892487 -0.914185 0.818146 0.896179 -0.932892 0.822449 0.899872 -0.950439 0.826660 0.903442 -0.966766 0.830658 0.906830 -0.227325 0.698700 0.771179 -0.251129 0.704926 0.776886 -0.275421 0.711060 0.782562 -0.299988 0.717010 0.788025 -0.325073 0.723114 0.793579 -0.350342 0.729095 0.799072 -0.375549 0.734924 0.804382 -0.400940 0.740784 0.809753 -0.426300 0.746613 0.815063 -0.451324 0.752228 0.820160 -0.476471 0.757965 0.825317 -0.502228 0.763458 0.830322 -0.528656 0.768982 0.835327 -0.555511 0.774506 0.840302 -0.582550 0.779785 0.845001 -0.609711 0.785065 0.849792 -0.636932 0.790344 0.854492 -0.663788 0.795349 0.858978 -0.690369 0.800476 0.863525 -0.716492 0.805420 0.867950 -0.742004 0.810211 0.872192 -0.767059 0.815002 0.876434 -0.791382 0.819611 0.880493 -0.815094 0.824249 0.884583 -0.838043 0.828705 0.888580 -0.860077 0.833008 0.892334 -0.881348 0.837341 0.896088 -0.901611 0.841553 0.899780 -0.920807 0.845520 0.903259 -0.939056 0.849579 0.906738 -0.956116 0.853424 0.910095 -0.971924 0.857086 0.913300 -0.237518 0.732239 0.782288 -0.261536 0.738220 0.787903 -0.285980 0.744232 0.793396 -0.310669 0.749969 0.798828 -0.335815 0.755829 0.804260 -0.361084 0.761627 0.809631 -0.386322 0.767212 0.814819 -0.411621 0.772858 0.820038 -0.436676 0.778351 0.825073 -0.461731 0.783844 0.830139 -0.487152 0.789337 0.835205 -0.513031 0.794556 0.840027 -0.539551 0.799835 0.844879 -0.566498 0.805084 0.849670 -0.593445 0.810089 0.854248 -0.620544 0.815094 0.858856 -0.647614 0.820099 0.863403 -0.674225 0.824860 0.867737 -0.700531 0.829620 0.872070 -0.726288 0.834229 0.876221 -0.751587 0.838745 0.880371 -0.776276 0.843262 0.884491 -0.800232 0.847534 0.888367 -0.823578 0.851837 0.892212 -0.846069 0.856049 0.895996 -0.867706 0.860016 0.899567 -0.888580 0.864044 0.903198 -0.908417 0.867920 0.906677 -0.927124 0.871582 0.909943 -0.944855 0.875244 0.913208 -0.961395 0.878693 0.916290 -0.976746 0.882172 0.919373 -0.247742 0.764862 0.793152 -0.271942 0.770660 0.798676 -0.296539 0.776367 0.804108 -0.321320 0.781891 0.809326 -0.346497 0.787537 0.814636 -0.371765 0.793121 0.819916 -0.396912 0.798431 0.824951 -0.422119 0.803864 0.830017 -0.447083 0.809082 0.834961 -0.472046 0.814331 0.839905 -0.497650 0.819519 0.844788 -0.523773 0.824463 0.849426 -0.550354 0.829468 0.854095 -0.577209 0.834412 0.858734 -0.604187 0.839111 0.863190 -0.631165 0.843872 0.867645 -0.658051 0.848511 0.871948 -0.684387 0.852966 0.876129 -0.710419 0.857422 0.880310 -0.735840 0.861664 0.884277 -0.760803 0.865967 0.888275 -0.785126 0.870148 0.892151 -0.808746 0.874084 0.895813 -0.831696 0.878052 0.899506 -0.853821 0.881927 0.903107 -0.875000 0.885559 0.906464 -0.895386 0.889252 0.909882 -0.914764 0.892761 0.913116 -0.933044 0.896057 0.916229 -0.950287 0.899414 0.919281 -0.966309 0.902557 0.922180 -0.981140 0.905670 0.925079 -0.257996 0.796417 0.803833 -0.282349 0.801971 0.809174 -0.307037 0.807526 0.814545 -0.331909 0.812805 0.819641 -0.357056 0.818146 0.824829 -0.382172 0.823242 0.829773 -0.407379 0.828491 0.834808 -0.432404 0.833618 0.839783 -0.457214 0.838562 0.844574 -0.482391 0.843536 0.849304 -0.508179 0.848389 0.854004 -0.534332 0.853058 0.858551 -0.560944 0.857758 0.863098 -0.587860 0.862366 0.867523 -0.614685 0.866760 0.871765 -0.641479 0.871216 0.876038 -0.668121 0.875519 0.880188 -0.694214 0.879669 0.884186 -0.719971 0.883759 0.888153 -0.745026 0.887695 0.891968 -0.769684 0.891632 0.895721 -0.793640 0.895477 0.899445 -0.816864 0.899078 0.902924 -0.839386 0.902679 0.906372 -0.861145 0.906219 0.909790 -0.881866 0.909515 0.912964 -0.901825 0.912842 0.916138 -0.920746 0.916046 0.919250 -0.938568 0.919037 0.922089 -0.955353 0.922058 0.925049 -0.970886 0.924866 0.927734 -0.985229 0.927582 0.930359 -0.268250 0.826813 0.814240 -0.292694 0.832123 0.819489 -0.317474 0.837341 0.824738 -0.342377 0.842346 0.829651 -0.367493 0.847412 0.834686 -0.392548 0.852295 0.839539 -0.417633 0.857208 0.844421 -0.442566 0.862000 0.849182 -0.467224 0.866608 0.853790 -0.492615 0.871277 0.858429 -0.518463 0.875854 0.863007 -0.544708 0.880188 0.867279 -0.571381 0.884583 0.871674 -0.598175 0.888855 0.875946 -0.624847 0.892914 0.879974 -0.651520 0.897003 0.884094 -0.677765 0.900848 0.887909 -0.703674 0.904755 0.891815 -0.729126 0.908539 0.895630 -0.753845 0.912140 0.899261 -0.778137 0.915680 0.902832 -0.801788 0.919159 0.906281 -0.824585 0.922485 0.909607 -0.846710 0.925720 0.912903 -0.868011 0.928925 0.916107 -0.888367 0.931854 0.919098 -0.907898 0.934845 0.922028 -0.926300 0.937592 0.924896 -0.943695 0.940308 0.927643 -0.960052 0.942963 0.930298 -0.975098 0.945435 0.932800 -0.988983 0.947845 0.935303 -0.278473 0.855896 0.824432 -0.302979 0.860870 0.829529 -0.327698 0.865692 0.834473 -0.352661 0.870514 0.839417 -0.377777 0.875275 0.844299 -0.402710 0.879822 0.848907 -0.427673 0.884460 0.853668 -0.452454 0.888885 0.858276 -0.477264 0.893219 0.862732 -0.502686 0.897552 0.867188 -0.528656 0.901733 0.871613 -0.554932 0.905731 0.875732 -0.581543 0.909760 0.879883 -0.608124 0.913574 0.883850 -0.634796 0.917389 0.887848 -0.661194 0.921143 0.891724 -0.687164 0.924652 0.895416 -0.712799 0.928192 0.899170 -0.737885 0.931610 0.902771 -0.762299 0.934875 0.906128 -0.786224 0.938049 0.909515 -0.809448 0.941132 0.912811 -0.831879 0.944122 0.915924 -0.853668 0.946991 0.919037 -0.874542 0.949829 0.921967 -0.894409 0.952454 0.924805 -0.913513 0.955078 0.927582 -0.931488 0.957489 0.930176 -0.948456 0.959869 0.932739 -0.964325 0.962158 0.935211 -0.978973 0.964294 0.937500 -0.992340 0.966400 0.939728 -0.288574 0.883514 0.834320 -0.313141 0.888184 0.839264 -0.337860 0.892609 0.844086 -0.362885 0.897156 0.848846 -0.387878 0.901581 0.853516 -0.412720 0.905823 0.858093 -0.437531 0.910004 0.862640 -0.462128 0.914185 0.867096 -0.487000 0.918091 0.871368 -0.512573 0.922089 0.875610 -0.538635 0.925903 0.879761 -0.564880 0.929596 0.883759 -0.591431 0.933197 0.887726 -0.617950 0.936707 0.891541 -0.644379 0.940155 0.895325 -0.670502 0.943512 0.899078 -0.696198 0.946655 0.902557 -0.721497 0.949829 0.906067 -0.746246 0.952850 0.909424 -0.770325 0.955750 0.912628 -0.793884 0.958618 0.915863 -0.816803 0.961365 0.918945 -0.838776 0.963959 0.921844 -0.860138 0.966492 0.924713 -0.880524 0.968842 0.927429 -0.900116 0.971191 0.930115 -0.918732 0.973450 0.932648 -0.936310 0.975555 0.935089 -0.952850 0.977600 0.937469 -0.968262 0.979584 0.939667 -0.982422 0.981384 0.941803 -0.995422 0.983124 0.943848 -0.298584 0.909515 0.843933 -0.323212 0.913849 0.848724 -0.347931 0.917999 0.853333 -0.372864 0.922119 0.857971 -0.397797 0.926178 0.862518 -0.422485 0.930054 0.866882 -0.447144 0.933899 0.871246 -0.471680 0.937653 0.875488 -0.496704 0.941254 0.879547 -0.522339 0.944794 0.883636 -0.548279 0.948212 0.887543 -0.574615 0.951599 0.891479 -0.601044 0.954834 0.895264 -0.627350 0.957947 0.898865 -0.653564 0.961029 0.902466 -0.679443 0.964020 0.905975 -0.704895 0.966797 0.909271 -0.729858 0.969604 0.912567 -0.754242 0.972260 0.915741 -0.777985 0.974792 0.918762 -0.801178 0.977264 0.921814 -0.823639 0.979645 0.924652 -0.845276 0.981903 0.927399 -0.866272 0.984070 0.930054 -0.886200 0.986115 0.932526 -0.905396 0.988098 0.935028 -0.923584 0.989990 0.937408 -0.940735 0.991760 0.939575 -0.956848 0.993500 0.941742 -0.971832 0.995087 0.943787 -0.985596 0.996582 0.945709 -0.998199 0.998047 0.947510 -0.052399 0.049194 0.540314 -0.065765 0.050903 0.544128 -0.079681 0.052643 0.547974 -0.094727 0.054504 0.552094 -0.110962 0.056366 0.556183 -0.128479 0.058350 0.560455 -0.147156 0.060425 0.564911 -0.166748 0.062469 0.569305 -0.187317 0.064606 0.573975 -0.208710 0.066895 0.578705 -0.230713 0.069122 0.583374 -0.253510 0.071503 0.588318 -0.276764 0.073975 0.593323 -0.300446 0.076477 0.598297 -0.324646 0.079071 0.603516 -0.348969 0.081665 0.608612 -0.373657 0.084442 0.613983 -0.398407 0.087311 0.619385 -0.423157 0.090179 0.624664 -0.447876 0.093201 0.630188 -0.472687 0.096344 0.635803 -0.498077 0.099487 0.641296 -0.524231 0.102753 0.647003 -0.550995 0.106171 0.652771 -0.578003 0.109589 0.658386 -0.605377 0.113159 0.664215 -0.632690 0.116699 0.669922 -0.660034 0.120422 0.675781 -0.687134 0.124298 0.681671 -0.713715 0.128082 0.687439 -0.740051 0.132080 0.693451 -0.765869 0.136169 0.699310 -0.056335 0.062561 0.547882 -0.069916 0.064453 0.551880 -0.084290 0.066467 0.556061 -0.099823 0.068542 0.560333 -0.116577 0.070618 0.564697 -0.134583 0.072845 0.569214 -0.153778 0.075165 0.573883 -0.173737 0.077423 0.578430 -0.194733 0.079895 0.583252 -0.216522 0.082458 0.588196 -0.238892 0.084991 0.593079 -0.262024 0.087677 0.598175 -0.285461 0.090393 0.603210 -0.309540 0.093292 0.608459 -0.333893 0.096252 0.613861 -0.358429 0.099213 0.619110 -0.383301 0.102417 0.624573 -0.408203 0.105652 0.630096 -0.432953 0.108917 0.635559 -0.457733 0.112366 0.641174 -0.482880 0.115845 0.646851 -0.508667 0.119354 0.652466 -0.535126 0.123077 0.658264 -0.562134 0.126862 0.664093 -0.589355 0.130615 0.669769 -0.616821 0.134583 0.675629 -0.644196 0.138489 0.681396 -0.671539 0.142609 0.687317 -0.698486 0.146790 0.693268 -0.725037 0.150940 0.699036 -0.751099 0.155273 0.704956 -0.776703 0.159637 0.710938 -0.060577 0.077057 0.555969 -0.074432 0.079224 0.560150 -0.089233 0.081482 0.564575 -0.105316 0.083832 0.569092 -0.122589 0.086243 0.573639 -0.141113 0.088745 0.578339 -0.160706 0.091400 0.583130 -0.181122 0.094025 0.587952 -0.202576 0.096832 0.592957 -0.224701 0.099731 0.598083 -0.247437 0.102631 0.603058 -0.270844 0.105713 0.608368 -0.294586 0.108826 0.613525 -0.318878 0.112061 0.618958 -0.343506 0.115448 0.624451 -0.368164 0.118805 0.629822 -0.393158 0.122375 0.635406 -0.418152 0.126007 0.641083 -0.442963 0.129639 0.646606 -0.467865 0.133392 0.652344 -0.493439 0.137299 0.658112 -0.519501 0.141205 0.663788 -0.546295 0.145233 0.669647 -0.573364 0.149261 0.675354 -0.600861 0.153503 0.681244 -0.628479 0.157776 0.687164 -0.655792 0.162048 0.692963 -0.683014 0.166473 0.698883 -0.709930 0.170990 0.704803 -0.736237 0.175476 0.710602 -0.762207 0.180054 0.716583 -0.787598 0.184753 0.722565 -0.065063 0.093079 0.564453 -0.079254 0.095520 0.568878 -0.094543 0.098145 0.573486 -0.111176 0.100891 0.578186 -0.128967 0.103607 0.582886 -0.148010 0.106537 0.587830 -0.167999 0.109528 0.592834 -0.188904 0.112549 0.597778 -0.210693 0.115723 0.602966 -0.233124 0.118927 0.608093 -0.256256 0.122284 0.613403 -0.279968 0.125763 0.618835 -0.303986 0.129181 0.624115 -0.328522 0.132843 0.629669 -0.353302 0.136566 0.635254 -0.378174 0.140289 0.640747 -0.403229 0.144196 0.646484 -0.428284 0.148193 0.652191 -0.453125 0.152191 0.657806 -0.478271 0.156311 0.663635 -0.504181 0.160553 0.669464 -0.530640 0.164734 0.675232 -0.557678 0.169128 0.681091 -0.584930 0.173492 0.686859 -0.612518 0.178009 0.692780 -0.640106 0.182587 0.698730 -0.667450 0.187134 0.704590 -0.694611 0.191864 0.710480 -0.721344 0.196655 0.716431 -0.747498 0.201385 0.722229 -0.773224 0.206268 0.728180 -0.798401 0.211212 0.734131 -0.069794 0.110962 0.573395 -0.084381 0.113770 0.577972 -0.100220 0.116760 0.582794 -0.117371 0.119843 0.587708 -0.135712 0.122925 0.592590 -0.155182 0.126221 0.597656 -0.175720 0.129608 0.602814 -0.197021 0.132965 0.607971 -0.219177 0.136505 0.613281 -0.241943 0.140076 0.618591 -0.265411 0.143799 0.624023 -0.289368 0.147614 0.629517 -0.313660 0.151428 0.634979 -0.338348 0.155396 0.640594 -0.363373 0.159485 0.646301 -0.388306 0.163544 0.651886 -0.413483 0.167755 0.657684 -0.438599 0.172089 0.663483 -0.463501 0.176361 0.669189 -0.488983 0.180817 0.675079 -0.515137 0.185242 0.680786 -0.541962 0.189880 0.686676 -0.569244 0.194550 0.692627 -0.596649 0.199158 0.698456 -0.624298 0.204010 0.704437 -0.651947 0.208832 0.710358 -0.679169 0.213654 0.716156 -0.706146 0.218628 0.722107 -0.732758 0.223663 0.728027 -0.758728 0.228638 0.733826 -0.784241 0.233734 0.739746 -0.808960 0.238770 0.745544 -0.074829 0.130707 0.582642 -0.089874 0.133850 0.587463 -0.106293 0.137207 0.592468 -0.124023 0.140656 0.597534 -0.142822 0.144073 0.602570 -0.162811 0.147705 0.607849 -0.183807 0.151428 0.613159 -0.205444 0.155151 0.618439 -0.227997 0.159027 0.623871 -0.251068 0.162903 0.629272 -0.274841 0.166992 0.634796 -0.299042 0.171112 0.640472 -0.323578 0.175262 0.646027 -0.348511 0.179535 0.651764 -0.373596 0.183960 0.657532 -0.398651 0.188324 0.663177 -0.423889 0.192871 0.669067 -0.449036 0.197479 0.674927 -0.474121 0.201996 0.680664 -0.500000 0.206818 0.686554 -0.526428 0.211456 0.692352 -0.553497 0.216370 0.698303 -0.580994 0.221313 0.704254 -0.608459 0.226196 0.710052 -0.636169 0.231201 0.715973 -0.663788 0.236328 0.721924 -0.690887 0.241333 0.727753 -0.717743 0.246521 0.733673 -0.744171 0.251770 0.739594 -0.769867 0.256927 0.745331 -0.795105 0.262177 0.751251 -0.819550 0.267426 0.756958 -0.080170 0.152191 0.592316 -0.095734 0.155640 0.597260 -0.112732 0.159363 0.602448 -0.131012 0.163147 0.607697 -0.150330 0.166901 0.612915 -0.170746 0.170868 0.618286 -0.192017 0.174774 0.623596 -0.214203 0.178925 0.629120 -0.237091 0.183167 0.634674 -0.260468 0.187317 0.640167 -0.284546 0.191681 0.645874 -0.309021 0.196198 0.651581 -0.333740 0.200562 0.657257 -0.358765 0.205170 0.663025 -0.384033 0.209869 0.668915 -0.409149 0.214478 0.674622 -0.434448 0.219330 0.680511 -0.459442 0.224060 0.686279 -0.484955 0.229004 0.692230 -0.511230 0.234009 0.698151 -0.537933 0.238922 0.703949 -0.565247 0.244049 0.709900 -0.592834 0.249207 0.715851 -0.620422 0.254272 0.721649 -0.648132 0.259552 0.727570 -0.675598 0.264832 0.733521 -0.702545 0.270020 0.739319 -0.729279 0.275360 0.745178 -0.755280 0.280670 0.750946 -0.780884 0.286072 0.756805 -0.805908 0.291504 0.762604 -0.829987 0.296906 0.768280 -0.085846 0.175262 0.602325 -0.101959 0.179077 0.607452 -0.119507 0.183044 0.612762 -0.138336 0.187164 0.618134 -0.158112 0.191254 0.623444 -0.179016 0.195496 0.628967 -0.200684 0.199768 0.634430 -0.223267 0.204163 0.640045 -0.246521 0.208649 0.645721 -0.270233 0.213165 0.651306 -0.294525 0.217773 0.657074 -0.319214 0.222534 0.662903 -0.344086 0.227203 0.668610 -0.369324 0.232086 0.674469 -0.394592 0.237000 0.680328 -0.419800 0.241852 0.686127 -0.445068 0.246918 0.692047 -0.470215 0.251923 0.697845 -0.496094 0.257050 0.703827 -0.522644 0.262238 0.709778 -0.549652 0.267426 0.715546 -0.577087 0.272736 0.721497 -0.604797 0.278046 0.727448 -0.632416 0.283295 0.733246 -0.660065 0.288727 0.739166 -0.687439 0.294189 0.745056 -0.714233 0.299530 0.750793 -0.740723 0.305054 0.756653 -0.766510 0.310425 0.762299 -0.791870 0.315918 0.768127 -0.816528 0.321533 0.773895 -0.840271 0.326965 0.779480 -0.091827 0.199799 0.612640 -0.108551 0.203888 0.617859 -0.126648 0.208191 0.623352 -0.145905 0.212494 0.628723 -0.166290 0.217010 0.634277 -0.187653 0.221497 0.639893 -0.209686 0.225983 0.645447 -0.232635 0.230713 0.651184 -0.256195 0.235504 0.656921 -0.280151 0.240204 0.662567 -0.304657 0.245117 0.668488 -0.329590 0.250092 0.674347 -0.354645 0.254974 0.680054 -0.379974 0.260071 0.686005 -0.405182 0.265106 0.691742 -0.430573 0.270294 0.697723 -0.455841 0.275543 0.703644 -0.481171 0.280731 0.709503 -0.507416 0.286072 0.715393 -0.534302 0.291473 0.721344 -0.561432 0.296753 0.727173 -0.589081 0.302216 0.733093 -0.616852 0.307739 0.738983 -0.644470 0.313110 0.744751 -0.671997 0.318665 0.750641 -0.699005 0.324097 0.756348 -0.725830 0.329681 0.762177 -0.752106 0.335266 0.768005 -0.777618 0.340698 0.773621 -0.802643 0.346344 0.779327 -0.826965 0.352020 0.785004 -0.850372 0.357452 0.790497 -0.098145 0.225647 0.623169 -0.115509 0.230042 0.628571 -0.134186 0.234619 0.634155 -0.153900 0.239166 0.639587 -0.174774 0.243866 0.645294 -0.196533 0.248688 0.651031 -0.218994 0.253418 0.656677 -0.242249 0.258392 0.662445 -0.266083 0.263367 0.668304 -0.290344 0.268341 0.674042 -0.315094 0.273438 0.679932 -0.340179 0.278625 0.685822 -0.365326 0.283752 0.691589 -0.390747 0.289001 0.697571 -0.416046 0.294250 0.703369 -0.441345 0.299622 0.709320 -0.466675 0.305054 0.715240 -0.492401 0.310364 0.721039 -0.518921 0.315826 0.727020 -0.546021 0.321350 0.732971 -0.573395 0.326782 0.738708 -0.601074 0.332397 0.744598 -0.628906 0.337952 0.750488 -0.656494 0.343506 0.756226 -0.683899 0.349091 0.762024 -0.710724 0.354584 0.767731 -0.737274 0.360260 0.773468 -0.763306 0.365906 0.779205 -0.788544 0.371429 0.784729 -0.813293 0.377075 0.790375 -0.837219 0.382721 0.795990 -0.860229 0.388184 0.801392 -0.104797 0.252533 0.633850 -0.122803 0.257324 0.639465 -0.141998 0.262115 0.645142 -0.162262 0.266907 0.650757 -0.183563 0.271881 0.656555 -0.205688 0.276886 0.662292 -0.228546 0.281860 0.668030 -0.252106 0.287018 0.673889 -0.276245 0.292236 0.679779 -0.300720 0.297363 0.685516 -0.325653 0.302643 0.691467 -0.350769 0.307892 0.697235 -0.376190 0.313293 0.703247 -0.401642 0.318756 0.709167 -0.426941 0.324097 0.714966 -0.452240 0.329590 0.720917 -0.477753 0.335175 0.726837 -0.503784 0.340576 0.732635 -0.530640 0.346222 0.738556 -0.557953 0.351837 0.744446 -0.585388 0.357330 0.750183 -0.613220 0.362976 0.756073 -0.640991 0.368652 0.761871 -0.668396 0.374176 0.767578 -0.695679 0.379883 0.773346 -0.722351 0.385437 0.778931 -0.748657 0.391083 0.784576 -0.774445 0.396729 0.790222 -0.799347 0.402252 0.795715 -0.823761 0.407898 0.801270 -0.847321 0.413483 0.806732 -0.869904 0.418976 0.812042 -0.111877 0.280609 0.644897 -0.130463 0.285553 0.650665 -0.150208 0.290619 0.656403 -0.170898 0.295624 0.662079 -0.192657 0.300781 0.667847 -0.215179 0.305969 0.673737 -0.238342 0.311127 0.679443 -0.262207 0.316467 0.685394 -0.286621 0.321808 0.691254 -0.311279 0.327118 0.697083 -0.336395 0.332581 0.703064 -0.361603 0.337921 0.708862 -0.387085 0.343506 0.714783 -0.412628 0.349060 0.720734 -0.437866 0.354462 0.726562 -0.463196 0.360107 0.732483 -0.489014 0.365784 0.738403 -0.515350 0.371277 0.744202 -0.542450 0.376923 0.750061 -0.569916 0.382599 0.755951 -0.597443 0.388153 0.761627 -0.625336 0.393829 0.767395 -0.652863 0.399445 0.773071 -0.680298 0.405090 0.778778 -0.707367 0.410767 0.784454 -0.733795 0.416290 0.789948 -0.759827 0.421967 0.795563 -0.785309 0.427582 0.801117 -0.809937 0.433075 0.806458 -0.833984 0.438629 0.811920 -0.857147 0.444275 0.817261 -0.879364 0.449799 0.822479 -0.119324 0.309540 0.656097 -0.138428 0.314667 0.661926 -0.158691 0.319916 0.667725 -0.179871 0.325073 0.673401 -0.201965 0.330383 0.679321 -0.224884 0.335754 0.685242 -0.248383 0.341034 0.690979 -0.272491 0.346527 0.696960 -0.296997 0.351929 0.702759 -0.321991 0.357422 0.708710 -0.347260 0.363007 0.714661 -0.372589 0.368469 0.720428 -0.398102 0.374115 0.726410 -0.423615 0.379761 0.732361 -0.448853 0.385254 0.738129 -0.474274 0.390930 0.744019 -0.500427 0.396606 0.749908 -0.527069 0.402191 0.755615 -0.554352 0.407867 0.761475 -0.581970 0.413544 0.767242 -0.609589 0.419067 0.772888 -0.637360 0.424774 0.778625 -0.664856 0.430328 0.784149 -0.692078 0.435974 0.789825 -0.718933 0.441650 0.795410 -0.745117 0.447205 0.800842 -0.770905 0.453003 0.806305 -0.796021 0.458710 0.811737 -0.820312 0.464355 0.817017 -0.843964 0.470184 0.822388 -0.866730 0.475983 0.827606 -0.888489 0.481598 0.832703 -0.127106 0.339142 0.667450 -0.146759 0.344452 0.673279 -0.167480 0.349854 0.679169 -0.189056 0.355103 0.684937 -0.211548 0.360565 0.690857 -0.234833 0.366119 0.696808 -0.258575 0.371460 0.702606 -0.283020 0.377045 0.708557 -0.307678 0.382477 0.714355 -0.332886 0.388092 0.720306 -0.358246 0.393738 0.726257 -0.383636 0.399292 0.732056 -0.409149 0.404938 0.738007 -0.434631 0.410645 0.743835 -0.459839 0.416168 0.749634 -0.485535 0.421844 0.755493 -0.512024 0.427551 0.761353 -0.538879 0.433105 0.766937 -0.566284 0.438812 0.772766 -0.593872 0.444366 0.778351 -0.621643 0.450195 0.784058 -0.649353 0.455963 0.789673 -0.676697 0.461700 0.795166 -0.703766 0.467529 0.800720 -0.730316 0.473419 0.806183 -0.756287 0.479218 0.811523 -0.781769 0.485138 0.816895 -0.806519 0.491028 0.822205 -0.830444 0.496857 0.827362 -0.853760 0.502716 0.832581 -0.875977 0.508514 0.837555 -0.897339 0.514435 0.842590 -0.135162 0.369293 0.678894 -0.155304 0.374725 0.684814 -0.176514 0.380219 0.690704 -0.198486 0.385590 0.696472 -0.221405 0.391174 0.702484 -0.244843 0.396545 0.708282 -0.269012 0.402191 0.714264 -0.293640 0.407806 0.720184 -0.318512 0.413300 0.725922 -0.343781 0.418945 0.731903 -0.369293 0.424622 0.737854 -0.394684 0.430145 0.743622 -0.420288 0.435883 0.749451 -0.445679 0.441559 0.755310 -0.470886 0.447174 0.760986 -0.497009 0.453033 0.766815 -0.523743 0.458862 0.772614 -0.550751 0.464600 0.778168 -0.578278 0.470520 0.783936 -0.605865 0.476410 0.789368 -0.633667 0.482361 0.794983 -0.661255 0.488373 0.800568 -0.688385 0.494263 0.805908 -0.715271 0.500305 0.811401 -0.741547 0.506287 0.816772 -0.767212 0.512177 0.821960 -0.792358 0.518219 0.827209 -0.816833 0.524231 0.832397 -0.840393 0.530151 0.837433 -0.863190 0.536072 0.842468 -0.885040 0.541962 0.847351 -0.905914 0.547852 0.852264 -0.143585 0.399750 0.690399 -0.164185 0.405273 0.696350 -0.185852 0.410828 0.702271 -0.208221 0.416260 0.708130 -0.231476 0.421875 0.714081 -0.255219 0.427338 0.719910 -0.279572 0.432983 0.725800 -0.304382 0.438660 0.731781 -0.329437 0.444244 0.737518 -0.354889 0.450012 0.743439 -0.380371 0.455872 0.749329 -0.405792 0.461548 0.755035 -0.431335 0.467499 0.760864 -0.456665 0.473511 0.766693 -0.482178 0.479340 0.772308 -0.508514 0.485352 0.778046 -0.535278 0.491302 0.783600 -0.562653 0.497375 0.789246 -0.590271 0.503479 0.794861 -0.617950 0.509430 0.800262 -0.645569 0.515564 0.805756 -0.673035 0.521698 0.811249 -0.699951 0.527710 0.816498 -0.726532 0.533844 0.821808 -0.752625 0.539948 0.827087 -0.777954 0.545929 0.832184 -0.802734 0.552002 0.837280 -0.826691 0.557922 0.842163 -0.850037 0.563934 0.847229 -0.872375 0.569946 0.852112 -0.893738 0.575775 0.856812 -0.914154 0.581696 0.861572 -0.152252 0.430389 0.701996 -0.173340 0.435944 0.707947 -0.195404 0.441589 0.713959 -0.218109 0.447144 0.719727 -0.241669 0.452942 0.725647 -0.265717 0.458618 0.731445 -0.290283 0.464478 0.737366 -0.315277 0.470398 0.743286 -0.340454 0.476257 0.749023 -0.365906 0.482300 0.754883 -0.391510 0.488342 0.760712 -0.416962 0.494324 0.766388 -0.442383 0.500427 0.772156 -0.467712 0.506561 0.777924 -0.493530 0.512573 0.783478 -0.520142 0.518799 0.789093 -0.547272 0.525024 0.794708 -0.574585 0.531097 0.800140 -0.602264 0.537292 0.805603 -0.629852 0.543365 0.810974 -0.657410 0.549591 0.816376 -0.684631 0.555786 0.821655 -0.711304 0.561798 0.826813 -0.737701 0.567963 0.832062 -0.763397 0.574158 0.837158 -0.788422 0.580078 0.842072 -0.812897 0.586151 0.847076 -0.836578 0.592224 0.851990 -0.859283 0.598022 0.856659 -0.881287 0.604004 0.861450 -0.902130 0.609741 0.865997 -0.922058 0.615601 0.870636 -0.161163 0.461609 0.713623 -0.182739 0.467468 0.719604 -0.205170 0.473389 0.725464 -0.228241 0.479218 0.731323 -0.252075 0.485229 0.737244 -0.276306 0.491150 0.742981 -0.301086 0.497253 0.748840 -0.326263 0.503418 0.754761 -0.351532 0.509430 0.760437 -0.377045 0.515594 0.766266 -0.402649 0.521851 0.772003 -0.427979 0.527985 0.777618 -0.453369 0.534241 0.783325 -0.478882 0.540527 0.788971 -0.504974 0.546661 0.794434 -0.531799 0.553009 0.799988 -0.558929 0.559113 0.805389 -0.586456 0.565399 0.810852 -0.614136 0.571625 0.816254 -0.641602 0.577728 0.821411 -0.669037 0.583984 0.826691 -0.696014 0.590210 0.831909 -0.722473 0.596191 0.836945 -0.748505 0.602356 0.841949 -0.773987 0.608429 0.846954 -0.798676 0.614349 0.851776 -0.822723 0.620361 0.856567 -0.845917 0.626129 0.861206 -0.868347 0.632080 0.865906 -0.889862 0.637878 0.870514 -0.910248 0.643494 0.874908 -0.929688 0.649139 0.879303 -0.170349 0.494232 0.725220 -0.192352 0.500305 0.731171 -0.214996 0.506256 0.736938 -0.238525 0.512451 0.742859 -0.262573 0.518646 0.748718 -0.287048 0.524780 0.754456 -0.312012 0.531067 0.760315 -0.337280 0.537323 0.766113 -0.362610 0.543488 0.771729 -0.388184 0.549866 0.777466 -0.413696 0.556183 0.783203 -0.439026 0.562347 0.788696 -0.464325 0.568726 0.794312 -0.489990 0.574921 0.799744 -0.516479 0.581268 0.805237 -0.543427 0.587555 0.810669 -0.570709 0.593719 0.815979 -0.598267 0.599976 0.821320 -0.625916 0.606262 0.826569 -0.653259 0.612335 0.831635 -0.680481 0.618530 0.836823 -0.707214 0.624634 0.841827 -0.733398 0.630585 0.846741 -0.759186 0.636597 0.851624 -0.784302 0.642609 0.856476 -0.808624 0.648376 0.861115 -0.832306 0.654266 0.865784 -0.855072 0.659882 0.870239 -0.877075 0.665588 0.874786 -0.898132 0.671265 0.879181 -0.917999 0.676636 0.883362 -0.936890 0.682098 0.887665 -0.179779 0.527802 0.736786 -0.202148 0.534058 0.742737 -0.225098 0.540222 0.748444 -0.248901 0.546570 0.754303 -0.273224 0.552917 0.760162 -0.297821 0.559113 0.765839 -0.322968 0.565521 0.771576 -0.348328 0.571960 0.777344 -0.373688 0.578156 0.782928 -0.399231 0.584534 0.788513 -0.424744 0.590912 0.794159 -0.449982 0.597168 0.799591 -0.475342 0.603546 0.805115 -0.501282 0.609711 0.810394 -0.527954 0.616028 0.815826 -0.555115 0.622314 0.821198 -0.582397 0.628387 0.826294 -0.609955 0.634644 0.831482 -0.637512 0.640747 0.836670 -0.664703 0.646729 0.841583 -0.691681 0.652802 0.846558 -0.718231 0.658783 0.851501 -0.744110 0.664612 0.856262 -0.769531 0.670441 0.860992 -0.794159 0.676086 0.865540 -0.818237 0.681793 0.870148 -0.841553 0.687500 0.874664 -0.863922 0.692932 0.879028 -0.885468 0.698395 0.883301 -0.906036 0.703796 0.887543 -0.925446 0.708984 0.891602 -0.943787 0.714264 0.895660 -0.189362 0.562225 0.748322 -0.212128 0.568573 0.754181 -0.235382 0.574860 0.759857 -0.259430 0.581299 0.765717 -0.283936 0.587738 0.771454 -0.308746 0.593964 0.777069 -0.333954 0.600433 0.782745 -0.359406 0.606842 0.788391 -0.384766 0.613068 0.793884 -0.410248 0.619476 0.799438 -0.435608 0.625671 0.804840 -0.460815 0.632019 0.810272 -0.486481 0.638306 0.815674 -0.512604 0.644409 0.820892 -0.539490 0.650574 0.826172 -0.566711 0.656799 0.831390 -0.594025 0.662750 0.836395 -0.621552 0.668823 0.841461 -0.648956 0.674866 0.846436 -0.675964 0.680603 0.851257 -0.702698 0.686493 0.856110 -0.728943 0.692291 0.860840 -0.754517 0.697876 0.865417 -0.779572 0.703552 0.870056 -0.803894 0.708984 0.874420 -0.827606 0.714478 0.878906 -0.850494 0.719910 0.883179 -0.872406 0.725098 0.887329 -0.893494 0.730347 0.891510 -0.913574 0.735474 0.895538 -0.932465 0.740448 0.899445 -0.950317 0.745422 0.903290 -0.199188 0.597107 0.759735 -0.222198 0.603577 0.765533 -0.245789 0.609833 0.771118 -0.270020 0.616272 0.776917 -0.294708 0.622711 0.782623 -0.319672 0.628967 0.788116 -0.344940 0.635284 0.793762 -0.370422 0.641754 0.799316 -0.395813 0.647919 0.804718 -0.421204 0.654144 0.810150 -0.446381 0.660278 0.815430 -0.471680 0.666534 0.820770 -0.497559 0.672668 0.825989 -0.523956 0.678650 0.831116 -0.550873 0.684662 0.836273 -0.578186 0.690704 0.841339 -0.605530 0.696472 0.846222 -0.632935 0.702393 0.851135 -0.660217 0.708160 0.855988 -0.686951 0.713715 0.860626 -0.713440 0.719391 0.865295 -0.739258 0.724854 0.869812 -0.764618 0.730316 0.874329 -0.789368 0.735718 0.878815 -0.813324 0.740997 0.882965 -0.836639 0.746216 0.887207 -0.859070 0.751404 0.891357 -0.880524 0.756317 0.895325 -0.901215 0.761322 0.899353 -0.920776 0.766144 0.903198 -0.939178 0.770844 0.906921 -0.956543 0.775513 0.910583 -0.209045 0.632141 0.770996 -0.232391 0.638550 0.776764 -0.256226 0.644775 0.782349 -0.280670 0.651184 0.787994 -0.305511 0.657501 0.793579 -0.330566 0.663666 0.799011 -0.355927 0.669952 0.804596 -0.381226 0.676025 0.809875 -0.406708 0.682251 0.815247 -0.432068 0.688324 0.820679 -0.457153 0.694336 0.825775 -0.482574 0.700348 0.830994 -0.508698 0.706360 0.836151 -0.535187 0.712158 0.841095 -0.562286 0.717987 0.846069 -0.589569 0.723785 0.851074 -0.616852 0.729370 0.855774 -0.644165 0.735016 0.860504 -0.671204 0.740570 0.865234 -0.697723 0.745941 0.869690 -0.723907 0.751404 0.874207 -0.749390 0.756592 0.878540 -0.774475 0.761780 0.882843 -0.798859 0.766968 0.887115 -0.822418 0.771881 0.891174 -0.845276 0.776886 0.895264 -0.867340 0.781769 0.899261 -0.888397 0.786407 0.903046 -0.908539 0.791168 0.906799 -0.927673 0.795715 0.910492 -0.945557 0.800110 0.913971 -0.962341 0.804443 0.917480 -0.219147 0.666870 0.782196 -0.242767 0.673218 0.787842 -0.266754 0.679352 0.793304 -0.291351 0.685577 0.798889 -0.316345 0.691772 0.804413 -0.341431 0.697815 0.809753 -0.366821 0.703918 0.815125 -0.392120 0.709869 0.820404 -0.417511 0.715881 0.825653 -0.442749 0.721863 0.830841 -0.467743 0.727570 0.835876 -0.493469 0.733429 0.840973 -0.519775 0.739197 0.845947 -0.546417 0.744751 0.850769 -0.573517 0.750427 0.855621 -0.600800 0.755920 0.860413 -0.627960 0.761353 0.864990 -0.655121 0.766724 0.869568 -0.681793 0.771851 0.873993 -0.708160 0.777130 0.878448 -0.734039 0.782288 0.882751 -0.759247 0.787231 0.886932 -0.783936 0.792175 0.891083 -0.807983 0.797058 0.895142 -0.831116 0.801727 0.899048 -0.853607 0.806427 0.902924 -0.875244 0.811005 0.906738 -0.895844 0.815369 0.910309 -0.915497 0.819763 0.913879 -0.934052 0.823944 0.917297 -0.951538 0.828094 0.920685 -0.967804 0.832184 0.923981 -0.229340 0.701050 0.793152 -0.253113 0.707214 0.798798 -0.277313 0.713226 0.804169 -0.302063 0.719330 0.809631 -0.326996 0.725220 0.814911 -0.352295 0.731171 0.820221 -0.377655 0.737091 0.825531 -0.402893 0.742828 0.830597 -0.428131 0.748657 0.835754 -0.453308 0.754425 0.840881 -0.478394 0.759918 0.845734 -0.504303 0.765533 0.850647 -0.530792 0.771057 0.855499 -0.557495 0.776367 0.860199 -0.584625 0.781769 0.864868 -0.611694 0.786926 0.869354 -0.638855 0.792145 0.873932 -0.665833 0.797272 0.878326 -0.692230 0.802216 0.882568 -0.718292 0.807159 0.886810 -0.743896 0.812042 0.890991 -0.768707 0.816681 0.894928 -0.793091 0.821350 0.898926 -0.816772 0.825897 0.902832 -0.839539 0.830322 0.906494 -0.861542 0.834656 0.910187 -0.882721 0.838928 0.913788 -0.902924 0.843018 0.917206 -0.922058 0.847046 0.920593 -0.940155 0.850922 0.923828 -0.957123 0.854797 0.927002 -0.972839 0.858551 0.930115 -0.239532 0.734467 0.804016 -0.263550 0.740479 0.809448 -0.287903 0.746307 0.814789 -0.312744 0.752167 0.820099 -0.337738 0.757874 0.825256 -0.363037 0.763641 0.830475 -0.388336 0.769348 0.835632 -0.413513 0.774811 0.840576 -0.438721 0.780396 0.845612 -0.463684 0.785889 0.850555 -0.489014 0.791229 0.855286 -0.515106 0.796570 0.860077 -0.541626 0.801788 0.864746 -0.568420 0.806885 0.869232 -0.595520 0.811981 0.873779 -0.622498 0.816895 0.878082 -0.649506 0.821808 0.882477 -0.676178 0.826660 0.886688 -0.702332 0.831299 0.890747 -0.728149 0.835907 0.894836 -0.753418 0.840485 0.898865 -0.777924 0.844849 0.902618 -0.801880 0.849182 0.906403 -0.825134 0.853424 0.910095 -0.847473 0.857483 0.913605 -0.869110 0.861511 0.917145 -0.889801 0.865387 0.920441 -0.909546 0.869232 0.923737 -0.928284 0.872955 0.926910 -0.945831 0.876495 0.929962 -0.962341 0.880005 0.932953 -0.977570 0.883423 0.935822 -0.249725 0.766998 0.814606 -0.273956 0.772797 0.819977 -0.298431 0.778381 0.825104 -0.323364 0.784058 0.830353 -0.348389 0.789520 0.835358 -0.373627 0.795074 0.840454 -0.398926 0.800537 0.845459 -0.423981 0.805725 0.850281 -0.449036 0.811066 0.855133 -0.474091 0.816284 0.859955 -0.499573 0.821320 0.864502 -0.525818 0.826385 0.869141 -0.552277 0.831268 0.873535 -0.579193 0.836090 0.877991 -0.606201 0.840942 0.882355 -0.633057 0.845490 0.886505 -0.659882 0.850128 0.890656 -0.686279 0.854645 0.894745 -0.712128 0.858948 0.898651 -0.737640 0.863312 0.902557 -0.762543 0.867554 0.906311 -0.786713 0.871552 0.909943 -0.810303 0.875580 0.913544 -0.833160 0.879547 0.917023 -0.855133 0.883240 0.920349 -0.876343 0.886963 0.923676 -0.896576 0.890503 0.926758 -0.915894 0.893982 0.929840 -0.934174 0.897400 0.932892 -0.951233 0.900574 0.935669 -0.967194 0.903717 0.938477 -0.981964 0.906799 0.941223 -0.259979 0.798492 0.824982 -0.284241 0.803894 0.830048 -0.308929 0.809387 0.835236 -0.333923 0.814819 0.840363 -0.358917 0.819977 0.845215 -0.384155 0.825256 0.850159 -0.409332 0.830444 0.855011 -0.434296 0.835449 0.859711 -0.459198 0.840424 0.864380 -0.484344 0.845367 0.869019 -0.510010 0.850098 0.873444 -0.536285 0.854858 0.877899 -0.562836 0.859375 0.882141 -0.589691 0.863953 0.886383 -0.616638 0.868469 0.890564 -0.643341 0.872711 0.894562 -0.669891 0.877014 0.898529 -0.696075 0.881226 0.902435 -0.721619 0.885193 0.906128 -0.746765 0.889221 0.909851 -0.771301 0.893066 0.913452 -0.795105 0.896759 0.916870 -0.818329 0.900452 0.920288 -0.840759 0.903931 0.923523 -0.862366 0.907410 0.926697 -0.883148 0.910828 0.929779 -0.902954 0.913971 0.932739 -0.921814 0.917145 0.935638 -0.939606 0.920227 0.938446 -0.956207 0.923035 0.941071 -0.971710 0.925903 0.943665 -0.985962 0.928589 0.946167 -0.270233 0.828766 0.835114 -0.294556 0.833984 0.840088 -0.319336 0.839142 0.845123 -0.344360 0.844269 0.850067 -0.369385 0.849182 0.854797 -0.394470 0.854126 0.859589 -0.419586 0.859009 0.864288 -0.444366 0.863678 0.868744 -0.469177 0.868378 0.873291 -0.494537 0.873016 0.877808 -0.520355 0.877411 0.882019 -0.546722 0.881866 0.886322 -0.573242 0.886078 0.890381 -0.599976 0.890320 0.894440 -0.626770 0.894440 0.898438 -0.653290 0.898376 0.902252 -0.679596 0.902344 0.906036 -0.705444 0.906189 0.909760 -0.730713 0.909821 0.913269 -0.755493 0.913483 0.916779 -0.779724 0.916992 0.920197 -0.803131 0.920380 0.923401 -0.826050 0.923706 0.926605 -0.847992 0.926880 0.929657 -0.869171 0.929962 0.932617 -0.889557 0.932983 0.935577 -0.908936 0.935822 0.938293 -0.927307 0.938629 0.940979 -0.944672 0.941345 0.943604 -0.960846 0.943878 0.946075 -0.975861 0.946350 0.948425 -0.989624 0.948730 0.950714 -0.280426 0.857819 0.844971 -0.304810 0.862640 0.849792 -0.329620 0.867523 0.854645 -0.354675 0.872345 0.859467 -0.379639 0.876923 0.864075 -0.404633 0.881561 0.868652 -0.429596 0.886078 0.873199 -0.454224 0.890503 0.877563 -0.479095 0.894836 0.881927 -0.504486 0.898987 0.886108 -0.530487 0.903168 0.890228 -0.556854 0.907257 0.894348 -0.583344 0.911102 0.898224 -0.610046 0.914978 0.902130 -0.636688 0.918823 0.905975 -0.662903 0.922424 0.909546 -0.688934 0.925995 0.913177 -0.714478 0.929504 0.916687 -0.739441 0.932800 0.920013 -0.763885 0.936066 0.923309 -0.787628 0.939178 0.926453 -0.810852 0.942230 0.929565 -0.833252 0.945190 0.932556 -0.854828 0.947968 0.935425 -0.875641 0.950806 0.938263 -0.895599 0.953430 0.940948 -0.914459 0.955933 0.943451 -0.932434 0.958405 0.945984 -0.949310 0.960754 0.948364 -0.965057 0.962952 0.950592 -0.979645 0.965118 0.952789 -0.992950 0.967133 0.954834 -0.290497 0.885254 0.854523 -0.315002 0.889832 0.859222 -0.339844 0.894348 0.863922 -0.364777 0.898834 0.868530 -0.389679 0.903107 0.872986 -0.414551 0.907379 0.877441 -0.439362 0.911591 0.881805 -0.463867 0.915588 0.885986 -0.488892 0.919586 0.890137 -0.514343 0.923431 0.894165 -0.540436 0.927216 0.898163 -0.566772 0.930939 0.902039 -0.593170 0.934448 0.905762 -0.619751 0.937988 0.909454 -0.646179 0.941406 0.913086 -0.672180 0.944641 0.916534 -0.697876 0.947845 0.919922 -0.723145 0.950989 0.923248 -0.747711 0.953949 0.926392 -0.771820 0.956848 0.929504 -0.795227 0.959595 0.932404 -0.818054 0.962280 0.935364 -0.840057 0.964935 0.938202 -0.861267 0.967346 0.940796 -0.881683 0.969757 0.943390 -0.901184 0.972076 0.945923 -0.919678 0.974243 0.948273 -0.937195 0.976349 0.950531 -0.953644 0.978363 0.952728 -0.968933 0.980255 0.954773 -0.983124 0.982056 0.956787 -0.995941 0.983704 0.958649 -0.300476 0.911102 0.863831 -0.324982 0.915344 0.868286 -0.349854 0.919525 0.872894 -0.374756 0.923676 0.877350 -0.399506 0.927582 0.881622 -0.424316 0.931519 0.885895 -0.448822 0.935211 0.889954 -0.473358 0.938965 0.894043 -0.498505 0.942596 0.898041 -0.524017 0.946075 0.901855 -0.550140 0.949524 0.905670 -0.576447 0.952820 0.909363 -0.602753 0.956024 0.912933 -0.629089 0.959137 0.916412 -0.655304 0.962158 0.919861 -0.681030 0.965057 0.923096 -0.706482 0.967865 0.926300 -0.731384 0.970612 0.929413 -0.755646 0.973206 0.932373 -0.779358 0.975769 0.935303 -0.802460 0.978088 0.938049 -0.824860 0.980469 0.940735 -0.846466 0.982697 0.943329 -0.867249 0.984833 0.945801 -0.887299 0.986847 0.948181 -0.906372 0.988831 0.950500 -0.924438 0.990631 0.952637 -0.941528 0.992432 0.954742 -0.957520 0.994110 0.956696 -0.972443 0.995667 0.958649 -0.986176 0.997162 0.960388 -0.998627 0.998566 0.962067 -0.053040 0.049774 0.563202 -0.066498 0.051514 0.567139 -0.080536 0.053345 0.571167 -0.095612 0.055176 0.575195 -0.112030 0.057129 0.579498 -0.129669 0.059113 0.583893 -0.148285 0.061127 0.588257 -0.168030 0.063263 0.592865 -0.188690 0.065460 0.597565 -0.210144 0.067688 0.602173 -0.232269 0.070007 0.607117 -0.255005 0.072388 0.611938 -0.278351 0.074860 0.617004 -0.302155 0.077423 0.622131 -0.326263 0.079987 0.627197 -0.350769 0.082703 0.632477 -0.375488 0.085510 0.637878 -0.400208 0.088318 0.643127 -0.425018 0.091309 0.648560 -0.449768 0.094360 0.654114 -0.474457 0.097443 0.659576 -0.500122 0.100708 0.665161 -0.526215 0.103943 0.670685 -0.553040 0.107361 0.676392 -0.580170 0.110901 0.682129 -0.607391 0.114410 0.687775 -0.634888 0.118103 0.693573 -0.662231 0.121887 0.699371 -0.689148 0.125641 0.705017 -0.715912 0.129608 0.710907 -0.742157 0.133575 0.716766 -0.767822 0.137573 0.722473 -0.057098 0.063232 0.570953 -0.070770 0.065186 0.575134 -0.085236 0.067230 0.579407 -0.100800 0.069275 0.583649 -0.117706 0.071442 0.588165 -0.135834 0.073700 0.592773 -0.154938 0.075958 0.597290 -0.175171 0.078369 0.602081 -0.196136 0.080780 0.606842 -0.217957 0.083344 0.611847 -0.240509 0.085968 0.616852 -0.263550 0.088654 0.621857 -0.287201 0.091492 0.627045 -0.311310 0.094391 0.632385 -0.335602 0.097321 0.637573 -0.360291 0.100372 0.642975 -0.385193 0.103577 0.648438 -0.409943 0.106812 0.653870 -0.434845 0.110168 0.659424 -0.459717 0.113617 0.665009 -0.484711 0.117096 0.670532 -0.510742 0.120758 0.676270 -0.537140 0.124390 0.681824 -0.564178 0.128204 0.687653 -0.591522 0.132080 0.693451 -0.618896 0.135986 0.699097 -0.646423 0.140045 0.704895 -0.673737 0.144165 0.710724 -0.700562 0.148254 0.716461 -0.727173 0.152557 0.722351 -0.753296 0.156891 0.728180 -0.778717 0.161224 0.733978 -0.061371 0.077820 0.579193 -0.075317 0.080048 0.583557 -0.090240 0.082367 0.588104 -0.106354 0.084686 0.592499 -0.123779 0.087158 0.597168 -0.142395 0.089722 0.601959 -0.161987 0.092316 0.606720 -0.182617 0.095032 0.611694 -0.204010 0.097839 0.616608 -0.226227 0.100769 0.621735 -0.249115 0.103790 0.626923 -0.272430 0.106842 0.632141 -0.296356 0.110046 0.637451 -0.320679 0.113342 0.642822 -0.345215 0.116669 0.648163 -0.370087 0.120148 0.653687 -0.395081 0.123718 0.659302 -0.419952 0.127289 0.664734 -0.444855 0.131042 0.670410 -0.469727 0.134766 0.675995 -0.495300 0.138702 0.681702 -0.521606 0.142700 0.687439 -0.548309 0.146698 0.693176 -0.575562 0.150879 0.698914 -0.603119 0.155090 0.704742 -0.630524 0.159302 0.710449 -0.658051 0.163727 0.716339 -0.685272 0.168152 0.722198 -0.711975 0.172546 0.727875 -0.738373 0.177124 0.733765 -0.764191 0.181671 0.739471 -0.789520 0.186432 0.745331 -0.065887 0.093933 0.587830 -0.080200 0.096497 0.592407 -0.095642 0.099152 0.597076 -0.112244 0.101868 0.601715 -0.130219 0.104706 0.606598 -0.149261 0.107574 0.611450 -0.169373 0.110596 0.616486 -0.190430 0.113708 0.621582 -0.212219 0.116852 0.626709 -0.234802 0.120148 0.631958 -0.257996 0.123566 0.637299 -0.281616 0.126984 0.642578 -0.305786 0.130554 0.648010 -0.330383 0.134216 0.653534 -0.355103 0.137939 0.658997 -0.380096 0.141754 0.664612 -0.405151 0.145691 0.670258 -0.430115 0.149628 0.675812 -0.455109 0.153748 0.681580 -0.480194 0.157776 0.687164 -0.506165 0.162048 0.692963 -0.532776 0.166382 0.698822 -0.559723 0.170715 0.704498 -0.587158 0.175171 0.710327 -0.614777 0.179749 0.716156 -0.642273 0.184204 0.721863 -0.669708 0.188934 0.727753 -0.696808 0.193695 0.733643 -0.723419 0.198364 0.739349 -0.749664 0.203217 0.745178 -0.775238 0.208008 0.750916 -0.800323 0.212982 0.756775 -0.070679 0.111908 0.596802 -0.085449 0.114868 0.601654 -0.101349 0.117889 0.606476 -0.118561 0.120972 0.611298 -0.137054 0.124146 0.616333 -0.156555 0.127411 0.621338 -0.177155 0.130798 0.626556 -0.198639 0.134247 0.631805 -0.220764 0.137787 0.637024 -0.243713 0.141449 0.642426 -0.267212 0.145172 0.647888 -0.291107 0.148926 0.653259 -0.315552 0.152893 0.658813 -0.340302 0.156891 0.664459 -0.365173 0.160919 0.669983 -0.390259 0.165100 0.675690 -0.415375 0.169281 0.681274 -0.440460 0.173615 0.687042 -0.465485 0.178070 0.692810 -0.490936 0.182434 0.698486 -0.517303 0.186981 0.704376 -0.544159 0.191620 0.710175 -0.571350 0.196228 0.715881 -0.598938 0.200958 0.721741 -0.626617 0.205780 0.727600 -0.654053 0.210571 0.733307 -0.681396 0.215515 0.739197 -0.708252 0.220367 0.744873 -0.734833 0.225433 0.750763 -0.760895 0.230530 0.756622 -0.786194 0.235535 0.762238 -0.811035 0.240723 0.768036 -0.075806 0.131836 0.606262 -0.091003 0.135101 0.611176 -0.107422 0.138428 0.616089 -0.125244 0.141846 0.621216 -0.144226 0.145447 0.626465 -0.164185 0.148987 0.631561 -0.185242 0.152740 0.636902 -0.207092 0.156616 0.642303 -0.229614 0.160400 0.647644 -0.252899 0.164398 0.653137 -0.276672 0.168549 0.658722 -0.300842 0.172577 0.664154 -0.325531 0.176880 0.669861 -0.350311 0.181061 0.675415 -0.375458 0.185516 0.681091 -0.400665 0.189972 0.686890 -0.425781 0.194458 0.692535 -0.450867 0.199066 0.698334 -0.476166 0.203827 0.704193 -0.502014 0.208466 0.709869 -0.528595 0.213318 0.715698 -0.555786 0.218201 0.721588 -0.583069 0.223053 0.727325 -0.610779 0.228088 0.733185 -0.638489 0.233154 0.739044 -0.665924 0.238129 0.744751 -0.693176 0.243256 0.750610 -0.719849 0.248352 0.756287 -0.746185 0.253601 0.762115 -0.772003 0.258911 0.767914 -0.797028 0.264069 0.773529 -0.821533 0.269409 0.779236 -0.081177 0.153412 0.615997 -0.096893 0.157074 0.621094 -0.113953 0.160675 0.626129 -0.132263 0.164459 0.631409 -0.151764 0.168396 0.636749 -0.172241 0.172272 0.642029 -0.193665 0.176361 0.647491 -0.215942 0.180481 0.652985 -0.238770 0.184631 0.658447 -0.262360 0.188965 0.664062 -0.286469 0.193359 0.669708 -0.310822 0.197723 0.675262 -0.335724 0.202301 0.680969 -0.360687 0.206848 0.686584 -0.385925 0.211487 0.692383 -0.411224 0.216309 0.698181 -0.436279 0.221008 0.703888 -0.461487 0.225891 0.709778 -0.487061 0.230865 0.715576 -0.513245 0.235748 0.721283 -0.540161 0.240845 0.727203 -0.567505 0.245941 0.733063 -0.594971 0.251007 0.738770 -0.622711 0.256226 0.744598 -0.650269 0.261353 0.750275 -0.677734 0.266693 0.756134 -0.704865 0.272034 0.761932 -0.731354 0.277283 0.767609 -0.757477 0.282684 0.773407 -0.783020 0.288116 0.779114 -0.807770 0.293457 0.784637 -0.831970 0.298920 0.790344 -0.086853 0.176575 0.626007 -0.103210 0.180542 0.631317 -0.120789 0.184509 0.636505 -0.139679 0.188660 0.641937 -0.159637 0.192871 0.647339 -0.180542 0.197021 0.652740 -0.202393 0.201385 0.658295 -0.225037 0.205841 0.663910 -0.248230 0.210327 0.669403 -0.272095 0.214874 0.675140 -0.296326 0.219452 0.680695 -0.321045 0.224213 0.686462 -0.346161 0.229034 0.692261 -0.371216 0.233795 0.697906 -0.396545 0.238770 0.703766 -0.421875 0.243774 0.709595 -0.447052 0.248718 0.715271 -0.472260 0.253815 0.721130 -0.498260 0.259033 0.727020 -0.524719 0.264130 0.732727 -0.551849 0.269379 0.738617 -0.579407 0.274689 0.744446 -0.606995 0.279938 0.750183 -0.634766 0.285309 0.756012 -0.662231 0.290619 0.761688 -0.689575 0.296082 0.767487 -0.716492 0.301575 0.773254 -0.742737 0.306976 0.778839 -0.768677 0.312469 0.784515 -0.793945 0.318024 0.790192 -0.818359 0.323486 0.795715 -0.842224 0.329041 0.801300 -0.092926 0.201263 0.636353 -0.109863 0.205505 0.641785 -0.128021 0.209747 0.647034 -0.147400 0.214172 0.652588 -0.167847 0.218658 0.658173 -0.189178 0.223114 0.663635 -0.211426 0.227783 0.669250 -0.234436 0.232513 0.674957 -0.257965 0.237183 0.680542 -0.282135 0.242035 0.686310 -0.306519 0.246826 0.691956 -0.331482 0.251831 0.697784 -0.356689 0.256897 0.703613 -0.381927 0.261902 0.709320 -0.407318 0.267029 0.715118 -0.432617 0.272278 0.721008 -0.457733 0.277405 0.726746 -0.483337 0.282745 0.732605 -0.509613 0.288086 0.738495 -0.536377 0.293335 0.744202 -0.563721 0.298828 0.750000 -0.591248 0.304138 0.755737 -0.619019 0.309662 0.761536 -0.646759 0.315155 0.767273 -0.674133 0.320587 0.772949 -0.701324 0.326172 0.778687 -0.728058 0.331757 0.784363 -0.754120 0.337219 0.789917 -0.779724 0.342865 0.795593 -0.804718 0.348450 0.801178 -0.828827 0.353943 0.806549 -0.852325 0.359589 0.812073 -0.099335 0.227203 0.646912 -0.116852 0.231750 0.652435 -0.135529 0.236237 0.657837 -0.155457 0.240936 0.663483 -0.176392 0.245667 0.669128 -0.198151 0.250366 0.674683 -0.220825 0.255310 0.680389 -0.244110 0.260254 0.686188 -0.267883 0.265137 0.691803 -0.292297 0.270233 0.697632 -0.316956 0.275238 0.703339 -0.342072 0.280457 0.709167 -0.367432 0.285736 0.714996 -0.392670 0.290863 0.720703 -0.418121 0.296234 0.726624 -0.443481 0.301636 0.732452 -0.468628 0.306946 0.738190 -0.494568 0.312408 0.744019 -0.521118 0.317902 0.749878 -0.548157 0.323334 0.755554 -0.575684 0.328918 0.761414 -0.603302 0.334381 0.766998 -0.631073 0.339966 0.772797 -0.658783 0.345551 0.778534 -0.686035 0.351044 0.784088 -0.712952 0.356689 0.789795 -0.739502 0.362396 0.795410 -0.765320 0.367920 0.800873 -0.790649 0.373535 0.806427 -0.815308 0.379211 0.811920 -0.839081 0.384674 0.817261 -0.862152 0.390259 0.822662 -0.106140 0.254333 0.657715 -0.124237 0.259125 0.663330 -0.143463 0.263824 0.668854 -0.163879 0.268768 0.674530 -0.185272 0.273743 0.680237 -0.207397 0.278656 0.685913 -0.230438 0.283783 0.691681 -0.253876 0.288818 0.697327 -0.278076 0.294067 0.703125 -0.302704 0.299316 0.709045 -0.327606 0.304535 0.714691 -0.352844 0.309906 0.720551 -0.378296 0.315308 0.726440 -0.403564 0.320648 0.732178 -0.429016 0.326141 0.738068 -0.454376 0.331665 0.743835 -0.479767 0.337097 0.749603 -0.506012 0.342743 0.755432 -0.532745 0.348145 0.761078 -0.560059 0.353821 0.766876 -0.587738 0.359497 0.772644 -0.615387 0.364960 0.778229 -0.643158 0.370605 0.783997 -0.670715 0.376343 0.789612 -0.697784 0.381836 0.795166 -0.724579 0.387512 0.800751 -0.750793 0.393188 0.806244 -0.776367 0.398682 0.811676 -0.801422 0.404388 0.817139 -0.825592 0.409882 0.822388 -0.849091 0.415466 0.827728 -0.871765 0.421021 0.833038 -0.113281 0.282471 0.668671 -0.131958 0.287476 0.674408 -0.151672 0.292419 0.679962 -0.172577 0.297516 0.685760 -0.194427 0.302704 0.691528 -0.216919 0.307831 0.697174 -0.240234 0.313110 0.703003 -0.264069 0.318298 0.708710 -0.288483 0.323730 0.714569 -0.313293 0.329163 0.720398 -0.338318 0.334503 0.726166 -0.363739 0.340027 0.732025 -0.389191 0.345551 0.737885 -0.414520 0.350952 0.743622 -0.440033 0.356598 0.749420 -0.465271 0.362213 0.755280 -0.490997 0.367737 0.760925 -0.517639 0.373413 0.766754 -0.544556 0.378937 0.772339 -0.572052 0.384644 0.778107 -0.599823 0.390259 0.783844 -0.627472 0.395844 0.789337 -0.655182 0.401581 0.794983 -0.682648 0.407227 0.800598 -0.709503 0.412750 0.806000 -0.735992 0.418427 0.811523 -0.762024 0.424042 0.816986 -0.787262 0.429565 0.822235 -0.811951 0.435150 0.827606 -0.835754 0.440643 0.832764 -0.858948 0.446259 0.837982 -0.881165 0.451904 0.843109 -0.120789 0.311432 0.679840 -0.140015 0.316620 0.685577 -0.160278 0.321747 0.691193 -0.181610 0.327057 0.697021 -0.203674 0.332275 0.702728 -0.226654 0.337677 0.708557 -0.250275 0.343140 0.714417 -0.274353 0.348419 0.720154 -0.299011 0.353973 0.725952 -0.324066 0.359558 0.731873 -0.349243 0.364960 0.737579 -0.374695 0.370544 0.743439 -0.400238 0.376190 0.749298 -0.425598 0.381744 0.754974 -0.450989 0.387390 0.760803 -0.476349 0.392914 0.766449 -0.502502 0.398621 0.772186 -0.529297 0.404297 0.777985 -0.556458 0.409882 0.783539 -0.584106 0.415527 0.789185 -0.611908 0.421234 0.794861 -0.639526 0.426758 0.800354 -0.667145 0.432434 0.805878 -0.694366 0.438110 0.811401 -0.721008 0.443665 0.816711 -0.747284 0.449371 0.822083 -0.772858 0.454956 0.827362 -0.797943 0.460724 0.832642 -0.822296 0.466553 0.837830 -0.845734 0.472168 0.842865 -0.868439 0.477966 0.847961 -0.890198 0.483795 0.852997 -0.128601 0.341095 0.691040 -0.148346 0.346497 0.696899 -0.169098 0.351746 0.702576 -0.190857 0.357147 0.708435 -0.213348 0.362488 0.714172 -0.236633 0.368011 0.719971 -0.260559 0.373566 0.725830 -0.284882 0.378998 0.731537 -0.309753 0.384613 0.737427 -0.334930 0.390228 0.743286 -0.360229 0.395721 0.748993 -0.385773 0.401398 0.754852 -0.411316 0.407104 0.760651 -0.436584 0.412598 0.766327 -0.461975 0.418274 0.772064 -0.487610 0.423828 0.777679 -0.514099 0.429565 0.783417 -0.541168 0.435242 0.789062 -0.568451 0.440796 0.794556 -0.596191 0.446564 0.800171 -0.623993 0.452362 0.805725 -0.651520 0.458038 0.811127 -0.678925 0.463867 0.816620 -0.705963 0.469757 0.821991 -0.732391 0.475525 0.827179 -0.758392 0.481384 0.832489 -0.783661 0.487183 0.837585 -0.808411 0.493103 0.842773 -0.832397 0.499054 0.847870 -0.855438 0.504822 0.852753 -0.877655 0.510742 0.857666 -0.898987 0.516602 0.862610 -0.136780 0.371277 0.702454 -0.156891 0.376617 0.708130 -0.178192 0.382111 0.713989 -0.200317 0.387634 0.719879 -0.223206 0.393097 0.725555 -0.246796 0.398682 0.731415 -0.271057 0.404297 0.737274 -0.295563 0.409790 0.743011 -0.320587 0.415405 0.748840 -0.345947 0.421051 0.754700 -0.371277 0.426666 0.760376 -0.396881 0.432281 0.766174 -0.422241 0.437866 0.771759 -0.447662 0.443542 0.777557 -0.473083 0.449371 0.783264 -0.499054 0.455017 0.788757 -0.525818 0.460938 0.794434 -0.553101 0.466858 0.800049 -0.580444 0.472656 0.805481 -0.608215 0.478607 0.810974 -0.635956 0.484589 0.816437 -0.663422 0.490479 0.821686 -0.690643 0.496490 0.827026 -0.717407 0.502502 0.832336 -0.743622 0.508453 0.837463 -0.769257 0.514435 0.842621 -0.794281 0.520294 0.847595 -0.818604 0.526337 0.852631 -0.842224 0.532349 0.857605 -0.864868 0.538208 0.862335 -0.886688 0.544128 0.867157 -0.907532 0.550079 0.871857 -0.145203 0.401825 0.713806 -0.165833 0.407227 0.719574 -0.187561 0.412750 0.725403 -0.210144 0.418396 0.731293 -0.233246 0.423828 0.737000 -0.257202 0.429474 0.742859 -0.281616 0.435120 0.748657 -0.306335 0.440674 0.754425 -0.331543 0.446411 0.760254 -0.356995 0.452209 0.766022 -0.382324 0.457916 0.771637 -0.407990 0.463776 0.777374 -0.433289 0.469574 0.782990 -0.458679 0.475586 0.788605 -0.484314 0.481567 0.794312 -0.510590 0.487457 0.799774 -0.537567 0.493530 0.805328 -0.564941 0.499664 0.810852 -0.592438 0.505646 0.816193 -0.620239 0.511749 0.821594 -0.647888 0.517853 0.826935 -0.675140 0.523895 0.832123 -0.702148 0.529999 0.837311 -0.728546 0.535980 0.842346 -0.754578 0.542084 0.847473 -0.779999 0.548218 0.852509 -0.804626 0.554138 0.857330 -0.828613 0.560211 0.862213 -0.851776 0.566162 0.867035 -0.874023 0.572052 0.871674 -0.895386 0.577972 0.876282 -0.915710 0.583893 0.880859 -0.153900 0.432495 0.725250 -0.175049 0.437958 0.731018 -0.197144 0.443604 0.736816 -0.220093 0.449341 0.742737 -0.243530 0.454926 0.748413 -0.267700 0.460815 0.754242 -0.292358 0.466736 0.760071 -0.317261 0.472534 0.765747 -0.342560 0.478485 0.771515 -0.368073 0.484497 0.777252 -0.393494 0.490479 0.782806 -0.419006 0.496552 0.788483 -0.444366 0.502533 0.794006 -0.469727 0.508759 0.799622 -0.495728 0.514923 0.805176 -0.522217 0.520935 0.810516 -0.549377 0.527161 0.816040 -0.576874 0.533417 0.821411 -0.604401 0.539429 0.826660 -0.632111 0.545685 0.831970 -0.659668 0.551941 0.837219 -0.686676 0.557953 0.842224 -0.713501 0.564087 0.847351 -0.739624 0.570160 0.852264 -0.765350 0.576233 0.857178 -0.790436 0.582367 0.862122 -0.814697 0.588257 0.866791 -0.838348 0.594238 0.871582 -0.861115 0.600281 0.876190 -0.882812 0.606049 0.880646 -0.903748 0.611908 0.885162 -0.923584 0.617767 0.889557 -0.162933 0.463837 0.736694 -0.184448 0.469543 0.742432 -0.206940 0.475433 0.748322 -0.230194 0.481476 0.754089 -0.253906 0.487305 0.759796 -0.278351 0.493439 0.765625 -0.303192 0.499542 0.771362 -0.328247 0.505554 0.776947 -0.353638 0.511749 0.782684 -0.379211 0.517975 0.788361 -0.404602 0.524048 0.793884 -0.430115 0.530304 0.799469 -0.455353 0.536438 0.804932 -0.480896 0.542694 0.810394 -0.507172 0.549011 0.815887 -0.533875 0.555145 0.821198 -0.561157 0.561432 0.826508 -0.588745 0.567719 0.831818 -0.616241 0.573792 0.836945 -0.643829 0.580078 0.842072 -0.671265 0.586304 0.847229 -0.698090 0.592377 0.852142 -0.724579 0.598480 0.857086 -0.750458 0.604462 0.861877 -0.775848 0.610565 0.866638 -0.800598 0.616638 0.871429 -0.824493 0.622467 0.875977 -0.847687 0.628357 0.880524 -0.870087 0.634216 0.885040 -0.891327 0.639862 0.889313 -0.911743 0.645599 0.893646 -0.931091 0.651245 0.897888 -0.172119 0.496429 0.748108 -0.194122 0.502380 0.753815 -0.216949 0.508575 0.759644 -0.240509 0.514740 0.765472 -0.264465 0.520813 0.771057 -0.289093 0.527100 0.776825 -0.314117 0.533386 0.782562 -0.339233 0.539520 0.788086 -0.364746 0.545868 0.793732 -0.390167 0.552063 0.799164 -0.415710 0.558441 0.804779 -0.441162 0.564819 0.810272 -0.466339 0.570923 0.815613 -0.492157 0.577301 0.821014 -0.518677 0.583649 0.826385 -0.545563 0.589752 0.831573 -0.572937 0.596069 0.836853 -0.600555 0.602356 0.841949 -0.627991 0.608429 0.846985 -0.655487 0.614655 0.852020 -0.682526 0.620636 0.856812 -0.709259 0.626770 0.861725 -0.735474 0.632874 0.866547 -0.761078 0.638702 0.871216 -0.786133 0.644653 0.875824 -0.810486 0.650543 0.880402 -0.834015 0.656281 0.884796 -0.856781 0.661987 0.889252 -0.878723 0.667694 0.893555 -0.899536 0.673187 0.897644 -0.919495 0.678680 0.901794 -0.938171 0.684021 0.905731 -0.181610 0.530182 0.759491 -0.203918 0.536285 0.765137 -0.227081 0.542572 0.770905 -0.250946 0.548920 0.776672 -0.275116 0.555145 0.782257 -0.299927 0.561523 0.787964 -0.325104 0.567932 0.793579 -0.350311 0.574158 0.799042 -0.375854 0.580536 0.804657 -0.401276 0.586792 0.809967 -0.426727 0.593140 0.815491 -0.452087 0.599579 0.820892 -0.477356 0.605774 0.826111 -0.503448 0.612061 0.831451 -0.530182 0.618378 0.836670 -0.557190 0.624512 0.841705 -0.584686 0.630737 0.846832 -0.612183 0.636932 0.851898 -0.639587 0.642883 0.856689 -0.666901 0.649048 0.861633 -0.693695 0.654907 0.866333 -0.720215 0.660889 0.871094 -0.746124 0.666809 0.875732 -0.771362 0.672455 0.880188 -0.796082 0.678314 0.884705 -0.820038 0.683990 0.889130 -0.843201 0.689423 0.893341 -0.865601 0.695007 0.897522 -0.887054 0.700470 0.901703 -0.907410 0.705719 0.905640 -0.926849 0.710968 0.909607 -0.945007 0.716034 0.913391 -0.191223 0.564575 0.770813 -0.213867 0.570831 0.776398 -0.237366 0.577271 0.782135 -0.261475 0.583710 0.787781 -0.285889 0.589966 0.793304 -0.310822 0.596405 0.798920 -0.335938 0.602661 0.804352 -0.361389 0.609100 0.809875 -0.386902 0.615479 0.815338 -0.412262 0.621704 0.820679 -0.437622 0.628021 0.825958 -0.462921 0.634369 0.831299 -0.488464 0.640503 0.836395 -0.514832 0.646729 0.841583 -0.541656 0.652954 0.846710 -0.568787 0.658966 0.851624 -0.596283 0.665009 0.856567 -0.623749 0.671082 0.861511 -0.651001 0.676910 0.866211 -0.678101 0.682831 0.870941 -0.704651 0.688507 0.875488 -0.730835 0.694336 0.880096 -0.756500 0.700012 0.884583 -0.781403 0.705505 0.888885 -0.805756 0.711060 0.893250 -0.829346 0.716522 0.897461 -0.852051 0.721771 0.901489 -0.874023 0.727112 0.905548 -0.894897 0.732178 0.909393 -0.914917 0.737244 0.913300 -0.933807 0.742340 0.917053 -0.951508 0.747131 0.920654 -0.201080 0.599518 0.781952 -0.224060 0.605804 0.787537 -0.247742 0.612274 0.793152 -0.272095 0.618683 0.798798 -0.296661 0.624939 0.804230 -0.321747 0.631317 0.809753 -0.346924 0.637573 0.815063 -0.372375 0.643921 0.820557 -0.397888 0.650208 0.825867 -0.423218 0.656403 0.831024 -0.448456 0.662628 0.836273 -0.473785 0.668823 0.841461 -0.499573 0.674774 0.846436 -0.526154 0.680878 0.851501 -0.553131 0.686951 0.856476 -0.580261 0.692780 0.861237 -0.607666 0.698669 0.866058 -0.634979 0.704437 0.870728 -0.662170 0.710175 0.875336 -0.689056 0.715881 0.879944 -0.715332 0.721344 0.884338 -0.741241 0.726959 0.888794 -0.766541 0.732391 0.893097 -0.791107 0.737701 0.897247 -0.815125 0.742920 0.901398 -0.838348 0.748138 0.905457 -0.860626 0.753174 0.909302 -0.882141 0.758209 0.913177 -0.902527 0.763000 0.916870 -0.922028 0.767914 0.920563 -0.940430 0.772644 0.924164 -0.957581 0.777130 0.927551 -0.210999 0.634521 0.793030 -0.234314 0.640747 0.798523 -0.258240 0.647156 0.804108 -0.282593 0.653412 0.809448 -0.307465 0.659698 0.814941 -0.332672 0.666077 0.820374 -0.357880 0.672150 0.825592 -0.383331 0.678406 0.830902 -0.408752 0.684540 0.836182 -0.433990 0.690521 0.841187 -0.459198 0.696564 0.846313 -0.484619 0.702667 0.851379 -0.510681 0.708435 0.856262 -0.537384 0.714355 0.861115 -0.564301 0.720032 0.865845 -0.591583 0.725800 0.870636 -0.619019 0.731476 0.875275 -0.646149 0.736969 0.879730 -0.673126 0.742554 0.884247 -0.699738 0.747986 0.888702 -0.725708 0.753235 0.892914 -0.751312 0.758514 0.897125 -0.776306 0.763763 0.901276 -0.800507 0.768768 0.905212 -0.824097 0.773834 0.909210 -0.846893 0.778717 0.913086 -0.868805 0.783417 0.916779 -0.889832 0.788239 0.920471 -0.909821 0.792755 0.923950 -0.928833 0.797302 0.927460 -0.946716 0.801727 0.930878 -0.963287 0.806000 0.934082 -0.221100 0.669220 0.803925 -0.244598 0.675415 0.809326 -0.268768 0.681641 0.814819 -0.293274 0.687744 0.820099 -0.318268 0.694000 0.825439 -0.343536 0.700073 0.830780 -0.368774 0.706055 0.835876 -0.394196 0.712128 0.841095 -0.419586 0.718079 0.846191 -0.444641 0.723907 0.851135 -0.469788 0.729767 0.856110 -0.495544 0.735596 0.860992 -0.521729 0.741241 0.865723 -0.548523 0.746887 0.870514 -0.575500 0.752350 0.875061 -0.602783 0.757904 0.879608 -0.630096 0.763306 0.884155 -0.657043 0.768616 0.888458 -0.683807 0.773895 0.892792 -0.710144 0.779053 0.897064 -0.735840 0.784058 0.901093 -0.761108 0.789093 0.905121 -0.785736 0.794037 0.909119 -0.809570 0.798737 0.912933 -0.832794 0.803497 0.916687 -0.855072 0.808044 0.920319 -0.876587 0.812561 0.923889 -0.897186 0.817047 0.927399 -0.916718 0.821259 0.930695 -0.935242 0.825531 0.934021 -0.952576 0.829620 0.937164 -0.968689 0.833527 0.940216 -0.231140 0.703247 0.814545 -0.255005 0.709412 0.819977 -0.279358 0.715515 0.825317 -0.304016 0.721405 0.830505 -0.329071 0.727448 0.835754 -0.354370 0.733429 0.840942 -0.379608 0.739166 0.845917 -0.404907 0.745056 0.851013 -0.430176 0.750824 0.855988 -0.455200 0.756378 0.860748 -0.480469 0.762054 0.865631 -0.506256 0.767456 0.870239 -0.532745 0.772980 0.874939 -0.559601 0.778412 0.879486 -0.586609 0.783661 0.883942 -0.613831 0.788910 0.888367 -0.640961 0.794098 0.892639 -0.667694 0.799072 0.896851 -0.694214 0.804077 0.901001 -0.720245 0.808990 0.905029 -0.745605 0.813721 0.908936 -0.770538 0.818451 0.912811 -0.794830 0.823090 0.916595 -0.818268 0.827545 0.920197 -0.841064 0.831940 0.923828 -0.862946 0.836151 0.927185 -0.884064 0.840393 0.930603 -0.904205 0.844574 0.933899 -0.923218 0.848450 0.937012 -0.941315 0.852386 0.940155 -0.958160 0.856171 0.943115 -0.973724 0.859772 0.945984 -0.241364 0.736603 0.825073 -0.265411 0.742615 0.830383 -0.289948 0.748535 0.835632 -0.314636 0.754211 0.840729 -0.339783 0.760040 0.845795 -0.365082 0.765778 0.850861 -0.390228 0.771332 0.855774 -0.415527 0.776947 0.860626 -0.440674 0.782501 0.865479 -0.465546 0.787781 0.870148 -0.491028 0.793213 0.874817 -0.517029 0.798401 0.879242 -0.543610 0.803650 0.883789 -0.570526 0.808838 0.888245 -0.597412 0.813751 0.892456 -0.624573 0.818756 0.896698 -0.651520 0.823639 0.900848 -0.678040 0.828308 0.904816 -0.704254 0.833008 0.908813 -0.730011 0.837616 0.912689 -0.755035 0.842041 0.916412 -0.779602 0.846436 0.920105 -0.803406 0.850677 0.923615 -0.826599 0.854889 0.927124 -0.849030 0.859009 0.930511 -0.870453 0.862915 0.933716 -0.891144 0.866791 0.936951 -0.910828 0.870636 0.940063 -0.929352 0.874237 0.942963 -0.946960 0.877838 0.945923 -0.963287 0.881317 0.948700 -0.978394 0.884613 0.951355 -0.251617 0.769043 0.835358 -0.275818 0.774811 0.840576 -0.300446 0.780518 0.845703 -0.325287 0.785980 0.850647 -0.350433 0.791565 0.855621 -0.375702 0.797089 0.860504 -0.400818 0.802368 0.865234 -0.425995 0.807739 0.869995 -0.450836 0.812897 0.874573 -0.475922 0.818115 0.879150 -0.501617 0.823181 0.883667 -0.527710 0.828125 0.887970 -0.554291 0.833038 0.892334 -0.581207 0.837952 0.896606 -0.608093 0.842560 0.900696 -0.635040 0.847290 0.904755 -0.661835 0.851807 0.908691 -0.688049 0.856201 0.912506 -0.714020 0.860596 0.916290 -0.739410 0.864899 0.920013 -0.764130 0.869019 0.923523 -0.788361 0.873077 0.927002 -0.811737 0.876984 0.930359 -0.834564 0.880859 0.933655 -0.856567 0.884674 0.936890 -0.877594 0.888214 0.939941 -0.897797 0.891785 0.942902 -0.917053 0.895294 0.945862 -0.935150 0.898529 0.948578 -0.952240 0.901764 0.951294 -0.968109 0.904907 0.953918 -0.982697 0.907867 0.956360 -0.261871 0.800476 0.845398 -0.286224 0.806000 0.850494 -0.310913 0.811432 0.855469 -0.335815 0.816681 0.860291 -0.360962 0.821991 0.865143 -0.386169 0.827179 0.869873 -0.411194 0.832214 0.874451 -0.436249 0.837311 0.879059 -0.460968 0.842133 0.883453 -0.486176 0.847046 0.887878 -0.511993 0.851868 0.892242 -0.538177 0.856506 0.896423 -0.564850 0.861145 0.900604 -0.591736 0.865662 0.904663 -0.618469 0.869995 0.908539 -0.645233 0.874298 0.912415 -0.671753 0.878601 0.916229 -0.697754 0.882629 0.919830 -0.723389 0.886688 0.923401 -0.748352 0.890594 0.926880 -0.772858 0.894409 0.930267 -0.796722 0.898163 0.933594 -0.819794 0.901703 0.936707 -0.842163 0.905304 0.939819 -0.863739 0.908691 0.942841 -0.884308 0.911926 0.945709 -0.904144 0.915192 0.948517 -0.922882 0.918243 0.951202 -0.940521 0.921234 0.953796 -0.957123 0.924103 0.956299 -0.972504 0.926880 0.958679 -0.986694 0.929535 0.960968 -0.272064 0.830658 0.855255 -0.296509 0.835876 0.860168 -0.321320 0.841064 0.864990 -0.346252 0.846039 0.869659 -0.371307 0.851074 0.874329 -0.396362 0.855865 0.878845 -0.421417 0.860687 0.883331 -0.446259 0.865448 0.887756 -0.470978 0.870026 0.892029 -0.496338 0.874603 0.896301 -0.522308 0.879059 0.900482 -0.548523 0.883331 0.904449 -0.575165 0.887665 0.908447 -0.601959 0.891876 0.912323 -0.628601 0.895844 0.916016 -0.655151 0.899902 0.919739 -0.681396 0.903778 0.923340 -0.707092 0.907501 0.926758 -0.732391 0.911194 0.930176 -0.757050 0.914734 0.933411 -0.781189 0.918213 0.936646 -0.804657 0.921631 0.939728 -0.827362 0.924866 0.942657 -0.849335 0.928009 0.945648 -0.870453 0.931091 0.948456 -0.890686 0.934052 0.951111 -0.910004 0.936890 0.953735 -0.928345 0.939667 0.956207 -0.945526 0.942230 0.958618 -0.961670 0.944794 0.960938 -0.976593 0.947205 0.963074 -0.990295 0.949554 0.965210 -0.282257 0.859558 0.864777 -0.306793 0.864410 0.869507 -0.331604 0.869293 0.874207 -0.356506 0.874023 0.878784 -0.381561 0.878662 0.883209 -0.406464 0.883148 0.887543 -0.431427 0.887665 0.891937 -0.456116 0.892120 0.896179 -0.480865 0.896332 0.900238 -0.506378 0.900574 0.904358 -0.532410 0.904724 0.908295 -0.558624 0.908661 0.912140 -0.585266 0.912567 0.915924 -0.611908 0.916504 0.919678 -0.638397 0.920105 0.923157 -0.664673 0.923798 0.926697 -0.690582 0.927216 0.930023 -0.716064 0.930695 0.933350 -0.741058 0.934052 0.936584 -0.765350 0.937164 0.939575 -0.789154 0.940308 0.942596 -0.812256 0.943390 0.945587 -0.834503 0.946228 0.948303 -0.856110 0.949036 0.951019 -0.876831 0.951782 0.953613 -0.896606 0.954346 0.956085 -0.915497 0.956848 0.958557 -0.933350 0.959229 0.960815 -0.950165 0.961548 0.963013 -0.965851 0.963745 0.965179 -0.980286 0.965820 0.967163 -0.993561 0.967834 0.969116 -0.292297 0.886902 0.873993 -0.316925 0.891541 0.878632 -0.341797 0.896027 0.883118 -0.366608 0.900330 0.887451 -0.391571 0.904724 0.891785 -0.416351 0.908905 0.895966 -0.441101 0.913055 0.900177 -0.465698 0.917114 0.904266 -0.490662 0.921021 0.908142 -0.516266 0.924866 0.912048 -0.542297 0.928650 0.915833 -0.568512 0.932220 0.919464 -0.595062 0.935822 0.923096 -0.621429 0.939209 0.926514 -0.647858 0.942596 0.929932 -0.673889 0.945862 0.933258 -0.699463 0.948975 0.936401 -0.724670 0.952057 0.939514 -0.749268 0.955078 0.942535 -0.773193 0.957855 0.945435 -0.796661 0.960632 0.948242 -0.819366 0.963257 0.950958 -0.841278 0.965759 0.953491 -0.862427 0.968292 0.956024 -0.882751 0.970642 0.958496 -0.902100 0.972839 0.960754 -0.920593 0.975037 0.962952 -0.937988 0.977081 0.965057 -0.954376 0.979004 0.967102 -0.969635 0.980896 0.969055 -0.983643 0.982666 0.970825 -0.996490 0.984375 0.972595 -0.302246 0.912598 0.882904 -0.326935 0.916901 0.887360 -0.351624 0.921021 0.891602 -0.376526 0.925079 0.895874 -0.401398 0.929077 0.900055 -0.426025 0.932861 0.904053 -0.450592 0.936646 0.908020 -0.475159 0.940308 0.911896 -0.500275 0.943848 0.915649 -0.525940 0.947357 0.919342 -0.551971 0.950775 0.923004 -0.578125 0.953979 0.926392 -0.604553 0.957184 0.929840 -0.630798 0.960175 0.933075 -0.656891 0.963196 0.936279 -0.682709 0.966095 0.939453 -0.707947 0.968842 0.942413 -0.732788 0.971558 0.945374 -0.757111 0.974152 0.948181 -0.780701 0.976562 0.950806 -0.803741 0.979004 0.953430 -0.826111 0.981323 0.955933 -0.847565 0.983459 0.958374 -0.868347 0.985596 0.960724 -0.888245 0.987549 0.962860 -0.907257 0.989471 0.965027 -0.925323 0.991333 0.967041 -0.942291 0.993042 0.968964 -0.958252 0.994690 0.970795 -0.973053 0.996246 0.972534 -0.986725 0.997650 0.974152 -0.999115 0.999054 0.975739 -0.053833 0.050415 0.586426 -0.067291 0.052185 0.590424 -0.081360 0.053986 0.594452 -0.096558 0.055878 0.598663 -0.113098 0.057861 0.602966 -0.130737 0.059814 0.607330 -0.149536 0.061920 0.611877 -0.169312 0.064056 0.616364 -0.190033 0.066254 0.621124 -0.211578 0.068573 0.625916 -0.233734 0.070862 0.630737 -0.256622 0.073303 0.635681 -0.280029 0.075806 0.640747 -0.303772 0.078339 0.645782 -0.328064 0.080994 0.650970 -0.352570 0.083771 0.656281 -0.377197 0.086517 0.661469 -0.402039 0.089447 0.666870 -0.426758 0.092377 0.672180 -0.451569 0.095459 0.677704 -0.476440 0.098663 0.683228 -0.501984 0.101868 0.688660 -0.528259 0.105194 0.694275 -0.555145 0.108673 0.699860 -0.582184 0.112122 0.705444 -0.609650 0.115784 0.711151 -0.637054 0.119507 0.716888 -0.664307 0.123199 0.722473 -0.691406 0.127136 0.728241 -0.717926 0.130981 0.733856 -0.744202 0.134979 0.739624 -0.769928 0.139130 0.745392 -0.057892 0.063965 0.594330 -0.071594 0.065948 0.598572 -0.086090 0.067963 0.602753 -0.101807 0.070068 0.607239 -0.118774 0.072235 0.611664 -0.136993 0.074524 0.616241 -0.156281 0.076843 0.620972 -0.176483 0.079224 0.625671 -0.197632 0.081726 0.630585 -0.219543 0.084320 0.635559 -0.242035 0.086914 0.640472 -0.265259 0.089691 0.645630 -0.288910 0.092560 0.650848 -0.312958 0.095398 0.656006 -0.337433 0.098450 0.661346 -0.362061 0.101501 0.666595 -0.386932 0.104736 0.672028 -0.411865 0.108063 0.677521 -0.436615 0.111359 0.682922 -0.461456 0.114868 0.688507 -0.486786 0.118439 0.694122 -0.512634 0.122009 0.699646 -0.539276 0.125793 0.705292 -0.566315 0.129669 0.710999 -0.593628 0.133453 0.716583 -0.621124 0.137482 0.722351 -0.648468 0.141449 0.727905 -0.675781 0.145630 0.733704 -0.702789 0.149872 0.739471 -0.729187 0.154053 0.745087 -0.755219 0.158478 0.750885 -0.780762 0.162872 0.756653 -0.062195 0.078644 0.602661 -0.076233 0.080902 0.607117 -0.091156 0.083160 0.611511 -0.107422 0.085602 0.616119 -0.124908 0.088043 0.620758 -0.143646 0.090668 0.625580 -0.163391 0.093353 0.630463 -0.183960 0.096008 0.635284 -0.205536 0.098907 0.640350 -0.227844 0.101868 0.645477 -0.250671 0.104858 0.650635 -0.274200 0.108002 0.655853 -0.298157 0.111237 0.661194 -0.322418 0.114532 0.666473 -0.347107 0.117950 0.671906 -0.371857 0.121368 0.677277 -0.396881 0.125000 0.682800 -0.421875 0.128662 0.688324 -0.446716 0.132385 0.693848 -0.471710 0.136230 0.699463 -0.497375 0.140198 0.705139 -0.523651 0.144073 0.710663 -0.550507 0.148224 0.716431 -0.577789 0.152466 0.722198 -0.605194 0.156647 0.727783 -0.632751 0.160980 0.733551 -0.660126 0.165253 0.739166 -0.687347 0.169739 0.744965 -0.714203 0.174286 0.750732 -0.740448 0.178772 0.756378 -0.766296 0.183441 0.762115 -0.791595 0.188232 0.767883 -0.066803 0.094910 0.611420 -0.081116 0.097412 0.615906 -0.096588 0.100128 0.620605 -0.113434 0.102905 0.625458 -0.131409 0.105713 0.630188 -0.150635 0.108673 0.635193 -0.170868 0.111755 0.640228 -0.191864 0.114777 0.645203 -0.213837 0.118073 0.650482 -0.236420 0.121429 0.655762 -0.259613 0.124786 0.660889 -0.283417 0.128296 0.666351 -0.307526 0.131866 0.671661 -0.332123 0.135529 0.677094 -0.356995 0.139313 0.682678 -0.381927 0.143158 0.688049 -0.407043 0.147095 0.693726 -0.432098 0.151154 0.699310 -0.456970 0.155182 0.704865 -0.482239 0.159393 0.710541 -0.508270 0.163696 0.716309 -0.534821 0.167938 0.721863 -0.561951 0.172333 0.727631 -0.589417 0.176880 0.733429 -0.616882 0.181366 0.739044 -0.644531 0.186005 0.744812 -0.671753 0.190613 0.750427 -0.698883 0.195374 0.756226 -0.725586 0.200165 0.761963 -0.751709 0.204956 0.767609 -0.777344 0.209900 0.773346 -0.802368 0.214844 0.779053 -0.071625 0.113068 0.620514 -0.086395 0.115906 0.625183 -0.102448 0.118988 0.630035 -0.119812 0.122162 0.635071 -0.138336 0.125336 0.640015 -0.157990 0.128632 0.645111 -0.178680 0.132080 0.650330 -0.200104 0.135498 0.655487 -0.222443 0.139130 0.660767 -0.245422 0.142822 0.666199 -0.268860 0.146545 0.671478 -0.292938 0.150421 0.676971 -0.317291 0.154297 0.682404 -0.342102 0.158356 0.687927 -0.367126 0.162506 0.693573 -0.392151 0.166595 0.699036 -0.417328 0.170898 0.704742 -0.442474 0.175262 0.710419 -0.467377 0.179596 0.715973 -0.493073 0.184113 0.721741 -0.519409 0.188721 0.727509 -0.546234 0.193268 0.733124 -0.573578 0.197968 0.738922 -0.601013 0.202637 0.744507 -0.628754 0.207489 0.750275 -0.656342 0.212402 0.756073 -0.683533 0.217255 0.761688 -0.710480 0.222260 0.767456 -0.737000 0.227325 0.773193 -0.762817 0.232330 0.778778 -0.788300 0.237457 0.784454 -0.813019 0.242645 0.790100 -0.076782 0.133057 0.629944 -0.092041 0.136292 0.634796 -0.108643 0.139679 0.639862 -0.126556 0.143188 0.645020 -0.145599 0.146729 0.650085 -0.165741 0.150421 0.655334 -0.186829 0.154144 0.660614 -0.208679 0.157959 0.665894 -0.231354 0.161896 0.671356 -0.254547 0.165833 0.676666 -0.278412 0.169952 0.682251 -0.302734 0.174194 0.687836 -0.327301 0.178375 0.693298 -0.352325 0.182739 0.698914 -0.377441 0.187164 0.704620 -0.402557 0.191589 0.710144 -0.427795 0.196228 0.715851 -0.452942 0.200867 0.721588 -0.478088 0.205475 0.727234 -0.504120 0.210297 0.733002 -0.530823 0.215149 0.738770 -0.557861 0.219940 0.744385 -0.585358 0.224945 0.750153 -0.612915 0.229828 0.755829 -0.640656 0.234924 0.761566 -0.668152 0.240021 0.767273 -0.695221 0.245117 0.772919 -0.722076 0.250305 0.778625 -0.748352 0.255585 0.784271 -0.774017 0.260773 0.789856 -0.799103 0.266052 0.795471 -0.823578 0.271423 0.801056 -0.082214 0.154816 0.639709 -0.097992 0.158356 0.644775 -0.115234 0.162109 0.649902 -0.133667 0.165924 0.655182 -0.153168 0.169769 0.660400 -0.173767 0.173767 0.665802 -0.195312 0.177887 0.671204 -0.217560 0.182007 0.676544 -0.240570 0.186249 0.682068 -0.264099 0.190521 0.687500 -0.288208 0.194946 0.693176 -0.312805 0.199432 0.698761 -0.337555 0.203888 0.704346 -0.362701 0.208557 0.709991 -0.387939 0.213318 0.715698 -0.413147 0.217957 0.721313 -0.438385 0.222839 0.727051 -0.463531 0.227753 0.732880 -0.489044 0.232635 0.738434 -0.515411 0.237671 0.744263 -0.542236 0.242615 0.749878 -0.569641 0.247772 0.755646 -0.597290 0.252960 0.761444 -0.624847 0.258087 0.766998 -0.652618 0.263336 0.772766 -0.680023 0.268677 0.778473 -0.706909 0.273895 0.784058 -0.733521 0.279327 0.789673 -0.759613 0.284729 0.795319 -0.785004 0.290039 0.800842 -0.809845 0.295502 0.806366 -0.833801 0.300873 0.811737 -0.088013 0.178101 0.649811 -0.104340 0.181976 0.654938 -0.122162 0.186066 0.660248 -0.141144 0.190186 0.665649 -0.161102 0.194366 0.670929 -0.182220 0.198669 0.676392 -0.204041 0.202972 0.681793 -0.226715 0.207458 0.687378 -0.250092 0.212006 0.692993 -0.273895 0.216492 0.698486 -0.298248 0.221222 0.704193 -0.323029 0.225983 0.709869 -0.347992 0.230713 0.715393 -0.373230 0.235657 0.721191 -0.398590 0.240601 0.726929 -0.423767 0.245514 0.732574 -0.449066 0.250671 0.738312 -0.474365 0.255768 0.744110 -0.500275 0.260834 0.749725 -0.526947 0.266083 0.755493 -0.553986 0.271271 0.761108 -0.581543 0.276581 0.766846 -0.609314 0.281952 0.772614 -0.636932 0.287262 0.778168 -0.664490 0.292694 0.783875 -0.691803 0.298157 0.789551 -0.718567 0.303497 0.795074 -0.744965 0.309021 0.800659 -0.770813 0.314545 0.806213 -0.795898 0.319977 0.811646 -0.820404 0.325562 0.817139 -0.844055 0.330963 0.822449 -0.094147 0.202850 0.660156 -0.111084 0.207031 0.665375 -0.129425 0.211395 0.670807 -0.148926 0.215851 0.676270 -0.169403 0.220245 0.681641 -0.190887 0.224884 0.687225 -0.213104 0.229370 0.692719 -0.236145 0.234131 0.698334 -0.259827 0.238983 0.704041 -0.283905 0.243744 0.709595 -0.308563 0.248688 0.715271 -0.333496 0.253723 0.721008 -0.358582 0.258698 0.726654 -0.383942 0.263794 0.732422 -0.409363 0.269012 0.738190 -0.434570 0.274109 0.743774 -0.459808 0.279388 0.749603 -0.485291 0.284576 0.755219 -0.511719 0.289978 0.760956 -0.538574 0.295410 0.766724 -0.565887 0.300751 0.772308 -0.593597 0.306183 0.778046 -0.621368 0.311676 0.783752 -0.648926 0.317108 0.789246 -0.676422 0.322723 0.794891 -0.703583 0.328247 0.800537 -0.730072 0.333771 0.805939 -0.756287 0.339325 0.811523 -0.781708 0.344818 0.816864 -0.806641 0.350403 0.822296 -0.830811 0.356049 0.827698 -0.854065 0.361542 0.832947 -0.100616 0.228912 0.670624 -0.118164 0.233337 0.676025 -0.137054 0.237976 0.681549 -0.156982 0.242584 0.686951 -0.177979 0.247345 0.692566 -0.199890 0.252228 0.698181 -0.222504 0.257019 0.703766 -0.245880 0.261993 0.709442 -0.269867 0.267059 0.715118 -0.294159 0.272034 0.720703 -0.319000 0.277191 0.726501 -0.344147 0.282440 0.732239 -0.369354 0.287567 0.737915 -0.394775 0.292908 0.743683 -0.420105 0.298126 0.749298 -0.445374 0.303528 0.755035 -0.470795 0.308960 0.760834 -0.496613 0.314331 0.766449 -0.523285 0.319855 0.772156 -0.550446 0.325409 0.777924 -0.577881 0.330841 0.783447 -0.605591 0.336426 0.789124 -0.633423 0.342041 0.794800 -0.660889 0.347534 0.800232 -0.688263 0.353180 0.805786 -0.715240 0.358856 0.811371 -0.741516 0.364349 0.816711 -0.767456 0.369995 0.822144 -0.792572 0.375488 0.827454 -0.817169 0.381165 0.832794 -0.841003 0.386841 0.838074 -0.863892 0.392273 0.843170 -0.107483 0.256104 0.681396 -0.125610 0.260803 0.686829 -0.145020 0.265686 0.692413 -0.165405 0.270508 0.697906 -0.186890 0.275482 0.703613 -0.209229 0.280579 0.709320 -0.232147 0.285553 0.714844 -0.255859 0.290771 0.720551 -0.280060 0.296021 0.726379 -0.304596 0.301208 0.731964 -0.329620 0.306519 0.737793 -0.354950 0.311920 0.743530 -0.380219 0.317230 0.749146 -0.405701 0.322754 0.754913 -0.431000 0.328094 0.760559 -0.456299 0.333679 0.766296 -0.481903 0.339203 0.772034 -0.508087 0.344666 0.777618 -0.535004 0.350281 0.783325 -0.562378 0.355927 0.788971 -0.589874 0.361450 0.794464 -0.617737 0.367126 0.800110 -0.645447 0.372803 0.805664 -0.672852 0.378326 0.811096 -0.700073 0.384003 0.816620 -0.726624 0.389526 0.821899 -0.752869 0.395172 0.827301 -0.778473 0.400879 0.832672 -0.803314 0.406311 0.837830 -0.827576 0.411926 0.843048 -0.851013 0.417572 0.848267 -0.873474 0.423004 0.853241 -0.114624 0.284180 0.692108 -0.133362 0.289215 0.697784 -0.153320 0.294312 0.703491 -0.174194 0.299316 0.709045 -0.196075 0.304535 0.714752 -0.218750 0.309814 0.720428 -0.242035 0.314972 0.726013 -0.265991 0.320312 0.731842 -0.290497 0.325745 0.737579 -0.315247 0.331055 0.743225 -0.340454 0.336548 0.748993 -0.365662 0.341919 0.754669 -0.391205 0.347504 0.760406 -0.416718 0.353119 0.766174 -0.441956 0.358551 0.771729 -0.467255 0.364197 0.777466 -0.493256 0.369843 0.783203 -0.519714 0.375336 0.788696 -0.546875 0.381042 0.794342 -0.574371 0.386749 0.799957 -0.601959 0.392273 0.805420 -0.629822 0.397980 0.810944 -0.657501 0.403656 0.816467 -0.684723 0.409241 0.821747 -0.711700 0.414856 0.827179 -0.738037 0.420380 0.832367 -0.764008 0.426056 0.837646 -0.789307 0.431671 0.842926 -0.813812 0.437103 0.847961 -0.837677 0.442749 0.853058 -0.860748 0.448364 0.858154 -0.882751 0.453888 0.863068 -0.122162 0.313232 0.703156 -0.141510 0.318481 0.708893 -0.161926 0.323730 0.714569 -0.183197 0.328918 0.720184 -0.205536 0.334320 0.725891 -0.228577 0.339722 0.731689 -0.252136 0.345032 0.737305 -0.276398 0.350494 0.743103 -0.301056 0.356049 0.748840 -0.326019 0.361481 0.754517 -0.351318 0.367096 0.760284 -0.376678 0.372559 0.765869 -0.402222 0.378204 0.771606 -0.427673 0.383881 0.777313 -0.452942 0.389404 0.782898 -0.478455 0.395050 0.788513 -0.504761 0.400757 0.794189 -0.531433 0.406281 0.799683 -0.558777 0.411987 0.805267 -0.586456 0.417694 0.810791 -0.614105 0.423248 0.816193 -0.641846 0.428894 0.821655 -0.669250 0.434387 0.826904 -0.696442 0.440094 0.832245 -0.723206 0.445801 0.837555 -0.749298 0.451416 0.842651 -0.774963 0.457184 0.847870 -0.799957 0.462952 0.852966 -0.824097 0.468567 0.857910 -0.847595 0.474365 0.862915 -0.870270 0.480194 0.867828 -0.891815 0.485840 0.872528 -0.130066 0.343018 0.714325 -0.149933 0.348328 0.720001 -0.170807 0.353790 0.725739 -0.192566 0.359100 0.731384 -0.215210 0.364563 0.737183 -0.238617 0.370117 0.742950 -0.262451 0.375488 0.748535 -0.286957 0.381104 0.754364 -0.311829 0.386719 0.760132 -0.336914 0.392181 0.765747 -0.362366 0.397858 0.771454 -0.387695 0.403320 0.777069 -0.413269 0.409088 0.782745 -0.438782 0.414764 0.788391 -0.463928 0.420319 0.793915 -0.489807 0.425995 0.799561 -0.516357 0.431702 0.805115 -0.543274 0.437195 0.810516 -0.570740 0.442932 0.816040 -0.598511 0.448761 0.821472 -0.626129 0.454376 0.826782 -0.653809 0.460205 0.832153 -0.681030 0.465942 0.837311 -0.708038 0.471832 0.842529 -0.734558 0.477692 0.847748 -0.760406 0.483490 0.852722 -0.785736 0.489410 0.857758 -0.810364 0.495300 0.862793 -0.834198 0.501160 0.867584 -0.857300 0.507019 0.872437 -0.879456 0.512939 0.877167 -0.900574 0.518677 0.881775 -0.138245 0.373230 0.725464 -0.158600 0.378693 0.731262 -0.179993 0.384216 0.737000 -0.202087 0.389618 0.742645 -0.225098 0.395172 0.748413 -0.248810 0.400818 0.754211 -0.272919 0.406250 0.759827 -0.297607 0.411896 0.765625 -0.322571 0.417419 0.771179 -0.347900 0.423126 0.776917 -0.373413 0.428741 0.782623 -0.398834 0.434296 0.788177 -0.424347 0.439972 0.793793 -0.449768 0.445770 0.799377 -0.475098 0.451416 0.804871 -0.501251 0.457275 0.810364 -0.528046 0.463165 0.815887 -0.555206 0.468933 0.821228 -0.582794 0.474884 0.826630 -0.610382 0.480682 0.831879 -0.638123 0.486725 0.837158 -0.665710 0.492706 0.842407 -0.692719 0.498596 0.847473 -0.719452 0.504639 0.852631 -0.745728 0.510681 0.857635 -0.771240 0.516541 0.862549 -0.796234 0.522583 0.867462 -0.820587 0.528595 0.872253 -0.843964 0.534454 0.876953 -0.866608 0.540466 0.881683 -0.888275 0.546234 0.886169 -0.908997 0.552185 0.890686 -0.146759 0.403748 0.736725 -0.167572 0.409332 0.742493 -0.189362 0.414856 0.748322 -0.211884 0.420349 0.753876 -0.235260 0.425964 0.759705 -0.259186 0.431580 0.765472 -0.283569 0.437103 0.771027 -0.308472 0.442841 0.776794 -0.333496 0.448456 0.782349 -0.358948 0.454224 0.787994 -0.384521 0.460083 0.793640 -0.409912 0.465912 0.799103 -0.435455 0.471832 0.804718 -0.460815 0.477844 0.810242 -0.486359 0.483673 0.815613 -0.512817 0.489777 0.821106 -0.539856 0.495850 0.826477 -0.567139 0.501770 0.831726 -0.594788 0.507904 0.837036 -0.622375 0.513855 0.842102 -0.649994 0.520020 0.847351 -0.677368 0.526184 0.852478 -0.704193 0.532135 0.857422 -0.730713 0.538269 0.862396 -0.756653 0.544342 0.867310 -0.781891 0.550354 0.872040 -0.806519 0.556366 0.876862 -0.830475 0.562469 0.881531 -0.853485 0.568298 0.886078 -0.875732 0.574310 0.890594 -0.896912 0.580048 0.894928 -0.917175 0.585968 0.899353 -0.155548 0.434448 0.747986 -0.176849 0.440063 0.753723 -0.199036 0.445770 0.759521 -0.221893 0.451355 0.765137 -0.245514 0.457153 0.770874 -0.269775 0.463074 0.776611 -0.294281 0.468781 0.782196 -0.319366 0.474762 0.787842 -0.344543 0.480591 0.793335 -0.370087 0.486694 0.798981 -0.395660 0.492706 0.804596 -0.421051 0.498718 0.809937 -0.446472 0.504883 0.815491 -0.471863 0.511047 0.820953 -0.497772 0.517120 0.826202 -0.524414 0.523285 0.831604 -0.551636 0.529480 0.836945 -0.579010 0.535583 0.842010 -0.606689 0.541809 0.847229 -0.634247 0.547852 0.852234 -0.661743 0.554077 0.857239 -0.688934 0.560272 0.862274 -0.715485 0.566315 0.867096 -0.741730 0.572418 0.871918 -0.767365 0.578552 0.876740 -0.792267 0.584473 0.881317 -0.816620 0.590515 0.885956 -0.840149 0.596527 0.890472 -0.862732 0.602356 0.894836 -0.884521 0.608246 0.899261 -0.905212 0.614014 0.903412 -0.924957 0.619781 0.907654 -0.164551 0.465881 0.759247 -0.186310 0.471741 0.764984 -0.208832 0.477692 0.770782 -0.231995 0.483551 0.776337 -0.255981 0.489624 0.782013 -0.280273 0.495544 0.787598 -0.305145 0.501678 0.793213 -0.330383 0.507874 0.798859 -0.355682 0.513885 0.804291 -0.381165 0.520142 0.809845 -0.406769 0.526428 0.815369 -0.432098 0.532532 0.820679 -0.457458 0.538788 0.826080 -0.483063 0.545105 0.831451 -0.509247 0.551239 0.836639 -0.536072 0.557495 0.841888 -0.563416 0.563812 0.847076 -0.590881 0.569946 0.852112 -0.618500 0.576172 0.857117 -0.645996 0.582245 0.862030 -0.673309 0.588501 0.866974 -0.700256 0.594696 0.871796 -0.726562 0.600708 0.876495 -0.752502 0.606720 0.881226 -0.777863 0.612854 0.885864 -0.802429 0.618713 0.890228 -0.826355 0.624634 0.894745 -0.849518 0.630524 0.899139 -0.871643 0.636230 0.903290 -0.892975 0.642029 0.907532 -0.913177 0.647552 0.911560 -0.932404 0.653198 0.915558 -0.173828 0.498596 0.770508 -0.195984 0.504700 0.776184 -0.218872 0.510864 0.781891 -0.242340 0.516937 0.787445 -0.266541 0.523163 0.793091 -0.291046 0.529266 0.798584 -0.316040 0.535645 0.804169 -0.341400 0.541931 0.809723 -0.366730 0.548096 0.815063 -0.392303 0.554413 0.820587 -0.417816 0.560791 0.825928 -0.443115 0.566986 0.831177 -0.468414 0.573303 0.836517 -0.494324 0.579681 0.841736 -0.520782 0.585815 0.846832 -0.547791 0.592194 0.851959 -0.575073 0.598267 0.856873 -0.602661 0.604523 0.861908 -0.630249 0.610779 0.866821 -0.657532 0.616821 0.871613 -0.684662 0.622955 0.876343 -0.711334 0.629059 0.881104 -0.737427 0.634949 0.885590 -0.763031 0.640961 0.890137 -0.788055 0.646881 0.894653 -0.812256 0.652618 0.898895 -0.835785 0.658447 0.903198 -0.858429 0.664032 0.907318 -0.880219 0.669678 0.911469 -0.901123 0.675232 0.915466 -0.920776 0.680603 0.919281 -0.939545 0.686005 0.923157 -0.183350 0.532349 0.781616 -0.205811 0.538635 0.787262 -0.229065 0.544983 0.792938 -0.252777 0.551147 0.798431 -0.277191 0.557495 0.804047 -0.301880 0.563782 0.809418 -0.327057 0.570160 0.814972 -0.352448 0.576538 0.820435 -0.377808 0.582794 0.825684 -0.403351 0.589172 0.831055 -0.428802 0.595551 0.836365 -0.454010 0.601807 0.841492 -0.479492 0.608154 0.846710 -0.505493 0.614288 0.851715 -0.532227 0.620575 0.856720 -0.559418 0.626801 0.861786 -0.586761 0.632904 0.866577 -0.614288 0.639069 0.871490 -0.641815 0.645203 0.876221 -0.668915 0.651123 0.880829 -0.695831 0.657166 0.885468 -0.722229 0.663116 0.890045 -0.747986 0.668823 0.894409 -0.773315 0.674683 0.898804 -0.797974 0.680450 0.903107 -0.821777 0.685974 0.907227 -0.844910 0.691528 0.911346 -0.867096 0.696899 0.915253 -0.888489 0.702393 0.919189 -0.908905 0.707703 0.923065 -0.928131 0.712830 0.926727 -0.946289 0.717957 0.930389 -0.192993 0.566833 0.792603 -0.215851 0.573242 0.798309 -0.239227 0.579498 0.803741 -0.263336 0.585938 0.809296 -0.287964 0.592407 0.814819 -0.312775 0.598663 0.820129 -0.338043 0.605042 0.825562 -0.363525 0.611481 0.830902 -0.388855 0.617676 0.836121 -0.414307 0.624054 0.841370 -0.439758 0.630402 0.846558 -0.464813 0.636536 0.851624 -0.490631 0.642822 0.856628 -0.516815 0.648895 0.861542 -0.543701 0.655121 0.866486 -0.570984 0.661224 0.871368 -0.598297 0.667175 0.876007 -0.625793 0.673187 0.880737 -0.653198 0.679169 0.885376 -0.680115 0.684906 0.889832 -0.706696 0.690704 0.894287 -0.732880 0.696472 0.898682 -0.758301 0.701965 0.902893 -0.783264 0.707642 0.907135 -0.807495 0.712982 0.911133 -0.830994 0.718414 0.915131 -0.853760 0.723785 0.919098 -0.875519 0.728912 0.922882 -0.896423 0.734070 0.926636 -0.916290 0.739166 0.930298 -0.935028 0.744049 0.933777 -0.952667 0.748932 0.937256 -0.202850 0.601776 0.803589 -0.226044 0.608215 0.809143 -0.249664 0.614502 0.814545 -0.273987 0.620911 0.820007 -0.298737 0.627350 0.825378 -0.323700 0.633575 0.830658 -0.349030 0.639984 0.835999 -0.374481 0.646301 0.841217 -0.399841 0.652466 0.846283 -0.425262 0.658722 0.851471 -0.450531 0.664917 0.856537 -0.475708 0.670990 0.861389 -0.501709 0.677094 0.866364 -0.528137 0.683044 0.871124 -0.555176 0.689026 0.875885 -0.582489 0.695007 0.880615 -0.609711 0.700775 0.885162 -0.637085 0.706573 0.889740 -0.664307 0.712341 0.894196 -0.690979 0.717834 0.898438 -0.717346 0.723450 0.902802 -0.743164 0.728973 0.906982 -0.768341 0.734283 0.911041 -0.792969 0.739655 0.915070 -0.816772 0.744781 0.918915 -0.839874 0.749969 0.922791 -0.862213 0.755066 0.926544 -0.883514 0.759918 0.930115 -0.903961 0.764862 0.933685 -0.923370 0.769684 0.937164 -0.941589 0.774231 0.940460 -0.958710 0.778809 0.943756 -0.212830 0.636780 0.814362 -0.236267 0.643158 0.819855 -0.260132 0.649414 0.825134 -0.284668 0.655762 0.830505 -0.309570 0.662109 0.835846 -0.334564 0.668243 0.840973 -0.359955 0.674469 0.846191 -0.385468 0.680695 0.851318 -0.410736 0.686676 0.856323 -0.436066 0.692810 0.861267 -0.461090 0.698700 0.866119 -0.486664 0.704742 0.870972 -0.512817 0.710693 0.875763 -0.539368 0.716400 0.880371 -0.566467 0.722198 0.885040 -0.593811 0.727905 0.889618 -0.621002 0.733490 0.893982 -0.648254 0.739075 0.898346 -0.675232 0.744568 0.902649 -0.701630 0.749847 0.906799 -0.727722 0.755249 0.910919 -0.753113 0.760406 0.914886 -0.778015 0.765594 0.918793 -0.802277 0.770660 0.922668 -0.825714 0.775543 0.926361 -0.848450 0.780426 0.930023 -0.870300 0.785278 0.933594 -0.891174 0.789886 0.936981 -0.911163 0.794464 0.940369 -0.930084 0.798981 0.943665 -0.947815 0.803253 0.946808 -0.964386 0.807587 0.949860 -0.222900 0.671478 0.825012 -0.246582 0.677765 0.830383 -0.270691 0.683899 0.835571 -0.295380 0.690063 0.840881 -0.320343 0.696289 0.846039 -0.345490 0.702209 0.851105 -0.370880 0.708313 0.856140 -0.396271 0.714386 0.861145 -0.421478 0.720184 0.865967 -0.446686 0.726135 0.870880 -0.471710 0.731842 0.875549 -0.497467 0.737640 0.880249 -0.523895 0.743378 0.884918 -0.550568 0.748871 0.889374 -0.577698 0.754486 0.893860 -0.604919 0.759918 0.898224 -0.632080 0.765228 0.902435 -0.659119 0.770538 0.906708 -0.685822 0.775818 0.910858 -0.711975 0.780853 0.914795 -0.737762 0.785919 0.918701 -0.762787 0.790863 0.922485 -0.787415 0.795715 0.926270 -0.811279 0.800568 0.929962 -0.834320 0.805145 0.933441 -0.856628 0.809723 0.936920 -0.878052 0.814270 0.940308 -0.898468 0.818573 0.943512 -0.917969 0.822845 0.946686 -0.936432 0.827026 0.949799 -0.953644 0.831055 0.952728 -0.969727 0.835022 0.955658 -0.233093 0.705566 0.835449 -0.257019 0.711670 0.840759 -0.281250 0.717651 0.845764 -0.306061 0.723724 0.850952 -0.331116 0.729675 0.856018 -0.356293 0.735474 0.860931 -0.381653 0.741394 0.865875 -0.406891 0.747070 0.870667 -0.432098 0.752808 0.875366 -0.457184 0.758484 0.880157 -0.482361 0.763977 0.884705 -0.508331 0.769592 0.889282 -0.534851 0.775024 0.893768 -0.561554 0.780273 0.898010 -0.588684 0.785614 0.902344 -0.615906 0.790863 0.906586 -0.642853 0.795898 0.910614 -0.669708 0.800934 0.914673 -0.696136 0.805939 0.918610 -0.722046 0.810699 0.922394 -0.747467 0.815491 0.926178 -0.772186 0.820068 0.929749 -0.796387 0.824646 0.933350 -0.819885 0.829193 0.936829 -0.842529 0.833466 0.940155 -0.864441 0.837738 0.943420 -0.885437 0.841980 0.946625 -0.905426 0.845947 0.949646 -0.924438 0.849945 0.952667 -0.942322 0.853729 0.955505 -0.959137 0.857483 0.958344 -0.974670 0.861176 0.960999 -0.243317 0.738861 0.845673 -0.267426 0.744781 0.850800 -0.291840 0.750610 0.855804 -0.316711 0.756378 0.860779 -0.341858 0.762207 0.865753 -0.366974 0.767822 0.870514 -0.392334 0.773438 0.875305 -0.417450 0.778900 0.879913 -0.442566 0.784393 0.884583 -0.467590 0.789886 0.889160 -0.492920 0.795135 0.893555 -0.519073 0.800415 0.897949 -0.545624 0.805573 0.902252 -0.572449 0.810608 0.906342 -0.599518 0.815643 0.910522 -0.626617 0.820587 0.914581 -0.653412 0.825317 0.918457 -0.679993 0.830078 0.922302 -0.706024 0.834656 0.925964 -0.731659 0.839264 0.929657 -0.756805 0.843719 0.933258 -0.781219 0.847961 0.936676 -0.805054 0.852264 0.940063 -0.828156 0.856476 0.943359 -0.850372 0.860443 0.946442 -0.871857 0.864380 0.949585 -0.892426 0.868256 0.952637 -0.911926 0.871918 0.955414 -0.930481 0.875580 0.958252 -0.947906 0.879028 0.960876 -0.964203 0.882507 0.963501 -0.979248 0.885834 0.966003 -0.253571 0.771210 0.855652 -0.277802 0.776947 0.860626 -0.302338 0.782501 0.865479 -0.327301 0.788116 0.870361 -0.352356 0.793518 0.875092 -0.377625 0.799011 0.879791 -0.402802 0.804382 0.884460 -0.427826 0.809631 0.888916 -0.452789 0.814880 0.893433 -0.477875 0.820038 0.897797 -0.503448 0.825012 0.902008 -0.529694 0.829956 0.906281 -0.556335 0.834869 0.910400 -0.583099 0.839630 0.914398 -0.610107 0.844360 0.918335 -0.636932 0.848877 0.922089 -0.663635 0.853424 0.925873 -0.689941 0.857880 0.929565 -0.715668 0.862122 0.933075 -0.741089 0.866394 0.936615 -0.765839 0.870514 0.940002 -0.789886 0.874512 0.943176 -0.813354 0.878448 0.946381 -0.836060 0.882324 0.949493 -0.857880 0.885925 0.952454 -0.878937 0.889618 0.955353 -0.899017 0.893066 0.958160 -0.918121 0.896454 0.960815 -0.936218 0.899750 0.963440 -0.953156 0.902893 0.965912 -0.968933 0.905975 0.968353 -0.983490 0.908966 0.970673 -0.263794 0.802551 0.865356 -0.288177 0.808044 0.870239 -0.312805 0.813324 0.874969 -0.337799 0.818665 0.879669 -0.362854 0.823853 0.884247 -0.388000 0.829041 0.888824 -0.413177 0.834167 0.893341 -0.438080 0.839050 0.897583 -0.462921 0.843994 0.901917 -0.488129 0.848877 0.906158 -0.513855 0.853516 0.910187 -0.540222 0.858215 0.914276 -0.566833 0.862823 0.918243 -0.593597 0.867249 0.921997 -0.620483 0.871643 0.925781 -0.647064 0.875854 0.929413 -0.673553 0.880066 0.932983 -0.699585 0.884186 0.936493 -0.725067 0.888123 0.939789 -0.750092 0.892029 0.943085 -0.774536 0.895813 0.946320 -0.798157 0.899445 0.949371 -0.821259 0.903046 0.952393 -0.843567 0.906525 0.955292 -0.864960 0.909851 0.958038 -0.885559 0.913147 0.960754 -0.905182 0.916290 0.963287 -0.923889 0.919342 0.965851 -0.941528 0.922333 0.968292 -0.957977 0.925110 0.970520 -0.973328 0.927887 0.972778 -0.987396 0.930511 0.974915 -0.274048 0.832672 0.874847 -0.298401 0.837708 0.879456 -0.323181 0.842834 0.884094 -0.348175 0.847900 0.888702 -0.373199 0.852783 0.893097 -0.398285 0.857697 0.897491 -0.423340 0.862518 0.901794 -0.448059 0.867096 0.905945 -0.472900 0.871735 0.910065 -0.498291 0.876282 0.914185 -0.524078 0.880646 0.918030 -0.550507 0.885010 0.921936 -0.577026 0.889191 0.925598 -0.603760 0.893311 0.929291 -0.630493 0.897400 0.932892 -0.656891 0.901245 0.936279 -0.683105 0.905121 0.939697 -0.708832 0.908936 0.943024 -0.733978 0.912445 0.946167 -0.758667 0.916046 0.949280 -0.782715 0.919495 0.952332 -0.806061 0.922791 0.955139 -0.828735 0.925995 0.957947 -0.850677 0.929169 0.960693 -0.871643 0.932159 0.963196 -0.891846 0.935089 0.965790 -0.911011 0.937866 0.968140 -0.929260 0.940582 0.970490 -0.946442 0.943237 0.972717 -0.962433 0.945679 0.974823 -0.977295 0.948090 0.976868 -0.990967 0.950409 0.978821 -0.284180 0.861359 0.884033 -0.308624 0.866211 0.888458 -0.333435 0.871033 0.892975 -0.358429 0.875763 0.897369 -0.383392 0.880280 0.901581 -0.408417 0.884888 0.905884 -0.433258 0.889374 0.910004 -0.457855 0.893616 0.913940 -0.482727 0.897949 0.917969 -0.508301 0.902130 0.921814 -0.534241 0.906158 0.925537 -0.560547 0.910187 0.929199 -0.587036 0.913940 0.932739 -0.613678 0.917816 0.936218 -0.640228 0.921509 0.939636 -0.666382 0.925018 0.942871 -0.692291 0.928528 0.946075 -0.717743 0.931976 0.949219 -0.742584 0.935150 0.952179 -0.766876 0.938354 0.955078 -0.790588 0.941467 0.957886 -0.813538 0.944397 0.960510 -0.835815 0.947266 0.963135 -0.857239 0.950012 0.965668 -0.877930 0.952667 0.968079 -0.897675 0.955292 0.970428 -0.916473 0.957703 0.972626 -0.934265 0.960083 0.974762 -0.950989 0.962372 0.976807 -0.966522 0.964478 0.978729 -0.980957 0.966583 0.980591 -0.994141 0.968567 0.982330 -0.294220 0.888641 0.892853 -0.318726 0.893097 0.897156 -0.343597 0.897644 0.901489 -0.368500 0.902008 0.905731 -0.393341 0.906219 0.909790 -0.418243 0.910461 0.913849 -0.442963 0.914581 0.917847 -0.467407 0.918518 0.921661 -0.492523 0.922485 0.925476 -0.518005 0.926178 0.928986 -0.544067 0.929962 0.932617 -0.570435 0.933563 0.936127 -0.596741 0.937042 0.939453 -0.623260 0.940491 0.942780 -0.649597 0.943848 0.946045 -0.675507 0.946960 0.949036 -0.701141 0.950134 0.952057 -0.726227 0.953186 0.955017 -0.750702 0.956055 0.957733 -0.774689 0.958862 0.960449 -0.798035 0.961639 0.963104 -0.820618 0.964203 0.965607 -0.842499 0.966766 0.968048 -0.863556 0.969116 0.970337 -0.883789 0.971405 0.972534 -0.903168 0.973694 0.974731 -0.921478 0.975800 0.976746 -0.938873 0.977814 0.978699 -0.955170 0.979767 0.980560 -0.970306 0.981537 0.982239 -0.984253 0.983276 0.983948 -0.997009 0.984955 0.985535 -0.304169 0.914276 0.901367 -0.328705 0.918396 0.905518 -0.353546 0.922516 0.909698 -0.378387 0.926575 0.913757 -0.403107 0.930420 0.917664 -0.427826 0.934265 0.921570 -0.452362 0.938049 0.925354 -0.476868 0.941620 0.928925 -0.502075 0.945190 0.932526 -0.527649 0.948547 0.935944 -0.553680 0.951904 0.939331 -0.579987 0.955200 0.942657 -0.606201 0.958252 0.945862 -0.632538 0.961334 0.948975 -0.658600 0.964294 0.951996 -0.684296 0.967133 0.954834 -0.709564 0.969849 0.957672 -0.734344 0.972534 0.960419 -0.758423 0.975037 0.962982 -0.782074 0.977509 0.965546 -0.804962 0.979797 0.967926 -0.827240 0.982086 0.970245 -0.848785 0.984283 0.972504 -0.869385 0.986298 0.974640 -0.889252 0.988312 0.976685 -0.908173 0.990204 0.978638 -0.926117 0.991943 0.980469 -0.943024 0.993622 0.982208 -0.958923 0.995300 0.983917 -0.973633 0.996765 0.985504 -0.987244 0.998199 0.987000 -0.999512 0.999512 0.988373 -0.054565 0.051086 0.609802 -0.068054 0.052856 0.613800 -0.082245 0.054688 0.617859 -0.097473 0.056580 0.622040 -0.114105 0.058563 0.626465 -0.131927 0.060608 0.630890 -0.150757 0.062683 0.635315 -0.170685 0.064850 0.639984 -0.191437 0.067139 0.644775 -0.212982 0.069366 0.649445 -0.235291 0.071747 0.654358 -0.258118 0.074188 0.659241 -0.281586 0.076721 0.664246 -0.305511 0.079315 0.669373 -0.329712 0.081940 0.674438 -0.354309 0.084747 0.679688 -0.379059 0.087616 0.684998 -0.403748 0.090454 0.690186 -0.428680 0.093506 0.695587 -0.453430 0.096649 0.701050 -0.478241 0.099792 0.706390 -0.503998 0.103119 0.711945 -0.530365 0.106506 0.717468 -0.557129 0.109924 0.722931 -0.584412 0.113495 0.728577 -0.611694 0.117096 0.734070 -0.639130 0.120819 0.739685 -0.666473 0.124664 0.745331 -0.693420 0.128479 0.750885 -0.720123 0.132477 0.756561 -0.746307 0.136566 0.762207 -0.771851 0.140594 0.767792 -0.058655 0.064636 0.617676 -0.072418 0.066681 0.621948 -0.087036 0.068756 0.626343 -0.102783 0.070831 0.630646 -0.119904 0.073059 0.635223 -0.138245 0.075378 0.639862 -0.157532 0.077698 0.644470 -0.177887 0.080139 0.649353 -0.199127 0.082672 0.654205 -0.221008 0.085266 0.659119 -0.243713 0.087952 0.664124 -0.266815 0.090698 0.669128 -0.290558 0.093567 0.674347 -0.314728 0.096558 0.679565 -0.339142 0.099548 0.684692 -0.363953 0.102722 0.690063 -0.388855 0.105988 0.695435 -0.413666 0.109222 0.700775 -0.438599 0.112671 0.706268 -0.463440 0.116211 0.711761 -0.488647 0.119720 0.717224 -0.514740 0.123413 0.722778 -0.541229 0.127167 0.728271 -0.568420 0.131042 0.733948 -0.595825 0.134949 0.739532 -0.623169 0.138885 0.745056 -0.650726 0.143005 0.750732 -0.678009 0.147217 0.756409 -0.704865 0.151367 0.761932 -0.731384 0.155701 0.767639 -0.757385 0.160126 0.773315 -0.782715 0.164459 0.778809 -0.063019 0.079437 0.626099 -0.077087 0.081696 0.630524 -0.092194 0.084106 0.635101 -0.108521 0.086487 0.639618 -0.126129 0.089020 0.644379 -0.144928 0.091644 0.649231 -0.164703 0.094299 0.654022 -0.185486 0.097107 0.658936 -0.207092 0.100037 0.664032 -0.229370 0.102966 0.668976 -0.252350 0.106049 0.674164 -0.275818 0.109131 0.679291 -0.299835 0.112457 0.684601 -0.324280 0.115784 0.689911 -0.348846 0.119171 0.695190 -0.373749 0.122711 0.700623 -0.398834 0.126343 0.706116 -0.423706 0.130005 0.711487 -0.448639 0.133820 0.717072 -0.473724 0.137726 0.722687 -0.499359 0.141571 0.728119 -0.525726 0.145660 0.733765 -0.552521 0.149719 0.739258 -0.579865 0.153961 0.744873 -0.607452 0.158234 0.750610 -0.634888 0.162506 0.756134 -0.662384 0.166931 0.761841 -0.689575 0.171417 0.767487 -0.716248 0.175903 0.773041 -0.742645 0.180511 0.778687 -0.768433 0.185242 0.784271 -0.793518 0.189880 0.789795 -0.067657 0.095795 0.634827 -0.082092 0.098419 0.639496 -0.097717 0.101135 0.644257 -0.114563 0.103882 0.648926 -0.132721 0.106812 0.653870 -0.152039 0.109833 0.658813 -0.172241 0.112823 0.663788 -0.193420 0.116058 0.668884 -0.215332 0.119232 0.673920 -0.238068 0.122620 0.679138 -0.261383 0.126099 0.684448 -0.285126 0.129578 0.689636 -0.309357 0.133240 0.695099 -0.334015 0.136963 0.700531 -0.358765 0.140686 0.705811 -0.383881 0.144623 0.711334 -0.408997 0.148590 0.716949 -0.433960 0.152588 0.722382 -0.458923 0.156769 0.727997 -0.484192 0.160889 0.733459 -0.510254 0.165192 0.739105 -0.536987 0.169586 0.744781 -0.564026 0.173920 0.750275 -0.591522 0.178497 0.756012 -0.619171 0.183105 0.761688 -0.646637 0.187622 0.767181 -0.674072 0.192352 0.772858 -0.701141 0.197113 0.778503 -0.727692 0.201874 0.784058 -0.753815 0.206787 0.789642 -0.779266 0.211609 0.795135 -0.804291 0.216583 0.800720 -0.072540 0.114044 0.644012 -0.087433 0.117065 0.648804 -0.103577 0.120148 0.653717 -0.121002 0.123260 0.658569 -0.139679 0.126526 0.663635 -0.159454 0.129944 0.668793 -0.180115 0.133301 0.673767 -0.201752 0.136871 0.679047 -0.223999 0.140442 0.684174 -0.247040 0.144165 0.689545 -0.270691 0.147980 0.694946 -0.294678 0.151794 0.700226 -0.319214 0.155823 0.705719 -0.344055 0.159882 0.711243 -0.368988 0.163971 0.716644 -0.394135 0.168213 0.722229 -0.419312 0.172516 0.727844 -0.444336 0.176819 0.733368 -0.469421 0.181305 0.738953 -0.494995 0.185699 0.744476 -0.521454 0.190338 0.750153 -0.548431 0.195007 0.755859 -0.575653 0.199646 0.761414 -0.603302 0.204498 0.767029 -0.631012 0.209320 0.772705 -0.658447 0.214142 0.778229 -0.685760 0.219147 0.783936 -0.712708 0.224182 0.789520 -0.739075 0.229126 0.794983 -0.764984 0.234222 0.800598 -0.790222 0.239288 0.806000 -0.814941 0.244476 0.811554 -0.077728 0.134186 0.653473 -0.093140 0.137543 0.658478 -0.109863 0.141022 0.663513 -0.127777 0.144440 0.668488 -0.147003 0.148071 0.673676 -0.167145 0.151703 0.678802 -0.188324 0.155518 0.684052 -0.210358 0.159424 0.689423 -0.232971 0.163330 0.694672 -0.256348 0.167389 0.700073 -0.280273 0.171539 0.705597 -0.304504 0.175690 0.710968 -0.329285 0.179993 0.716492 -0.354309 0.184387 0.722107 -0.379333 0.188782 0.727570 -0.404572 0.193298 0.733185 -0.429657 0.197815 0.738678 -0.454803 0.202515 0.744354 -0.480194 0.207275 0.750000 -0.506165 0.211975 0.755554 -0.532867 0.216858 0.761261 -0.560089 0.221771 0.766876 -0.587494 0.226685 0.772400 -0.615204 0.231720 0.778076 -0.642914 0.236816 0.783752 -0.670288 0.241821 0.789215 -0.697510 0.247040 0.794861 -0.724091 0.252197 0.800354 -0.750427 0.257446 0.805878 -0.776093 0.262726 0.811432 -0.801056 0.267944 0.816772 -0.825439 0.273346 0.822235 -0.083252 0.156036 0.663208 -0.099182 0.159729 0.668365 -0.116516 0.163513 0.673523 -0.134979 0.167297 0.678680 -0.154694 0.171234 0.683990 -0.175262 0.175232 0.689117 -0.196869 0.179321 0.694550 -0.219299 0.183563 0.699951 -0.242249 0.187775 0.705292 -0.265930 0.192139 0.710846 -0.290161 0.196594 0.716370 -0.314606 0.201080 0.721802 -0.339569 0.205627 0.727417 -0.364716 0.210358 0.733063 -0.389893 0.214935 0.738556 -0.415131 0.219788 0.744232 -0.440308 0.224548 0.749756 -0.465454 0.229492 0.755371 -0.491180 0.234497 0.761078 -0.517487 0.239410 0.766602 -0.544495 0.244537 0.772278 -0.571930 0.249725 0.777985 -0.599426 0.254791 0.783478 -0.627136 0.260040 0.789093 -0.654846 0.265350 0.794708 -0.682129 0.270569 0.800171 -0.709167 0.275909 0.805695 -0.735596 0.281219 0.811127 -0.761627 0.286621 0.816650 -0.787109 0.292084 0.822083 -0.811737 0.297424 0.827423 -0.835785 0.302917 0.832794 -0.089111 0.179474 0.673279 -0.105621 0.183441 0.678558 -0.123413 0.187500 0.683716 -0.142517 0.191650 0.689026 -0.162720 0.195953 0.694458 -0.183777 0.200195 0.699707 -0.205719 0.204590 0.705200 -0.228516 0.209137 0.710663 -0.251801 0.213623 0.716095 -0.275787 0.218231 0.721649 -0.300201 0.222992 0.727295 -0.324921 0.227692 0.732758 -0.350006 0.232574 0.738403 -0.375153 0.237366 0.743927 -0.400543 0.242401 0.749634 -0.425842 0.247437 0.755280 -0.450989 0.252380 0.760803 -0.476379 0.257599 0.766479 -0.502472 0.262817 0.772125 -0.529022 0.267944 0.777679 -0.556244 0.273285 0.783325 -0.583832 0.278595 0.788971 -0.611450 0.283844 0.794434 -0.639221 0.289246 0.800049 -0.666626 0.294586 0.805481 -0.693970 0.300049 0.811005 -0.720764 0.305573 0.816498 -0.747009 0.310974 0.821808 -0.772797 0.316528 0.827240 -0.797974 0.322083 0.832672 -0.822327 0.327515 0.837860 -0.845978 0.333099 0.843109 -0.095306 0.204346 0.683563 -0.112427 0.208618 0.688873 -0.130798 0.212921 0.694183 -0.150421 0.217407 0.699554 -0.170990 0.221954 0.705017 -0.192505 0.226440 0.710419 -0.214905 0.231171 0.715942 -0.238037 0.235962 0.721527 -0.261658 0.240692 0.726990 -0.285858 0.245575 0.732635 -0.310516 0.250580 0.738281 -0.335388 0.255493 0.743774 -0.360626 0.260620 0.749420 -0.385895 0.265594 0.754974 -0.411285 0.270844 0.760651 -0.436615 0.276093 0.766327 -0.461792 0.281281 0.771851 -0.487488 0.286621 0.777557 -0.513885 0.292023 0.783203 -0.540710 0.297302 0.788635 -0.568176 0.302765 0.794312 -0.595856 0.308258 0.799866 -0.623505 0.313660 0.805359 -0.651245 0.319214 0.810883 -0.678589 0.324646 0.816254 -0.705658 0.330231 0.821655 -0.732330 0.335815 0.827118 -0.758270 0.341309 0.832367 -0.783783 0.346954 0.837677 -0.808685 0.352539 0.842987 -0.832672 0.358032 0.848083 -0.855988 0.363617 0.853302 -0.101837 0.230499 0.694031 -0.119568 0.235077 0.699432 -0.138458 0.239594 0.704742 -0.158600 0.244354 0.710266 -0.179688 0.249176 0.715790 -0.201538 0.253876 0.721252 -0.224335 0.258911 0.726837 -0.247742 0.263855 0.732483 -0.271667 0.268829 0.738037 -0.296143 0.273956 0.743652 -0.320923 0.279022 0.749146 -0.346130 0.284241 0.754852 -0.371429 0.289581 0.760529 -0.396759 0.294769 0.766052 -0.422150 0.300140 0.771698 -0.447510 0.305573 0.777374 -0.472778 0.310883 0.782928 -0.498810 0.316406 0.788513 -0.525513 0.321960 0.794128 -0.552551 0.327362 0.799622 -0.580200 0.332977 0.805176 -0.607941 0.338562 0.810730 -0.635590 0.344055 0.816132 -0.663269 0.349670 0.821533 -0.690399 0.355164 0.826843 -0.717316 0.360809 0.832245 -0.743744 0.366455 0.837585 -0.769470 0.371979 0.842773 -0.794647 0.377594 0.847961 -0.819183 0.383270 0.853149 -0.842834 0.388733 0.858154 -0.865753 0.394348 0.863251 -0.108734 0.257812 0.704651 -0.127106 0.262634 0.710144 -0.146515 0.267426 0.715546 -0.167084 0.272400 0.721100 -0.188660 0.277405 0.726715 -0.210907 0.282379 0.732208 -0.234039 0.287537 0.737854 -0.257782 0.292755 0.743500 -0.281952 0.297852 0.749023 -0.306610 0.303192 0.754730 -0.331573 0.308441 0.760254 -0.356842 0.313812 0.765930 -0.382294 0.319275 0.771576 -0.407715 0.324677 0.777130 -0.433105 0.330139 0.782745 -0.458405 0.335724 0.788361 -0.483948 0.341156 0.793884 -0.510284 0.346771 0.799469 -0.537292 0.352386 0.805054 -0.564514 0.357880 0.810425 -0.592224 0.363556 0.815948 -0.619873 0.369110 0.821289 -0.647675 0.374756 0.826721 -0.675171 0.380432 0.832153 -0.702148 0.385986 0.837311 -0.728851 0.391632 0.842590 -0.755005 0.397308 0.847870 -0.780426 0.402802 0.852905 -0.805359 0.408447 0.858032 -0.829529 0.414062 0.863129 -0.852783 0.419556 0.867981 -0.875275 0.425079 0.872955 -0.116028 0.286072 0.715363 -0.134918 0.291138 0.720978 -0.154846 0.296112 0.726440 -0.175903 0.301270 0.732086 -0.197906 0.306488 0.737701 -0.220490 0.311615 0.743225 -0.243958 0.316956 0.748871 -0.267853 0.322266 0.754456 -0.292358 0.327637 0.760101 -0.317291 0.333130 0.765808 -0.342377 0.338470 0.771301 -0.367798 0.344055 0.776978 -0.393280 0.349609 0.782623 -0.418671 0.355072 0.788116 -0.444092 0.360687 0.793732 -0.469421 0.366333 0.799316 -0.495300 0.371826 0.804779 -0.521973 0.377502 0.810272 -0.549133 0.383148 0.815826 -0.576538 0.388733 0.821167 -0.604340 0.394440 0.826599 -0.631958 0.399994 0.831848 -0.659668 0.405670 0.837189 -0.687012 0.411346 0.842468 -0.713745 0.416840 0.847595 -0.740234 0.422516 0.852783 -0.766113 0.428131 0.857910 -0.791229 0.433655 0.862854 -0.815826 0.439209 0.867859 -0.839661 0.444855 0.872772 -0.862488 0.450348 0.877563 -0.884521 0.456024 0.882355 -0.123657 0.315186 0.726288 -0.143097 0.320435 0.731934 -0.163483 0.325592 0.737427 -0.184998 0.330933 0.743103 -0.207367 0.336304 0.748749 -0.230347 0.341583 0.754272 -0.254120 0.347107 0.759979 -0.278259 0.352448 0.765503 -0.303009 0.357971 0.771118 -0.328125 0.363556 0.776825 -0.353302 0.369049 0.782379 -0.378784 0.374664 0.787994 -0.404327 0.380310 0.793579 -0.429657 0.385803 0.799042 -0.455048 0.391479 0.804657 -0.480652 0.397186 0.810150 -0.506805 0.402710 0.815521 -0.533722 0.408417 0.821014 -0.560913 0.414001 0.826294 -0.588593 0.419678 0.831726 -0.616364 0.425323 0.837067 -0.644012 0.430908 0.842224 -0.671539 0.436523 0.847473 -0.698669 0.442230 0.852661 -0.725281 0.447815 0.857635 -0.751465 0.453552 0.862732 -0.777069 0.459320 0.867737 -0.801849 0.464966 0.872528 -0.826111 0.470764 0.877441 -0.849365 0.476410 0.882141 -0.871887 0.482208 0.886841 -0.893494 0.488037 0.891510 -0.131592 0.344971 0.737274 -0.151520 0.350342 0.742950 -0.172485 0.355682 0.748444 -0.194366 0.361145 0.754120 -0.216980 0.366486 0.759644 -0.240387 0.372040 0.765381 -0.264404 0.377594 0.770996 -0.288818 0.383026 0.776550 -0.313782 0.388641 0.782196 -0.338989 0.394318 0.787811 -0.364319 0.399841 0.793274 -0.389893 0.405487 0.798920 -0.415405 0.411194 0.804535 -0.440704 0.416718 0.809875 -0.466095 0.422424 0.815399 -0.491821 0.427948 0.820740 -0.518433 0.433685 0.826172 -0.545593 0.439362 0.831573 -0.572906 0.444977 0.836823 -0.600708 0.450745 0.842072 -0.628479 0.456573 0.847351 -0.655975 0.462250 0.852417 -0.683319 0.468140 0.857544 -0.710236 0.473999 0.862640 -0.736572 0.479828 0.867493 -0.762512 0.485718 0.872437 -0.787750 0.491669 0.877319 -0.812256 0.497406 0.881989 -0.836090 0.503357 0.886719 -0.858978 0.509125 0.891266 -0.881104 0.515015 0.895874 -0.902222 0.520874 0.900360 -0.139862 0.375244 0.748322 -0.160309 0.380737 0.753967 -0.181610 0.386139 0.759521 -0.203979 0.391693 0.765198 -0.226898 0.397095 0.770782 -0.250671 0.402710 0.776428 -0.274963 0.408356 0.782074 -0.299561 0.413849 0.787567 -0.324677 0.419556 0.793182 -0.350037 0.425171 0.798798 -0.375366 0.430756 0.804230 -0.401001 0.436432 0.809753 -0.426483 0.442139 0.815247 -0.451721 0.447784 0.820648 -0.477264 0.453583 0.825989 -0.503357 0.459320 0.831329 -0.530182 0.465210 0.836670 -0.557495 0.471161 0.841949 -0.584961 0.476990 0.847046 -0.612701 0.482971 0.852295 -0.640442 0.488953 0.857391 -0.667786 0.494843 0.862335 -0.695007 0.500885 0.867340 -0.721649 0.506866 0.872314 -0.747681 0.512756 0.877075 -0.773315 0.518829 0.881897 -0.798126 0.524719 0.886505 -0.822388 0.530731 0.891144 -0.845825 0.536713 0.895752 -0.868286 0.542511 0.900146 -0.889954 0.548462 0.904572 -0.910583 0.554382 0.908905 -0.148407 0.405792 0.759399 -0.169220 0.411255 0.764893 -0.191071 0.416809 0.770599 -0.213776 0.422424 0.776276 -0.237030 0.427887 0.781769 -0.261047 0.433563 0.787445 -0.285583 0.439240 0.793030 -0.310394 0.444824 0.798523 -0.335663 0.450592 0.804108 -0.361084 0.456421 0.809631 -0.386475 0.462158 0.815002 -0.412079 0.468079 0.820496 -0.437408 0.473938 0.825775 -0.462769 0.479950 0.831146 -0.488556 0.485992 0.836517 -0.514923 0.491882 0.841644 -0.541962 0.498016 0.846954 -0.569427 0.504089 0.852142 -0.596893 0.510040 0.857117 -0.624664 0.516174 0.862213 -0.652313 0.522308 0.867249 -0.679443 0.528290 0.872040 -0.706390 0.534424 0.876953 -0.732849 0.540558 0.881775 -0.758575 0.546509 0.886383 -0.783875 0.552582 0.891052 -0.808380 0.558533 0.895538 -0.832245 0.564514 0.900024 -0.855286 0.570557 0.904449 -0.877350 0.576355 0.908661 -0.898499 0.582245 0.912964 -0.918671 0.588135 0.917145 -0.157257 0.436523 0.770477 -0.178619 0.442169 0.776123 -0.200745 0.447754 0.781647 -0.223816 0.453552 0.787262 -0.247406 0.459229 0.792755 -0.271637 0.465118 0.798370 -0.296387 0.471039 0.803925 -0.321320 0.476868 0.809357 -0.346680 0.482880 0.814880 -0.372223 0.488953 0.820343 -0.397644 0.494904 0.825623 -0.423218 0.501038 0.831024 -0.448578 0.507172 0.836365 -0.473907 0.513184 0.841553 -0.499969 0.519379 0.846832 -0.526581 0.525482 0.851898 -0.553772 0.531708 0.857025 -0.581299 0.537933 0.862122 -0.608826 0.543976 0.867004 -0.636536 0.550171 0.871918 -0.664032 0.556427 0.876831 -0.690948 0.562469 0.881531 -0.717590 0.568573 0.886322 -0.743835 0.574738 0.890930 -0.769257 0.580658 0.895386 -0.794250 0.586792 0.899933 -0.818329 0.592651 0.904266 -0.841827 0.598602 0.908569 -0.864441 0.604553 0.912842 -0.886078 0.610321 0.916931 -0.906738 0.616150 0.921021 -0.926422 0.621948 0.925018 -0.166321 0.468048 0.781494 -0.188019 0.473877 0.786987 -0.210632 0.479828 0.792572 -0.234009 0.485840 0.798248 -0.257874 0.491760 0.803650 -0.282379 0.497925 0.809174 -0.307251 0.504028 0.814697 -0.332336 0.510040 0.820068 -0.357788 0.516266 0.825470 -0.383331 0.522491 0.830902 -0.408752 0.528595 0.836151 -0.434235 0.534851 0.841431 -0.459442 0.540985 0.846527 -0.485046 0.547302 0.851746 -0.511475 0.553589 0.856903 -0.538208 0.559723 0.861877 -0.565582 0.565979 0.866882 -0.593109 0.572266 0.871796 -0.620636 0.578369 0.876587 -0.648224 0.584564 0.881409 -0.675507 0.590790 0.886169 -0.702240 0.596802 0.890686 -0.728638 0.602936 0.895294 -0.754578 0.609070 0.899811 -0.779694 0.614929 0.904144 -0.804321 0.620941 0.908447 -0.828064 0.626740 0.912628 -0.851166 0.632568 0.916809 -0.873291 0.638397 0.920898 -0.894440 0.644012 0.924835 -0.914703 0.649658 0.928741 -0.933777 0.655304 0.932495 -0.175629 0.500885 0.792450 -0.197723 0.506866 0.797943 -0.220734 0.513031 0.803497 -0.244354 0.519226 0.809082 -0.268433 0.525391 0.814423 -0.293121 0.531677 0.819916 -0.318176 0.537964 0.825348 -0.343353 0.544128 0.830627 -0.368866 0.550507 0.835999 -0.394440 0.556824 0.841278 -0.419800 0.563019 0.846405 -0.445160 0.569305 0.851624 -0.470398 0.575562 0.856598 -0.496338 0.581879 0.861725 -0.522949 0.588196 0.866730 -0.549896 0.594360 0.871613 -0.577332 0.600647 0.876465 -0.604919 0.606903 0.881317 -0.632355 0.612946 0.885925 -0.659760 0.619141 0.890594 -0.686829 0.625244 0.895172 -0.713348 0.631165 0.899567 -0.739471 0.637207 0.904022 -0.764893 0.643005 0.908234 -0.789856 0.649017 0.912506 -0.814117 0.654816 0.916718 -0.837463 0.660461 0.920715 -0.860107 0.666168 0.924683 -0.881836 0.671814 0.928680 -0.902527 0.677155 0.932373 -0.922272 0.682648 0.936096 -0.940857 0.687988 0.939697 -0.185181 0.534698 0.803375 -0.207611 0.540833 0.808807 -0.230927 0.547211 0.814270 -0.254822 0.553528 0.819794 -0.279114 0.559784 0.825073 -0.303986 0.566132 0.830505 -0.329163 0.572540 0.835846 -0.354431 0.578796 0.841034 -0.379974 0.585175 0.846252 -0.405304 0.591400 0.851379 -0.430817 0.597778 0.856537 -0.456116 0.604156 0.861603 -0.481476 0.610352 0.866486 -0.507690 0.616669 0.871460 -0.534454 0.622925 0.876343 -0.561493 0.629028 0.881042 -0.588959 0.635223 0.885834 -0.616516 0.641388 0.890442 -0.643829 0.647339 0.894928 -0.671112 0.653412 0.899475 -0.697906 0.659393 0.903900 -0.724182 0.665192 0.908142 -0.750000 0.671051 0.912415 -0.775116 0.676697 0.916504 -0.799713 0.682434 0.920593 -0.823608 0.688019 0.924622 -0.846527 0.693481 0.928436 -0.868774 0.698914 0.932281 -0.890015 0.704376 0.935974 -0.910248 0.709564 0.939545 -0.929504 0.714722 0.943054 -0.947571 0.719879 0.946533 -0.194916 0.569244 0.814178 -0.217621 0.575500 0.819489 -0.241241 0.581909 0.824951 -0.265411 0.588348 0.830353 -0.289886 0.594666 0.835571 -0.314880 0.601044 0.840881 -0.340149 0.607483 0.846161 -0.365448 0.613708 0.851227 -0.390991 0.620087 0.856415 -0.416321 0.626312 0.861328 -0.441650 0.632568 0.866394 -0.466919 0.638885 0.871368 -0.492584 0.645020 0.876099 -0.519012 0.651245 0.880890 -0.545868 0.657410 0.885681 -0.573059 0.663391 0.890198 -0.600555 0.669403 0.894806 -0.627991 0.675415 0.899353 -0.655182 0.681213 0.903687 -0.682190 0.687103 0.908020 -0.708679 0.692749 0.912231 -0.734772 0.698456 0.916412 -0.760284 0.704132 0.920502 -0.785034 0.709595 0.924408 -0.809265 0.715027 0.928345 -0.832764 0.720459 0.932190 -0.855255 0.725647 0.935791 -0.877075 0.730865 0.939453 -0.897919 0.736023 0.942963 -0.917572 0.740967 0.946350 -0.936310 0.745880 0.949677 -0.953796 0.750641 0.952850 -0.204742 0.604187 0.824860 -0.227844 0.610443 0.830078 -0.251648 0.616913 0.835449 -0.276001 0.623352 0.840790 -0.300690 0.629608 0.845886 -0.325806 0.636017 0.851135 -0.350983 0.642151 0.856140 -0.376434 0.648499 0.861206 -0.401947 0.654816 0.866272 -0.427246 0.660889 0.871124 -0.452423 0.667145 0.876007 -0.477783 0.673279 0.880798 -0.503693 0.679230 0.885437 -0.530304 0.685303 0.890137 -0.557343 0.691254 0.894745 -0.584503 0.697021 0.899170 -0.611908 0.702942 0.903564 -0.639282 0.708740 0.907959 -0.666290 0.714325 0.912109 -0.693115 0.719971 0.916290 -0.719208 0.725372 0.920288 -0.745026 0.730896 0.924316 -0.770233 0.736359 0.928253 -0.794617 0.741486 0.931976 -0.818451 0.746735 0.935669 -0.841553 0.751892 0.939331 -0.863708 0.756836 0.942810 -0.885071 0.761780 0.946259 -0.905396 0.766693 0.949615 -0.924591 0.771301 0.952789 -0.942810 0.775970 0.955963 -0.959747 0.780396 0.958984 -0.214752 0.639191 0.835327 -0.238129 0.645416 0.840515 -0.262207 0.651794 0.845764 -0.286743 0.658112 0.850983 -0.311493 0.664337 0.855988 -0.336700 0.670532 0.861084 -0.361938 0.676666 0.865967 -0.387360 0.682892 0.870941 -0.412811 0.688995 0.875854 -0.437958 0.694916 0.880585 -0.463135 0.700958 0.885315 -0.488708 0.706909 0.890015 -0.514832 0.712769 0.894501 -0.541504 0.718567 0.899017 -0.568573 0.724365 0.903442 -0.595795 0.729950 0.907745 -0.623138 0.735565 0.912018 -0.650208 0.741028 0.916077 -0.677124 0.746460 0.920197 -0.703674 0.751892 0.924225 -0.729492 0.757080 0.928040 -0.755005 0.762390 0.931885 -0.779816 0.767456 0.935608 -0.803925 0.772461 0.939178 -0.827393 0.777374 0.942719 -0.850067 0.782257 0.946198 -0.871735 0.786926 0.949463 -0.892609 0.791595 0.952728 -0.912445 0.796021 0.955841 -0.931244 0.800568 0.958893 -0.948975 0.804871 0.961914 -0.965363 0.809082 0.964722 -0.224854 0.673859 0.845642 -0.248474 0.679962 0.850708 -0.272705 0.686218 0.855896 -0.297272 0.692230 0.860840 -0.322296 0.698425 0.865875 -0.347534 0.704590 0.870850 -0.372833 0.710480 0.875610 -0.398163 0.716461 0.880432 -0.423523 0.722443 0.885193 -0.448578 0.728149 0.889801 -0.473785 0.734009 0.894379 -0.499634 0.739777 0.898926 -0.525848 0.745361 0.903229 -0.552673 0.750977 0.907623 -0.579651 0.756348 0.911774 -0.606903 0.761841 0.915955 -0.634155 0.767212 0.920074 -0.661011 0.772430 0.924042 -0.687714 0.777618 0.927948 -0.713928 0.782745 0.931793 -0.739502 0.787689 0.935455 -0.764648 0.792694 0.939087 -0.789154 0.797546 0.942596 -0.812866 0.802216 0.946045 -0.835876 0.806854 0.949371 -0.858124 0.811462 0.952667 -0.879425 0.815826 0.955780 -0.899872 0.820190 0.958832 -0.919189 0.824341 0.961731 -0.937500 0.828491 0.964630 -0.954712 0.832611 0.967407 -0.970642 0.836365 0.970062 -0.235077 0.707886 0.855774 -0.258881 0.713898 0.860687 -0.283295 0.719910 0.865753 -0.307953 0.725830 0.870636 -0.333038 0.731812 0.875488 -0.358337 0.737732 0.880341 -0.383575 0.743439 0.884979 -0.408875 0.749207 0.889709 -0.434174 0.754974 0.894257 -0.459076 0.760498 0.898682 -0.484375 0.766052 0.903168 -0.510406 0.771606 0.907501 -0.536774 0.776917 0.911682 -0.563660 0.782288 0.915894 -0.590668 0.787476 0.919891 -0.617828 0.792664 0.923920 -0.644897 0.797821 0.927826 -0.671570 0.802704 0.931610 -0.697937 0.807678 0.935364 -0.723907 0.812500 0.939026 -0.749146 0.817169 0.942474 -0.773956 0.821777 0.945953 -0.798065 0.826355 0.949310 -0.821381 0.830688 0.952545 -0.844086 0.835083 0.955688 -0.865814 0.839264 0.958710 -0.886719 0.843414 0.961670 -0.906708 0.847443 0.964569 -0.925568 0.851318 0.967285 -0.943451 0.855103 0.970001 -0.960144 0.858887 0.972595 -0.975525 0.862396 0.975037 -0.245300 0.741119 0.865662 -0.269257 0.746887 0.870514 -0.293854 0.752777 0.875336 -0.318604 0.758423 0.880096 -0.343750 0.764191 0.884857 -0.369049 0.769897 0.889557 -0.394196 0.775421 0.894043 -0.419464 0.780945 0.898560 -0.444580 0.786438 0.903046 -0.469421 0.791718 0.907288 -0.494934 0.797089 0.911591 -0.521088 0.802338 0.915741 -0.547638 0.807434 0.919769 -0.574524 0.812500 0.923828 -0.601440 0.817352 0.927673 -0.628510 0.822296 0.931519 -0.655396 0.827118 0.935242 -0.681824 0.831757 0.938812 -0.707916 0.836334 0.942413 -0.733521 0.840942 0.945862 -0.758423 0.845276 0.949127 -0.782928 0.849640 0.952454 -0.806702 0.853851 0.955597 -0.829620 0.857910 0.958649 -0.851837 0.861908 0.961609 -0.873169 0.865784 0.964417 -0.893646 0.869598 0.967194 -0.913177 0.873291 0.969910 -0.931580 0.876892 0.972473 -0.948944 0.880341 0.974976 -0.965149 0.883728 0.977386 -0.980042 0.886963 0.979645 -0.255402 0.773224 0.875153 -0.279694 0.778961 0.879944 -0.304352 0.784576 0.884735 -0.329193 0.790070 0.889313 -0.354370 0.795563 0.893951 -0.379608 0.801025 0.898438 -0.404694 0.806274 0.902832 -0.429840 0.811584 0.907196 -0.454773 0.816803 0.911499 -0.479736 0.821808 0.915558 -0.505493 0.826843 0.919708 -0.531647 0.831726 0.923645 -0.558289 0.836609 0.927582 -0.585144 0.841400 0.931427 -0.612000 0.845978 0.935059 -0.638885 0.850616 0.938751 -0.665588 0.855072 0.942322 -0.691711 0.859406 0.945709 -0.717499 0.863708 0.949036 -0.742798 0.867981 0.952362 -0.767456 0.871948 0.955444 -0.791504 0.875977 0.958557 -0.814819 0.879791 0.961456 -0.837433 0.883575 0.964355 -0.859253 0.887329 0.967163 -0.880127 0.890778 0.969788 -0.900208 0.894318 0.972412 -0.919250 0.897705 0.974915 -0.937195 0.900940 0.977264 -0.954071 0.904053 0.979614 -0.969818 0.907135 0.981842 -0.984222 0.909973 0.983917 -0.265625 0.804443 0.884521 -0.290070 0.809906 0.889221 -0.314819 0.815338 0.893829 -0.339691 0.820496 0.898224 -0.364807 0.825775 0.902679 -0.390015 0.830933 0.907104 -0.415009 0.835907 0.911255 -0.440033 0.840942 0.915466 -0.464813 0.845856 0.919586 -0.489990 0.850555 0.923523 -0.515808 0.855316 0.927460 -0.542053 0.859833 0.931213 -0.568726 0.864380 0.934967 -0.595581 0.868896 0.938660 -0.622314 0.873138 0.942139 -0.648956 0.877411 0.945618 -0.675415 0.881653 0.948975 -0.701294 0.885620 0.952209 -0.726776 0.889618 0.955383 -0.751770 0.893463 0.958466 -0.776001 0.897156 0.961395 -0.799713 0.900787 0.964294 -0.822632 0.904297 0.967010 -0.844849 0.907745 0.969727 -0.866333 0.911102 0.972321 -0.886719 0.914307 0.974792 -0.906342 0.917419 0.977203 -0.924957 0.920471 0.979553 -0.942444 0.923340 0.981720 -0.958862 0.926178 0.983856 -0.974121 0.928894 0.985870 -0.988037 0.931458 0.987823 -0.275848 0.834473 0.893616 -0.300323 0.839691 0.898132 -0.325165 0.844788 0.902588 -0.350037 0.849701 0.906860 -0.375153 0.854645 0.911163 -0.400269 0.859497 0.915344 -0.425110 0.864166 0.919373 -0.449982 0.868866 0.923401 -0.474640 0.873291 0.927246 -0.500122 0.877869 0.931122 -0.526093 0.882294 0.934906 -0.552307 0.886475 0.938477 -0.578949 0.890717 0.942017 -0.605682 0.894867 0.945526 -0.632263 0.898804 0.948792 -0.658752 0.902740 0.952087 -0.684875 0.906525 0.955292 -0.710480 0.910187 0.958313 -0.735657 0.913849 0.961334 -0.760193 0.917267 0.964142 -0.784180 0.920685 0.966949 -0.807526 0.923981 0.969666 -0.830048 0.927155 0.972198 -0.851868 0.930298 0.974762 -0.872894 0.933289 0.977112 -0.892914 0.936127 0.979401 -0.912109 0.938904 0.981659 -0.930237 0.941620 0.983826 -0.947266 0.944122 0.985779 -0.963257 0.946564 0.987762 -0.977997 0.948914 0.989563 -0.991516 0.951172 0.991364 -0.285980 0.863098 0.902374 -0.310547 0.868011 0.906738 -0.335388 0.872833 0.911041 -0.360260 0.877380 0.915100 -0.385315 0.882050 0.919281 -0.410278 0.886536 0.923309 -0.434998 0.890900 0.927155 -0.459717 0.895294 0.931030 -0.484497 0.899414 0.934723 -0.510040 0.903595 0.938385 -0.536072 0.907654 0.941956 -0.562347 0.911530 0.945374 -0.588898 0.915436 0.948730 -0.615540 0.919189 0.952026 -0.641937 0.922791 0.955139 -0.668152 0.926331 0.958221 -0.694061 0.929810 0.961273 -0.719299 0.933105 0.964081 -0.744171 0.936371 0.966858 -0.768341 0.939484 0.969543 -0.791992 0.942505 0.972137 -0.814941 0.945496 0.974701 -0.837036 0.948273 0.977020 -0.858521 0.951019 0.979340 -0.879089 0.953705 0.981598 -0.898712 0.956177 0.983673 -0.917419 0.958618 0.985748 -0.935150 0.960968 0.987732 -0.951752 0.963165 0.989502 -0.967285 0.965302 0.991333 -0.981598 0.967316 0.992950 -0.994690 0.969238 0.994598 -0.296021 0.890259 0.910858 -0.320648 0.894806 0.915039 -0.345520 0.899292 0.919159 -0.370331 0.903564 0.923096 -0.395264 0.907837 0.927063 -0.420013 0.911926 0.930847 -0.444672 0.915985 0.934631 -0.469269 0.920013 0.938293 -0.494232 0.923828 0.941772 -0.519897 0.927612 0.945282 -0.545959 0.931366 0.948639 -0.572174 0.934875 0.951874 -0.598633 0.938354 0.955048 -0.625031 0.941772 0.958160 -0.651215 0.945007 0.961060 -0.677185 0.948181 0.964020 -0.702789 0.951263 0.966827 -0.727722 0.954224 0.969421 -0.752228 0.957153 0.972076 -0.776031 0.959869 0.974518 -0.799316 0.962585 0.976959 -0.821930 0.965149 0.979279 -0.843658 0.967621 0.981506 -0.864685 0.970001 0.983643 -0.884888 0.972290 0.985687 -0.904114 0.974426 0.987610 -0.922394 0.976532 0.989441 -0.939636 0.978485 0.991241 -0.955872 0.980408 0.992920 -0.970947 0.982208 0.994537 -0.984833 0.983917 0.996002 -0.997467 0.985535 0.997437 -0.305969 0.915741 0.918976 -0.330597 0.919952 0.923004 -0.355438 0.924072 0.926971 -0.380157 0.927979 0.930756 -0.404938 0.931854 0.934479 -0.429535 0.935608 0.938110 -0.454071 0.939331 0.941681 -0.478638 0.942963 0.945160 -0.503723 0.946381 0.948456 -0.529419 0.949829 0.951782 -0.555481 0.953156 0.954987 -0.581665 0.956299 0.957977 -0.607971 0.959442 0.960999 -0.634247 0.962463 0.963959 -0.660187 0.965302 0.966644 -0.685852 0.968140 0.969360 -0.710968 0.970825 0.971985 -0.735718 0.973419 0.974457 -0.759857 0.976013 0.976929 -0.783356 0.978333 0.979187 -0.806244 0.980682 0.981445 -0.828491 0.982910 0.983582 -0.849854 0.985016 0.985596 -0.870453 0.987061 0.987579 -0.890228 0.989014 0.989410 -0.909027 0.990814 0.991211 -0.926941 0.992584 0.992859 -0.943756 0.994232 0.994446 -0.959534 0.995819 0.995972 -0.974243 0.997314 0.997406 -0.987701 0.998657 0.998688 -1.000000 1.000000 1.000000 diff --git a/examples/custom/lut_windowed/lut.ps.hlsl b/examples/custom/lut_windowed/lut.ps.hlsl deleted file mode 100644 index b3381b62..00000000 --- a/examples/custom/lut_windowed/lut.ps.hlsl +++ /dev/null @@ -1,89 +0,0 @@ -struct PSQuadIn { - float2 texcoord : TexCoord; - float4 position : SV_Position; -}; - -[[vk::binding(0, 0)]] Texture3D lut : register(t0); -[[vk::binding(1, 0)]] Texture2D tex : register(t1); -[[vk::binding(0, 1)]] SamplerState sampler_lut : register(s0); -[[vk::binding(1, 1)]] SamplerState sampler_tex : register(s1); - - -float3 cscApplyLut3DTetra(const float3 color) -{ - float3 dims; - lut.GetDimensions(dims.x, dims.y, dims.z); - - // make cube - float3 re_dims = dims - float3(1.0f, 1.0f, 1.0f); - float3 restored = color * re_dims; // restore position in table - - float3 black = floor(restored); - float3 white = ceil(restored); - - float3 fracts = frac(restored); // get normalized fractions - - float3 blackf = black / re_dims; - float3 whitef = white / re_dims; - - // select tetrahedron - bool3 cmp = fracts.rgb >= fracts.gbr; // (r>g, g>b, b>r) - int res = min(int(cmp.x) * 4 + int(cmp.y) * 2 + int(cmp.z) - 1, 5); - - // variants: - // rr t2 (001) // B C c.z c.z + c.y - // r>g, gb, b>r t3 (011) // G C c.y c.y + c.z - // r>g, gg, gr t1 (101) // B M --1 B c.z c.z + c.x - // r>g, g>b, b -#include - -std::string_view TrimWhitespace(std::string_view str) -{ - while (!str.empty() && std::isspace(str.front())) - str.remove_prefix(1); - while (!str.empty() && std::isspace(str.back())) - str.remove_suffix(1); - return str; -} - -std::pair ParseHeader(std::string_view text) -{ - bool terminated = false; - LutData data; - size_t offset = 0; - while (offset < text.size() && !terminated) { - auto newline = text.find('\n', offset); - if (newline == std::string::npos) - return { std::move(data), offset }; - - std::string_view line{ text.data() + offset, newline - offset }; - line = TrimWhitespace(line); - - if (line.starts_with("LUT_1D_SIZE")) { - line.remove_prefix(11); - - auto xline = TrimWhitespace(line); - - // use charconv - - uint32_t count; - auto err = std::from_chars(xline.data(), xline.data() + xline.size(), count); - - if (err.ec != std::errc()) - return { std::move(data), offset }; - - data.stride = count; - data.type = LutType::Lut1D; - } else if (line.starts_with("LUT_3D_SIZE")) { - line.remove_prefix(11); - - auto xline = TrimWhitespace(line); - - // use charconv - - uint32_t count; - auto err = std::from_chars(xline.data(), xline.data() + xline.size(), count); - - if (err.ec != std::errc()) - return { std::move(data), offset }; - - data.stride = count; - data.type = LutType::Lut3D; - } else if (line.starts_with("LUT_3D_INPUT_RANGE") || line.starts_with("LUT_1D_INPUT_RANGE")) { - terminated = true; - } - - if (!line.empty() && isdigit(line[0])) - return { std::move(data), offset }; - - offset = newline + 1; - } - return { std::move(data), offset }; -} - -std::unique_ptr ParseLutData(std::string_view text, size_t count) -{ - std::unique_ptr data = std::make_unique_for_overwrite(count * 4); - - auto tr_text = TrimWhitespace(text); - for (size_t i = 0; i < count; i++) { - for (size_t j = 0; j < 4; j++) { - if (j == 3) { - data[i * 4 + j] = 1.0f; - break; - } - - float value; - auto err = std::from_chars(tr_text.data(), tr_text.data() + tr_text.size(), value); - - data[i * 4 + j] = value; - - tr_text = TrimWhitespace(tr_text.substr(tr_text.find_first_of(" \n") + 1)); - } - } - - return data; -} - -LutData LutLoader::LoadLut(std::filesystem::path path) -{ - if (!std::filesystem::exists(path)) - return {}; - - // regular text file - std::ifstream file(path); - if (!file.is_open()) - return {}; - - // load entire file into memory - std::string text; - file.seekg(0, std::ios::end); - text.resize(file.tellg()); - file.seekg(0, std::ios::beg); - - file.read(text.data(), text.size()); - file.close(); - - // parse the file using string_view by line - auto [data, offset] = ParseHeader(text); - - data.data = ParseLutData(std::string_view(text.data() + offset, text.size() - offset), - data.type == LutType::Lut1D ? data.stride : data.stride * data.stride * data.stride); - - return std::move(data); -} diff --git a/examples/custom/lut_windowed/lut_loader.h b/examples/custom/lut_windowed/lut_loader.h deleted file mode 100644 index d0c89b23..00000000 --- a/examples/custom/lut_windowed/lut_loader.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include -#include -#include - -enum class LutType { - Undefined, - Lut1D, - Lut3D, -}; - -// assume equal dimensions for 3D LUT -struct LutData { - std::unique_ptr data; - size_t stride = 0; - LutType type = LutType::Undefined; -}; - -class LutLoader -{ -public: - /** - * Parses the LUT file. Logging the file information. - * @param fileName Path to LUT file, including file name. - * @throws When input file does not exist or contained data are not valid. - * @return LUT data. - */ - static LutData LoadLut(std::filesystem::path path); -}; diff --git a/examples/custom/lut_windowed/menu.h b/examples/custom/lut_windowed/menu.h deleted file mode 100644 index baa1b69d..00000000 --- a/examples/custom/lut_windowed/menu.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once -#include - -namespace UT { -class Menu -{ -public: - enum class Mode { - Image, - Video, - Model, - Game - }; - -public: - Menu() = default; - -public: - void Initialize(HMENU menu) noexcept - { - main_menu.reset(menu); - file.reset(GetSubMenu(menu, 0)); - view.reset(GetSubMenu(menu, 1)); - mode.reset(GetSubMenu(menu, 2)); - styles.reset(GetSubMenu(view.get(), 1)); - } - void EnableLoading() noexcept - { - EnableMenuItem(file.get(), 0, MF_BYPOSITION | MF_ENABLED); - } - void DisableLoading() noexcept - { - EnableMenuItem(file.get(), 0, MF_BYPOSITION | MF_DISABLED); - } - void ToggleGrid() noexcept - { - grid_enabled ^= 1; - MENUITEMINFO mii{ - .cbSize = sizeof(MENUITEMINFO), - .fMask = MIIM_STATE, - .fState = UINT(grid_enabled ? MFS_CHECKED : MFS_UNCHECKED) - }; - SetMenuItemInfo(view.get(), 0, true, &mii); - } - bool GridEnabled() const noexcept - { - return grid_enabled; - } - -private: - wil::unique_hmenu main_menu; - wil::unique_hmenu file; - wil::unique_hmenu view; - wil::unique_hmenu styles; - wil::unique_hmenu mode; - - bool grid_enabled = false; -}; -} // namespace UT diff --git a/examples/custom/lut_windowed/mouse.cpp b/examples/custom/lut_windowed/mouse.cpp deleted file mode 100644 index 26aa4067..00000000 --- a/examples/custom/lut_windowed/mouse.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "mouse.h" - -std::optional Mouse::ReadRawDelta() noexcept -{ - if (rawDeltaBuffer.empty()) { - return {}; - } - const RawDelta d = rawDeltaBuffer.front(); - rawDeltaBuffer.pop(); - return d; -} - -std::optional Mouse::Read() noexcept -{ - if (buffer.size() > 0u) { - Mouse::Event e = buffer.front(); - buffer.pop(); - return e; - } - return {}; -} - -void Mouse::OnMouseMove(int newx, int newy) noexcept -{ - x = newx; - y = newy; - - buffer.push(Mouse::Event(Mouse::Event::Type::Move, *this)); - TrimBuffer(); -} - -void Mouse::OnMouseLeave() noexcept -{ - isInWindow = false; - buffer.push(Mouse::Event(Mouse::Event::Type::Leave, *this)); - TrimBuffer(); -} - -void Mouse::OnMouseEnter() noexcept -{ - isInWindow = true; - buffer.push(Mouse::Event(Mouse::Event::Type::Enter, *this)); - TrimBuffer(); -} - -void Mouse::OnRawDelta(int dx, int dy) noexcept -{ - rawDeltaBuffer.push({ dx, dy }); - TrimBuffer(); -} - -void Mouse::OnLeftPressed(int x, int y) noexcept -{ - leftIsPressed = true; - - buffer.push(Mouse::Event(Mouse::Event::Type::LPress, *this)); - TrimBuffer(); -} - -void Mouse::OnLeftReleased(int x, int y) noexcept -{ - leftIsPressed = false; - - buffer.push(Mouse::Event(Mouse::Event::Type::LRelease, *this)); - TrimBuffer(); -} - -void Mouse::OnRightPressed(int x, int y) noexcept -{ - rightIsPressed = true; - - buffer.push(Mouse::Event(Mouse::Event::Type::RPress, *this)); - TrimBuffer(); -} - -void Mouse::OnRightReleased(int x, int y) noexcept -{ - rightIsPressed = false; - - buffer.push(Mouse::Event(Mouse::Event::Type::RRelease, *this)); - TrimBuffer(); -} - -void Mouse::OnWheelUp(int x, int y) noexcept -{ - buffer.push(Mouse::Event(Mouse::Event::Type::WheelUp, *this)); - TrimBuffer(); -} - -void Mouse::OnWheelDown(int x, int y) noexcept -{ - buffer.push(Mouse::Event(Mouse::Event::Type::WheelDown, *this)); - TrimBuffer(); -} - -void Mouse::TrimBuffer() noexcept -{ - while (buffer.size() > bufferSize) { - buffer.pop(); - } -} - -void Mouse::TrimRawInputBuffer() noexcept -{ - while (rawDeltaBuffer.size() > bufferSize) { - rawDeltaBuffer.pop(); - } -} - -void Mouse::OnWheelDelta(int x, int y, int delta) noexcept -{ - wheelDeltaCarry += delta; - // generate events for every 120 - while (wheelDeltaCarry >= 120) { - wheelDeltaCarry -= 120; - OnWheelUp(x, y); - } - while (wheelDeltaCarry <= -120) { - wheelDeltaCarry += 120; - OnWheelDown(x, y); - } -} diff --git a/examples/custom/lut_windowed/resource.h b/examples/custom/lut_windowed/resource.h deleted file mode 100644 index 00335c50..00000000 --- a/examples/custom/lut_windowed/resource.h +++ /dev/null @@ -1 +0,0 @@ -#include "resources/resource.h" diff --git a/examples/custom/lut_windowed/resources/TLR.ico b/examples/custom/lut_windowed/resources/TLR.ico deleted file mode 100644 index 2c0850a675e1869846f09af20dbc076c2db0a71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212907 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ⅇ1xBENm%>ecNxe)#*V*Pnm;+xPCQ4hJ4< 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�iO9Rr`HCO156WvM@=C1iu0xIK-?w!NE5Te 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 AIsgCw diff --git a/examples/custom/lut_windowed/resources/WinD3D.rc b/examples/custom/lut_windowed/resources/WinD3D.rc deleted file mode 100644 index ae75b1242b9b158da5b4fd3358a8aaaea999dc99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9944 zcmdT~ZBH9V5S|bBsZynU?uY8)NKv9t2#^Gls;!J|95)6mY?C0NT9mia0!DsGiqzlU z_IYMK+}`=_3{IZT#Jm4fHheZ1WRC z@h(GWZ76lfB`M=mNU1NESpNvpp&U9`^#}ZIVAU0@lk%vce+73^BeQkzN#*P4;_@$^ z#0-(Mjxl6KOFG56=d%ryyzwnoYv@7=gGx}w^(I&kUI(E(LC^QvvmWdOPgC?h^t|X? zCG;@nO~>F-mQC1^^P)C9rVD?nz><2frzS4){R3B+N!bC9U05x7bm4DLb=D?&x6#{0 zTUX1p9vjz&?Q+Zlc(*Zb1G70A&RqkpGJ2b^amv7Ho2$syHhp0aYj_9hs!|k7mp&TP ztF>7kZQt4QUWT-?e4pPpu=ct}1-`**^h%Gi2l9LpX={+2lNhNOL*|(yExMOvI<}PL z05R$Sp6lX#gfa`!>YRw~JI^DHy~l`#j3@4**3x3jw6$eZ&+EIs#T4tAc4Bw2kojnc zknf>92)+wegKsr<`Z4rj@FaLpi0DZl?A{@Ia$Fs8v4N=hHZ^+2NA$qeWkDtlUqZ!s zHgwj8Sm6<}o~zqP&M(tnLya)Zi$dg;eY`OrWe(dwObg|s=CEVUnyxY8P_tBKuFNV2 zld&UEhU)#ydYK7@7rHAH!~$+bB4;3F|~*0N@y zRL8gWz%RTh!Cgpj3;Q7bi4wGDX3QLuzDKqo@fIjrpeP~xIER)_@WlLNp6ivo#I=fh z0SGoBc~&MJpySR_pY*oTOQdDZe=KjY`O=ZvS6f#@ck3<1{TTY~!^UXewuS>(Uj_F7 zD|&|S>1(3odZ1}w1oOWp)zn)7Rnx^$V8%^0^U*3~D7QRzA`n)LR+vZyL7=Mb1#o3gGyM(#Gk z^XxS^`O>dgsWPI`-sz!bc@GZsh3ZUccR^RdURT54D7R0_C@$wV5Z(BRD!wu+vP41n(@hHo_opR=r8*y8>_gmF3sO!vgCwFMm?0&~0` z%D132%c+CQnbXb<|>!br!O>;C6v5XtuAL)g)WruhMOkz4<qT5ZCAXo2QUOF1iYa$~${B69UW!?VP0=DxralE}6h)9Q#;9r+P7^wS1r zr)|w%XQYkj$ub*1A1c-}5fYKLA!7PDERosx*=?__gVJTD!A!TTSw>y6H2OOHTRhgD5(|q#rXhd+tj^>Uf_Rc*7E^<9KDa* zeS5E5eNQDv*INPhXjk*cI}YZZM4B910-VmNnys+A_1OZOp-|Bwq(#1@v)hhbL$YI0ahPIo9L_-d^hS zGM>32^YK~r2f4-T88<^kwZ)S|dPfEPsaxJFI* z!wpxwEkS3j%&N%7t5_9lf)@6OzWj>lc7*6aJFDRR8Znp|&Kcy+itP!$@&vR2+26pT zX-|En9I9rnun+c?nuvMxREzf>IJ35NHRBsle#F;Bd5wDwZ=bLZR)G99#At|sl_HT{ z;Om>oml5V?T}h4(D^I7s!M&-t7<>A9F6uaqzo1;~? diff --git a/examples/custom/lut_windowed/resources/resource.h b/examples/custom/lut_windowed/resources/resource.h deleted file mode 100644 index 604c4c3f..00000000 --- a/examples/custom/lut_windowed/resources/resource.h +++ /dev/null @@ -1,22 +0,0 @@ -#define IDI_ICON1 103 -#define IDR_MENU1 109 -#define IDD_DIALOG1 112 -#define IDR_ACCELERATOR1 120 -#define ID_BUTTON2 40001 -#define ID_FILE_LOADMODEL 40003 -#define ID_FILE_EXIT 40004 -#define ID_OPTIONS_DRAWGRID 40005 -#define ID_STYLES_VGUI 40006 -#define ID_STYLES_DARK 40007 -#define ID_STYLES_CHERRY 40008 -#define ID_MODE_GAME 40010 -#define ID_HELP_ABOUT 40009 - -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 121 -#define _APS_NEXT_COMMAND_VALUE 40024 -#define _APS_NEXT_CONTROL_VALUE 1008 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/examples/custom/lut_windowed/util.cpp b/examples/custom/lut_windowed/util.cpp deleted file mode 100644 index 1dcefadf..00000000 --- a/examples/custom/lut_windowed/util.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "util.h" - -HRESULT wis::last_windows_error() noexcept -{ - return GetLastError(); -} - -//// Window Exception -// wis::hr_exception::hr_exception(winrt::hresult hr, wis::source_location sl) -// : exception(sl, false), hResult(hr) -//{ -// log(); -// } -// std::string wis::hr_exception::description() const noexcept -//{ -// return winrt::to_string(winrt::to_hstring(hResult)); -// } -// const char* wis::hr_exception::what() const noexcept -//{ -// if (whatBuffer.empty()) { -// whatBuffer = wis::format( -// "{}\n[Error Code]: 0x{:08X}({})\n" -// "[Description]: {}\n{}", -// type(), (unsigned long)error_code(), (unsigned long)error_code(), -// description(), origin()); -// } -// return whatBuffer.c_str(); -// } diff --git a/examples/custom/lut_windowed/util.h b/examples/custom/lut_windowed/util.h deleted file mode 100644 index 8939a053..00000000 --- a/examples/custom/lut_windowed/util.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once -#include -#include - -// #include -// #include - -namespace wis { -/// @brief Get the last windows error -/// @return HRESULT of the last windows error -HRESULT last_windows_error() noexcept; - -// class hr_exception : public wis::exception -//{ -// public: -// WIS_INLINE hr_exception(winrt::hresult hr, wis::source_location sl = wis::source_location::current()); -// -// WIS_INLINE const char* what() const noexcept override; -// std::string_view type() const noexcept override -// { -// return "Vertas Window Exception"; -// } -// winrt::hresult error_code() const noexcept -// { -// return hResult; -// } -// WIS_INLINE std::string description() const noexcept; -// -// private: -// winrt::hresult hResult; -// }; - -/// @brief Check if the given boolean is true, logging any errors and throwing a windows exception if it is not true -/// @param check Value to check -/// @param sl Source location -inline void check_windows(bool check, wis::source_location sl = wis::source_location::current()) -{ - if (check) - return; - throw last_windows_error(); -} - -} // namespace wis diff --git a/examples/custom/lut_windowed/window.cpp b/examples/custom/lut_windowed/window.cpp deleted file mode 100644 index 872ad081..00000000 --- a/examples/custom/lut_windowed/window.cpp +++ /dev/null @@ -1,498 +0,0 @@ -#include "window.h" -#include -#include "resource.h" -#include "util.h" - -// extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - -enum class MenuItems : UINT_PTR { - Load = ID_FILE_LOADMODEL, - Exit = ID_FILE_EXIT, - ShowGrid = ID_OPTIONS_DRAWGRID, - Style_VGUI = ID_STYLES_VGUI, - Style_Dark = ID_STYLES_DARK, - Style_Cherry = ID_STYLES_CHERRY, - PlayGame = ID_MODE_GAME, - About = ID_HELP_ABOUT, -}; - -INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - UNREFERENCED_PARAMETER(lParam); - switch (message) { - case WM_INITDIALOG: - return (INT_PTR)TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { - EndDialog(hDlg, LOWORD(wParam)); - return (INT_PTR)TRUE; - } - break; - } - return (INT_PTR)FALSE; -} - -Window::WindowClass Window::WindowClass::wndClass; - -Window::WindowClass::WindowClass() noexcept - : hInst(GetModuleHandle(nullptr)) -{ - WNDCLASSEXA wcWindow = { 0 }; - wcWindow.cbSize = sizeof(wcWindow); - wcWindow.style = CS_OWNDC; - wcWindow.lpfnWndProc = HandleMsgSetup; - wcWindow.cbClsExtra = 0; - wcWindow.cbWndExtra = 0; - wcWindow.hInstance = GetInstance(); - wcWindow.hCursor = LoadCursor(NULL, IDC_ARROW); - wcWindow.hIcon = LoadIcon(wcWindow.hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wcWindow.hbrBackground = nullptr; - wcWindow.lpszMenuName = MAKEINTRESOURCEA(IDR_MENU1); - wcWindow.hIconSm = nullptr; - wcWindow.lpszClassName = GetName(); - RegisterClassExA(&wcWindow); -} -Window::WindowClass::~WindowClass() -{ - UnregisterClassA(wndClassName, GetInstance()); -} -const char* Window::WindowClass::GetName() noexcept -{ - return wndClassName; -} -HINSTANCE Window::WindowClass::GetInstance() noexcept -{ - return wndClass.hInst; -} - -// Window namespace -Window::Window(unsigned int width, unsigned int height, const char* name) - : width(width), height(height) -{ - RECT rWindow; - rWindow.left = 100; - rWindow.right = width + rWindow.left; - rWindow.top = 100; - rWindow.bottom = height + rWindow.top; - // Automatic calculation of window height and width to client region - wis::check_windows(AdjustWindowRect(&rWindow, WS_OVERLAPPEDWINDOW, TRUE)); - - hWnd.reset(CreateWindowA( - WindowClass::GetName(), name, - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, - rWindow.right - rWindow.left, - rWindow.bottom - rWindow.top, - nullptr, nullptr, - WindowClass::GetInstance(), this)); - - // Error checks - wis::check_windows(!!hWnd); - ShowWindow(hWnd.get(), SW_SHOWDEFAULT); - - Accelerator.reset(LoadAccelerators(WindowClass::GetInstance(), MAKEINTRESOURCE(IDR_ACCELERATOR1))); - - // Init GUI (only one window supported) - // wis::check_windows(ImGui_ImplWin32_Init(hWnd.get())); - - RAWINPUTDEVICE rid; - rid.usUsagePage = 0x01; // mouse page - rid.usUsage = 0x02; // mouse usage - rid.dwFlags = 0; - rid.hwndTarget = nullptr; - wis::check_windows(RegisterRawInputDevices(&rid, 1, sizeof(rid))); -} -Window::~Window() -{ - // ImGui_ImplWin32_Shutdown(); -} - -void Window::ChangeToFullScreen() -{ - SetMenu(hWnd.get(), nullptr); - auto st = GetWindowLong(hWnd.get(), GWL_STYLE); - auto stex = GetWindowLong(hWnd.get(), GWL_EXSTYLE); - SetWindowLong(hWnd.get(), GWL_STYLE, - st & ~(WS_CAPTION | WS_THICKFRAME)); - SetWindowLong(hWnd.get(), GWL_EXSTYLE, - stex & ~(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)); - - MONITORINFO monitor_info; - monitor_info.cbSize = sizeof(monitor_info); - GetMonitorInfo(MonitorFromWindow(hWnd.get(), MONITOR_DEFAULTTONEAREST), - &monitor_info); - - RECT window_rect(monitor_info.rcMonitor); - SetWindowPos(hWnd.get(), NULL, window_rect.left, window_rect.top, - window_rect.right - window_rect.left, window_rect.bottom - window_rect.top, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); -} - -void Window::SetTitle(std::string_view title) -{ - wis::check_windows(SetWindowTextA(hWnd.get(), title.data())); -} - -void Window::EnableLoading() -{ - menu.EnableLoading(); -} - -void Window::EnableCursor() noexcept -{ - cursorEnabled = true; - ShowCursor(); - EnableImGuiMouse(); - FreeCursor(); -} -void Window::DisableCursor() noexcept -{ - cursorEnabled = false; - HideCursor(); - DisableImGuiMouse(); - ConfineCursor(); -} -bool Window::CursorEnabled() const noexcept -{ - return cursorEnabled; -} - -void Window::ConfineCursor() noexcept -{ - RECT rect; - GetClientRect(hWnd.get(), &rect); - MapWindowPoints(hWnd.get(), nullptr, reinterpret_cast(&rect), 2); - ClipCursor(&rect); -} -void Window::FreeCursor() noexcept -{ - ClipCursor(nullptr); -} -void Window::HideCursor() noexcept -{ - while (::ShowCursor(FALSE) >= 0) - ; - cursorShown = false; -} -void Window::ShowCursor() noexcept -{ - while (::ShowCursor(TRUE) < 0) - ; - cursorShown = true; -} -void Window::ShowImGuiMouse() noexcept -{ - if (!cursorShown) - ShowCursor(); -} -void Window::EnableImGuiMouse() noexcept -{ - // ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_NoMouse; -} -void Window::DisableImGuiMouse() noexcept -{ - // ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouse; -} - -std::optional Window::ProcessMessages() const noexcept -{ - MSG msg; - while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { - if (!TranslateAccelerator( - hWnd.get(), // handle to receiving window - Accelerator.get(), // handle to active accelerator table - &msg)) // message data - { - if (msg.message == WM_QUIT) { - return msg.wParam; - } - - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - if (!bActive) { - WaitMessage(); - } - return {}; -} -LRESULT WINAPI Window::HandleMsgSetup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - // Create routine initializer - if (msg == WM_NCCREATE) { - // Extract data from creation of window - const CREATESTRUCTW* const pCreate = reinterpret_cast(lParam); - Window* const pWnd = static_cast(pCreate->lpCreateParams); - // set WinAPI-managed user data to store ptr to win class - SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast(pWnd)); - // set msgproc to to non setup handle - SetWindowLongPtr(hWnd, GWLP_WNDPROC, reinterpret_cast(&Window::HandleMsgThunk)); - - return pWnd->HandleMsg(hWnd, msg, wParam, lParam); - } - return DefWindowProc(hWnd, msg, wParam, lParam); -} -LRESULT WINAPI Window::HandleMsgThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - // retrieve ptr to win class - Window* const pWnd = reinterpret_cast(GetWindowLongPtr(hWnd, GWLP_USERDATA)); - // forward msg to class handler - return pWnd->HandleMsg(hWnd, msg, wParam, lParam); -} -LRESULT Window::HandleMsg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - // if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) - //{ - // return true; - //} - // const auto& imio = ImGui::GetIO(); - - switch (msg) { - // we don't want the DefProc to handle this message because - // we want our destructor to destroy the window, so return 0 instead of break - case WM_CLOSE: - PostQuitMessage(0); - return 0; - // clear keystate when window loses focus to prevent input getting "stuck" - case WM_KILLFOCUS: - kbd.ClearState(); - break; - case WM_SYSCOMMAND: - if (wParam == SC_MINIMIZE) { - bActive = false; - } - if (wParam == SC_RESTORE) { - bActive = true; - } - break; - case WM_SIZE: - if (!LOWORD(lParam) || !HIWORD(lParam)) - break; - width = LOWORD(lParam); - height = HIWORD(lParam); - events.push(Event::Resize); - break; - case WM_CREATE: - menu.Initialize(GetMenu(hWnd)); - break; - case WM_COMMAND: - switch (MenuItems(LOWORD(wParam))) { - case MenuItems::Load: - menu.DisableLoading(); - events.push(Event::LoadAsset); - break; - case MenuItems::Exit: - PostQuitMessage(0); - return 0; - case MenuItems::ShowGrid: - menu.ToggleGrid(); - break; - // case MenuItems::Style_VGUI: - // if (menu.SetStyle(UT::Menu::Style::VGUI)) - // events.push(Event::Restyle); - // break; - // case MenuItems::Style_Dark: - // if (menu.SetStyle(UT::Menu::Style::Dark)) - // events.push(Event::Restyle); - // break; - // case MenuItems::Style_Cherry: - // if (menu.SetStyle(UT::Menu::Style::Cherry)) - // events.push(Event::Restyle); - // break; - case MenuItems::PlayGame: - events.push(Event::Play); - break; - case MenuItems::About: - DialogBox(WindowClass::GetInstance(), MAKEINTRESOURCE(IDD_DIALOG1), hWnd, About); - break; - default: - break; - } - break; - case WM_ACTIVATE: - // confine/free cursor on window to foreground/background if cursor disabled - if (!cursorEnabled) { - if (wParam & WA_ACTIVE) { - ConfineCursor(); - HideCursor(); - } else { - FreeCursor(); - ShowCursor(); - } - } - break; - - /*********** KEYBOARD MESSAGES ***********/ - case WM_KEYDOWN: - // syskey commands need to be handled to track ALT key (VK_MENU) and F10 - case WM_SYSKEYDOWN: - // stifle this keyboard message if imgui wants to capture - // if (imio.WantCaptureKeyboard) - //{ - // break; - //} - if (!(lParam & 0x40000000) || kbd.AutorepeatIsEnabled()) // filter autorepeat - { - kbd.OnKeyPressed(static_cast(wParam)); - } - break; - case WM_KEYUP: - case WM_SYSKEYUP: - // stifle this keyboard message if imgui wants to capture - // if (imio.WantCaptureKeyboard) - //{ - // break; - //} - kbd.OnKeyReleased(static_cast(wParam)); - break; - case WM_CHAR: - // stifle this keyboard message if imgui wants to capture - // if (imio.WantCaptureKeyboard) - //{ - // break; - //} - kbd.OnChar(static_cast(wParam)); - break; - /*********** END KEYBOARD MESSAGES ***********/ - - /************* MOUSE MESSAGES ****************/ - case WM_MOUSEMOVE: { - const POINTS pt = MAKEPOINTS(lParam); - // cursorless exclusive gets first dibs - if (!cursorEnabled) { - if (!mouse.IsInWindow()) { - SetCapture(hWnd); - mouse.OnMouseEnter(); - HideCursor(); - } - break; - } - // stifle this mouse message if imgui wants to capture - // if (imio.WantCaptureMouse) - //{ - // ShowImGuiMouse(); - // break; - //} - if (cursorShown && !cursorActive) - HideCursor(); - - // in client region -> log move, and log enter + capture mouse (if not previously in window) - if (pt.x >= 0 && pt.x < width && pt.y >= 0 && pt.y < height) { - mouse.OnMouseMove(pt.x, pt.y); - if (!mouse.IsInWindow()) { - SetCapture(hWnd); - mouse.OnMouseEnter(); - } - } - // not in client -> log move / maintain capture if button down - else { - if (wParam & (MK_LBUTTON | MK_RBUTTON)) { - mouse.OnMouseMove(pt.x, pt.y); - } - // button up -> release capture / log event for leaving - else { - ReleaseCapture(); - mouse.OnMouseLeave(); - } - } - break; - } - case WM_LBUTTONDOWN: { - SetForegroundWindow(hWnd); - if (!cursorEnabled) { - ConfineCursor(); - HideCursor(); - } - // stifle this mouse message if imgui wants to capture - // if (imio.WantCaptureMouse) - //{ - // break; - //} - const POINTS pt = MAKEPOINTS(lParam); - mouse.OnLeftPressed(pt.x, pt.y); - break; - } - case WM_RBUTTONDOWN: { - // stifle this mouse message if imgui wants to capture - // if (imio.WantCaptureMouse) - //{ - // break; - //} - const POINTS pt = MAKEPOINTS(lParam); - mouse.OnRightPressed(pt.x, pt.y); - break; - } - case WM_LBUTTONUP: { - const POINTS pt = MAKEPOINTS(lParam); - mouse.OnLeftReleased(pt.x, pt.y); - // release mouse if outside of window - if (pt.x < 0 || pt.x >= width || pt.y < 0 || pt.y >= height) { - ReleaseCapture(); - mouse.OnMouseLeave(); - } - break; - } - case WM_RBUTTONUP: { - const POINTS pt = MAKEPOINTS(lParam); - mouse.OnRightReleased(pt.x, pt.y); - // release mouse if outside of window - if (pt.x < 0 || pt.x >= width || pt.y < 0 || pt.y >= height) { - ReleaseCapture(); - mouse.OnMouseLeave(); - } - break; - } - case WM_MOUSEWHEEL: { - // stifle this mouse message if imgui wants to capture - // if (imio.WantCaptureMouse) - //{ - // break; - //} - const POINTS pt = MAKEPOINTS(lParam); - const int delta = GET_WHEEL_DELTA_WPARAM(wParam); - mouse.OnWheelDelta(pt.x, pt.y, delta); - break; - } - /************** END MOUSE MESSAGES **************/ - - /************** RAW MOUSE MESSAGES **************/ - case WM_INPUT: { - if (!mouse.RawEnabled()) { - break; - } - UINT size = 0; - // first get the size of the input data - if (GetRawInputData( - reinterpret_cast(lParam), - RID_INPUT, - nullptr, - &size, - sizeof(RAWINPUTHEADER)) == -1) { - // bail msg processing if error - break; - } - rawBuffer.resize(size); - // read in the input data - if (GetRawInputData( - reinterpret_cast(lParam), - RID_INPUT, - rawBuffer.data(), - &size, - sizeof(RAWINPUTHEADER)) != size) { - // bail msg processing if error - break; - } - // process the raw input data - auto& ri = reinterpret_cast(*rawBuffer.data()); - if (ri.header.dwType == RIM_TYPEMOUSE && - (ri.data.mouse.lLastX != 0 || ri.data.mouse.lLastY != 0)) { - mouse.OnRawDelta(ri.data.mouse.lLastX, ri.data.mouse.lLastY); - } - break; - } - /************** END RAW MOUSE MESSAGES **************/ - } - - return DefWindowProc(hWnd, msg, wParam, lParam); -} diff --git a/examples/custom/lut_windowed/window.h b/examples/custom/lut_windowed/window.h deleted file mode 100644 index d836332c..00000000 --- a/examples/custom/lut_windowed/window.h +++ /dev/null @@ -1,170 +0,0 @@ -#pragma once -#include "Keyboard.h" -#include "Mouse.h" -#include "Menu.h" -#include -#include -#include - -namespace ver { -class FileOpenDialog; -} - -enum class Event : uint8_t { - Resize, - Restyle, - LoadAsset, - Play, - Count -}; -constexpr inline auto operator+(Event e) -{ - return static_cast::type>(e); -} - -struct EventSet { - void push(Event e) - { - if (map[+e]) - return; - horizon[iter++] = e; - map.set(+e); - } - auto begin() - { - return horizon.begin(); - } - auto end() - { - return horizon.begin() + iter; - } - void clear() - { - iter = 0; - map.reset(); - } - std::array horizon{}; - std::bitset<+Event::Count> map{}; - uint8_t iter = 0; -}; - -class Window -{ - friend class ver::FileOpenDialog; - -public: - struct EventQueue { - public: - EventQueue(EventSet& events) - : events(events) { } - ~EventQueue() - { - events.clear(); - } - - public: - auto begin() - { - return events.begin(); - } - auto end() - { - return events.end(); - } - - private: - EventSet& events; - }; - -private: - class WindowClass - { - public: - static const char* GetName() noexcept; - static HINSTANCE GetInstance() noexcept; - - private: - WindowClass() noexcept; - ~WindowClass(); - WindowClass(const WindowClass&) = delete; - WindowClass& operator=(const WindowClass&) = delete; - static constexpr const char* wndClassName = "Veritas Direct3D Window"; - static Window::WindowClass wndClass; - HINSTANCE hInst; - }; - -public: - Window(unsigned int width, unsigned int height, const char* name); - ~Window(); - Window(const Window&) = delete; - Window& operator=(const Window&) = delete; - -public: - [[nodiscard]] EventQueue GetEvents() noexcept - { - return { events }; - } - void EnableLoading(); - - int GetWidth() const noexcept - { - return width; - } - int GetHeight() const noexcept - { - return height; - } - - bool DrawGrid() const noexcept - { - return menu.GridEnabled(); - } - - void EnableCursor() noexcept; - void HideCursor() noexcept; - void ShowCursor() noexcept; - void DisableCursor() noexcept; - bool CursorEnabled() const noexcept; - bool IsActive() const noexcept - { - return bActive; - } - void SetTitle(std::string_view title); - void ChangeToFullScreen(); - - HWND GetHandle() const noexcept - { - return hWnd.get(); - } - - std::optional ProcessMessages() const noexcept; - -private: - static LRESULT WINAPI HandleMsgSetup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - static LRESULT WINAPI HandleMsgThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - LRESULT HandleMsg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - - void ConfineCursor() noexcept; - void FreeCursor() noexcept; - void EnableImGuiMouse() noexcept; - void DisableImGuiMouse() noexcept; - void ShowImGuiMouse() noexcept; - -public: - Keyboard kbd; - Mouse mouse; - -private: - bool cursorEnabled = true; - bool cursorShown = false; - bool cursorActive = false; - bool bActive = true; - int width; - int height; - wil::unique_hwnd hWnd; - UT::Menu menu; - wil::unique_haccel Accelerator; - - std::vector rawBuffer; - EventSet events; -}; diff --git a/examples/custom/multimon/CMakeLists.txt b/examples/custom/multimon/CMakeLists.txt index 6e4c992a..0d13c1a8 100644 --- a/examples/custom/multimon/CMakeLists.txt +++ b/examples/custom/multimon/CMakeLists.txt @@ -26,8 +26,10 @@ add_executable( wis_install_deps(${PROJECT_NAME}) target_link_libraries( - ${PROJECT_NAME} PRIVATE wis::debug-headers wis::platform-headers - wis::extended-allocation-headers glm::glm Wil) + ${PROJECT_NAME} + PRIVATE wis::debug-headers wis::platform-headers + wis::descriptor-buffer-headers wis::extended-allocation-headers + glm::glm Wil) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23) target_include_directories(${PROJECT_NAME} PRIVATE ${fpng_SOURCE_DIR}/src) target_compile_definitions(${PROJECT_NAME} PRIVATE WISDOM_FORCE_VULKAN) diff --git a/examples/custom/multimon/transfer_node.cpp b/examples/custom/multimon/transfer_node.cpp index 06ea760e..32b32023 100644 --- a/examples/custom/multimon/transfer_node.cpp +++ b/examples/custom/multimon/transfer_node.cpp @@ -40,7 +40,8 @@ CreateTransferNode(wis::Adapter&& adapter) { wis::DeviceExtension* exts[]{ &node.ext_mem_host, - &node.ext_alloc + &node.ext_alloc, + &node.desc_buffer_ext }; auto [result, device] = wis::CreateDevice(adapter, exts, std::size(exts)); if (result.status != wis::Status::Ok) @@ -115,7 +116,7 @@ CreateTransferNode(wis::Adapter&& adapter) using namespace wis; wis::DescriptorTableEntry entries[] = { { - .type = wis::DescriptorType::ShaderResource, + .type = wis::DescriptorType::Texture, .bind_register = 0, .binding = 0, .count = 1, @@ -143,13 +144,13 @@ CreateTransferNode(wis::Adapter&& adapter) }, }; - wis::RootConstant constants[] = { + wis::PushConstant constants[] = { { .stage = wis::ShaderStages::Vertex, .size_bytes = 4 * sizeof(float), }, }; - auto [result, root] = node.transfer_device.CreateRootSignature(constants, 1, tables, sizeof(tables) / sizeof(tables[0])); + auto [result, root] = node.desc_buffer_ext.CreateRootSignature(constants, 1, nullptr, 0, tables, sizeof(tables) / sizeof(tables[0])); if (result.status != wis::Status::Ok) return std::unexpected(result.error); node.root_signature = std::move(root); @@ -157,15 +158,14 @@ CreateTransferNode(wis::Adapter&& adapter) // Create Pipeline { - wis::DataFormat attachment_formats[] = { wis::DataFormat::RGBA8Unorm }; - wis::GraphicsPipelineDesc desc{ .root_signature = node.root_signature, .shaders = { .vertex = node.vs, .pixel = node.ps }, .attachments = { - .attachment_formats = attachment_formats, + .attachment_formats = { wis::DataFormat::RGBA8Unorm }, .attachments_count = 1, - } + }, + .flags = wis::PipelineFlags::DescriptorBuffer, }; auto [res2, hpipeline] = node.transfer_device.CreateGraphicsPipeline(&desc); if (res2.status != wis::Status::Ok) @@ -195,15 +195,15 @@ CreateTransferNode(wis::Adapter&& adapter) // Create Descriptor Buffers { - auto table_alignment = node.transfer_device.GetDescriptorTableAlignment(wis::DescriptorHeapType::Descriptor); - auto unit_size = node.transfer_device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Descriptor); + auto table_alignment = node.desc_buffer_ext.GetDescriptorTableAlignment(wis::DescriptorHeapType::Descriptor); + auto unit_size = node.desc_buffer_ext.GetDescriptorSize(wis::DescriptorHeapType::Descriptor); - auto [res, hdesc] = node.transfer_device.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, unit_size); + auto [res, hdesc] = node.desc_buffer_ext.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, unit_size); if (res.status != wis::Status::Ok) return std::unexpected(res.error); - unit_size = node.transfer_device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Sampler); - auto [res2, hdesc2] = node.transfer_device.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, unit_size); + unit_size = node.desc_buffer_ext.GetDescriptorSize(wis::DescriptorHeapType::Sampler); + auto [res2, hdesc2] = node.desc_buffer_ext.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, unit_size); if (res2.status != wis::Status::Ok) return std::unexpected(res2.error); @@ -290,7 +290,7 @@ void TransferNode::VKImportFrame(wis::Size2D frame, void* mapping) texture_srv = std::move(srv); // write data to Descriptor Buffer - desc_buffer.WriteShaderResource2(0, 0, texture_srv); + desc_buffer.WriteShaderResource(0, 0, texture_srv); input_size = frame; std::ignore = cmd_list.Reset(); @@ -434,9 +434,8 @@ void TransferNode::Frame() }; cmd_list.TextureBarriers(input_barriers, std::size(input_barriers)); - wis::DescriptorBufferView desc_buffer_views[]{ desc_buffer, sampler_buffer }; - cmd_list.SetDescriptorBuffers(desc_buffer_views, 2); cmd_list.SetRootSignature(root_signature); + desc_buffer_ext.SetDescriptorBuffers(cmd_list, desc_buffer, sampler_buffer); // Render Pass 1 wis::RenderPassRenderTargetDesc rprtdesc{ @@ -458,9 +457,9 @@ void TransferNode::Frame() float size[2]; } rc{ { 0.0f, 0.0f }, { 0.5, 1 } }; - cmd_list.SetRootConstants(&rc, sizeof(rc) / 4, 0, wis::ShaderStages::Vertex); - cmd_list.SetDescriptorTableOffset(0, desc_buffer, 0); - cmd_list.SetDescriptorTableOffset(1, sampler_buffer, 0); + cmd_list.SetPushConstants(&rc, sizeof(rc) / 4, 0, wis::ShaderStages::Vertex); + desc_buffer_ext.SetDescriptorTableOffset(cmd_list, root_signature, 0, desc_buffer, 0); + desc_buffer_ext.SetDescriptorTableOffset(cmd_list, root_signature, 1, sampler_buffer, 0); cmd_list.DrawInstanced(3, 1, 0, 0); cmd_list.EndRenderPass(); @@ -473,9 +472,9 @@ void TransferNode::Frame() cmd_list.RSSetScissor({ 0, 0, int(frame_size[1].width), int(frame_size[1].height) }); rc.offset[0] = 0.5f; - cmd_list.SetRootConstants(&rc, sizeof(rc) / 4, 0, wis::ShaderStages::Vertex); - cmd_list.SetDescriptorTableOffset(0, desc_buffer, 0); - cmd_list.SetDescriptorTableOffset(1, sampler_buffer, 0); + cmd_list.SetPushConstants(&rc, sizeof(rc) / 4, 0, wis::ShaderStages::Vertex); + desc_buffer_ext.SetDescriptorTableOffset(cmd_list, root_signature, 0, desc_buffer, 0); + desc_buffer_ext.SetDescriptorTableOffset(cmd_list, root_signature, 1, sampler_buffer, 0); cmd_list.DrawInstanced(3, 1, 0, 0); cmd_list.EndRenderPass(); diff --git a/examples/custom/multimon/transfer_node.h b/examples/custom/multimon/transfer_node.h index c160b613..09f594cf 100644 --- a/examples/custom/multimon/transfer_node.h +++ b/examples/custom/multimon/transfer_node.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include #include #include @@ -177,6 +178,7 @@ struct TransferNode { wis::Size2D frame_size[2]; wis::ExtendedAllocation ext_alloc; + wis::DescriptorBufferExtension desc_buffer_ext; wis::Device transfer_device; wis::ResourceAllocator allocator; wis::SwapChain swap[2]; diff --git a/examples/custom/multimon/work_node.cpp b/examples/custom/multimon/work_node.cpp index 4827ba2f..a8729882 100644 --- a/examples/custom/multimon/work_node.cpp +++ b/examples/custom/multimon/work_node.cpp @@ -64,6 +64,7 @@ CreateWorkNode(wis::Adapter&& adapter) WorkNode node{}; wis::DeviceExtension* extensions[] = { &node.extended_alloc, + &node.desc_buffer_ext }; // Create Device @@ -222,13 +223,13 @@ CreateWorkNode(wis::Adapter&& adapter) using namespace wis; wis::DescriptorTableEntry entries[] = { { - .type = wis::DescriptorType::ShaderResource, + .type = wis::DescriptorType::Texture, .bind_register = 0, .binding = 0, .count = 1, }, { - .type = wis::DescriptorType::ShaderResource, + .type = wis::DescriptorType::Texture, .bind_register = 1, .binding = 1, .count = 1, @@ -256,7 +257,7 @@ CreateWorkNode(wis::Adapter&& adapter) }, }; - auto [result, root] = node.work_device.CreateRootSignature(nullptr, 0, tables, sizeof(tables) / sizeof(tables[0])); + auto [result, root] = node.desc_buffer_ext.CreateRootSignature(nullptr, 0, nullptr, 0, tables, sizeof(tables) / sizeof(tables[0])); if (result.status != wis::Status::Ok) return std::unexpected(result.error); node.root = std::move(root); @@ -264,15 +265,14 @@ CreateWorkNode(wis::Adapter&& adapter) // Create Pipeline { - wis::DataFormat attachment_formats[] = { wis::DataFormat::RGBA8Unorm }; - wis::GraphicsPipelineDesc desc{ .root_signature = node.root, .shaders = { .vertex = node.vertex_shader, .pixel = node.pixel_shader }, .attachments = { - .attachment_formats = attachment_formats, + .attachment_formats = { wis::DataFormat::RGBA8Unorm }, .attachments_count = 1, - } + }, + .flags = wis::PipelineFlags::DescriptorBuffer, }; auto [res2, hpipeline] = node.work_device.CreateGraphicsPipeline(&desc); if (res2.status != wis::Status::Ok) @@ -298,17 +298,24 @@ CreateWorkNode(wis::Adapter&& adapter) // Create Descriptor Buffers { - auto [res, hdesc] = node.work_device.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, 2); + uint32_t al_d = node.desc_buffer_ext.GetDescriptorTableAlignment(wis::DescriptorHeapType::Descriptor); + uint32_t al_s = node.desc_buffer_ext.GetDescriptorTableAlignment(wis::DescriptorHeapType::Sampler); + uint32_t inc_d = node.desc_buffer_ext.GetDescriptorSize(wis::DescriptorHeapType::Descriptor); + uint32_t inc_s = node.desc_buffer_ext.GetDescriptorSize(wis::DescriptorHeapType::Sampler); + + auto desc_size = wis::detail::aligned_size(inc_d * 2, al_d); + auto [res, hdesc] = node.desc_buffer_ext.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, desc_size); if (res.status != wis::Status::Ok) return std::unexpected(res.error); - auto [res2, hdesc2] = node.work_device.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, 1); + auto sampler_size = wis::detail::aligned_size(inc_s, al_s); + auto [res2, hdesc2] = node.desc_buffer_ext.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, sampler_size); if (res2.status != wis::Status::Ok) return std::unexpected(res2.error); // Set Descriptor Buffers - hdesc.WriteShaderResource2(0, 1, node.srv); - hdesc.WriteShaderResource2(0, 0, node.srv_lut); + hdesc.WriteShaderResource(0, 1, node.srv); + hdesc.WriteShaderResource(0, 0, node.srv_lut); hdesc2.WriteSampler(0, 0, node.sampler); @@ -444,11 +451,10 @@ void WorkNode::Frame() cmd_list.BeginRenderPass(&rpdesc); cmd_list.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); cmd_list.SetRootSignature(root); - - wis::DescriptorBufferView desc_buffers[] = { desc_buffer, sampler_buffer }; - cmd_list.SetDescriptorBuffers(desc_buffers, std::size(desc_buffers)); - cmd_list.SetDescriptorTableOffset(0, desc_buffer, 0); - cmd_list.SetDescriptorTableOffset(1, sampler_buffer, 0); + ; + desc_buffer_ext.SetDescriptorBuffers(cmd_list, desc_buffer, sampler_buffer); + desc_buffer_ext.SetDescriptorTableOffset(cmd_list, root, 0, desc_buffer, 0); + desc_buffer_ext.SetDescriptorTableOffset(cmd_list, root, 1, sampler_buffer, 0); cmd_list.RSSetViewport({ 0, 0, float(width), float(height), 0, 1 }); cmd_list.RSSetScissor({ 0, 0, int(width), int(height) }); diff --git a/examples/custom/multimon/work_node.h b/examples/custom/multimon/work_node.h index c1eb4d1f..b68643c8 100644 --- a/examples/custom/multimon/work_node.h +++ b/examples/custom/multimon/work_node.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include struct WorkNode { @@ -29,6 +30,7 @@ struct WorkNode { wis::Device work_device; wis::ExtendedAllocation extended_alloc; + wis::DescriptorBufferExtension desc_buffer_ext; wis::ResourceAllocator allocator; wis::Texture lut; diff --git a/examples/deps/CMakeLists.txt b/examples/deps/CMakeLists.txt deleted file mode 100644 index 506f8c22..00000000 --- a/examples/deps/CMakeLists.txt +++ /dev/null @@ -1,81 +0,0 @@ -include(FetchContent) -set(FETCHCONTENT_UPDATES_DISCONNECTED ON) - -if(WISDOM_WINDOWS) - find_program( - NUGET_EXE - NAMES nuget - PATHS ${CMAKE_CURRENT_SOURCE_DIR}/NuGet) - if(NOT NUGET_EXE) - message("NUGET.EXE not found.") - message(FATAL_ERROR "Please install this executable, and run CMake again.") - endif() - - # Windows Implementation Library (WIL) - message("Loading WIL...") - load_nuget_dependency(${NUGET_EXE} "Microsoft.Windows.ImplementationLibrary" - WIL ${CMAKE_CURRENT_BINARY_DIR}) - - set(wil_SOURCES - ${WIL_DIR} - CACHE INTERNAL "") - add_library(Wil INTERFACE) - target_include_directories( - Wil SYSTEM BEFORE INTERFACE $ - $) -endif() - -# glm -find_package(glm QUIET) -if(NOT glm_FOUND) - FetchContent_Declare( - glm - GIT_REPOSITORY https://github.com/g-truc/glm - GIT_TAG master) - FetchContent_GetProperties(glm) - if(NOT glm_POPULATED) - FetchContent_Populate(glm) - # Disable tinyxml2 installation - add_subdirectory(${glm_SOURCE_DIR} ${glm_BINARY_DIR} EXCLUDE_FROM_ALL) - endif() -else() - -endif() - -# KDAB KDUtils -if(NOT WISDOM_WINDOWS_STORE AND NOT WISDOM_EXCLUDE_KDGUI) - set(BUILD_SHARED_LIBS OFF) - set(KDUTILS_BUILD_TESTS OFF) - - find_package(KDUtils CONFIG QUIET) - if(NOT KDUtils_FOUND) - FetchContent_Declare( - KDUtils - GIT_REPOSITORY https://github.com/KDAB/KDUtils.git - GIT_TAG main) - - set(SPDLOG_FMT_EXTERNAL_HO - ON - CACHE BOOL "" FORCE) - FetchContent_GetProperties(KDUtils) - if(NOT KDUtils_POPULATED) - FetchContent_Populate(KDUtils) - add_subdirectory(${kdutils_SOURCE_DIR} ${kdutils_BINARY_DIR} - EXCLUDE_FROM_ALL) - endif() - endif() -endif() - -# fpng for PNG loading -FetchContent_Declare( - fpng - GIT_REPOSITORY https://github.com/richgel999/fpng - GIT_TAG main) -set(SSE ON) -FetchContent_GetProperties(fpng) -if(NOT fpng_POPULATED) - FetchContent_Populate(fpng) - set(fpng_SOURCE_DIR - ${fpng_SOURCE_DIR} - PARENT_SCOPE) -endif() diff --git a/examples/platform/CMakeLists.txt b/examples/platform/CMakeLists.txt deleted file mode 100644 index 7664bdfa..00000000 --- a/examples/platform/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -add_subdirectory(shared) - -# only winrt is supported on windows store apps -if(WISDOM_WINDOWS_STORE) - # add_subdirectory(hello-triangle-winrt) -else() - if(NOT WISDOM_EXCLUDE_KDGUI) - add_subdirectory(hello-triangle-kdgui-t) - endif() - if(WISDOM_WINDOWS) - add_subdirectory(hello-triangle-win32-t) - endif() -endif() diff --git a/examples/platform/hello-triangle-kdgui-t/CMakeLists.txt b/examples/platform/hello-triangle-kdgui-t/CMakeLists.txt deleted file mode 100644 index 2f4c9656..00000000 --- a/examples/platform/hello-triangle-kdgui-t/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -project(hello-triangle-kdgui-t) - -find_package(KDUtils CONFIG) -find_package(KDFoundation CONFIG) -find_package(KDGui CONFIG) - -add_executable(${PROJECT_NAME} entry_main.cpp "window.h" "window.cpp") - -wis_install_deps(${PROJECT_NAME}) - -target_link_libraries( - ${PROJECT_NAME} - PUBLIC PlatformExamplesShared - PRIVATE KDUtils::KDGui KDUtils::KDUtils wis::platform) -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) -target_compile_definitions( - ${PROJECT_NAME} PUBLIC SHADER_DIR="${SHADER_DIR}" GLM_FORCE_SIMD_AVX2 - GLM_FORCE_ALIGNED_GENTYPES) - -if(UNIX) - target_link_options(${PROJECT_NAME} PRIVATE "-lm") -endif() diff --git a/examples/platform/hello-triangle-kdgui-t/entry_main.cpp b/examples/platform/hello-triangle-kdgui-t/entry_main.cpp deleted file mode 100644 index 502df914..00000000 --- a/examples/platform/hello-triangle-kdgui-t/entry_main.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// #include "app.h" -#include -#include -#include "window.h" - -#include - -int main() -{ - XApp app; - Window window = app.createWindow(1920, 1080); - - std::array required_extensions = { - window.GetFactoryExtension() - }; - Test::App gfx_app(required_extensions); - - auto [res, chain] = window.CreateSwapchain(gfx_app.GetDevice(), gfx_app.GetQueue()); - if (res.status != wis::Status::Ok) { - std::cerr << "Failed to create swapchain" << std::endl; - return 1; - } - - gfx_app.SetSwapChain(std::move(chain), window.width(), window.height()); - gfx_app.CreateResources(); - - while (true) { - app.ProcessEvents(); - if (!window.visible()) { - break; - } - - if (window.resized()) { - gfx_app.OnResize(window.width(), window.height()); - } - gfx_app.Frame(); - } - return 0; -} diff --git a/examples/platform/hello-triangle-kdgui-t/window.cpp b/examples/platform/hello-triangle-kdgui-t/window.cpp deleted file mode 100644 index e30ef97d..00000000 --- a/examples/platform/hello-triangle-kdgui-t/window.cpp +++ /dev/null @@ -1,142 +0,0 @@ -#include // for KD_PLATFORM -#include -#include -#include -#include - -// #if defined(KD_PLATFORM_WIN32) && WISDOM_LINUX -// #error WSL is not supported with KDGui -// #endif - -#if defined(KD_PLATFORM_WIN32) -#include -#endif -#if defined(KD_PLATFORM_LINUX) -#include -#include -#include -#endif -#include "window.h" - -enum class Platform { - Win32, - Xcb, - Wayland, -}; - -class WindowP : public KDGui::Window -{ -public: - virtual void resizeEvent(KDFoundation::ResizeEvent* ev) override - { - resized = true; - KDGui::Window::resizeEvent(ev); - } - bool resized = false; - std::unique_ptr ext; // Platform specific extension - Platform platform = Platform::Win32; -}; - -Window::Window(uint32_t width, uint32_t height, WindowP* p) - : p(p) -{ - p->width = width; - p->height = height; - p->visible = true; - -#ifdef KD_PLATFORM_WIN32 - p->ext = std::make_unique(); -#elif defined(KD_PLATFORM_LINUX) - if (KDGui::LinuxWaylandPlatformIntegration::checkAvailable()) { - p->ext = std::make_unique(); - p->platform = Platform::Wayland; - } else { - p->ext = std::make_unique(); - p->platform = Platform::Xcb; - } -#endif // KD_PLATFORM_WIN32 -} -Window::~Window() -{ - p->destroy(); -} - -uint32_t Window::width() const noexcept -{ - return p->width.get(); -} -uint32_t Window::height() const noexcept -{ - return p->height.get(); -} - -wis::FactoryExtension* -Window::GetFactoryExtension() noexcept -{ - return p->ext.get(); -} - -wis::ResultValue -Window::CreateSwapchain(const wis::Device& device, const wis::CommandQueue& queue) const noexcept -{ - wis::SwapchainDesc desc{ - .size = { width(), height() }, - .format = wis::DataFormat::BGRA8Unorm, - .buffer_count = 2, - .stereo = false, - .vsync = true, - }; - -#if defined(KD_PLATFORM_WIN32) - auto win32Window = dynamic_cast(p->platformWindow()); - return static_cast(p->ext.get())->CreateSwapchain(device, queue, &desc, win32Window->handle()); -#elif defined(KD_PLATFORM_LINUX) - if (p->platform == Platform::Wayland) { - auto* platformIntegration = KDGui::GuiApplication::instance()->guiPlatformIntegration(); - auto* waylandPlatformIntegration = dynamic_cast(platformIntegration); - auto* waylandWindow = dynamic_cast(p->platformWindow()); - - return static_cast(p->ext.get()) - ->CreateSwapchain(device, queue, &desc, waylandPlatformIntegration->display(), waylandWindow->surface()); - } else { - auto* xcbWindow = dynamic_cast(p->platformWindow()); - return static_cast(p->ext.get()) - ->CreateSwapchain(device, queue, &desc, xcbWindow->connection(), xcbWindow->handle()); - } -#endif - return wis::Result{ - wis::Status::InvalidArgument, - "No platform was selected" - }; -} -bool Window::resized() const noexcept -{ - return std::exchange(p->resized, false); -} -bool Window::visible() const noexcept -{ - return p->visible.get(); -} - -class XAppP -{ -public: - KDGui::GuiApplication app; -}; - -XApp::XApp() - : p(new XAppP()) -{ -} -XApp::~XApp() -{ -} - -void XApp::ProcessEvents() -{ - p->app.processEvents(); -} -Window XApp::createWindow(uint32_t width, uint32_t height) -{ - return Window(width, height, p->app.createChild()); -} diff --git a/examples/platform/hello-triangle-kdgui-t/window.h b/examples/platform/hello-triangle-kdgui-t/window.h deleted file mode 100644 index a279ea46..00000000 --- a/examples/platform/hello-triangle-kdgui-t/window.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - This file is part of KDGpu. - - SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company - - SPDX-License-Identifier: MIT - - Contact KDAB at for commercial licensing options. -*/ - -#pragma once -#include -#include - -class WindowP; -class Window -{ - friend class XApp; - -private: - Window(uint32_t width, uint32_t height, WindowP* p); - -public: - ~Window(); - - [[nodiscard]] bool visible() const noexcept; - [[nodiscard]] uint32_t width() const noexcept; - [[nodiscard]] uint32_t height() const noexcept; - - [[nodiscard]] wis::FactoryExtension* - GetFactoryExtension() noexcept; - - [[nodiscard]] wis::ResultValue - CreateSwapchain(const wis::Device& device, const wis::CommandQueue& queue) const noexcept; - - [[nodiscard]] bool resized() const noexcept; - -private: - WindowP* p; -}; - -class XAppP; -class XApp -{ -public: - XApp(); - ~XApp(); - - void ProcessEvents(); - Window createWindow(uint32_t width, uint32_t height); - -private: - std::unique_ptr p; -}; diff --git a/examples/platform/hello-triangle-win32-t/CMakeLists.txt b/examples/platform/hello-triangle-win32-t/CMakeLists.txt deleted file mode 100644 index 71d5e90e..00000000 --- a/examples/platform/hello-triangle-win32-t/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -# CMakeList.txt : CMake project for Wisdom, include source and define project -# specific logic here. -# -project(Example) - -# Add source to this project's executable. -add_executable(${PROJECT_NAME} "resources/WinD3D.rc" "include/example/util.h") - -wis_install_deps(${PROJECT_NAME}) - -set(SOURCES "src/entry_main.cpp" "src/keyboard.cpp" "src/mouse.cpp" - "src/window.cpp" "src/util.cpp") -set(HEADERS - "include/example/keyboard.h" "include/example/menu.h" - "include/example/mouse.h" "include/example/window.h" "include/resource.h" - "include/example/util.h") - -target_sources( - ${PROJECT_NAME} - PRIVATE ${SOURCES} - PUBLIC ${HEADERS}) - -target_link_libraries(${PROJECT_NAME} PUBLIC PlatformExamplesShared Wil - wis::platform) - -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) - -target_include_directories(${PROJECT_NAME} - PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/examples/platform/hello-triangle-win32-t/include/example/keyboard.h b/examples/platform/hello-triangle-win32-t/include/example/keyboard.h deleted file mode 100644 index 277f576f..00000000 --- a/examples/platform/hello-triangle-win32-t/include/example/keyboard.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once -#include -#include -#include - -class Keyboard -{ - friend class Window; - -public: - class Event - { - public: - enum class Type { - Press, - Release, - }; - - private: - Type type; - unsigned char code; - - public: - Event(Type type, unsigned char code) noexcept - : type(type), code(code) - { - } - bool IsPress() const noexcept - { - return type == Type::Press; - } - bool IsRelease() const noexcept - { - return type == Type::Release; - } - unsigned char GetCode() const noexcept - { - return code; - } - }; - -public: - Keyboard() = default; - Keyboard(const Keyboard&) = delete; - Keyboard& operator=(const Keyboard&) = delete; - // key event stuff - bool KeyIsPressed(unsigned char keycode) const noexcept; - std::optional ReadKey() noexcept; - bool KeyIsEmpty() const noexcept; - void FlushKey() noexcept; - // char event stuff - std::optional ReadChar() noexcept; - bool CharIsEmpty() const noexcept; - void FlushChar() noexcept; - void Flush() noexcept; - // autorepeat control - void EnableAutorepeat() noexcept; - void DisableAutorepeat() noexcept; - bool AutorepeatIsEnabled() const noexcept; - -private: - void OnKeyPressed(unsigned char keycode) noexcept; - void OnKeyReleased(unsigned char keycode) noexcept; - void OnChar(char character) noexcept; - void ClearState() noexcept; - template - static void TrimBuffer(std::queue& buffer) noexcept; - -private: - static constexpr unsigned int nKeys = 256u; - static constexpr unsigned int bufferSize = 16u; - bool autorepeatEnabled = false; - std::bitset keystates; - std::queue keybuffer; - std::queue charbuffer; -}; diff --git a/examples/platform/hello-triangle-win32-t/include/example/menu.h b/examples/platform/hello-triangle-win32-t/include/example/menu.h deleted file mode 100644 index baa1b69d..00000000 --- a/examples/platform/hello-triangle-win32-t/include/example/menu.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once -#include - -namespace UT { -class Menu -{ -public: - enum class Mode { - Image, - Video, - Model, - Game - }; - -public: - Menu() = default; - -public: - void Initialize(HMENU menu) noexcept - { - main_menu.reset(menu); - file.reset(GetSubMenu(menu, 0)); - view.reset(GetSubMenu(menu, 1)); - mode.reset(GetSubMenu(menu, 2)); - styles.reset(GetSubMenu(view.get(), 1)); - } - void EnableLoading() noexcept - { - EnableMenuItem(file.get(), 0, MF_BYPOSITION | MF_ENABLED); - } - void DisableLoading() noexcept - { - EnableMenuItem(file.get(), 0, MF_BYPOSITION | MF_DISABLED); - } - void ToggleGrid() noexcept - { - grid_enabled ^= 1; - MENUITEMINFO mii{ - .cbSize = sizeof(MENUITEMINFO), - .fMask = MIIM_STATE, - .fState = UINT(grid_enabled ? MFS_CHECKED : MFS_UNCHECKED) - }; - SetMenuItemInfo(view.get(), 0, true, &mii); - } - bool GridEnabled() const noexcept - { - return grid_enabled; - } - -private: - wil::unique_hmenu main_menu; - wil::unique_hmenu file; - wil::unique_hmenu view; - wil::unique_hmenu styles; - wil::unique_hmenu mode; - - bool grid_enabled = false; -}; -} // namespace UT diff --git a/examples/platform/hello-triangle-win32-t/include/example/mouse.h b/examples/platform/hello-triangle-win32-t/include/example/mouse.h deleted file mode 100644 index 59f3f951..00000000 --- a/examples/platform/hello-triangle-win32-t/include/example/mouse.h +++ /dev/null @@ -1,149 +0,0 @@ -#pragma once -#include -#include -#include - -class Mouse -{ - friend class Window; - -public: - struct RawDelta { - int x, y; - }; - class Event - { - public: - enum class Type { - LPress, - LRelease, - RPress, - RRelease, - WheelUp, - WheelDown, - Move, - Enter, - Leave, - }; - - private: - Type type; - bool leftIsPressed; - bool rightIsPressed; - int x; - int y; - - public: - Event(Type type, const Mouse& parent) noexcept - : type(type), leftIsPressed(parent.leftIsPressed), rightIsPressed(parent.rightIsPressed), x(parent.x), y(parent.y) - { - } - Type GetType() const noexcept - { - return type; - } - std::pair GetPos() const noexcept - { - return { x, y }; - } - int GetPosX() const noexcept - { - return x; - } - int GetPosY() const noexcept - { - return y; - } - bool LeftIsPressed() const noexcept - { - return leftIsPressed; - } - bool RightIsPressed() const noexcept - { - return rightIsPressed; - } - }; - -public: - Mouse() = default; - Mouse(const Mouse&) = delete; - Mouse& operator=(const Mouse&) = delete; - std::pair GetPos() const noexcept - { - return { x, y }; - } - std::optional ReadRawDelta() noexcept; - int GetPosX() const noexcept - { - return x; - } - int GetPosY() const noexcept - { - return y; - } - bool IsInWindow() const noexcept - { - return isInWindow; - } - bool LeftIsPressed() const noexcept - { - return leftIsPressed; - } - bool RightIsPressed() const noexcept - { - return rightIsPressed; - } - std::optional Read() noexcept; - bool IsEmpty() const noexcept - { - return buffer.empty(); - } - void Flush() noexcept - { - buffer = std::queue(); - } - void BoundCursor(int width, int height) noexcept - { - x = std::clamp(x, 0, width - 1); - y = std::clamp(y, 0, height - 1); - } - void EnableRaw() noexcept - { - rawEnabled = true; - } - void DisableRaw() noexcept - { - rawEnabled = false; - } - bool RawEnabled() const noexcept - { - return rawEnabled; - } - -private: - void OnMouseMove(int x, int y) noexcept; - void OnMouseLeave() noexcept; - void OnMouseEnter() noexcept; - void OnRawDelta(int dx, int dy) noexcept; - void OnLeftPressed(int x, int y) noexcept; - void OnLeftReleased(int x, int y) noexcept; - void OnRightPressed(int x, int y) noexcept; - void OnRightReleased(int x, int y) noexcept; - void OnWheelUp(int x, int y) noexcept; - void OnWheelDown(int x, int y) noexcept; - void TrimBuffer() noexcept; - void TrimRawInputBuffer() noexcept; - void OnWheelDelta(int x, int y, int delta) noexcept; - -private: - static constexpr unsigned int bufferSize = 16u; - int x; - int y; - bool leftIsPressed = false; - bool rightIsPressed = false; - bool isInWindow = false; - int wheelDeltaCarry = 0; - bool rawEnabled = false; - std::queue buffer; - std::queue rawDeltaBuffer; -}; diff --git a/examples/platform/hello-triangle-win32-t/include/example/util.h b/examples/platform/hello-triangle-win32-t/include/example/util.h deleted file mode 100644 index 8939a053..00000000 --- a/examples/platform/hello-triangle-win32-t/include/example/util.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once -#include -#include - -// #include -// #include - -namespace wis { -/// @brief Get the last windows error -/// @return HRESULT of the last windows error -HRESULT last_windows_error() noexcept; - -// class hr_exception : public wis::exception -//{ -// public: -// WIS_INLINE hr_exception(winrt::hresult hr, wis::source_location sl = wis::source_location::current()); -// -// WIS_INLINE const char* what() const noexcept override; -// std::string_view type() const noexcept override -// { -// return "Vertas Window Exception"; -// } -// winrt::hresult error_code() const noexcept -// { -// return hResult; -// } -// WIS_INLINE std::string description() const noexcept; -// -// private: -// winrt::hresult hResult; -// }; - -/// @brief Check if the given boolean is true, logging any errors and throwing a windows exception if it is not true -/// @param check Value to check -/// @param sl Source location -inline void check_windows(bool check, wis::source_location sl = wis::source_location::current()) -{ - if (check) - return; - throw last_windows_error(); -} - -} // namespace wis diff --git a/examples/platform/hello-triangle-win32-t/include/example/window.h b/examples/platform/hello-triangle-win32-t/include/example/window.h deleted file mode 100644 index d836332c..00000000 --- a/examples/platform/hello-triangle-win32-t/include/example/window.h +++ /dev/null @@ -1,170 +0,0 @@ -#pragma once -#include "Keyboard.h" -#include "Mouse.h" -#include "Menu.h" -#include -#include -#include - -namespace ver { -class FileOpenDialog; -} - -enum class Event : uint8_t { - Resize, - Restyle, - LoadAsset, - Play, - Count -}; -constexpr inline auto operator+(Event e) -{ - return static_cast::type>(e); -} - -struct EventSet { - void push(Event e) - { - if (map[+e]) - return; - horizon[iter++] = e; - map.set(+e); - } - auto begin() - { - return horizon.begin(); - } - auto end() - { - return horizon.begin() + iter; - } - void clear() - { - iter = 0; - map.reset(); - } - std::array horizon{}; - std::bitset<+Event::Count> map{}; - uint8_t iter = 0; -}; - -class Window -{ - friend class ver::FileOpenDialog; - -public: - struct EventQueue { - public: - EventQueue(EventSet& events) - : events(events) { } - ~EventQueue() - { - events.clear(); - } - - public: - auto begin() - { - return events.begin(); - } - auto end() - { - return events.end(); - } - - private: - EventSet& events; - }; - -private: - class WindowClass - { - public: - static const char* GetName() noexcept; - static HINSTANCE GetInstance() noexcept; - - private: - WindowClass() noexcept; - ~WindowClass(); - WindowClass(const WindowClass&) = delete; - WindowClass& operator=(const WindowClass&) = delete; - static constexpr const char* wndClassName = "Veritas Direct3D Window"; - static Window::WindowClass wndClass; - HINSTANCE hInst; - }; - -public: - Window(unsigned int width, unsigned int height, const char* name); - ~Window(); - Window(const Window&) = delete; - Window& operator=(const Window&) = delete; - -public: - [[nodiscard]] EventQueue GetEvents() noexcept - { - return { events }; - } - void EnableLoading(); - - int GetWidth() const noexcept - { - return width; - } - int GetHeight() const noexcept - { - return height; - } - - bool DrawGrid() const noexcept - { - return menu.GridEnabled(); - } - - void EnableCursor() noexcept; - void HideCursor() noexcept; - void ShowCursor() noexcept; - void DisableCursor() noexcept; - bool CursorEnabled() const noexcept; - bool IsActive() const noexcept - { - return bActive; - } - void SetTitle(std::string_view title); - void ChangeToFullScreen(); - - HWND GetHandle() const noexcept - { - return hWnd.get(); - } - - std::optional ProcessMessages() const noexcept; - -private: - static LRESULT WINAPI HandleMsgSetup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - static LRESULT WINAPI HandleMsgThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - LRESULT HandleMsg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - - void ConfineCursor() noexcept; - void FreeCursor() noexcept; - void EnableImGuiMouse() noexcept; - void DisableImGuiMouse() noexcept; - void ShowImGuiMouse() noexcept; - -public: - Keyboard kbd; - Mouse mouse; - -private: - bool cursorEnabled = true; - bool cursorShown = false; - bool cursorActive = false; - bool bActive = true; - int width; - int height; - wil::unique_hwnd hWnd; - UT::Menu menu; - wil::unique_haccel Accelerator; - - std::vector rawBuffer; - EventSet events; -}; diff --git a/examples/platform/hello-triangle-win32-t/include/pch.h b/examples/platform/hello-triangle-win32-t/include/pch.h deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/platform/hello-triangle-win32-t/include/resource.h b/examples/platform/hello-triangle-win32-t/include/resource.h deleted file mode 100644 index 65a793d0..00000000 --- a/examples/platform/hello-triangle-win32-t/include/resource.h +++ /dev/null @@ -1 +0,0 @@ -#include "../resources/resource.h" diff --git a/examples/platform/hello-triangle-win32-t/resources/TLR.ico b/examples/platform/hello-triangle-win32-t/resources/TLR.ico deleted file mode 100644 index 2c0850a675e1869846f09af20dbc076c2db0a71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212907 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ⅇ1xBENm%>ecNxe)#*V*Pnm;+xPCQ4hJ4< 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�iO9Rr`HCO156WvM@=C1iu0xIK-?w!NE5Te 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 AIsgCw diff --git a/examples/platform/hello-triangle-win32-t/resources/WinD3D.rc b/examples/platform/hello-triangle-win32-t/resources/WinD3D.rc deleted file mode 100644 index ae75b1242b9b158da5b4fd3358a8aaaea999dc99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9944 zcmdT~ZBH9V5S|bBsZynU?uY8)NKv9t2#^Gls;!J|95)6mY?C0NT9mia0!DsGiqzlU z_IYMK+}`=_3{IZT#Jm4fHheZ1WRC z@h(GWZ76lfB`M=mNU1NESpNvpp&U9`^#}ZIVAU0@lk%vce+73^BeQkzN#*P4;_@$^ z#0-(Mjxl6KOFG56=d%ryyzwnoYv@7=gGx}w^(I&kUI(E(LC^QvvmWdOPgC?h^t|X? zCG;@nO~>F-mQC1^^P)C9rVD?nz><2frzS4){R3B+N!bC9U05x7bm4DLb=D?&x6#{0 zTUX1p9vjz&?Q+Zlc(*Zb1G70A&RqkpGJ2b^amv7Ho2$syHhp0aYj_9hs!|k7mp&TP ztF>7kZQt4QUWT-?e4pPpu=ct}1-`**^h%Gi2l9LpX={+2lNhNOL*|(yExMOvI<}PL z05R$Sp6lX#gfa`!>YRw~JI^DHy~l`#j3@4**3x3jw6$eZ&+EIs#T4tAc4Bw2kojnc zknf>92)+wegKsr<`Z4rj@FaLpi0DZl?A{@Ia$Fs8v4N=hHZ^+2NA$qeWkDtlUqZ!s zHgwj8Sm6<}o~zqP&M(tnLya)Zi$dg;eY`OrWe(dwObg|s=CEVUnyxY8P_tBKuFNV2 zld&UEhU)#ydYK7@7rHAH!~$+bB4;3F|~*0N@y zRL8gWz%RTh!Cgpj3;Q7bi4wGDX3QLuzDKqo@fIjrpeP~xIER)_@WlLNp6ivo#I=fh z0SGoBc~&MJpySR_pY*oTOQdDZe=KjY`O=ZvS6f#@ck3<1{TTY~!^UXewuS>(Uj_F7 zD|&|S>1(3odZ1}w1oOWp)zn)7Rnx^$V8%^0^U*3~D7QRzA`n)LR+vZyL7=Mb1#o3gGyM(#Gk z^XxS^`O>dgsWPI`-sz!bc@GZsh3ZUccR^RdURT54D7R0_C@$wV5Z(BRD!wu+vP41n(@hHo_opR=r8*y8>_gmF3sO!vgCwFMm?0&~0` z%D132%c+CQnbXb<|>!br!O>;C6v5XtuAL)g)WruhMOkz4<qT5ZCAXo2QUOF1iYa$~${B69UW!?VP0=DxralE}6h)9Q#;9r+P7^wS1r zr)|w%XQYkj$ub*1A1c-}5fYKLA!7PDERosx*=?__gVJTD!A!TTSw>y6H2OOHTRhgD5(|q#rXhd+tj^>Uf_Rc*7E^<9KDa* zeS5E5eNQDv*INPhXjk*cI}YZZM4B910-VmNnys+A_1OZOp-|Bwq(#1@v)hhbL$YI0ahPIo9L_-d^hS zGM>32^YK~r2f4-T88<^kwZ)S|dPfEPsaxJFI* z!wpxwEkS3j%&N%7t5_9lf)@6OzWj>lc7*6aJFDRR8Znp|&Kcy+itP!$@&vR2+26pT zX-|En9I9rnun+c?nuvMxREzf>IJ35NHRBsle#F;Bd5wDwZ=bLZR)G99#At|sl_HT{ z;Om>oml5V?T}h4(D^I7s!M&-t7<>A9F6uaqzo1;~? diff --git a/examples/platform/hello-triangle-win32-t/resources/resource.h b/examples/platform/hello-triangle-win32-t/resources/resource.h deleted file mode 100644 index 604c4c3f..00000000 --- a/examples/platform/hello-triangle-win32-t/resources/resource.h +++ /dev/null @@ -1,22 +0,0 @@ -#define IDI_ICON1 103 -#define IDR_MENU1 109 -#define IDD_DIALOG1 112 -#define IDR_ACCELERATOR1 120 -#define ID_BUTTON2 40001 -#define ID_FILE_LOADMODEL 40003 -#define ID_FILE_EXIT 40004 -#define ID_OPTIONS_DRAWGRID 40005 -#define ID_STYLES_VGUI 40006 -#define ID_STYLES_DARK 40007 -#define ID_STYLES_CHERRY 40008 -#define ID_MODE_GAME 40010 -#define ID_HELP_ABOUT 40009 - -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 121 -#define _APS_NEXT_COMMAND_VALUE 40024 -#define _APS_NEXT_CONTROL_VALUE 1008 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/examples/platform/hello-triangle-win32-t/src/entry_main.cpp b/examples/platform/hello-triangle-win32-t/src/entry_main.cpp deleted file mode 100644 index bbe71aa2..00000000 --- a/examples/platform/hello-triangle-win32-t/src/entry_main.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include - -int main() -{ - Window wnd(1920, 1080, "Example Win32 Wisdom"); - - wis::platform::WindowsExtension ext; - std::array required_extensions = { - &ext - }; - - Test::App app(required_extensions); - - wis::SwapchainDesc desc{ - .size = { uint32_t(wnd.GetWidth()), uint32_t(wnd.GetHeight()) }, - .format = wis::DataFormat::BGRA8Unorm, - .buffer_count = 2, - .stereo = true, - .vsync = true, - }; - - auto [res3, hswap] = ext.CreateSwapchain(app.GetDevice(), app.GetQueue(), &desc, - wnd.GetHandle()); - app.SetSwapChain(std::move(hswap), desc.size.width, desc.size.height); - app.CreateResources(); - - while (true) { - if (const auto a = wnd.ProcessMessages()) - return (int)a.value(); - - for (auto e : wnd.GetEvents()) - switch (e) { - case Event::Resize: - app.OnResize(wnd.GetWidth(), wnd.GetHeight()); - } - - app.Frame(); - } -} diff --git a/examples/platform/hello-triangle-win32-t/src/mouse.cpp b/examples/platform/hello-triangle-win32-t/src/mouse.cpp deleted file mode 100644 index fa184da3..00000000 --- a/examples/platform/hello-triangle-win32-t/src/mouse.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include - -std::optional Mouse::ReadRawDelta() noexcept -{ - if (rawDeltaBuffer.empty()) { - return {}; - } - const RawDelta d = rawDeltaBuffer.front(); - rawDeltaBuffer.pop(); - return d; -} - -std::optional Mouse::Read() noexcept -{ - if (buffer.size() > 0u) { - Mouse::Event e = buffer.front(); - buffer.pop(); - return e; - } - return {}; -} - -void Mouse::OnMouseMove(int newx, int newy) noexcept -{ - x = newx; - y = newy; - - buffer.push(Mouse::Event(Mouse::Event::Type::Move, *this)); - TrimBuffer(); -} - -void Mouse::OnMouseLeave() noexcept -{ - isInWindow = false; - buffer.push(Mouse::Event(Mouse::Event::Type::Leave, *this)); - TrimBuffer(); -} - -void Mouse::OnMouseEnter() noexcept -{ - isInWindow = true; - buffer.push(Mouse::Event(Mouse::Event::Type::Enter, *this)); - TrimBuffer(); -} - -void Mouse::OnRawDelta(int dx, int dy) noexcept -{ - rawDeltaBuffer.push({ dx, dy }); - TrimBuffer(); -} - -void Mouse::OnLeftPressed(int x, int y) noexcept -{ - leftIsPressed = true; - - buffer.push(Mouse::Event(Mouse::Event::Type::LPress, *this)); - TrimBuffer(); -} - -void Mouse::OnLeftReleased(int x, int y) noexcept -{ - leftIsPressed = false; - - buffer.push(Mouse::Event(Mouse::Event::Type::LRelease, *this)); - TrimBuffer(); -} - -void Mouse::OnRightPressed(int x, int y) noexcept -{ - rightIsPressed = true; - - buffer.push(Mouse::Event(Mouse::Event::Type::RPress, *this)); - TrimBuffer(); -} - -void Mouse::OnRightReleased(int x, int y) noexcept -{ - rightIsPressed = false; - - buffer.push(Mouse::Event(Mouse::Event::Type::RRelease, *this)); - TrimBuffer(); -} - -void Mouse::OnWheelUp(int x, int y) noexcept -{ - buffer.push(Mouse::Event(Mouse::Event::Type::WheelUp, *this)); - TrimBuffer(); -} - -void Mouse::OnWheelDown(int x, int y) noexcept -{ - buffer.push(Mouse::Event(Mouse::Event::Type::WheelDown, *this)); - TrimBuffer(); -} - -void Mouse::TrimBuffer() noexcept -{ - while (buffer.size() > bufferSize) { - buffer.pop(); - } -} - -void Mouse::TrimRawInputBuffer() noexcept -{ - while (rawDeltaBuffer.size() > bufferSize) { - rawDeltaBuffer.pop(); - } -} - -void Mouse::OnWheelDelta(int x, int y, int delta) noexcept -{ - wheelDeltaCarry += delta; - // generate events for every 120 - while (wheelDeltaCarry >= 120) { - wheelDeltaCarry -= 120; - OnWheelUp(x, y); - } - while (wheelDeltaCarry <= -120) { - wheelDeltaCarry += 120; - OnWheelDown(x, y); - } -} diff --git a/examples/platform/hello-triangle-win32-t/src/util.cpp b/examples/platform/hello-triangle-win32-t/src/util.cpp deleted file mode 100644 index 46854056..00000000 --- a/examples/platform/hello-triangle-win32-t/src/util.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include - -HRESULT wis::last_windows_error() noexcept -{ - return GetLastError(); -} - -//// Window Exception -// wis::hr_exception::hr_exception(winrt::hresult hr, wis::source_location sl) -// : exception(sl, false), hResult(hr) -//{ -// log(); -// } -// std::string wis::hr_exception::description() const noexcept -//{ -// return winrt::to_string(winrt::to_hstring(hResult)); -// } -// const char* wis::hr_exception::what() const noexcept -//{ -// if (whatBuffer.empty()) { -// whatBuffer = wis::format( -// "{}\n[Error Code]: 0x{:08X}({})\n" -// "[Description]: {}\n{}", -// type(), (unsigned long)error_code(), (unsigned long)error_code(), -// description(), origin()); -// } -// return whatBuffer.c_str(); -// } diff --git a/examples/platform/hello-triangle-win32-t/src/window.cpp b/examples/platform/hello-triangle-win32-t/src/window.cpp deleted file mode 100644 index 4cc1601e..00000000 --- a/examples/platform/hello-triangle-win32-t/src/window.cpp +++ /dev/null @@ -1,498 +0,0 @@ -#include -#include -#include -#include - -// extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - -enum class MenuItems : UINT_PTR { - Load = ID_FILE_LOADMODEL, - Exit = ID_FILE_EXIT, - ShowGrid = ID_OPTIONS_DRAWGRID, - Style_VGUI = ID_STYLES_VGUI, - Style_Dark = ID_STYLES_DARK, - Style_Cherry = ID_STYLES_CHERRY, - PlayGame = ID_MODE_GAME, - About = ID_HELP_ABOUT, -}; - -INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - UNREFERENCED_PARAMETER(lParam); - switch (message) { - case WM_INITDIALOG: - return (INT_PTR)TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { - EndDialog(hDlg, LOWORD(wParam)); - return (INT_PTR)TRUE; - } - break; - } - return (INT_PTR)FALSE; -} - -Window::WindowClass Window::WindowClass::wndClass; - -Window::WindowClass::WindowClass() noexcept - : hInst(GetModuleHandle(nullptr)) -{ - WNDCLASSEXA wcWindow = { 0 }; - wcWindow.cbSize = sizeof(wcWindow); - wcWindow.style = CS_OWNDC; - wcWindow.lpfnWndProc = HandleMsgSetup; - wcWindow.cbClsExtra = 0; - wcWindow.cbWndExtra = 0; - wcWindow.hInstance = GetInstance(); - wcWindow.hCursor = LoadCursor(NULL, IDC_ARROW); - wcWindow.hIcon = LoadIcon(wcWindow.hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wcWindow.hbrBackground = nullptr; - wcWindow.lpszMenuName = MAKEINTRESOURCEA(IDR_MENU1); - wcWindow.hIconSm = nullptr; - wcWindow.lpszClassName = GetName(); - RegisterClassExA(&wcWindow); -} -Window::WindowClass::~WindowClass() -{ - UnregisterClassA(wndClassName, GetInstance()); -} -const char* Window::WindowClass::GetName() noexcept -{ - return wndClassName; -} -HINSTANCE Window::WindowClass::GetInstance() noexcept -{ - return wndClass.hInst; -} - -// Window namespace -Window::Window(unsigned int width, unsigned int height, const char* name) - : width(width), height(height) -{ - RECT rWindow; - rWindow.left = 100; - rWindow.right = width + rWindow.left; - rWindow.top = 100; - rWindow.bottom = height + rWindow.top; - // Automatic calculation of window height and width to client region - wis::check_windows(AdjustWindowRect(&rWindow, WS_OVERLAPPEDWINDOW, TRUE)); - - hWnd.reset(CreateWindowA( - WindowClass::GetName(), name, - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, - rWindow.right - rWindow.left, - rWindow.bottom - rWindow.top, - nullptr, nullptr, - WindowClass::GetInstance(), this)); - - // Error checks - wis::check_windows(!!hWnd); - ShowWindow(hWnd.get(), SW_SHOWDEFAULT); - - Accelerator.reset(LoadAccelerators(WindowClass::GetInstance(), MAKEINTRESOURCE(IDR_ACCELERATOR1))); - - // Init GUI (only one window supported) - // wis::check_windows(ImGui_ImplWin32_Init(hWnd.get())); - - RAWINPUTDEVICE rid; - rid.usUsagePage = 0x01; // mouse page - rid.usUsage = 0x02; // mouse usage - rid.dwFlags = 0; - rid.hwndTarget = nullptr; - wis::check_windows(RegisterRawInputDevices(&rid, 1, sizeof(rid))); -} -Window::~Window() -{ - // ImGui_ImplWin32_Shutdown(); -} - -void Window::ChangeToFullScreen() -{ - SetMenu(hWnd.get(), nullptr); - auto st = GetWindowLong(hWnd.get(), GWL_STYLE); - auto stex = GetWindowLong(hWnd.get(), GWL_EXSTYLE); - SetWindowLong(hWnd.get(), GWL_STYLE, - st & ~(WS_CAPTION | WS_THICKFRAME)); - SetWindowLong(hWnd.get(), GWL_EXSTYLE, - stex & ~(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)); - - MONITORINFO monitor_info; - monitor_info.cbSize = sizeof(monitor_info); - GetMonitorInfo(MonitorFromWindow(hWnd.get(), MONITOR_DEFAULTTONEAREST), - &monitor_info); - - RECT window_rect(monitor_info.rcMonitor); - SetWindowPos(hWnd.get(), NULL, window_rect.left, window_rect.top, - window_rect.right - window_rect.left, window_rect.bottom - window_rect.top, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); -} - -void Window::SetTitle(std::string_view title) -{ - wis::check_windows(SetWindowTextA(hWnd.get(), title.data())); -} - -void Window::EnableLoading() -{ - menu.EnableLoading(); -} - -void Window::EnableCursor() noexcept -{ - cursorEnabled = true; - ShowCursor(); - EnableImGuiMouse(); - FreeCursor(); -} -void Window::DisableCursor() noexcept -{ - cursorEnabled = false; - HideCursor(); - DisableImGuiMouse(); - ConfineCursor(); -} -bool Window::CursorEnabled() const noexcept -{ - return cursorEnabled; -} - -void Window::ConfineCursor() noexcept -{ - RECT rect; - GetClientRect(hWnd.get(), &rect); - MapWindowPoints(hWnd.get(), nullptr, reinterpret_cast(&rect), 2); - ClipCursor(&rect); -} -void Window::FreeCursor() noexcept -{ - ClipCursor(nullptr); -} -void Window::HideCursor() noexcept -{ - while (::ShowCursor(FALSE) >= 0) - ; - cursorShown = false; -} -void Window::ShowCursor() noexcept -{ - while (::ShowCursor(TRUE) < 0) - ; - cursorShown = true; -} -void Window::ShowImGuiMouse() noexcept -{ - if (!cursorShown) - ShowCursor(); -} -void Window::EnableImGuiMouse() noexcept -{ - // ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_NoMouse; -} -void Window::DisableImGuiMouse() noexcept -{ - // ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouse; -} - -std::optional Window::ProcessMessages() const noexcept -{ - MSG msg; - while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { - if (!TranslateAccelerator( - hWnd.get(), // handle to receiving window - Accelerator.get(), // handle to active accelerator table - &msg)) // message data - { - if (msg.message == WM_QUIT) { - return msg.wParam; - } - - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - if (!bActive) { - WaitMessage(); - } - return {}; -} -LRESULT WINAPI Window::HandleMsgSetup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - // Create routine initializer - if (msg == WM_NCCREATE) { - // Extract data from creation of window - const CREATESTRUCTW* const pCreate = reinterpret_cast(lParam); - Window* const pWnd = static_cast(pCreate->lpCreateParams); - // set WinAPI-managed user data to store ptr to win class - SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast(pWnd)); - // set msgproc to to non setup handle - SetWindowLongPtr(hWnd, GWLP_WNDPROC, reinterpret_cast(&Window::HandleMsgThunk)); - - return pWnd->HandleMsg(hWnd, msg, wParam, lParam); - } - return DefWindowProc(hWnd, msg, wParam, lParam); -} -LRESULT WINAPI Window::HandleMsgThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - // retrieve ptr to win class - Window* const pWnd = reinterpret_cast(GetWindowLongPtr(hWnd, GWLP_USERDATA)); - // forward msg to class handler - return pWnd->HandleMsg(hWnd, msg, wParam, lParam); -} -LRESULT Window::HandleMsg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - // if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) - //{ - // return true; - //} - // const auto& imio = ImGui::GetIO(); - - switch (msg) { - // we don't want the DefProc to handle this message because - // we want our destructor to destroy the window, so return 0 instead of break - case WM_CLOSE: - PostQuitMessage(0); - return 0; - // clear keystate when window loses focus to prevent input getting "stuck" - case WM_KILLFOCUS: - kbd.ClearState(); - break; - case WM_SYSCOMMAND: - if (wParam == SC_MINIMIZE) { - bActive = false; - } - if (wParam == SC_RESTORE) { - bActive = true; - } - break; - case WM_SIZE: - if (!LOWORD(lParam) || !HIWORD(lParam)) - break; - width = LOWORD(lParam); - height = HIWORD(lParam); - events.push(Event::Resize); - break; - case WM_CREATE: - menu.Initialize(GetMenu(hWnd)); - break; - case WM_COMMAND: - switch (MenuItems(LOWORD(wParam))) { - case MenuItems::Load: - menu.DisableLoading(); - events.push(Event::LoadAsset); - break; - case MenuItems::Exit: - PostQuitMessage(0); - return 0; - case MenuItems::ShowGrid: - menu.ToggleGrid(); - break; - // case MenuItems::Style_VGUI: - // if (menu.SetStyle(UT::Menu::Style::VGUI)) - // events.push(Event::Restyle); - // break; - // case MenuItems::Style_Dark: - // if (menu.SetStyle(UT::Menu::Style::Dark)) - // events.push(Event::Restyle); - // break; - // case MenuItems::Style_Cherry: - // if (menu.SetStyle(UT::Menu::Style::Cherry)) - // events.push(Event::Restyle); - // break; - case MenuItems::PlayGame: - events.push(Event::Play); - break; - case MenuItems::About: - DialogBox(WindowClass::GetInstance(), MAKEINTRESOURCE(IDD_DIALOG1), hWnd, About); - break; - default: - break; - } - break; - case WM_ACTIVATE: - // confine/free cursor on window to foreground/background if cursor disabled - if (!cursorEnabled) { - if (wParam & WA_ACTIVE) { - ConfineCursor(); - HideCursor(); - } else { - FreeCursor(); - ShowCursor(); - } - } - break; - - /*********** KEYBOARD MESSAGES ***********/ - case WM_KEYDOWN: - // syskey commands need to be handled to track ALT key (VK_MENU) and F10 - case WM_SYSKEYDOWN: - // stifle this keyboard message if imgui wants to capture - // if (imio.WantCaptureKeyboard) - //{ - // break; - //} - if (!(lParam & 0x40000000) || kbd.AutorepeatIsEnabled()) // filter autorepeat - { - kbd.OnKeyPressed(static_cast(wParam)); - } - break; - case WM_KEYUP: - case WM_SYSKEYUP: - // stifle this keyboard message if imgui wants to capture - // if (imio.WantCaptureKeyboard) - //{ - // break; - //} - kbd.OnKeyReleased(static_cast(wParam)); - break; - case WM_CHAR: - // stifle this keyboard message if imgui wants to capture - // if (imio.WantCaptureKeyboard) - //{ - // break; - //} - kbd.OnChar(static_cast(wParam)); - break; - /*********** END KEYBOARD MESSAGES ***********/ - - /************* MOUSE MESSAGES ****************/ - case WM_MOUSEMOVE: { - const POINTS pt = MAKEPOINTS(lParam); - // cursorless exclusive gets first dibs - if (!cursorEnabled) { - if (!mouse.IsInWindow()) { - SetCapture(hWnd); - mouse.OnMouseEnter(); - HideCursor(); - } - break; - } - // stifle this mouse message if imgui wants to capture - // if (imio.WantCaptureMouse) - //{ - // ShowImGuiMouse(); - // break; - //} - if (cursorShown && !cursorActive) - HideCursor(); - - // in client region -> log move, and log enter + capture mouse (if not previously in window) - if (pt.x >= 0 && pt.x < width && pt.y >= 0 && pt.y < height) { - mouse.OnMouseMove(pt.x, pt.y); - if (!mouse.IsInWindow()) { - SetCapture(hWnd); - mouse.OnMouseEnter(); - } - } - // not in client -> log move / maintain capture if button down - else { - if (wParam & (MK_LBUTTON | MK_RBUTTON)) { - mouse.OnMouseMove(pt.x, pt.y); - } - // button up -> release capture / log event for leaving - else { - ReleaseCapture(); - mouse.OnMouseLeave(); - } - } - break; - } - case WM_LBUTTONDOWN: { - SetForegroundWindow(hWnd); - if (!cursorEnabled) { - ConfineCursor(); - HideCursor(); - } - // stifle this mouse message if imgui wants to capture - // if (imio.WantCaptureMouse) - //{ - // break; - //} - const POINTS pt = MAKEPOINTS(lParam); - mouse.OnLeftPressed(pt.x, pt.y); - break; - } - case WM_RBUTTONDOWN: { - // stifle this mouse message if imgui wants to capture - // if (imio.WantCaptureMouse) - //{ - // break; - //} - const POINTS pt = MAKEPOINTS(lParam); - mouse.OnRightPressed(pt.x, pt.y); - break; - } - case WM_LBUTTONUP: { - const POINTS pt = MAKEPOINTS(lParam); - mouse.OnLeftReleased(pt.x, pt.y); - // release mouse if outside of window - if (pt.x < 0 || pt.x >= width || pt.y < 0 || pt.y >= height) { - ReleaseCapture(); - mouse.OnMouseLeave(); - } - break; - } - case WM_RBUTTONUP: { - const POINTS pt = MAKEPOINTS(lParam); - mouse.OnRightReleased(pt.x, pt.y); - // release mouse if outside of window - if (pt.x < 0 || pt.x >= width || pt.y < 0 || pt.y >= height) { - ReleaseCapture(); - mouse.OnMouseLeave(); - } - break; - } - case WM_MOUSEWHEEL: { - // stifle this mouse message if imgui wants to capture - // if (imio.WantCaptureMouse) - //{ - // break; - //} - const POINTS pt = MAKEPOINTS(lParam); - const int delta = GET_WHEEL_DELTA_WPARAM(wParam); - mouse.OnWheelDelta(pt.x, pt.y, delta); - break; - } - /************** END MOUSE MESSAGES **************/ - - /************** RAW MOUSE MESSAGES **************/ - case WM_INPUT: { - if (!mouse.RawEnabled()) { - break; - } - UINT size = 0; - // first get the size of the input data - if (GetRawInputData( - reinterpret_cast(lParam), - RID_INPUT, - nullptr, - &size, - sizeof(RAWINPUTHEADER)) == -1) { - // bail msg processing if error - break; - } - rawBuffer.resize(size); - // read in the input data - if (GetRawInputData( - reinterpret_cast(lParam), - RID_INPUT, - rawBuffer.data(), - &size, - sizeof(RAWINPUTHEADER)) != size) { - // bail msg processing if error - break; - } - // process the raw input data - auto& ri = reinterpret_cast(*rawBuffer.data()); - if (ri.header.dwType == RIM_TYPEMOUSE && - (ri.data.mouse.lLastX != 0 || ri.data.mouse.lLastY != 0)) { - mouse.OnRawDelta(ri.data.mouse.lLastX, ri.data.mouse.lLastY); - } - break; - } - /************** END RAW MOUSE MESSAGES **************/ - } - - return DefWindowProc(hWnd, msg, wParam, lParam); -} diff --git a/examples/platform/hello-triangle-winrt/CMakeLists.txt b/examples/platform/hello-triangle-winrt/CMakeLists.txt deleted file mode 100644 index 8dd2b2e2..00000000 --- a/examples/platform/hello-triangle-winrt/CMakeLists.txt +++ /dev/null @@ -1,75 +0,0 @@ -project( - hello-triangle-winrt - DESCRIPTION "CMake example for Direct3D 12 (UWP)" - LANGUAGES CXX - VERSION 1.0.0.0) - -option(ENABLE_CODE_ANALYSIS "Use Static Code Analysis on build" OFF) - -if(NOT WINDOWS_STORE) - message(FATAL_ERROR "ERROR: Must be built for WindowsStore") -endif() - -add_executable(${PROJECT_NAME} WIN32 entry_main.cpp "window.h" "app.h" - "app.cpp") - -target_precompile_headers(${PROJECT_NAME} PRIVATE pch.h) -target_link_libraries(${PROJECT_NAME} PRIVATE Wisdom) - -include(${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/Functions.cmake) -wis_install_dx_uwp(${PROJECT_NAME}) - -target_compile_definitions(${PROJECT_NAME} PUBLIC SHADER_DIR=".") - -add_dependencies(${PROJECT_NAME} compile_shaders_kd) - -target_compile_definitions( - ${PROJECT_NAME} PRIVATE _WIN32_WINNT=0x0A00 WINAPI_FAMILY=WINAPI_FAMILY_APP - _UNICODE UNICODE NOMINMAX WINRT_LEAN_AND_MEAN) -set_target_properties( - ${PROJECT_NAME} - PROPERTIES CXX_STANDARD 20 - CXX_STANDARD_REQUIRED ON - CXX_EXTENSIONS OFF) - -if(MSVC) - target_compile_options( - ${PROJECT_NAME} PRIVATE /Wall /GR /fp:fast /bigobj - "$<$>:/guard:cf>") - target_link_options( - ${PROJECT_NAME} - PRIVATE - "$<$>:/guard:cf>" - /DYNAMICBASE - /NXCOMPAT - /APPCONTAINER - /MANIFEST:NO) - - if((CMAKE_SIZEOF_VOID_P EQUAL 4) AND (NOT ${DIRECTX_ARCH} MATCHES "^arm")) - target_compile_options(${PROJECT_NAME} PRIVATE /arch:SSE2) - target_link_options(${PROJECT_NAME} PRIVATE /SAFESEH) - endif() - - if((MSVC_VERSION GREATER_EQUAL 1924) - AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) - OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0))) - target_compile_options(${PROJECT_NAME} PRIVATE /ZH:SHA_256) - endif() - - if((MSVC_VERSION GREATER_EQUAL 1928) - AND (CMAKE_SIZEOF_VOID_P EQUAL 8) - AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) - OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0))) - target_compile_options(${PROJECT_NAME} - PRIVATE "$<$>:/guard:ehcont>") - target_link_options(${PROJECT_NAME} PRIVATE - "$<$>:/guard:ehcont>") - endif() -endif() - -set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME}) - -set(UWP_MIN_VERSION 10.0.22621.0) -set(UWP_MAX_TESTED_VERSION 10.0.22621.0) -set(UWP_MIN_CRT_VERSION 14.0.30704.0) -configure_file(package.appxmanifest package.appxmanifest @ONLY) diff --git a/examples/platform/hello-triangle-winrt/app.cpp b/examples/platform/hello-triangle-winrt/app.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/platform/hello-triangle-winrt/app.h b/examples/platform/hello-triangle-winrt/app.h deleted file mode 100644 index 60da4450..00000000 --- a/examples/platform/hello-triangle-winrt/app.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include - -class App -{ -public: - App(); - ~App(); - void Initialize(IUnknown* core_window, uint32_t width, uint32_t height); - -public: - void Frame(); - -private: - void WaitForGPU(); - -private: -}; diff --git a/examples/platform/hello-triangle-winrt/deps.cmake b/examples/platform/hello-triangle-winrt/deps.cmake deleted file mode 100644 index 4d68270b..00000000 --- a/examples/platform/hello-triangle-winrt/deps.cmake +++ /dev/null @@ -1,23 +0,0 @@ -if(NOT PLUGINS_LOADED) - message("Setting up WinRT...") - load_nuget_dependency(${NUGET_EXE} "Microsoft.Windows.CppWinRT" WinRT ${CMAKE_CURRENT_BINARY_DIR}) - - execute_process(COMMAND - ${WinRT_DIR}/bin/cppwinrt.exe -input sdk -output include - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - RESULT_VARIABLE ret) - - if (NOT ret EQUAL 0) - message(FATAL_ERROR "Failed to run cppwinrt.exe ${WinRT_DIR} ${ret}") - endif() -endif() - - -add_library(${PROJECT_NAME} INTERFACE) -target_include_directories(${PROJECT_NAME} SYSTEM BEFORE - INTERFACE - $ - $ -) - -target_install_interface(${PROJECT_NAME}) diff --git a/examples/platform/hello-triangle-winrt/entry_main.cpp b/examples/platform/hello-triangle-winrt/entry_main.cpp deleted file mode 100644 index eb6abdf7..00000000 --- a/examples/platform/hello-triangle-winrt/entry_main.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "window.h" - -int WINAPI wWinMain( - _In_ HINSTANCE /*hInstance*/, - _In_ HINSTANCE /*hPrevInstance*/, - _In_ LPWSTR /*lpCmdLine*/, - _In_ int /*nCmdShow*/ -) -{ - winrt::init_apartment(); - - auto viewProviderFactory = winrt::make(); - CoreApplication::Run(viewProviderFactory); - - winrt::uninit_apartment(); - - return 0; -} diff --git a/examples/platform/hello-triangle-winrt/package.appxmanifest b/examples/platform/hello-triangle-winrt/package.appxmanifest deleted file mode 100644 index f4dad06d..00000000 --- a/examples/platform/hello-triangle-winrt/package.appxmanifest +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - @PROJECT_NAME@ - Agrael - Assets\StoreLogo.png - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/platform/hello-triangle-winrt/pch.h b/examples/platform/hello-triangle-winrt/pch.h deleted file mode 100644 index 4da059e1..00000000 --- a/examples/platform/hello-triangle-winrt/pch.h +++ /dev/null @@ -1,81 +0,0 @@ -#pragma once -#include - -// -// pch.h -// Header for standard system include files. - -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// To use graphics and CPU markup events with the latest version of PIX, change this to include -// then add the NuGet package WinPixEventRuntime to the project. -#include - -#ifdef _DEBUG -#include -#endif - -#define WINRT_LEAN_AND_MEAN - -#include "winrt/Windows.ApplicationModel.h" -#include "winrt/Windows.ApplicationModel.Core.h" -#include "winrt/Windows.ApplicationModel.Activation.h" -#include "winrt/Windows.Foundation.h" -#include "winrt/Windows.Graphics.Display.h" -#include "winrt/Windows.System.h" -#include "winrt/Windows.UI.Core.h" -#include "winrt/Windows.UI.Input.h" -#include "winrt/Windows.UI.ViewManagement.h" - -// If using the DirectX Tool Kit for DX12, uncomment this line: -// #include "GraphicsMemory.h" - -namespace DX { -// Helper class for COM exceptions -class com_exception : public std::exception -{ -public: - com_exception(HRESULT hr) noexcept - : result(hr) { } - - const char* what() const override - { - static char s_str[64] = {}; - sprintf_s(s_str, "Failure with HRESULT of %08X", static_cast(result)); - return s_str; - } - -private: - HRESULT result; -}; - -// Helper utility converts D3D API failures into exceptions. -inline void ThrowIfFailed(HRESULT hr) -{ - if (FAILED(hr)) { - throw com_exception(hr); - } -} -} // namespace DX diff --git a/examples/platform/hello-triangle-winrt/window.h b/examples/platform/hello-triangle-winrt/window.h deleted file mode 100644 index eb12e7ab..00000000 --- a/examples/platform/hello-triangle-winrt/window.h +++ /dev/null @@ -1,378 +0,0 @@ -#include -#include -#include "app.h" - -using namespace winrt::Windows::ApplicationModel; -using namespace winrt::Windows::ApplicationModel::Core; -using namespace winrt::Windows::ApplicationModel::Activation; -using namespace winrt::Windows::UI::Core; -using namespace winrt::Windows::UI::Input; -using namespace winrt::Windows::UI::ViewManagement; -using namespace winrt::Windows::System; -using namespace winrt::Windows::Foundation; -using namespace winrt::Windows::Graphics::Display; -using namespace DirectX; - -// Exit helper -void ExitGame() noexcept -{ - winrt::Windows::ApplicationModel::Core::CoreApplication::Exit(); -} - -namespace { -inline int ConvertDipsToPixels(float dips, float dpi) noexcept -{ - return int(dips * dpi / 96.f + 0.5f); -} - -inline float ConvertPixelsToDips(int pixels, float dpi) noexcept -{ - return (float(pixels) * 96.f / dpi); -} -} // namespace - -// Window size helper -_Use_decl_annotations_ void GetWindowBounds(::IUnknown* window, RECT* rect) -{ - if (!rect) - return; - - *rect = {}; - - if (!window) - return; - - CoreWindow cw{ nullptr }; - if (FAILED(window->QueryInterface(winrt::guid_of(), winrt::put_abi(cw)))) - return; - - auto b = cw.Bounds(); - - auto currentDisplayInformation = DisplayInformation::GetForCurrentView(); - float dpi = currentDisplayInformation.LogicalDpi(); - - const int x = ConvertDipsToPixels(b.X, dpi); - const int y = ConvertDipsToPixels(b.Y, dpi); - const int w = ConvertDipsToPixels(b.Width, dpi); - const int h = ConvertDipsToPixels(b.Height, dpi); - - rect->left = static_cast(x); - rect->top = static_cast(y); - rect->right = static_cast(x + w); - rect->bottom = static_cast(y + h); -} - -class ViewProvider : public winrt::implements -{ -public: - ViewProvider() noexcept - : m_exit(false), m_visible(true), m_in_sizemove(false), m_DPI(96.f), m_logicalWidth(1920.f), m_logicalHeight(1080.f), m_nativeOrientation(DisplayOrientations::None), m_currentOrientation(DisplayOrientations::None) - { - } - - // IFrameworkView methods - void Initialize(CoreApplicationView const& applicationView) - { - applicationView.Activated({ this, &ViewProvider::OnActivated }); - - CoreApplication::Suspending({ this, &ViewProvider::OnSuspending }); - - CoreApplication::Resuming({ this, &ViewProvider::OnResuming }); - - m_game.emplace(); - } - - void Uninitialize() noexcept - { - // m_game.reset(); - } - - void SetWindow(CoreWindow const& window) - { - window.SizeChanged({ this, &ViewProvider::OnWindowSizeChanged }); - - try { - window.ResizeStarted([this](auto&&, auto&&) { - m_in_sizemove = true; - }); - - window.ResizeCompleted([this](auto&&, auto&&) { - m_in_sizemove = false; - HandleWindowSizeChanged(); - }); - } catch (...) { - // Requires Windows 10 Creators Update (10.0.15063) or later - } - - window.VisibilityChanged({ this, &ViewProvider::OnVisibilityChanged }); - - window.Closed([this](auto&&, auto&&) { - m_exit = true; - }); - - auto dispatcher = CoreWindow::GetForCurrentThread().Dispatcher(); - - dispatcher.AcceleratorKeyActivated({ this, &ViewProvider::OnAcceleratorKeyActivated }); - - auto navigation = SystemNavigationManager::GetForCurrentView(); - - // UWP on Xbox One triggers a back request whenever the B button is pressed - // which can result in the app being suspended if unhandled - navigation.BackRequested([](const winrt::Windows::Foundation::IInspectable&, const BackRequestedEventArgs& args) { - args.Handled(true); - }); - - auto currentDisplayInformation = DisplayInformation::GetForCurrentView(); - - currentDisplayInformation.DpiChanged({ this, &ViewProvider::OnDpiChanged }); - - currentDisplayInformation.OrientationChanged({ this, &ViewProvider::OnOrientationChanged }); - - DisplayInformation::DisplayContentsInvalidated({ this, &ViewProvider::OnDisplayContentsInvalidated }); - - m_DPI = currentDisplayInformation.LogicalDpi(); - - m_logicalWidth = window.Bounds().Width; - m_logicalHeight = window.Bounds().Height; - - m_nativeOrientation = currentDisplayInformation.NativeOrientation(); - m_currentOrientation = currentDisplayInformation.CurrentOrientation(); - - int outputWidth = ConvertDipsToPixels(m_logicalWidth, m_DPI); - int outputHeight = ConvertDipsToPixels(m_logicalHeight, m_DPI); - - DXGI_MODE_ROTATION rotation = ComputeDisplayRotation(); - - if (rotation == DXGI_MODE_ROTATION_ROTATE90 || rotation == DXGI_MODE_ROTATION_ROTATE270) { - std::swap(outputWidth, outputHeight); - } - - auto windowPtr = static_cast<::IUnknown*>(winrt::get_abi(window)); - m_game->Initialize(windowPtr, outputWidth, outputHeight); // TODO: Rotate - } - - void Load(winrt::hstring const&) noexcept - { - } - - void Run() - { - while (!m_exit) { - if (m_visible) { - m_game->Frame(); - - CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent); - } else { - CoreWindow::GetForCurrentThread().Dispatcher().ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending); - } - } - } - -protected: - // Event handlers - void OnActivated(CoreApplicationView const& /*applicationView*/, IActivatedEventArgs const& args) - { - if (args.Kind() == ActivationKind::Launch) { - auto launchArgs = reinterpret_cast(&args); - - if (launchArgs->PrelaunchActivated()) { - // Opt-out of Prelaunch - CoreApplication::Exit(); - return; - } - } - - int w = 1920, h = 1080; - // m_game->GetDefaultSize(w, h); - - m_DPI = DisplayInformation::GetForCurrentView().LogicalDpi(); - - ApplicationView::PreferredLaunchWindowingMode(ApplicationViewWindowingMode::PreferredLaunchViewSize); - // Change to ApplicationViewWindowingMode::FullScreen to default to full screen - - auto desiredSize = Size(ConvertPixelsToDips(w, m_DPI), ConvertPixelsToDips(h, m_DPI)); - - ApplicationView::PreferredLaunchViewSize(desiredSize); - - auto view = ApplicationView::GetForCurrentView(); - - auto minSize = Size(ConvertPixelsToDips(320, m_DPI), ConvertPixelsToDips(200, m_DPI)); - - view.SetPreferredMinSize(minSize); - - CoreWindow::GetForCurrentThread().Activate(); - - view.FullScreenSystemOverlayMode(FullScreenSystemOverlayMode::Minimal); - - view.TryResizeView(desiredSize); - } - - void OnSuspending(IInspectable const& /*sender*/, SuspendingEventArgs const& args) - { - auto deferral = args.SuspendingOperation().GetDeferral(); - - auto f = std::async(std::launch::async, [this, deferral]() { - // m_game->OnSuspending(); - - deferral.Complete(); - }); - } - - void OnResuming(IInspectable const& /*sender*/, IInspectable const& /*args*/) - { - // m_game->OnResuming(); - } - - void OnWindowSizeChanged(CoreWindow const& sender, WindowSizeChangedEventArgs const& /*args*/) - { - m_logicalWidth = sender.Bounds().Width; - m_logicalHeight = sender.Bounds().Height; - - if (m_in_sizemove) - return; - - HandleWindowSizeChanged(); - } - - void OnVisibilityChanged(CoreWindow const& /*sender*/, VisibilityChangedEventArgs const& args) - { - m_visible = args.Visible(); - // if (m_visible) - // m_game->OnActivated(); - // else - // m_game->OnDeactivated(); - } - - void OnAcceleratorKeyActivated(CoreDispatcher const&, AcceleratorKeyEventArgs const& args) - { - if (args.EventType() == CoreAcceleratorKeyEventType::SystemKeyDown && args.VirtualKey() == VirtualKey::Enter && args.KeyStatus().IsMenuKeyDown && !args.KeyStatus().WasKeyDown) { - // Implements the classic ALT+ENTER fullscreen toggle - auto view = ApplicationView::GetForCurrentView(); - - if (view.IsFullScreenMode()) - view.ExitFullScreenMode(); - else - view.TryEnterFullScreenMode(); - - args.Handled(true); - } - } - - void OnDpiChanged(DisplayInformation const& sender, IInspectable const& /*args*/) - { - m_DPI = sender.LogicalDpi(); - - HandleWindowSizeChanged(); - } - - void OnOrientationChanged(DisplayInformation const& sender, IInspectable const& /*args*/) - { - auto resizeManager = CoreWindowResizeManager::GetForCurrentView(); - resizeManager.ShouldWaitForLayoutCompletion(true); - - m_currentOrientation = sender.CurrentOrientation(); - - HandleWindowSizeChanged(); - - resizeManager.NotifyLayoutCompleted(); - } - - void OnDisplayContentsInvalidated(DisplayInformation const& /*sender*/, IInspectable const& /*args*/) - { - // m_game->ValidateDevice(); - // m_game->OnDisplayChange(); - } - - DXGI_MODE_ROTATION ComputeDisplayRotation() const noexcept - { - DXGI_MODE_ROTATION rotation = DXGI_MODE_ROTATION_UNSPECIFIED; - - switch (m_nativeOrientation) { - case DisplayOrientations::Landscape: - switch (m_currentOrientation) { - case DisplayOrientations::Landscape: - rotation = DXGI_MODE_ROTATION_IDENTITY; - break; - - case DisplayOrientations::Portrait: - rotation = DXGI_MODE_ROTATION_ROTATE270; - break; - - case DisplayOrientations::LandscapeFlipped: - rotation = DXGI_MODE_ROTATION_ROTATE180; - break; - - case DisplayOrientations::PortraitFlipped: - rotation = DXGI_MODE_ROTATION_ROTATE90; - break; - - default: - break; - } - break; - - case DisplayOrientations::Portrait: - switch (m_currentOrientation) { - case DisplayOrientations::Landscape: - rotation = DXGI_MODE_ROTATION_ROTATE90; - break; - - case DisplayOrientations::Portrait: - rotation = DXGI_MODE_ROTATION_IDENTITY; - break; - - case DisplayOrientations::LandscapeFlipped: - rotation = DXGI_MODE_ROTATION_ROTATE270; - break; - - case DisplayOrientations::PortraitFlipped: - rotation = DXGI_MODE_ROTATION_ROTATE180; - break; - - default: - break; - } - break; - - default: - break; - } - - return rotation; - } - - void HandleWindowSizeChanged() - { - int outputWidth = ConvertDipsToPixels(m_logicalWidth, m_DPI); - int outputHeight = ConvertDipsToPixels(m_logicalHeight, m_DPI); - - DXGI_MODE_ROTATION rotation = ComputeDisplayRotation(); - - if (rotation == DXGI_MODE_ROTATION_ROTATE90 || rotation == DXGI_MODE_ROTATION_ROTATE270) { - std::swap(outputWidth, outputHeight); - } - - // m_game->OnWindowSizeChanged(outputWidth, outputHeight, rotation); - } - -private: - bool m_exit; - bool m_visible; - bool m_in_sizemove; - float m_DPI; - float m_logicalWidth; - float m_logicalHeight; - std::optional m_game; - - winrt::Windows::Graphics::Display::DisplayOrientations m_nativeOrientation; - winrt::Windows::Graphics::Display::DisplayOrientations m_currentOrientation; -}; - -class ViewProviderFactory : public winrt::implements -{ -public: - IFrameworkView CreateView() - { - return winrt::make(); - } -}; diff --git a/examples/platform/shared/CMakeLists.txt b/examples/platform/shared/CMakeLists.txt deleted file mode 100644 index f5a6ca71..00000000 --- a/examples/platform/shared/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -project(PlatformExamplesShared) - -find_package(glm QUIET) - -add_library(${PROJECT_NAME} STATIC) -target_sources( - ${PROJECT_NAME} - PUBLIC "app.h" - PRIVATE "app.cpp") -target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") -target_link_libraries(${PROJECT_NAME} PUBLIC wis::debug glm::glm) -add_dependencies(${PROJECT_NAME} compile_shaders_kd) - -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20) -target_compile_definitions(${PROJECT_NAME} PUBLIC SHADER_DIR="${SHADER_DIR}") diff --git a/examples/platform/shared/app.cpp b/examples/platform/shared/app.cpp deleted file mode 100644 index 9a41d36b..00000000 --- a/examples/platform/shared/app.cpp +++ /dev/null @@ -1,482 +0,0 @@ -#include "app.h" -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -struct LogProvider : public wis::LogLayer { - virtual void Log(wis::Severity sev, std::string message, wis::source_location sl = wis::source_location::current()) override - { - std::cout << wis::format("[{}]: {}\n", wis::severity_strings[+sev], message); - }; -}; - -void DebugCallback(wis::Severity severity, const char* message, void* user_data) -{ - auto stream = reinterpret_cast(user_data); - *stream << message << "\n"; -} - -Test::App::App(std::span factory_exts) -{ - wis::LibLogger::SetLogLayer(std::make_shared()); - - wis::DebugExtension debug_ext; - std::unique_ptr xfactory_exts = wis::detail::make_unique_for_overwrite(factory_exts.size() + 1); - xfactory_exts[0] = &debug_ext; - std::copy(factory_exts.begin(), factory_exts.end(), xfactory_exts.get() + 1); - - auto [result, factory] = wis::CreateFactory(true, xfactory_exts.get(), factory_exts.size() + 1); - auto [resx, hinfo] = debug_ext.CreateDebugMessenger(DebugCallback, &std::cout); - info = std::move(hinfo); - - for (size_t i = 0;; i++) { - auto [res, adapter] = factory.GetAdapter(i); - if (res.status == wis::Status::Ok) { - wis::AdapterDesc desc; - res = adapter.GetDesc(&desc); - std::cout << "Adapter: " << desc.description.data() << "\n"; - - auto [res, hdevice] = wis::CreateDevice(std::move(adapter)); - if (res.status == wis::Status::Ok) { - device = std::move(hdevice); - break; - }; - - } else { - break; - } - } - - auto [res2, hqueue] = device.CreateCommandQueue(wis::QueueType::Graphics); - queue = std::move(hqueue); - - auto [res4, hfence] = device.CreateFence(); - fence = std::move(hfence); - - auto [res5, hcmd_list] = device.CreateCommandList(wis::QueueType::Graphics); - cmd_list = std::move(hcmd_list); -} - -void Test::App::SetSwapChain(wis::SwapChain hswap, uint32_t width, uint32_t height) -{ - swap = std::move(hswap); - back_buffers = swap.GetBufferSpan(); - this->width = width; - this->height = height; - - wis::RenderTargetDesc rt_desc{ - .format = wis::DataFormat::BGRA8Unorm, - .layout = wis::TextureLayout::Texture2D, - .mip = 0, - .base_array_layer = 0, - .layer_count = 1, - }; - for (size_t i = 0; i < render_targets.size(); i++) { - auto [res, hrt] = device.CreateRenderTarget(back_buffers[i], rt_desc); - render_targets[i] = std::move(hrt); - } -} - -std::string LoadShader(std::filesystem::path p) -{ - if constexpr (wis::shader_intermediate == wis::ShaderIntermediate::DXIL) - p += u".cso"; - else - p += u".spv"; - - std::ifstream t{ p, std::ios::binary }; - t.seekg(0, std::ios::end); - size_t size = t.tellg(); - std::string ret; - ret.resize(size); - t.seekg(0); - t.read(ret.data(), size); - return ret; -} - -void Test::App::CreateResources() -{ - using namespace wis; - CreateRootSignature(); - - struct Vertex { - glm::vec3 pos; - glm::vec2 tc; - }; - auto aspect_ratio = float(width) / float(height); - Vertex triangleVertices[] = { - { { 0.0f, 0.25f * aspect_ratio, 0.0f }, { 1, 1 } }, - { { 0.0f, -0.25f * aspect_ratio, 0.0f }, { 1.0f, 0.0f } }, - { { -0.25f, -0.25f * aspect_ratio, 0.0f }, { 0.0f, 0.0f } } - }; - - { - auto [res, alloc] = device.CreateAllocator(); - allocator = std::move(alloc); - } - auto [resx, ubuf] = allocator.CreateUploadBuffer(sizeof(triangleVertices)); - auto [resx2, ubuf2] = allocator.CreateUploadBuffer(2 * 2 * 4); - auto [resx3, ubuf3] = allocator.CreateUploadBuffer(sizeof(float) * 4); - - { - auto [res, vbuf] = allocator.CreateBuffer(sizeof(triangleVertices), wis::BufferUsage::VertexBuffer | wis::BufferUsage::CopyDst); - vertex_buffer = std::move(vbuf); - - vertex_binding = wis::VertexBufferBinding{ - .buffer = vertex_buffer, - .size = sizeof(triangleVertices), - .stride = sizeof(Vertex), - }; - } - // Create Texture - { - using namespace wis; - wis::TextureDesc desc{ - .format = wis::DataFormat::BGRA8Unorm, - .size = { 2, 2, 1 }, - .mip_levels = 1, - .usage = wis::TextureUsage::CopyDst | wis::TextureUsage::ShaderResource - }; - auto [res, htexture] = allocator.CreateTexture(desc); - texture = std::move(htexture); - } - - // Create descriptor buffer - { - auto desc_increment = device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Descriptor); - auto [res, hdesc] = device.CreateDescriptorBuffer(wis::DescriptorHeapType::Descriptor, wis::DescriptorMemory::ShaderVisible, 2u * desc_increment); - desc_buffer = std::move(hdesc); - - auto sampler_increment = device.GetDescriptorBufferUnitSize(wis::DescriptorHeapType::Sampler); - auto [res2, hdesc2] = device.CreateDescriptorBuffer(wis::DescriptorHeapType::Sampler, wis::DescriptorMemory::ShaderVisible, 1u * sampler_increment); - sampler_buffer = std::move(hdesc2); - } - { - auto [res, val] = allocator.CreateBuffer(sizeof(float) * 4, wis::BufferUsage::ConstantBuffer | wis::BufferUsage::CopyDst); - cbuf = std::move(val); - } - - // Upload vertex data to a buffer - { - auto memory = ubuf.Map(); - std::copy(std::begin(triangleVertices), std::end(triangleVertices), memory); - ubuf.Unmap(); - - auto memoryx = ubuf3.Map(); - *memoryx = { 1, 1, 0, 1 }; - ubuf3.Unmap(); - - auto texture_mem = ubuf2.Map(); - texture_mem[0] = 0xFF0000FF; - texture_mem[1] = 0xFF00FF00; - texture_mem[2] = 0xFFFF0000; - texture_mem[3] = 0xFF00FFFF; - ubuf2.Unmap(); - - cmd_list.CopyBuffer(ubuf, vertex_buffer, { .size_bytes = sizeof(triangleVertices) }); - cmd_list.CopyBuffer(ubuf3, cbuf, { .size_bytes = sizeof(float) * 4 }); - cmd_list.BufferBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::Draw, - .access_before = wis::ResourceAccess::Common, - .access_after = wis::ResourceAccess::VertexBuffer, - }, - vertex_buffer); - - cmd_list.BufferBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::Draw, - .access_before = wis::ResourceAccess::Common, - .access_after = wis::ResourceAccess::ConstantBuffer, - }, - cbuf); - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::NoAccess, - .access_after = wis::ResourceAccess::CopyDest, - .state_before = wis::TextureState::Undefined, - .state_after = wis::TextureState::CopyDest, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - texture); - - wis::BufferTextureCopyRegion region{ - .texture = { - .size = { 2, 2, 1 }, - .format = wis::DataFormat::BGRA8Unorm, - } - }; - cmd_list.CopyBufferToTexture(ubuf2, texture, ®ion, 1); - cmd_list.TextureBarrier( - { - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::CopyDest, - .access_after = wis::ResourceAccess::ShaderResource, - .state_before = wis::TextureState::CopyDest, - .state_after = wis::TextureState::ShaderResource, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - texture); - cmd_list.Close(); - - wis::CommandListView cmd_lists[] = { cmd_list }; - queue.ExecuteCommandLists(cmd_lists, 1); - - WaitForGPU(); - - auto [res, hsrv] = device.CreateShaderResource(texture, { .format = wis::DataFormat::BGRA8Unorm, .view_type = wis::TextureViewType::Texture2D, .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - } }); - srv = std::move(hsrv); - desc_buffer.WriteShaderResource(0, 0, 0, 0, root, srv); - desc_buffer.WriteConstantBuffer(0, 0, 1, 0, root, cbuf, sizeof(float) * 4); - } - - { - auto s1 = LoadShader(SHADER_DIR "/example.vs"); - auto s2 = LoadShader(SHADER_DIR "/example.ps"); - auto [result, vs] = device.CreateShader(s1.data(), uint32_t(s1.size())); - auto [result2, ps] = device.CreateShader(s2.data(), uint32_t(s2.size())); - - vertex_shader = std::move(vs); - pixel_shader = std::move(ps); - } - - { - wis::InputSlotDesc input_slots[] = { - { .slot = 0, .stride_bytes = sizeof(Vertex), .input_class = wis::InputClass::PerVertex }, - }; - wis::InputAttribute input_attributes[] = { - { .input_slot = 0, .semantic_name = "POSITION", .semantic_index = 0, .location = 0, .format = wis::DataFormat::RGB32Float, .offset_bytes = 0 }, - { .input_slot = 0, .semantic_name = "TEXCOORD", .semantic_index = 0, .location = 1, .format = wis::DataFormat::RG32Float, .offset_bytes = 12 }, - }; - wis::DataFormat attachment_formats[] = { wis::DataFormat::BGRA8Unorm }; - - wis::GraphicsPipelineDesc desc{ - .root_signature = root, - .input_layout = { - .slots = input_slots, - .slot_count = 1, - .attributes = input_attributes, - .attribute_count = 2, - }, - .shaders = { .vertex = vertex_shader, .pixel = pixel_shader }, - .attachments = { - .attachment_formats = attachment_formats, - .attachments_count = 1, - } - }; - auto [res2, hpipeline] = device.CreateGraphicsPipeline(&desc); - pipeline = std::move(hpipeline); - } - - // Create Sampler - { - wis::SamplerDesc sample_desc{ - .min_filter = wis::Filter::Point, - .mag_filter = wis::Filter::Point, - .mip_filter = wis::Filter::Point, - .anisotropic = false, - .max_anisotropy = 16, - .address_u = wis::AddressMode::Repeat, - .address_v = wis::AddressMode::Repeat, - .address_w = wis::AddressMode::Repeat, - .min_lod = 0, - .max_lod = 1.0f, - .mip_lod_bias = 0.0f, - .comparison_op = wis::Compare::None, - }; - auto [res, hsampler] = device.CreateSampler(&sample_desc); - sampler = std::move(hsampler); - - sampler_buffer.WriteSampler(0, 0, sampler); - } - - WaitForGPU(); -} - -void Test::App::OnResize(uint32_t width, uint32_t height) -{ - if (width == this->width && height == this->height) - return; - - auto result = swap.Resize(width, height); - if (result.status != wis::Status::Ok) - throw std::runtime_error("Failed to resize swapchain"); - - wis::RenderTargetDesc rt_desc{ - .format = wis::DataFormat::BGRA8Unorm, - .layout = wis::TextureLayout::Texture2D, - .mip = 0, - .base_array_layer = 0, - .layer_count = 1, - }; - - back_buffers = swap.GetBufferSpan(); - for (size_t i = 0; i < render_targets.size(); i++) { - auto [res, hrt] = device.CreateRenderTarget(back_buffers[i], rt_desc); - render_targets[i] = std::move(hrt); - } -} - -void Test::App::Frame() -{ - rotation += 0.01f; - if (rotation > 1) - rotation -= 1; - - auto res = cmd_list.Reset(pipeline); - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::All, - .sync_after = wis::BarrierSync::Draw, - .access_before = wis::ResourceAccess::Common, - .access_after = wis::ResourceAccess::RenderTarget, - .state_before = wis::TextureState::Present, - .state_after = wis::TextureState::RenderTarget, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - back_buffers[swap.GetCurrentIndex()]); - - wis::RenderPassRenderTargetDesc targets{ - .target = render_targets[swap.GetCurrentIndex()], - .load_op = wis::LoadOperation::Clear, - .store_op = wis::StoreOperation::Store, - .clear_value = { 0.0f, 0.2f, 0.4f, 1.0f }, - }; - wis::RenderPassDesc rp{ - .flags = wis::RenderPassFlags::None, - .target_count = 1, - .targets = &targets, - }; - - cmd_list.BeginRenderPass(&rp); - cmd_list.SetRootSignature(root); - - wis::DescriptorBufferView desc_buffers[] = { desc_buffer, sampler_buffer }; - - cmd_list.SetDescriptorBuffers(desc_buffers, 2); - cmd_list.SetDescriptorTableOffset(0, desc_buffer, 0); - cmd_list.SetDescriptorTableOffset(1, sampler_buffer, 0); - - cmd_list.SetRootConstants(&rotation, 1, 0, wis::ShaderStages::Vertex); - - cmd_list.IASetPrimitiveTopology(wis::PrimitiveTopology::TriangleList); - - cmd_list.IASetVertexBuffers(&vertex_binding, 1); - cmd_list.RSSetViewport({ 0, 0, float(width), float(height), 0, 1 }); - cmd_list.RSSetScissor({ 0, 0, int(width), int(height) }); - - cmd_list.DrawInstanced(3); - cmd_list.EndRenderPass(); - - cmd_list.TextureBarrier({ - .sync_before = wis::BarrierSync::Draw, - .sync_after = wis::BarrierSync::All, - .access_before = wis::ResourceAccess::RenderTarget, - .access_after = wis::ResourceAccess::Common, - .state_before = wis::TextureState::RenderTarget, - .state_after = wis::TextureState::Present, - .subresource_range = { - .base_mip_level = 0, - .level_count = 1, - .base_array_layer = 0, - .layer_count = 1, - }, - }, - back_buffers[swap.GetCurrentIndex()]); - cmd_list.Close(); - - wis::CommandListView lists[] = { cmd_list }; - queue.ExecuteCommandLists(lists, 1); - - auto result = swap.Present2(true); - if (result.status != wis::Status::Ok && result.status != wis::Status::Occluded) - throw std::runtime_error("Failed to present swapchain"); - - WaitForGPU(); -} - -void Test::App::WaitForGPU() -{ - const uint64_t vfence = fence_value; - std::ignore = queue.SignalQueue(fence, vfence); - fence_value++; - std::ignore = fence.Wait(vfence); -} - -void Test::App::CreateRootSignature() -{ - wis::RootConstant root_constants[] = { - { - .stage = wis::ShaderStages::Vertex, - .size_bytes = 4, - }, - }; - - wis::DescriptorTableEntry entries[] = { - { - .type = wis::DescriptorType::ShaderResource, - .bind_register = 0, - .binding = 0, - .count = 1, - }, - { - .type = wis::DescriptorType::ConstantBuffer, - .bind_register = 0, - .binding = 1, - .count = 1, - }, - { - .type = wis::DescriptorType::Sampler, - .bind_register = 0, - .binding = 0, - .count = 1, - }, - }; - - wis::DescriptorTable tables[] = { - { - .type = wis::DescriptorHeapType::Descriptor, - .entries = entries, - .entry_count = 2, - .stage = wis::ShaderStages::Pixel, - }, - { - .type = wis::DescriptorHeapType::Sampler, - .entries = entries + 2, - .entry_count = 1, - .stage = wis::ShaderStages::Pixel, - }, - - }; - auto [result, hroot] = device.CreateRootSignature(root_constants, sizeof(root_constants) / sizeof(root_constants[0]), tables, sizeof(tables) / sizeof(tables[0])); - root = std::move(hroot); -} diff --git a/examples/platform/shared/app.h b/examples/platform/shared/app.h deleted file mode 100644 index 26e3bf3f..00000000 --- a/examples/platform/shared/app.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once -#include - -namespace Test { -class App -{ -public: - // input from platform window - App(std::span factory_exts); - - void SetSwapChain(wis::SwapChain swap, uint32_t width, uint32_t height); - -public: - void CreateResources(); - - void Frame(); - void OnResize(uint32_t width, uint32_t height); - void WaitForGPU(); - -public: - const wis::Device& GetDevice() const - { - return device; - } - const wis::CommandQueue& GetQueue() const - { - return queue; - } - -private: - void CreateRootSignature(); - -private: - uint32_t width; - uint32_t height; - - wis::DebugMessenger info; - - wis::Device device; - wis::CommandQueue queue; - wis::CommandList cmd_list; - wis::SwapChain swap; - - std::span back_buffers; - std::array render_targets; - - wis::Fence fence; - uint64_t fence_value = 1; - - wis::Buffer vertex_buffer; - wis::Buffer ubuf_2; - wis::Buffer cbuf; - wis::VertexBufferBinding vertex_binding; - wis::ResourceAllocator allocator; - - wis::Shader vertex_shader; - wis::Shader pixel_shader; - - wis::RootSignature root; - wis::PipelineState pipeline; - - wis::Texture texture; - - float rotation = 0.0f; - - wis::DescriptorBuffer desc_buffer; - wis::DescriptorBuffer sampler_buffer; - - wis::Sampler sampler; - wis::ShaderResource srv; -}; -} // namespace Test diff --git a/examples/shaders/forward/example.ps.hlsl b/examples/shaders/forward/example.ps.hlsl deleted file mode 100644 index c1761303..00000000 --- a/examples/shaders/forward/example.ps.hlsl +++ /dev/null @@ -1,144 +0,0 @@ -//#include "../headers/3dlut.hlsli" - -struct PSInput -{ - float4 position : SV_POSITION; - float2 tc : TEXCOORD0; -}; - -[[vk::binding(0,0)]] Texture2D texture0 : register(t0); - -[[vk::binding(1,0)]] -cbuffer cbuf : register(b0) -{ - float4 exposure; -}; - -[[vk::binding(0,1)]] SamplerState samLinear : register(s0); - -struct PSOutput -{ - float4 color : SV_TARGET0; -}; - -static const float3 lut3d[3 * 3 * 3] = -{ - float3(0, 0, 0), - float3(0.5, 0, 0), - float3(1, 0, 0), - - float3(0, 0.5, 0), - float3(0.5, 0.5, 0), - float3(1, 0.5, 0), - - float3(0, 1, 0), - float3(0.5, 1, 0), - float3(1, 1, 0), - - float3(0, 0, 0.5), - float3(0.5, 0, 0.5), - float3(1, 0, 0.5), - - float3(0, 0.5, 0.5), - float3(0.5, 0.5, 0.5), - float3(1, 0.5, 0.5), - - float3(0, 1, 0.5), - float3(0.5, 1, 0.5), - float3(1, 1, 0.5), - - float3(0, 0, 1), - float3(0.5, 0, 1), - float3(1, 0, 1), - - float3(0, 0.5, 1), - float3(0.5, 0.5, 1), - float3(1, 0.5, 1), - - float3(0, 1, 1), - float3(0.5, 1, 1), - float3(0, 0, 0), -}; - -float4 SampleCubeX(float3 xsample, float3 dims) -{ - float3 c = xsample * (dims - float3(1.0f, 1.0f, 1.0f)); - int index = int(c.z * dims.x * dims.y + c.y * dims.x + c.x); - return float4(lut3d[index], 1.0f); -} - -float4 cscApplyLut3DTetra(const float3 color, const float3 dims) -{ - // make cube - float3 re_dims = dims - float3(1.0f, 1.0f, 1.0f); - float3 restored = color * re_dims; //restore position in table - - float3 black = floor(restored); - float3 white = ceil(restored); - - float3 fracts = frac(restored); // get normalized fractions - - float3 blackf = black / re_dims; - float3 whitef = white / re_dims; - - // select tetrahedron - bool3 cmp = fracts.rgb >= fracts.gbr; // (r>g, g>b, b>r) - int res = min(int(cmp.x) * 4 + int(cmp.y) * 2 + int(cmp.z) - 1, 5); - - // variants: - // rr t2 (001) // B C c.z c.z + c.y - // r>g, gb, b>r t3 (011) // G C c.y c.y + c.z - // r>g, gg, gr t1 (101) // B M --1 B c.z c.z + c.x - // r>g, g>b, b pushConstants : register(b16); - -PSInput main(float3 position : POSITION, float2 tc : TEXCOORD0) -{ - PSInput result; - - result.position = float4(position.x + pushConstants.displacement, position.y, position.z, 1.0f); - result.tc = tc; - - return result; -} \ No newline at end of file diff --git a/generator/generator.cpp b/generator/generator.cpp index 4d6292f2..381312bc 100644 --- a/generator/generator.cpp +++ b/generator/generator.cpp @@ -110,6 +110,9 @@ int Generator::GenerateCAPI() } for (auto& [name, h] : handle_map) { + if (!h.ext.empty()) + continue; + out_dx += MakeCHandle(h, impls[+ImplementedFor::DX12]); out_vk += MakeCHandle(h, impls[+ImplementedFor::Vulkan]); @@ -465,16 +468,28 @@ int Generator::GenerateCPPInlineDoc() } }; - for (auto& [k, v] : handle_map) { - if (v.functions.empty()) + for (auto& [k, h] : handle_map) { + if (h.functions.empty()) continue; - if (auto file = v.GetFile(ImplementedFor::DX12); !file.empty()) { - write_doc(v, file, impls[+ImplementedFor::DX12]); + if (!h.ext.empty()) { + auto ext_folder = extension_map[h.ext].ext_folder; + if (auto file = h.GetFile(ImplementedFor::DX12); !file.empty()) { + write_doc(h, file, impls[+ImplementedFor::DX12], std::filesystem::path{ ext_dir } / ext_folder); + } + + if (auto file = h.GetFile(ImplementedFor::Vulkan); !file.empty()) { + write_doc(h, file, impls[+ImplementedFor::Vulkan], std::filesystem::path{ ext_dir } / ext_folder); + } + continue; } - if (auto file = v.GetFile(ImplementedFor::Vulkan); !file.empty()) { - write_doc(v, file, impls[+ImplementedFor::Vulkan]); + if (auto file = h.GetFile(ImplementedFor::DX12); !file.empty()) { + write_doc(h, file, impls[+ImplementedFor::DX12]); + } + + if (auto file = h.GetFile(ImplementedFor::Vulkan); !file.empty()) { + write_doc(h, file, impls[+ImplementedFor::Vulkan]); } } @@ -598,6 +613,9 @@ std::string Generator::GenerateCPPPlatformTypedefs(std::string_view impl) output += wis::format("inline constexpr wis::ShaderIntermediate shader_intermediate = wis::ShaderIntermediate::{};\n\n", impl == "VK" ? "SPIRV" : "DXIL"); for (auto& [name, h] : handle_map) { + if (!h.ext.empty()) + continue; + output += wis::format("using {} = {}{};\n", name, impl, name); } @@ -610,7 +628,8 @@ std::string Generator::GenerateCPPPlatformTypedefs(std::string_view impl) output += k_delimiter; for (auto& v : variants) { - output += wis::format("using {} = {}{};\n", v->name, impl, v->name); + if (v->ext.empty()) + output += wis::format("using {} = {}{};\n", v->name, impl, v->name); } return output + "}\n"; @@ -718,7 +737,7 @@ void Generator::ParseFile(tinyxml2::XMLDocument& doc) ParseExtensions(exts); } -void Generator::ParseTypes(tinyxml2::XMLElement* types) +void Generator::ParseTypes(tinyxml2::XMLElement* types, std::string_view extension) { for (auto* type = types->FirstChildElement("type"); type; type = type->NextSiblingElement("type")) { @@ -732,7 +751,7 @@ void Generator::ParseTypes(tinyxml2::XMLElement* types) } else if (std::string_view(category) == "delegate") { ParseDelegate(type); } else if (std::string_view(category) == "variant") { - ParseVariant(*type); + ParseVariant(*type, extension); } } } @@ -932,19 +951,32 @@ void Generator::ParseExtensions(tinyxml2::XMLElement* extensions) enum_map.at("FactoryExtID").values.emplace_back(val); } else if (type == "Device") { ref.type = ExtensionType::Device; + WisEnumValue val{ + .name = name, + .doc = ref.doc, + .value = std::stoll(id), + }; + + enum_map.at("DeviceExtID").values.emplace_back(val); } + ParseHandles(ext, name); + ParseTypes(ext, name); ParseFunctions(ext); } } -void Generator::ParseHandles(tinyxml2::XMLElement* types) +void Generator::ParseHandles(tinyxml2::XMLElement* types, std::string_view extension) { for (auto* type = types->FirstChildElement("handle"); type; type = type->NextSiblingElement("handle")) { auto name = type->FindAttribute("name")->Value(); auto& ref = handle_map[name]; ref.name = name; + ref.ext = extension; + + if (!extension.empty()) + extension_map[extension].handles.emplace_back(name); if (auto* doc = type->FindAttribute("doc")) ref.doc = doc->Value(); @@ -1150,11 +1182,12 @@ void Generator::ParseDelegate(tinyxml2::XMLElement* type) ref.doc = size->Value(); } -void Generator::ParseVariant(tinyxml2::XMLElement& type) +void Generator::ParseVariant(tinyxml2::XMLElement& type, std::string_view extension) { auto name = type.FindAttribute("name")->Value(); auto& ref = variant_map[name]; ref.name = name; + ref.ext = extension; variants.emplace_back(&ref); if (auto* this_t = type.FindAttribute("for")) { @@ -1382,16 +1415,17 @@ std::pair Generator::MakeCVariant(const WisVariant& s) } for (auto& m : impl.members) { - auto mfull_name = GetCFullTypename(m.type, impl_tag); - std::string res_type; - - if (m.modifier == "ptr") - res_type = "*"; - + WisFunctionParameter wfp{ + .type_info = GetTypeInfo(m.type), + .type = m.type, + .name = m.name, + .modifier = m.modifier, + .default_value = m.default_value, + .doc = m.doc, + }; auto val_str = m.array_size.empty() - ? wis::format(" {} {};", mfull_name + res_type, m.name) - : wis::format(" {} {}[{}];", mfull_name, m.name, m.array_size); - + ? wis::format(" {};", GetCFullArg(wfp, impl_tag)) + : wis::format(" {} {}[{}];", GetCFullArg(wfp, impl_tag, true), m.name, m.array_size); st_decl += MakeCValueDocumentation(val_str, m.doc, s.name); } @@ -1431,23 +1465,20 @@ std::string Generator::MakeCPPVariant(const WisVariant& s, ImplementedFor impl) } for (auto& m : impl.members) { - auto mfull_name = GetCPPFullTypename(m.type, impl_tag); - std::string val_str; - std::string mod; - if (m.modifier == "ptr") - mod = '*'; + WisFunctionParameter wfp{ + .type_info = GetTypeInfo(m.type), + .type = m.type, + .name = m.name, + .modifier = m.modifier, + .default_value = m.default_value, + .doc = m.doc, + }; if (m.array_size.empty()) { - std::string def = ""; - if (!m.default_value.empty()) { - def = enum_map.contains(m.type) || bitmask_map.contains(m.type) - ? wis::format(" = {}::{}", mfull_name, m.default_value) - : wis::format(" = {}", m.default_value); - } - val_str = wis::format(" {} {}{};", mfull_name + mod, m.name, def); + val_str = wis::format(" {};", GetCPPFullArg(wfp, impl_tag)); } else { - val_str = wis::format(" std::array<{}, {}> {} {{}};", mfull_name, m.array_size, m.name); + val_str = wis::format(" std::array<{}, {}> {} {{}};", GetCPPFullArg(wfp, impl_tag, true), m.array_size, m.name); } st_decl += MakeCPPValueDocumentation(val_str, m.doc, s.name); } @@ -1616,8 +1647,8 @@ std::string Generator::MakeCPPBitmask(const WisBitmask& s) #pragma region C API std::string Generator::MakeCFunctionGenericDecl(const WisFunction& func, std::string_view impl) { - return wis::format("{}{{ return {}; }}\n", MakeCFunctionProto(func, "Wis", "inline"), - MakeCFunctionCall(func, "", impl)); + return wis::format("{}{{ {} {}; }}\n", MakeCFunctionProto(func, "Wis", "inline"), + func.return_type.IsVoid() ? "" : "return", MakeCFunctionCall(func, "", impl)); } std::string Generator::MakeCFunctionProto(const WisFunction& func, std::string_view impl, std::string_view pre_decl, bool enable_doc) { @@ -1970,21 +2001,52 @@ std::string Generator::MakeCExtensionHeader(const WisExtension& s) output += "#ifdef WISDOM_VULKAN\n"; auto impl_vk = impls[+ImplementedFor::Vulkan]; output += wis::format("typedef {}FactoryExtension {}{};\n", impl_vk, impl_vk, s.name); + for (auto& h : s.handles) { + output += MakeCHandle(handle_map[h], impl_vk) + '\n'; + } + output += MakeCHandleMethods(s, impl_vk) + '\n'; + for (auto& h : s.handles) { + output += MakeCHandleMethods(handle_map[h], impl_vk) + '\n'; + } output += "#endif\n\n"; output += "#ifdef WISDOM_DX12\n"; auto impl_dx = impls[+ImplementedFor::DX12]; output += wis::format("typedef {}FactoryExtension {}{};\n", impl_dx, impl_dx, s.name); + for (auto& h : s.handles) { + output += MakeCHandle(handle_map[h], impl_dx) + '\n'; + } + output += MakeCHandleMethods(s, impl_dx) + '\n'; + for (auto& h : s.handles) { + output += MakeCHandleMethods(handle_map[h], impl_dx) + '\n'; + } output += "#endif\n\n"; output += "#if defined(WISDOM_DX12) && !FORCEVK_SWITCH\n"; output += wis::format("typedef {}{} Wis{};\n", impl_dx, s.name, s.name); + for (auto& h : s.handles) { + output += MakeCHandleGeneric(handle_map[h], impl_dx) + '\n'; + } + output += MakeCHandleMethodsGeneric(s, impl_dx) + '\n'; + + for (auto& h : s.handles) { + output += MakeCHandleMethodsGeneric(handle_map[h], impl_dx) + '\n'; + } + output += "#elif defined(WISDOM_VULKAN)\n\n"; output += wis::format("typedef {}{} Wis{};\n", impl_vk, s.name, s.name); + for (auto& h : s.handles) { + output += MakeCHandleGeneric(handle_map[h], impl_vk) + '\n'; + } + output += MakeCHandleMethodsGeneric(s, impl_vk) + '\n'; + + for (auto& h : s.handles) { + output += MakeCHandleMethodsGeneric(handle_map[h], impl_vk) + '\n'; + } output += "#endif\n\n"; output += k_delimiter; @@ -2236,8 +2298,8 @@ std::string Generator::MakeCPPHandle(const WisHandle& s, std::string_view impl) continue; } - funcs += wis::format("{}{} noexcept{{\n return {};\n}}\n", MakeCPPFunctionProto(func, impl, func.return_type.has_result ? "[[nodiscard]] inline" : "inline", true, false), - func.const_func ? "const" : "", MakeCPPFunctionCall(func, wis::format("wis::Impl{}{}::", impl, s.name))); + funcs += wis::format("{}{} noexcept{{\n {} {};\n}}\n", MakeCPPFunctionProto(func, impl, func.return_type.has_result ? "[[nodiscard]] inline" : "inline", true, false), + func.const_func ? "const" : "", !func.return_type.IsVoid() ? "return" : "", MakeCPPFunctionCall(func, wis::format("wis::Impl{}{}::", impl, s.name))); } return wis::format("{} {{\n{}\n{}\n}};\n", head, ctor, funcs); diff --git a/generator/generator.h b/generator/generator.h index 7491e6f9..fa257d27 100644 --- a/generator/generator.h +++ b/generator/generator.h @@ -114,6 +114,7 @@ struct WisVariantImpl { struct WisVariant { std::string_view name; std::string_view doc; + std::string_view ext; std::string_view this_type; std::vector impls; Language implemented_for = Language::None; @@ -162,6 +163,11 @@ struct WisReturnType { std::string_view doc; std::string_view opt_name; std::string_view modifier; + + bool IsVoid() const noexcept + { + return type.empty() && !has_result; + } }; struct WisFunction { std::string_view name; @@ -189,6 +195,7 @@ struct WisFunction { struct WisHandle { std::string_view name; std::string_view doc; + std::string_view ext; std::vector functions; std::array files; // first is DX12, second is Vulkan @@ -235,6 +242,7 @@ enum class ExtensionType { struct WisExtension : WisHandle { ExtensionType type = ExtensionType::None; std::string_view ext_folder; + std::vector handles; }; struct WisConversion { @@ -277,9 +285,9 @@ class Generator std::string GenerateCPPPlatformExportHeader(std::string_view impl); void ParseFile(tinyxml2::XMLDocument& doc); - void ParseTypes(tinyxml2::XMLElement* types); + void ParseTypes(tinyxml2::XMLElement* types, std::string_view extension = ""); void ParseIncludes(tinyxml2::XMLElement* handles); - void ParseHandles(tinyxml2::XMLElement* handles); + void ParseHandles(tinyxml2::XMLElement* handles, std::string_view extension = ""); void ParseFunctions(tinyxml2::XMLElement* functions); void ParseExtensions(tinyxml2::XMLElement* extensions); @@ -287,7 +295,7 @@ class Generator void ParseEnum(tinyxml2::XMLElement& type); void ParseBitmask(tinyxml2::XMLElement& type); void ParseDelegate(tinyxml2::XMLElement* type); - void ParseVariant(tinyxml2::XMLElement& type); + void ParseVariant(tinyxml2::XMLElement& type, std::string_view extension); std::string FinalizeCDocumentation(std::string doc, std::string_view this_type, std::string_view impl = ""); std::string FinalizeCPPDocumentation(std::string doc, std::string_view this_type, std::string_view impl = ""); diff --git a/tests/basic/CMakeLists.txt b/tests/basic/CMakeLists.txt index 911a2b78..a761b8cb 100644 --- a/tests/basic/CMakeLists.txt +++ b/tests/basic/CMakeLists.txt @@ -1,6 +1,7 @@ project("test-basic") -set(TEST_SOURCES "relaxed_destruction_order.cpp" "extension_tests.cpp") +set(TEST_SOURCES "relaxed_destruction_order.cpp" "extension_tests.cpp" + "copy_tests.cpp") if(WISDOM_DX12) add_executable(${PROJECT_NAME}-dx12 ${TEST_SOURCES}) diff --git a/tests/basic/copy_tests.cpp b/tests/basic/copy_tests.cpp new file mode 100644 index 00000000..2527b0b8 --- /dev/null +++ b/tests/basic/copy_tests.cpp @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include + +struct LogProvider : public wis::LogLayer { + virtual void Log(wis::Severity sev, std::string message, wis::source_location sl = wis::source_location::current()) override + { + std::cout << wis::format("[{}]: {}\n", wis::severity_strings[+sev], message); + }; +}; + +static void DebugCallback(wis::Severity severity, const char* message, void* user_data) +{ + std::cout << message << std::endl; + if (severity >= wis::Severity::Error) { + auto& error = *static_cast(user_data); + error = true; + } +} + +TEST_CASE("basic_copy_region") +{ + wis::LibLogger::SetLogLayer(std::make_shared()); + + bool error = false; + + wis::DebugExtension ext; + std::array exts = { &ext }; + + wis::ExtendedAllocation ext_alloc; + wis::DeviceExtension* exts_d[] = { &ext_alloc }; + + auto [res, factory] = wis::CreateFactory(true, exts.data(), 1); + auto [res1, info] = ext.CreateDebugMessenger(&DebugCallback, &error); + + wis::Device device; + + for (size_t i = 0;; i++) { + auto [res, adapter] = factory.GetAdapter(i); + if (res.status == wis::Status::Ok) { + wis::AdapterDesc desc; + res = adapter.GetDesc(&desc); + std::cout << "Adapter: " << desc.description.data() << "\n"; + + auto [res, hdevice] = wis::CreateDevice(std::move(adapter), exts_d, 1); + if (res.status == wis::Status::Ok) { + device = std::move(hdevice); + break; + }; + + } else { + break; + } + } + + auto [res2, queue] = device.CreateCommandQueue(wis::QueueType::Graphics); + auto [res3, fence] = device.CreateFence(); + auto [res4, cmd_list] = device.CreateCommandList(wis::QueueType::Graphics); + auto [res5, allocator] = device.CreateAllocator(); + auto [res6, buffer] = allocator.CreateReadbackBuffer(1024); + + using namespace wis; + wis::TextureDesc desc{ + .format = wis::DataFormat::RGBA8Unorm, + .size = { 4, 4, 1 }, + .usage = wis::TextureUsage::CopySrc | wis::TextureUsage::HostCopy + }; + auto [extres, texture] = ext_alloc.CreateGPUUploadTexture(allocator, desc, wis::TextureState::Common); + REQUIRE(extres.status == wis::Status::Ok); + + // clang-format off + constexpr uint32_t data[16] = { + 0,0,0,0, + 0,0,0,0, + 0,0,0xffffffff,0xffffffff, + 0,0,0xffffffff,0xffffffff + }; + // clang-format on + + extres = ext_alloc.WriteMemoryToSubresourceDirect(data, + texture, + wis::TextureState::Common, + wis::TextureRegion{ + .size = { 4, 4, 1 }, + .format = wis::DataFormat::RGBA8Unorm, + }); + + REQUIRE(extres.status == wis::Status::Ok); + + wis::TextureBarrier barrier{ + .sync_before = wis::BarrierSync::None, + .sync_after = wis::BarrierSync::Copy, + .access_before = wis::ResourceAccess::NoAccess, + .access_after = wis::ResourceAccess::CopySource, + .state_before = wis::TextureState::Common, + .state_after = wis::TextureState::CopySource, + }; + + cmd_list.TextureBarrier(barrier, texture); + wis::BufferTextureCopyRegion region{ + .buffer_offset = 4, + .texture = { + .offset = { 2, 2, 0 }, + .size = { 2, 2, 1 }, + .format = wis::DataFormat::RGBA8Unorm, + } + }; + cmd_list.CopyTextureToBuffer(texture, buffer, ®ion, 1); + cmd_list.Close(); + + wis::CommandListView cmd_list_view{ cmd_list }; + queue.ExecuteCommandLists(&cmd_list_view, 1); + queue.SignalQueue(fence, 1); + fence.Wait(1); + + auto* data_ptr = buffer.Map(); + constexpr uint32_t data_expected[] = { 0, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }; + + for (size_t i = 0; i < 5; i++) { + REQUIRE(data_ptr[i] == data_expected[i]); + } + buffer.Unmap(); +} diff --git a/tests/basic/relaxed_destruction_order.cpp b/tests/basic/relaxed_destruction_order.cpp index 50e994be..e610144f 100644 --- a/tests/basic/relaxed_destruction_order.cpp +++ b/tests/basic/relaxed_destruction_order.cpp @@ -5,8 +5,9 @@ #include struct LogProvider : public wis::LogLayer { - virtual void Log(wis::Severity sev, std::string message, wis::source_location sl = wis::source_location::current()) override { - // std::cout << wis::format("[{}]: {}\n", wis::severity_strings[+sev], message); + virtual void Log(wis::Severity sev, std::string message, wis::source_location sl = wis::source_location::current()) override + { + std::cout << wis::format("[{}]: {}\n", wis::severity_strings[+sev], message); }; }; @@ -76,6 +77,42 @@ TEST_CASE("basic_device") REQUIRE(fence); REQUIRE(cmd_list); + SECTION("texture replacement") + { + wis::Texture a; + auto [res6, texture] = allocator.CreateTexture(wis::TextureDesc{ .format = wis::DataFormat::RGBA8Unorm, + .size = { + + .width = 1024, + .height = 1024, + .depth_or_layers = 1, + }, + .usage = wis::TextureUsage::CopySrc }); + REQUIRE(texture); + + a = std::move(texture); + REQUIRE(a); + REQUIRE_FALSE(texture); + + auto [res7, texture2] = allocator.CreateTexture(wis::TextureDesc{ .format = wis::DataFormat::RGBA8Unorm, + .size = { + + .width = 1024, + .height = 1024, + .depth_or_layers = 1, + }, + .usage = wis::TextureUsage::CopySrc }); + + REQUIRE(texture2); + texture = std::move(texture2); + REQUIRE(texture); + REQUIRE_FALSE(texture2); + + a = std::move(texture); + REQUIRE(a); + REQUIRE_FALSE(texture); + } + SECTION("fence destruction") { fence = {}; diff --git a/tests/manual/extended_allocation/test.cpp b/tests/manual/extended_allocation/test.cpp index 850bab27..f6f8c1b0 100644 --- a/tests/manual/extended_allocation/test.cpp +++ b/tests/manual/extended_allocation/test.cpp @@ -159,6 +159,7 @@ int TestStagedCopy(const wis::ResourceAllocator& allocator, wis::Device& device, std::cout << "Elapsed time: " << elapsed.count() << "s\n"; std::cout << "Per copy time: " << elapsed.count() / 1000 << "s\n"; + return 0; } int TestDirectWrite(const Test& test, const wis::Device& device, const wis::ResourceAllocator& alloc, wis::Size2D img_size) @@ -213,6 +214,7 @@ int TestDirectWrite(const Test& test, const wis::Device& device, const wis::Reso std::cout << "Elapsed time: " << elapsed.count() << "s\n"; std::cout << "Per copy time: " << elapsed.count() / 1000 << "s\n"; + return 0; } int main() diff --git a/wisdom/dx12.cmake b/wisdom/dx12.cmake index d51487b4..2dd1b45e 100644 --- a/wisdom/dx12.cmake +++ b/wisdom/dx12.cmake @@ -31,7 +31,7 @@ if(WISDOM_BUILD_BINARIES) "include/wisdom/dx12/dx12_device.h" "include/wisdom/dx12/dx12_command_queue.h" "include/wisdom/dx12/dx12_command_list.h" - "include/wisdom/dx12/dx12_descriptor_buffer.h" + "include/wisdom/dx12/dx12_descriptor_storage.h" "include/wisdom/dx12/dx12_root_signature.h" "include/wisdom/dx12/dx12_resource.h" "include/wisdom/dx12/dx12_shader.h" @@ -45,7 +45,6 @@ if(WISDOM_BUILD_BINARIES) PRIVATE "include/wisdom/dx12/impl/dx12_allocator.cpp" "include/wisdom/dx12/impl/dx12_command_list.cpp" - "include/wisdom/dx12/impl/dx12_descriptor_buffer.cpp" "include/wisdom/dx12/impl/dx12_device.cpp" "include/wisdom/dx12/impl/dx12_factory.cpp" "include/wisdom/dx12/impl/dx12_fence.cpp" diff --git a/wisdom/extensions/CMakeLists.txt b/wisdom/extensions/CMakeLists.txt index 4dff8de0..35c21ac9 100644 --- a/wisdom/extensions/CMakeLists.txt +++ b/wisdom/extensions/CMakeLists.txt @@ -7,3 +7,13 @@ add_library(wis::extension ALIAS wisdom-extension) add_subdirectory(debug_info) add_subdirectory(extended_allocation) +add_subdirectory(descriptor_buffer) + +install( + TARGETS wisdom-extension wisdom-extension-headers + EXPORT wisdom-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) diff --git a/wisdom/extensions/debug_info/wisdom/wisdom_debug.h b/wisdom/extensions/debug_info/wisdom/wisdom_debug.h index 3bb50e27..559d75d0 100644 --- a/wisdom/extensions/debug_info/wisdom/wisdom_debug.h +++ b/wisdom/extensions/debug_info/wisdom/wisdom_debug.h @@ -30,8 +30,8 @@ class ImplDX12DebugExtension : public QueryInternalExtension(E_NOTIMPL); - if (auto dc = debugController.as()) - dc->SetEnableGPUBasedValidation(true); + // if (auto dc = debugController.as()) + // dc->SetEnableGPUBasedValidation(true); return {}; } diff --git a/wisdom/extensions/descriptor_buffer/CMakeLists.txt b/wisdom/extensions/descriptor_buffer/CMakeLists.txt new file mode 100644 index 00000000..26ec06a3 --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/CMakeLists.txt @@ -0,0 +1,88 @@ +project(wisdom-descriptor-buffer) + +add_library(wisdom-descriptor-buffer-headers INTERFACE) +add_library(wis::descriptor-buffer-headers ALIAS + wisdom-descriptor-buffer-headers) + +target_link_libraries(wisdom-descriptor-buffer-headers INTERFACE wisdom-headers) + +target_include_directories( + wisdom-descriptor-buffer-headers + INTERFACE $ + $) + +if(WISDOM_BUILD_BINARIES) + add_library( + wisdom-descriptor-buffer STATIC + "wisdom/wisdom_descriptor_buffer.h" + "wisdom/vk_descriptor_buffer.h" + "wisdom/impl/vk_descriptor_buffer.cpp" + "wisdom/dx12_descriptor_buffer.h" + "wisdom/impl/dx12_descriptor_buffer.cpp" + "wisdom/impl/impl.dx.cpp" + "wisdom/impl/impl.vk.cpp") + add_library(wis::descriptor-buffer ALIAS wisdom-descriptor-buffer) + target_link_libraries(wisdom-descriptor-buffer PUBLIC wis::wisdom) + target_include_directories( + wisdom-descriptor-buffer + PUBLIC $ + $) +else() + add_library(wisdom-descriptor-buffer INTERFACE) + add_library(wis::descriptor-buffer ALIAS wisdom-descriptor-buffer) + target_link_libraries(wisdom-descriptor-buffer + INTERFACE wisdom-descriptor-buffer-headers) +endif() + +# link the debug library to the main wisdom extension library +target_link_libraries(wisdom-extension INTERFACE wisdom-descriptor-buffer) +target_link_libraries(wisdom-extension-headers + INTERFACE wisdom-descriptor-buffer-headers) + +install( + TARGETS wisdom-descriptor-buffer wisdom-descriptor-buffer-headers + EXPORT wisdom-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wisdom) + +if(WISDOM_GENERATE_FUNCTIONS) + if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux") + # Generate a shell script for Linux + set(LAUNCHER_SCRIPT + "#!/bin/sh\nexec \"\$\" -l -i ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/gen/vk_functions.in -o ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/generated/vk_functions.hpp \"$@\"\n" + ) + file( + GENERATE + OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/wisdom/gen/generate_functions.sh" + CONTENT "${LAUNCHER_SCRIPT}") + execute_process( + COMMAND chmod +x + ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/gen/generate_functions.sh) + elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") + # Generate a batch file for Windows + set(LAUNCHER_SCRIPT + "@echo off\nstart /B \"\" \"\$\" -l -i ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/gen/vk_functions.in -o ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/generated/vk_functions.hpp %*\n" + ) + file( + GENERATE + OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/wisdom/gen/generate_functions.bat" + CONTENT "${LAUNCHER_SCRIPT}") + endif() + + if(WISDOM_GENERATE_API) + add_custom_target( + GenerateFunctions_${PROJECT_NAME} + COMMAND + $ -l -i + ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/gen/vk_functions.in -o + ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/generated/vk_functions.hpp) + add_dependencies(wisdom-descriptor-buffer-headers + GenerateFunctions_${PROJECT_NAME}) + endif() +endif() diff --git a/wisdom/extensions/descriptor_buffer/wisdom/dx12_descriptor_buffer.h b/wisdom/extensions/descriptor_buffer/wisdom/dx12_descriptor_buffer.h new file mode 100644 index 00000000..6c153b32 --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/dx12_descriptor_buffer.h @@ -0,0 +1,120 @@ +#ifndef WIS_DX12_DESCRIPTOR_BUFFER_H +#define WIS_DX12_DESCRIPTOR_BUFFER_H +#include +#include +#include +#include +#include + +namespace wis { + +class DX12DescriptorBuffer; + +template<> +struct Internal { + wis::com_ptr device; + wis::com_ptr heap; + CD3DX12_CPU_DESCRIPTOR_HANDLE heap_start; + CD3DX12_GPU_DESCRIPTOR_HANDLE heap_gpu_start; + uint32_t heap_increment = 0; + + Internal() = default; + Internal(wis::com_ptr heap, uint32_t heap_increment) noexcept + : heap(std::move(heap)), heap_increment(heap_increment) + { + heap_start = CD3DX12_CPU_DESCRIPTOR_HANDLE(this->heap->GetCPUDescriptorHandleForHeapStart()); + heap_gpu_start = CD3DX12_GPU_DESCRIPTOR_HANDLE(this->heap->GetGPUDescriptorHandleForHeapStart()); + this->heap->GetDevice(device.iid(), device.put_void()); + } +}; + +class ImplDX12DescriptorBuffer : public QueryInternal +{ +public: + ImplDX12DescriptorBuffer() = default; + explicit ImplDX12DescriptorBuffer(wis::com_ptr heap, uint32_t heap_increment) noexcept + : QueryInternal(std::move(heap), heap_increment) + { + } + + operator bool() const noexcept + { + return bool(heap); + } + + operator DX12DescriptorBufferView() const noexcept + { + return { heap.get() }; + } + operator DX12DescriptorBufferGPUView() const noexcept + { + return { heap_gpu_start, heap_increment }; + } + +public: + WIS_INLINE void WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::DX12SamplerView sampler) noexcept; + WIS_INLINE void WriteShaderResource(uint64_t aligned_table_offset, uint32_t index, wis::DX12ShaderResourceView resource) noexcept; + WIS_INLINE void WriteConstantBuffer(uint64_t aligned_table_offset, uint32_t index, wis::DX12BufferView buffer, uint32_t size, uint32_t offset) noexcept; +}; + +#pragma region DX12DescriptorBuffer +/** + * @brief Buffer storage for descriptors. + * It is the most flexible implementation of storage for descriptors, as it supports both bindful and bindless + * Descriptor approaches. Works like an aligned table of elements of the same size. + * Alignment and size of descriptors are varying between implementation and heap types. + * Both metrixs are available to retrieval from + * */ +class DX12DescriptorBuffer : public wis::ImplDX12DescriptorBuffer +{ +public: + using wis::ImplDX12DescriptorBuffer::ImplDX12DescriptorBuffer; + +public: + /** + * @brief Writes the sampler to the sampler descriptor buffer. + * Must be called with Sampler descriptor buffer, which was created with wis::DescriptorHeapType::Sampler. + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param sampler The sampler to write. + * */ + inline void WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::DX12SamplerView sampler) noexcept + { + wis::ImplDX12DescriptorBuffer::WriteSampler(aligned_table_offset, index, std::move(sampler)); + } + /** + * @brief Writes the shader resource to the shader resource descriptor buffer. + * Must be called with Shader Resource descriptor buffer, which was created with wis::DescriptorHeapType::Descriptor. + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param resource The shader resource to write. + * */ + inline void WriteShaderResource(uint64_t aligned_table_offset, uint32_t index, wis::DX12ShaderResourceView resource) noexcept + { + wis::ImplDX12DescriptorBuffer::WriteShaderResource(aligned_table_offset, index, std::move(resource)); + } + /** + * @brief Writes the constant buffer to the constant buffer descriptor buffer. + * Must be called with Constant Buffer descriptor buffer, which was created with wis::DescriptorHeapType::Descriptor. + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with wis::DX12Device. + * @param index Binding index in descriptor table. + * @param buffer The buffer to write. + * @param buffer_size The size of the part of the buffer in bytes. + * @param offset Offset from buffer beginning. offset + buffer_size must be less or equal buffer overall size. + * */ + inline void WriteConstantBuffer(uint64_t aligned_table_offset, uint32_t index, wis::DX12BufferView buffer, uint32_t buffer_size, uint32_t offset = 0) noexcept + { + wis::ImplDX12DescriptorBuffer::WriteConstantBuffer(aligned_table_offset, index, std::move(buffer), buffer_size, offset); + } +}; +#pragma endregion DX12DescriptorBuffer + +} // namespace wis +#ifndef WISDOM_BUILD_BINARIES +#include "impl/dx12_descriptor_buffer.cpp" +#endif // !WISDOM_BUILD_BINARIES + +#endif // !DX12_DESCRIPTOR_BUFFER_H diff --git a/wisdom/extensions/descriptor_buffer/wisdom/gen/vk_functions.in b/wisdom/extensions/descriptor_buffer/wisdom/gen/vk_functions.in new file mode 100644 index 00000000..09e8869c --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/gen/vk_functions.in @@ -0,0 +1,7 @@ +[VKDescBufferExt] + +# Device table +vkCmdBindDescriptorBuffersEXT +vkCmdSetDescriptorBufferOffsetsEXT +vkGetDescriptorSetLayoutBindingOffsetEXT +vkGetDescriptorEXT diff --git a/wisdom/extensions/descriptor_buffer/wisdom/generated/vk_functions.hpp b/wisdom/extensions/descriptor_buffer/wisdom/generated/vk_functions.hpp new file mode 100644 index 00000000..5adae58c --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/generated/vk_functions.hpp @@ -0,0 +1,33 @@ +#pragma once +#include +#include +#include + +namespace wis { + +struct VKDescBufferExtDevice { + PFN_vkCmdBindDescriptorBuffersEXT vkCmdBindDescriptorBuffersEXT; + PFN_vkGetDescriptorSetLayoutBindingOffsetEXT vkGetDescriptorSetLayoutBindingOffsetEXT; + PFN_vkCmdSetDescriptorBufferOffsetsEXT vkCmdSetDescriptorBufferOffsetsEXT; + PFN_vkGetDescriptorEXT vkGetDescriptorEXT; + +public: + bool Init(VkDevice device, PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr) noexcept + { + vkCmdBindDescriptorBuffersEXT = (PFN_vkCmdBindDescriptorBuffersEXT)vkGetDeviceProcAddr(device, "vkCmdBindDescriptorBuffersEXT"); + if (vkCmdBindDescriptorBuffersEXT == nullptr) + return false; + vkGetDescriptorSetLayoutBindingOffsetEXT = (PFN_vkGetDescriptorSetLayoutBindingOffsetEXT)vkGetDeviceProcAddr(device, "vkGetDescriptorSetLayoutBindingOffsetEXT"); + if (vkGetDescriptorSetLayoutBindingOffsetEXT == nullptr) + return false; + vkCmdSetDescriptorBufferOffsetsEXT = (PFN_vkCmdSetDescriptorBufferOffsetsEXT)vkGetDeviceProcAddr(device, "vkCmdSetDescriptorBufferOffsetsEXT"); + if (vkCmdSetDescriptorBufferOffsetsEXT == nullptr) + return false; + vkGetDescriptorEXT = (PFN_vkGetDescriptorEXT)vkGetDeviceProcAddr(device, "vkGetDescriptorEXT"); + if (vkGetDescriptorEXT == nullptr) + return false; + return true; + } +}; + +} // namespace wis diff --git a/wisdom/extensions/descriptor_buffer/wisdom/impl/dx12_descriptor_buffer.cpp b/wisdom/extensions/descriptor_buffer/wisdom/impl/dx12_descriptor_buffer.cpp new file mode 100644 index 00000000..db226d0d --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/impl/dx12_descriptor_buffer.cpp @@ -0,0 +1,40 @@ +#ifndef WIS_DX12_DESCRIPTOR_BUFFER_CPP +#define WIS_DX12_DESCRIPTOR_BUFFER_CPP + +#if defined(WISDOM_DX12) +#include + +void wis::ImplDX12DescriptorBuffer::WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::DX12SamplerView sampler) noexcept +{ + auto handle = heap->GetCPUDescriptorHandleForHeapStart(); + handle.ptr += aligned_table_offset + index * heap_increment; + + const auto& sampler_handle = std::get<0>(sampler); + device->CopyDescriptorsSimple(1, handle, sampler_handle, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); +} + +void wis::ImplDX12DescriptorBuffer::WriteShaderResource(uint64_t aligned_table_offset, uint32_t index, wis::DX12ShaderResourceView resource) noexcept +{ + auto handle = heap->GetCPUDescriptorHandleForHeapStart(); + handle.ptr += index * heap_increment; + + auto sampler_handle = std::get<0>(resource); + device->CopyDescriptorsSimple(1, handle, sampler_handle, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); +} + +void wis::ImplDX12DescriptorBuffer::WriteConstantBuffer(uint64_t aligned_table_offset, uint32_t index, wis::DX12BufferView buffer, uint32_t size, uint32_t offset) noexcept +{ + auto handle = heap->GetCPUDescriptorHandleForHeapStart(); + handle.ptr += index * heap_increment; + + D3D12_CONSTANT_BUFFER_VIEW_DESC desc{ + .BufferLocation = std::get<0>(buffer)->GetGPUVirtualAddress() + offset, + .SizeInBytes = wis::detail::aligned_size(size, uint32_t(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT)) + }; + + device->CreateConstantBufferView(&desc, handle); +} + +#endif // WISDOM_DX12 + +#endif // !DX12_DESCRIPTOR_BUFFER_CPP diff --git a/wisdom/extensions/descriptor_buffer/wisdom/impl/impl.dx.cpp b/wisdom/extensions/descriptor_buffer/wisdom/impl/impl.dx.cpp new file mode 100644 index 00000000..34f2c701 --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/impl/impl.dx.cpp @@ -0,0 +1,189 @@ +#ifndef WISDOM_DESCRIPTOR_BUFFER_DX_CPP +#define WISDOM_DESCRIPTOR_BUFFER_DX_CPP + +#if defined(WISDOM_DX12) +#include +#include + +namespace wis::detail { +constexpr inline D3D12_ROOT_PARAMETER_TYPE to_dx_ext(wis::DescriptorType type) noexcept +{ + switch (type) { + case wis::DescriptorType::Buffer: + case wis::DescriptorType::Texture: + return D3D12_ROOT_PARAMETER_TYPE_SRV; + case wis::DescriptorType::ConstantBuffer: + return D3D12_ROOT_PARAMETER_TYPE_CBV; + case wis::DescriptorType::RWBuffer: + case wis::DescriptorType::RWTexture: + return D3D12_ROOT_PARAMETER_TYPE_UAV; + default: + return D3D12_ROOT_PARAMETER_TYPE_CBV; + } +} +} // namespace wis::detail + +wis::ResultValue +wis::ImplDX12DescriptorBufferExtension::CreateRootSignature(const PushConstant* root_constants, + uint32_t constants_size, + const PushDescriptor* push_descriptors, + uint32_t push_descriptors_size, + const wis::DescriptorTable* tables, + uint32_t tables_count) const noexcept +{ + if (constants_size > wis::max_push_constants) { + return wis::make_result(E_INVALIDARG); + } + if (push_descriptors_size > wis::max_push_descriptors) { + return wis::make_result(E_INVALIDARG); + } + if (tables_count + constants_size + push_descriptors_size > 64) { + return wis::make_result(E_INVALIDARG); + } + + D3D12_ROOT_PARAMETER1 root_params[64]{}; // max overall size of root parameters + + // push constants + std::array stage_map{}; + std::fill(stage_map.begin(), stage_map.end(), -1); + + for (uint32_t i = 0; i < constants_size; ++i) { + auto& constant = root_constants[i]; + root_params[i] = { + .ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS, + .Constants = { + .ShaderRegister = constant.bind_register, + .RegisterSpace = 0, + .Num32BitValues = constant.size_bytes / 4, + }, + .ShaderVisibility = D3D12_SHADER_VISIBILITY(constant.stage), + }; + stage_map[+constant.stage] = i; + } + + // push descriptors + for (uint32_t i = 0; i < push_descriptors_size; ++i) { + auto& descriptor = push_descriptors[i]; + root_params[i + constants_size] = { + .ParameterType = detail::to_dx_ext(descriptor.type), + .Descriptor = { + .ShaderRegister = i, + .RegisterSpace = 0, // always 0 for push descriptors + }, + .ShaderVisibility = convert_dx(descriptor.stage), + }; + } + + size_t memory_size = 0; + for (uint32_t i = 0; i < tables_count; ++i) { + auto& table = tables[i]; + memory_size += table.entry_count; + } + + auto memory = wis::detail::make_unique_for_overwrite(memory_size); + if (!memory) + return wis::make_result(E_OUTOFMEMORY); + + uint32_t offset = 0; + for (uint32_t i = constants_size; i < constants_size + tables_count; ++i) { + auto& table = tables[i - constants_size]; + + for (size_t j = offset; j < table.entry_count + offset; j++) { + auto& entry = table.entries[j - offset]; + memory[j] = { + .RangeType = convert_dx(entry.type), + .NumDescriptors = entry.count, + .BaseShaderRegister = entry.bind_register, + .RegisterSpace = 0, + .Flags = entry.count == UINT32_MAX ? D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE : D3D12_DESCRIPTOR_RANGE_FLAG_NONE, // always volatile for unbounded arrays + .OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND, + }; + } + + root_params[i] = { + .ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, + .DescriptorTable = { + .NumDescriptorRanges = table.entry_count, + .pDescriptorRanges = memory.get() + offset, + }, + .ShaderVisibility = D3D12_SHADER_VISIBILITY(table.stage), + }; + offset += table.entry_count; + } + + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC desc; + desc.Init_1_1(constants_size + push_descriptors_size + tables_count, root_params, 0, nullptr, flags); + + wis::com_ptr signature; + wis::com_ptr error; + HRESULT hr = D3D12SerializeVersionedRootSignature(&desc, signature.put(), error.put()); + + if (!wis::succeeded(hr)) + return wis::make_result(hr); + + wis::com_ptr rsig; + hr = device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), + __uuidof(*rsig), rsig.put_void()); + + if (!wis::succeeded(hr)) + return wis::make_result(hr); + + return DX12RootSignature{ std::move(rsig), stage_map, constants_size, push_descriptors_size }; +} + +wis::ResultValue +wis::ImplDX12DescriptorBufferExtension::CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, + wis::DescriptorMemory memory_type, + uint64_t memory_bytes) const noexcept +{ + auto xheap_type = convert_dx(heap_type); + auto inc_size = device->GetDescriptorHandleIncrementSize(xheap_type); + auto aligned_size = wis::detail::aligned_size(memory_bytes, uint64_t(inc_size)); + D3D12_DESCRIPTOR_HEAP_DESC desc{ + .Type = convert_dx(heap_type), + .NumDescriptors = uint32_t(aligned_size / inc_size), + .Flags = convert_dx(memory_type), + .NodeMask = 0, + }; + wis::com_ptr heap; + auto hr = device->CreateDescriptorHeap(&desc, heap.iid(), heap.put_void()); + if (!wis::succeeded(hr)) + return wis::make_result(hr); + + return DX12DescriptorBuffer{ std::move(heap), device->GetDescriptorHandleIncrementSize(desc.Type) }; +} + +void wis::ImplDX12DescriptorBufferExtension::SetDescriptorBuffers(wis::DX12CommandListView cmd_list, + wis::DX12DescriptorBufferView resource_desc_buffer, + wis::DX12DescriptorBufferView sampler_desc_buffer) const noexcept +{ + auto* list = reinterpret_cast(std::get<0>(cmd_list)); + + auto* b1 = std::get<0>(resource_desc_buffer); + auto* b2 = std::get<0>(sampler_desc_buffer); + + std::array buffers{ + b1 ? b1 : b2, + b2, + }; + + auto buffer_count = (b1 != nullptr) + (b2 != nullptr); + list->SetDescriptorHeaps(buffer_count, buffers.data()); +} + +void wis::ImplDX12DescriptorBufferExtension::SetDescriptorTableOffset(wis::DX12CommandListView cmd_list, + wis::DX12RootSignatureView root_signature, + uint32_t root_table_index, + wis::DX12DescriptorBufferGPUView buffer, + uint32_t table_aligned_byte_offset) const noexcept +{ + auto handle = std::get<0>(buffer); + auto* list = reinterpret_cast(std::get<0>(cmd_list)); + uint32_t root_table_offset = std::get<2>(root_signature); // offset of the root table in the root signature (after push constants and push desriptors) + list->SetGraphicsRootDescriptorTable(root_table_offset + root_table_index, + CD3DX12_GPU_DESCRIPTOR_HANDLE(handle, table_aligned_byte_offset)); +} + +#endif // WISDOM_DX12 +#endif // WISDOM_EXTENDED_ALLOCATION_CPP diff --git a/wisdom/extensions/descriptor_buffer/wisdom/impl/impl.vk.cpp b/wisdom/extensions/descriptor_buffer/wisdom/impl/impl.vk.cpp new file mode 100644 index 00000000..ab7ed067 --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/impl/impl.vk.cpp @@ -0,0 +1,351 @@ +#ifndef WISDOM_DESCRIPTOR_BUFFER_VK_CPP +#define WISDOM_DESCRIPTOR_BUFFER_VK_CPP +#include + +#if defined(WISDOM_VULKAN) +bool wis::ImplVKDescriptorBufferExtension::GetExtensionInfo(const std::unordered_map>& available_extensions, + std::unordered_set& ext_name_set, + std::unordered_map& structure_map, + std::unordered_map& property_map) noexcept +{ + if (available_extensions.contains(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME)) { + ext_name_set.insert(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME); + structure_map[VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT] = sizeof(VkPhysicalDeviceDescriptorBufferFeaturesEXT); + property_map[VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT] = sizeof(VkPhysicalDeviceDescriptorBufferPropertiesEXT); + } else + return false; + + if (available_extensions.contains(VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME)) { + ext_name_set.insert(VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME); + structure_map[VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT] = sizeof(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT); + } else if (available_extensions.contains(VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME)) { + ext_name_set.insert(VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME); + structure_map[VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE] = sizeof(VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE); + } else + return false; + + return true; +} + +wis::Result +wis::ImplVKDescriptorBufferExtension::Init(const wis::VKDevice& instance, + const std::unordered_map& structure_map, + const std::unordered_map& property_map) noexcept +{ + if (!property_map.contains(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT)) { + return wis::success; + } + + device = instance.GetInternal().device; + allocator = instance.GetInternal().allocator; // Get the allocator from the device + + auto& vk_descriptor_buffer_properties = *reinterpret_cast(property_map.at(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT)); + + descriptor_buffer_props.constant_buffer_size = uint16_t(vk_descriptor_buffer_properties.uniformBufferDescriptorSize); + descriptor_buffer_props.storage_buffer_size = uint16_t(vk_descriptor_buffer_properties.storageBufferDescriptorSize); + + descriptor_buffer_props.sampled_image_size = uint16_t(vk_descriptor_buffer_properties.sampledImageDescriptorSize); + descriptor_buffer_props.storage_image_size = uint16_t(vk_descriptor_buffer_properties.storageImageDescriptorSize); + + descriptor_buffer_props.storage_texel_buffer_size = uint16_t(vk_descriptor_buffer_properties.storageTexelBufferDescriptorSize); + descriptor_buffer_props.uniform_texel_buffer_size = uint16_t(vk_descriptor_buffer_properties.uniformTexelBufferDescriptorSize); + + auto max1 = std::max(vk_descriptor_buffer_properties.uniformBufferDescriptorSize, vk_descriptor_buffer_properties.storageBufferDescriptorSize); + auto max2 = std::max(vk_descriptor_buffer_properties.sampledImageDescriptorSize, vk_descriptor_buffer_properties.storageImageDescriptorSize); + auto max3 = std::max(vk_descriptor_buffer_properties.storageTexelBufferDescriptorSize, vk_descriptor_buffer_properties.uniformTexelBufferDescriptorSize); + + auto max12 = std::max(max1, max2); + + descriptor_buffer_props.mutable_descriptor_size = uint16_t(std::max(max12, max3)); + descriptor_buffer_props.sampler_size = uint16_t(vk_descriptor_buffer_properties.samplerDescriptorSize); + descriptor_buffer_props.offset_alignment = uint16_t(vk_descriptor_buffer_properties.descriptorBufferOffsetAlignment); + + ftable.Init(device.get(), device.gtable().vkGetDeviceProcAddr); + return wis::success; +} + +wis::ResultValue +wis::ImplVKDescriptorBufferExtension::CreateRootSignature(const PushConstant* constants, + uint32_t constants_size, + const PushDescriptor* push_descriptors, + uint32_t push_descriptors_size, + const wis::DescriptorTable* tables, + uint32_t tables_count) const noexcept +{ + + if (constants_size > wis::max_push_constants) { + return wis::make_result(VkResult::VK_ERROR_UNKNOWN); + } + if (push_descriptors_size > wis::max_push_descriptors) { + return wis::make_result(VkResult::VK_ERROR_UNKNOWN); + } + + std::unique_ptr vk_dsl; + if (tables_count > 0 || push_descriptors_size > 0) { + if (vk_dsl = wis::detail::make_unique_for_overwrite(tables_count + 1); !vk_dsl) + return wis::make_result(VkResult::VK_ERROR_OUT_OF_HOST_MEMORY); + } + + // Create push descriptor set layout + { + uint32_t push_binding_count = constants_size; + VkDescriptorSetLayoutBinding push_bindings[wis::max_push_descriptors]{}; + for (uint32_t i = 0; i < push_binding_count; i++) { + auto& r = push_descriptors[i]; + auto& b = push_bindings[i]; + b.binding = 0; // Push descriptors always have binding 0 + b.descriptorType = convert_vk(r.type); + b.descriptorCount = 1; // Push descriptors are always single + b.stageFlags = convert_vk(r.stage); + } + VkDescriptorSetLayoutCreateInfo push_desc_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, + .bindingCount = push_binding_count, + .pBindings = push_bindings, + }; + auto res = device.table().vkCreateDescriptorSetLayout(device.get(), &push_desc_info, nullptr, &vk_dsl[0]); + if (!succeeded(res)) + return wis::make_result(res); + } + + VkPushConstantRange push_constants[wis::max_push_constants]{}; // max push constants + for (uint32_t i = 0; i < constants_size; i++) { + auto& c = push_constants[i]; + auto& r = constants[i]; + c.stageFlags = convert_vk(r.stage); + c.offset = 0; + c.size = r.size_bytes; + } + + for (size_t i = 1; i < tables_count + 1; i++) { + auto [res, h] = CreateDescriptorSetLayout(&tables[i]); + if (res.status != wis::Status::Ok) { + for (size_t j = 0; j < i; j++) + device.table().vkDestroyDescriptorSetLayout(device.get(), vk_dsl[j], nullptr); + + return res; + } + vk_dsl[i] = h; + } + + VkPipelineLayoutCreateInfo pipeline_layout_info{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .setLayoutCount = tables_count + 1, // push descriptor set layout + .pSetLayouts = vk_dsl.get(), + .pushConstantRangeCount = constants_size, + .pPushConstantRanges = push_constants, + }; + VkPipelineLayout layout; + auto vr = device.table().vkCreatePipelineLayout(device.get(), &pipeline_layout_info, nullptr, &layout); + + if (!succeeded(vr)) { + for (uint32_t i = 0; i < tables_count; i++) + device.table().vkDestroyDescriptorSetLayout(device.get(), vk_dsl[i], nullptr); + + return wis::make_result(vr); + } + + return VKRootSignature{ wis::managed_handle_ex{ layout, device, device.table().vkDestroyPipelineLayout }, std::move(vk_dsl), tables_count }; +} + +wis::ResultValue +wis::ImplVKDescriptorBufferExtension::CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, + wis::DescriptorMemory memory_type, + uint64_t memory_bytes) const noexcept +{ + + uint32_t descriptor_size = heap_type == wis::DescriptorHeapType::Descriptor + ? descriptor_buffer_props.mutable_descriptor_size + : descriptor_buffer_props.sampler_size; + + VkBufferUsageFlags usage = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | + (heap_type == wis::DescriptorHeapType::Descriptor + ? VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT + : VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT); + + VkBufferCreateInfo info{ + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .size = memory_bytes, + .usage = usage, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + .queueFamilyIndexCount = 0, + .pQueueFamilyIndices = nullptr, + }; + + VmaAllocationCreateInfo alloc_info{ + .flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT, + .usage = VMA_MEMORY_USAGE_AUTO, + .requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + .preferredFlags = 0, + }; + + VkBuffer buffer; + VmaAllocation allocation; + + auto result = vmaCreateBuffer(allocator.get(), &info, &alloc_info, &buffer, &allocation, nullptr); + if (!succeeded(result)) + return wis::make_result(result); + + return wis::VKDescriptorBuffer{ + wis::Internal{ + allocator, + buffer, + allocation, + heap_type, + descriptor_buffer_props, + ftable } + }; +} +void wis::ImplVKDescriptorBufferExtension::SetDescriptorBuffers(wis::VKCommandListView cmd_list, + wis::VKDescriptorBufferView resource_desc_buffer, + wis::VKDescriptorBufferView sampler_desc_buffer) const noexcept +{ + auto b1 = std::get<0>(resource_desc_buffer); + auto b2 = std::get<0>(sampler_desc_buffer); + + VkDescriptorBufferBindingInfoEXT infos[2] = { + { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT, + .address = b1 ? b1 : b2, + .usage = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT }, + + { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT, + .address = b2, + .usage = VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT } + }; + + uint32_t buffer_count = (b1 != 0) + (b2 != 0); + ftable.vkCmdBindDescriptorBuffersEXT(std::get<0>(cmd_list), buffer_count, infos); +} + +void wis::ImplVKDescriptorBufferExtension::SetDescriptorTableOffset(wis::VKCommandListView cmd_list, + wis::VKRootSignatureView root_signature, + uint32_t root_table_index, + wis::VKDescriptorBufferGPUView buffer, + uint32_t table_aligned_byte_offset) const noexcept +{ + auto binding = std::get<1>(buffer); + uint32_t index = uint32_t(binding == wis::DescriptorHeapType::Sampler); + VkDeviceSize offset = table_aligned_byte_offset; + + ftable.vkCmdSetDescriptorBufferOffsetsEXT(std::get<0>(cmd_list), + VK_PIPELINE_BIND_POINT_GRAPHICS, + std::get<0>(root_signature), + root_table_index, + 1, + &index, + &offset); +} + +// Auxiliary functions + +wis::ResultValue +wis::ImplVKDescriptorBufferExtension::VKCreateDescriptorSetDescriptorLayout(const wis::DescriptorTable* table) const noexcept +{ + constexpr static VkDescriptorType cbvSrvUavTypes[] = { + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, + VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, + VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + // VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR /* Need to check support if this is desired. */ + }; + + constexpr static VkMutableDescriptorTypeListVALVE a{ + .descriptorTypeCount = sizeof(cbvSrvUavTypes) / sizeof(VkDescriptorType), + .pDescriptorTypes = cbvSrvUavTypes + }; + + wis::detail::limited_allocator bindings{ table->entry_count, true }; + wis::detail::limited_allocator binding_flags{ table->entry_count, true }; + wis::detail::limited_allocator bindings_mutable{ table->entry_count }; + + for (size_t i = 0; i < table->entry_count; i++) + bindings_mutable.data()[i] = a; + + VkDescriptorSetLayoutBindingFlagsCreateInfoEXT binding_flags_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, + .pNext = nullptr, + .bindingCount = table->entry_count, + .pBindingFlags = binding_flags.data(), + }; + + for (size_t i = 0; i < table->entry_count; i++) { + auto& entry = table->entries[i]; + bindings.data()[i] = { + .binding = entry.binding, + .descriptorType = VK_DESCRIPTOR_TYPE_MUTABLE_EXT, + .descriptorCount = entry.count, + .stageFlags = uint32_t(convert_vk(table->stage)), + .pImmutableSamplers = nullptr, + }; + if (entry.count == UINT32_MAX) { + binding_flags.data()[i] = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT; + bindings.data()[i].descriptorCount = 4096; // TODO: DO NOT HARDCODE + } + } + VkMutableDescriptorTypeCreateInfoEXT mutableTypeInfo{ + .sType = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT, + .pNext = &binding_flags_info, + .mutableDescriptorTypeListCount = table->entry_count, + .pMutableDescriptorTypeLists = bindings_mutable.data(), + }; + + VkDescriptorSetLayoutCreateInfo desc{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .pNext = &mutableTypeInfo, + .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT, + .bindingCount = table->entry_count, + .pBindings = bindings.data(), + }; + + VkDescriptorSetLayout layout; + auto result = device.table().vkCreateDescriptorSetLayout(device.get(), &desc, nullptr, &layout); + + if (!succeeded(result)) + return wis::make_result(result); + + return layout; +} + +wis::ResultValue +wis::ImplVKDescriptorBufferExtension::VKCreateDescriptorSetSamplerLayout(const wis::DescriptorTable* table) const noexcept +{ + wis::detail::limited_allocator bindings{ table->entry_count, true }; + + for (size_t i = 0; i < table->entry_count; i++) { + auto& entry = table->entries[i]; + bindings.data()[i] = { + .binding = entry.binding, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, + .descriptorCount = entry.count, + .stageFlags = uint32_t(convert_vk(table->stage)), + .pImmutableSamplers = nullptr, + }; + } + + VkDescriptorSetLayoutCreateInfo desc{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT, + .bindingCount = table->entry_count, + .pBindings = bindings.data(), + }; + + VkDescriptorSetLayout layout; + auto result = device.table().vkCreateDescriptorSetLayout(device.get(), &desc, nullptr, &layout); + + if (!succeeded(result)) + return wis::make_result(result); + + return layout; +} + +#endif // WISDOM_VULKAN +#endif // WISDOM_EXTENDED_ALLOCATION_CPP diff --git a/wisdom/extensions/descriptor_buffer/wisdom/impl/vk_descriptor_buffer.cpp b/wisdom/extensions/descriptor_buffer/wisdom/impl/vk_descriptor_buffer.cpp new file mode 100644 index 00000000..b1669dab --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/impl/vk_descriptor_buffer.cpp @@ -0,0 +1,62 @@ +#ifndef WIS_VK_DESCRIPTOR_BUFFER_CPP +#define WIS_VK_DESCRIPTOR_BUFFER_CPP + +#if defined(WISDOM_VULKAN) +#include + +void wis::ImplVKDescriptorBuffer::WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::VKSamplerView sampler) noexcept +{ + auto& device = allocator.header(); + VkDescriptorGetInfoEXT info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, + .type = VK_DESCRIPTOR_TYPE_SAMPLER, + .data = { .pSampler = &std::get<0>(sampler) } + }; + + uint64_t desc_offset = aligned_table_offset + index * descriptor_size; + vkGetDescriptorEXT(device.get(), &info, descriptor_size, data + desc_offset); +} + +void wis::ImplVKDescriptorBuffer::WriteShaderResource(uint64_t aligned_table_offset, uint32_t index, wis::VKShaderResourceView resource) noexcept +{ + auto& device = allocator.header(); + VkDescriptorImageInfo image_info{ + .sampler = nullptr, + .imageView = std::get<0>(resource), + .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL + }; + + VkDescriptorGetInfoEXT info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, + .type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .data = { .pSampledImage = &image_info } + }; + + uint64_t desc_offset = aligned_table_offset + index * descriptor_size; + vkGetDescriptorEXT(device.get(), &info, properties.sampled_image_size, data + desc_offset); +} + +void wis::ImplVKDescriptorBuffer::WriteConstantBuffer(uint64_t aligned_table_offset, uint32_t index, wis::VKBufferView buffer, uint32_t buffer_size, uint32_t offset) noexcept +{ + auto& device = allocator.header(); + VkBufferDeviceAddressInfo address_info{ + .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, + .buffer = std::get<0>(buffer) + }; + + VkDescriptorAddressInfoEXT buffer_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT, + .address = device.table().vkGetBufferDeviceAddress(device.get(), &address_info) + offset, + .range = buffer_size + }; + + VkDescriptorGetInfoEXT info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .data = { .pUniformBuffer = &buffer_info } + }; + uint64_t desc_offset = aligned_table_offset + index * descriptor_size; + vkGetDescriptorEXT(device.get(), &info, properties.constant_buffer_size, data + desc_offset); +} +#endif // WISDOM_VULKAN +#endif // ! VK_DESCRIPTOR_BUFFER_CPP diff --git a/wisdom/extensions/descriptor_buffer/wisdom/vk_descriptor_buffer.h b/wisdom/extensions/descriptor_buffer/wisdom/vk_descriptor_buffer.h new file mode 100644 index 00000000..0e6ad7a3 --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/vk_descriptor_buffer.h @@ -0,0 +1,187 @@ +#ifndef WIS_VK_DESCRIPTOR_BUFFER_H +#define WIS_VK_DESCRIPTOR_BUFFER_H +#include +#include +#include + +namespace wis { +class VKDescriptorBuffer; + +using VKDescriptorBufferView = std::tuple; +using VKDescriptorBufferGPUView = VKDescriptorBufferView; + +struct VKDescriptorBufferProperties { + uint16_t mutable_descriptor_size = 0; + uint16_t offset_alignment = 0; + + uint16_t constant_buffer_size = 0; + uint16_t storage_buffer_size = 0; + uint16_t sampled_image_size = 0; + uint16_t storage_image_size = 0; + uint16_t storage_texel_buffer_size = 0; + uint16_t uniform_texel_buffer_size = 0; + uint16_t sampler_size = 0; +}; + +template<> +struct Internal { + PFN_vkGetDescriptorEXT vkGetDescriptorEXT; + + wis::shared_handle allocator; + h::VmaAllocation allocation; + h::VkBuffer buffer; + VkDeviceAddress address = 0; + + uint8_t* data = nullptr; + VKDescriptorBufferProperties properties; + uint16_t descriptor_size = 0; + + wis::DescriptorHeapType type = wis::DescriptorHeapType::Descriptor; + +public: + Internal() noexcept = default; + Internal(wis::shared_handle allocator, + VkBuffer buffer, + VmaAllocation allocation, + wis::DescriptorHeapType type, + VKDescriptorBufferProperties properties, + const VKDescBufferExtDevice& ftable) noexcept + : allocator(std::move(allocator)) + , allocation(allocation) + , buffer(buffer) + , type(type) + , properties(properties) + , vkGetDescriptorEXT(ftable.vkGetDescriptorEXT) + { + auto& device = this->allocator.header(); + VkBufferDeviceAddressInfo info{ + .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, + .buffer = buffer + }; + address = device.table().vkGetBufferDeviceAddress(device.get(), &info); + vmaMapMemory(this->allocator.get(), allocation, reinterpret_cast(&data)); + + descriptor_size = type == wis::DescriptorHeapType::Descriptor + ? properties.mutable_descriptor_size + : properties.sampler_size; + } + Internal(Internal&&) noexcept = default; + Internal& operator=(Internal&& o) noexcept + { + if (this == &o) { + return *this; + } + Destroy(); + allocator = std::move(o.allocator); + allocation = std::move(o.allocation); + buffer = std::move(o.buffer); + address = o.address; + data = o.data; + properties = o.properties; + type = o.type; + descriptor_size = o.descriptor_size; + vkGetDescriptorEXT = o.vkGetDescriptorEXT; + return *this; + } + ~Internal() noexcept + { + Destroy(); + } + + void Destroy() noexcept + { + if (buffer && allocation) { + vmaUnmapMemory(allocator.get(), allocation); + vmaDestroyBuffer(allocator.get(), buffer, allocation); + } + } + +public: + auto& GetDevice() const noexcept + { + return allocator.header(); + } +}; + +class ImplVKDescriptorBuffer : public QueryInternal +{ +public: + ImplVKDescriptorBuffer() noexcept = default; + explicit ImplVKDescriptorBuffer(Internal&& internal) noexcept + : QueryInternal(std::move(internal)) { } + + operator bool() const noexcept + { + return bool(buffer); + } + operator VKDescriptorBufferView() const noexcept + { + return { address, type }; + } + +public: + WIS_INLINE void WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::VKSamplerView sampler) noexcept; + WIS_INLINE void WriteShaderResource(uint64_t aligned_table_offset, uint32_t index, wis::VKShaderResourceView resource) noexcept; + WIS_INLINE void WriteConstantBuffer(uint64_t aligned_table_offset, uint32_t index, wis::VKBufferView buffer, uint32_t buffer_size, uint32_t offset = 0) noexcept; +}; + +#pragma region VKDescriptorBuffer +/** + * @brief Buffer storage for descriptors. + * It is the most flexible implementation of storage for descriptors, as it supports both bindful and bindless + * Descriptor approaches. Works like an aligned table of elements of the same size. + * Alignment and size of descriptors are varying between implementation and heap types. + * Both metrixs are available to retrieval from + * */ +class VKDescriptorBuffer : public wis::ImplVKDescriptorBuffer +{ +public: + using wis::ImplVKDescriptorBuffer::ImplVKDescriptorBuffer; + +public: + /** + * @brief Writes the sampler to the sampler descriptor buffer. + * Must be called with Sampler descriptor buffer, which was created with wis::DescriptorHeapType::Sampler. + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param sampler The sampler to write. + * */ + inline void WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::VKSamplerView sampler) noexcept + { + wis::ImplVKDescriptorBuffer::WriteSampler(aligned_table_offset, index, std::move(sampler)); + } + /** + * @brief Writes the shader resource to the shader resource descriptor buffer. + * Must be called with Shader Resource descriptor buffer, which was created with wis::DescriptorHeapType::Descriptor. + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with . + * @param index Binding index in descriptor table. + * @param resource The shader resource to write. + * */ + inline void WriteShaderResource(uint64_t aligned_table_offset, uint32_t index, wis::VKShaderResourceView resource) noexcept + { + wis::ImplVKDescriptorBuffer::WriteShaderResource(aligned_table_offset, index, std::move(resource)); + } + /** + * @brief Writes the constant buffer to the constant buffer descriptor buffer. + * Must be called with Constant Buffer descriptor buffer, which was created with wis::DescriptorHeapType::Descriptor. + * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. + * Alignment may be queried with wis::VKDevice. + * @param index Binding index in descriptor table. + * @param buffer The buffer to write. + * @param buffer_size The size of the part of the buffer in bytes. + * @param offset Offset from buffer beginning. offset + buffer_size must be less or equal buffer overall size. + * */ + inline void WriteConstantBuffer(uint64_t aligned_table_offset, uint32_t index, wis::VKBufferView buffer, uint32_t buffer_size, uint32_t offset = 0) noexcept + { + wis::ImplVKDescriptorBuffer::WriteConstantBuffer(aligned_table_offset, index, std::move(buffer), buffer_size, offset); + } +}; +#pragma endregion VKDescriptorBuffer + +} // namespace wis +#ifndef WISDOM_BUILD_BINARIES +#include "impl/vk_descriptor_buffer.cpp" +#endif // !WISDOM_HEADER_ONLY +#endif // !VK_DESCRIPTOR_BUFFER_H diff --git a/wisdom/extensions/descriptor_buffer/wisdom/wisdom_descriptor_buffer.h b/wisdom/extensions/descriptor_buffer/wisdom/wisdom_descriptor_buffer.h new file mode 100644 index 00000000..4d9dfe8b --- /dev/null +++ b/wisdom/extensions/descriptor_buffer/wisdom/wisdom_descriptor_buffer.h @@ -0,0 +1,327 @@ +#ifndef WISDOM_DESCRIPTOR_BUFFER_H +#define WISDOM_DESCRIPTOR_BUFFER_H +#if defined(WISDOM_DX12) +#include +#include +#include +#include +#include + +namespace wis { +class DX12DescriptorBufferExtension; + +template<> +struct Internal { + wis::com_ptr device; +}; + +class ImplDX12DescriptorBufferExtension : public QueryInternalExtension +{ +public: + virtual wis::Result Init(const wis::DX12Device& instance) noexcept + { + device = instance.GetInternal().device; + return wis::success; + } + virtual bool Supported() const noexcept override + { + return true; + } + +public: + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateRootSignature(const PushConstant* root_constants = nullptr, + uint32_t constants_size = 0, + const PushDescriptor* push_descriptors = nullptr, + uint32_t push_descriptors_size = 0, + const wis::DescriptorTable* tables = nullptr, + uint32_t tables_count = 0) const noexcept; + + [[nodiscard]] uint32_t + GetDescriptorTableAlignment(wis::DescriptorHeapType heap) const noexcept + { + return device->GetDescriptorHandleIncrementSize(wis::convert_dx(heap)); + } + [[nodiscard]] uint32_t + GetDescriptorSize(wis::DescriptorHeapType heap) const noexcept + { + return device->GetDescriptorHandleIncrementSize(wis::convert_dx(heap)); + } + + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, wis::DescriptorMemory memory_type, uint64_t memory_bytes) const noexcept; + +public: // Command List + WIS_INLINE void SetDescriptorBuffers(wis::DX12CommandListView cmd_list, + wis::DX12DescriptorBufferView resource_desc_buffer, + wis::DX12DescriptorBufferView sampler_desc_buffer) const noexcept; + + WIS_INLINE void SetDescriptorTableOffset(wis::DX12CommandListView cmd_list, + wis::DX12RootSignatureView root_signature, + uint32_t root_table_index, + wis::DX12DescriptorBufferGPUView buffer, + uint32_t table_aligned_byte_offset) const noexcept; +}; + +#pragma region DX12DescriptorBufferExtension +class DX12DescriptorBufferExtension : public wis::ImplDX12DescriptorBufferExtension +{ +public: + using wis::ImplDX12DescriptorBufferExtension::ImplDX12DescriptorBufferExtension; + +public: + /** + * @brief Creates a root signature object. + * @param root_constants The root constants to create the root signature with. + * @param constants_count The number of root constants. Max is 5. + * @param root_descriptors The root descriptors to create the root signature with. + * @param descriptors_count The number of root descriptors. Max is 8. + * @param tables The descriptor tables to create the root signature with. + * @param tables_count The number of descriptor tables. + * @return wis::DX12RootSignature on success (wis::Status::Ok). + * */ + [[nodiscard]] inline wis::ResultValue CreateRootSignature(const wis::PushConstant* root_constants = nullptr, uint32_t constants_count = 0, const wis::PushDescriptor* root_descriptors = nullptr, uint32_t descriptors_count = 0, const wis::DescriptorTable* tables = nullptr, uint32_t tables_count = 0) const noexcept + { + return wis::ImplDX12DescriptorBufferExtension::CreateRootSignature(root_constants, constants_count, root_descriptors, descriptors_count, tables, tables_count); + } + /** + * @brief Creates a descriptor buffer object. + * @param type The type of the descriptor buffer to create. + * @param memory Memory location of the buffer (CPU or GPU). + * @param memory_bytes The size of the descriptor buffer in bytes. + * @return wis::DX12DescriptorBuffer on success (wis::Status::Ok). + * */ + [[nodiscard]] inline wis::ResultValue CreateDescriptorBuffer(wis::DescriptorHeapType type, wis::DescriptorMemory memory, uint64_t memory_bytes) const noexcept + { + return wis::ImplDX12DescriptorBufferExtension::CreateDescriptorBuffer(type, memory, memory_bytes); + } + /** + * @brief Returns the alignment of the descriptor table in bytes. + * @param type The type of the descriptor buffer to get the alignment for. + * @return The alignment of the descriptor table in bytes. + * */ + inline uint64_t GetDescriptorTableAlignment(wis::DescriptorHeapType type) const noexcept + { + return wis::ImplDX12DescriptorBufferExtension::GetDescriptorTableAlignment(type); + } + /** + * @brief Returns the size of single descriptor in bytes. + * @param type The type of the descriptor buffer to get the size for. + * @return The size of the descriptor table in bytes. + * */ + inline uint64_t GetDescriptorSize(wis::DescriptorHeapType type) const noexcept + { + return wis::ImplDX12DescriptorBufferExtension::GetDescriptorSize(type); + } + /** + * @brief Sets the descriptor buffers to the command list. + * @param list The command list to set the descriptor buffers to. + * @param resource_buffer The resource descriptor buffer to set. + * @param sampler_buffer The sampler descriptor buffer to set. + * */ + inline void SetDescriptorBuffers(wis::DX12CommandListView list, wis::DX12DescriptorBufferView resource_buffer, wis::DX12DescriptorBufferView sampler_buffer) const noexcept + { + wis::ImplDX12DescriptorBufferExtension::SetDescriptorBuffers(std::move(list), std::move(resource_buffer), std::move(sampler_buffer)); + } + /** + * @brief Sets the offset into the descriptor buffer + * for selected descriptor table. Pipeline will get the bindings from that offset. + * @param list The command list to set the descriptor buffer offset to. + * @param root_signature The root signature to get binding table from. + * @param table_index Index of the descriptor table in the root signature. + * @param buffer The descriptor buffer to set the offset for. + * @param table_aligned_byte_offset Byte offset from the buffer beginning in table alignment sizes. + * */ + inline void SetDescriptorTableOffset(wis::DX12CommandListView list, wis::DX12RootSignatureView root_signature, uint32_t table_index, wis::DX12DescriptorBufferGPUView buffer, uint32_t table_aligned_byte_offset) const noexcept + { + wis::ImplDX12DescriptorBufferExtension::SetDescriptorTableOffset(std::move(list), std::move(root_signature), table_index, std::move(buffer), table_aligned_byte_offset); + } +}; +#pragma endregion DX12DescriptorBufferExtension + +} // namespace wis + +#endif // WISDOM_DX12 + +#if defined(WISDOM_VULKAN) +#include +#include +#include +#include + +namespace wis { +class VKDescriptorBufferExtension; + +template<> +struct Internal { + wis::SharedDevice device; + wis::shared_handle allocator; + VKDescriptorBufferProperties descriptor_buffer_props; + VKDescBufferExtDevice ftable; +}; + +class ImplVKDescriptorBufferExtension : public QueryInternalExtension +{ +protected: + virtual WIS_INLINE bool + GetExtensionInfo(const std::unordered_map>& available_extensions, + std::unordered_set& ext_name_set, + std::unordered_map& structure_map, + std::unordered_map& property_map) noexcept override; + + virtual WIS_INLINE wis::Result + Init(const wis::VKDevice& instance, + const std::unordered_map& structure_map, + const std::unordered_map& property_map) noexcept override; + +public: + virtual bool Supported() const noexcept override + { + return ftable.vkGetDescriptorEXT; + } + +public: + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateRootSignature(const PushConstant* constants = nullptr, + uint32_t constants_size = 0, + const PushDescriptor* push_descriptors = nullptr, + uint32_t push_descriptors_size = 0, + const wis::DescriptorTable* tables = nullptr, + uint32_t tables_count = 0) const noexcept; + + [[nodiscard]] uint32_t + GetDescriptorTableAlignment([[maybe_unused]] wis::DescriptorHeapType heap) const noexcept + { + return descriptor_buffer_props.offset_alignment; + } + + [[nodiscard]] uint32_t + GetDescriptorSize(wis::DescriptorHeapType heap) const noexcept + { + auto& heap_features = descriptor_buffer_props; + return heap == wis::DescriptorHeapType::Descriptor + ? heap_features.mutable_descriptor_size + : heap_features.sampler_size; + } + + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, + wis::DescriptorMemory memory_type, + uint64_t memory_bytes) const noexcept; + +public: // Command List + WIS_INLINE void SetDescriptorBuffers(wis::VKCommandListView cmd_list, + wis::VKDescriptorBufferView resource_desc_buffer, + wis::VKDescriptorBufferView sampler_desc_buffer) const noexcept; + + WIS_INLINE void SetDescriptorTableOffset(wis::VKCommandListView cmd_list, + wis::VKRootSignatureView root_signature, + uint32_t root_table_index, + wis::VKDescriptorBufferGPUView buffer, + uint32_t table_aligned_byte_offset) const noexcept; + +protected: + [[nodiscard]] wis::ResultValue + CreateDescriptorSetLayout(const wis::DescriptorTable* table) const noexcept + { + return table->type == wis::DescriptorHeapType::Descriptor + ? VKCreateDescriptorSetDescriptorLayout(table) + : VKCreateDescriptorSetSamplerLayout(table); + } + WIS_INLINE wis::ResultValue VKCreateDescriptorSetDescriptorLayout(const wis::DescriptorTable* table) const noexcept; + WIS_INLINE wis::ResultValue VKCreateDescriptorSetSamplerLayout(const wis::DescriptorTable* table) const noexcept; +}; + +#pragma region VKDescriptorBufferExtension +class VKDescriptorBufferExtension : public wis::ImplVKDescriptorBufferExtension +{ +public: + using wis::ImplVKDescriptorBufferExtension::ImplVKDescriptorBufferExtension; + +public: + /** + * @brief Creates a root signature object. + * @param root_constants The root constants to create the root signature with. + * @param constants_count The number of root constants. Max is 5. + * @param root_descriptors The root descriptors to create the root signature with. + * @param descriptors_count The number of root descriptors. Max is 8. + * @param tables The descriptor tables to create the root signature with. + * @param tables_count The number of descriptor tables. + * @return wis::VKRootSignature on success (wis::Status::Ok). + * */ + [[nodiscard]] inline wis::ResultValue CreateRootSignature(const wis::PushConstant* root_constants = nullptr, uint32_t constants_count = 0, const wis::PushDescriptor* root_descriptors = nullptr, uint32_t descriptors_count = 0, const wis::DescriptorTable* tables = nullptr, uint32_t tables_count = 0) const noexcept + { + return wis::ImplVKDescriptorBufferExtension::CreateRootSignature(root_constants, constants_count, root_descriptors, descriptors_count, tables, tables_count); + } + /** + * @brief Creates a descriptor buffer object. + * @param type The type of the descriptor buffer to create. + * @param memory Memory location of the buffer (CPU or GPU). + * @param memory_bytes The size of the descriptor buffer in bytes. + * @return wis::VKDescriptorBuffer on success (wis::Status::Ok). + * */ + [[nodiscard]] inline wis::ResultValue CreateDescriptorBuffer(wis::DescriptorHeapType type, wis::DescriptorMemory memory, uint64_t memory_bytes) const noexcept + { + return wis::ImplVKDescriptorBufferExtension::CreateDescriptorBuffer(type, memory, memory_bytes); + } + /** + * @brief Returns the alignment of the descriptor table in bytes. + * @param type The type of the descriptor buffer to get the alignment for. + * @return The alignment of the descriptor table in bytes. + * */ + inline uint64_t GetDescriptorTableAlignment(wis::DescriptorHeapType type) const noexcept + { + return wis::ImplVKDescriptorBufferExtension::GetDescriptorTableAlignment(type); + } + /** + * @brief Returns the size of single descriptor in bytes. + * @param type The type of the descriptor buffer to get the size for. + * @return The size of the descriptor table in bytes. + * */ + inline uint64_t GetDescriptorSize(wis::DescriptorHeapType type) const noexcept + { + return wis::ImplVKDescriptorBufferExtension::GetDescriptorSize(type); + } + /** + * @brief Sets the descriptor buffers to the command list. + * @param list The command list to set the descriptor buffers to. + * @param resource_buffer The resource descriptor buffer to set. + * @param sampler_buffer The sampler descriptor buffer to set. + * */ + inline void SetDescriptorBuffers(wis::VKCommandListView list, wis::VKDescriptorBufferView resource_buffer, wis::VKDescriptorBufferView sampler_buffer) const noexcept + { + wis::ImplVKDescriptorBufferExtension::SetDescriptorBuffers(std::move(list), std::move(resource_buffer), std::move(sampler_buffer)); + } + /** + * @brief Sets the offset into the descriptor buffer + * for selected descriptor table. Pipeline will get the bindings from that offset. + * @param list The command list to set the descriptor buffer offset to. + * @param root_signature The root signature to get binding table from. + * @param table_index Index of the descriptor table in the root signature. + * @param buffer The descriptor buffer to set the offset for. + * @param table_aligned_byte_offset Byte offset from the buffer beginning in table alignment sizes. + * */ + inline void SetDescriptorTableOffset(wis::VKCommandListView list, wis::VKRootSignatureView root_signature, uint32_t table_index, wis::VKDescriptorBufferGPUView buffer, uint32_t table_aligned_byte_offset) const noexcept + { + wis::ImplVKDescriptorBufferExtension::SetDescriptorTableOffset(std::move(list), std::move(root_signature), table_index, std::move(buffer), table_aligned_byte_offset); + } +}; +#pragma endregion VKDescriptorBufferExtension +} // namespace wis +#endif // WISDOM_VULKAN + +namespace wis { +#if defined(WISDOM_DX12) && !defined(WISDOM_FORCE_VULKAN) +using DescriptorBufferExtension = DX12DescriptorBufferExtension; +using DescriptorBuffer = DX12DescriptorBuffer; +#elif defined(WISDOM_VULKAN) +using DescriptorBufferExtension = VKDescriptorBufferExtension; +using DescriptorBuffer = VKDescriptorBuffer; +#endif // WISDOM_DX12 +} // namespace wis + +#ifndef WISDOM_BUILD_BINARIES +#include "impl/impl.dx.cpp" +#include "impl/impl.vk.cpp" +#endif // !WISDOM_PLATFORM_HEADER_ONLY +#endif // WISDOM_EXTENDED_ALLOCATION_H diff --git a/wisdom/extensions/extended_allocation/CMakeLists.txt b/wisdom/extensions/extended_allocation/CMakeLists.txt index 18a50ce4..ebc776b1 100644 --- a/wisdom/extensions/extended_allocation/CMakeLists.txt +++ b/wisdom/extensions/extended_allocation/CMakeLists.txt @@ -30,6 +30,11 @@ else() INTERFACE wisdom-extended-allocation-headers) endif() +# link the debug library to the main wisdom extension library +target_link_libraries(wisdom-extension INTERFACE wisdom-extended-allocation) +target_link_libraries(wisdom-extension-headers + INTERFACE wisdom-extended-allocation-headers) + install( TARGETS wisdom-extended-allocation wisdom-extended-allocation-headers EXPORT wisdom-targets diff --git a/wisdom/extensions/extended_allocation/wisdom/impl/impl.dx.cpp b/wisdom/extensions/extended_allocation/wisdom/impl/impl.dx.cpp index c513596a..f99ac18e 100644 --- a/wisdom/extensions/extended_allocation/wisdom/impl/impl.dx.cpp +++ b/wisdom/extensions/extended_allocation/wisdom/impl/impl.dx.cpp @@ -27,7 +27,7 @@ wis::DX12ExtendedAllocation::CreateGPUUploadTexture(const wis::DX12ResourceAlloc wis::com_ptr rc; wis::com_ptr al; - auto* hallocator = allocator.GetInternal().allocator.get(); + auto hallocator = allocator.GetInternal().allocator; HRESULT hr = hallocator->CreateResource3(&all_desc, &tex_desc, convert_dx(initial_state), nullptr, 0, nullptr, @@ -36,7 +36,7 @@ wis::DX12ExtendedAllocation::CreateGPUUploadTexture(const wis::DX12ResourceAlloc if (!wis::succeeded(hr)) return wis::make_result(hr); - return DX12Buffer{ std::move(rc), std::move(al), hallocator }; + return DX12Buffer{ std::move(rc), std::move(al), std::move(hallocator) }; } wis::Result diff --git a/wisdom/include/wisdom/dx12/dx12_command_list.h b/wisdom/include/wisdom/dx12/dx12_command_list.h index cc665e51..24b5b481 100644 --- a/wisdom/include/wisdom/dx12/dx12_command_list.h +++ b/wisdom/include/wisdom/dx12/dx12_command_list.h @@ -17,7 +17,8 @@ struct Internal { wis::com_ptr allocator; wis::com_ptr list; std::array root_stage_map; - uint32_t root_table_offset = 0; + uint32_t push_constant_count = 0; + uint32_t push_descriptor_count = 0; }; class ImplDX12CommandList : public QueryInternal @@ -93,11 +94,11 @@ class ImplDX12CommandList : public QueryInternal uint32_t start_vertex = 0, uint32_t start_instance = 0) noexcept; - WIS_INLINE void SetRootConstants(const void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept; + WIS_INLINE void SetPushConstants(const void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept; - WIS_INLINE void SetDescriptorBuffers(const wis::DX12DescriptorBufferView* buffers, uint32_t buffer_count) noexcept; + WIS_INLINE void PushDescriptor(wis::DescriptorType type, uint32_t binding, wis::DX12BufferView view, uint32_t offset = 0) noexcept; - WIS_INLINE void SetDescriptorTableOffset(uint32_t root_table_index, wis::DX12DescriptorBufferGPUView buffer, uint32_t offset_bytes) noexcept; + WIS_INLINE void SetDescriptorStorage(wis::DX12DescriptorStorageView desc_storage) noexcept; protected: bool closed = false; @@ -143,7 +144,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void SetPipelineState(wis::DX12PipelineView pipeline) noexcept { - return wis::ImplDX12CommandList::SetPipelineState(std::move(pipeline)); + wis::ImplDX12CommandList::SetPipelineState(std::move(pipeline)); } /** * @brief Copies data from one buffer to another. @@ -153,7 +154,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void CopyBuffer(wis::DX12BufferView source, wis::DX12BufferView destination, wis::BufferRegion region) noexcept { - return wis::ImplDX12CommandList::CopyBuffer(std::move(source), std::move(destination), region); + wis::ImplDX12CommandList::CopyBuffer(std::move(source), std::move(destination), region); } /** * @brief Copies data from buffer to texture. @@ -164,7 +165,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void CopyBufferToTexture(wis::DX12BufferView source, wis::DX12TextureView destination, const wis::BufferTextureCopyRegion* regions, uint32_t region_count) noexcept { - return wis::ImplDX12CommandList::CopyBufferToTexture(std::move(source), std::move(destination), regions, region_count); + wis::ImplDX12CommandList::CopyBufferToTexture(std::move(source), std::move(destination), regions, region_count); } /** * @brief Copies data from one texture to another. @@ -175,7 +176,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void CopyTextureToBuffer(wis::DX12TextureView source, wis::DX12BufferView destination, const wis::BufferTextureCopyRegion* regions, uint32_t region_count) noexcept { - return wis::ImplDX12CommandList::CopyTextureToBuffer(std::move(source), std::move(destination), regions, region_count); + wis::ImplDX12CommandList::CopyTextureToBuffer(std::move(source), std::move(destination), regions, region_count); } /** * @brief Sets the barrier on the buffer. @@ -184,7 +185,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void BufferBarrier(wis::BufferBarrier barrier, wis::DX12BufferView buffer) noexcept { - return wis::ImplDX12CommandList::BufferBarrier(barrier, std::move(buffer)); + wis::ImplDX12CommandList::BufferBarrier(barrier, std::move(buffer)); } /** * @brief Sets the barriers on the buffers. You may set up to 8 buffer barriers for max efficiency. @@ -193,7 +194,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void BufferBarriers(const wis::DX12BufferBarrier2* barriers, uint32_t barrier_count) noexcept { - return wis::ImplDX12CommandList::BufferBarriers(barriers, barrier_count); + wis::ImplDX12CommandList::BufferBarriers(barriers, barrier_count); } /** * @brief Sets the barrier on the texture. @@ -202,7 +203,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void TextureBarrier(wis::TextureBarrier barrier, wis::DX12TextureView texture) noexcept { - return wis::ImplDX12CommandList::TextureBarrier(barrier, std::move(texture)); + wis::ImplDX12CommandList::TextureBarrier(barrier, std::move(texture)); } /** * @brief Sets the barriers on the textures. You may set up to 8 texture barriers for max efficiency. @@ -211,7 +212,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void TextureBarriers(const wis::DX12TextureBarrier2* barriers, uint32_t barrier_count) noexcept { - return wis::ImplDX12CommandList::TextureBarriers(barriers, barrier_count); + wis::ImplDX12CommandList::TextureBarriers(barriers, barrier_count); } /** * @brief Begins the render pass. @@ -219,14 +220,14 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void BeginRenderPass(const wis::DX12RenderPassDesc* pass_desc) noexcept { - return wis::ImplDX12CommandList::BeginRenderPass(pass_desc); + wis::ImplDX12CommandList::BeginRenderPass(pass_desc); } /** * @brief Ends the render pass. * */ inline void EndRenderPass() noexcept { - return wis::ImplDX12CommandList::EndRenderPass(); + wis::ImplDX12CommandList::EndRenderPass(); } /** * @brief Sets the pipeline signature object. Used to determine how to pick descriptors from descriptor buffer. @@ -234,7 +235,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void SetRootSignature(wis::DX12RootSignatureView root_signature) noexcept { - return wis::ImplDX12CommandList::SetRootSignature(std::move(root_signature)); + wis::ImplDX12CommandList::SetRootSignature(std::move(root_signature)); } /** * @brief Sets the primitive topology. Detemines how vertices shall be processed. @@ -242,7 +243,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void IASetPrimitiveTopology(wis::PrimitiveTopology topology) noexcept { - return wis::ImplDX12CommandList::IASetPrimitiveTopology(topology); + wis::ImplDX12CommandList::IASetPrimitiveTopology(topology); } /** * @brief Sets the vertex buffers. @@ -252,7 +253,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void IASetVertexBuffers(const wis::DX12VertexBufferBinding* resources, uint32_t count, uint32_t start_slot = 0) noexcept { - return wis::ImplDX12CommandList::IASetVertexBuffers(resources, count, start_slot); + wis::ImplDX12CommandList::IASetVertexBuffers(resources, count, start_slot); } /** * @brief Sets the index buffer. @@ -262,7 +263,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void IASetIndexBuffer(wis::DX12BufferView buffer, wis::IndexType type, uint64_t offset) noexcept { - return wis::ImplDX12CommandList::IASetIndexBuffer(std::move(buffer), type, offset); + wis::ImplDX12CommandList::IASetIndexBuffer(std::move(buffer), type, offset); } /** * @brief Sets the index buffer. @@ -275,7 +276,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void IASetIndexBuffer2(wis::DX12BufferView buffer, wis::IndexType type, uint32_t size, uint64_t offset) noexcept { - return wis::ImplDX12CommandList::IASetIndexBuffer2(std::move(buffer), type, size, offset); + wis::ImplDX12CommandList::IASetIndexBuffer2(std::move(buffer), type, size, offset); } /** * @brief Sets the viewport. @@ -283,7 +284,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void RSSetViewport(wis::Viewport viewport) noexcept { - return wis::ImplDX12CommandList::RSSetViewport(viewport); + wis::ImplDX12CommandList::RSSetViewport(viewport); } /** * @brief Sets multiple viewports. @@ -292,7 +293,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void RSSetViewports(const wis::Viewport* viewports, uint32_t count) noexcept { - return wis::ImplDX12CommandList::RSSetViewports(viewports, count); + wis::ImplDX12CommandList::RSSetViewports(viewports, count); } /** * @brief Sets the scissor rect. @@ -300,7 +301,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void RSSetScissor(wis::Scissor scissor) noexcept { - return wis::ImplDX12CommandList::RSSetScissor(scissor); + wis::ImplDX12CommandList::RSSetScissor(scissor); } /** * @brief Sets multiple scissor rects. @@ -311,7 +312,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void RSSetScissors(const wis::Scissor* scissors, uint32_t count) noexcept { - return wis::ImplDX12CommandList::RSSetScissors(scissors, count); + wis::ImplDX12CommandList::RSSetScissors(scissors, count); } /** * @brief Draws indexed instanced geometry. @@ -323,7 +324,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void DrawIndexedInstanced(uint32_t vertex_count_per_instance, uint32_t instance_count = 1, uint32_t start_index = 0, uint32_t base_vertex = 0, uint32_t start_instance = 0) noexcept { - return wis::ImplDX12CommandList::DrawIndexedInstanced(vertex_count_per_instance, instance_count, start_index, base_vertex, start_instance); + wis::ImplDX12CommandList::DrawIndexedInstanced(vertex_count_per_instance, instance_count, start_index, base_vertex, start_instance); } /** * @brief Draws instanced geometry. (Without indexing) @@ -334,7 +335,7 @@ class DX12CommandList : public wis::ImplDX12CommandList * */ inline void DrawInstanced(uint32_t vertex_count_per_instance, uint32_t instance_count = 1, uint32_t start_vertex = 0, uint32_t start_instance = 0) noexcept { - return wis::ImplDX12CommandList::DrawInstanced(vertex_count_per_instance, instance_count, start_vertex, start_instance); + wis::ImplDX12CommandList::DrawInstanced(vertex_count_per_instance, instance_count, start_vertex, start_instance); } /** * @brief Sets the root constants for the shader. @@ -343,30 +344,22 @@ class DX12CommandList : public wis::ImplDX12CommandList * @param offset_4bytes The offset in the data in 4-byte units. * @param stage The shader stages to set the root constants for. * */ - inline void SetRootConstants(void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept + inline void SetPushConstants(void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept { - return wis::ImplDX12CommandList::SetRootConstants(data, size_4bytes, offset_4bytes, stage); + wis::ImplDX12CommandList::SetPushConstants(data, size_4bytes, offset_4bytes, stage); } /** - * @brief Sets the root descriptor tables for the shader. - * Operation will perform flush in some cases, so it's not recommended to rebind descriptor buffers too often. - * @param buffers The descriptor buffers to set the root descriptor tables with. - * May only be one of each type (one Descriptor and one Sampler buffer) - * @param buffer_count The number of descriptor buffers to set. May be 1 or 2. + * @brief Pushes descriptor directly to the command list, without putting it to the table. + * Works only with buffer bindings. + * Buffer is always bound with full size. + * @param type The type of the descriptor to set. + * @param root_index The index of the root descriptor to set. + * @param buffer The buffer to set. + * @param offset The offset in the descriptor table to set the descriptor to. * */ - inline void SetDescriptorBuffers(const wis::DX12DescriptorBufferView* buffers, uint32_t buffer_count) noexcept + inline void PushDescriptor(wis::DescriptorType type, uint32_t root_index, wis::DX12BufferView buffer, uint32_t offset) noexcept { - return wis::ImplDX12CommandList::SetDescriptorBuffers(buffers, buffer_count); - } - /** - * @brief Sets the offset in the descriptor table for the descriptor buffer. - * @param root_table_index The index of the root table to set the offset for. - * @param buffer The descriptor buffer to set the offset for. - * @param offset_bytes The offset in the descriptor buffer in bytes. - * */ - inline void SetDescriptorTableOffset(uint32_t root_table_index, wis::DX12DescriptorBufferGPUView buffer, uint32_t offset_bytes) noexcept - { - return wis::ImplDX12CommandList::SetDescriptorTableOffset(root_table_index, std::move(buffer), offset_bytes); + wis::ImplDX12CommandList::PushDescriptor(type, root_index, std::move(buffer), offset); } }; #pragma endregion DX12CommandList diff --git a/wisdom/include/wisdom/dx12/dx12_command_queue.h b/wisdom/include/wisdom/dx12/dx12_command_queue.h index 748f55e5..03a1e0b2 100644 --- a/wisdom/include/wisdom/dx12/dx12_command_queue.h +++ b/wisdom/include/wisdom/dx12/dx12_command_queue.h @@ -68,7 +68,7 @@ class DX12CommandQueue : public wis::ImplDX12CommandQueue * */ inline void ExecuteCommandLists(const wis::DX12CommandListView* lists, uint32_t count) const noexcept { - return wis::ImplDX12CommandQueue::ExecuteCommandLists(lists, count); + wis::ImplDX12CommandQueue::ExecuteCommandLists(lists, count); } /** * @brief Enqueue the signal to the queue, that gets executed after all the work has been done. diff --git a/wisdom/include/wisdom/dx12/dx12_descriptor_buffer.h b/wisdom/include/wisdom/dx12/dx12_descriptor_buffer.h deleted file mode 100644 index b3b1dd27..00000000 --- a/wisdom/include/wisdom/dx12/dx12_descriptor_buffer.h +++ /dev/null @@ -1,171 +0,0 @@ -#ifndef WIS_DX12_DESCRIPTOR_BUFFER_H -#define WIS_DX12_DESCRIPTOR_BUFFER_H -#include -#include -#include -#include -#include - -namespace wis { - -class DX12DescriptorBuffer; - -template<> -struct Internal { - wis::com_ptr device; - wis::com_ptr heap; - CD3DX12_CPU_DESCRIPTOR_HANDLE heap_start; - CD3DX12_GPU_DESCRIPTOR_HANDLE heap_gpu_start; - uint32_t heap_increment = 0; - - Internal() = default; - Internal(wis::com_ptr heap, uint32_t heap_increment) noexcept - : heap(std::move(heap)), heap_increment(heap_increment) - { - heap_start = CD3DX12_CPU_DESCRIPTOR_HANDLE(this->heap->GetCPUDescriptorHandleForHeapStart()); - heap_gpu_start = CD3DX12_GPU_DESCRIPTOR_HANDLE(this->heap->GetGPUDescriptorHandleForHeapStart()); - this->heap->GetDevice(device.iid(), device.put_void()); - } -}; - -class ImplDX12DescriptorBuffer : public QueryInternal -{ -public: - ImplDX12DescriptorBuffer() = default; - explicit ImplDX12DescriptorBuffer(wis::com_ptr heap, uint32_t heap_increment) noexcept - : QueryInternal(std::move(heap), heap_increment) - { - } - - operator bool() const noexcept - { - return bool(heap); - } - - operator DX12DescriptorBufferView() const noexcept - { - return { heap.get() }; - } - operator DX12DescriptorBufferGPUView() const noexcept - { - return { heap_gpu_start, heap_increment }; - } - -public: - WIS_INLINE uint64_t WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::DX12SamplerView sampler) noexcept; - WIS_INLINE uint64_t WriteShaderResource(uint64_t buffer_offset_before_table, - [[maybe_unused]] uint32_t root_table_index, - uint32_t binding, - uint32_t array_member, - [[maybe_unused]] wis::DX12RootSignatureView2 root_signature, - wis::DX12ShaderResourceView resource) noexcept; - WIS_INLINE uint64_t WriteConstantBuffer(uint64_t buffer_offset_before_table, - [[maybe_unused]] uint32_t root_table_index, - uint32_t binding, - uint32_t array_member, - [[maybe_unused]] wis::DX12RootSignatureView2 root_signature, - wis::DX12BufferView buffer, - uint32_t size) noexcept; - - WIS_INLINE uint64_t WriteShaderResource2(uint64_t aligned_table_offset, uint32_t index, wis::DX12ShaderResourceView resource) noexcept; - WIS_INLINE uint64_t WriteConstantBuffer2(uint64_t aligned_table_offset, uint32_t index, wis::DX12BufferView buffer, uint32_t size) noexcept; - -protected: - WIS_INLINE uint64_t WriteDescriptor(uint64_t buffer_offset_before_table, - uint32_t binding, - uint32_t array_member, - D3D12_CPU_DESCRIPTOR_HANDLE resource) noexcept; -}; - -#pragma region DX12DescriptorBuffer -/** - * @brief Represents descriptor buffer for binding descriptors. - * */ -class DX12DescriptorBuffer : public wis::ImplDX12DescriptorBuffer -{ -public: - using wis::ImplDX12DescriptorBuffer::ImplDX12DescriptorBuffer; - -public: - /** - * @brief Writes the sampler to the sampler descriptor buffer. - * Must be called with Sampler descriptor buffer, which was created with wis::DescriptorHeapType::Sampler. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::DX12Device. - * @param index Binding index in descriptor table. - * @param sampler The sampler to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::DX12SamplerView sampler) noexcept - { - return wis::ImplDX12DescriptorBuffer::WriteSampler(aligned_table_offset, index, std::move(sampler)); - } - /** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * Must be called with Shader Resource descriptor buffer, which was created with wis::DescriptorHeapType::Descriptor. - * Requires wis::DeviceFeature::DescriptorEqualSize to run, otherwise program is ill-formed. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::DX12Device. - * @param index Binding index in descriptor table. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteShaderResource2(uint64_t aligned_table_offset, uint32_t index, wis::DX12ShaderResourceView resource) noexcept - { - return wis::ImplDX12DescriptorBuffer::WriteShaderResource2(aligned_table_offset, index, std::move(resource)); - } - /** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * Must be called with Constant Buffer descriptor buffer, which was created with wis::DescriptorHeapType::Descriptor. - * Requires wis::DeviceFeature::DescriptorEqualSize to run, otherwise program is ill-formed. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::DX12Device. - * @param index Binding index in descriptor table. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteConstantBuffer2(uint64_t aligned_table_offset, uint32_t index, wis::DX12BufferView buffer, uint32_t buffer_size) noexcept - { - return wis::ImplDX12DescriptorBuffer::WriteConstantBuffer2(aligned_table_offset, index, std::move(buffer), buffer_size); - } - /** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::DX12Device. - * @param root_table_index Index of the descriptor table in wis::DX12RootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteShaderResource(uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, wis::DX12RootSignatureView2 root_signature, wis::DX12ShaderResourceView resource) noexcept - { - return wis::ImplDX12DescriptorBuffer::WriteShaderResource(aligned_table_offset, root_table_index, binding, array_member, std::move(root_signature), std::move(resource)); - } - /** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::DX12Device. - * @param root_table_index Index of the descriptor table in wis::DX12RootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteConstantBuffer(uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, wis::DX12RootSignatureView2 root_signature, wis::DX12BufferView buffer, uint32_t buffer_size) noexcept - { - return wis::ImplDX12DescriptorBuffer::WriteConstantBuffer(aligned_table_offset, root_table_index, binding, array_member, std::move(root_signature), std::move(buffer), buffer_size); - } -}; -#pragma endregion DX12DescriptorBuffer - -} // namespace wis -#ifndef WISDOM_BUILD_BINARIES -#include "impl/dx12_descriptor_buffer.cpp" -#endif // !WISDOM_BUILD_BINARIES - -#endif // !DX12_DESCRIPTOR_BUFFER_H diff --git a/wisdom/include/wisdom/dx12/dx12_descriptor_storage.h b/wisdom/include/wisdom/dx12/dx12_descriptor_storage.h new file mode 100644 index 00000000..5949d6d1 --- /dev/null +++ b/wisdom/include/wisdom/dx12/dx12_descriptor_storage.h @@ -0,0 +1,119 @@ +#ifndef WIS_DX12_DESCRIPTOR_STORAGE_H +#define WIS_DX12_DESCRIPTOR_STORAGE_H +#include +#include +#include +#include +#include + +namespace wis { + +class DX12DescriptorStorage; + +template<> +struct Internal { + // sampler, Uniform buffer, storage RW buffer, sampled image, storage RW image. Maybe storage read buffer will be needed. + static constexpr uint32_t max_sets = uint32_t(wis::BindingIndex::Count); + + wis::com_ptr device; + wis::com_ptr heap_resource; + wis::com_ptr heap_sampler; + + CD3DX12_CPU_DESCRIPTOR_HANDLE heap_starts[max_sets]{}; + CD3DX12_GPU_DESCRIPTOR_HANDLE heap_gpu_starts[2]{}; // 0 - resource, 1 - sampler. Used for SetDescriptorHeaps + uint32_t heap_resource_increment = 0; + uint32_t heap_sampler_increment = 0; +}; + +class ImplDX12DescriptorStorage : public QueryInternal +{ +public: + ImplDX12DescriptorStorage() = default; + explicit ImplDX12DescriptorStorage(Internal&& internal) noexcept + : QueryInternal(std::move(internal)) + { + } + + operator bool() const noexcept + { + return bool(heap_resource) || bool(heap_sampler); + } + + operator DX12DescriptorStorageView() const noexcept + { + return { (DX12DescriptorStorage*)this }; + } + +public: + void WriteSampler(uint32_t index, wis::DX12SamplerView sampler) noexcept + { + auto handle = CD3DX12_CPU_DESCRIPTOR_HANDLE(heap_starts[uint32_t(wis::BindingIndex::Sampler) - 1], index, heap_sampler_increment); + auto& sampler_handle = std::get<0>(sampler); + device->CopyDescriptorsSimple(1, handle, sampler_handle, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + } + void WriteConstantBuffer(uint32_t index, wis::DX12BufferView buffer, uint32_t size, uint32_t offset = 0) noexcept + { + auto* cbv = std::get<0>(buffer); + D3D12_CONSTANT_BUFFER_VIEW_DESC desc{ + .BufferLocation = std::get<0>(buffer)->GetGPUVirtualAddress() + offset, + .SizeInBytes = wis::detail::aligned_size(size, uint32_t(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT)) + }; + + auto handle = CD3DX12_CPU_DESCRIPTOR_HANDLE(heap_starts[uint32_t(wis::BindingIndex::ConstantBuffer) - 1], index, heap_resource_increment); + device->CreateConstantBufferView(&desc, handle); + } + void WriteTexture(uint32_t index, wis::DX12ShaderResourceView srv) noexcept + { + auto handle = CD3DX12_CPU_DESCRIPTOR_HANDLE(heap_starts[uint32_t(wis::BindingIndex::Texture) - 1], index, heap_resource_increment); + auto& srv_handle = std::get<0>(srv); + device->CopyDescriptorsSimple(1, handle, srv_handle, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + } +}; + +#pragma region DX12DescriptorStorage +/** + * @brief Represents descriptor storage object for storing descriptors. + * Used for bindless and non-uniform bindings. Don't combine with Descriptor buffers, this may reduce performance. + * */ +class DX12DescriptorStorage : public wis::ImplDX12DescriptorStorage +{ +public: + using wis::ImplDX12DescriptorStorage::ImplDX12DescriptorStorage; + +public: + /** + * @brief Writes the sampler to the sampler descriptor storage. + * @param index Index in array of samplers to fill. + * @param sampler The sampler to write. + * */ + inline void WriteSampler(uint32_t index, wis::DX12SamplerView sampler) noexcept + { + wis::ImplDX12DescriptorStorage::WriteSampler(index, std::move(sampler)); + } + /** + * @brief Writes the constant buffer to the constant buffer descriptor storage. + * @param index Index in array of constant buffers to fill. + * @param buffer The buffer to write. + * @param size The size of the constant buffer in bytes. + * @param offset The offset in the buffer to write the constant buffer to. + * size + offset must be less or equal the overall size of the bound buffer. + * */ + inline void WriteConstantBuffer(uint32_t index, wis::DX12BufferView buffer, uint32_t size, uint32_t offset = 0) noexcept + { + wis::ImplDX12DescriptorStorage::WriteConstantBuffer(index, std::move(buffer), size, offset); + } + /** + * @brief Writes the texture to the shader resource descriptor storage. + * @param index Index in array of shader resources to fill. + * @param resource The shader resource to write. + * */ + inline void WriteTexture(uint32_t index, wis::DX12ShaderResourceView resource) noexcept + { + wis::ImplDX12DescriptorStorage::WriteTexture(index, std::move(resource)); + } +}; +#pragma endregion DX12DescriptorStorage + +} // namespace wis + +#endif // !WIS_DX12_DESCRIPTOR_STORAGE_H diff --git a/wisdom/include/wisdom/dx12/dx12_device.h b/wisdom/include/wisdom/dx12/dx12_device.h index 6170a552..de45433b 100644 --- a/wisdom/include/wisdom/dx12/dx12_device.h +++ b/wisdom/include/wisdom/dx12/dx12_device.h @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include @@ -55,12 +55,6 @@ class ImplDX12Device : public QueryInternal [[nodiscard]] WIS_INLINE wis::ResultValue CreateGraphicsPipeline(const wis::DX12GraphicsPipelineDesc* desc) const noexcept; - [[nodiscard]] WIS_INLINE wis::ResultValue - CreateRootSignature(const RootConstant* root_constants = nullptr, - uint32_t constants_size = 0, - const wis::DescriptorTable* tables = nullptr, - uint32_t tables_count = 0) const noexcept; - [[nodiscard]] WIS_INLINE wis::ResultValue CreateShader(void* data, size_t size) const noexcept; @@ -79,24 +73,26 @@ class ImplDX12Device : public QueryInternal [[nodiscard]] WIS_INLINE wis::ResultValue CreateShaderResource(DX12TextureView texture, wis::ShaderResourceDesc desc) const noexcept; - // Descriptor buffer - [[nodiscard]] uint32_t - GetDescriptorTableAlignment(wis::DescriptorHeapType heap) const noexcept - { - return device->GetDescriptorHandleIncrementSize(wis::convert_dx(heap)); - } - [[nodiscard]] uint32_t - GetDescriptorBufferUnitSize(wis::DescriptorHeapType heap) const noexcept - { - return device->GetDescriptorHandleIncrementSize(wis::convert_dx(heap)); - } - - [[nodiscard]] WIS_INLINE wis::ResultValue - CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, wis::DescriptorMemory memory_type, uint64_t memory_bytes) const noexcept; - // returns true only for now [[nodiscard]] WIS_INLINE bool QueryFeatureSupport(wis::DeviceFeature feature) const noexcept; + + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateDescriptorStorage(wis::DescriptorStorageDesc desc) const noexcept; + + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateRootSignature(const PushConstant* constants = nullptr, + uint32_t constants_size = 0, + const PushDescriptor* push_descriptors = nullptr, + uint32_t push_descriptors_size = 0, + uint32_t space_overlap_count = 1) const noexcept; + + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateRootSignature2(const wis::PushConstant* push_constants = nullptr, + uint32_t constants_count = 0, + const wis::PushDescriptor* push_descriptors = nullptr, + uint32_t push_descriptors_count = 0, + const wis::DescriptorSpacing* descriptor_spacing = nullptr) const noexcept; }; #pragma region DX12Device @@ -166,16 +162,39 @@ class DX12Device : public wis::ImplDX12Device return wis::ImplDX12Device::CreateGraphicsPipeline(desc); } /** - * @brief Creates a root signature object. - * @param root_constants The root constants to create the root signature with. - * @param constants_size The number of root constants. - * @param tables The descriptor tables to create the root signature with. - * @param tables_count The number of descriptor tables. + * @brief Creates a root signature object for use with DescriptorStorage. + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. push_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param descriptors_count The number of push descriptors. Max is 8. + * @param space_overlap_count Count of descriptor spaces to overlap for each of the DescriptorStorage types. + * Default is 1. Max is 16. This is used primarily for descriptor type aliasing. + * Example: If wis::DX12Device is 2, that means that 2 descriptor spaces will be allocated for each descriptor type. + * [[vk::binding(0,0)]] SamplerState samplers: register(s0,space1); // space1 can be used for different type of samplers e.g. SamplerComparisonState + * [[vk::binding(0,0)]] SamplerComparisonState shadow_samplers: register(s0,space2); // they use the same binding (works like overloading) + * [[vk::binding(0,1)]] ConstantBuffer cbuffers: register(b0,space3); // this type also has 2 spaces, next will be on space 4 etc. + * @return wis::DX12RootSignature on success (wis::Status::Ok). + * */ + [[nodiscard]] inline wis::ResultValue CreateRootSignature(const wis::PushConstant* push_constants = nullptr, uint32_t constants_count = 0, const wis::PushDescriptor* push_descriptors = nullptr, uint32_t descriptors_count = 0, uint32_t space_overlap_count = 1) const noexcept + { + return wis::ImplDX12Device::CreateRootSignature(push_constants, constants_count, push_descriptors, descriptors_count, space_overlap_count); + } + /** + * @brief Creates a root signature object for use with DescriptorStorage. + * Supplies number of types for each descriptor type separately. + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. root_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param push_descriptors_count The number of push descriptors. Max is 8. + * @param descriptor_spacing Descriptor spacing allocation. + * nullptr means allocate 1 space for each. * @return wis::DX12RootSignature on success (wis::Status::Ok). * */ - [[nodiscard]] inline wis::ResultValue CreateRootSignature(const wis::RootConstant* root_constants = nullptr, uint32_t constants_size = 0, const wis::DescriptorTable* tables = nullptr, uint32_t tables_count = 0) const noexcept + [[nodiscard]] inline wis::ResultValue CreateRootSignature2(const wis::PushConstant* push_constants = nullptr, uint32_t constants_count = 0, const wis::PushDescriptor* push_descriptors = nullptr, uint32_t push_descriptors_count = 0, const wis::DescriptorSpacing* descriptor_spacing = nullptr) const noexcept { - return wis::ImplDX12Device::CreateRootSignature(root_constants, constants_size, tables, tables_count); + return wis::ImplDX12Device::CreateRootSignature2(push_constants, constants_count, push_descriptors, push_descriptors_count, descriptor_spacing); } /** * @brief Creates a shader object. @@ -237,36 +256,6 @@ class DX12Device : public wis::ImplDX12Device { return wis::ImplDX12Device::CreateShaderResource(std::move(texture), desc); } - /** - * @brief Returns the alignment of the descriptor table in bytes. - * The value is used to correctly determine descriptor page alignment for descriptor buffer. - * @param heap The type of the descriptor heap to get the alignment for. - * @return The alignment of the descriptor table in bytes. - * */ - inline uint32_t GetDescriptorTableAlignment(wis::DescriptorHeapType heap) const noexcept - { - return wis::ImplDX12Device::GetDescriptorTableAlignment(heap); - } - /** - * @brief Returns the size of the descriptor buffer unit in bytes. - * @param heap The type of the descriptor heap to get the unit size for. - * @return The size of the descriptor buffer unit in bytes. Descriptor unit is the size of one descriptor. - * */ - inline uint32_t GetDescriptorBufferUnitSize(wis::DescriptorHeapType heap) const noexcept - { - return wis::ImplDX12Device::GetDescriptorBufferUnitSize(heap); - } - /** - * @brief Creates a descriptor buffer object. - * @param heap_type The type of the descriptor heap to create the descriptor buffer with. - * @param memory_type The type of the descriptor memory to create the descriptor buffer with. - * @param size_bytes The number of bytes to allocate for the descriptor buffer. - * @return wis::DX12DescriptorBuffer on success (wis::Status::Ok). - * */ - [[nodiscard]] inline wis::ResultValue CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, wis::DescriptorMemory memory_type, uint64_t size_bytes) const noexcept - { - return wis::ImplDX12Device::CreateDescriptorBuffer(heap_type, memory_type, size_bytes); - } /** * @brief Queries if the device supports the feature. * @param feature The feature to query. diff --git a/wisdom/include/wisdom/dx12/dx12_resource.h b/wisdom/include/wisdom/dx12/dx12_resource.h index 7b724dc1..cea64a2d 100644 --- a/wisdom/include/wisdom/dx12/dx12_resource.h +++ b/wisdom/include/wisdom/dx12/dx12_resource.h @@ -155,7 +155,7 @@ class DX12Buffer : public wis::ImplDX12Buffer * */ inline void Unmap() const noexcept { - return wis::ImplDX12Buffer::Unmap(); + wis::ImplDX12Buffer::Unmap(); } }; #pragma endregion DX12Buffer diff --git a/wisdom/include/wisdom/dx12/dx12_root_signature.h b/wisdom/include/wisdom/dx12/dx12_root_signature.h index a62c02b9..cf09c945 100644 --- a/wisdom/include/wisdom/dx12/dx12_root_signature.h +++ b/wisdom/include/wisdom/dx12/dx12_root_signature.h @@ -10,7 +10,8 @@ template<> struct Internal { wis::com_ptr root; std::array stage_map; - uint32_t root_table_offset = 0; + uint32_t push_constant_count = 0; + uint32_t push_descriptor_count = 0; }; class DX12RootSignature : public QueryInternal @@ -20,13 +21,13 @@ class DX12RootSignature : public QueryInternal public: DX12RootSignature() = default; - explicit DX12RootSignature(wis::com_ptr xroot, std::array stage_map, uint32_t root_table_offset) noexcept - : QueryInternal(std::move(xroot), stage_map, root_table_offset) + explicit DX12RootSignature(wis::com_ptr xroot, std::array stage_map, uint32_t push_constant_count, uint32_t push_descriptor_count) noexcept + : QueryInternal(std::move(xroot), stage_map, push_constant_count, push_descriptor_count) { } operator DX12RootSignatureView() const noexcept { - return { root.get(), stage_map, root_table_offset }; + return { root.get(), stage_map, push_constant_count, push_descriptor_count }; } operator DX12RootSignatureView2() const noexcept { diff --git a/wisdom/include/wisdom/dx12/dx12_views.h b/wisdom/include/wisdom/dx12/dx12_views.h index 9df6dbd0..e52eed4c 100644 --- a/wisdom/include/wisdom/dx12/dx12_views.h +++ b/wisdom/include/wisdom/dx12/dx12_views.h @@ -12,11 +12,12 @@ class Allocation; } // namespace D3D12MA namespace wis { +class DX12DescriptorStorage; using DX12FactoryHandle = std::tuple; using DX12FenceView = std::tuple; using DX12ShaderView = std::tuple; -using DX12RootSignatureView = std::tuple, uint32_t>; +using DX12RootSignatureView = std::tuple, uint32_t, uint32_t>; using DX12RootSignatureView2 = decltype(std::ignore); using DX12CommandListView = std::tuple; using DX12QueueView = std::tuple; @@ -29,6 +30,7 @@ using DX12SamplerView = std::tuple; using DX12ShaderResourceView = std::tuple; using DX12MemoryView = std::tuple; using DX12PipelineView = std::tuple; +using DX12DescriptorStorageView = std::tuple; } // namespace wis #endif // !WIS_DX12_VIEWS_H diff --git a/wisdom/include/wisdom/dx12/impl/dx12_command_list.cpp b/wisdom/include/wisdom/dx12/impl/dx12_command_list.cpp index 5962e7af..4bf807e1 100644 --- a/wisdom/include/wisdom/dx12/impl/dx12_command_list.cpp +++ b/wisdom/include/wisdom/dx12/impl/dx12_command_list.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -15,26 +16,27 @@ void wis::ImplDX12CommandList::CopyBuffer(DX12BufferView source, DX12BufferView void wis::ImplDX12CommandList::CopyBufferToTexture(DX12BufferView src_buffer, DX12TextureView dest_texture, const wis::BufferTextureCopyRegion* regions, uint32_t region_count) const noexcept { auto texture = std::get<0>(dest_texture); + auto texture_desc = texture->GetDesc(); + auto desc1 = D3DX12ResourceDesc0ToDesc1(texture_desc); wis::com_ptr device; auto hr = texture->GetDevice(__uuidof(*device), device.put_void()); for (uint32_t i = 0; i < region_count; i++) { auto& region = regions[i]; - D3D12_PLACED_SUBRESOURCE_FOOTPRINT layout{}; - UINT num_rows = 0; - UINT64 row_size = 0; - UINT64 required_size = 0; + uint32_t num_rows = 0; + uint64_t row_size = 0; + uint64_t required_size = 0; - UINT dest_subresource = D3D12CalcSubresource(region.texture.mip, region.texture.array_layer, 0u, texture_desc.MipLevels, texture_desc.DepthOrArraySize); + uint32_t dest_subresource = D3D12CalcSubresource(region.texture.mip, region.texture.array_layer, 0u, texture_desc.MipLevels, texture_desc.DepthOrArraySize); D3D12_TEXTURE_COPY_LOCATION dst{ .pResource = texture, .Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, .SubresourceIndex = dest_subresource }; - UINT row_pitch = 0; + uint32_t row_pitch = 0; D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateMinimumRowMajorRowPitch(convert_dx(region.texture.format), region.texture.size.width, row_pitch); D3D12_TEXTURE_COPY_LOCATION src{ @@ -58,25 +60,25 @@ void wis::ImplDX12CommandList::CopyTextureToBuffer(DX12TextureView src_texture, { auto texture = std::get<0>(src_texture); auto texture_desc = texture->GetDesc(); + auto desc1 = D3DX12ResourceDesc0ToDesc1(texture_desc); wis::com_ptr device; auto hr = texture->GetDevice(__uuidof(*device), device.put_void()); for (uint32_t i = 0; i < region_count; i++) { auto& region = regions[i]; - D3D12_PLACED_SUBRESOURCE_FOOTPRINT layout{}; - UINT num_rows = 0; - UINT64 row_size = 0; - UINT64 required_size = 0; + uint32_t num_rows = 0; + uint64_t row_size = 0; + uint64_t required_size = 0; - UINT src_subresource = D3D12CalcSubresource(region.texture.mip, region.texture.array_layer, 0u, texture_desc.MipLevels, texture_desc.DepthOrArraySize); + uint32_t src_subresource = D3D12CalcSubresource(region.texture.mip, region.texture.array_layer, 0u, texture_desc.MipLevels, texture_desc.DepthOrArraySize); D3D12_TEXTURE_COPY_LOCATION src{ .pResource = texture, .Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, .SubresourceIndex = src_subresource }; - UINT row_pitch = 0; + uint32_t row_pitch = 0; D3D12_PROPERTY_LAYOUT_FORMAT_TABLE::CalculateMinimumRowMajorRowPitch(convert_dx(region.texture.format), region.texture.size.width, row_pitch); D3D12_TEXTURE_COPY_LOCATION dst{ @@ -92,7 +94,16 @@ void wis::ImplDX12CommandList::CopyTextureToBuffer(DX12TextureView src_texture, .RowPitch = row_pitch } } }; - list->CopyTextureRegion(&dst, UINT(region.buffer_offset), 0, 0, &src, nullptr); + D3D12_BOX box{ + .left = region.texture.offset.width, + .top = region.texture.offset.height, + .front = region.texture.offset.depth_or_layers, + .right = region.texture.offset.width + region.texture.size.width, + .bottom = region.texture.offset.height + region.texture.size.height, + .back = region.texture.offset.depth_or_layers + region.texture.size.depth_or_layers + }; + + list->CopyTextureRegion(&dst, 0, 0, 0, &src, &box); } } @@ -237,10 +248,11 @@ void wis::ImplDX12CommandList::BeginRenderPass(const wis::DX12RenderPassDesc* pa } } - if (pass_desc->depth_stencil) { - auto ds_selector = pass_desc->depth_stencil->depth_stencil_select; + D3D12_RENDER_PASS_DEPTH_STENCIL_DESC depth_stencil; + auto ds_selector = pass_desc->depth_stencil ? pass_desc->depth_stencil->depth_stencil_select : DSSelect::None; - D3D12_RENDER_PASS_DEPTH_STENCIL_DESC depth_stencil{ + if (ds_selector != DSSelect::None) { + depth_stencil = { .cpuDescriptor = std::get<0>(pass_desc->depth_stencil->target), .DepthBeginningAccess = { .Type = ds_selector & DSSelect::Depth ? convert_dx(pass_desc->depth_stencil->load_op_depth) : D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, @@ -258,10 +270,12 @@ void wis::ImplDX12CommandList::BeginRenderPass(const wis::DX12RenderPassDesc* pa .Type = ds_selector & DSSelect::Stencil ? convert_dx(pass_desc->depth_stencil->store_op_stencil) : D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, } }; - - return list->BeginRenderPass(pass_desc->target_count, data, (ds_selector != DSSelect::None) ? &depth_stencil : nullptr, convert_dx(pass_desc->flags)); } - list->BeginRenderPass(pass_desc->target_count, data, nullptr, convert_dx(pass_desc->flags)); + + list->BeginRenderPass(pass_desc->target_count, data, (ds_selector != DSSelect::None) ? &depth_stencil : nullptr, convert_dx(pass_desc->flags)); + + if (pass_desc->view_mask) + list->SetViewInstanceMask(pass_desc->view_mask); } void wis::ImplDX12CommandList::EndRenderPass() noexcept @@ -347,7 +361,8 @@ void wis::ImplDX12CommandList::SetRootSignature(wis::DX12RootSignatureView root_ { list->SetGraphicsRootSignature(std::get<0>(root_signature)); root_stage_map = std::get<1>(root_signature); - root_table_offset = std::get<2>(root_signature); + push_constant_count = std::get<2>(root_signature); + push_descriptor_count = std::get<3>(root_signature); } void wis::ImplDX12CommandList::DrawIndexedInstanced(uint32_t vertex_count_per_instance, @@ -367,21 +382,72 @@ void wis::ImplDX12CommandList::DrawInstanced(uint32_t vertex_count_per_instance, list->DrawInstanced(vertex_count_per_instance, instance_count, base_vertex, start_instance); } -void wis::ImplDX12CommandList::SetRootConstants(const void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept +void wis::ImplDX12CommandList::SetPushConstants(const void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept { - list->SetGraphicsRoot32BitConstants(UINT(root_stage_map[uint32_t(stage)]), size_4bytes, data, offset_4bytes); + list->SetGraphicsRoot32BitConstants(uint32_t(root_stage_map[uint32_t(stage)]), size_4bytes, data, offset_4bytes); } -void wis::ImplDX12CommandList::SetDescriptorBuffers(const wis::DX12DescriptorBufferView* buffers, uint32_t buffer_count) noexcept +void wis::ImplDX12CommandList::SetDescriptorStorage(wis::DX12DescriptorStorageView desc_storage) noexcept { - list->SetDescriptorHeaps(buffer_count, reinterpret_cast(buffers)); + auto& storage = std::get<0>(desc_storage)->GetInternal(); + + std::array heaps{}; + uint32_t increment = 0; + if (storage.heap_sampler) { + heaps[increment++] = storage.heap_sampler.get(); + } + if (storage.heap_resource) { + heaps[increment++] = storage.heap_resource.get(); + } + + list->SetDescriptorHeaps(increment, heaps.data()); + + if (storage.heap_sampler) { + list->SetGraphicsRootDescriptorTable(push_constant_count + push_descriptor_count, storage.heap_gpu_starts[1]); // 0 is reserved for push constants and push descriptors + } + if (storage.heap_resource) { + CD3DX12_GPU_DESCRIPTOR_HANDLE handles[+wis::BindingIndex::Count - 1]{ + // 0 is reserved for sampler heap + storage.heap_gpu_starts[0], + CD3DX12_GPU_DESCRIPTOR_HANDLE(storage.heap_gpu_starts[0], uint32_t(storage.heap_starts[2].ptr - storage.heap_starts[1].ptr)), + CD3DX12_GPU_DESCRIPTOR_HANDLE(storage.heap_gpu_starts[0], uint32_t(storage.heap_starts[3].ptr - storage.heap_starts[1].ptr)), + CD3DX12_GPU_DESCRIPTOR_HANDLE(storage.heap_gpu_starts[0], uint32_t(storage.heap_starts[4].ptr - storage.heap_starts[1].ptr)), + CD3DX12_GPU_DESCRIPTOR_HANDLE(storage.heap_gpu_starts[0], uint32_t(storage.heap_starts[5].ptr - storage.heap_starts[1].ptr)), + }; + if (storage.heap_starts[uint32_t(wis::BindingIndex::ConstantBuffer) - 1].ptr != 0) { + list->SetGraphicsRootDescriptorTable(push_constant_count + push_descriptor_count + uint32_t(wis::BindingIndex::ConstantBuffer) - 1, handles[0]); + } + if (storage.heap_starts[uint32_t(wis::BindingIndex::Texture) - 1].ptr != 0) { + list->SetGraphicsRootDescriptorTable(push_constant_count + push_descriptor_count + uint32_t(wis::BindingIndex::Texture) - 1, handles[1]); + } + if (storage.heap_starts[uint32_t(wis::BindingIndex::RWTexture) - 1].ptr != 0) { + list->SetGraphicsRootDescriptorTable(push_constant_count + push_descriptor_count + uint32_t(wis::BindingIndex::RWTexture) - 1, handles[2]); + } + if (storage.heap_starts[uint32_t(wis::BindingIndex::RWBuffer) - 1].ptr != 0) { + list->SetGraphicsRootDescriptorTable(push_constant_count + push_descriptor_count + uint32_t(wis::BindingIndex::RWBuffer) - 1, handles[3]); + } + if (storage.heap_starts[uint32_t(wis::BindingIndex::Buffer) - 1].ptr != 0) { + list->SetGraphicsRootDescriptorTable(push_constant_count + push_descriptor_count + uint32_t(wis::BindingIndex::Buffer) - 1, handles[4]); + } + } } -void wis::ImplDX12CommandList::SetDescriptorTableOffset(uint32_t root_table_index, wis::DX12DescriptorBufferGPUView buffer, uint32_t offset_bytes) noexcept +void wis::ImplDX12CommandList::PushDescriptor(wis::DescriptorType type, uint32_t binding, wis::DX12BufferView view, uint32_t offset) noexcept { - auto handle = std::get<0>(buffer); - list->SetGraphicsRootDescriptorTable(root_table_offset + root_table_index, - CD3DX12_GPU_DESCRIPTOR_HANDLE(handle, offset_bytes)); + auto handle = std::get<0>(view)->GetGPUVirtualAddress(); + switch (type) { + case wis::DescriptorType::Buffer: + list->SetGraphicsRootShaderResourceView(push_constant_count + binding, handle + offset); + break; + case wis::DescriptorType::Texture: + case wis::DescriptorType::RWTexture: + return; + case wis::DescriptorType::ConstantBuffer: + list->SetGraphicsRootConstantBufferView(push_constant_count + binding, handle + offset); + break; + case wis::DescriptorType::RWBuffer: + list->SetGraphicsRootUnorderedAccessView(push_constant_count + binding, handle + offset); + break; + } } - #endif // WIS_DX12_COMMAND_LIST_H diff --git a/wisdom/include/wisdom/dx12/impl/dx12_descriptor_buffer.cpp b/wisdom/include/wisdom/dx12/impl/dx12_descriptor_buffer.cpp deleted file mode 100644 index 1d7134d7..00000000 --- a/wisdom/include/wisdom/dx12/impl/dx12_descriptor_buffer.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef WIS_DX12_DESCRIPTOR_BUFFER_CPP -#define WIS_DX12_DESCRIPTOR_BUFFER_CPP -#include - -uint64_t wis::ImplDX12DescriptorBuffer::WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::DX12SamplerView sampler) noexcept -{ - auto handle = heap->GetCPUDescriptorHandleForHeapStart(); - handle.ptr += aligned_table_offset + index * heap_increment; - - auto sampler_handle = std::get<0>(sampler); - device->CopyDescriptorsSimple(1, handle, sampler_handle, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); - - return aligned_table_offset + index * heap_increment + heap_increment; -} - -uint64_t wis::ImplDX12DescriptorBuffer::WriteShaderResource(uint64_t buffer_offset_before_table, uint32_t root_table_index, uint32_t binding, uint32_t array_member, wis::DX12RootSignatureView2 root_signature, wis::DX12ShaderResourceView resource) noexcept -{ - auto srv_handle = std::get<0>(resource); - return WriteDescriptor(buffer_offset_before_table, binding, array_member, srv_handle); -} - -uint64_t wis::ImplDX12DescriptorBuffer::WriteConstantBuffer(uint64_t buffer_offset_before_table, uint32_t root_table_index, uint32_t binding, uint32_t array_member, wis::DX12RootSignatureView2 root_signature, wis::DX12BufferView buffer, uint32_t size) noexcept -{ - auto* cbv = std::get<0>(buffer); - D3D12_CONSTANT_BUFFER_VIEW_DESC desc{ - .BufferLocation = std::get<0>(buffer)->GetGPUVirtualAddress(), - .SizeInBytes = wis::detail::aligned_size(size, uint32_t(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT)) - }; - - auto handle = heap->GetCPUDescriptorHandleForHeapStart(); - handle.ptr += buffer_offset_before_table + (binding + array_member) * heap_increment; - - device->CreateConstantBufferView(&desc, handle); - return buffer_offset_before_table + (binding + array_member) * heap_increment + heap_increment; -} - -uint64_t wis::ImplDX12DescriptorBuffer::WriteShaderResource2(uint64_t aligned_table_offset, uint32_t index, wis::DX12ShaderResourceView resource) noexcept -{ - auto handle = heap->GetCPUDescriptorHandleForHeapStart(); - handle.ptr += index * heap_increment; - - auto sampler_handle = std::get<0>(resource); - device->CopyDescriptorsSimple(1, handle, sampler_handle, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); - - return aligned_table_offset + index * heap_increment + heap_increment; -} - -uint64_t wis::ImplDX12DescriptorBuffer::WriteConstantBuffer2(uint64_t aligned_table_offset, uint32_t index, wis::DX12BufferView buffer, uint32_t size) noexcept -{ - auto handle = heap->GetCPUDescriptorHandleForHeapStart(); - handle.ptr += index * heap_increment; - - D3D12_CONSTANT_BUFFER_VIEW_DESC desc{ - .BufferLocation = std::get<0>(buffer)->GetGPUVirtualAddress(), - .SizeInBytes = wis::detail::aligned_size(size, uint32_t(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT)) - }; - - device->CreateConstantBufferView(&desc, handle); - - return aligned_table_offset + index * heap_increment + heap_increment; -} - -uint64_t wis::ImplDX12DescriptorBuffer::WriteDescriptor(uint64_t buffer_offset_before_table, uint32_t binding, uint32_t array_member, D3D12_CPU_DESCRIPTOR_HANDLE resource) noexcept -{ - auto handle = heap->GetCPUDescriptorHandleForHeapStart(); - handle.ptr += buffer_offset_before_table + (binding + array_member) * heap_increment; - - device->CopyDescriptorsSimple(1, handle, resource, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); - return buffer_offset_before_table + (binding + array_member) * heap_increment + heap_increment; -} - -#endif // !DX12_DESCRIPTOR_BUFFER_CPP diff --git a/wisdom/include/wisdom/dx12/impl/dx12_device.cpp b/wisdom/include/wisdom/dx12/impl/dx12_device.cpp index 54a44bf0..fff299ad 100644 --- a/wisdom/include/wisdom/dx12/impl/dx12_device.cpp +++ b/wisdom/include/wisdom/dx12/impl/dx12_device.cpp @@ -8,6 +8,7 @@ #include #include #include +#include wis::ResultValue wis::ImplDX12CreateDevice(wis::DX12Adapter adapter, wis::DX12DeviceExtension** extensions, uint32_t ext_count, bool force) noexcept @@ -106,91 +107,6 @@ wis::ImplDX12Device::CreateCommandList(wis::QueueType type) const noexcept return DX12CommandList{ std::move(allocator), std::move(command_list) }; } -wis::ResultValue -wis::ImplDX12Device::CreateRootSignature(const RootConstant* root_constants, - uint32_t constants_size, - const wis::DescriptorTable* tables, - uint32_t tables_count) const noexcept -{ - wis::com_ptr rsig; - - D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; - - wis::detail::limited_allocator root_params{ constants_size + tables_count, true }; - - std::array stage_map{}; - std::fill(stage_map.begin(), stage_map.end(), -1); - - for (uint32_t i = 0; i < constants_size; ++i) { - auto& constant = root_constants[i]; - root_params.data()[i] = { - .ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS, - .Constants = { - .ShaderRegister = DX12RootSignature::root_const_register, - .RegisterSpace = 0, - .Num32BitValues = constant.size_bytes / 4, - }, - .ShaderVisibility = D3D12_SHADER_VISIBILITY(constant.stage), - }; - stage_map[+constant.stage] = i; - } - - size_t memory_size = 0; - for (uint32_t i = 0; i < tables_count; ++i) { - auto& table = tables[i]; - memory_size += table.entry_count; - } - - auto memory = wis::detail::make_unique_for_overwrite(memory_size); - if (!memory) - return wis::make_result(E_OUTOFMEMORY); - - uint32_t offset = 0; - for (uint32_t i = constants_size; i < constants_size + tables_count; ++i) { - auto& table = tables[i - constants_size]; - - for (size_t j = offset; j < table.entry_count + offset; j++) { - auto& entry = table.entries[j - offset]; - memory[j] = { - .RangeType = convert_dx(entry.type), - .NumDescriptors = entry.count, - .BaseShaderRegister = entry.bind_register, - .RegisterSpace = 0, - .Flags = entry.count == UINT32_MAX ? D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE : D3D12_DESCRIPTOR_RANGE_FLAG_NONE, // always volatile for unbounded arrays - .OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND, - }; - } - - root_params.data()[i] = { - .ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, - .DescriptorTable = { - .NumDescriptorRanges = table.entry_count, - .pDescriptorRanges = memory.get() + offset, - }, - .ShaderVisibility = D3D12_SHADER_VISIBILITY(table.stage), - }; - offset += table.entry_count; - } - - CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC desc; - desc.Init_1_1(constants_size + tables_count, root_params.data(), 0, nullptr, flags); - - wis::com_ptr signature; - wis::com_ptr error; - HRESULT hr = D3D12SerializeVersionedRootSignature(&desc, signature.put(), error.put()); - - if (!wis::succeeded(hr)) - return wis::make_result(hr); - - hr = device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), - __uuidof(*rsig), rsig.put_void()); - - if (!wis::succeeded(hr)) - return wis::make_result(hr); - - return DX12RootSignature{ std::move(rsig), stage_map, constants_size }; -} - namespace wis::detail { template inline void DX12FillShaderStage(wis::detail::memory_pool<1024>& pipeline_stream, @@ -327,6 +243,25 @@ wis::ImplDX12Device::CreateGraphicsPipeline(const wis::DX12GraphicsPipelineDesc* } pipeline_stream.allocate() = rta; + //--Multiview + D3D12_VIEW_INSTANCE_LOCATION view_locs[8]{}; + if (desc->view_mask) { + for (uint32_t i = 0u; i < 8u; i++) { + if (!(desc->view_mask & (1u << i))) + continue; + + view_locs[i] = D3D12_VIEW_INSTANCE_LOCATION{ + .ViewportArrayIndex = 0, + .RenderTargetArrayIndex = i, + }; + } + pipeline_stream.allocate() = CD3DX12_VIEW_INSTANCING_DESC{ + uint32_t(std::popcount(desc->view_mask)), + view_locs, + D3D12_VIEW_INSTANCING_FLAGS::D3D12_VIEW_INSTANCING_FLAG_ENABLE_VIEW_INSTANCE_MASKING + }; + } + //--Blend if (desc->blend) { auto& blend = *desc->blend; @@ -542,26 +477,6 @@ wis::ImplDX12Device::CreateDepthStencilTarget(DX12TextureView texture, wis::Rend return DX12RenderTarget{ std::move(heap), handle }; } -wis::ResultValue -wis::ImplDX12Device::CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, wis::DescriptorMemory memory_type, uint64_t memory_bytes) const noexcept -{ - auto xheap_type = convert_dx(heap_type); - auto inc_size = device->GetDescriptorHandleIncrementSize(xheap_type); - auto aligned_size = wis::detail::aligned_size(memory_bytes, uint64_t(inc_size)); - D3D12_DESCRIPTOR_HEAP_DESC desc{ - .Type = convert_dx(heap_type), - .NumDescriptors = uint32_t(aligned_size / inc_size), - .Flags = convert_dx(memory_type), - .NodeMask = 0, - }; - wis::com_ptr heap; - auto hr = device->CreateDescriptorHeap(&desc, heap.iid(), heap.put_void()); - if (!wis::succeeded(hr)) - return wis::make_result(hr); - - return DX12DescriptorBuffer{ std::move(heap), device->GetDescriptorHandleIncrementSize(desc.Type) }; -} - wis::ResultValue wis::ImplDX12Device::CreateSampler(const wis::SamplerDesc* desc) const noexcept { @@ -703,15 +618,327 @@ bool wis::ImplDX12Device::QueryFeatureSupport(wis::DeviceFeature feature) const } return EnhancedBarriersSupported; } - case wis::DeviceFeature::DescriptorBuffer: case wis::DeviceFeature::WaitForPresent: - case wis::DeviceFeature::DescriptorEqualSize: case wis::DeviceFeature::DynamicVSync: case wis::DeviceFeature::AdvancedIndexBuffer: case wis::DeviceFeature::UnusedRenderTargets: + case wis::DeviceFeature::PushDescriptors: return true; default: return false; } } + +wis::ResultValue +wis::ImplDX12Device::CreateDescriptorStorage(wis::DescriptorStorageDesc desc) const noexcept +{ + uint32_t size_resources = desc.cbuffer_count + desc.sbuffer_count + desc.stexture_count + desc.texture_count + desc.rbuffer_count; + uint32_t size_samplers = desc.sampler_count; + + std::array sizes{ + desc.sampler_count, desc.cbuffer_count, desc.texture_count, desc.stexture_count, desc.sbuffer_count, desc.rbuffer_count + }; + + D3D12_DESCRIPTOR_HEAP_DESC resource_heap_desc{ + .Type = D3D12_DESCRIPTOR_HEAP_TYPE::D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, + .NumDescriptors = size_resources, + .Flags = convert_dx(desc.memory), + .NodeMask = 0u + }; + + D3D12_DESCRIPTOR_HEAP_DESC sampler_heap_desc{ + .Type = D3D12_DESCRIPTOR_HEAP_TYPE::D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, + .NumDescriptors = size_samplers, + .Flags = convert_dx(desc.memory), + .NodeMask = 0u + }; + + wis::Internal storage{}; + if (size_resources) { + // create resource heap + auto hr = device->CreateDescriptorHeap(&resource_heap_desc, __uuidof(*storage.heap_resource), storage.heap_resource.put_void()); + if (!wis::succeeded(hr)) + return wis::make_result(hr); + + storage.heap_resource_increment = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + storage.heap_starts[1] = storage.heap_resource->GetCPUDescriptorHandleForHeapStart(); + storage.heap_gpu_starts[0] = storage.heap_resource->GetGPUDescriptorHandleForHeapStart(); + + for (uint32_t i = 2; i < sizes.size(); i++) { // first one is sampler + storage.heap_starts[i] = + sizes[i] + ? CD3DX12_CPU_DESCRIPTOR_HANDLE(storage.heap_starts[i - 1], sizes[i - 1], storage.heap_resource_increment) + : CD3DX12_CPU_DESCRIPTOR_HANDLE(); + } + } + + if (size_samplers) { + // create sampler heap + auto hr = device->CreateDescriptorHeap(&sampler_heap_desc, __uuidof(*storage.heap_sampler), storage.heap_sampler.put_void()); + if (!wis::succeeded(hr)) + return wis::make_result(hr); + storage.heap_sampler_increment = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + storage.heap_starts[0] = storage.heap_sampler->GetCPUDescriptorHandleForHeapStart(); + storage.heap_gpu_starts[1] = storage.heap_sampler->GetGPUDescriptorHandleForHeapStart(); + } + storage.device = device; + + return DX12DescriptorStorage{ std::move(storage) }; +} + +namespace wis::detail { +constexpr inline D3D12_ROOT_PARAMETER_TYPE to_dx(wis::DescriptorType type) noexcept +{ + switch (type) { + case wis::DescriptorType::Buffer: + case wis::DescriptorType::Texture: + return D3D12_ROOT_PARAMETER_TYPE_SRV; + case wis::DescriptorType::ConstantBuffer: + return D3D12_ROOT_PARAMETER_TYPE_CBV; + case wis::DescriptorType::RWBuffer: + case wis::DescriptorType::RWTexture: + return D3D12_ROOT_PARAMETER_TYPE_UAV; + default: + return D3D12_ROOT_PARAMETER_TYPE_CBV; + } +} +} // namespace wis::detail + +wis::ResultValue +wis::ImplDX12Device::CreateRootSignature(const wis::PushConstant* constants, + uint32_t constants_size, + const PushDescriptor* push_descriptors, + uint32_t push_descriptors_size, + uint32_t space_overlap_count) const noexcept +{ + if (constants_size > wis::max_push_constants) { + return wis::make_result(E_INVALIDARG); + } + if (push_descriptors_size > wis::max_push_descriptors) { + return wis::make_result(E_INVALIDARG); + } + if (space_overlap_count > wis::max_descriptor_space_overlap) { + return wis::make_result(E_INVALIDARG); + } + + uint32_t push_constants_count = constants_size; + uint32_t push_descriptors_count = push_descriptors_size; + uint32_t space_overlap = space_overlap_count; + constexpr static uint32_t tables_size = +wis::BindingIndex::Count; + + // max push constants + max push descriptors + max tables + D3D12_ROOT_PARAMETER1 root_params[wis::max_push_constants + wis::max_push_descriptors + tables_size]{}; + + // push constants + std::array stage_map{}; + std::fill(stage_map.begin(), stage_map.end(), -1); + + for (uint32_t i = 0; i < push_constants_count; ++i) { + auto& constant = constants[i]; + root_params[i] = { + .ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS, + .Constants = { + .ShaderRegister = constant.bind_register, + .RegisterSpace = 0, + .Num32BitValues = constant.size_bytes / 4, + }, + .ShaderVisibility = D3D12_SHADER_VISIBILITY(constant.stage), + }; + stage_map[+constant.stage] = i; + } + + // push descriptors + for (uint32_t i = 0; i < push_descriptors_count; ++i) { + auto& descriptor = push_descriptors[i]; + root_params[i + push_constants_count] = { + .ParameterType = detail::to_dx(descriptor.type), + .Descriptor = { + .ShaderRegister = i, + .RegisterSpace = 0, // always 0 for push descriptors + }, + .ShaderVisibility = convert_dx(descriptor.stage), + }; + } + + // + D3D12_DESCRIPTOR_RANGE1 memory[+wis::BindingIndex::Count][wis::max_descriptor_space_overlap]{}; + constexpr static D3D12_DESCRIPTOR_RANGE_TYPE types[+wis::BindingIndex::Count]{ + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, // sampler + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_CBV, // cbuffer + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_SRV, // texture + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_UAV, // stexture + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_UAV, // sbuffer + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_SRV, // read only buffer + }; + + uint32_t spaces = 1; // 0 is reserved for push constants + for (uint32_t i = 0; i < +wis::BindingIndex::Count; ++i) { + for (uint32_t j = 0; j < space_overlap; ++j) { + memory[i][j] = { + .RangeType = types[i], + .NumDescriptors = UINT32_MAX, + .BaseShaderRegister = 0, + .RegisterSpace = spaces++, + .Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE, // always volatile for unbounded arrays + .OffsetInDescriptorsFromTableStart = j ? 0 : D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND, + }; + } + + root_params[i + push_constants_count + push_descriptors_count] = { + .ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, + .DescriptorTable = { + .NumDescriptorRanges = space_overlap, + .pDescriptorRanges = memory[i], + }, + .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL, + }; + } + + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC desc; + desc.Init_1_1(push_constants_count + push_descriptors_count + tables_size, root_params, 0, nullptr, flags); + + wis::com_ptr signature; + wis::com_ptr error; + HRESULT hr = D3D12SerializeVersionedRootSignature(&desc, signature.put(), error.put()); + + if (!wis::succeeded(hr)) + return wis::make_result(hr); + + wis::com_ptr rsig; + hr = device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), + __uuidof(*rsig), rsig.put_void()); + + if (!wis::succeeded(hr)) + return wis::make_result(hr); + + return DX12RootSignature{ std::move(rsig), stage_map, push_constants_count, push_descriptors_count }; +} + +namespace wis::detail { +inline constexpr uint32_t allocate_space( + D3D12_ROOT_PARAMETER1* root_params, + D3D12_DESCRIPTOR_RANGE1* memory, + uint32_t spaces, + uint32_t base_space) +{ + spaces = std::min(spaces, 1u); + for (uint32_t j = 0; j < spaces; ++j) { + memory[j] = { + .RangeType = D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_SRV, + .NumDescriptors = UINT32_MAX, + .BaseShaderRegister = 0, + .RegisterSpace = base_space + j, + .Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE, + .OffsetInDescriptorsFromTableStart = j ? 0 : D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND, + }; + } + *root_params = { + .ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE, + .DescriptorTable = { + .NumDescriptorRanges = spaces, + .pDescriptorRanges = memory, + }, + .ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL, + }; + return spaces; +} +} // namespace wis::detail + +wis::ResultValue +wis::ImplDX12Device::CreateRootSignature2(const wis::PushConstant* push_constants, + uint32_t constants_count, + const wis::PushDescriptor* push_descriptors, + uint32_t push_descriptors_count, + const wis::DescriptorSpacing* descriptor_spacing) const noexcept +{ + if (constants_count > wis::max_push_constants) { + return wis::make_result(E_INVALIDARG); + } + if (push_descriptors_count > wis::max_push_descriptors) { + return wis::make_result(E_INVALIDARG); + } + wis::DescriptorSpacing default_spacing{}; + if (!descriptor_spacing) { + descriptor_spacing = &default_spacing; + } + + uint32_t push_constants_count = constants_count; + constexpr static uint32_t tables_size = +wis::BindingIndex::Count; + + // max push constants + max push descriptors + max tables + D3D12_ROOT_PARAMETER1 root_params[wis::max_push_constants + wis::max_push_descriptors + tables_size]{}; + + // push constants + std::array stage_map{}; + std::fill(stage_map.begin(), stage_map.end(), -1); + + for (uint32_t i = 0; i < push_constants_count; ++i) { + auto& constant = push_constants[i]; + root_params[i] = { + .ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS, + .Constants = { + .ShaderRegister = constant.bind_register, + .RegisterSpace = 0, + .Num32BitValues = constant.size_bytes / 4, + }, + .ShaderVisibility = D3D12_SHADER_VISIBILITY(constant.stage), + }; + stage_map[+constant.stage] = i; + } + + // push descriptors + for (uint32_t i = 0; i < push_descriptors_count; ++i) { + auto& descriptor = push_descriptors[i]; + root_params[i + push_constants_count] = { + .ParameterType = detail::to_dx(descriptor.type), + .Descriptor = { + .ShaderRegister = i, + .RegisterSpace = 0, // always 0 for push descriptors + }, + .ShaderVisibility = convert_dx(descriptor.stage), + }; + } + + // + D3D12_DESCRIPTOR_RANGE1 memory[+wis::BindingIndex::Count][wis::max_descriptor_space_overlap]{}; + constexpr static D3D12_DESCRIPTOR_RANGE_TYPE types[+wis::BindingIndex::Count]{ + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, // sampler + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_CBV, // cbuffer + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_SRV, // texture + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_UAV, // stexture + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_UAV, // sbuffer + D3D12_DESCRIPTOR_RANGE_TYPE::D3D12_DESCRIPTOR_RANGE_TYPE_SRV, // read only buffer + }; + + uint32_t base_space = 1; // 0 is reserved for push constants + uint32_t allocated_spaces = 0; // 0 is reserved for push constants + allocated_spaces = detail::allocate_space(&root_params[0 + push_constants_count + push_descriptors_count], memory[0], descriptor_spacing->sampler_count, base_space); + allocated_spaces = detail::allocate_space(&root_params[1 + push_constants_count + push_descriptors_count], memory[1], descriptor_spacing->cbuffer_count, base_space += allocated_spaces); + allocated_spaces = detail::allocate_space(&root_params[2 + push_constants_count + push_descriptors_count], memory[2], descriptor_spacing->texture_count, base_space += allocated_spaces); + allocated_spaces = detail::allocate_space(&root_params[3 + push_constants_count + push_descriptors_count], memory[3], descriptor_spacing->stexture_count, base_space += allocated_spaces); + allocated_spaces = detail::allocate_space(&root_params[4 + push_constants_count + push_descriptors_count], memory[4], descriptor_spacing->sbuffer_count, base_space += allocated_spaces); + allocated_spaces = detail::allocate_space(&root_params[5 + push_constants_count + push_descriptors_count], memory[5], descriptor_spacing->rbuffer_count, base_space += allocated_spaces); + + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC desc; + desc.Init_1_1(push_constants_count + push_descriptors_count + tables_size, root_params, 0, nullptr, flags); + + wis::com_ptr signature; + wis::com_ptr error; + HRESULT hr = D3D12SerializeVersionedRootSignature(&desc, signature.put(), error.put()); + + if (!wis::succeeded(hr)) + return wis::make_result(hr); + + wis::com_ptr rsig; + hr = device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), + __uuidof(*rsig), rsig.put_void()); + + if (!wis::succeeded(hr)) + return wis::make_result(hr); + + return DX12RootSignature{ std::move(rsig), stage_map, push_constants_count, push_descriptors_count }; +} + #endif // !DX12_DEVICE_CPP diff --git a/wisdom/include/wisdom/generated/api/api.h b/wisdom/include/wisdom/generated/api/api.h index e312cf88..80100b03 100644 --- a/wisdom/include/wisdom/generated/api/api.h +++ b/wisdom/include/wisdom/generated/api/api.h @@ -5,7 +5,7 @@ /** \mainpage Wisdom API Documentation -Version 0.3.14 +Version 0.4.0 Copyright (c) 2024 Ilya Doroshenko. All rights reserved. License: MIT @@ -28,7 +28,7 @@ struct DepthStencilDesc; struct BlendAttachmentDesc; struct BlendStateDesc; struct RenderAttachmentsDesc; -struct RootConstant; +struct PushConstant; struct SwapchainDesc; struct TextureDesc; struct AllocationInfo; @@ -48,6 +48,8 @@ struct ComponentMapping; struct ShaderResourceDesc; struct FactoryExtQuery; struct DeviceExtQuery; +struct DescriptorStorageDesc; +struct DescriptorSpacing; /** * @brief Shader stages that can be used in the pipeline. @@ -128,23 +130,29 @@ enum class MutiWaitFlags : uint32_t { * */ enum class DescriptorType : uint32_t { /** - * @brief Descriptor is a shader resource view. - * Used for textures. + * @brief Descriptor is a sampler. + * Sampler is used to sample textures in shaders. + * Stored in separate descriptor table and + * can't be mixed with other descriptor types. * */ - ShaderResource = 0, - ConstantBuffer = 1, ///< Descriptor is a constant buffer view. + Sampler = 0, + ConstantBuffer = 1, ///< Descriptor is a constant buffer. + Texture = 2, ///< Descriptor is a texture. /** - * @brief Descriptor is an unordered access view. + * @brief Descriptor is an unordered access read-write texture. * Used for read/write operations in compute shaders. * */ - UnorderedAccess = 2, + RWTexture = 3, /** - * @brief Descriptor is a sampler. - * Sampler is used to sample textures in shaders. - * Stored in separate descriptor table and - * can't be mixed with other descriptor types + * @brief Descriptor is an unordered access read-write buffer. + * Used for read/write operations in compute shaders. * */ - Sampler = 3, + RWBuffer = 4, + /** + * @brief Descriptor is a shader resource buffer. + * May be bigger than constant buffers, but slower. + * */ + Buffer = 5, }; /** @@ -987,6 +995,32 @@ enum class TextureLayout : uint32_t { Texture3D = 8, ///< Texture is 3D volume. }; +/** + * @brief Binding index for resources. + * Used in wis::DescriptorStorage to determine which descriptor type goes where when binding. + * Same values are used for HLSL side to pick descriptors up. + * Space 0 and set 0 are reserved for push descriptors and push constants. + * + * */ +enum class BindingIndex : uint32_t { + /** + * @brief No binding index set.Results in [[vk::binding(*,0)]] and register(*). + * This space is reserved for push constants and push descriptors. + * */ + None = 0, + Sampler = 1, ///< Binding index for sampler descriptors. Results in [[vk::binding(0,1)]] and register(s0, space1). + ConstantBuffer = 2, ///< Binding index for constant buffer descriptors. Results in [[vk::binding(0,2)]] and register(b0, space2). + Texture = 3, ///< Binding index for texture descriptors. Results in [[vk::binding(0,3)]] and register(t0, space3). + RWTexture = 4, ///< Binding index for read-write texture descriptors. Results in [[vk::binding(0,4)]] and register(u0, space4). + RWBuffer = 5, ///< Binding index for read-write buffer descriptors. Results in [[vk::binding(0,5)]] and register(u0, space5). + /** + * @brief Binding index for read buffer descriptors. Results in [[vk::binding(0,6)]] and register(t0, space6). + * Can't be merged with Texture because of Vulkan. + * */ + Buffer = 6, + Count = 6, ///< Number of binding indices. Used for array sizes. +}; + /** * @brief Descriptor heap type. * @@ -1056,11 +1090,6 @@ enum class TopologyType : uint32_t { * * */ enum class DeviceFeature : uint32_t { - /** - * @brief Core Functionality. Descriptor buffer support for VK, always true for DX12. - * Vulkan provides DescriptorPool and DescriptorSet functionalities, that have to be used manually through library internals. - * */ - DescriptorBuffer = 0, /** * @brief Core Functionality. Supports enhanced barriers. Support for VK and DX12. * Used in all barriers to provide more control over synchronization. Without the feature behavior is undefined. @@ -1073,11 +1102,6 @@ enum class DeviceFeature : uint32_t { * Unlocks Swapchain::WaitForPresent. * */ WaitForPresent = 2, - /** - * @brief Descriptor size for SRV UAV and CBV are equal in size, support for VK, always true for DX12. - * Unlocks DescriptorBuffer::WriteShaderResource2, DescriptorBuffer::WriteConstantBuffer2 functions. Without the feature their behavior is undefined. - * */ - DescriptorEqualSize = 3, /** * @brief Supports advanced index buffer features. Support for VK, always true for DX12. * Unlocks CommandList::IASetIndexBuffer2 function. Without the extension behavior is undefined. @@ -1089,6 +1113,7 @@ enum class DeviceFeature : uint32_t { * */ DynamicVSync = 5, UnusedRenderTargets = 6, ///< Supports unused render targets. Support for VK, always true for DX12. + PushDescriptors = 7, ///< Supports push descriptors. Support for VK, always true for DX12. }; /** @@ -1180,6 +1205,7 @@ enum class FactoryExtID : uint32_t { * */ enum class DeviceExtID : uint32_t { Custom = 0, ///< Custom provided extension. Default initialization of the extension is done by user. + DescriptorBufferExtension = 1, }; /** @@ -1370,6 +1396,21 @@ enum class FenceFlags { Shared = 1 << 0, ///< Fence is shared. Used for sharing fences for single physical device. }; +/** + * @brief Pipeline flags for additional pipeline features + * + * Translates to D3D12_PIPELINE_STATE_FLAGS for dx implementation. + * Translates to VkPipelineCreateFlags for vk implementation. + * */ +enum class PipelineFlags { + None = 0x0, ///< No flags set. Pipeline is regular. + /** + * @brief Pipeline is created to be used with DescriptorBuffer extension. + * Do not mix DescriptorBuffer and non-DescriptorBuffer pipelines. + * */ + DescriptorBuffer = 1 << 0, +}; + /** * @brief Main source of communication of operation success. * To check for success compare wis::Result::status with wis::Status::Ok. @@ -1450,9 +1491,9 @@ struct InputAttribute { * @brief Input layout description for . * */ struct InputLayout { - wis::InputSlotDesc* slots; ///< Input slots array. Made to pick up data from several arrays of vertex data. + const wis::InputSlotDesc* slots; ///< Input slots array. Made to pick up data from several arrays of vertex data. uint32_t slot_count; ///< Input slots count. Max number is 16. - wis::InputAttribute* attributes; ///< Input attributes array. Describes how the vertex data is read by the HLSL shader. + const wis::InputAttribute* attributes; ///< Input attributes array. Describes how the vertex data is read by the HLSL shader. uint32_t attribute_count; ///< Input attributes count. }; @@ -1532,17 +1573,19 @@ struct BlendStateDesc { * @brief Render attachments description for . * */ struct RenderAttachmentsDesc { - wis::DataFormat* attachment_formats; ///< Attachment formats array. Describes the format of the render target. - uint32_t attachments_count; ///< Attachment formats count. + std::array attachment_formats{}; ///< Attachment formats array. Describes the format of the render target. + uint32_t attachments_count; ///< Attachment formats count. Max is 8. wis::DataFormat depth_attachment; ///< Depth attachment format. Describes the format of the depth buffer. }; /** - * @brief Root constant description for . + * @brief A set of constants that get pushed directly to the pipeline. + * Only one set can be created per shader stage. * */ -struct RootConstant { +struct PushConstant { wis::ShaderStages stage; ///< Shader stage. Defines the stage where the constant is used. - uint32_t size_bytes; ///< Size of the constant in bytes. + uint32_t size_bytes; ///< Size of the constant in bytes. Must be divisible by 4. + uint32_t bind_register; ///< Bind register number in HLSL. }; /** @@ -1602,13 +1645,11 @@ struct BufferTextureCopyRegion { }; /** - * @brief Push descriptor. Unused for now. + * @brief Push descriptor. Used to push data directly to pipeline. * */ struct PushDescriptor { - wis::ShaderStages stage; - uint32_t bind_register; - wis::DescriptorType type; - uint32_t reserved; + wis::ShaderStages stage; ///< Shader stage. Defines the stage where the descriptor is used. + wis::DescriptorType type; ///< Descriptor type. Works only with buffer-like bindings. }; /** @@ -1775,6 +1816,33 @@ struct DeviceExtQuery { void* result; }; +/** + * @brief Descriptor storage description for wis::DescriptorStorage creation. + * */ +struct DescriptorStorageDesc { + uint32_t sampler_count; ///< Count of sampler descriptors to allocate. + uint32_t cbuffer_count; ///< Count of constant buffer descriptors to allocate. + uint32_t sbuffer_count; ///< Count of storage buffer descriptors to allocate. + uint32_t texture_count; ///< Count of texture descriptors to allocate. + uint32_t stexture_count; ///< Count of storage texture descriptors to allocate. + uint32_t rbuffer_count; ///< Count of read only storage buffer descriptors to allocate. + wis::DescriptorMemory memory; ///< Descriptor memory to use. +}; + +/** + * @brief Describes how many types can descriptors be reinterpreted as. + * Minimal amount of spaces for each type is 1, 0 is treated as 1. + * Used for RootSignature. + * */ +struct DescriptorSpacing { + uint32_t sampler_count; ///< Count of spaces of sampler descriptors to allocate. + uint32_t cbuffer_count; ///< Count of spaces of constant buffer descriptors to allocate. + uint32_t sbuffer_count; ///< Count of spaces of storage buffer descriptors to allocate. + uint32_t texture_count; ///< Count of spaces of texture descriptors to allocate. + uint32_t stexture_count; ///< Count of spaces of storage texture descriptors to allocate. + uint32_t rbuffer_count; ///< Count of spaces of read only storage buffer descriptors to allocate. +}; + //=================================DELEGATES================================= /** @@ -1819,6 +1887,9 @@ struct is_flag_enum : public std::true_type { template<> struct is_flag_enum : public std::true_type { }; +template<> +struct is_flag_enum : public std::true_type { +}; //============================== CONSTS ============================== static inline constexpr Result success{ diff --git a/wisdom/include/wisdom/generated/dx12/dx12_structs.hpp b/wisdom/include/wisdom/generated/dx12/dx12_structs.hpp index d65c137e..7b4065b9 100644 --- a/wisdom/include/wisdom/generated/dx12/dx12_structs.hpp +++ b/wisdom/include/wisdom/generated/dx12/dx12_structs.hpp @@ -40,11 +40,17 @@ struct DX12GraphicsPipelineDesc { wis::InputLayout input_layout; ///< Input layout. wis::DX12GraphicsShaderStages shaders; ///< Shader stages. wis::RenderAttachmentsDesc attachments; ///< Render attachments. - wis::RasterizerDesc* rasterizer = nullptr; ///< Rasterizer description. - wis::SampleDesc* sample = nullptr; ///< Sample description. - wis::BlendStateDesc* blend = nullptr; ///< Blend state description. - wis::DepthStencilDesc* depth_stencil = nullptr; ///< Depth stencil description. + const wis::RasterizerDesc* rasterizer = nullptr; ///< Rasterizer description. + const wis::SampleDesc* sample = nullptr; ///< Sample description. + const wis::BlendStateDesc* blend = nullptr; ///< Blend state description. + const wis::DepthStencilDesc* depth_stencil = nullptr; ///< Depth stencil description. wis::TopologyType topology_type = wis::TopologyType::Triangle; ///< Topology type. Default is wis::TopologyType::Triangle. + /** + * @brief View mask for Multiview feature. If multiview is not available it is ignored. + * Default is 0. 0 means regular rendering. + * */ + uint32_t view_mask = 0; + wis::PipelineFlags flags; ///< Pipeline flags to add options to pipeline creation. }; /** @@ -76,9 +82,15 @@ struct DX12RenderPassDepthStencilDesc { * */ struct DX12RenderPassDesc { wis::RenderPassFlags flags; ///< Render pass flags. + /** + * @brief View mask for Multiview feature. If multiview is not available it is ignored. + * Value must be the same as in upon pipeline creation. Otherwise behavior is undefined. + * Default is 0. 0 means regular rendering. + * */ + uint32_t view_mask = 0; uint32_t target_count; ///< Render target count. - wis::DX12RenderPassRenderTargetDesc* targets = nullptr; ///< Render target descriptions. - wis::DX12RenderPassDepthStencilDesc* depth_stencil = nullptr; ///< Depth stencil description. + const wis::DX12RenderPassRenderTargetDesc* targets = nullptr; ///< Render target descriptions. + const wis::DX12RenderPassDepthStencilDesc* depth_stencil = nullptr; ///< Depth stencil description. }; /** @@ -104,14 +116,18 @@ inline constexpr D3D12_DESCRIPTOR_RANGE_TYPE convert_dx(DescriptorType value) no switch (value) { default: return {}; - case DescriptorType::ShaderResource: - return D3D12_DESCRIPTOR_RANGE_TYPE_SRV; + case DescriptorType::Sampler: + return D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER; case DescriptorType::ConstantBuffer: return D3D12_DESCRIPTOR_RANGE_TYPE_CBV; - case DescriptorType::UnorderedAccess: + case DescriptorType::Texture: + return D3D12_DESCRIPTOR_RANGE_TYPE_SRV; + case DescriptorType::RWTexture: return D3D12_DESCRIPTOR_RANGE_TYPE_UAV; - case DescriptorType::Sampler: - return D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER; + case DescriptorType::RWBuffer: + return D3D12_DESCRIPTOR_RANGE_TYPE_UAV; + case DescriptorType::Buffer: + return D3D12_DESCRIPTOR_RANGE_TYPE_SRV; } } inline constexpr DXGI_FORMAT convert_dx(DataFormat value) noexcept @@ -482,4 +498,9 @@ inline constexpr D3D12_FENCE_FLAGS convert_dx(FenceFlags value) noexcept output |= D3D12_FENCE_FLAG_SHARED; return output; } +inline constexpr D3D12_PIPELINE_STATE_FLAGS convert_dx(PipelineFlags value) noexcept +{ + D3D12_PIPELINE_STATE_FLAGS output = {}; + return output; +} } // namespace wis diff --git a/wisdom/include/wisdom/generated/vulkan/vk_functions.hpp b/wisdom/include/wisdom/generated/vulkan/vk_functions.hpp index a64c3285..72820219 100644 --- a/wisdom/include/wisdom/generated/vulkan/vk_functions.hpp +++ b/wisdom/include/wisdom/generated/vulkan/vk_functions.hpp @@ -256,8 +256,8 @@ struct VKMainInstance { }; struct VKMainDevice { - PFN_vkCmdCopyImageToBuffer2 vkCmdCopyImageToBuffer2; PFN_vkCmdCopyBufferToImage2 vkCmdCopyBufferToImage2; + PFN_vkCmdCopyImageToBuffer2 vkCmdCopyImageToBuffer2; PFN_vkUnmapMemory vkUnmapMemory; PFN_vkDestroyDevice vkDestroyDevice; PFN_vkBeginCommandBuffer vkBeginCommandBuffer; @@ -265,6 +265,8 @@ struct VKMainDevice { PFN_vkCreateSampler vkCreateSampler; PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; PFN_vkAllocateMemory vkAllocateMemory; + PFN_vkDestroyPipeline vkDestroyPipeline; + PFN_vkQueueWaitIdle vkQueueWaitIdle; PFN_vkCreateImage vkCreateImage; PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; PFN_vkFreeMemory vkFreeMemory; @@ -296,24 +298,23 @@ struct VKMainDevice { PFN_vkDestroyShaderModule vkDestroyShaderModule; PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; - PFN_vkDestroyPipeline vkDestroyPipeline; PFN_vkResetCommandBuffer vkResetCommandBuffer; PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; - PFN_vkDestroyCommandPool vkDestroyCommandPool; PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; + PFN_vkCreateDescriptorPool vkCreateDescriptorPool; + PFN_vkCmdPushConstants vkCmdPushConstants; + PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; + PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; + PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; + PFN_vkDestroyCommandPool vkDestroyCommandPool; PFN_vkEndCommandBuffer vkEndCommandBuffer; + PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; PFN_vkCmdDraw vkCmdDraw; PFN_vkCmdDrawIndexed vkCmdDrawIndexed; PFN_vkCmdCopyBuffer vkCmdCopyBuffer; - PFN_vkCmdPushConstants vkCmdPushConstants; PFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements; PFN_vkGetDeviceImageMemoryRequirements vkGetDeviceImageMemoryRequirements; PFN_vkGetDeviceQueue2 vkGetDeviceQueue2; - PFN_vkCmdSetDescriptorBufferOffsetsEXT vkCmdSetDescriptorBufferOffsetsEXT; - PFN_vkGetDescriptorEXT vkGetDescriptorEXT; - PFN_vkGetDescriptorSetLayoutSizeEXT vkGetDescriptorSetLayoutSizeEXT; - PFN_vkGetDescriptorSetLayoutBindingOffsetEXT vkGetDescriptorSetLayoutBindingOffsetEXT; - PFN_vkCmdBindDescriptorBuffersEXT vkCmdBindDescriptorBuffersEXT; #if defined(VK_KHR_maintenance5) PFN_vkCmdBindIndexBuffer2KHR vkCmdBindIndexBuffer2KHR; #else @@ -344,9 +345,9 @@ struct VKMainDevice { PFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue; PFN_vkCmdPipelineBarrier2 vkCmdPipelineBarrier2; PFN_vkQueueSubmit2 vkQueueSubmit2; - PFN_vkCmdEndRendering vkCmdEndRendering; - PFN_vkCmdBeginRendering vkCmdBeginRendering; PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress; + PFN_vkCmdBeginRendering vkCmdBeginRendering; + PFN_vkCmdEndRendering vkCmdEndRendering; PFN_vkCmdSetPrimitiveTopology vkCmdSetPrimitiveTopology; PFN_vkCmdBindVertexBuffers2 vkCmdBindVertexBuffers2; PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; @@ -354,6 +355,11 @@ struct VKMainDevice { PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; PFN_vkQueuePresentKHR vkQueuePresentKHR; +#if defined(VK_KHR_push_descriptor) + PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR; +#else + void* vkCmdPushDescriptorSetKHR; +#endif #if defined(VK_KHR_present_wait) PFN_vkWaitForPresentKHR vkWaitForPresentKHR; #else @@ -363,31 +369,31 @@ struct VKMainDevice { public: bool Init(VkDevice device, PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr) noexcept { - static constexpr std::array vkCmdCopyImageToBuffer2_strings{ + static constexpr std::array vkCmdCopyBufferToImage2_strings{ #if defined(VK_VERSION_1_3) - "vkCmdCopyImageToBuffer2", + "vkCmdCopyBufferToImage2", #endif #if defined(VK_KHR_copy_commands2) - "vkCmdCopyImageToBuffer2KHR", + "vkCmdCopyBufferToImage2KHR", #endif }; - for (auto vkCmdCopyImageToBuffer2_it : vkCmdCopyImageToBuffer2_strings) - if ((vkCmdCopyImageToBuffer2 = (PFN_vkCmdCopyImageToBuffer2)vkGetDeviceProcAddr(device, vkCmdCopyImageToBuffer2_it))) + for (auto vkCmdCopyBufferToImage2_it : vkCmdCopyBufferToImage2_strings) + if ((vkCmdCopyBufferToImage2 = (PFN_vkCmdCopyBufferToImage2)vkGetDeviceProcAddr(device, vkCmdCopyBufferToImage2_it))) break; - if (vkCmdCopyImageToBuffer2 == nullptr) + if (vkCmdCopyBufferToImage2 == nullptr) return false; - static constexpr std::array vkCmdCopyBufferToImage2_strings{ + static constexpr std::array vkCmdCopyImageToBuffer2_strings{ #if defined(VK_VERSION_1_3) - "vkCmdCopyBufferToImage2", + "vkCmdCopyImageToBuffer2", #endif #if defined(VK_KHR_copy_commands2) - "vkCmdCopyBufferToImage2KHR", + "vkCmdCopyImageToBuffer2KHR", #endif }; - for (auto vkCmdCopyBufferToImage2_it : vkCmdCopyBufferToImage2_strings) - if ((vkCmdCopyBufferToImage2 = (PFN_vkCmdCopyBufferToImage2)vkGetDeviceProcAddr(device, vkCmdCopyBufferToImage2_it))) + for (auto vkCmdCopyImageToBuffer2_it : vkCmdCopyImageToBuffer2_strings) + if ((vkCmdCopyImageToBuffer2 = (PFN_vkCmdCopyImageToBuffer2)vkGetDeviceProcAddr(device, vkCmdCopyImageToBuffer2_it))) break; - if (vkCmdCopyBufferToImage2 == nullptr) + if (vkCmdCopyImageToBuffer2 == nullptr) return false; vkUnmapMemory = (PFN_vkUnmapMemory)vkGetDeviceProcAddr(device, "vkUnmapMemory"); if (vkUnmapMemory == nullptr) @@ -410,6 +416,12 @@ struct VKMainDevice { vkAllocateMemory = (PFN_vkAllocateMemory)vkGetDeviceProcAddr(device, "vkAllocateMemory"); if (vkAllocateMemory == nullptr) return false; + vkDestroyPipeline = (PFN_vkDestroyPipeline)vkGetDeviceProcAddr(device, "vkDestroyPipeline"); + if (vkDestroyPipeline == nullptr) + return false; + vkQueueWaitIdle = (PFN_vkQueueWaitIdle)vkGetDeviceProcAddr(device, "vkQueueWaitIdle"); + if (vkQueueWaitIdle == nullptr) + return false; vkCreateImage = (PFN_vkCreateImage)vkGetDeviceProcAddr(device, "vkCreateImage"); if (vkCreateImage == nullptr) return false; @@ -503,24 +515,39 @@ struct VKMainDevice { vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)vkGetDeviceProcAddr(device, "vkCreateGraphicsPipelines"); if (vkCreateGraphicsPipelines == nullptr) return false; - vkDestroyPipeline = (PFN_vkDestroyPipeline)vkGetDeviceProcAddr(device, "vkDestroyPipeline"); - if (vkDestroyPipeline == nullptr) - return false; vkResetCommandBuffer = (PFN_vkResetCommandBuffer)vkGetDeviceProcAddr(device, "vkResetCommandBuffer"); if (vkResetCommandBuffer == nullptr) return false; vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)vkGetDeviceProcAddr(device, "vkDestroyPipelineLayout"); if (vkDestroyPipelineLayout == nullptr) return false; - vkDestroyCommandPool = (PFN_vkDestroyCommandPool)vkGetDeviceProcAddr(device, "vkDestroyCommandPool"); - if (vkDestroyCommandPool == nullptr) - return false; vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)vkGetDeviceProcAddr(device, "vkAllocateCommandBuffers"); if (vkAllocateCommandBuffers == nullptr) return false; + vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool)vkGetDeviceProcAddr(device, "vkCreateDescriptorPool"); + if (vkCreateDescriptorPool == nullptr) + return false; + vkCmdPushConstants = (PFN_vkCmdPushConstants)vkGetDeviceProcAddr(device, "vkCmdPushConstants"); + if (vkCmdPushConstants == nullptr) + return false; + vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)vkGetDeviceProcAddr(device, "vkDestroyDescriptorPool"); + if (vkDestroyDescriptorPool == nullptr) + return false; + vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)vkGetDeviceProcAddr(device, "vkAllocateDescriptorSets"); + if (vkAllocateDescriptorSets == nullptr) + return false; + vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)vkGetDeviceProcAddr(device, "vkUpdateDescriptorSets"); + if (vkUpdateDescriptorSets == nullptr) + return false; + vkDestroyCommandPool = (PFN_vkDestroyCommandPool)vkGetDeviceProcAddr(device, "vkDestroyCommandPool"); + if (vkDestroyCommandPool == nullptr) + return false; vkEndCommandBuffer = (PFN_vkEndCommandBuffer)vkGetDeviceProcAddr(device, "vkEndCommandBuffer"); if (vkEndCommandBuffer == nullptr) return false; + vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)vkGetDeviceProcAddr(device, "vkCmdBindDescriptorSets"); + if (vkCmdBindDescriptorSets == nullptr) + return false; vkCmdDraw = (PFN_vkCmdDraw)vkGetDeviceProcAddr(device, "vkCmdDraw"); if (vkCmdDraw == nullptr) return false; @@ -530,9 +557,6 @@ struct VKMainDevice { vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkGetDeviceProcAddr(device, "vkCmdCopyBuffer"); if (vkCmdCopyBuffer == nullptr) return false; - vkCmdPushConstants = (PFN_vkCmdPushConstants)vkGetDeviceProcAddr(device, "vkCmdPushConstants"); - if (vkCmdPushConstants == nullptr) - return false; static constexpr std::array vkGetDeviceBufferMemoryRequirements_strings{ #if defined(VK_VERSION_1_3) "vkGetDeviceBufferMemoryRequirements", @@ -562,21 +586,6 @@ struct VKMainDevice { vkGetDeviceQueue2 = (PFN_vkGetDeviceQueue2)vkGetDeviceProcAddr(device, "vkGetDeviceQueue2"); if (vkGetDeviceQueue2 == nullptr) return false; - vkCmdSetDescriptorBufferOffsetsEXT = (PFN_vkCmdSetDescriptorBufferOffsetsEXT)vkGetDeviceProcAddr(device, "vkCmdSetDescriptorBufferOffsetsEXT"); - if (vkCmdSetDescriptorBufferOffsetsEXT == nullptr) - return false; - vkGetDescriptorEXT = (PFN_vkGetDescriptorEXT)vkGetDeviceProcAddr(device, "vkGetDescriptorEXT"); - if (vkGetDescriptorEXT == nullptr) - return false; - vkGetDescriptorSetLayoutSizeEXT = (PFN_vkGetDescriptorSetLayoutSizeEXT)vkGetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSizeEXT"); - if (vkGetDescriptorSetLayoutSizeEXT == nullptr) - return false; - vkGetDescriptorSetLayoutBindingOffsetEXT = (PFN_vkGetDescriptorSetLayoutBindingOffsetEXT)vkGetDeviceProcAddr(device, "vkGetDescriptorSetLayoutBindingOffsetEXT"); - if (vkGetDescriptorSetLayoutBindingOffsetEXT == nullptr) - return false; - vkCmdBindDescriptorBuffersEXT = (PFN_vkCmdBindDescriptorBuffersEXT)vkGetDeviceProcAddr(device, "vkCmdBindDescriptorBuffersEXT"); - if (vkCmdBindDescriptorBuffersEXT == nullptr) - return false; vkCmdBindIndexBuffer2KHR = (PFN_vkCmdBindIndexBuffer2KHR)vkGetDeviceProcAddr(device, "vkCmdBindIndexBuffer2KHR"); static constexpr std::array vkGetImageMemoryRequirements2_strings{ #if defined(VK_VERSION_1_1) @@ -687,18 +696,21 @@ struct VKMainDevice { break; if (vkQueueSubmit2 == nullptr) return false; - static constexpr std::array vkCmdEndRendering_strings{ -#if defined(VK_VERSION_1_3) - "vkCmdEndRendering", + static constexpr std::array vkGetBufferDeviceAddress_strings{ +#if defined(VK_VERSION_1_2) + "vkGetBufferDeviceAddress", #endif -#if defined(VK_KHR_dynamic_rendering) - "vkCmdEndRenderingKHR", +#if defined(VK_KHR_buffer_device_address) + "vkGetBufferDeviceAddressKHR", +#endif +#if defined(VK_EXT_buffer_device_address) + "vkGetBufferDeviceAddressEXT", #endif }; - for (auto vkCmdEndRendering_it : vkCmdEndRendering_strings) - if ((vkCmdEndRendering = (PFN_vkCmdEndRendering)vkGetDeviceProcAddr(device, vkCmdEndRendering_it))) + for (auto vkGetBufferDeviceAddress_it : vkGetBufferDeviceAddress_strings) + if ((vkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)vkGetDeviceProcAddr(device, vkGetBufferDeviceAddress_it))) break; - if (vkCmdEndRendering == nullptr) + if (vkGetBufferDeviceAddress == nullptr) return false; static constexpr std::array vkCmdBeginRendering_strings{ #if defined(VK_VERSION_1_3) @@ -713,21 +725,18 @@ struct VKMainDevice { break; if (vkCmdBeginRendering == nullptr) return false; - static constexpr std::array vkGetBufferDeviceAddress_strings{ -#if defined(VK_VERSION_1_2) - "vkGetBufferDeviceAddress", -#endif -#if defined(VK_KHR_buffer_device_address) - "vkGetBufferDeviceAddressKHR", + static constexpr std::array vkCmdEndRendering_strings{ +#if defined(VK_VERSION_1_3) + "vkCmdEndRendering", #endif -#if defined(VK_EXT_buffer_device_address) - "vkGetBufferDeviceAddressEXT", +#if defined(VK_KHR_dynamic_rendering) + "vkCmdEndRenderingKHR", #endif }; - for (auto vkGetBufferDeviceAddress_it : vkGetBufferDeviceAddress_strings) - if ((vkGetBufferDeviceAddress = (PFN_vkGetBufferDeviceAddress)vkGetDeviceProcAddr(device, vkGetBufferDeviceAddress_it))) + for (auto vkCmdEndRendering_it : vkCmdEndRendering_strings) + if ((vkCmdEndRendering = (PFN_vkCmdEndRendering)vkGetDeviceProcAddr(device, vkCmdEndRendering_it))) break; - if (vkGetBufferDeviceAddress == nullptr) + if (vkCmdEndRendering == nullptr) return false; static constexpr std::array vkCmdSetPrimitiveTopology_strings{ #if defined(VK_VERSION_1_3) @@ -770,6 +779,7 @@ struct VKMainDevice { vkQueuePresentKHR = (PFN_vkQueuePresentKHR)vkGetDeviceProcAddr(device, "vkQueuePresentKHR"); if (vkQueuePresentKHR == nullptr) return false; + vkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)vkGetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR"); vkWaitForPresentKHR = (PFN_vkWaitForPresentKHR)vkGetDeviceProcAddr(device, "vkWaitForPresentKHR"); return true; } diff --git a/wisdom/include/wisdom/generated/vulkan/vk_structs.hpp b/wisdom/include/wisdom/generated/vulkan/vk_structs.hpp index 347256b8..5fa7b306 100644 --- a/wisdom/include/wisdom/generated/vulkan/vk_structs.hpp +++ b/wisdom/include/wisdom/generated/vulkan/vk_structs.hpp @@ -39,11 +39,17 @@ struct VKGraphicsPipelineDesc { wis::InputLayout input_layout; ///< Input layout. wis::VKGraphicsShaderStages shaders; ///< Shader stages. wis::RenderAttachmentsDesc attachments; ///< Render attachments. - wis::RasterizerDesc* rasterizer = nullptr; ///< Rasterizer description. - wis::SampleDesc* sample = nullptr; ///< Sample description. - wis::BlendStateDesc* blend = nullptr; ///< Blend state description. - wis::DepthStencilDesc* depth_stencil = nullptr; ///< Depth stencil description. + const wis::RasterizerDesc* rasterizer = nullptr; ///< Rasterizer description. + const wis::SampleDesc* sample = nullptr; ///< Sample description. + const wis::BlendStateDesc* blend = nullptr; ///< Blend state description. + const wis::DepthStencilDesc* depth_stencil = nullptr; ///< Depth stencil description. wis::TopologyType topology_type = wis::TopologyType::Triangle; ///< Topology type. Default is wis::TopologyType::Triangle. + /** + * @brief View mask for Multiview feature. If multiview is not available it is ignored. + * Default is 0. 0 means regular rendering. + * */ + uint32_t view_mask = 0; + wis::PipelineFlags flags; ///< Pipeline flags to add options to pipeline creation. }; /** @@ -75,9 +81,15 @@ struct VKRenderPassDepthStencilDesc { * */ struct VKRenderPassDesc { wis::RenderPassFlags flags; ///< Render pass flags. + /** + * @brief View mask for Multiview feature. If multiview is not available it is ignored. + * Value must be the same as in upon pipeline creation. Otherwise behavior is undefined. + * Default is 0. 0 means regular rendering. + * */ + uint32_t view_mask = 0; uint32_t target_count; ///< Render target count. - wis::VKRenderPassRenderTargetDesc* targets = nullptr; ///< Render target descriptions. - wis::VKRenderPassDepthStencilDesc* depth_stencil = nullptr; ///< Depth stencil description. + const wis::VKRenderPassRenderTargetDesc* targets = nullptr; ///< Render target descriptions. + const wis::VKRenderPassDepthStencilDesc* depth_stencil = nullptr; ///< Depth stencil description. }; /** @@ -118,14 +130,18 @@ inline constexpr VkDescriptorType convert_vk(DescriptorType value) noexcept switch (value) { default: return {}; - case DescriptorType::ShaderResource: - return VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; + case DescriptorType::Sampler: + return VK_DESCRIPTOR_TYPE_SAMPLER; case DescriptorType::ConstantBuffer: return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - case DescriptorType::UnorderedAccess: + case DescriptorType::Texture: + return VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; + case DescriptorType::RWTexture: + return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; + case DescriptorType::RWBuffer: + return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + case DescriptorType::Buffer: return VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - case DescriptorType::Sampler: - return VK_DESCRIPTOR_TYPE_SAMPLER; } } inline constexpr VkFormat convert_vk(DataFormat value) noexcept @@ -794,4 +810,11 @@ inline constexpr VkImageUsageFlags convert_vk(TextureUsage value) noexcept output |= VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT; return output; } +inline constexpr VkPipelineCreateFlags convert_vk(PipelineFlags value) noexcept +{ + VkPipelineCreateFlags output = {}; + if (value & PipelineFlags::DescriptorBuffer) + output |= VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT; + return output; +} } // namespace wis diff --git a/wisdom/include/wisdom/global/definitions.h b/wisdom/include/wisdom/global/definitions.h index f7d4d334..cc0aa5fb 100644 --- a/wisdom/include/wisdom/global/definitions.h +++ b/wisdom/include/wisdom/global/definitions.h @@ -1,6 +1,4 @@ #pragma once -#define WIS_DOC(a) ///< Documentation macro, used by Generator to generate documentation automatically - #ifdef WISDOM_BUILD_BINARIES // If we are building the binaries #define WIS_INLINE #else @@ -13,5 +11,8 @@ inline constexpr const bool debug_layer = debug_mode; inline constexpr const unsigned max_render_targets = 8u; inline constexpr const unsigned max_vertex_bindings = 16u; -inline constexpr const unsigned max_shader_stages = 5; +inline constexpr const unsigned max_shader_stages = 5u; +inline constexpr const unsigned max_push_constants = 5u; +inline constexpr const unsigned max_push_descriptors = 8u; +inline constexpr const unsigned max_descriptor_space_overlap = 32u; } // namespace wis diff --git a/wisdom/include/wisdom/util/com_ptr.h b/wisdom/include/wisdom/util/com_ptr.h index 29940c8a..e08a5e69 100644 --- a/wisdom/include/wisdom/util/com_ptr.h +++ b/wisdom/include/wisdom/util/com_ptr.h @@ -47,7 +47,11 @@ class com_ptr public: com_ptr() noexcept : ptr(nullptr) { } - com_ptr(pointer p) noexcept + + com_ptr(std::nullptr_t) noexcept + : ptr(nullptr) { } + + explicit com_ptr(pointer p) noexcept : ptr(p) { add_ref(); @@ -86,21 +90,30 @@ class com_ptr copy_ref(ptr.ptr); return *this; } + + com_ptr& operator=(const com_ptr& other) noexcept + { + copy_ref(other.ptr); + return *this; + } + template com_ptr& operator=(com_ptr&& other) noexcept { - if constexpr (std::same_as) { - if (get() == other.get()) { - std::exchange(other.ptr, {}); - return *this; - } - } - release(); ptr = std::exchange(other.ptr, {}); return *this; } + com_ptr& operator=(com_ptr&& other) noexcept + { + if (this != &other) { + release(); + ptr = std::exchange(other.ptr, {}); + } + return *this; + } + explicit operator bool() const noexcept { return ptr != nullptr; diff --git a/wisdom/include/wisdom/vulkan/gen/vk_functions.in b/wisdom/include/wisdom/vulkan/gen/vk_functions.in index 6a5bdba4..2d8691b8 100644 --- a/wisdom/include/wisdom/vulkan/gen/vk_functions.in +++ b/wisdom/include/wisdom/vulkan/gen/vk_functions.in @@ -62,19 +62,17 @@ vkCmdBindIndexBuffer vkCmdDrawIndexed vkCmdDraw vkCmdPushConstants -vkCmdBindDescriptorBuffersEXT -vkCmdSetDescriptorBufferOffsetsEXT vkCreateFence vkDestroyFence vkCreateSemaphore vkDestroySemaphore vkQueueSubmit +vkQueueWaitIdle vkQueueSubmit2 vkWaitForFences vkResetFences vkCreateImageView vkDestroyImageView -vkGetDescriptorSetLayoutSizeEXT vkDestroyDescriptorSetLayout vkCreateDescriptorSetLayout vkCreateSampler @@ -101,8 +99,12 @@ vkGetImageMemoryRequirements vkGetDeviceBufferMemoryRequirements vkGetDeviceImageMemoryRequirements vkGetBufferDeviceAddress -vkGetDescriptorSetLayoutBindingOffsetEXT -vkGetDescriptorEXT vkGetSemaphoreCounterValue vkSignalSemaphore [opt]vkWaitForPresentKHR +vkDestroyDescriptorPool +vkCreateDescriptorPool +vkAllocateDescriptorSets +vkUpdateDescriptorSets +vkCmdBindDescriptorSets +[opt]vkCmdPushDescriptorSetKHR diff --git a/wisdom/include/wisdom/vulkan/impl/vk_command_list.cpp b/wisdom/include/wisdom/vulkan/impl/vk_command_list.cpp index 1861cccb..2601afcd 100644 --- a/wisdom/include/wisdom/vulkan/impl/vk_command_list.cpp +++ b/wisdom/include/wisdom/vulkan/impl/vk_command_list.cpp @@ -307,7 +307,7 @@ void wis::ImplVKCommandList::BeginRenderPass(const wis::VKRenderPassDesc* pass_d .extent = { extent.width, extent.height }, }, .layerCount = 1, - .viewMask = 0, + .viewMask = pass_desc->view_mask, .colorAttachmentCount = pass_desc->target_count, .pColorAttachments = data, .pDepthAttachment = ds_selector & DSSelect::Depth ? &d_info : nullptr, @@ -432,56 +432,44 @@ void wis::ImplVKCommandList::DrawInstanced(uint32_t vertex_count_per_instance, device.table().vkCmdDraw(command_list, vertex_count_per_instance, instance_count, base_vertex, start_instance); } -void wis::ImplVKCommandList::SetRootConstants(const void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept +void wis::ImplVKCommandList::SetPushConstants(const void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept { device.table().vkCmdPushConstants(command_list, pipeline_layout, convert_vk(stage), offset_4bytes * 4, size_4bytes * 4, data); } -void wis::ImplVKCommandList::SetDescriptorBuffers(const wis::VKDescriptorBufferView* buffers, uint32_t buffer_count) noexcept +void wis::ImplVKCommandList::SetDescriptorStorage(wis::VKDescriptorStorageView desc_storage) noexcept { - if (buffer_count == 0) - return; - - VkDescriptorBufferBindingInfoEXT infos[2] = { - { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT, - .usage = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT, - }, - - { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT, - .usage = VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT, - } - }; - - uint8_t id = false; - - for (size_t i = 0; i < buffer_count; i++) { - auto& buffer = buffers[i]; - auto address = std::get<0>(buffer); - if (std::get<1>(buffer) == wis::DescriptorHeapType::Descriptor) { - infos[0].address = address; - id |= 1; - } else { - infos[1].address = address; - id |= 2; - } - } - - auto* pinfos = infos + (id == 2); - uint32_t xbuffer_count = 1 + uint32_t(id == 3); - - device.table().vkCmdBindDescriptorBuffersEXT(command_list, xbuffer_count, pinfos); + auto& set_span = std::get<0>(desc_storage); + device.table().vkCmdBindDescriptorSets(command_list, + VK_PIPELINE_BIND_POINT_GRAPHICS, + pipeline_layout, 1, // set 1, because set 0 is reserved for push descriptors + set_span.size(), set_span.data(), + 0, nullptr); } -void wis::ImplVKCommandList::SetDescriptorTableOffset(uint32_t root_table_index, wis::VKDescriptorBufferView buffer, uint32_t offset_bytes) noexcept +void wis::ImplVKCommandList::PushDescriptor(wis::DescriptorType type, uint32_t binding, wis::VKBufferView view, uint32_t offset) noexcept { - auto binding = std::get<1>(buffer); - uint32_t index = uint32_t(binding == wis::DescriptorHeapType::Sampler); - VkDeviceSize offset = offset_bytes; - - device.table().vkCmdSetDescriptorBufferOffsetsEXT(command_list, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, root_table_index, 1, - &index, &offset); + VkDescriptorBufferInfo buffer_info{ + .buffer = std::get<0>(view), + .offset = offset, + .range = VK_WHOLE_SIZE, + }; + VkWriteDescriptorSet descriptor{ + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .pNext = nullptr, + .dstSet = VK_NULL_HANDLE, + .dstBinding = binding, + .dstArrayElement = 0, + .descriptorCount = 1, + .descriptorType = convert_vk(type), + .pBufferInfo = &buffer_info + }; + device.table().vkCmdPushDescriptorSetKHR(command_list, + VK_PIPELINE_BIND_POINT_GRAPHICS, + pipeline_layout, + 0, // set 0, because set 0 is reserved for push descriptors + 1, + &descriptor); } #endif // ! diff --git a/wisdom/include/wisdom/vulkan/impl/vk_descriptor_buffer.cpp b/wisdom/include/wisdom/vulkan/impl/vk_descriptor_buffer.cpp deleted file mode 100644 index 3145eb08..00000000 --- a/wisdom/include/wisdom/vulkan/impl/vk_descriptor_buffer.cpp +++ /dev/null @@ -1,129 +0,0 @@ -#ifndef WIS_VK_DESCRIPTOR_BUFFER_CPP -#define WIS_VK_DESCRIPTOR_BUFFER_CPP -#include - -uint64_t wis::ImplVKDescriptorBuffer::WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::VKSamplerView sampler) noexcept -{ - auto& device = allocator.header(); - VkDescriptorGetInfoEXT info{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, - .type = VK_DESCRIPTOR_TYPE_SAMPLER, - .data = { .pSampler = &std::get<0>(sampler) } - }; - - uint64_t desc_offset = aligned_table_offset + index * descriptor_size; - - device.table().vkGetDescriptorEXT(device.get(), &info, descriptor_size, data + desc_offset); - return desc_offset + descriptor_size; -} - -uint64_t wis::ImplVKDescriptorBuffer::WriteShaderResource2(uint64_t aligned_table_offset, uint32_t index, wis::VKShaderResourceView resource) noexcept -{ - auto& device = allocator.header(); - VkDescriptorImageInfo image_info{ - .sampler = nullptr, - .imageView = std::get<0>(resource), - .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL - }; - - VkDescriptorGetInfoEXT info{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, - .type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, - .data = { .pSampledImage = &image_info } - }; - - uint64_t desc_offset = aligned_table_offset + index * descriptor_size; - device.table().vkGetDescriptorEXT(device.get(), &info, properties.sampled_image_size, data + desc_offset); - return desc_offset + descriptor_size; -} - -uint64_t wis::ImplVKDescriptorBuffer::WriteShaderResource(uint64_t buffer_offset_before_table, uint32_t root_table_index, uint32_t binding, uint32_t array_member, wis::VKRootSignatureView2 root_signature, wis::VKShaderResourceView resource) noexcept -{ - auto& device = allocator.header(); - VkDescriptorImageInfo image_info{ - .sampler = nullptr, - .imageView = std::get<0>(resource), - .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL - }; - - VkDescriptorGetInfoEXT info{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, - .type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, - .data = { .pSampledImage = &image_info } - }; - - return WriteDescriptor(buffer_offset_before_table, root_table_index, binding, array_member, uint32_t(properties.sampled_image_size), info, root_signature); -} - -uint64_t wis::ImplVKDescriptorBuffer::WriteConstantBuffer(uint64_t buffer_offset_before_table, - uint32_t root_table_index, - uint32_t binding, - uint32_t array_member, - wis::VKRootSignatureView2 root_signature, - wis::VKBufferView buffer, - uint32_t buffer_size) noexcept -{ - auto& device = allocator.header(); - VkBufferDeviceAddressInfo address_info{ - .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, - .buffer = std::get<0>(buffer) - }; - - VkDescriptorAddressInfoEXT buffer_info{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT, - .address = device.table().vkGetBufferDeviceAddress(device.get(), &address_info), - .range = buffer_size - }; - - VkDescriptorGetInfoEXT info{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - .data = { .pUniformBuffer = &buffer_info } - }; - - return WriteDescriptor(buffer_offset_before_table, root_table_index, binding, array_member, uint32_t(properties.constant_buffer_size), info, root_signature); -} - -uint64_t wis::ImplVKDescriptorBuffer::WriteDescriptor(uint64_t buffer_offset_before_table, - uint32_t root_table_index, - uint32_t binding, - uint32_t array_member, - uint32_t descriptor_true_size, - const VkDescriptorGetInfoEXT& info, - wis::VKRootSignatureView2 root_signature) noexcept -{ - auto& device = allocator.header(); - auto& dtable = device.table(); - - auto* descriptor_layouts = std::get<0>(root_signature); - VkDeviceSize descriptor_offsetx = 0; - VkDeviceSize descriptor_sizex = std::max(descriptor_size, descriptor_true_size); - dtable.vkGetDescriptorSetLayoutBindingOffsetEXT(device.get(), descriptor_layouts[root_table_index], binding, &descriptor_offsetx); - dtable.vkGetDescriptorEXT(device.get(), &info, descriptor_true_size, data + buffer_offset_before_table + descriptor_offsetx + array_member * descriptor_sizex); - return buffer_offset_before_table + descriptor_offsetx + descriptor_sizex + array_member * descriptor_sizex; -} - -uint64_t wis::ImplVKDescriptorBuffer::WriteConstantBuffer2(uint64_t aligned_table_offset, uint32_t index, wis::VKBufferView buffer, uint32_t buffer_size) noexcept -{ - auto& device = allocator.header(); - VkBufferDeviceAddressInfo address_info{ - .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, - .buffer = std::get<0>(buffer) - }; - - VkDescriptorAddressInfoEXT buffer_info{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT, - .address = device.table().vkGetBufferDeviceAddress(device.get(), &address_info), - .range = buffer_size - }; - - VkDescriptorGetInfoEXT info{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - .data = { .pUniformBuffer = &buffer_info } - }; - uint64_t desc_offset = aligned_table_offset + index * descriptor_size; - device.table().vkGetDescriptorEXT(device.get(), &info, properties.constant_buffer_size, data + desc_offset); - return desc_offset + descriptor_size; -} -#endif // ! VK_DESCRIPTOR_BUFFER_CPP diff --git a/wisdom/include/wisdom/vulkan/impl/vk_device.cpp b/wisdom/include/wisdom/vulkan/impl/vk_device.cpp index 0bc2d938..e157f0de 100644 --- a/wisdom/include/wisdom/vulkan/impl/vk_device.cpp +++ b/wisdom/include/wisdom/vulkan/impl/vk_device.cpp @@ -304,6 +304,12 @@ wis::ImplVKCreateDevice(wis::VKAdapter in_adapter, wis::VKDeviceExtension** exts if (!vkdevice.ext1.Supported() && !force) return wis::make_result(VkResult::VK_ERROR_UNKNOWN); + // Create Default Allocator + auto [res1, allocator] = vkdevice.VKCreateAllocator(); + if (res1.status != wis::Status::Ok) + return res1; + vkdevice.allocator = std::move(allocator); + // Init the rest of the extensions for (auto*& ext : exts_span) { if (ext == nullptr) @@ -311,13 +317,10 @@ wis::ImplVKCreateDevice(wis::VKAdapter in_adapter, wis::VKDeviceExtension** exts ext->Init(vkdevice, struct_map, property_map); } - // Create Default Allocator - auto [res1, allocator] = vkdevice.VKCreateAllocator(); + res1 = vkdevice.InitDefaultLayout(); if (res1.status != wis::Status::Ok) return res1; - vkdevice.allocator = std::move(allocator); - return { wis::success, std::move(vkdevice) }; } @@ -395,57 +398,6 @@ wis::ImplVKDevice::CreateCommandQueue(wis::QueueType type) const noexcept return wis::VKCommandQueue{ device, VkQueue{ queue_handle } }; } -wis::ResultValue -wis::ImplVKDevice::CreateRootSignature(const RootConstant* constants, - uint32_t constants_size, - const wis::DescriptorTable* tables, - uint32_t tables_count) const noexcept -{ - wis::detail::limited_allocator vk_constants{ constants_size, true }; - - std::unique_ptr vk_dsl; - if (tables_count > 0) { - if (vk_dsl = wis::detail::make_unique_for_overwrite(tables_count); !vk_dsl) - return wis::make_result(VkResult::VK_ERROR_OUT_OF_HOST_MEMORY); - } - - for (uint32_t i = 0; i < constants_size; i++) { - auto& c = vk_constants.data()[i]; - auto& r = constants[i]; - c.stageFlags = convert_vk(r.stage); - c.offset = 0; - c.size = r.size_bytes; - } - - for (size_t i = 0; i < tables_count; i++) { - auto [res, h] = CreateDescriptorSetLayout(&tables[i]); - if (res.status != wis::Status::Ok) { - for (size_t j = 0; j < i; j++) - device.table().vkDestroyDescriptorSetLayout(device.get(), vk_dsl[j], nullptr); - - return res; - } - vk_dsl[i] = h; - } - - VkPipelineLayoutCreateInfo pipeline_layout_info{ - .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, - .pNext = nullptr, - .flags = 0, - .setLayoutCount = tables_count, - .pSetLayouts = vk_dsl.get(), - .pushConstantRangeCount = constants_size, - .pPushConstantRanges = vk_constants.data(), - }; - VkPipelineLayout layout; - auto vr = device.table().vkCreatePipelineLayout(device.get(), &pipeline_layout_info, nullptr, &layout); - - if (!succeeded(vr)) - return wis::make_result(vr); - - return VKRootSignature{ wis::managed_handle_ex{ layout, device, device.table().vkDestroyPipelineLayout }, std::move(vk_dsl), tables_count }; -} - namespace wis::detail { inline void VKFillShaderStage(wis::detail::uniform_allocator& shader_stages, @@ -574,7 +526,7 @@ wis::ImplVKDevice::CreateGraphicsPipeline(const wis::VKGraphicsPipelineDesc* des VkPipelineRenderingCreateInfo dynamic_rendering{ .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO, .pNext = nullptr, - .viewMask = 0, + .viewMask = ext1.GetFeatures().multiview ? desc->view_mask : 0, .colorAttachmentCount = rt_size, .pColorAttachmentFormats = rt_formats, .depthAttachmentFormat = convert_vk(desc->attachments.depth_attachment), @@ -732,8 +684,7 @@ wis::ImplVKDevice::CreateGraphicsPipeline(const wis::VKGraphicsPipelineDesc* des .pDynamicStates = dynamic_state_enables.data() }; - VkPipelineCreateFlags flags = - VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT; + VkPipelineCreateFlags flags = convert_vk(desc->flags); VkGraphicsPipelineCreateInfo info{ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, @@ -1100,7 +1051,7 @@ wis::ImplVKDevice::VKCreateSwapChain(wis::SharedSurface surface, if (rres.status != wis::Status::Ok) return rres; - rres = sci.AquireNextIndex(); + rres = sci.AcquireNextIndex(); if (rres.status != wis::Status::Ok) return rres; @@ -1195,58 +1146,13 @@ wis::ImplVKDevice::CreateRenderTarget(VKTextureView texture, wis::RenderTargetDe return VKRenderTarget{ wis::managed_handle_ex{ view, device, device.table().vkDestroyImageView }, std::get<2>(texture) }; } -wis::ResultValue -wis::ImplVKDevice::CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, wis::DescriptorMemory memory_type, uint64_t memory_bytes) const noexcept -{ - auto& ext1_i = ext1.GetInternal(); - uint32_t descriptor_size = heap_type == wis::DescriptorHeapType::Descriptor - ? ext1_i.features.mutable_descriptor ? ext1_i.descriptor_buffer_features.mutable_descriptor_size : 0u - : ext1_i.descriptor_buffer_features.sampler_size; - - VkBufferUsageFlags usage = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | - (heap_type == wis::DescriptorHeapType::Descriptor - ? VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT - : VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT); - - VkBufferCreateInfo info{ - .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, - .pNext = nullptr, - .flags = 0, - .size = memory_bytes, - .usage = usage, - .sharingMode = VK_SHARING_MODE_EXCLUSIVE, - .queueFamilyIndexCount = 0, - .pQueueFamilyIndices = nullptr, - }; - - VmaAllocationCreateInfo alloc_info{ - .flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT, - .usage = VMA_MEMORY_USAGE_AUTO, - .requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - .preferredFlags = 0, - }; - - VkBuffer buffer; - VmaAllocation allocation; - - auto result = vmaCreateBuffer(allocator.get(), &info, &alloc_info, &buffer, &allocation, nullptr); - if (!succeeded(result)) - return wis::make_result(result); - - return VKDescriptorBuffer{ allocator, buffer, allocation, heap_type, ext1_i.descriptor_buffer_features, uint32_t(descriptor_size) }; -} - bool wis::ImplVKDevice::QueryFeatureSupport(wis::DeviceFeature feature) const noexcept { auto& features = ext1.GetInternal().features; switch (feature) { - case wis::DeviceFeature::DescriptorBuffer: - return features.descriptor_buffer; case wis::DeviceFeature::WaitForPresent: return features.present_wait; - case wis::DeviceFeature::DescriptorEqualSize: - return features.mutable_descriptor; case wis::DeviceFeature::AdvancedIndexBuffer: return features.index_buffer_range; case wis::DeviceFeature::EnchancedBarriers: @@ -1255,6 +1161,8 @@ bool wis::ImplVKDevice::QueryFeatureSupport(wis::DeviceFeature feature) const no return features.dynamic_vsync; case wis::DeviceFeature::UnusedRenderTargets: return features.dynamic_render_unused_attachments; + case wis::DeviceFeature::PushDescriptors: + return features.push_descriptor; default: return false; } @@ -1262,153 +1170,6 @@ bool wis::ImplVKDevice::QueryFeatureSupport(wis::DeviceFeature feature) const no //-------------------------------------------------------------------------------------------------- -wis::ResultValue -wis::ImplVKDevice::CreateDummyDescriptorSetLayout(const VkDescriptorSetLayoutBinding& binding) const noexcept -{ - bool has_mutable = ext1.GetInternal().features.mutable_descriptor; - constexpr static VkDescriptorType cbvSrvUavTypes[] = { - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, - VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, - VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, - VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, - VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, - // VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR /* Need to check support if this is desired. */ - }; - - constexpr static VkMutableDescriptorTypeListVALVE bindings_mutable{ - .descriptorTypeCount = 1, - .pDescriptorTypes = cbvSrvUavTypes - }; - - constexpr static VkMutableDescriptorTypeCreateInfoEXT mutable_type_info{ - .sType = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT, - .pNext = nullptr, - .mutableDescriptorTypeListCount = 1, - .pMutableDescriptorTypeLists = &bindings_mutable, - }; - - VkDescriptorSetLayoutCreateInfo desc{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - .pNext = has_mutable && binding.descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER ? &mutable_type_info : nullptr, - .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT, - .bindingCount = 1, - .pBindings = &binding, - }; - - VkDescriptorSetLayout layout; - auto result = device.table().vkCreateDescriptorSetLayout(device.get(), &desc, nullptr, &layout); - - if (!succeeded(result)) - return wis::make_result(result); - - return layout; -} - -wis::ResultValue -wis::ImplVKDevice::CreateDescriptorSetDescriptorLayout(const wis::DescriptorTable* table) const noexcept -{ - bool has_mutable = ext1.GetInternal().features.mutable_descriptor; - constexpr static VkDescriptorType cbvSrvUavTypes[] = { - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, - VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, - VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, - VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, - VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, - // VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR /* Need to check support if this is desired. */ - }; - - constexpr static VkMutableDescriptorTypeListVALVE a{ - .descriptorTypeCount = sizeof(cbvSrvUavTypes) / sizeof(VkDescriptorType), - .pDescriptorTypes = cbvSrvUavTypes - }; - - wis::detail::limited_allocator bindings{ table->entry_count, true }; - wis::detail::limited_allocator binding_flags{ table->entry_count, true }; - wis::detail::limited_allocator bindings_mutable{ has_mutable ? table->entry_count : 0, true }; - - if (has_mutable) - for (size_t i = 0; i < table->entry_count; i++) - bindings_mutable.data()[i] = a; - - VkDescriptorSetLayoutBindingFlagsCreateInfoEXT binding_flags_info{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, - .pNext = nullptr, - .bindingCount = table->entry_count, - .pBindingFlags = binding_flags.data(), - }; - - for (size_t i = 0; i < table->entry_count; i++) { - auto& entry = table->entries[i]; - bindings.data()[i] = { - .binding = entry.binding, - .descriptorType = has_mutable ? VK_DESCRIPTOR_TYPE_MUTABLE_EXT : convert_vk(entry.type), - .descriptorCount = entry.count, - .stageFlags = uint32_t(convert_vk(table->stage)), - .pImmutableSamplers = nullptr, - }; - if (entry.count == UINT32_MAX) { - binding_flags.data()[i] = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT; - } - } - VkMutableDescriptorTypeCreateInfoEXT mutableTypeInfo{ - .sType = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT, - .pNext = &binding_flags_info, - .mutableDescriptorTypeListCount = table->entry_count, - .pMutableDescriptorTypeLists = bindings_mutable.data(), - }; - - VkDescriptorSetLayoutCreateInfo desc{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - .pNext = has_mutable ? (const void*)&mutableTypeInfo : (const void*)&binding_flags_info, - .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT, - .bindingCount = table->entry_count, - .pBindings = bindings.data(), - }; - - VkDescriptorSetLayout layout; - auto result = device.table().vkCreateDescriptorSetLayout(device.get(), &desc, nullptr, &layout); - - if (!succeeded(result)) - return wis::make_result(result); - - return layout; -} - -wis::ResultValue -wis::ImplVKDevice::CreateDescriptorSetSamplerLayout(const wis::DescriptorTable* table) const noexcept -{ - wis::detail::limited_allocator bindings{ table->entry_count, true }; - - for (size_t i = 0; i < table->entry_count; i++) { - auto& entry = table->entries[i]; - bindings.data()[i] = { - .binding = entry.binding, - .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, - .descriptorCount = entry.count, - .stageFlags = uint32_t(convert_vk(table->stage)), - .pImmutableSamplers = nullptr, - }; - } - - VkDescriptorSetLayoutCreateInfo desc{ - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - .pNext = nullptr, - .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT, - .bindingCount = table->entry_count, - .pBindings = bindings.data(), - }; - - VkDescriptorSetLayout layout; - auto result = device.table().vkCreateDescriptorSetLayout(device.get(), &desc, nullptr, &layout); - - if (!succeeded(result)) - return wis::make_result(result); - - return layout; -} - wis::ResultValue wis::ImplVKDevice::CreateSampler(const wis::SamplerDesc* desc) const noexcept { @@ -1524,4 +1285,146 @@ wis::ImplVKDevice::CreateShaderResource(wis::VKTextureView texture, wis::ShaderR return wis::VKShaderResource{ wis::managed_handle_ex{ view, device, device.table().vkDestroyImageView } }; } -#endif // WISIMPL_VULKAN + +wis::ResultValue +wis::ImplVKDevice::CreateDescriptorStorage(wis::DescriptorStorageDesc desc) const noexcept +{ + constexpr static uint32_t num_sets = Internal::max_sets; + // Get max descriptor counts + std::array desc_counts{ + desc.sampler_count, + desc.cbuffer_count, + desc.texture_count, + desc.stexture_count, + desc.sbuffer_count, + desc.rbuffer_count + }; + + uint32_t iterator = 0; + VkDescriptorPoolSize pool_sizes[num_sets]{}; + for (size_t i = 0; i < num_sets; i++) { + if (desc_counts[i] != 0) { + pool_sizes[iterator].type = DefaultLayout::desc_types[i]; + pool_sizes[iterator].descriptorCount = desc_counts[i]; + iterator++; + } + } + + VkDescriptorPoolCreateInfo pool_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .maxSets = num_sets, + .poolSizeCount = iterator, + .pPoolSizes = pool_sizes, + }; + wis::scoped_handle pool; + auto res = device.table().vkCreateDescriptorPool(device.get(), &pool_info, nullptr, pool.put(device.get(), device.table().vkDestroyDescriptorPool)); + + VkDescriptorSetVariableDescriptorCountAllocateInfo variable_desc_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO, + .pNext = nullptr, + .descriptorSetCount = num_sets, + .pDescriptorCounts = desc_counts.data(), + }; + + std::array desc_sets{}; + VkDescriptorSetAllocateInfo desc_alloc_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, + .pNext = &variable_desc_info, + .descriptorPool = pool.get(), + .descriptorSetCount = std::size(desc_sets), + .pSetLayouts = default_layout.desc_sets.data(), + }; + res = device.table().vkAllocateDescriptorSets(device.get(), &desc_alloc_info, desc_sets.data()); + if (!succeeded(res)) + return wis::make_result(res); + + return wis::VKDescriptorStorage{ device, pool.release(), std::move(desc_sets) }; +} + +wis::ResultValue +wis::ImplVKDevice::CreateRootSignature(const wis::PushConstant* constants, + uint32_t constants_size, + const PushDescriptor* push_descriptors, + uint32_t push_descriptors_size, + uint32_t space_overlap_count) const noexcept +{ + constexpr static uint32_t num_sets = uint32_t(wis::BindingIndex::Count); + if (constants_size > wis::max_push_constants) { + return wis::make_result(VkResult::VK_ERROR_UNKNOWN); + } + if (push_descriptors_size > wis::max_push_descriptors) { + return wis::make_result(VkResult::VK_ERROR_UNKNOWN); + } + if (space_overlap_count > wis::max_descriptor_space_overlap) { + return wis::make_result(VkResult::VK_ERROR_UNKNOWN); + } + + std::unique_ptr vk_dsl; + if (vk_dsl = wis::detail::make_unique_for_overwrite(num_sets + 1); !vk_dsl) + return wis::make_result(VkResult::VK_ERROR_OUT_OF_HOST_MEMORY); + + // Create push descriptor set layout + { + VkDescriptorSetLayoutBinding push_bindings[wis::max_push_descriptors]{}; + for (uint32_t i = 0; i < push_descriptors_size; i++) { + auto& r = push_descriptors[i]; + auto& b = push_bindings[i]; + b.binding = i; + b.descriptorType = convert_vk(r.type); + b.descriptorCount = 1; // Push descriptors are always single + b.stageFlags = convert_vk(r.stage); + } + VkDescriptorSetLayoutCreateInfo push_desc_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, + .bindingCount = push_descriptors_size, + .pBindings = push_bindings, + }; + auto res = device.table().vkCreateDescriptorSetLayout(device.get(), &push_desc_info, nullptr, &vk_dsl[0]); + if (!succeeded(res)) + return wis::make_result(res); + std::copy_n(default_layout.desc_sets.begin(), num_sets, vk_dsl.get() + 1); + } + + VkPushConstantRange push_constants[wis::max_push_constants]{}; + for (uint32_t i = 0; i < constants_size; i++) { + auto& c = push_constants[i]; + auto& r = constants[i]; + c.stageFlags = convert_vk(r.stage); + c.offset = 0; + c.size = r.size_bytes; + } + + VkPipelineLayoutCreateInfo pipeline_layout_info{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .setLayoutCount = num_sets + 1, + .pSetLayouts = vk_dsl.get(), + .pushConstantRangeCount = constants_size, + .pPushConstantRanges = push_constants, + }; + VkPipelineLayout layout; + auto vr = device.table().vkCreatePipelineLayout(device.get(), &pipeline_layout_info, nullptr, &layout); + + if (!succeeded(vr)) { + device.table().vkDestroyDescriptorSetLayout(device.get(), vk_dsl[0], nullptr); + return wis::make_result(vr); + } + + return VKRootSignature{ wis::managed_handle_ex{ layout, device, device.table().vkDestroyPipelineLayout }, std::move(vk_dsl), 1 }; +} + +wis::ResultValue +wis::ImplVKDevice::CreateRootSignature2(const wis::PushConstant* push_constants, + uint32_t constants_count, + const wis::PushDescriptor* push_descriptors, + uint32_t push_descriptors_count, + const wis::DescriptorSpacing* descriptor_spacing) const noexcept +{ + return CreateRootSignature(push_constants, constants_count, push_descriptors, push_descriptors_count, 1); +} +#endif diff --git a/wisdom/include/wisdom/vulkan/impl/vk_fence.cpp b/wisdom/include/wisdom/vulkan/impl/vk_fence.cpp index 08aeee36..3a9192c0 100644 --- a/wisdom/include/wisdom/vulkan/impl/vk_fence.cpp +++ b/wisdom/include/wisdom/vulkan/impl/vk_fence.cpp @@ -21,15 +21,17 @@ wis::Result wis::ImplVKFence::Signal(uint64_t value) const noexcept wis::Result wis::ImplVKFence::Wait(uint64_t value, uint64_t wait_ns) const noexcept // NOLINT { - if (GetCompletedValue() >= value) - return wis::success; - auto& device = fence.header().parent; - auto xfence = this->fence.get(); - VkSemaphoreWaitInfo waitInfo{ - VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, nullptr, 0, 1, &xfence, &value + auto xfence = fence.get(); + VkSemaphoreWaitInfo wait_info{ + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, + .pNext = nullptr, + .flags = 0, + .semaphoreCount = 1, + .pSemaphores = &xfence, + .pValues = &value }; - VkResult result = device.table().vkWaitSemaphores(device.get(), &waitInfo, wait_ns); + VkResult result = device.table().vkWaitSemaphores(device.get(), &wait_info, wait_ns); return succeeded(result) ? wis::success diff --git a/wisdom/include/wisdom/vulkan/impl/vk_swapchain.cpp b/wisdom/include/wisdom/vulkan/impl/vk_swapchain.cpp index 3528dcac..ebd0907b 100644 --- a/wisdom/include/wisdom/vulkan/impl/vk_swapchain.cpp +++ b/wisdom/include/wisdom/vulkan/impl/vk_swapchain.cpp @@ -10,13 +10,17 @@ wis::Result wis::detail::VKSwapChainCreateInfo::InitBackBuffers(VkExtent2D image_size) noexcept { auto& table = device.table(); - if (!fence) { + if (!fences[0]) { VkFenceCreateInfo fence_info{ .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, .pNext = nullptr, .flags = 0, }; - auto result = table.vkCreateFence(device.get(), &fence_info, nullptr, &fence); + auto result = table.vkCreateFence(device.get(), &fence_info, nullptr, &fences[0]); + if (!wis::succeeded(result)) + return { wis::make_result(result) }; + + result = table.vkCreateFence(device.get(), &fence_info, nullptr, &fences[1]); if (!wis::succeeded(result)) return { wis::make_result(result) }; } @@ -101,6 +105,8 @@ wis::Result wis::detail::VKSwapChainCreateInfo::InitBackBuffers(VkExtent2D image .signalSemaphoreCount = 0, .pSignalSemaphores = nullptr, }; + + auto& fence = fences[0]; table.vkQueueSubmit(present_queue, 1, &submit, fence); table.vkWaitForFences(device.get(), 1, &fence, VK_TRUE, std::numeric_limits::max()); table.vkResetFences(device.get(), 1, &fence); @@ -108,18 +114,17 @@ wis::Result wis::detail::VKSwapChainCreateInfo::InitBackBuffers(VkExtent2D image return wis::success; } -wis::Result wis::detail::VKSwapChainCreateInfo::AquireNextIndex() const noexcept +wis::Result wis::detail::VKSwapChainCreateInfo::AcquireNextIndex() const noexcept { auto& dtable = device.table(); auto result = dtable.vkAcquireNextImageKHR(device.get(), swapchain, std::numeric_limits::max(), image_ready_semaphores[acquire_index], nullptr, &present_index); if (!wis::succeeded(result)) return wis::make_result(result); - constexpr static VkPipelineStageFlags wait_stages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkSemaphoreSubmitInfo submit_info{ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, .semaphore = image_ready_semaphores[acquire_index], - .stageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .stageMask = VK_PIPELINE_STAGE_NONE, }; VkSubmitInfo2 desc2{ @@ -131,6 +136,34 @@ wis::Result wis::detail::VKSwapChainCreateInfo::AquireNextIndex() const noexcept result = dtable.vkQueueSubmit2(graphics_queue, 1, &desc2, nullptr); return wis::succeeded(result) ? wis::success : wis::make_result(result); } +wis::Result wis::detail::VKSwapChainCreateInfo::AcquireNextIndexAndWait() const noexcept +{ + auto& dtable = device.table(); + auto result = dtable.vkAcquireNextImageKHR(device.get(), swapchain, std::numeric_limits::max(), image_ready_semaphores[acquire_index], nullptr, &present_index); + if (!wis::succeeded(result)) + return wis::make_result(result); + + VkSemaphoreSubmitInfo submit_info{ + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, + .semaphore = image_ready_semaphores[acquire_index], + .stageMask = VK_PIPELINE_STAGE_NONE, + }; + + VkSubmitInfo2 desc2{ + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2, + .pNext = nullptr, + .waitSemaphoreInfoCount = 1, + .pWaitSemaphoreInfos = &submit_info, + }; + + auto& fence = fences[0]; + result = dtable.vkQueueSubmit2(graphics_queue, 1, &desc2, fence); + dtable.vkWaitForFences(device.get(), 1, &fence.handle, VK_TRUE, std::numeric_limits::max()); + dtable.vkResetFences(device.get(), 1, &fence.handle); + + return wis::succeeded(result) ? wis::success : wis::make_result(result); +} + wis::detail::VKSwapChainCreateInfo& wis::detail::VKSwapChainCreateInfo::operator=(VKSwapChainCreateInfo&& o) noexcept { if (this == &o) @@ -150,7 +183,7 @@ wis::detail::VKSwapChainCreateInfo& wis::detail::VKSwapChainCreateInfo::operator render_completed_semaphore = std::move(o.render_completed_semaphore); image_ready_semaphores = std::move(o.image_ready_semaphores); back_buffers = std::move(o.back_buffers); - fence = std::move(o.fence); + fences = std::move(o.fences); format = o.format; back_buffer_count = o.back_buffer_count; @@ -177,6 +210,9 @@ void wis::detail::VKSwapChainCreateInfo::Destroy() noexcept table.vkDestroySemaphore(hdevice, render_completed_semaphore[n], nullptr); table.vkDestroySemaphore(hdevice, image_ready_semaphores[n], nullptr); } + for (uint32_t n = 0; n < 2; n++) { + table.vkDestroyFence(hdevice, fences[n], nullptr); + } table.vkDestroyCommandPool(hdevice, command_pool, nullptr); table.vkDestroySwapchainKHR(hdevice, swapchain, nullptr); } @@ -212,16 +248,11 @@ wis::Result wis::detail::VKSwapChainCreateInfo::InitSemaphores() noexcept void wis::detail::VKSwapChainCreateInfo::ReleaseSemaphores() noexcept { auto& dtable = device.table(); - dtable.vkQueueSubmit(graphics_queue, 0, nullptr, fence); - dtable.vkWaitForFences(device.get(), 1, &fence, VK_TRUE, std::numeric_limits::max()); - dtable.vkResetFences(device.get(), 1, &fence); + dtable.vkQueueSubmit(present_queue, 0, nullptr, fences[0]); + dtable.vkQueueSubmit(graphics_queue, 0, nullptr, fences[1]); - dtable.vkQueueSubmit(present_queue, 0, nullptr, fence); - dtable.vkWaitForFences(device.get(), 1, &fence, VK_TRUE, std::numeric_limits::max()); - dtable.vkResetFences(device.get(), 1, &fence); - - dtable.vkDestroyFence(device.get(), fence, nullptr); - fence = nullptr; + dtable.vkWaitForFences(device.get(), 2, reinterpret_cast(fences.data()), VK_TRUE, std::numeric_limits::max()); + dtable.vkResetFences(device.get(), 2, reinterpret_cast(fences.data())); } wis::Result wis::ImplVKSwapChain::Resize(uint32_t width, uint32_t height) noexcept @@ -257,13 +288,7 @@ wis::ImplVKSwapChain::VKRecreateSwapchain(uint32_t width, uint32_t height, void* auto& dtable = device.table(); auto& itable = surface.header().parent.table(); - dtable.vkQueueSubmit(present_queue, 0, nullptr, fence); - dtable.vkWaitForFences(device.get(), 1, &fence, VK_TRUE, std::numeric_limits::max()); - dtable.vkResetFences(device.get(), 1, &fence); - - dtable.vkQueueSubmit(graphics_queue, 0, nullptr, fence); - dtable.vkWaitForFences(device.get(), 1, &fence, VK_TRUE, std::numeric_limits::max()); - dtable.vkResetFences(device.get(), 1, &fence); + ReleaseSemaphores(); VkSurfaceCapabilitiesKHR caps{}; itable.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(adapter, surface.get(), &caps); @@ -305,7 +330,7 @@ wis::ImplVKSwapChain::VKRecreateSwapchain(uint32_t width, uint32_t height, void* if (rres.status != wis::Status::Ok) return rres; - return AquireNextIndex(); + return AcquireNextIndexAndWait(); } wis::Result @@ -352,7 +377,7 @@ wis::ImplVKSwapChain::VKPresent(void* pNext) const noexcept } acquire_index = (acquire_index + 1) % back_buffer_count; - return AquireNextIndex(); + return AcquireNextIndex(); } #endif // VK_SWAPCHAIN_H diff --git a/wisdom/include/wisdom/vulkan/vk_command_list.h b/wisdom/include/wisdom/vulkan/vk_command_list.h index 89605db2..fab12dc3 100644 --- a/wisdom/include/wisdom/vulkan/vk_command_list.h +++ b/wisdom/include/wisdom/vulkan/vk_command_list.h @@ -125,11 +125,11 @@ class ImplVKCommandList : public QueryInternal uint32_t start_vertex = 0, uint32_t start_instance = 0) noexcept; - WIS_INLINE void SetRootConstants(const void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept; + WIS_INLINE void SetPushConstants(const void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept; - WIS_INLINE void SetDescriptorBuffers(const wis::VKDescriptorBufferView* buffers, uint32_t buffer_count) noexcept; + WIS_INLINE void PushDescriptor(wis::DescriptorType type, uint32_t binding, wis::VKBufferView view, uint32_t offset = 0) noexcept; - WIS_INLINE void SetDescriptorTableOffset(uint32_t root_table_index, wis::VKDescriptorBufferView buffer, uint32_t aligned_offset_bytes) noexcept; + WIS_INLINE void SetDescriptorStorage(VKDescriptorStorageView desc_storage) noexcept; protected: bool closed = false; @@ -175,7 +175,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void SetPipelineState(wis::VKPipelineView pipeline) noexcept { - return wis::ImplVKCommandList::SetPipelineState(std::move(pipeline)); + wis::ImplVKCommandList::SetPipelineState(std::move(pipeline)); } /** * @brief Copies data from one buffer to another. @@ -185,7 +185,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void CopyBuffer(wis::VKBufferView source, wis::VKBufferView destination, wis::BufferRegion region) noexcept { - return wis::ImplVKCommandList::CopyBuffer(std::move(source), std::move(destination), region); + wis::ImplVKCommandList::CopyBuffer(std::move(source), std::move(destination), region); } /** * @brief Copies data from buffer to texture. @@ -196,7 +196,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void CopyBufferToTexture(wis::VKBufferView source, wis::VKTextureView destination, const wis::BufferTextureCopyRegion* regions, uint32_t region_count) noexcept { - return wis::ImplVKCommandList::CopyBufferToTexture(std::move(source), std::move(destination), regions, region_count); + wis::ImplVKCommandList::CopyBufferToTexture(std::move(source), std::move(destination), regions, region_count); } /** * @brief Copies data from one texture to another. @@ -207,7 +207,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void CopyTextureToBuffer(wis::VKTextureView source, wis::VKBufferView destination, const wis::BufferTextureCopyRegion* regions, uint32_t region_count) noexcept { - return wis::ImplVKCommandList::CopyTextureToBuffer(std::move(source), std::move(destination), regions, region_count); + wis::ImplVKCommandList::CopyTextureToBuffer(std::move(source), std::move(destination), regions, region_count); } /** * @brief Sets the barrier on the buffer. @@ -216,7 +216,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void BufferBarrier(wis::BufferBarrier barrier, wis::VKBufferView buffer) noexcept { - return wis::ImplVKCommandList::BufferBarrier(barrier, std::move(buffer)); + wis::ImplVKCommandList::BufferBarrier(barrier, std::move(buffer)); } /** * @brief Sets the barriers on the buffers. You may set up to 8 buffer barriers for max efficiency. @@ -225,7 +225,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void BufferBarriers(const wis::VKBufferBarrier2* barriers, uint32_t barrier_count) noexcept { - return wis::ImplVKCommandList::BufferBarriers(barriers, barrier_count); + wis::ImplVKCommandList::BufferBarriers(barriers, barrier_count); } /** * @brief Sets the barrier on the texture. @@ -234,7 +234,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void TextureBarrier(wis::TextureBarrier barrier, wis::VKTextureView texture) noexcept { - return wis::ImplVKCommandList::TextureBarrier(barrier, std::move(texture)); + wis::ImplVKCommandList::TextureBarrier(barrier, std::move(texture)); } /** * @brief Sets the barriers on the textures. You may set up to 8 texture barriers for max efficiency. @@ -243,7 +243,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void TextureBarriers(const wis::VKTextureBarrier2* barriers, uint32_t barrier_count) noexcept { - return wis::ImplVKCommandList::TextureBarriers(barriers, barrier_count); + wis::ImplVKCommandList::TextureBarriers(barriers, barrier_count); } /** * @brief Begins the render pass. @@ -251,14 +251,14 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void BeginRenderPass(const wis::VKRenderPassDesc* pass_desc) noexcept { - return wis::ImplVKCommandList::BeginRenderPass(pass_desc); + wis::ImplVKCommandList::BeginRenderPass(pass_desc); } /** * @brief Ends the render pass. * */ inline void EndRenderPass() noexcept { - return wis::ImplVKCommandList::EndRenderPass(); + wis::ImplVKCommandList::EndRenderPass(); } /** * @brief Sets the pipeline signature object. Used to determine how to pick descriptors from descriptor buffer. @@ -266,7 +266,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void SetRootSignature(wis::VKRootSignatureView root_signature) noexcept { - return wis::ImplVKCommandList::SetRootSignature(std::move(root_signature)); + wis::ImplVKCommandList::SetRootSignature(std::move(root_signature)); } /** * @brief Sets the primitive topology. Detemines how vertices shall be processed. @@ -274,7 +274,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void IASetPrimitiveTopology(wis::PrimitiveTopology topology) noexcept { - return wis::ImplVKCommandList::IASetPrimitiveTopology(topology); + wis::ImplVKCommandList::IASetPrimitiveTopology(topology); } /** * @brief Sets the vertex buffers. @@ -284,7 +284,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void IASetVertexBuffers(const wis::VKVertexBufferBinding* resources, uint32_t count, uint32_t start_slot = 0) noexcept { - return wis::ImplVKCommandList::IASetVertexBuffers(resources, count, start_slot); + wis::ImplVKCommandList::IASetVertexBuffers(resources, count, start_slot); } /** * @brief Sets the index buffer. @@ -294,7 +294,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void IASetIndexBuffer(wis::VKBufferView buffer, wis::IndexType type, uint64_t offset) noexcept { - return wis::ImplVKCommandList::IASetIndexBuffer(std::move(buffer), type, offset); + wis::ImplVKCommandList::IASetIndexBuffer(std::move(buffer), type, offset); } /** * @brief Sets the index buffer. @@ -307,7 +307,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void IASetIndexBuffer2(wis::VKBufferView buffer, wis::IndexType type, uint32_t size, uint64_t offset) noexcept { - return wis::ImplVKCommandList::IASetIndexBuffer2(std::move(buffer), type, size, offset); + wis::ImplVKCommandList::IASetIndexBuffer2(std::move(buffer), type, size, offset); } /** * @brief Sets the viewport. @@ -315,7 +315,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void RSSetViewport(wis::Viewport viewport) noexcept { - return wis::ImplVKCommandList::RSSetViewport(viewport); + wis::ImplVKCommandList::RSSetViewport(viewport); } /** * @brief Sets multiple viewports. @@ -324,7 +324,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void RSSetViewports(const wis::Viewport* viewports, uint32_t count) noexcept { - return wis::ImplVKCommandList::RSSetViewports(viewports, count); + wis::ImplVKCommandList::RSSetViewports(viewports, count); } /** * @brief Sets the scissor rect. @@ -332,7 +332,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void RSSetScissor(wis::Scissor scissor) noexcept { - return wis::ImplVKCommandList::RSSetScissor(scissor); + wis::ImplVKCommandList::RSSetScissor(scissor); } /** * @brief Sets multiple scissor rects. @@ -343,7 +343,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void RSSetScissors(const wis::Scissor* scissors, uint32_t count) noexcept { - return wis::ImplVKCommandList::RSSetScissors(scissors, count); + wis::ImplVKCommandList::RSSetScissors(scissors, count); } /** * @brief Draws indexed instanced geometry. @@ -355,7 +355,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void DrawIndexedInstanced(uint32_t vertex_count_per_instance, uint32_t instance_count = 1, uint32_t start_index = 0, uint32_t base_vertex = 0, uint32_t start_instance = 0) noexcept { - return wis::ImplVKCommandList::DrawIndexedInstanced(vertex_count_per_instance, instance_count, start_index, base_vertex, start_instance); + wis::ImplVKCommandList::DrawIndexedInstanced(vertex_count_per_instance, instance_count, start_index, base_vertex, start_instance); } /** * @brief Draws instanced geometry. (Without indexing) @@ -366,7 +366,7 @@ class VKCommandList : public wis::ImplVKCommandList * */ inline void DrawInstanced(uint32_t vertex_count_per_instance, uint32_t instance_count = 1, uint32_t start_vertex = 0, uint32_t start_instance = 0) noexcept { - return wis::ImplVKCommandList::DrawInstanced(vertex_count_per_instance, instance_count, start_vertex, start_instance); + wis::ImplVKCommandList::DrawInstanced(vertex_count_per_instance, instance_count, start_vertex, start_instance); } /** * @brief Sets the root constants for the shader. @@ -375,30 +375,22 @@ class VKCommandList : public wis::ImplVKCommandList * @param offset_4bytes The offset in the data in 4-byte units. * @param stage The shader stages to set the root constants for. * */ - inline void SetRootConstants(void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept + inline void SetPushConstants(void* data, uint32_t size_4bytes, uint32_t offset_4bytes, wis::ShaderStages stage) noexcept { - return wis::ImplVKCommandList::SetRootConstants(data, size_4bytes, offset_4bytes, stage); + wis::ImplVKCommandList::SetPushConstants(data, size_4bytes, offset_4bytes, stage); } /** - * @brief Sets the root descriptor tables for the shader. - * Operation will perform flush in some cases, so it's not recommended to rebind descriptor buffers too often. - * @param buffers The descriptor buffers to set the root descriptor tables with. - * May only be one of each type (one Descriptor and one Sampler buffer) - * @param buffer_count The number of descriptor buffers to set. May be 1 or 2. + * @brief Pushes descriptor directly to the command list, without putting it to the table. + * Works only with buffer bindings. + * Buffer is always bound with full size. + * @param type The type of the descriptor to set. + * @param root_index The index of the root descriptor to set. + * @param buffer The buffer to set. + * @param offset The offset in the descriptor table to set the descriptor to. * */ - inline void SetDescriptorBuffers(const wis::VKDescriptorBufferView* buffers, uint32_t buffer_count) noexcept + inline void PushDescriptor(wis::DescriptorType type, uint32_t root_index, wis::VKBufferView buffer, uint32_t offset) noexcept { - return wis::ImplVKCommandList::SetDescriptorBuffers(buffers, buffer_count); - } - /** - * @brief Sets the offset in the descriptor table for the descriptor buffer. - * @param root_table_index The index of the root table to set the offset for. - * @param buffer The descriptor buffer to set the offset for. - * @param offset_bytes The offset in the descriptor buffer in bytes. - * */ - inline void SetDescriptorTableOffset(uint32_t root_table_index, wis::VKDescriptorBufferGPUView buffer, uint32_t offset_bytes) noexcept - { - return wis::ImplVKCommandList::SetDescriptorTableOffset(root_table_index, std::move(buffer), offset_bytes); + wis::ImplVKCommandList::PushDescriptor(type, root_index, std::move(buffer), offset); } }; #pragma endregion VKCommandList diff --git a/wisdom/include/wisdom/vulkan/vk_command_queue.h b/wisdom/include/wisdom/vulkan/vk_command_queue.h index 96bf9af1..ab5ac26d 100644 --- a/wisdom/include/wisdom/vulkan/vk_command_queue.h +++ b/wisdom/include/wisdom/vulkan/vk_command_queue.h @@ -70,7 +70,7 @@ class VKCommandQueue : public wis::ImplVKCommandQueue * */ inline void ExecuteCommandLists(const wis::VKCommandListView* lists, uint32_t count) const noexcept { - return wis::ImplVKCommandQueue::ExecuteCommandLists(lists, count); + wis::ImplVKCommandQueue::ExecuteCommandLists(lists, count); } /** * @brief Enqueue the signal to the queue, that gets executed after all the work has been done. diff --git a/wisdom/include/wisdom/vulkan/vk_descriptor_buffer.h b/wisdom/include/wisdom/vulkan/vk_descriptor_buffer.h deleted file mode 100644 index abf06254..00000000 --- a/wisdom/include/wisdom/vulkan/vk_descriptor_buffer.h +++ /dev/null @@ -1,214 +0,0 @@ -#ifndef WIS_VK_DESCRIPTOR_BUFFER_H -#define WIS_VK_DESCRIPTOR_BUFFER_H -#include -#include - -namespace wis { -class VKDescriptorBuffer; - -template<> -struct Internal { - wis::shared_handle allocator; - h::VmaAllocation allocation; - h::VkBuffer buffer; - VkDeviceAddress address = 0; - uint8_t* data = nullptr; - XDescriptorBufferProperties properties; - - wis::DescriptorHeapType type = wis::DescriptorHeapType::Descriptor; - uint32_t descriptor_size = 0; - - Internal() noexcept = default; - Internal(wis::shared_handle allocator, VkBuffer buffer, VmaAllocation allocation, wis::DescriptorHeapType type, XDescriptorBufferProperties& properties, uint32_t descriptor_size) noexcept - : allocator(std::move(allocator)), allocation(allocation), buffer(buffer), type(type), properties(properties), descriptor_size(descriptor_size) - { - if (buffer) { - auto& device = this->allocator.header(); - VkBufferDeviceAddressInfo info{ - .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, - .buffer = buffer - }; - address = device.table().vkGetBufferDeviceAddress(device.get(), &info); - - vmaMapMemory(this->allocator.get(), allocation, reinterpret_cast(&data)); - } - } - Internal(Internal&&) noexcept = default; - Internal& operator=(Internal&& o) noexcept - { - if (this == &o) { - return *this; - } - Destroy(); - allocator = std::move(o.allocator); - allocation = std::move(o.allocation); - buffer = std::move(o.buffer); - address = std::move(o.address); - data = std::move(o.data); - properties = std::move(o.properties); - type = std::move(o.type); - descriptor_size = std::move(o.descriptor_size); - return *this; - } - ~Internal() noexcept - { - Destroy(); - } - - void Destroy() noexcept - { - if (buffer && allocation) { - vmaUnmapMemory(allocator.get(), allocation); - vmaDestroyBuffer(allocator.get(), buffer, allocation); - } - } - -public: - auto& GetDevice() const noexcept - { - return allocator.header(); - } -}; - -class ImplVKDescriptorBuffer : public QueryInternal -{ -public: - ImplVKDescriptorBuffer() noexcept = default; - explicit ImplVKDescriptorBuffer(wis::shared_handle allocator, - VkBuffer buffer, - VmaAllocation allocation, - wis::DescriptorHeapType type, - XDescriptorBufferProperties properties, - uint32_t descriptor_size) noexcept - : QueryInternal(std::move(allocator), buffer, allocation, type, properties, descriptor_size) { } - operator bool() const noexcept - { - return bool(buffer); - } - operator VKDescriptorBufferView() const noexcept - { - return { address, type, descriptor_size }; - } - -public: - WIS_INLINE uint64_t WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::VKSamplerView sampler) noexcept; - WIS_INLINE uint64_t WriteShaderResource2(uint64_t aligned_table_offset, uint32_t index, wis::VKShaderResourceView resource) noexcept; - WIS_INLINE uint64_t WriteConstantBuffer2(uint64_t aligned_table_offset, uint32_t index, wis::VKBufferView buffer, uint32_t buffer_size) noexcept; - - // Returns the offset for the next set - WIS_INLINE uint64_t WriteShaderResource(uint64_t buffer_offset_before_table, - uint32_t root_table_index, - uint32_t binding, - uint32_t array_member, - wis::VKRootSignatureView2 root_signature, - wis::VKShaderResourceView resource) noexcept; - - WIS_INLINE uint64_t WriteConstantBuffer(uint64_t buffer_offset_before_table, - uint32_t root_table_index, - uint32_t binding, - uint32_t array_member, - wis::VKRootSignatureView2 root_signature, - wis::VKBufferView buffer, - uint32_t buffer_size) noexcept; - -protected: - WIS_INLINE uint64_t WriteDescriptor(uint64_t buffer_offset_before_table, - uint32_t root_table_index, - uint32_t binding, - uint32_t array_member, - uint32_t descriptor_true_size, - const VkDescriptorGetInfoEXT& info, - wis::VKRootSignatureView2 root_signature) noexcept; -}; - -#pragma region VKDescriptorBuffer -/** - * @brief Represents descriptor buffer for binding descriptors. - * */ -class VKDescriptorBuffer : public wis::ImplVKDescriptorBuffer -{ -public: - using wis::ImplVKDescriptorBuffer::ImplVKDescriptorBuffer; - -public: - /** - * @brief Writes the sampler to the sampler descriptor buffer. - * Must be called with Sampler descriptor buffer, which was created with wis::DescriptorHeapType::Sampler. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::VKDevice. - * @param index Binding index in descriptor table. - * @param sampler The sampler to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteSampler(uint64_t aligned_table_offset, uint32_t index, wis::VKSamplerView sampler) noexcept - { - return wis::ImplVKDescriptorBuffer::WriteSampler(aligned_table_offset, index, std::move(sampler)); - } - /** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * Must be called with Shader Resource descriptor buffer, which was created with wis::DescriptorHeapType::Descriptor. - * Requires wis::DeviceFeature::DescriptorEqualSize to run, otherwise program is ill-formed. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::VKDevice. - * @param index Binding index in descriptor table. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteShaderResource2(uint64_t aligned_table_offset, uint32_t index, wis::VKShaderResourceView resource) noexcept - { - return wis::ImplVKDescriptorBuffer::WriteShaderResource2(aligned_table_offset, index, std::move(resource)); - } - /** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * Must be called with Constant Buffer descriptor buffer, which was created with wis::DescriptorHeapType::Descriptor. - * Requires wis::DeviceFeature::DescriptorEqualSize to run, otherwise program is ill-formed. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::VKDevice. - * @param index Binding index in descriptor table. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteConstantBuffer2(uint64_t aligned_table_offset, uint32_t index, wis::VKBufferView buffer, uint32_t buffer_size) noexcept - { - return wis::ImplVKDescriptorBuffer::WriteConstantBuffer2(aligned_table_offset, index, std::move(buffer), buffer_size); - } - /** - * @brief Writes the shader resource to the shader resource descriptor buffer. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::VKDevice. - * @param root_table_index Index of the descriptor table in wis::VKRootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param resource The shader resource to write. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteShaderResource(uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, wis::VKRootSignatureView2 root_signature, wis::VKShaderResourceView resource) noexcept - { - return wis::ImplVKDescriptorBuffer::WriteShaderResource(aligned_table_offset, root_table_index, binding, array_member, std::move(root_signature), std::move(resource)); - } - /** - * @brief Writes the constant buffer to the constant buffer descriptor buffer. - * @param aligned_table_offset Byte offset from the buffer beginning in table alignment sizes. - * Alignment may be queried with wis::VKDevice. - * @param root_table_index Index of the descriptor table in wis::VKRootSignature - * @param binding Binding index in descriptor table. - * @param array_member Array member index in the binding. - * @param root_signature The root signature to get the binding position from. - * @param buffer The buffer to write. - * @param buffer_size The size of the buffer in bytes. - * @return Byte offset from buffer beginning. May help determine next table address. - * */ - inline uint64_t WriteConstantBuffer(uint64_t aligned_table_offset, uint32_t root_table_index, uint32_t binding, uint32_t array_member, wis::VKRootSignatureView2 root_signature, wis::VKBufferView buffer, uint32_t buffer_size) noexcept - { - return wis::ImplVKDescriptorBuffer::WriteConstantBuffer(aligned_table_offset, root_table_index, binding, array_member, std::move(root_signature), std::move(buffer), buffer_size); - } -}; -#pragma endregion VKDescriptorBuffer - -} // namespace wis -#ifndef WISDOM_BUILD_BINARIES -#include "impl/vk_descriptor_buffer.cpp" -#endif // !WISDOM_HEADER_ONLY -#endif // !VK_DESCRIPTOR_BUFFER_H diff --git a/wisdom/include/wisdom/vulkan/vk_descriptor_storage.h b/wisdom/include/wisdom/vulkan/vk_descriptor_storage.h new file mode 100644 index 00000000..fdf42cb0 --- /dev/null +++ b/wisdom/include/wisdom/vulkan/vk_descriptor_storage.h @@ -0,0 +1,172 @@ +#ifndef WIS_VK_DESCRIPTOR_STORAGE_H +#define WIS_VK_DESCRIPTOR_STORAGE_H + +#include +#include + +namespace wis { +class VKDescriptorStorage; + +template<> +struct Internal { + // sampler, Uniform buffer, storage RW buffer, sampled image, storage RW image, maybe storage read buffer will be needed. + constexpr static uint32_t max_sets = uint32_t(wis::BindingIndex::Count); + + wis::SharedDevice device; + h::VkDescriptorPool pool; + std::array set{}; // Big Descriptor set with only unbounded arrays + +public: + Internal() noexcept = default; + Internal(wis::SharedDevice device, VkDescriptorPool pool, std::array set) noexcept + : device(std::move(device)), pool(pool), set(std::move(set)) { } + Internal(Internal&&) noexcept = default; + Internal& operator=(Internal&& o) noexcept + { + if (this == &o) { + return *this; + } + Destroy(); + device = std::move(o.device); + pool = std::move(o.pool); + set = std::move(o.set); + return *this; + } + ~Internal() noexcept + { + Destroy(); + } + +public: + void Destroy() noexcept + { + if (pool) { + device.table().vkDestroyDescriptorPool(device.get(), pool, nullptr); + } + } +}; + +class ImplVKDescriptorStorage : public QueryInternal +{ +public: + ImplVKDescriptorStorage() noexcept = default; + explicit ImplVKDescriptorStorage(wis::SharedDevice device, VkDescriptorPool pool, std::array set) noexcept + : QueryInternal(std::move(device), pool, std::move(set)) { } + + operator bool() const noexcept + { + return bool(pool); + } + + operator VKDescriptorStorageView() const noexcept + { + std::span span{ + set + }; + return VKDescriptorStorageView{ span }; + } + +public: + void WriteSampler(uint32_t index, wis::VKSamplerView sampler) noexcept + { + VkDescriptorImageInfo info{ + .sampler = std::get<0>(sampler), + .imageView = VK_NULL_HANDLE, + .imageLayout = VK_IMAGE_LAYOUT_UNDEFINED + }; + VkWriteDescriptorSet write{ + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = set[uint32_t(wis::BindingIndex::Sampler) - 1], + .dstBinding = 0, + .dstArrayElement = index, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, + .pImageInfo = &info + }; + device.table().vkUpdateDescriptorSets(device.get(), 1, &write, 0, nullptr); + } + void WriteConstantBuffer(uint32_t index, wis::VKBufferView buffer, uint32_t size, uint32_t offset = 0) noexcept + { + VkDescriptorBufferInfo info{ + .buffer = std::get<0>(buffer), + .offset = offset, + .range = size + }; + VkWriteDescriptorSet write{ + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = set[uint32_t(wis::BindingIndex::ConstantBuffer) - 1], + .dstBinding = 0, + .dstArrayElement = index, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .pBufferInfo = &info + }; + device.table().vkUpdateDescriptorSets(device.get(), 1, &write, 0, nullptr); + } + void WriteTexture(uint32_t index, wis::VKShaderResourceView srv) noexcept + { + VkDescriptorImageInfo info{ + .sampler = VK_NULL_HANDLE, + .imageView = std::get<0>(srv), + .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL + }; + VkWriteDescriptorSet write{ + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = set[uint32_t(wis::BindingIndex::Texture) - 1], + .dstBinding = 0, + .dstArrayElement = index, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .pImageInfo = &info + }; + device.table().vkUpdateDescriptorSets(device.get(), 1, &write, 0, nullptr); + } +}; + +#pragma region VKDescriptorStorage +/** + * @brief Represents descriptor storage object for storing descriptors. + * Used for bindless and non-uniform bindings. Don't combine with Descriptor buffers, this may reduce performance. + * */ +class VKDescriptorStorage : public wis::ImplVKDescriptorStorage +{ +public: + using wis::ImplVKDescriptorStorage::ImplVKDescriptorStorage; + +public: + /** + * @brief Writes the sampler to the sampler descriptor storage. + * @param index Index in array of samplers to fill. + * @param sampler The sampler to write. + * */ + inline void WriteSampler(uint32_t index, wis::VKSamplerView sampler) noexcept + { + wis::ImplVKDescriptorStorage::WriteSampler(index, std::move(sampler)); + } + /** + * @brief Writes the constant buffer to the constant buffer descriptor storage. + * @param index Index in array of constant buffers to fill. + * @param buffer The buffer to write. + * @param size The size of the constant buffer in bytes. + * @param offset The offset in the buffer to write the constant buffer to. + * size + offset must be less or equal the overall size of the bound buffer. + * */ + inline void WriteConstantBuffer(uint32_t index, wis::VKBufferView buffer, uint32_t size, uint32_t offset = 0) noexcept + { + wis::ImplVKDescriptorStorage::WriteConstantBuffer(index, std::move(buffer), size, offset); + } + /** + * @brief Writes the texture to the shader resource descriptor storage. + * @param index Index in array of shader resources to fill. + * @param resource The shader resource to write. + * */ + inline void WriteTexture(uint32_t index, wis::VKShaderResourceView resource) noexcept + { + wis::ImplVKDescriptorStorage::WriteTexture(index, std::move(resource)); + } +}; +#pragma endregion VKDescriptorStorage + +} // namespace wis + +#endif // !WIS_VK_DESCRIPTOR_STORAGE_H diff --git a/wisdom/include/wisdom/vulkan/vk_device.h b/wisdom/include/wisdom/vulkan/vk_device.h index 59493ec4..9b386267 100644 --- a/wisdom/include/wisdom/vulkan/vk_device.h +++ b/wisdom/include/wisdom/vulkan/vk_device.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -26,6 +26,124 @@ struct Internal { wis::shared_handle allocator; detail::QueueResidency queues; + struct DefaultLayout { + constexpr static std::array::max_sets> desc_types{ + VK_DESCRIPTOR_TYPE_SAMPLER, + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + }; + + std::array::max_sets> desc_sets{}; + + public: + bool operator==(const DefaultLayout& o) const noexcept + { + return std::memcmp(desc_sets.data(), o.desc_sets.data(), sizeof(desc_sets)) == 0; + } + bool Valid() const noexcept + { + return *this != DefaultLayout{}; + } + void Destroy(PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout, VkDevice device) noexcept + { + if (Valid()) { + for (auto& set : desc_sets) { + vkDestroyDescriptorSetLayout(device, set, nullptr); + } + } + } + wis::Result Init(PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout, VkDevice device) + { + constexpr static size_t num_sets = Internal::max_sets; + constexpr static VkDescriptorSetLayoutBinding bindings[num_sets]{ + { .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER, + .descriptorCount = 2048, + .stageFlags = VK_SHADER_STAGE_ALL }, + { .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .descriptorCount = 4096, + .stageFlags = VK_SHADER_STAGE_ALL }, + { .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + .descriptorCount = 4096, + .stageFlags = VK_SHADER_STAGE_ALL }, + { .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .descriptorCount = 4096, + .stageFlags = VK_SHADER_STAGE_ALL }, + { .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .descriptorCount = 4096, + .stageFlags = VK_SHADER_STAGE_ALL }, + { .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .descriptorCount = 4096, + .stageFlags = VK_SHADER_STAGE_ALL }, + }; + + constexpr static VkDescriptorBindingFlags flags = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT; + constexpr static VkDescriptorSetLayoutBindingFlagsCreateInfoEXT binding_flags_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, + .pNext = nullptr, + .bindingCount = 1, + .pBindingFlags = &flags, + }; + + std::array desc_info{}; + for (size_t i = 0; i < num_sets; i++) { + desc_info[i] = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .pNext = &binding_flags_info, + .flags = 0, + .bindingCount = 1, + .pBindings = &bindings[i], + }; + } + for (size_t i = 0; i < num_sets; i++) { + auto res = vkCreateDescriptorSetLayout(device, &desc_info[i], nullptr, &desc_sets[i]); + if (!succeeded(res)) + return wis::make_result(res); + } + return wis::success; + } + } default_layout; + +public: + Internal() noexcept = default; + Internal(wis::VKAdapter adapter, wis::SharedDevice device, wis::VKDeviceExtensionEmbedded1 ext1) noexcept + : adapter(std::move(adapter)), device(std::move(device)), ext1(std::move(ext1)) + { + } + Internal(Internal&&) noexcept = default; + Internal& operator=(Internal&& o) noexcept + { + if (this == &o) { + return *this; + } + if (device.get()) { + default_layout.Destroy(device.table().vkDestroyDescriptorSetLayout, device.get()); + } + + adapter = std::move(o.adapter); + device = std::move(o.device); + ext1 = std::move(o.ext1); + allocator = std::move(o.allocator); + queues = std::move(o.queues); + std::memcpy(&default_layout, &o.default_layout, sizeof(default_layout)); + std::memset(&o.default_layout, 0, sizeof(default_layout)); + return *this; + } + ~Internal() noexcept + { + if (device.get()) { + default_layout.Destroy(device.table().vkDestroyDescriptorSetLayout, device.get()); + } + } + public: auto& GetInstanceTable() const noexcept { @@ -46,6 +164,11 @@ struct Internal { { return device.GetDeviceProcAddr(name); } + + wis::Result InitDefaultLayout() noexcept + { + return default_layout.Init(device.table().vkCreateDescriptorSetLayout, device.get()); + } }; class ImplVKDevice : public QueryInternal @@ -88,12 +211,6 @@ class ImplVKDevice : public QueryInternal [[nodiscard]] WIS_INLINE wis::ResultValue CreateGraphicsPipeline(const wis::VKGraphicsPipelineDesc* desc) const noexcept; - [[nodiscard]] WIS_INLINE wis::ResultValue - CreateRootSignature(const RootConstant* constants = nullptr, - uint32_t constants_size = 0, - const wis::DescriptorTable* tables = nullptr, - uint32_t tables_count = 0) const noexcept; - [[nodiscard]] WIS_INLINE wis::ResultValue CreateShader(void* bytecode, uint32_t size) const noexcept; @@ -115,52 +232,33 @@ class ImplVKDevice : public QueryInternal [[nodiscard]] WIS_INLINE wis::ResultValue CreateShaderResource(VKTextureView texture, wis::ShaderResourceDesc desc) const noexcept; - // Descriptor Buffer - [[nodiscard]] uint32_t - GetDescriptorTableAlignment([[maybe_unused]] wis::DescriptorHeapType heap) const noexcept - { - return ext1.GetInternal().descriptor_buffer_features.offset_alignment; - } + [[nodiscard]] WIS_INLINE bool + QueryFeatureSupport(wis::DeviceFeature feature) const noexcept; - [[nodiscard]] uint32_t - GetDescriptorBufferUnitSize(wis::DescriptorHeapType heap) const noexcept - { - auto& heap_features = ext1.GetInternal().descriptor_buffer_features; - return heap == wis::DescriptorHeapType::Descriptor - ? heap_features.mutable_descriptor_size - : heap_features.sampler_size; - } + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateDescriptorStorage(wis::DescriptorStorageDesc desc) const noexcept; - [[nodiscard]] WIS_INLINE wis::ResultValue - CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, wis::DescriptorMemory memory_type, uint64_t memory_bytes) const noexcept; + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateRootSignature(const PushConstant* constants = nullptr, + uint32_t constants_size = 0, + const PushDescriptor* push_descriptors = nullptr, + uint32_t push_descriptors_size = 0, + [[maybe_unused]] uint32_t space_overlap_count = 1) const noexcept; - [[nodiscard]] WIS_INLINE bool - QueryFeatureSupport(wis::DeviceFeature feature) const noexcept; + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateRootSignature2(const wis::PushConstant* push_constants = nullptr, + uint32_t constants_count = 0, + const wis::PushDescriptor* push_descriptors = nullptr, + uint32_t push_descriptors_count = 0, + const wis::DescriptorSpacing* descriptor_spacing = nullptr) const noexcept; public: [[nodiscard]] WIS_INLINE wis::ResultValue VKCreateSwapChain(wis::SharedSurface surface, const SwapchainDesc* desc, VkQueue graphics_queue, void* pNext = nullptr) const noexcept; -private: +protected: [[nodiscard]] WIS_INLINE wis::ResultValue> VKCreateAllocator(bool interop = false) const noexcept; - - [[nodiscard]] wis::ResultValue - CreateDescriptorSetLayout(const wis::DescriptorTable* table) const noexcept - { - return table->type == wis::DescriptorHeapType::Descriptor - ? CreateDescriptorSetDescriptorLayout(table) - : CreateDescriptorSetSamplerLayout(table); - } - - [[nodiscard]] WIS_INLINE wis::ResultValue - CreateDummyDescriptorSetLayout(const VkDescriptorSetLayoutBinding& binding) const noexcept; - - [[nodiscard]] WIS_INLINE wis::ResultValue - CreateDescriptorSetDescriptorLayout(const wis::DescriptorTable* table) const noexcept; - - [[nodiscard]] WIS_INLINE wis::ResultValue - CreateDescriptorSetSamplerLayout(const wis::DescriptorTable* table) const noexcept; }; #pragma region VKDevice @@ -230,16 +328,39 @@ class VKDevice : public wis::ImplVKDevice return wis::ImplVKDevice::CreateGraphicsPipeline(desc); } /** - * @brief Creates a root signature object. - * @param root_constants The root constants to create the root signature with. - * @param constants_size The number of root constants. - * @param tables The descriptor tables to create the root signature with. - * @param tables_count The number of descriptor tables. + * @brief Creates a root signature object for use with DescriptorStorage. + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. push_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param descriptors_count The number of push descriptors. Max is 8. + * @param space_overlap_count Count of descriptor spaces to overlap for each of the DescriptorStorage types. + * Default is 1. Max is 16. This is used primarily for descriptor type aliasing. + * Example: If wis::VKDevice is 2, that means that 2 descriptor spaces will be allocated for each descriptor type. + * [[vk::binding(0,0)]] SamplerState samplers: register(s0,space1); // space1 can be used for different type of samplers e.g. SamplerComparisonState + * [[vk::binding(0,0)]] SamplerComparisonState shadow_samplers: register(s0,space2); // they use the same binding (works like overloading) + * [[vk::binding(0,1)]] ConstantBuffer cbuffers: register(b0,space3); // this type also has 2 spaces, next will be on space 4 etc. + * @return wis::VKRootSignature on success (wis::Status::Ok). + * */ + [[nodiscard]] inline wis::ResultValue CreateRootSignature(const wis::PushConstant* push_constants = nullptr, uint32_t constants_count = 0, const wis::PushDescriptor* push_descriptors = nullptr, uint32_t descriptors_count = 0, uint32_t space_overlap_count = 1) const noexcept + { + return wis::ImplVKDevice::CreateRootSignature(push_constants, constants_count, push_descriptors, descriptors_count, space_overlap_count); + } + /** + * @brief Creates a root signature object for use with DescriptorStorage. + * Supplies number of types for each descriptor type separately. + * @param push_constants The root constants to create the root signature with. + * @param constants_count The number of push constants. Max is 5. + * @param push_descriptors The root descriptors to create the root signature with. + * In shader will appear in order of submission. e.g. root_descriptors[5] is [[vk::binding(5,0)]] ... : register(b5/t5/u5) + * @param push_descriptors_count The number of push descriptors. Max is 8. + * @param descriptor_spacing Descriptor spacing allocation. + * nullptr means allocate 1 space for each. * @return wis::VKRootSignature on success (wis::Status::Ok). * */ - [[nodiscard]] inline wis::ResultValue CreateRootSignature(const wis::RootConstant* root_constants = nullptr, uint32_t constants_size = 0, const wis::DescriptorTable* tables = nullptr, uint32_t tables_count = 0) const noexcept + [[nodiscard]] inline wis::ResultValue CreateRootSignature2(const wis::PushConstant* push_constants = nullptr, uint32_t constants_count = 0, const wis::PushDescriptor* push_descriptors = nullptr, uint32_t push_descriptors_count = 0, const wis::DescriptorSpacing* descriptor_spacing = nullptr) const noexcept { - return wis::ImplVKDevice::CreateRootSignature(root_constants, constants_size, tables, tables_count); + return wis::ImplVKDevice::CreateRootSignature2(push_constants, constants_count, push_descriptors, push_descriptors_count, descriptor_spacing); } /** * @brief Creates a shader object. @@ -301,36 +422,6 @@ class VKDevice : public wis::ImplVKDevice { return wis::ImplVKDevice::CreateShaderResource(std::move(texture), desc); } - /** - * @brief Returns the alignment of the descriptor table in bytes. - * The value is used to correctly determine descriptor page alignment for descriptor buffer. - * @param heap The type of the descriptor heap to get the alignment for. - * @return The alignment of the descriptor table in bytes. - * */ - inline uint32_t GetDescriptorTableAlignment(wis::DescriptorHeapType heap) const noexcept - { - return wis::ImplVKDevice::GetDescriptorTableAlignment(heap); - } - /** - * @brief Returns the size of the descriptor buffer unit in bytes. - * @param heap The type of the descriptor heap to get the unit size for. - * @return The size of the descriptor buffer unit in bytes. Descriptor unit is the size of one descriptor. - * */ - inline uint32_t GetDescriptorBufferUnitSize(wis::DescriptorHeapType heap) const noexcept - { - return wis::ImplVKDevice::GetDescriptorBufferUnitSize(heap); - } - /** - * @brief Creates a descriptor buffer object. - * @param heap_type The type of the descriptor heap to create the descriptor buffer with. - * @param memory_type The type of the descriptor memory to create the descriptor buffer with. - * @param size_bytes The number of bytes to allocate for the descriptor buffer. - * @return wis::VKDescriptorBuffer on success (wis::Status::Ok). - * */ - [[nodiscard]] inline wis::ResultValue CreateDescriptorBuffer(wis::DescriptorHeapType heap_type, wis::DescriptorMemory memory_type, uint64_t size_bytes) const noexcept - { - return wis::ImplVKDevice::CreateDescriptorBuffer(heap_type, memory_type, size_bytes); - } /** * @brief Queries if the device supports the feature. * @param feature The feature to query. diff --git a/wisdom/include/wisdom/vulkan/vk_device_ext.h b/wisdom/include/wisdom/vulkan/vk_device_ext.h index 1114e213..a7ae4d2e 100644 --- a/wisdom/include/wisdom/vulkan/vk_device_ext.h +++ b/wisdom/include/wisdom/vulkan/vk_device_ext.h @@ -45,33 +45,19 @@ struct VKDeviceExtensionEmbedded1; struct XInternalFeatures { // Mandatory features bool dynamic_rendering : 1 = false; - bool descriptor_buffer : 1 = false; bool synchronization_2 : 1 = false; bool swapchain : 1 = false; // Optional features + bool push_descriptor : 1 = false; bool present_wait : 1 = false; bool has_custom_border_color : 1 = false; bool extended_dynamic_state : 1 = false; - bool mutable_descriptor : 1 = false; bool interop_device : 1 = false; bool index_buffer_range : 1 = false; bool dynamic_vsync : 1 = false; // Shall remain false until the perf is not fixed bool dynamic_render_unused_attachments : 1 = false; -}; - -// Lightweight struct for descriptor buffer features -struct XDescriptorBufferProperties { - uint16_t mutable_descriptor_size = 0; - uint16_t offset_alignment = 0; - - uint16_t constant_buffer_size = 0; - uint16_t storage_buffer_size = 0; - uint16_t sampled_image_size = 0; - uint16_t storage_image_size = 0; - uint16_t storage_texel_buffer_size = 0; - uint16_t uniform_texel_buffer_size = 0; - uint16_t sampler_size = 0; + bool multiview : 1 = false; }; struct XBaseProperties { @@ -81,28 +67,10 @@ struct XBaseProperties { template<> struct Internal { XInternalFeatures features; - XDescriptorBufferProperties descriptor_buffer_features; XBaseProperties base_properties; }; struct VKDeviceExtensionEmbedded1 : public QueryInternalExtension { - static constexpr std::array mandatory_extensions = { - VK_KHR_SWAPCHAIN_EXTENSION_NAME, // for Swapchain - VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME, // for barriers - - VK_KHR_MAINTENANCE_4_EXTENSION_NAME, // for Allocator - VK_KHR_MAINTENANCE_5_EXTENSION_NAME, // for Allocator - - VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, // for PushDescriptor - VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, // for Tessellation control point count - VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, // for dynamic render pass - VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME, // for dynamic render pass - - VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, // for Border Color - VK_KHR_PRESENT_WAIT_EXTENSION_NAME, // for Present Wait - VK_KHR_PRESENT_ID_EXTENSION_NAME, // for Present ID - }; - virtual bool GetExtensionInfo(const std::unordered_map>& available_extensions, std::unordered_set& ext_name_set, std::unordered_map& structure_map, @@ -141,13 +109,6 @@ struct VKDeviceExtensionEmbedded1 : public QueryInternalExtension(property_map.at(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2)); base_properties.max_ia_attributes = vk_physical_device_properties.properties.limits.maxVertexInputAttributes; - if (features.descriptor_buffer) { - auto& vk_descriptor_buffer_features = *reinterpret_cast(structure_map.at(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT)); - auto& vk_descriptor_buffer_properties = *reinterpret_cast(property_map.at(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT)); - - descriptor_buffer_features.constant_buffer_size = uint16_t(vk_descriptor_buffer_properties.uniformBufferDescriptorSize); - descriptor_buffer_features.storage_buffer_size = uint16_t(vk_descriptor_buffer_properties.storageBufferDescriptorSize); - - descriptor_buffer_features.sampled_image_size = uint16_t(vk_descriptor_buffer_properties.sampledImageDescriptorSize); - descriptor_buffer_features.storage_image_size = uint16_t(vk_descriptor_buffer_properties.storageImageDescriptorSize); - - descriptor_buffer_features.storage_texel_buffer_size = uint16_t(vk_descriptor_buffer_properties.storageTexelBufferDescriptorSize); - descriptor_buffer_features.uniform_texel_buffer_size = uint16_t(vk_descriptor_buffer_properties.uniformTexelBufferDescriptorSize); - - auto max1 = std::max(vk_descriptor_buffer_properties.uniformBufferDescriptorSize, vk_descriptor_buffer_properties.storageBufferDescriptorSize); - auto max2 = std::max(vk_descriptor_buffer_properties.sampledImageDescriptorSize, vk_descriptor_buffer_properties.storageImageDescriptorSize); - auto max3 = std::max(vk_descriptor_buffer_properties.storageTexelBufferDescriptorSize, vk_descriptor_buffer_properties.uniformTexelBufferDescriptorSize); - - auto max12 = std::max(max1, max2); - - descriptor_buffer_features.mutable_descriptor_size = uint16_t(std::max(max12, max3)); - descriptor_buffer_features.sampler_size = uint16_t(vk_descriptor_buffer_properties.samplerDescriptorSize); - descriptor_buffer_features.offset_alignment = uint16_t(vk_descriptor_buffer_properties.descriptorBufferOffsetAlignment); - } - + auto& vk_11_features = *reinterpret_cast(structure_map.at(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES)); + features.multiview = vk_11_features.multiview; return {}; } diff --git a/wisdom/include/wisdom/vulkan/vk_resource.h b/wisdom/include/wisdom/vulkan/vk_resource.h index c1ef40b7..9f3af141 100644 --- a/wisdom/include/wisdom/vulkan/vk_resource.h +++ b/wisdom/include/wisdom/vulkan/vk_resource.h @@ -237,7 +237,7 @@ class VKBuffer : public wis::ImplVKBuffer * */ inline void Unmap() const noexcept { - return wis::ImplVKBuffer::Unmap(); + wis::ImplVKBuffer::Unmap(); } }; #pragma endregion VKBuffer diff --git a/wisdom/include/wisdom/vulkan/vk_swapchain.h b/wisdom/include/wisdom/vulkan/vk_swapchain.h index ce95bc4e..4f5c0b69 100644 --- a/wisdom/include/wisdom/vulkan/vk_swapchain.h +++ b/wisdom/include/wisdom/vulkan/vk_swapchain.h @@ -22,7 +22,7 @@ struct VKSwapChainCreateInfo { std::unique_ptr render_completed_semaphore = nullptr; std::unique_ptr image_ready_semaphores = nullptr; // if signalled, it means the rendering is available std::unique_ptr back_buffers; - h::VkFence fence = nullptr; // only used for initialization and resizing + std::array fences = {}; // only used for initialization and resizing VkSurfaceFormatKHR format{}; uint64_t present_id = 0; @@ -82,7 +82,8 @@ struct VKSwapChainCreateInfo { public: [[nodiscard]] WIS_INLINE wis::Result InitSemaphores() noexcept; [[nodiscard]] WIS_INLINE wis::Result InitBackBuffers(VkExtent2D image_size) noexcept; - [[nodiscard]] WIS_INLINE wis::Result AquireNextIndex() const noexcept; + [[nodiscard]] WIS_INLINE wis::Result AcquireNextIndex() const noexcept; + [[nodiscard]] WIS_INLINE wis::Result AcquireNextIndexAndWait() const noexcept; WIS_INLINE void ReleaseSemaphores() noexcept; }; } // namespace detail diff --git a/wisdom/include/wisdom/vulkan/vk_views.h b/wisdom/include/wisdom/vulkan/vk_views.h index 050cfb61..53cdb7dd 100644 --- a/wisdom/include/wisdom/vulkan/vk_views.h +++ b/wisdom/include/wisdom/vulkan/vk_views.h @@ -2,6 +2,7 @@ #define WIS_VK_VIEWS_H #include +#include #include #include #include @@ -19,12 +20,11 @@ using VKQueueView = std::tuple; using VKTextureView = std::tuple; using VKBufferView = std::tuple; using VKRenderTargetView = std::tuple; -using VKDescriptorBufferView = std::tuple; -using VKDescriptorBufferGPUView = VKDescriptorBufferView; using VKSamplerView = std::tuple; using VKShaderResourceView = std::tuple; using VKMemoryView = std::tuple; using VKPipelineView = std::tuple; +using VKDescriptorStorageView = std::tuple>; } // namespace wis #endif // VK_VIEWS_H diff --git a/wisdom/include/wisdom/wisdom.hpp b/wisdom/include/wisdom/wisdom.hpp index 028bcff3..1f996c5d 100644 --- a/wisdom/include/wisdom/wisdom.hpp +++ b/wisdom/include/wisdom/wisdom.hpp @@ -34,15 +34,15 @@ using DeviceExtension = DX12DeviceExtension; using PipelineState = DX12PipelineState; using Adapter = DX12Adapter; using Device = DX12Device; -using DescriptorBuffer = DX12DescriptorBuffer; using FactoryExtension = DX12FactoryExtension; using ResourceAllocator = DX12ResourceAllocator; +using Memory = DX12Memory; using Fence = DX12Fence; using CommandList = DX12CommandList; -using Memory = DX12Memory; using SwapChain = DX12SwapChain; using Buffer = DX12Buffer; using Texture = DX12Texture; +using DescriptorStorage = DX12DescriptorStorage; using RootSignature = DX12RootSignature; using Shader = DX12Shader; using DebugMessenger = DX12DebugMessenger; @@ -88,8 +88,6 @@ using RenderTargetView = DX12RenderTargetView; using CommandListView = DX12CommandListView; using ShaderView = DX12ShaderView; using RootSignatureView = DX12RootSignatureView; -using DescriptorBufferView = DX12DescriptorBufferView; -using DescriptorBufferGPUView = DX12DescriptorBufferGPUView; using RootSignatureView2 = DX12RootSignatureView2; using MemoryView = DX12MemoryView; using PipelineView = DX12PipelineView; @@ -118,15 +116,15 @@ using DeviceExtension = VKDeviceExtension; using PipelineState = VKPipelineState; using Adapter = VKAdapter; using Device = VKDevice; -using DescriptorBuffer = VKDescriptorBuffer; using FactoryExtension = VKFactoryExtension; using ResourceAllocator = VKResourceAllocator; +using Memory = VKMemory; using Fence = VKFence; using CommandList = VKCommandList; -using Memory = VKMemory; using SwapChain = VKSwapChain; using Buffer = VKBuffer; using Texture = VKTexture; +using DescriptorStorage = VKDescriptorStorage; using RootSignature = VKRootSignature; using Shader = VKShader; using DebugMessenger = VKDebugMessenger; @@ -172,8 +170,6 @@ using RenderTargetView = VKRenderTargetView; using CommandListView = VKCommandListView; using ShaderView = VKShaderView; using RootSignatureView = VKRootSignatureView; -using DescriptorBufferView = VKDescriptorBufferView; -using DescriptorBufferGPUView = VKDescriptorBufferGPUView; using RootSignatureView2 = VKRootSignatureView2; using MemoryView = VKMemoryView; using PipelineView = VKPipelineView; diff --git a/wisdom/platform/CMakeLists.txt b/wisdom/platform/CMakeLists.txt index 821422ee..933a1299 100644 --- a/wisdom/platform/CMakeLists.txt +++ b/wisdom/platform/CMakeLists.txt @@ -20,7 +20,7 @@ elseif(WISDOM_LINUX) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${AUX_CMAKE_DIR}/ECM") add_subdirectory("xcb") - # add_subdirectory("x11") + add_subdirectory("x11") add_subdirectory("wayland") install(DIRECTORY "${AUX_CMAKE_DIR}/ECM" diff --git a/wisdom/platform/wayland/wisdom/wisdom_wayland.h b/wisdom/platform/wayland/wisdom/wisdom_wayland.h index 84585768..796fae4d 100644 --- a/wisdom/platform/wayland/wisdom/wisdom_wayland.h +++ b/wisdom/platform/wayland/wisdom/wisdom_wayland.h @@ -5,6 +5,10 @@ #include #include #include + +struct wl_display; +struct wl_surface; + #include namespace wis { @@ -44,7 +48,7 @@ class WaylandExtension : public QueryInternalExtension - CreateSwapchain(const VKDevice& device, VKQueueView main_queue, const wis::SwapchainDesc* desc, wl_display* display, struct wl_surface* surface) const noexcept; + CreateSwapchain(const VKDevice& device, VKQueueView main_queue, const wis::SwapchainDesc* desc, wl_display* display, wl_surface* surface) const noexcept; }; } // namespace platform } // namespace wis diff --git a/wisdom/platform/windows/wisdom/wisdom_windows.cpp b/wisdom/platform/windows/wisdom/wisdom_windows.cpp index ede3bed2..52e0d868 100644 --- a/wisdom/platform/windows/wisdom/wisdom_windows.cpp +++ b/wisdom/platform/windows/wisdom/wisdom_windows.cpp @@ -56,7 +56,7 @@ wis::platform::DX12WindowsExtension::CreateSwapchain(const DX12Device& device, D factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &xtearing, sizeof(xtearing)); return bool(xtearing); }(); - if (tearing) + if (tearing && desc->tearing) swap_desc.Flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; HRESULT hr; @@ -90,7 +90,7 @@ wis::platform::DX12WindowsExtension::CreateSwapchain(const DX12Device& device, D .present_event{ hnd }, .stereo = desc->stereo, .vsync = desc->vsync, - .tearing = tearing, + .tearing = tearing && desc->tearing, }; if (auto resw = create_info.InitBackBuffers(); resw.status != wis::Status::Ok) return resw; diff --git a/wisdom/platform/wisdom/wisdom_platform.h b/wisdom/platform/wisdom/wisdom_platform.h index d15afeca..cf9ae5c2 100644 --- a/wisdom/platform/wisdom/wisdom_platform.h +++ b/wisdom/platform/wisdom/wisdom_platform.h @@ -10,6 +10,9 @@ #ifdef WIS_XCB_PLATFORM #include #endif // WIS_XCB_PLATFORM +#ifdef WIS_X11_PLATFORM +#include +#endif // WIS_X11_PLATFORM #ifdef WIS_WAYLAND_PLATFORM #include #endif // WIS_WAYLAND_PLATFORM diff --git a/wisdom/platform/x11/CMakeLists.txt b/wisdom/platform/x11/CMakeLists.txt new file mode 100644 index 00000000..5872935c --- /dev/null +++ b/wisdom/platform/x11/CMakeLists.txt @@ -0,0 +1,55 @@ +find_package(X11) +if(NOT X11_FOUND) + return() +endif() + +add_library(wisdom-x11-headers INTERFACE) +add_library(wis::x11-headers ALIAS wisdom-x11-headers) +target_link_libraries(wisdom-x11-headers INTERFACE wis::header-only) +target_compile_definitions(wisdom-x11-headers INTERFACE WIS_X11_PLATFORM=1) +target_include_directories(wisdom-x11-headers INTERFACE ${X11_INCLUDE_DIR}) +target_include_directories( + wisdom-x11-headers INTERFACE $ + $) + +if(WISDOM_BUILD_BINARIES) + add_library(wisdom-x11 STATIC "wisdom/wisdom_x11.h" "wisdom/wisdom_x11.cpp") + add_library(wis::x11 ALIAS wisdom-x11) + target_link_libraries(wisdom-x11 PUBLIC wis::wisdom) + target_compile_definitions(wisdom-x11 PUBLIC WIS_X11_PLATFORM=1) + target_include_directories( + wisdom-x11 PUBLIC $ + $) +else() + add_library(wisdom-x11 ALIAS wisdom-x11-headers) + add_library(wis::x11 ALIAS wisdom-x11-headers) +endif() + +target_link_libraries(wisdom-platform INTERFACE wis::x11) +target_link_libraries(wisdom-platform-headers INTERFACE wis::x11-headers) + +install( + TARGETS wisdom-x11 wisdom-x11-headers + EXPORT wisdom-x11-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +install( + EXPORT wisdom-x11-targets + FILE wisdom-x11-targets.cmake + NAMESPACE wis:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wisdom) + +configure_package_config_file( + "${PLATFORM_CONFIG_DIR}/wisdom-x11-config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/wisdom-x11-config.cmake" + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wisdom) + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/wisdom-x11-config.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/wisdom") + +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/wisdom/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wisdom) diff --git a/wisdom/platform/x11/wisdom/wisdom_x11.cpp b/wisdom/platform/x11/wisdom/wisdom_x11.cpp new file mode 100644 index 00000000..0c7b0469 --- /dev/null +++ b/wisdom/platform/x11/wisdom/wisdom_x11.cpp @@ -0,0 +1,29 @@ +#ifndef WISDOM_X11_CPP +#define WISDOM_X11_CPP +#include +#include +#include + +wis::ResultValue +wis::platform::X11Extension::CreateSwapchain(const wis::VKDevice& device, wis::VKQueueView main_queue, const wis::SwapchainDesc* desc, Display* display, Window window) const noexcept +{ + VkXlibSurfaceCreateInfoKHR surface_desc{ + .sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, + .pNext = nullptr, + .flags = 0, + .dpy = display, + .window = window + }; + wis::lib_info("Initializing X11 Surface"); + + auto& devicei = device.GetInternal(); + const auto& instance_table = instance.table(); + VkSurfaceKHR surface; + auto result = vkCreateXlibSurfaceKHR(instance.get(), &surface_desc, nullptr, &surface); + if (!wis::succeeded(result)) { + return wis::make_result(result); + } + return device.VKCreateSwapChain(wis::SharedSurface{ surface, instance, instance_table.vkDestroySurfaceKHR }, desc, std::get<0>(main_queue)); +} + +#endif // WISDOM_XCB_CPP diff --git a/wisdom/platform/x11/wisdom/wisdom_x11.h b/wisdom/platform/x11/wisdom/wisdom_x11.h new file mode 100644 index 00000000..ff55a564 --- /dev/null +++ b/wisdom/platform/x11/wisdom/wisdom_x11.h @@ -0,0 +1,65 @@ +#ifndef WISDOM_X11_H +#define WISDOM_X11_H +#if defined(WISDOM_VULKAN) +#include +#include +#include + +#include +#include + +// couple of undefs to avoid conflicts +#undef Bool +#undef Status +#undef True +#undef False +#undef None +#undef Always + +namespace wis { +namespace platform { +class X11Extension; +} // namespace platform + +template<> +struct Internal { + wis::SharedInstance instance; + PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR = nullptr; + PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = nullptr; +}; + +namespace platform { +class X11Extension : public QueryInternalExtension> +{ +public: + static constexpr std::array required_extensions = { + VK_KHR_XLIB_SURFACE_EXTENSION_NAME + }; + + [[nodiscard]] wis::Result + Init(const wis::VKFactory& in_instance) noexcept override + { + instance = in_instance.GetInternal().factory; + vkCreateXlibSurfaceKHR = instance.GetInstanceProcAddr("vkCreateXlibSurfaceKHR"); + vkGetPhysicalDeviceXlibPresentationSupportKHR = instance.GetInstanceProcAddr("vkGetPhysicalDeviceXlibPresentationSupportKHR"); + return {}; + } + + [[nodiscard]] bool + Supported() const noexcept override + { + return vkCreateXlibSurfaceKHR && vkGetPhysicalDeviceXlibPresentationSupportKHR; + } + +public: + [[nodiscard]] WIS_INLINE wis::ResultValue + CreateSwapchain(const VKDevice& device, VKQueueView main_queue, const wis::SwapchainDesc* desc, Display* display, Window window) const noexcept; +}; +} // namespace platform +} // namespace wis + +#ifndef WISDOM_BUILD_BINARIES +#include "wisdom_x11.cpp" +#endif // !WISDOM_PLATFORM_HEADER_ONLY +#endif // WISDOM_LINUX +#endif // WISDOM_XCB_H diff --git a/wisdom/vulkan.cmake b/wisdom/vulkan.cmake index 4d64bdeb..e178ed6b 100644 --- a/wisdom/vulkan.cmake +++ b/wisdom/vulkan.cmake @@ -27,7 +27,7 @@ if(WISDOM_BUILD_BINARIES) "include/wisdom/vulkan/vk_command_queue.h" "include/wisdom/vulkan/vk_command_list.h" "include/wisdom/vulkan/vk_root_signature.h" - "include/wisdom/vulkan/vk_descriptor_buffer.h" + "include/wisdom/vulkan/vk_descriptor_storage.h" "include/wisdom/vulkan/vk_resource.h" "include/wisdom/vulkan/vk_shader.h" "include/wisdom/vulkan/vk_allocator.h" @@ -39,7 +39,6 @@ if(WISDOM_BUILD_BINARIES) add_library(wis::vulkan ALIAS wisdom-vk) target_sources(wisdom-vk PRIVATE - "include/wisdom/vulkan/impl/vk_descriptor_buffer.cpp" "include/wisdom/vulkan/impl/vk_factory.cpp" "include/wisdom/vulkan/impl/vk_create_factory.cpp" "include/wisdom/vulkan/impl/vk_allocator.cpp" diff --git a/xml/enums.xml b/xml/enums.xml index 88bcdfcd..8232d419 100644 --- a/xml/enums.xml +++ b/xml/enums.xml @@ -94,26 +94,35 @@ Stages have no granularity, either all or one can be selected."> - - - + + + - + - + + + + + + + + - - - + + + @@ -1154,21 +1163,18 @@ Enum values resemble the byte stride of the format."> - - + + + + + + + + + + + + @@ -1480,5 +1502,15 @@ Determine how the texture can be used throughout its lifetime."> + + + + + + + + + diff --git a/xml/structs.xml b/xml/structs.xml index 7b5619b1..3809feac 100644 --- a/xml/structs.xml +++ b/xml/structs.xml @@ -52,16 +52,6 @@ - - - - - - - - - - @@ -127,9 +117,9 @@ Describes hardware driver identificators as well as memory limits."> - + - + @@ -188,8 +178,8 @@ Describes hardware driver identificators as well as memory limits."> - - + + @@ -199,9 +189,11 @@ Describes hardware driver identificators as well as memory limits."> - + - + + @@ -243,11 +235,9 @@ In TextureToBuffer - offset of source image."/> - - - - - + + + @@ -366,6 +356,27 @@ Pointer is populated with the extension with queried ID. If the extension is not supported/failed to initialize the result is NULL."/> + + + + + + + + + + + + + + + + + + + @@ -397,11 +408,14 @@ If the extension is not supported/failed to initialize the result is NULL."/> - - - - + + + + + + @@ -430,9 +444,12 @@ If the extension is not supported/failed to initialize the result is NULL."/> + - - + + diff --git a/xml/wis.xml b/xml/wis.xml index d485139b..151f5227 100644 --- a/xml/wis.xml +++ b/xml/wis.xml @@ -40,11 +40,6 @@ Uses DXMA and VMA libraries which can allocate memory with O(1) complexity with - - - - - @@ -75,6 +70,12 @@ Uses DXMA and VMA libraries which can allocate memory with O(1) complexity with + + + + + @@ -147,12 +148,31 @@ Default is {MutiWaitFlags::All}"/> - + + + + + + + + + + - - - - + + + + + @@ -197,24 +217,6 @@ Does not work with 3D textures."/> - - - - - - - - - - - - - - - - - @@ -449,29 +451,24 @@ Otherwise the first is chosen."> - + - - - - - - - - - + + + + + - + - @@ -497,78 +494,6 @@ Can still be enqueued after the signal."> - - - - - - - - - - - - - - - - - - - - - - - "> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -660,6 +585,33 @@ If NULL, returns the amount of images swapchain has."/> + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -698,5 +650,110 @@ The presence of core functionality is checked by the query function."/> " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +