diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..955c21b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,27 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain + +# cmake launcher templates +*.cmd.in text eol=crlf +*vcproj.user.in text eol=crlf +*vcxproj.user.in text eol=crlf diff --git a/CMakeLists.txt b/CMakeLists.txt index 95ca311..dc53367 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,376 +1,376 @@ -cmake_minimum_required(VERSION 3.1.0) -project(osvrRenderManager) - -#----------------------------------------------------------------------------- -# Local CMake Modules -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - -#----------------------------------------------------------------------------- -# Export libraries along with our DLLs if we want to build shared -# Allow the developer to select if Dynamic or Static libraries are built - -include (GenerateExportHeader) - -option(BUILD_SHARED_LIBS "Build Shared Libraries" ON) - -#----------------------------------------------------------------------------- -# This looks for an osvrConfig.cmake file - most of the time it can be -# autodetected but you might need to specify osvr_DIR to be something like -# C:/Users/Ryan/Desktop/build/OSVR-Core-vc12 or -# C:/Users/Ryan/Downloads/OSVR-Core-Snapshot-v0.1-406-gaa55515-build54-vs12-32bit -# in the CMake GUI or command line -find_package(osvr REQUIRED) -find_package(Eigen3 REQUIRED) -find_package(JsonCpp REQUIRED) - -# Check for the submodules -set(NVIDIA_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/osvr/RenderKit/NDA/OSVR-RenderManager-NVIDIA") -set(HAVE_NVIDIA_NDA_SUBMODULE FALSE) -if(EXISTS "${NVIDIA_SRC_DIR}/RenderManagerNVidiaD3D.cpp") - set(HAVE_NVIDIA_NDA_SUBMODULE TRUE) -endif() - -set(AMD_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/osvr/RenderKit/NDA/OSVR-RenderManager-AMD") -set(HAVE_AMD_NDA_SUBMODULE FALSE) -if(EXISTS "${AMD_SRC_DIR}/RenderManagerAMDD3D.cpp") - set(HAVE_AMD_NDA_SUBMODULE TRUE) -endif() - -# Add one of these libraries for each vendor that we've got a driver -# for and add a No driver that tells that it is unavailable when we -# don't find the driver library. -find_package(nvapi COMPONENTS NDA) -find_package(liquidvr) -find_package(OpenGL) -find_package(OpenGLES2) -find_package(GLEW) -find_package(SDL2) -if(WIN32) - # Well, redistributables technically, not tools, but close enough. - find_package(WindowsSDK REQUIRED COMPONENTS tools) - # Find redistributable version of d3dcompiler_47 which is required for pre-Win8 systems. - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ARCH_DIR x64) - else() - set(ARCH_DIR x86) - endif() - find_file(DIRECT3D_COMPILER_REDISTRIBUTABLE d3dcompiler_47.dll - PATH_SUFFIXES Redist/D3D/${ARCH_DIR} - PATHS ${WINDOWSSDK_DIRS} - NO_DEFAULT_PATH) -endif() - -# Finally, vendored dependencies -add_subdirectory(vendor) -include_directories(${VRPN_INCLUDE_DIRS}) - -#----------------------------------------------------------------------------- -# Open (non-NDA) files -set (RenderManager_SOURCES - osvr/RenderKit/RenderManagerBase.cpp - osvr/RenderKit/RenderManagerC.cpp - osvr/RenderKit/RenderKitGraphicsTransforms.cpp - osvr/RenderKit/RenderKitGraphicsTransformsC.cpp - osvr/RenderKit/osvr_display_configuration.cpp - osvr/RenderKit/VendorIdTools.h - osvr/RenderKit/osvr_display_config_built_in_osvr_hdks.h -) - -if (WIN32) - list(APPEND RenderManager_SOURCES - osvr/RenderKit/RenderManagerD3D11C.cpp - osvr/RenderKit/RenderManagerD3DBase.cpp - osvr/RenderKit/RenderManagerD3D.cpp - osvr/RenderKit/RenderManagerD3DBase.h - osvr/RenderKit/RenderManagerD3D.h - osvr/RenderKit/RenderManagerD3D11ATW.h) -endif() - -### -# Graphics API support -### - -set(OSVRRM_HAVE_OPENGL_SUPPORT OFF) -set(OSVRRM_HAVE_D3D11_SUPPORT OFF) -if (WIN32) - set(OSVRRM_HAVE_D3D11_SUPPORT ON) - set(RM_USE_D3D11 TRUE) - message(STATUS " - D3D11 support: enabled (found WIN32)") -endif() - -if (NVAPI_FOUND AND HAVE_NVIDIA_NDA_SUBMODULE) - # Usage dependencies - add_library(osvrRM-nvidia-requirements INTERFACE) - target_link_libraries(osvrRM-nvidia-requirements INTERFACE nvapi) - target_include_directories(osvrRM-nvidia-requirements INTERFACE "${NVIDIA_SRC_DIR}") - # nVidia NDA files. - list(APPEND RenderManager_SOURCES - "${NVIDIA_SRC_DIR}/RenderManagerNVidiaD3D.cpp" - "${NVIDIA_SRC_DIR}/RenderManagerNVidiaD3D.h") - set(RM_USE_NVIDIA_DIRECT_D3D11 TRUE) - message(STATUS " - NVIDIA direct D3D11 support: enabled (found NVAPI and NVIDIA NDA submodule)") -else() - message(STATUS " - NVIDIA direct support: disabled (need NVAPI and NVIDIA NDA submodule)") -endif() - -if (LIQUIDVR_FOUND AND HAVE_AMD_NDA_SUBMODULE) - # Usage dependencies - add_library(osvrRM-amd-requirements INTERFACE) - target_link_libraries(osvrRM-amd-requirements INTERFACE liquidvr) - target_include_directories(osvrRM-amd-requirements INTERFACE "${AMD_SRC_DIR}") - # AMD NDA files. - list(APPEND RenderManager_SOURCES - "${AMD_SRC_DIR}/RenderManagerAMDD3D.cpp" - "${AMD_SRC_DIR}/RenderManagerAMDD3D.h") - set(RM_USE_AMD_DIRECT_D3D11 TRUE) - message(STATUS " - AMD direct D3D11 support: enabled (found LIQUIDVR and AMD NDA submodule)") -else() - message(STATUS " - AMD direct support: disabled (need LIQUIDVR and AMD NDA submodule)") -endif() - -#----------------------------------------------------------------------------- -# SDL init/quit handler code that makes sure we only do it once. -if (SDL2_FOUND) - list(APPEND RenderManager_SOURCES osvr/RenderKit/RenderManagerSDLInitQuit.cpp osvr/RenderKit/RenderManagerSDLInitQuit.h ) -endif() - -#----------------------------------------------------------------------------- -# OpenGL library as a stand-alone renderer not wrapping D3D -if ( ( (OPENGL_FOUND AND GLEW_FOUND) OR OPENGLES2_FOUND ) AND SDL2_FOUND) - list(APPEND RenderManager_SOURCES osvr/RenderKit/RenderManagerOpenGL.cpp osvr/RenderKit/RenderManagerOpenGL.h osvr/RenderKit/RenderManagerOpenGLC.cpp) - message(STATUS " - OpenGL support: enabled") - set(RM_USE_OPENGL TRUE) - set(OSVRRM_HAVE_OPENGL_SUPPORT ON) - if (OPENGLES2_FOUND AND ANDROID) - message(STATUS " - OpenGLES2 support: enabled") - set(RM_USE_OPENGLES20 TRUE) - endif() -else() - message(STATUS " - OpenGL support: disabled)") -endif() - -#----------------------------------------------------------------------------- -# OpenGL wrapped around Direct3D -if ((RM_USE_NVIDIA_DIRECT_D3D11 OR RM_USE_AMD_DIRECT_D3D11) AND NOT RM_USE_OPENGLES20) - #----------------------------------------------------------------------------- - # OpenGL library as a wrapper for D3D DirectMode - if (OPENGL_FOUND AND GLEW_FOUND AND SDL2_FOUND) - message(STATUS " - D3D11+OpenGL support: enabled (found NVAPI or LIQUIDVR, OpenGL, GLEW, and SDL2)") - list(APPEND RenderManager_SOURCES osvr/RenderKit/RenderManagerD3DOpenGL.cpp osvr/RenderKit/RenderManagerD3DOpenGL.h) - set(RM_USE_NVIDIA_DIRECT_D3D11_OPENGL TRUE) - else() - message(STATUS " - Vendor direct D3D11+OpenGL support: disabled (need all of a vendor direct-mode D3D module, OpenGL, GLEW, and SDL2, at least one was missing)") - endif() -endif() - -### -# Set up build product locations -### -include(GNUInstallDirs) -# Sometimes GNUInstallDirs misses this one. -if(NOT CMAKE_INSTALL_DOCDIR) - set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}) -endif() - -# Win-specific: we want shared libs (dlls) in same dir as exe files. -if(WIN32) - set(OSVRRM_SHARED_LIBRARY_DIR "${CMAKE_INSTALL_BINDIR}") -else() - set(OSVRRM_SHARED_LIBRARY_DIR "${CMAKE_INSTALL_LIBDIR}") -endif() - -# Let's build into a parallel(ish) structure as we'll install to. -if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY) - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") -endif() -if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${OSVRRM_SHARED_LIBRARY_DIR}") -endif() -if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") -endif() - -### -# Helper for dependencies -### -include(CopyImportedTarget) -## Copy and install shared libraries from imported targets as required -function(osvrrm_copy_deps) - copy_imported_targets(osvrRenderManager ${ARGN}) - foreach(_dep ${ARGN}) - install_imported_target(${_dep} DESTINATION ${OSVRRM_SHARED_LIBRARY_DIR} COMPONENT Runtime) - endforeach() -endfunction() - -### -# Build the actual library -### - -# Generate the header with the defines we need. -configure_file(RenderManagerBackends.h.in "${CMAKE_CURRENT_BINARY_DIR}/RenderManagerBackends.h") - -set (RenderManager_PUBLIC_HEADERS - osvr/RenderKit/RenderManager.h - osvr/RenderKit/RenderManagerC.h - osvr/RenderKit/RenderManagerD3D11C.h - osvr/RenderKit/RenderManagerOpenGLC.h - osvr/RenderKit/GraphicsLibraryD3D11.h - osvr/RenderKit/GraphicsLibraryOpenGL.h - osvr/RenderKit/MonoPointMeshTypes.h - osvr/RenderKit/RGBPointMeshTypes.h - osvr/RenderKit/RenderKitGraphicsTransforms.h - osvr/RenderKit/RenderKitGraphicsTransformsC.h - osvr/RenderKit/osvr_display_configuration.h - osvr/RenderKit/osvr_compiler_tests.h - "${CMAKE_CURRENT_BINARY_DIR}/osvr/RenderKit/Export.h" -) -add_library(osvrRenderManager ${RenderManager_SOURCES} ${RenderManager_PUBLIC_HEADERS}) -if (NOT ANDROID) - target_compile_features(osvrRenderManager PRIVATE cxx_range_for) -endif() -target_include_directories(osvrRenderManager PUBLIC - $ - $ - $ - PRIVATE - ${EIGEN3_INCLUDE_DIR}) -if (RM_USE_NVIDIA_DIRECT_D3D11) - target_link_libraries(osvrRenderManager - PRIVATE - osvrRM-nvidia-requirements) -endif() -if (RM_USE_AMD_DIRECT_D3D11) - target_link_libraries(osvrRenderManager - PRIVATE - osvrRM-amd-requirements) -endif() -if (WIN32) - target_link_libraries(osvrRenderManager PRIVATE D3D11) -endif() - -set(LIBNAME_FULL osvrRenderManager) -set(EXPORT_BASENAME OSVR_RENDERMANAGER) -configure_file("Export.h.in" - osvr/RenderKit/Export.h - @ONLY NEWLINE_STYLE LF) - -if(NOT BUILD_SHARED_LIBS) - target_compile_definitions(osvrRenderManager PUBLIC OSVR_RENDERMANAGER_STATIC_DEFINE) -endif() - -set_property(TARGET - osvrRenderManager - PROPERTY - PUBLIC_HEADER - ${RenderManager_PUBLIC_HEADERS}) - -# If we are using dynamic GLEW on Windows, let's copy it. -if(GLEW_FOUND AND WIN32 AND NOT GLEW_LIBRARY MATCHES ".*s.lib") - osvrrm_copy_deps(GLEW::GLEW) -endif() - -if (OPENGL_FOUND) - target_include_directories(osvrRenderManager PRIVATE ${OPENGL_INCLUDE_DIRS}) - target_link_libraries(osvrRenderManager PRIVATE ${OPENGL_LIBRARY}) -endif() - -if (ANDROID) - target_include_directories(osvrRenderManager PRIVATE ${OPENGLES2_INCLUDE_DIR}) - target_link_libraries(osvrRenderManager PRIVATE ${OPENGLES2_LIBRARIES}) - target_link_libraries(osvrRenderManager PRIVATE android) -endif() - -if (GLEW_FOUND) - target_link_libraries(osvrRenderManager PRIVATE GLEW::GLEW) -endif() - -if (SDL2_FOUND) - target_link_libraries(osvrRenderManager PRIVATE SDL2::SDL2) -endif() - -if(SDL2_DYNAMIC AND WIN32) - osvrrm_copy_deps(SDL2::SDL2) -endif() - -# This also lets it know where to find the header files. -target_link_libraries(osvrRenderManager - PUBLIC - osvr::osvrClientKitCpp - PRIVATE - JsonCpp::JsonCpp - osvr::osvrClient - vendored-vrpn - vendored-quat) -osvrrm_copy_deps(osvr::osvrClientKit osvr::osvrClient osvr::osvrCommon osvr::osvrUtil) - -# Add the C++ interface target. -add_library(osvrRenderManagerCpp INTERFACE) -target_link_libraries(osvrRenderManagerCpp INTERFACE osvrRenderManager osvr::osvrClientKitCpp) - -# Alias targets, so the examples can be used as-is. -add_library(osvrRM::osvrRenderManager ALIAS osvrRenderManager) -add_library(osvrRM::osvrRenderManagerCpp ALIAS osvrRenderManagerCpp) - - -if(WIN32) - # Install d3dcompiler_47 - install(FILES ${DIRECT3D_COMPILER_REDISTRIBUTABLE} - DESTINATION ${CMAKE_INSTALL_BINDIR}) -endif() - -# The goal with this variable is so that the same CMakeLists file that is used to build -# the examples in-tree can be shipped to build the examples out-of-tree. -set(OSVRRM_INSTALL_EXAMPLES ON) -add_subdirectory(examples) - -install(TARGETS - osvrRenderManager - EXPORT ${PROJECT_NAME} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - PUBLIC_HEADER DESTINATION include/osvr/RenderKit -) - -install(EXPORT - ${PROJECT_NAME} - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} - FILE ${PROJECT_NAME}Config.cmake -) - -if (NVAPI_FOUND AND HAVE_NVIDIA_NDA_SUBMODULE) - set(NVAPI_EXTRA_HEADERS "${NVIDIA_SRC_DIR}/CheckSuccess.h" "${NVIDIA_SRC_DIR}/Util.h" "${NVIDIA_SRC_DIR}/NVAPIWrappers.h") - - #----------------------------------------------------------------------------- - # Enable DirectMode on attached OSVR HDKs - add_executable(EnableOSVRDirectMode "${NVIDIA_SRC_DIR}/EnableOSVRDirectMode.cpp" ${NVAPI_EXTRA_HEADERS}) - target_link_libraries(EnableOSVRDirectMode PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-nvidia-requirements) - - #----------------------------------------------------------------------------- - # Disable DirectMode on attached OSVR HDKs - add_executable(DisableOSVRDirectMode "${NVIDIA_SRC_DIR}/DisableOSVRDirectMode.cpp" ${NVAPI_EXTRA_HEADERS}) - target_link_libraries(DisableOSVRDirectMode PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-nvidia-requirements) - - #----------------------------------------------------------------------------- - # Debugging/troubleshooting application for direct mode. - add_executable(DirectModeDebugging "${NVIDIA_SRC_DIR}/DirectModeDebugging.cpp" ${NVAPI_EXTRA_HEADERS}) - target_link_libraries(DirectModeDebugging PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-nvidia-requirements) - - install(TARGETS EnableOSVRDirectMode DisableOSVRDirectMode DirectModeDebugging RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) -endif() - -if (LIQUIDVR_FOUND AND HAVE_AMD_NDA_SUBMODULE) - - #----------------------------------------------------------------------------- - # Enable DirectMode on attached OSVR HDKs - add_executable(EnableOSVRDirectModeAMD "${AMD_SRC_DIR}/EnableOSVRDirectModeAMD.cpp") - target_link_libraries(EnableOSVRDirectModeAMD PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-amd-requirements) - - #----------------------------------------------------------------------------- - # Disable DirectMode on attached OSVR HDKs - add_executable(DisableOSVRDirectModeAMD "${AMD_SRC_DIR}/DisableOSVRDirectModeAMD.cpp") - target_link_libraries(DisableOSVRDirectModeAMD PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-amd-requirements) - - install(TARGETS EnableOSVRDirectModeAMD DisableOSVRDirectModeAMD RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) -endif() +cmake_minimum_required(VERSION 3.1.0) +project(osvrRenderManager) + +#----------------------------------------------------------------------------- +# Local CMake Modules +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +#----------------------------------------------------------------------------- +# Export libraries along with our DLLs if we want to build shared +# Allow the developer to select if Dynamic or Static libraries are built + +include (GenerateExportHeader) + +option(BUILD_SHARED_LIBS "Build Shared Libraries" ON) + +#----------------------------------------------------------------------------- +# This looks for an osvrConfig.cmake file - most of the time it can be +# autodetected but you might need to specify osvr_DIR to be something like +# C:/Users/Ryan/Desktop/build/OSVR-Core-vc12 or +# C:/Users/Ryan/Downloads/OSVR-Core-Snapshot-v0.1-406-gaa55515-build54-vs12-32bit +# in the CMake GUI or command line +find_package(osvr REQUIRED) +find_package(Eigen3 REQUIRED) +find_package(JsonCpp REQUIRED) + +# Check for the submodules +set(NVIDIA_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/osvr/RenderKit/NDA/OSVR-RenderManager-NVIDIA") +set(HAVE_NVIDIA_NDA_SUBMODULE FALSE) +if(EXISTS "${NVIDIA_SRC_DIR}/RenderManagerNVidiaD3D.cpp") + set(HAVE_NVIDIA_NDA_SUBMODULE TRUE) +endif() + +set(AMD_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/osvr/RenderKit/NDA/OSVR-RenderManager-AMD") +set(HAVE_AMD_NDA_SUBMODULE FALSE) +if(EXISTS "${AMD_SRC_DIR}/RenderManagerAMDD3D.cpp") + set(HAVE_AMD_NDA_SUBMODULE TRUE) +endif() + +# Add one of these libraries for each vendor that we've got a driver +# for and add a No driver that tells that it is unavailable when we +# don't find the driver library. +find_package(nvapi COMPONENTS NDA) +find_package(liquidvr) +find_package(OpenGL) +find_package(OpenGLES2) +find_package(GLEW) +find_package(SDL2) +if(WIN32) + # Well, redistributables technically, not tools, but close enough. + find_package(WindowsSDK REQUIRED COMPONENTS tools) + # Find redistributable version of d3dcompiler_47 which is required for pre-Win8 systems. + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ARCH_DIR x64) + else() + set(ARCH_DIR x86) + endif() + find_file(DIRECT3D_COMPILER_REDISTRIBUTABLE d3dcompiler_47.dll + PATH_SUFFIXES Redist/D3D/${ARCH_DIR} + PATHS ${WINDOWSSDK_DIRS} + NO_DEFAULT_PATH) +endif() + +# Finally, vendored dependencies +add_subdirectory(vendor) +include_directories(${VRPN_INCLUDE_DIRS}) + +#----------------------------------------------------------------------------- +# Open (non-NDA) files +set (RenderManager_SOURCES + osvr/RenderKit/RenderManagerBase.cpp + osvr/RenderKit/RenderManagerC.cpp + osvr/RenderKit/RenderKitGraphicsTransforms.cpp + osvr/RenderKit/RenderKitGraphicsTransformsC.cpp + osvr/RenderKit/osvr_display_configuration.cpp + osvr/RenderKit/VendorIdTools.h + osvr/RenderKit/osvr_display_config_built_in_osvr_hdks.h +) + +if (WIN32) + list(APPEND RenderManager_SOURCES + osvr/RenderKit/RenderManagerD3D11C.cpp + osvr/RenderKit/RenderManagerD3DBase.cpp + osvr/RenderKit/RenderManagerD3D.cpp + osvr/RenderKit/RenderManagerD3DBase.h + osvr/RenderKit/RenderManagerD3D.h + osvr/RenderKit/RenderManagerD3D11ATW.h) +endif() + +### +# Graphics API support +### + +set(OSVRRM_HAVE_OPENGL_SUPPORT OFF) +set(OSVRRM_HAVE_D3D11_SUPPORT OFF) +if (WIN32) + set(OSVRRM_HAVE_D3D11_SUPPORT ON) + set(RM_USE_D3D11 TRUE) + message(STATUS " - D3D11 support: enabled (found WIN32)") +endif() + +if (NVAPI_FOUND AND HAVE_NVIDIA_NDA_SUBMODULE) + # Usage dependencies + add_library(osvrRM-nvidia-requirements INTERFACE) + target_link_libraries(osvrRM-nvidia-requirements INTERFACE nvapi) + target_include_directories(osvrRM-nvidia-requirements INTERFACE "${NVIDIA_SRC_DIR}") + # nVidia NDA files. + list(APPEND RenderManager_SOURCES + "${NVIDIA_SRC_DIR}/RenderManagerNVidiaD3D.cpp" + "${NVIDIA_SRC_DIR}/RenderManagerNVidiaD3D.h") + set(RM_USE_NVIDIA_DIRECT_D3D11 TRUE) + message(STATUS " - NVIDIA direct D3D11 support: enabled (found NVAPI and NVIDIA NDA submodule)") +else() + message(STATUS " - NVIDIA direct support: disabled (need NVAPI and NVIDIA NDA submodule)") +endif() + +if (LIQUIDVR_FOUND AND HAVE_AMD_NDA_SUBMODULE) + # Usage dependencies + add_library(osvrRM-amd-requirements INTERFACE) + target_link_libraries(osvrRM-amd-requirements INTERFACE liquidvr) + target_include_directories(osvrRM-amd-requirements INTERFACE "${AMD_SRC_DIR}") + # AMD NDA files. + list(APPEND RenderManager_SOURCES + "${AMD_SRC_DIR}/RenderManagerAMDD3D.cpp" + "${AMD_SRC_DIR}/RenderManagerAMDD3D.h") + set(RM_USE_AMD_DIRECT_D3D11 TRUE) + message(STATUS " - AMD direct D3D11 support: enabled (found LIQUIDVR and AMD NDA submodule)") +else() + message(STATUS " - AMD direct support: disabled (need LIQUIDVR and AMD NDA submodule)") +endif() + +#----------------------------------------------------------------------------- +# SDL init/quit handler code that makes sure we only do it once. +if (SDL2_FOUND) + list(APPEND RenderManager_SOURCES osvr/RenderKit/RenderManagerSDLInitQuit.cpp osvr/RenderKit/RenderManagerSDLInitQuit.h ) +endif() + +#----------------------------------------------------------------------------- +# OpenGL library as a stand-alone renderer not wrapping D3D +if ( ( (OPENGL_FOUND AND GLEW_FOUND) OR OPENGLES2_FOUND ) AND SDL2_FOUND) + list(APPEND RenderManager_SOURCES osvr/RenderKit/RenderManagerOpenGL.cpp osvr/RenderKit/RenderManagerOpenGL.h osvr/RenderKit/RenderManagerOpenGLC.cpp) + message(STATUS " - OpenGL support: enabled") + set(RM_USE_OPENGL TRUE) + set(OSVRRM_HAVE_OPENGL_SUPPORT ON) + if (OPENGLES2_FOUND AND ANDROID) + message(STATUS " - OpenGLES2 support: enabled") + set(RM_USE_OPENGLES20 TRUE) + endif() +else() + message(STATUS " - OpenGL support: disabled)") +endif() + +#----------------------------------------------------------------------------- +# OpenGL wrapped around Direct3D +if ((RM_USE_NVIDIA_DIRECT_D3D11 OR RM_USE_AMD_DIRECT_D3D11) AND NOT RM_USE_OPENGLES20) + #----------------------------------------------------------------------------- + # OpenGL library as a wrapper for D3D DirectMode + if (OPENGL_FOUND AND GLEW_FOUND AND SDL2_FOUND) + message(STATUS " - D3D11+OpenGL support: enabled (found NVAPI or LIQUIDVR, OpenGL, GLEW, and SDL2)") + list(APPEND RenderManager_SOURCES osvr/RenderKit/RenderManagerD3DOpenGL.cpp osvr/RenderKit/RenderManagerD3DOpenGL.h) + set(RM_USE_NVIDIA_DIRECT_D3D11_OPENGL TRUE) + else() + message(STATUS " - Vendor direct D3D11+OpenGL support: disabled (need all of a vendor direct-mode D3D module, OpenGL, GLEW, and SDL2, at least one was missing)") + endif() +endif() + +### +# Set up build product locations +### +include(GNUInstallDirs) +# Sometimes GNUInstallDirs misses this one. +if(NOT CMAKE_INSTALL_DOCDIR) + set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}) +endif() + +# Win-specific: we want shared libs (dlls) in same dir as exe files. +if(WIN32) + set(OSVRRM_SHARED_LIBRARY_DIR "${CMAKE_INSTALL_BINDIR}") +else() + set(OSVRRM_SHARED_LIBRARY_DIR "${CMAKE_INSTALL_LIBDIR}") +endif() + +# Let's build into a parallel(ish) structure as we'll install to. +if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") +endif() +if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${OSVRRM_SHARED_LIBRARY_DIR}") +endif() +if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}") +endif() + +### +# Helper for dependencies +### +include(CopyImportedTarget) +## Copy and install shared libraries from imported targets as required +function(osvrrm_copy_deps) + copy_imported_targets(osvrRenderManager ${ARGN}) + foreach(_dep ${ARGN}) + install_imported_target(${_dep} DESTINATION ${OSVRRM_SHARED_LIBRARY_DIR} COMPONENT Runtime) + endforeach() +endfunction() + +### +# Build the actual library +### + +# Generate the header with the defines we need. +configure_file(RenderManagerBackends.h.in "${CMAKE_CURRENT_BINARY_DIR}/RenderManagerBackends.h") + +set (RenderManager_PUBLIC_HEADERS + osvr/RenderKit/RenderManager.h + osvr/RenderKit/RenderManagerC.h + osvr/RenderKit/RenderManagerD3D11C.h + osvr/RenderKit/RenderManagerOpenGLC.h + osvr/RenderKit/GraphicsLibraryD3D11.h + osvr/RenderKit/GraphicsLibraryOpenGL.h + osvr/RenderKit/MonoPointMeshTypes.h + osvr/RenderKit/RGBPointMeshTypes.h + osvr/RenderKit/RenderKitGraphicsTransforms.h + osvr/RenderKit/RenderKitGraphicsTransformsC.h + osvr/RenderKit/osvr_display_configuration.h + osvr/RenderKit/osvr_compiler_tests.h + "${CMAKE_CURRENT_BINARY_DIR}/osvr/RenderKit/Export.h" +) +add_library(osvrRenderManager ${RenderManager_SOURCES} ${RenderManager_PUBLIC_HEADERS}) +if (NOT ANDROID) + target_compile_features(osvrRenderManager PRIVATE cxx_range_for) +endif() +target_include_directories(osvrRenderManager PUBLIC + $ + $ + $ + PRIVATE + ${EIGEN3_INCLUDE_DIR}) +if (RM_USE_NVIDIA_DIRECT_D3D11) + target_link_libraries(osvrRenderManager + PRIVATE + osvrRM-nvidia-requirements) +endif() +if (RM_USE_AMD_DIRECT_D3D11) + target_link_libraries(osvrRenderManager + PRIVATE + osvrRM-amd-requirements) +endif() +if (WIN32) + target_link_libraries(osvrRenderManager PRIVATE D3D11) +endif() + +set(LIBNAME_FULL osvrRenderManager) +set(EXPORT_BASENAME OSVR_RENDERMANAGER) +configure_file("Export.h.in" + osvr/RenderKit/Export.h + @ONLY NEWLINE_STYLE LF) + +if(NOT BUILD_SHARED_LIBS) + target_compile_definitions(osvrRenderManager PUBLIC OSVR_RENDERMANAGER_STATIC_DEFINE) +endif() + +set_property(TARGET + osvrRenderManager + PROPERTY + PUBLIC_HEADER + ${RenderManager_PUBLIC_HEADERS}) + +# If we are using dynamic GLEW on Windows, let's copy it. +if(GLEW_FOUND AND WIN32 AND NOT GLEW_LIBRARY MATCHES ".*s.lib") + osvrrm_copy_deps(GLEW::GLEW) +endif() + +if (OPENGL_FOUND) + target_include_directories(osvrRenderManager PRIVATE ${OPENGL_INCLUDE_DIRS}) + target_link_libraries(osvrRenderManager PRIVATE ${OPENGL_LIBRARY}) +endif() + +if (ANDROID) + target_include_directories(osvrRenderManager PRIVATE ${OPENGLES2_INCLUDE_DIR}) + target_link_libraries(osvrRenderManager PRIVATE ${OPENGLES2_LIBRARIES}) + target_link_libraries(osvrRenderManager PRIVATE android) +endif() + +if (GLEW_FOUND) + target_link_libraries(osvrRenderManager PRIVATE GLEW::GLEW) +endif() + +if (SDL2_FOUND) + target_link_libraries(osvrRenderManager PRIVATE SDL2::SDL2) +endif() + +if(SDL2_DYNAMIC AND WIN32) + osvrrm_copy_deps(SDL2::SDL2) +endif() + +# This also lets it know where to find the header files. +target_link_libraries(osvrRenderManager + PUBLIC + osvr::osvrClientKitCpp + PRIVATE + JsonCpp::JsonCpp + osvr::osvrClient + vendored-vrpn + vendored-quat) +osvrrm_copy_deps(osvr::osvrClientKit osvr::osvrClient osvr::osvrCommon osvr::osvrUtil) + +# Add the C++ interface target. +add_library(osvrRenderManagerCpp INTERFACE) +target_link_libraries(osvrRenderManagerCpp INTERFACE osvrRenderManager osvr::osvrClientKitCpp) + +# Alias targets, so the examples can be used as-is. +add_library(osvrRM::osvrRenderManager ALIAS osvrRenderManager) +add_library(osvrRM::osvrRenderManagerCpp ALIAS osvrRenderManagerCpp) + + +if(WIN32) + # Install d3dcompiler_47 + install(FILES ${DIRECT3D_COMPILER_REDISTRIBUTABLE} + DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() + +# The goal with this variable is so that the same CMakeLists file that is used to build +# the examples in-tree can be shipped to build the examples out-of-tree. +set(OSVRRM_INSTALL_EXAMPLES ON) +add_subdirectory(examples) + +install(TARGETS + osvrRenderManager + EXPORT ${PROJECT_NAME} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + PUBLIC_HEADER DESTINATION include/osvr/RenderKit +) + +install(EXPORT + ${PROJECT_NAME} + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} + FILE ${PROJECT_NAME}Config.cmake +) + +if (NVAPI_FOUND AND HAVE_NVIDIA_NDA_SUBMODULE) + set(NVAPI_EXTRA_HEADERS "${NVIDIA_SRC_DIR}/CheckSuccess.h" "${NVIDIA_SRC_DIR}/Util.h" "${NVIDIA_SRC_DIR}/NVAPIWrappers.h") + + #----------------------------------------------------------------------------- + # Enable DirectMode on attached OSVR HDKs + add_executable(EnableOSVRDirectMode "${NVIDIA_SRC_DIR}/EnableOSVRDirectMode.cpp" ${NVAPI_EXTRA_HEADERS}) + target_link_libraries(EnableOSVRDirectMode PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-nvidia-requirements) + + #----------------------------------------------------------------------------- + # Disable DirectMode on attached OSVR HDKs + add_executable(DisableOSVRDirectMode "${NVIDIA_SRC_DIR}/DisableOSVRDirectMode.cpp" ${NVAPI_EXTRA_HEADERS}) + target_link_libraries(DisableOSVRDirectMode PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-nvidia-requirements) + + #----------------------------------------------------------------------------- + # Debugging/troubleshooting application for direct mode. + add_executable(DirectModeDebugging "${NVIDIA_SRC_DIR}/DirectModeDebugging.cpp" ${NVAPI_EXTRA_HEADERS}) + target_link_libraries(DirectModeDebugging PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-nvidia-requirements) + + install(TARGETS EnableOSVRDirectMode DisableOSVRDirectMode DirectModeDebugging RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() + +if (LIQUIDVR_FOUND AND HAVE_AMD_NDA_SUBMODULE) + + #----------------------------------------------------------------------------- + # Enable DirectMode on attached OSVR HDKs + add_executable(EnableOSVRDirectModeAMD "${AMD_SRC_DIR}/EnableOSVRDirectModeAMD.cpp") + target_link_libraries(EnableOSVRDirectModeAMD PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-amd-requirements) + + #----------------------------------------------------------------------------- + # Disable DirectMode on attached OSVR HDKs + add_executable(DisableOSVRDirectModeAMD "${AMD_SRC_DIR}/DisableOSVRDirectModeAMD.cpp") + target_link_libraries(DisableOSVRDirectModeAMD PRIVATE osvr::osvrClientKitCpp osvrRenderManagerCpp osvrRM-amd-requirements) + + install(TARGETS EnableOSVRDirectModeAMD DisableOSVRDirectModeAMD RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() diff --git a/cmake/Findliquidvr.cmake b/cmake/Findliquidvr.cmake index 3921a5d..c5e6572 100755 --- a/cmake/Findliquidvr.cmake +++ b/cmake/Findliquidvr.cmake @@ -1,54 +1,54 @@ -# - Find liquidvr -# Find the liquidvr header. -# -# LIQUIDVR_INCLUDE_DIRS - where to find LiquidVRD2D.h -# LIQUIDVR_FOUND - True if liquidvr found. -# -# Creates an "liquidvr" interface target with the include dir -# that you can link against instead of using the above variables. -# -# Original Author: -# 2016 Russ Taylor working through ReliaSolve for Sensics. -# -# Copyright Sensics, Inc. 2016. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -set(LIQUIDVR_ROOT_DIR - "${LIQUIDVR_ROOT_DIR}" - CACHE - PATH - "Path to search for liquidvr library") - -# Look for the header file. -find_path(LIQUIDVR_INCLUDE_DIR - NAMES - LiquidVRD2D.h - PATH_SUFFIXES - include - inc - PATHS - "${LIQUIDVR_ROOT_DIR}") - -# handle the QUIETLY and REQUIRED arguments and set LIQUIDVR_FOUND to TRUE if -# all listed variables are TRUE -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(liquidvr - REQUIRED_VARS LIQUIDVR_INCLUDE_DIR - HANDLE_COMPONENTS) - -if(LIQUIDVR_FOUND) - set(LIQUIDVR_INCLUDE_DIRS ${LIQUIDVR_INCLUDE_DIR}) - if(NOT TARGET liquidvr) - add_library(liquidvr INTERFACE) - target_include_directories(liquidvr INTERFACE "${LIQUIDVR_INCLUDE_DIR}") - endif() - mark_as_advanced(LIQUIDVR_ROOT_DIR) -else() - set(LIQUIDVR_INCLUDE_DIRS) - set(LIQUIDVR_ROOT_DIR LIQUIDVR_ROOT_DIR_NOTFOUND) - mark_as_advanced(CLEAR LIQUIDVR_ROOT_DIR) -endif() - -mark_as_advanced(LIQUIDVR_LIBRARY LIQUIDVR_INCLUDE_DIR) +# - Find liquidvr +# Find the liquidvr header. +# +# LIQUIDVR_INCLUDE_DIRS - where to find LiquidVRD2D.h +# LIQUIDVR_FOUND - True if liquidvr found. +# +# Creates an "liquidvr" interface target with the include dir +# that you can link against instead of using the above variables. +# +# Original Author: +# 2016 Russ Taylor working through ReliaSolve for Sensics. +# +# Copyright Sensics, Inc. 2016. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +set(LIQUIDVR_ROOT_DIR + "${LIQUIDVR_ROOT_DIR}" + CACHE + PATH + "Path to search for liquidvr library") + +# Look for the header file. +find_path(LIQUIDVR_INCLUDE_DIR + NAMES + LiquidVRD2D.h + PATH_SUFFIXES + include + inc + PATHS + "${LIQUIDVR_ROOT_DIR}") + +# handle the QUIETLY and REQUIRED arguments and set LIQUIDVR_FOUND to TRUE if +# all listed variables are TRUE +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(liquidvr + REQUIRED_VARS LIQUIDVR_INCLUDE_DIR + HANDLE_COMPONENTS) + +if(LIQUIDVR_FOUND) + set(LIQUIDVR_INCLUDE_DIRS ${LIQUIDVR_INCLUDE_DIR}) + if(NOT TARGET liquidvr) + add_library(liquidvr INTERFACE) + target_include_directories(liquidvr INTERFACE "${LIQUIDVR_INCLUDE_DIR}") + endif() + mark_as_advanced(LIQUIDVR_ROOT_DIR) +else() + set(LIQUIDVR_INCLUDE_DIRS) + set(LIQUIDVR_ROOT_DIR LIQUIDVR_ROOT_DIR_NOTFOUND) + mark_as_advanced(CLEAR LIQUIDVR_ROOT_DIR) +endif() + +mark_as_advanced(LIQUIDVR_LIBRARY LIQUIDVR_INCLUDE_DIR) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cd87116..9516acf 100755 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,236 +1,236 @@ - -set(COMMON_D3D_SOURCES - D3DCube.h - D3DSimpleShader.h - pixelshader3d.h - vertexshader3d.h) -set(COMMON_D3D_2D_SOURCES - pixelshader.h - vertexshader.h) - -# D3D -if(OSVRRM_HAVE_D3D11_SUPPORT) - #----------------------------------------------------------------------------- - # D3D program that has an adjustable rendering delay, useful for testing the - # impact of various latency-hiding techniques. - add_executable(AdjustableRenderingDelayD3D AdjustableRenderingDelayD3D.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(AdjustableRenderingDelayD3D PRIVATE osvrRM::osvrRenderManagerCpp) - target_compile_features(AdjustableRenderingDelayD3D PRIVATE cxx_range_for) - - # D3D Example program using the C API - add_executable(RenderManagerD3DCAPIExample RenderManagerD3DCAPIExample.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(RenderManagerD3DCAPIExample PRIVATE osvrRM::osvrRenderManagerCpp) - target_compile_features(RenderManagerD3DCAPIExample PRIVATE cxx_range_for) - - # D3D Example program - add_executable(RenderManagerD3DExample3D RenderManagerD3DExample3D.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(RenderManagerD3DExample3D PRIVATE osvrRM::osvrRenderManagerCpp) - target_compile_features(RenderManagerD3DExample3D PRIVATE cxx_range_for) - - # D3D Example program using Present mode - add_executable(RenderManagerD3DPresentExample3D RenderManagerD3DPresentExample3D.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(RenderManagerD3DPresentExample3D PRIVATE osvrRM::osvrRenderManagerCpp) - target_compile_features(RenderManagerD3DPresentExample3D PRIVATE cxx_range_for) - - # D3D Example program using Present mode that also passes in device and context - add_executable(RenderManagerD3DPresentMakeDeviceExample3D RenderManagerD3DPresentMakeDeviceExample3D.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(RenderManagerD3DPresentMakeDeviceExample3D PRIVATE osvrRM::osvrRenderManagerCpp D3D11) - target_compile_features(RenderManagerD3DPresentMakeDeviceExample3D PRIVATE cxx_range_for) - - # D3D Example program using Present mode that also passes in device and context and works with ATW - add_executable(RenderManagerD3DATWDoubleBufferExample RenderManagerD3DATWDoubleBufferExample.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(RenderManagerD3DATWDoubleBufferExample PRIVATE osvrRM::osvrRenderManagerCpp D3D11) - target_compile_features(RenderManagerD3DATWDoubleBufferExample PRIVATE cxx_range_for) - - # D3D Example program using Present mode - add_executable(RenderManagerD3DPresentSideBySideExample RenderManagerD3DPresentSideBySideExample.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(RenderManagerD3DPresentSideBySideExample PRIVATE osvrRM::osvrRenderManagerCpp) - target_compile_features(RenderManagerD3DPresentSideBySideExample PRIVATE cxx_range_for) - - #----------------------------------------------------------------------------- - # D3D Test program (basic 2D test) - add_executable(RenderManagerD3DTest2D RenderManagerD3DTest2D.cpp ${COMMON_D3D_2D_SOURCES}) - target_link_libraries(RenderManagerD3DTest2D PRIVATE osvrRM::osvrRenderManagerCpp) - target_compile_features(RenderManagerD3DTest2D PRIVATE cxx_range_for) - - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - AdjustableRenderingDelayD3D - RenderManagerD3DExample3D - RenderManagerD3DPresentExample3D - RenderManagerD3DPresentMakeDeviceExample3D - RenderManagerD3DPresentSideBySideExample - RenderManagerD3DTest2D - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() - - #----------------------------------------------------------------------------- - # Latency test program - add_executable(LatencyTestD3DExample LatencyTestD3DExample.cpp ${COMMON_D3D_2D_SOURCES}) - target_link_libraries(LatencyTestD3DExample PRIVATE osvrRM::osvrRenderManagerCpp vendored-quat) - target_compile_features(LatencyTestD3DExample PRIVATE cxx_range_for) - - # D3D Example program - add_executable(RenderManagerD3DHeadSpaceExample RenderManagerD3DHeadSpaceExample.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(RenderManagerD3DHeadSpaceExample PRIVATE osvrRM::osvrRenderManagerCpp vendored-quat) - target_compile_features(RenderManagerD3DHeadSpaceExample PRIVATE cxx_range_for) - - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - LatencyTestD3DExample - RenderManagerD3DHeadSpaceExample - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() - - #----------------------------------------------------------------------------- - # D3D program that spins the world cube at a constant rate, useful for testing the - # steadiness of the rendering in the absence of motion. - add_executable(SpinCubeD3D SpinCubeD3D.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(SpinCubeD3D PRIVATE osvrRM::osvrRenderManagerCpp vendored-vrpn vendored-quat) - target_compile_features(SpinCubeD3D PRIVATE cxx_range_for) - - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - SpinCubeD3D - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() - - #----------------------------------------------------------------------------- - # D3D program that restarts the RenderManager every once in a while. For - # the display, it spins the world cube at a constant rate, useful for testing the - # steadiness of the rendering in the absence of motion. - add_executable(RestartD3D RestartD3D.cpp ${COMMON_D3D_SOURCES}) - target_link_libraries(RestartD3D PRIVATE osvrRM::osvrRenderManagerCpp vendored-vrpn vendored-quat D3D11) - target_compile_features(RestartD3D PRIVATE cxx_range_for) - - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - RestartD3D - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() -endif() - -if(OSVRRM_HAVE_OPENGL_SUPPORT AND OPENGL_FOUND) - # Convenience target to link all we need for basic OpenGL stuff. - add_library(convenience_gldeps INTERFACE) - target_link_libraries(convenience_gldeps INTERFACE ${OPENGL_LIBRARY}) - target_include_directories(convenience_gldeps INTERFACE ${OPENGL_INCLUDE_DIRS}) - - if (NOT APPLE) - #----------------------------------------------------------------------------- - # OpenGL Example program - add_executable(RenderManagerOpenGLExample RenderManagerOpenGLExample.cpp) - target_link_libraries(RenderManagerOpenGLExample PRIVATE osvrRM::osvrRenderManagerCpp convenience_gldeps) - target_compile_features(RenderManagerOpenGLExample PRIVATE cxx_range_for) - - #----------------------------------------------------------------------------- - # OpenGL Example program - add_executable(RenderManagerOpenGLHeadSpaceExample RenderManagerOpenGLHeadSpaceExample.cpp) - target_link_libraries(RenderManagerOpenGLHeadSpaceExample PRIVATE osvrRM::osvrRenderManagerCpp convenience_gldeps) - target_compile_features(RenderManagerOpenGLHeadSpaceExample PRIVATE cxx_range_for) - - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - RenderManagerOpenGLExample - RenderManagerOpenGLHeadSpaceExample - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() - endif() -endif() - -if(OSVRRM_HAVE_OPENGL_SUPPORT AND GLEW_FOUND) - - #----------------------------------------------------------------------------- - # OpenGL Example program using the OpenGL Core profile - add_executable(RenderManagerOpenGLCoreExample RenderManagerOpenGLCoreExample.cpp) - target_link_libraries(RenderManagerOpenGLCoreExample PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW convenience_gldeps) - target_compile_features(RenderManagerOpenGLCoreExample PRIVATE cxx_range_for) - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - RenderManagerOpenGLCoreExample - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() - - if (SDL2_FOUND) - #----------------------------------------------------------------------------- - # OpenGL Example program using the OpenGL Core profile and a shared context - add_executable(RenderManagerOpenGLSharedContextExample RenderManagerOpenGLSharedContextExample.cpp) - target_link_libraries(RenderManagerOpenGLSharedContextExample PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW SDL2::SDL2 convenience_gldeps) - target_compile_features(RenderManagerOpenGLSharedContextExample PRIVATE cxx_range_for) - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - RenderManagerOpenGLSharedContextExample - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() - endif() - - if (NOT APPLE) - #----------------------------------------------------------------------------- - # OpenGL program that has an adjustable rendering delay, useful for testing the - # impact of various latency-hiding techniques. - add_executable(AdjustableRenderingDelayOpenGL AdjustableRenderingDelayOpenGL.cpp) - target_link_libraries(AdjustableRenderingDelayOpenGL PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW convenience_gldeps) - target_compile_features(AdjustableRenderingDelayOpenGL PRIVATE cxx_range_for) - - #----------------------------------------------------------------------------- - # OpenGL Example program that uses the Get()/Present() interface, not Render(). - add_executable(RenderManagerOpenGLPresentExample RenderManagerOpenGLPresentExample.cpp) - target_link_libraries(RenderManagerOpenGLPresentExample PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW convenience_gldeps) - target_compile_features(RenderManagerOpenGLPresentExample PRIVATE cxx_range_for) - - #----------------------------------------------------------------------------- - # OpenGL Example program that uses the Get()/Present() interface, not Render(). - add_executable(RenderManagerOpenGLPresentSideBySideExample RenderManagerOpenGLPresentSideBySideExample.cpp) - target_link_libraries(RenderManagerOpenGLPresentSideBySideExample PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW convenience_gldeps) - target_compile_features(RenderManagerOpenGLPresentSideBySideExample PRIVATE cxx_range_for) - - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - AdjustableRenderingDelayOpenGL - RenderManagerOpenGLPresentExample - RenderManagerOpenGLPresentSideBySideExample - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() - endif() -endif() - -if(RM_USE_OPENGLES20) - #----------------------------------------------------------------------------- - # OpenGLES 2.0 Example program - add_executable(RenderManagerOpenGLES2Example RenderManagerOpenGLES2Example.cpp) - target_link_libraries(RenderManagerOpenGLES2Example PRIVATE osvrRM::osvrRenderManagerCpp ${OPENGLES2_LIBRARIES}) - - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - RenderManagerOpenGLES2Example - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() -endif() - -if(OSVRRM_HAVE_OPENGL_SUPPORT AND OPENGL_FOUND AND NOT APPLE) - #----------------------------------------------------------------------------- - # OpenGL program that spins the world cube at a constant rate, useful for testing the - # steadiness of the rendering in the absence of motion. - add_executable(SpinCubeOpenGL SpinCubeOpenGL.cpp font.c) - target_link_libraries(SpinCubeOpenGL PRIVATE osvrRM::osvrRenderManagerCpp convenience_gldeps vendored-vrpn vendored-quat) - target_compile_features(SpinCubeOpenGL PRIVATE cxx_range_for) - - if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - SpinCubeOpenGL - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - endif() -endif() - -#----------------------------------------------------------------------------- -# Program that changes the solid color sent to a display. -add_executable(SolidColor SolidColor.cpp) -target_link_libraries(SolidColor PRIVATE osvrRM::osvrRenderManagerCpp vendored-vrpn vendored-quat) -target_compile_features(SolidColor PRIVATE cxx_range_for) - -if(OSVRRM_INSTALL_EXAMPLES) - install(TARGETS - SolidColor - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) -endif() - + +set(COMMON_D3D_SOURCES + D3DCube.h + D3DSimpleShader.h + pixelshader3d.h + vertexshader3d.h) +set(COMMON_D3D_2D_SOURCES + pixelshader.h + vertexshader.h) + +# D3D +if(OSVRRM_HAVE_D3D11_SUPPORT) + #----------------------------------------------------------------------------- + # D3D program that has an adjustable rendering delay, useful for testing the + # impact of various latency-hiding techniques. + add_executable(AdjustableRenderingDelayD3D AdjustableRenderingDelayD3D.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(AdjustableRenderingDelayD3D PRIVATE osvrRM::osvrRenderManagerCpp) + target_compile_features(AdjustableRenderingDelayD3D PRIVATE cxx_range_for) + + # D3D Example program using the C API + add_executable(RenderManagerD3DCAPIExample RenderManagerD3DCAPIExample.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(RenderManagerD3DCAPIExample PRIVATE osvrRM::osvrRenderManagerCpp) + target_compile_features(RenderManagerD3DCAPIExample PRIVATE cxx_range_for) + + # D3D Example program + add_executable(RenderManagerD3DExample3D RenderManagerD3DExample3D.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(RenderManagerD3DExample3D PRIVATE osvrRM::osvrRenderManagerCpp) + target_compile_features(RenderManagerD3DExample3D PRIVATE cxx_range_for) + + # D3D Example program using Present mode + add_executable(RenderManagerD3DPresentExample3D RenderManagerD3DPresentExample3D.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(RenderManagerD3DPresentExample3D PRIVATE osvrRM::osvrRenderManagerCpp) + target_compile_features(RenderManagerD3DPresentExample3D PRIVATE cxx_range_for) + + # D3D Example program using Present mode that also passes in device and context + add_executable(RenderManagerD3DPresentMakeDeviceExample3D RenderManagerD3DPresentMakeDeviceExample3D.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(RenderManagerD3DPresentMakeDeviceExample3D PRIVATE osvrRM::osvrRenderManagerCpp D3D11) + target_compile_features(RenderManagerD3DPresentMakeDeviceExample3D PRIVATE cxx_range_for) + + # D3D Example program using Present mode that also passes in device and context and works with ATW + add_executable(RenderManagerD3DATWDoubleBufferExample RenderManagerD3DATWDoubleBufferExample.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(RenderManagerD3DATWDoubleBufferExample PRIVATE osvrRM::osvrRenderManagerCpp D3D11) + target_compile_features(RenderManagerD3DATWDoubleBufferExample PRIVATE cxx_range_for) + + # D3D Example program using Present mode + add_executable(RenderManagerD3DPresentSideBySideExample RenderManagerD3DPresentSideBySideExample.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(RenderManagerD3DPresentSideBySideExample PRIVATE osvrRM::osvrRenderManagerCpp) + target_compile_features(RenderManagerD3DPresentSideBySideExample PRIVATE cxx_range_for) + + #----------------------------------------------------------------------------- + # D3D Test program (basic 2D test) + add_executable(RenderManagerD3DTest2D RenderManagerD3DTest2D.cpp ${COMMON_D3D_2D_SOURCES}) + target_link_libraries(RenderManagerD3DTest2D PRIVATE osvrRM::osvrRenderManagerCpp) + target_compile_features(RenderManagerD3DTest2D PRIVATE cxx_range_for) + + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + AdjustableRenderingDelayD3D + RenderManagerD3DExample3D + RenderManagerD3DPresentExample3D + RenderManagerD3DPresentMakeDeviceExample3D + RenderManagerD3DPresentSideBySideExample + RenderManagerD3DTest2D + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + + #----------------------------------------------------------------------------- + # Latency test program + add_executable(LatencyTestD3DExample LatencyTestD3DExample.cpp ${COMMON_D3D_2D_SOURCES}) + target_link_libraries(LatencyTestD3DExample PRIVATE osvrRM::osvrRenderManagerCpp vendored-quat) + target_compile_features(LatencyTestD3DExample PRIVATE cxx_range_for) + + # D3D Example program + add_executable(RenderManagerD3DHeadSpaceExample RenderManagerD3DHeadSpaceExample.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(RenderManagerD3DHeadSpaceExample PRIVATE osvrRM::osvrRenderManagerCpp vendored-quat) + target_compile_features(RenderManagerD3DHeadSpaceExample PRIVATE cxx_range_for) + + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + LatencyTestD3DExample + RenderManagerD3DHeadSpaceExample + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + + #----------------------------------------------------------------------------- + # D3D program that spins the world cube at a constant rate, useful for testing the + # steadiness of the rendering in the absence of motion. + add_executable(SpinCubeD3D SpinCubeD3D.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(SpinCubeD3D PRIVATE osvrRM::osvrRenderManagerCpp vendored-vrpn vendored-quat) + target_compile_features(SpinCubeD3D PRIVATE cxx_range_for) + + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + SpinCubeD3D + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + + #----------------------------------------------------------------------------- + # D3D program that restarts the RenderManager every once in a while. For + # the display, it spins the world cube at a constant rate, useful for testing the + # steadiness of the rendering in the absence of motion. + add_executable(RestartD3D RestartD3D.cpp ${COMMON_D3D_SOURCES}) + target_link_libraries(RestartD3D PRIVATE osvrRM::osvrRenderManagerCpp vendored-vrpn vendored-quat D3D11) + target_compile_features(RestartD3D PRIVATE cxx_range_for) + + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + RestartD3D + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() +endif() + +if(OSVRRM_HAVE_OPENGL_SUPPORT AND OPENGL_FOUND) + # Convenience target to link all we need for basic OpenGL stuff. + add_library(convenience_gldeps INTERFACE) + target_link_libraries(convenience_gldeps INTERFACE ${OPENGL_LIBRARY}) + target_include_directories(convenience_gldeps INTERFACE ${OPENGL_INCLUDE_DIRS}) + + if (NOT APPLE) + #----------------------------------------------------------------------------- + # OpenGL Example program + add_executable(RenderManagerOpenGLExample RenderManagerOpenGLExample.cpp) + target_link_libraries(RenderManagerOpenGLExample PRIVATE osvrRM::osvrRenderManagerCpp convenience_gldeps) + target_compile_features(RenderManagerOpenGLExample PRIVATE cxx_range_for) + + #----------------------------------------------------------------------------- + # OpenGL Example program + add_executable(RenderManagerOpenGLHeadSpaceExample RenderManagerOpenGLHeadSpaceExample.cpp) + target_link_libraries(RenderManagerOpenGLHeadSpaceExample PRIVATE osvrRM::osvrRenderManagerCpp convenience_gldeps) + target_compile_features(RenderManagerOpenGLHeadSpaceExample PRIVATE cxx_range_for) + + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + RenderManagerOpenGLExample + RenderManagerOpenGLHeadSpaceExample + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + endif() +endif() + +if(OSVRRM_HAVE_OPENGL_SUPPORT AND GLEW_FOUND) + + #----------------------------------------------------------------------------- + # OpenGL Example program using the OpenGL Core profile + add_executable(RenderManagerOpenGLCoreExample RenderManagerOpenGLCoreExample.cpp) + target_link_libraries(RenderManagerOpenGLCoreExample PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW convenience_gldeps) + target_compile_features(RenderManagerOpenGLCoreExample PRIVATE cxx_range_for) + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + RenderManagerOpenGLCoreExample + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + + if (SDL2_FOUND) + #----------------------------------------------------------------------------- + # OpenGL Example program using the OpenGL Core profile and a shared context + add_executable(RenderManagerOpenGLSharedContextExample RenderManagerOpenGLSharedContextExample.cpp) + target_link_libraries(RenderManagerOpenGLSharedContextExample PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW SDL2::SDL2 convenience_gldeps) + target_compile_features(RenderManagerOpenGLSharedContextExample PRIVATE cxx_range_for) + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + RenderManagerOpenGLSharedContextExample + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + endif() + + if (NOT APPLE) + #----------------------------------------------------------------------------- + # OpenGL program that has an adjustable rendering delay, useful for testing the + # impact of various latency-hiding techniques. + add_executable(AdjustableRenderingDelayOpenGL AdjustableRenderingDelayOpenGL.cpp) + target_link_libraries(AdjustableRenderingDelayOpenGL PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW convenience_gldeps) + target_compile_features(AdjustableRenderingDelayOpenGL PRIVATE cxx_range_for) + + #----------------------------------------------------------------------------- + # OpenGL Example program that uses the Get()/Present() interface, not Render(). + add_executable(RenderManagerOpenGLPresentExample RenderManagerOpenGLPresentExample.cpp) + target_link_libraries(RenderManagerOpenGLPresentExample PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW convenience_gldeps) + target_compile_features(RenderManagerOpenGLPresentExample PRIVATE cxx_range_for) + + #----------------------------------------------------------------------------- + # OpenGL Example program that uses the Get()/Present() interface, not Render(). + add_executable(RenderManagerOpenGLPresentSideBySideExample RenderManagerOpenGLPresentSideBySideExample.cpp) + target_link_libraries(RenderManagerOpenGLPresentSideBySideExample PRIVATE osvrRM::osvrRenderManagerCpp GLEW::GLEW convenience_gldeps) + target_compile_features(RenderManagerOpenGLPresentSideBySideExample PRIVATE cxx_range_for) + + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + AdjustableRenderingDelayOpenGL + RenderManagerOpenGLPresentExample + RenderManagerOpenGLPresentSideBySideExample + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + endif() +endif() + +if(RM_USE_OPENGLES20) + #----------------------------------------------------------------------------- + # OpenGLES 2.0 Example program + add_executable(RenderManagerOpenGLES2Example RenderManagerOpenGLES2Example.cpp) + target_link_libraries(RenderManagerOpenGLES2Example PRIVATE osvrRM::osvrRenderManagerCpp ${OPENGLES2_LIBRARIES}) + + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + RenderManagerOpenGLES2Example + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() +endif() + +if(OSVRRM_HAVE_OPENGL_SUPPORT AND OPENGL_FOUND AND NOT APPLE) + #----------------------------------------------------------------------------- + # OpenGL program that spins the world cube at a constant rate, useful for testing the + # steadiness of the rendering in the absence of motion. + add_executable(SpinCubeOpenGL SpinCubeOpenGL.cpp font.c) + target_link_libraries(SpinCubeOpenGL PRIVATE osvrRM::osvrRenderManagerCpp convenience_gldeps vendored-vrpn vendored-quat) + target_compile_features(SpinCubeOpenGL PRIVATE cxx_range_for) + + if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + SpinCubeOpenGL + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() +endif() + +#----------------------------------------------------------------------------- +# Program that changes the solid color sent to a display. +add_executable(SolidColor SolidColor.cpp) +target_link_libraries(SolidColor PRIVATE osvrRM::osvrRenderManagerCpp vendored-vrpn vendored-quat) +target_compile_features(SolidColor PRIVATE cxx_range_for) + +if(OSVRRM_INSTALL_EXAMPLES) + install(TARGETS + SolidColor + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() + diff --git a/examples/D3DCube.h b/examples/D3DCube.h index d0c1694..0a8896b 100755 --- a/examples/D3DCube.h +++ b/examples/D3DCube.h @@ -1,168 +1,168 @@ -// Copyright 2015 Sensics, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -class Cube { - public: - Cube(float scale, bool reverse = false) { - // This is a left-handed world, so we need to invert the Z - // values with respect to the right-handed coordinates used - // in the OpenGL sample program - vertices = {// VERTEX COLOR - {{scale, scale, -scale}, {1.0, 0.0, 0.0, 1.0f}}, // +X - {{scale, -scale, scale}, {1.0, 0.0, 0.0, 1.0f}}, - {{scale, scale, scale}, {1.0, 0.0, 0.0, 1.0f}}, - - {{scale, -scale, scale}, {1.0, 0.0, 0.0, 1.0f}}, - {{scale, scale, -scale}, {1.0, 0.0, 0.0, 1.0f}}, - {{scale, -scale, -scale}, {1.0, 0.0, 0.0, 1.0f}}, - - {{-scale, -scale, scale}, {1.0, 0.0, 1.0, 1.0f}}, // -X - {{-scale, -scale, -scale}, {1.0, 0.0, 1.0, 1.0f}}, - {{-scale, scale, -scale}, {1.0, 0.0, 1.0, 1.0f}}, - - {{-scale, -scale, scale}, {1.0, 0.0, 1.0, 1.0f}}, - {{-scale, scale, -scale}, {1.0, 0.0, 1.0, 1.0f}}, - {{-scale, scale, scale}, {1.0, 0.0, 1.0, 1.0f}}, - - {{scale, scale, -scale}, {0.0, 1.0, 0.0, 1.0f}}, // +Y - {{scale, scale, scale}, {0.0, 1.0, 0.0, 1.0f}}, - {{-scale, scale, scale}, {0.0, 1.0, 0.0, 1.0f}}, - - {{scale, scale, -scale}, {0.0, 1.0, 0.0, 1.0f}}, - {{-scale, scale, scale}, {0.0, 1.0, 0.0, 1.0f}}, - {{-scale, scale, -scale}, {0.0, 1.0, 0.0, 1.0f}}, - - {{scale, -scale, -scale}, {1.0, 1.0, 0.0, 1.0f}}, // -Y - {{-scale, -scale, scale}, {1.0, 1.0, 0.0, 1.0f}}, - {{scale, -scale, scale}, {1.0, 1.0, 0.0, 1.0f}}, - - {{scale, -scale, -scale}, {1.0, 1.0, 0.0, 1.0f}}, - {{-scale, -scale, -scale}, {1.0, 1.0, 0.0, 1.0f}}, - {{-scale, -scale, scale}, {1.0, 1.0, 0.0, 1.0f}}, - - {{-scale, scale, -scale}, {0.0, 0.0, 1., 1.0f}}, // -Z - {{-scale, -scale, -scale}, {0.0, 0.0, 1., 1.0f}}, - {{scale, -scale, -scale}, {0.0, 0.0, 1., 1.0f}}, - - {{scale, scale, -scale}, {0.0, 0.0, 1., 1.0f}}, - {{-scale, scale, -scale}, {0.0, 0.0, 1., 1.0f}}, - {{scale, -scale, -scale}, {0.0, 0.0, 1., 1.0f}}, - - {{scale, scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, // +Z - {{-scale, -scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, - {{-scale, scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, - - {{scale, scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, - {{scale, -scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, - {{-scale, -scale, scale}, {0.0, 1.0, 1.0, 1.0f}}}; - // This is a left-handed world, so we need to invert the - // indices with respect to the OpenGL example so that our - // front-facing side remains the same. - indices = {47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, - - 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, - - 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, - - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; - - // if you want to render the inside of the box with backface culling - // turned on - // then pass true for reverse. - if (reverse) { - std::reverse(std::begin(indices), std::end(indices)); - } - } - - void init(ID3D11Device* device, ID3D11DeviceContext* context) { - if (!initialized) { - // Create the index buffer - CD3D11_BUFFER_DESC indexBufferDesc( - static_cast(sizeof(WORD) * indices.size()), - D3D11_BIND_INDEX_BUFFER); - D3D11_SUBRESOURCE_DATA indexResData = {&indices[0], 0, 0}; - auto hr = device->CreateBuffer(&indexBufferDesc, &indexResData, - indexBuffer.GetAddressOf()); - if (FAILED(hr)) { - throw std::runtime_error("Couldn't create index buffer"); - } - context->IASetIndexBuffer(indexBuffer.Get(), DXGI_FORMAT_R32_UINT, - 0); - - // Create the vertex buffer - CD3D11_BUFFER_DESC vertexBufferDesc( - static_cast(sizeof(SimpleVertex) * vertices.size()), - D3D11_BIND_VERTEX_BUFFER); - D3D11_SUBRESOURCE_DATA subResData = {&vertices[0], 0, 0}; - hr = device->CreateBuffer(&vertexBufferDesc, &subResData, - vertexBuffer.GetAddressOf()); - if (FAILED(hr)) { - throw std::runtime_error("Couldn't create vertex buffer"); - } - - UINT stride = sizeof(SimpleVertex); - UINT offset = 0; - context->IASetVertexBuffers(0, 1, vertexBuffer.GetAddressOf(), - &stride, &offset); - - // Create the input layout - D3D11_INPUT_ELEMENT_DESC layout[] = { - {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, - offsetof(SimpleVertex, Position), D3D11_INPUT_PER_VERTEX_DATA, - 0}, - {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, - offsetof(SimpleVertex, Color), D3D11_INPUT_PER_VERTEX_DATA, 0}, - }; - hr = device->CreateInputLayout(layout, _countof(layout), g_vs, - sizeof(g_vs), - vertexLayout.GetAddressOf()); - if (FAILED(hr)) { - throw std::runtime_error("Could not create input layout."); - } - context->IASetInputLayout(vertexLayout.Get()); - context->IASetPrimitiveTopology( - D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - initialized = true; - } - } - - void draw(ID3D11Device* device, ID3D11DeviceContext* context) { - UINT stride = sizeof(SimpleVertex); - UINT offset = 0; - - init(device, context); - context->IASetIndexBuffer(indexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0); - context->IASetVertexBuffers(0, 1, vertexBuffer.GetAddressOf(), &stride, - &offset); - context->IASetInputLayout(vertexLayout.Get()); - context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - context->DrawIndexed(static_cast(indices.size()), 0, 0); - } - - private: - Cube(const Cube&) = delete; - Cube& operator=(const Cube&) = delete; - - struct SimpleVertex { - XMFLOAT3 Position; - XMFLOAT4 Color; - }; - bool initialized = false; - std::vector vertices; - std::vector indices; - Microsoft::WRL::ComPtr vertexBuffer; - Microsoft::WRL::ComPtr vertexLayout; - Microsoft::WRL::ComPtr indexBuffer; -}; +// Copyright 2015 Sensics, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +class Cube { + public: + Cube(float scale, bool reverse = false) { + // This is a left-handed world, so we need to invert the Z + // values with respect to the right-handed coordinates used + // in the OpenGL sample program + vertices = {// VERTEX COLOR + {{scale, scale, -scale}, {1.0, 0.0, 0.0, 1.0f}}, // +X + {{scale, -scale, scale}, {1.0, 0.0, 0.0, 1.0f}}, + {{scale, scale, scale}, {1.0, 0.0, 0.0, 1.0f}}, + + {{scale, -scale, scale}, {1.0, 0.0, 0.0, 1.0f}}, + {{scale, scale, -scale}, {1.0, 0.0, 0.0, 1.0f}}, + {{scale, -scale, -scale}, {1.0, 0.0, 0.0, 1.0f}}, + + {{-scale, -scale, scale}, {1.0, 0.0, 1.0, 1.0f}}, // -X + {{-scale, -scale, -scale}, {1.0, 0.0, 1.0, 1.0f}}, + {{-scale, scale, -scale}, {1.0, 0.0, 1.0, 1.0f}}, + + {{-scale, -scale, scale}, {1.0, 0.0, 1.0, 1.0f}}, + {{-scale, scale, -scale}, {1.0, 0.0, 1.0, 1.0f}}, + {{-scale, scale, scale}, {1.0, 0.0, 1.0, 1.0f}}, + + {{scale, scale, -scale}, {0.0, 1.0, 0.0, 1.0f}}, // +Y + {{scale, scale, scale}, {0.0, 1.0, 0.0, 1.0f}}, + {{-scale, scale, scale}, {0.0, 1.0, 0.0, 1.0f}}, + + {{scale, scale, -scale}, {0.0, 1.0, 0.0, 1.0f}}, + {{-scale, scale, scale}, {0.0, 1.0, 0.0, 1.0f}}, + {{-scale, scale, -scale}, {0.0, 1.0, 0.0, 1.0f}}, + + {{scale, -scale, -scale}, {1.0, 1.0, 0.0, 1.0f}}, // -Y + {{-scale, -scale, scale}, {1.0, 1.0, 0.0, 1.0f}}, + {{scale, -scale, scale}, {1.0, 1.0, 0.0, 1.0f}}, + + {{scale, -scale, -scale}, {1.0, 1.0, 0.0, 1.0f}}, + {{-scale, -scale, -scale}, {1.0, 1.0, 0.0, 1.0f}}, + {{-scale, -scale, scale}, {1.0, 1.0, 0.0, 1.0f}}, + + {{-scale, scale, -scale}, {0.0, 0.0, 1., 1.0f}}, // -Z + {{-scale, -scale, -scale}, {0.0, 0.0, 1., 1.0f}}, + {{scale, -scale, -scale}, {0.0, 0.0, 1., 1.0f}}, + + {{scale, scale, -scale}, {0.0, 0.0, 1., 1.0f}}, + {{-scale, scale, -scale}, {0.0, 0.0, 1., 1.0f}}, + {{scale, -scale, -scale}, {0.0, 0.0, 1., 1.0f}}, + + {{scale, scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, // +Z + {{-scale, -scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, + {{-scale, scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, + + {{scale, scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, + {{scale, -scale, scale}, {0.0, 1.0, 1.0, 1.0f}}, + {{-scale, -scale, scale}, {0.0, 1.0, 1.0, 1.0f}}}; + // This is a left-handed world, so we need to invert the + // indices with respect to the OpenGL example so that our + // front-facing side remains the same. + indices = {47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, + + 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, + + 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, + + 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; + + // if you want to render the inside of the box with backface culling + // turned on + // then pass true for reverse. + if (reverse) { + std::reverse(std::begin(indices), std::end(indices)); + } + } + + void init(ID3D11Device* device, ID3D11DeviceContext* context) { + if (!initialized) { + // Create the index buffer + CD3D11_BUFFER_DESC indexBufferDesc( + static_cast(sizeof(WORD) * indices.size()), + D3D11_BIND_INDEX_BUFFER); + D3D11_SUBRESOURCE_DATA indexResData = {&indices[0], 0, 0}; + auto hr = device->CreateBuffer(&indexBufferDesc, &indexResData, + indexBuffer.GetAddressOf()); + if (FAILED(hr)) { + throw std::runtime_error("Couldn't create index buffer"); + } + context->IASetIndexBuffer(indexBuffer.Get(), DXGI_FORMAT_R32_UINT, + 0); + + // Create the vertex buffer + CD3D11_BUFFER_DESC vertexBufferDesc( + static_cast(sizeof(SimpleVertex) * vertices.size()), + D3D11_BIND_VERTEX_BUFFER); + D3D11_SUBRESOURCE_DATA subResData = {&vertices[0], 0, 0}; + hr = device->CreateBuffer(&vertexBufferDesc, &subResData, + vertexBuffer.GetAddressOf()); + if (FAILED(hr)) { + throw std::runtime_error("Couldn't create vertex buffer"); + } + + UINT stride = sizeof(SimpleVertex); + UINT offset = 0; + context->IASetVertexBuffers(0, 1, vertexBuffer.GetAddressOf(), + &stride, &offset); + + // Create the input layout + D3D11_INPUT_ELEMENT_DESC layout[] = { + {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, + offsetof(SimpleVertex, Position), D3D11_INPUT_PER_VERTEX_DATA, + 0}, + {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, + offsetof(SimpleVertex, Color), D3D11_INPUT_PER_VERTEX_DATA, 0}, + }; + hr = device->CreateInputLayout(layout, _countof(layout), g_vs, + sizeof(g_vs), + vertexLayout.GetAddressOf()); + if (FAILED(hr)) { + throw std::runtime_error("Could not create input layout."); + } + context->IASetInputLayout(vertexLayout.Get()); + context->IASetPrimitiveTopology( + D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + initialized = true; + } + } + + void draw(ID3D11Device* device, ID3D11DeviceContext* context) { + UINT stride = sizeof(SimpleVertex); + UINT offset = 0; + + init(device, context); + context->IASetIndexBuffer(indexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0); + context->IASetVertexBuffers(0, 1, vertexBuffer.GetAddressOf(), &stride, + &offset); + context->IASetInputLayout(vertexLayout.Get()); + context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + context->DrawIndexed(static_cast(indices.size()), 0, 0); + } + + private: + Cube(const Cube&) = delete; + Cube& operator=(const Cube&) = delete; + + struct SimpleVertex { + XMFLOAT3 Position; + XMFLOAT4 Color; + }; + bool initialized = false; + std::vector vertices; + std::vector indices; + Microsoft::WRL::ComPtr vertexBuffer; + Microsoft::WRL::ComPtr vertexLayout; + Microsoft::WRL::ComPtr indexBuffer; +}; diff --git a/examples/RenderManagerD3DATWDoubleBufferExample.cpp b/examples/RenderManagerD3DATWDoubleBufferExample.cpp index e735d32..556c31d 100755 --- a/examples/RenderManagerD3DATWDoubleBufferExample.cpp +++ b/examples/RenderManagerD3DATWDoubleBufferExample.cpp @@ -420,22 +420,22 @@ int main(int argc, char* argv[]) { return -3; } - // Register all of our constructed buffers so that we can use them for - // presentation, and promise not to re-use a buffer for rendering until - // we're not presenting it. + // Register all of our constructed buffers so that we can use them for + // presentation, and promise not to re-use a buffer for rendering until + // we're not presenting it. std::vector allBuffers; // Register our constructed buffers so that we can use them for // presentation. - for (size_t frame = 0; frame < frameInfo.size(); frame++) { - for (size_t buf = 0; buf < frameInfo[frame].renderBuffers.size(); buf++) { - allBuffers.push_back(frameInfo[frame].renderBuffers[buf]); - } - } - if (!render->RegisterRenderBuffers(allBuffers, true)) { - std::cerr << "RegisterRenderBuffers() returned false, cannot continue" << std::endl; - quit = true; - } - allBuffers.clear(); + for (size_t frame = 0; frame < frameInfo.size(); frame++) { + for (size_t buf = 0; buf < frameInfo[frame].renderBuffers.size(); buf++) { + allBuffers.push_back(frameInfo[frame].renderBuffers[buf]); + } + } + if (!render->RegisterRenderBuffers(allBuffers, true)) { + std::cerr << "RegisterRenderBuffers() returned false, cannot continue" << std::endl; + quit = true; + } + allBuffers.clear(); size_t iteration = 0; // Continue rendering until it is time to quit. diff --git a/examples/VertexShader3D.hlsl b/examples/VertexShader3D.hlsl index acc4396..2b22205 100755 --- a/examples/VertexShader3D.hlsl +++ b/examples/VertexShader3D.hlsl @@ -1,27 +1,27 @@ -cbuffer cbPerObject -{ - matrix projectionMatrix; - matrix viewMatrix; - matrix worldMatrix; -} - -struct VertexShaderInput -{ - float4 position : POSITION; - float4 color: COLOR0; -}; - -struct VertexShaderOutput -{ - float4 position : SV_POSITION; - float4 color : COLOR0; -}; - -VertexShaderOutput SimpleVertexShader(VertexShaderInput IN) -{ - VertexShaderOutput output; - matrix wvp = mul(projectionMatrix, mul(viewMatrix, worldMatrix)); - output.position = mul(wvp, IN.position); - output.color = IN.color; - return output; +cbuffer cbPerObject +{ + matrix projectionMatrix; + matrix viewMatrix; + matrix worldMatrix; +} + +struct VertexShaderInput +{ + float4 position : POSITION; + float4 color: COLOR0; +}; + +struct VertexShaderOutput +{ + float4 position : SV_POSITION; + float4 color : COLOR0; +}; + +VertexShaderOutput SimpleVertexShader(VertexShaderInput IN) +{ + VertexShaderOutput output; + matrix wvp = mul(projectionMatrix, mul(viewMatrix, worldMatrix)); + output.position = mul(wvp, IN.position); + output.color = IN.color; + return output; } \ No newline at end of file diff --git a/examples/font.c b/examples/font.c index 415aa25..7d85a13 100755 --- a/examples/font.c +++ b/examples/font.c @@ -1,202 +1,202 @@ -/* - * (c) Copyright 1993, Silicon Graphics, Inc. - * ALL RIGHTS RESERVED - * Permission to use, copy, modify, and distribute this software for - * any purpose and without fee is hereby granted, provided that the above - * copyright notice appear in all copies and that both the copyright notice - * and this permission notice appear in supporting documentation, and that - * the name of Silicon Graphics, Inc. not be used in advertising - * or publicity pertaining to distribution of the software without specific, - * written prior permission. - * - * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" - * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR - * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, - * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY - * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, - * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF - * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN - * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE - * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. - * - * US Government Users Restricted Rights - * Use, duplication, or disclosure by the Government is subject to - * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph - * (c)(1)(ii) of the Rights in Technical Data and Computer Software - * clause at DFARS 252.227-7013 and/or in similar or successor - * clauses in the FAR or the DOD or NASA FAR Supplement. - * Unpublished-- rights reserved under the copyright laws of the - * United States. Contractor/manufacturer is Silicon Graphics, - * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. - * - * OpenGL(TM) is a trademark of Silicon Graphics, Inc. - */ -/* - * font.c - * - * Draws some text in a bitmapped font. Uses glBitmap() - * and other pixel routines. Also demonstrates use of - * display lists. - */ -#include -#include -#include -#ifdef _WIN32 -#include -#endif -#ifdef __APPLE__ -#include -#else -#include -#endif - -static GLubyte rasters[][13] = { -{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, -{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36}, -{0x00, 0x00, 0x00, 0x66, 0x66, 0xff, 0x66, 0x66, 0xff, 0x66, 0x66, 0x00, 0x00}, -{0x00, 0x00, 0x18, 0x7e, 0xff, 0x1b, 0x1f, 0x7e, 0xf8, 0xd8, 0xff, 0x7e, 0x18}, -{0x00, 0x00, 0x0e, 0x1b, 0xdb, 0x6e, 0x30, 0x18, 0x0c, 0x76, 0xdb, 0xd8, 0x70}, -{0x00, 0x00, 0x7f, 0xc6, 0xcf, 0xd8, 0x70, 0x70, 0xd8, 0xcc, 0xcc, 0x6c, 0x38}, -{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1c, 0x0c, 0x0e}, -{0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c}, -{0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30}, -{0x00, 0x00, 0x00, 0x00, 0x99, 0x5a, 0x3c, 0xff, 0x3c, 0x5a, 0x99, 0x00, 0x00}, -{0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00}, -{0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0c, 0x0c, 0x06, 0x06, 0x03, 0x03}, -{0x00, 0x00, 0x3c, 0x66, 0xc3, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xc3, 0x66, 0x3c}, -{0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x38, 0x18}, -{0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0xe7, 0x7e}, -{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0x07, 0x03, 0x03, 0xe7, 0x7e}, -{0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xcc, 0x6c, 0x3c, 0x1c, 0x0c}, -{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, -{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, -{0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x03, 0x03, 0xff}, -{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e}, -{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x03, 0x7f, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e}, -{0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06}, -{0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60}, -{0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x0c, 0x06, 0x03, 0xc3, 0xc3, 0x7e}, -{0x00, 0x00, 0x3f, 0x60, 0xcf, 0xdb, 0xd3, 0xdd, 0xc3, 0x7e, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18}, -{0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, -{0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, -{0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc}, -{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, -{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff}, -{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, -{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, -{0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e}, -{0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}, -{0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3}, -{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, -{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3}, -{0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3}, -{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e}, -{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, -{0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c}, -{0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, -{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e}, -{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff}, -{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, -{0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, -{0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, -{0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, -{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, -{0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}, -{0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c}, -{0x00, 0x03, 0x03, 0x06, 0x06, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60}, -{0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c}, -{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18}, -{0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x30, 0x70}, -{0x00, 0x00, 0x7f, 0xc3, 0xc3, 0x7f, 0x03, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, -{0x00, 0x00, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x03, 0x03, 0x03, 0x03, 0x03}, -{0x00, 0x00, 0x7f, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x33, 0x1e}, -{0x7e, 0xc3, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0}, -{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00}, -{0x38, 0x6c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x00}, -{0x00, 0x00, 0xc6, 0xcc, 0xf8, 0xf0, 0xd8, 0xcc, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0}, -{0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78}, -{0x00, 0x00, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xfe, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00}, -{0xc0, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0x00, 0x00, 0x00, 0x00}, -{0x03, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xfe, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xfe, 0x03, 0x03, 0x7e, 0xc0, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x00}, -{0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xc3, 0xe7, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00}, -{0xc0, 0x60, 0x60, 0x30, 0x18, 0x3c, 0x66, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0xff, 0x60, 0x30, 0x18, 0x0c, 0x06, 0xff, 0x00, 0x00, 0x00, 0x00}, -{0x00, 0x00, 0x0f, 0x18, 0x18, 0x18, 0x38, 0xf0, 0x38, 0x18, 0x18, 0x18, 0x0f}, -{0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, -{0x00, 0x00, 0xf0, 0x18, 0x18, 0x18, 0x1c, 0x0f, 0x1c, 0x18, 0x18, 0x18, 0xf0}, -{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x8f, 0xf1, 0x60, 0x00, 0x00, 0x00} -}; - -// Spacing between two successive letters in the font. -// Default font is the only one supported, so we hard-code to 10 pixels. -// Actual font seems to be a 8x13 bitmap, encoded in the array above. -float getFontWidth() { return 10.0f; } - -/* This routine will load a font from the file whose name is passed - * to it as a parameter. If the name is a NULL pointer, then the default - * font is loaded. - * The return value is 0 if there is an error and a non-negative - * integer that represents this font on success. This integer should - * be saved to pass to drawStringInFont(). */ - -int loadFont (const char * filename) -{ - GLuint fontOffset; - GLuint i; - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - /* See if we are supposed to load the font from a file */ - if (filename != NULL) { /* Load from a file */ - fprintf(stderr, - "loadFont(): Loading from file not yet supported\n"); - return(0); - } else { /* Use the default font */ - if ( (fontOffset = glGenLists (128)) == 0) { - fprintf(stderr, - "loadFont(): Cannot allocate display lists\n"); - return(0); - } - for (i = 32; i < 127; i++) { - glNewList(i+fontOffset, GL_COMPILE); - glBitmap(8, 13, 0.0, 2.0, getFontWidth(), 0.0, rasters[i-32]); - glEndList(); - } - } - - return(fontOffset); -} - -void drawStringInFont (int fontOffset, const char * s) -{ - glPushAttrib(GL_LIST_BIT); - glListBase(fontOffset); - glCallLists((GLsizei)strlen(s), GL_UNSIGNED_BYTE, (GLubyte *) s); - - glPopAttrib (); -} - +/* + * (c) Copyright 1993, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * Permission to use, copy, modify, and distribute this software for + * any purpose and without fee is hereby granted, provided that the above + * copyright notice appear in all copies and that both the copyright notice + * and this permission notice appear in supporting documentation, and that + * the name of Silicon Graphics, Inc. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" + * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, + * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY + * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, + * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF + * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer Software + * clause at DFARS 252.227-7013 and/or in similar or successor + * clauses in the FAR or the DOD or NASA FAR Supplement. + * Unpublished-- rights reserved under the copyright laws of the + * United States. Contractor/manufacturer is Silicon Graphics, + * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. + * + * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + */ +/* + * font.c + * + * Draws some text in a bitmapped font. Uses glBitmap() + * and other pixel routines. Also demonstrates use of + * display lists. + */ +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#ifdef __APPLE__ +#include +#else +#include +#endif + +static GLubyte rasters[][13] = { +{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, +{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36}, +{0x00, 0x00, 0x00, 0x66, 0x66, 0xff, 0x66, 0x66, 0xff, 0x66, 0x66, 0x00, 0x00}, +{0x00, 0x00, 0x18, 0x7e, 0xff, 0x1b, 0x1f, 0x7e, 0xf8, 0xd8, 0xff, 0x7e, 0x18}, +{0x00, 0x00, 0x0e, 0x1b, 0xdb, 0x6e, 0x30, 0x18, 0x0c, 0x76, 0xdb, 0xd8, 0x70}, +{0x00, 0x00, 0x7f, 0xc6, 0xcf, 0xd8, 0x70, 0x70, 0xd8, 0xcc, 0xcc, 0x6c, 0x38}, +{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1c, 0x0c, 0x0e}, +{0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c}, +{0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30}, +{0x00, 0x00, 0x00, 0x00, 0x99, 0x5a, 0x3c, 0xff, 0x3c, 0x5a, 0x99, 0x00, 0x00}, +{0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00}, +{0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0c, 0x0c, 0x06, 0x06, 0x03, 0x03}, +{0x00, 0x00, 0x3c, 0x66, 0xc3, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xc3, 0x66, 0x3c}, +{0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x38, 0x18}, +{0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0xe7, 0x7e}, +{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0x07, 0x03, 0x03, 0xe7, 0x7e}, +{0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xcc, 0x6c, 0x3c, 0x1c, 0x0c}, +{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, +{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, +{0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x03, 0x03, 0xff}, +{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e}, +{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x03, 0x7f, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e}, +{0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06}, +{0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60}, +{0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x0c, 0x06, 0x03, 0xc3, 0xc3, 0x7e}, +{0x00, 0x00, 0x3f, 0x60, 0xcf, 0xdb, 0xd3, 0xdd, 0xc3, 0x7e, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18}, +{0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, +{0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, +{0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc}, +{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, +{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff}, +{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, +{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, +{0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e}, +{0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}, +{0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3}, +{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, +{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3}, +{0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3}, +{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e}, +{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, +{0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c}, +{0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, +{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e}, +{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff}, +{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, +{0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, +{0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, +{0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, +{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, +{0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}, +{0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c}, +{0x00, 0x03, 0x03, 0x06, 0x06, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60}, +{0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c}, +{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18}, +{0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x30, 0x70}, +{0x00, 0x00, 0x7f, 0xc3, 0xc3, 0x7f, 0x03, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, +{0x00, 0x00, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x03, 0x03, 0x03, 0x03, 0x03}, +{0x00, 0x00, 0x7f, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x33, 0x1e}, +{0x7e, 0xc3, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0}, +{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00}, +{0x38, 0x6c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x00}, +{0x00, 0x00, 0xc6, 0xcc, 0xf8, 0xf0, 0xd8, 0xcc, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0}, +{0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78}, +{0x00, 0x00, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xfe, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00}, +{0xc0, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0x00, 0x00, 0x00, 0x00}, +{0x03, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xfe, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xfe, 0x03, 0x03, 0x7e, 0xc0, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x00}, +{0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xc3, 0xe7, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00}, +{0xc0, 0x60, 0x60, 0x30, 0x18, 0x3c, 0x66, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0xff, 0x60, 0x30, 0x18, 0x0c, 0x06, 0xff, 0x00, 0x00, 0x00, 0x00}, +{0x00, 0x00, 0x0f, 0x18, 0x18, 0x18, 0x38, 0xf0, 0x38, 0x18, 0x18, 0x18, 0x0f}, +{0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18}, +{0x00, 0x00, 0xf0, 0x18, 0x18, 0x18, 0x1c, 0x0f, 0x1c, 0x18, 0x18, 0x18, 0xf0}, +{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x8f, 0xf1, 0x60, 0x00, 0x00, 0x00} +}; + +// Spacing between two successive letters in the font. +// Default font is the only one supported, so we hard-code to 10 pixels. +// Actual font seems to be a 8x13 bitmap, encoded in the array above. +float getFontWidth() { return 10.0f; } + +/* This routine will load a font from the file whose name is passed + * to it as a parameter. If the name is a NULL pointer, then the default + * font is loaded. + * The return value is 0 if there is an error and a non-negative + * integer that represents this font on success. This integer should + * be saved to pass to drawStringInFont(). */ + +int loadFont (const char * filename) +{ + GLuint fontOffset; + GLuint i; + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + /* See if we are supposed to load the font from a file */ + if (filename != NULL) { /* Load from a file */ + fprintf(stderr, + "loadFont(): Loading from file not yet supported\n"); + return(0); + } else { /* Use the default font */ + if ( (fontOffset = glGenLists (128)) == 0) { + fprintf(stderr, + "loadFont(): Cannot allocate display lists\n"); + return(0); + } + for (i = 32; i < 127; i++) { + glNewList(i+fontOffset, GL_COMPILE); + glBitmap(8, 13, 0.0, 2.0, getFontWidth(), 0.0, rasters[i-32]); + glEndList(); + } + } + + return(fontOffset); +} + +void drawStringInFont (int fontOffset, const char * s) +{ + glPushAttrib(GL_LIST_BIT); + glListBase(fontOffset); + glCallLists((GLsizei)strlen(s), GL_UNSIGNED_BYTE, (GLubyte *) s); + + glPopAttrib (); +} + diff --git a/examples/font.h b/examples/font.h index b7bc664..784adb1 100755 --- a/examples/font.h +++ b/examples/font.h @@ -1,41 +1,41 @@ -/* The nanoManipulator and its source code have been released under the - * Boost software license when nanoManipulator, Inc. ceased operations on - * January 1, 2014. At this point, the message below from 3rdTech (who - * sublicensed from nanoManipulator, Inc.) was superceded. - * Since that time, the code can be used according to the following - * license. Support for this system is now through the NIH/NIBIB - * National Research Resource at cismm.org. - -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - -#ifndef FONT_H -#define FONT_H - -extern "C" int loadFont(const char*); -extern "C" void drawStringInFont(int, const char*); -extern "C" float getFontWidth(); - -#endif // FONT_H +/* The nanoManipulator and its source code have been released under the + * Boost software license when nanoManipulator, Inc. ceased operations on + * January 1, 2014. At this point, the message below from 3rdTech (who + * sublicensed from nanoManipulator, Inc.) was superceded. + * Since that time, the code can be used according to the following + * license. Support for this system is now through the NIH/NIBIB + * National Research Resource at cismm.org. + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +#ifndef FONT_H +#define FONT_H + +extern "C" int loadFont(const char*); +extern "C" void drawStringInFont(int, const char*); +extern "C" float getFontWidth(); + +#endif // FONT_H diff --git a/examples/pixelshader.h b/examples/pixelshader.h index 5d639c4..55611d0 100755 --- a/examples/pixelshader.h +++ b/examples/pixelshader.h @@ -1,847 +1,847 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_POSITION 0 xyzw 0 POS float -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_Target 0 xyzw 0 TARGET float xyzw -// -ps_4_0 -dcl_output o0.xyzw -// -// Initial variable locations: -// v0.x <- Pos.x; v0.y <- Pos.y; v0.z <- Pos.z; v0.w <- Pos.w; -// o0.x <- .x; o0.y <- .y; o0.z <- .z; o0.w <- .w -// -mov o0.xyzw, l(1.000000,1.000000,1.000000,1.000000) -ret -// Approximately 2 instruction slots used -#endif - -const BYTE g_triangle_ps[] = { - 68, 88, 66, 67, 230, 85, 161, 221, 169, 196, 102, 74, 180, 152, 139, - 228, 81, 104, 110, 209, 1, 0, 0, 0, 188, 47, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, 144, 0, 0, 0, 196, 0, 0, 0, 248, - 0, 0, 0, 56, 1, 0, 0, 180, 1, 0, 0, 82, 68, 69, 70, - 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 28, 0, 0, 0, 0, 4, 255, 255, 5, 1, 0, 0, 28, 0, - 0, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 0, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, - 0, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, - 97, 114, 103, 101, 116, 0, 171, 171, 83, 72, 68, 82, 56, 0, 0, - 0, 64, 0, 0, 0, 14, 0, 0, 0, 101, 0, 0, 3, 242, 32, - 16, 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, 32, 16, 0, 0, - 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, - 0, 0, 128, 63, 0, 0, 128, 63, 62, 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 83, 80, 68, 66, 0, 46, 0, 0, 77, 105, 99, 114, 111, 115, - 111, 102, 116, 32, 67, 47, 67, 43, 43, 32, 77, 83, 70, 32, 55, - 46, 48, 48, 13, 10, 26, 68, 83, 0, 0, 0, 0, 2, 0, 0, - 2, 0, 0, 0, 23, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, - 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 56, 0, - 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 5, 0, 0, 0, 32, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, - 0, 255, 255, 255, 255, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 46, 49, 1, 82, 187, 83, 85, 1, 0, 0, - 0, 17, 10, 248, 207, 251, 3, 211, 74, 159, 3, 16, 24, 46, 51, - 151, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 65, 145, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 68, 51, 68, 83, 72, 68, 82, 0, 56, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, - 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 119, 115, 0, 0, 120, 62, 0, - 0, 138, 110, 0, 0, 191, 79, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 108, 111, 97, 116, - 52, 32, 116, 114, 105, 97, 110, 103, 108, 101, 95, 112, 115, 40, 102, - 108, 111, 97, 116, 52, 32, 80, 111, 115, 32, 58, 32, 83, 86, 95, - 80, 79, 83, 73, 84, 73, 79, 78, 41, 32, 58, 32, 83, 86, 95, - 84, 97, 114, 103, 101, 116, 13, 10, 123, 13, 10, 32, 32, 32, 32, - 114, 101, 116, 117, 114, 110, 32, 102, 108, 111, 97, 116, 52, 40, 49, - 46, 48, 102, 44, 32, 49, 46, 48, 102, 44, 32, 49, 46, 48, 102, - 44, 32, 49, 46, 48, 102, 41, 59, 32, 32, 32, 32, 47, 47, 32, - 65, 108, 112, 104, 97, 32, 61, 32, 49, 13, 10, 125, 13, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 239, 254, - 239, 1, 0, 0, 0, 217, 0, 0, 0, 0, 78, 58, 92, 115, 119, - 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, 92, 100, 105, 114, - 101, 99, 116, 109, 111, 100, 101, 92, 112, 105, 120, 101, 108, 115, 104, - 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, 0, 110, 58, 92, 115, - 119, 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, 92, 100, 105, - 114, 101, 99, 116, 109, 111, 100, 101, 92, 112, 105, 120, 101, 108, 115, - 104, 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, 102, 108, 111, 97, - 116, 52, 32, 116, 114, 105, 97, 110, 103, 108, 101, 95, 112, 115, 40, - 102, 108, 111, 97, 116, 52, 32, 80, 111, 115, 32, 58, 32, 83, 86, - 95, 80, 79, 83, 73, 84, 73, 79, 78, 41, 32, 58, 32, 83, 86, - 95, 84, 97, 114, 103, 101, 116, 13, 10, 123, 13, 10, 32, 32, 32, - 32, 114, 101, 116, 117, 114, 110, 32, 102, 108, 111, 97, 116, 52, 40, - 49, 46, 48, 102, 44, 32, 49, 46, 48, 102, 44, 32, 49, 46, 48, - 102, 44, 32, 49, 46, 48, 102, 41, 59, 32, 32, 32, 32, 47, 47, - 32, 65, 108, 112, 104, 97, 32, 61, 32, 49, 13, 10, 125, 13, 10, - 0, 7, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 92, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, - 226, 48, 1, 128, 0, 0, 0, 232, 17, 5, 200, 191, 141, 208, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 40, 0, 0, - 0, 27, 226, 48, 1, 35, 56, 228, 25, 124, 0, 0, 0, 1, 0, - 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 74, 0, 60, 17, 16, 1, 0, 0, 0, 1, - 6, 0, 3, 0, 0, 64, 128, 37, 6, 0, 3, 0, 0, 64, 128, - 37, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, - 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, - 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, - 49, 54, 51, 56, 52, 0, 58, 0, 61, 17, 1, 104, 108, 115, 108, - 70, 108, 97, 103, 115, 0, 48, 120, 53, 0, 104, 108, 115, 108, 84, - 97, 114, 103, 101, 116, 0, 112, 115, 95, 52, 95, 48, 0, 104, 108, - 115, 108, 69, 110, 116, 114, 121, 0, 116, 114, 105, 97, 110, 103, 108, - 101, 95, 112, 115, 0, 0, 50, 0, 16, 17, 0, 0, 0, 0, 240, - 1, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 3, 16, 0, 0, 20, 0, 0, 0, 1, 0, 160, - 116, 114, 105, 97, 110, 103, 108, 101, 95, 112, 115, 0, 0, 42, 0, - 62, 17, 0, 16, 0, 0, 9, 0, 80, 111, 115, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 80, - 17, 1, 0, 5, 0, 0, 0, 4, 0, 20, 0, 0, 0, 1, 0, - 36, 0, 0, 0, 0, 0, 22, 0, 80, 17, 1, 0, 5, 0, 4, - 0, 4, 0, 20, 0, 0, 0, 1, 0, 36, 0, 4, 0, 0, 0, - 22, 0, 80, 17, 1, 0, 5, 0, 8, 0, 4, 0, 20, 0, 0, - 0, 1, 0, 36, 0, 8, 0, 0, 0, 22, 0, 80, 17, 1, 0, - 5, 0, 12, 0, 4, 0, 20, 0, 0, 0, 1, 0, 36, 0, 12, - 0, 0, 0, 66, 0, 62, 17, 2, 16, 0, 0, 136, 0, 60, 116, - 114, 105, 97, 110, 103, 108, 101, 95, 112, 115, 32, 114, 101, 116, 117, - 114, 110, 32, 118, 97, 108, 117, 101, 62, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 80, 17, - 2, 0, 5, 0, 0, 0, 4, 0, 20, 0, 0, 0, 1, 0, 36, - 0, 0, 0, 0, 0, 22, 0, 80, 17, 2, 0, 5, 0, 4, 0, - 4, 0, 20, 0, 0, 0, 1, 0, 36, 0, 4, 0, 0, 0, 22, - 0, 80, 17, 2, 0, 5, 0, 8, 0, 4, 0, 20, 0, 0, 0, - 1, 0, 36, 0, 8, 0, 0, 0, 22, 0, 80, 17, 2, 0, 5, - 0, 12, 0, 4, 0, 20, 0, 0, 0, 1, 0, 36, 0, 12, 0, - 0, 0, 2, 0, 6, 0, 244, 0, 0, 0, 24, 0, 0, 0, 1, - 0, 0, 0, 16, 1, 198, 126, 9, 119, 80, 41, 185, 174, 68, 56, - 13, 9, 18, 85, 139, 237, 0, 0, 242, 0, 0, 0, 72, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 1, 0, 56, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 60, 0, 0, 0, 20, 0, 0, 0, 3, - 0, 0, 128, 20, 0, 0, 0, 3, 0, 0, 0, 52, 0, 0, 0, - 3, 0, 0, 128, 52, 0, 0, 0, 3, 0, 0, 0, 5, 0, 42, - 0, 5, 0, 42, 0, 5, 0, 42, 0, 5, 0, 42, 0, 246, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 202, 49, 1, 56, 0, 0, 0, 0, 16, - 0, 0, 4, 16, 0, 0, 64, 0, 0, 0, 10, 0, 255, 255, 4, - 0, 0, 0, 3, 128, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - 16, 0, 0, 0, 8, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, - 0, 22, 0, 27, 21, 64, 0, 0, 0, 4, 0, 0, 0, 16, 0, - 102, 108, 111, 97, 116, 52, 0, 243, 242, 241, 10, 0, 1, 18, 1, - 0, 0, 0, 0, 16, 0, 0, 10, 0, 24, 21, 0, 16, 0, 0, - 1, 0, 1, 0, 14, 0, 8, 16, 2, 16, 0, 0, 23, 0, 1, - 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, 202, 49, 1, 56, 0, 0, 0, - 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 11, 0, 255, - 255, 4, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 26, 9, - 47, 241, 8, 0, 0, 0, 8, 2, 0, 0, 1, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 37, 17, 0, 0, 0, 0, 140, 0, 0, 0, 1, 0, 116, 114, 105, - 97, 110, 103, 108, 101, 95, 112, 115, 0, 0, 0, 255, 255, 255, 255, - 26, 9, 47, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, - 255, 255, 26, 9, 47, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, 119, 9, 49, 1, 1, 0, 0, 0, 13, - 0, 0, 139, 14, 0, 183, 195, 15, 0, 0, 0, 84, 0, 0, 0, - 32, 0, 0, 0, 44, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 22, 0, 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 96, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 9, 0, 244, 1, 0, - 0, 0, 0, 0, 0, 124, 0, 0, 0, 1, 0, 0, 0, 176, 93, - 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 116, 114, 105, 97, 110, - 103, 108, 101, 95, 112, 115, 0, 110, 111, 110, 101, 0, 0, 0, 0, - 45, 186, 46, 241, 1, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, - 0, 32, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 2, 0, 7, 0, 0, 0, 0, 0, 1, 0, 255, - 255, 255, 255, 0, 0, 0, 0, 56, 0, 0, 0, 8, 2, 0, 0, - 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, - 255, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 78, 58, - 92, 115, 119, 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, 92, - 100, 105, 114, 101, 99, 116, 109, 111, 100, 101, 92, 112, 105, 120, 101, - 108, 115, 104, 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, 0, 0, - 0, 254, 239, 254, 239, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 12, 0, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 46, 49, 1, 82, 187, 83, 85, 1, 0, 0, - 0, 17, 10, 248, 207, 251, 3, 211, 74, 159, 3, 16, 24, 46, 51, - 151, 101, 90, 0, 0, 0, 47, 76, 105, 110, 107, 73, 110, 102, 111, - 0, 47, 110, 97, 109, 101, 115, 0, 47, 115, 114, 99, 47, 104, 101, - 97, 100, 101, 114, 98, 108, 111, 99, 107, 0, 47, 115, 114, 99, 47, - 102, 105, 108, 101, 115, 47, 110, 58, 92, 115, 119, 92, 112, 118, 116, - 92, 106, 105, 101, 111, 110, 103, 92, 100, 105, 114, 101, 99, 116, 109, - 111, 100, 101, 92, 112, 105, 120, 101, 108, 115, 104, 97, 100, 101, 114, - 46, 104, 108, 115, 108, 0, 4, 0, 0, 0, 6, 0, 0, 0, 1, - 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 7, 0, 0, 0, 10, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 65, 145, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 182, - 0, 0, 0, 120, 0, 0, 0, 75, 1, 0, 0, 56, 0, 0, 0, - 0, 0, 0, 0, 9, 1, 0, 0, 128, 0, 0, 0, 124, 0, 0, - 0, 120, 2, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 40, 0, - 0, 0, 32, 2, 0, 0, 44, 0, 0, 0, 28, 0, 0, 0, 3, - 0, 0, 0, 20, 0, 0, 0, 13, 0, 0, 0, 19, 0, 0, 0, - 14, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, - 0, 11, 0, 0, 0, 12, 0, 0, 0, 7, 0, 0, 0, 6, 0, - 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 +// +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +ps_4_0 +dcl_output o0.xyzw +// +// Initial variable locations: +// v0.x <- Pos.x; v0.y <- Pos.y; v0.z <- Pos.z; v0.w <- Pos.w; +// o0.x <- .x; o0.y <- .y; o0.z <- .z; o0.w <- .w +// +mov o0.xyzw, l(1.000000,1.000000,1.000000,1.000000) +ret +// Approximately 2 instruction slots used +#endif + +const BYTE g_triangle_ps[] = { + 68, 88, 66, 67, 230, 85, 161, 221, 169, 196, 102, 74, 180, 152, 139, + 228, 81, 104, 110, 209, 1, 0, 0, 0, 188, 47, 0, 0, 6, 0, + 0, 0, 56, 0, 0, 0, 144, 0, 0, 0, 196, 0, 0, 0, 248, + 0, 0, 0, 56, 1, 0, 0, 180, 1, 0, 0, 82, 68, 69, 70, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 4, 255, 255, 5, 1, 0, 0, 28, 0, + 0, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, + 46, 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 44, 0, + 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, + 0, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, 171, 171, 83, 72, 68, 82, 56, 0, 0, + 0, 64, 0, 0, 0, 14, 0, 0, 0, 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, 54, 0, 0, 8, 242, 32, 16, 0, 0, + 0, 0, 0, 2, 64, 0, 0, 0, 0, 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, 128, 63, 62, 0, 0, 1, 83, 84, 65, + 84, 116, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 83, 80, 68, 66, 0, 46, 0, 0, 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 67, 47, 67, 43, 43, 32, 77, 83, 70, 32, 55, + 46, 48, 48, 13, 10, 26, 68, 83, 0, 0, 0, 0, 2, 0, 0, + 2, 0, 0, 0, 23, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 56, 0, + 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 5, 0, 0, 0, 32, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, + 0, 255, 255, 255, 255, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 148, 46, 49, 1, 82, 187, 83, 85, 1, 0, 0, + 0, 17, 10, 248, 207, 251, 3, 211, 74, 159, 3, 16, 24, 46, 51, + 151, 101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 145, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 68, 51, 68, 83, 72, 68, 82, 0, 56, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, + 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 119, 115, 0, 0, 120, 62, 0, + 0, 138, 110, 0, 0, 191, 79, 0, 0, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 108, 111, 97, 116, + 52, 32, 116, 114, 105, 97, 110, 103, 108, 101, 95, 112, 115, 40, 102, + 108, 111, 97, 116, 52, 32, 80, 111, 115, 32, 58, 32, 83, 86, 95, + 80, 79, 83, 73, 84, 73, 79, 78, 41, 32, 58, 32, 83, 86, 95, + 84, 97, 114, 103, 101, 116, 13, 10, 123, 13, 10, 32, 32, 32, 32, + 114, 101, 116, 117, 114, 110, 32, 102, 108, 111, 97, 116, 52, 40, 49, + 46, 48, 102, 44, 32, 49, 46, 48, 102, 44, 32, 49, 46, 48, 102, + 44, 32, 49, 46, 48, 102, 41, 59, 32, 32, 32, 32, 47, 47, 32, + 65, 108, 112, 104, 97, 32, 61, 32, 49, 13, 10, 125, 13, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 239, 254, + 239, 1, 0, 0, 0, 217, 0, 0, 0, 0, 78, 58, 92, 115, 119, + 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, 92, 100, 105, 114, + 101, 99, 116, 109, 111, 100, 101, 92, 112, 105, 120, 101, 108, 115, 104, + 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, 0, 110, 58, 92, 115, + 119, 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, 92, 100, 105, + 114, 101, 99, 116, 109, 111, 100, 101, 92, 112, 105, 120, 101, 108, 115, + 104, 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, 102, 108, 111, 97, + 116, 52, 32, 116, 114, 105, 97, 110, 103, 108, 101, 95, 112, 115, 40, + 102, 108, 111, 97, 116, 52, 32, 80, 111, 115, 32, 58, 32, 83, 86, + 95, 80, 79, 83, 73, 84, 73, 79, 78, 41, 32, 58, 32, 83, 86, + 95, 84, 97, 114, 103, 101, 116, 13, 10, 123, 13, 10, 32, 32, 32, + 32, 114, 101, 116, 117, 114, 110, 32, 102, 108, 111, 97, 116, 52, 40, + 49, 46, 48, 102, 44, 32, 49, 46, 48, 102, 44, 32, 49, 46, 48, + 102, 44, 32, 49, 46, 48, 102, 41, 59, 32, 32, 32, 32, 47, 47, + 32, 65, 108, 112, 104, 97, 32, 61, 32, 49, 13, 10, 125, 13, 10, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 92, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, + 226, 48, 1, 128, 0, 0, 0, 232, 17, 5, 200, 191, 141, 208, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 40, 0, 0, + 0, 27, 226, 48, 1, 35, 56, 228, 25, 124, 0, 0, 0, 1, 0, + 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 0, 0, 74, 0, 60, 17, 16, 1, 0, 0, 0, 1, + 6, 0, 3, 0, 0, 64, 128, 37, 6, 0, 3, 0, 0, 64, 128, + 37, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, + 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, + 49, 54, 51, 56, 52, 0, 58, 0, 61, 17, 1, 104, 108, 115, 108, + 70, 108, 97, 103, 115, 0, 48, 120, 53, 0, 104, 108, 115, 108, 84, + 97, 114, 103, 101, 116, 0, 112, 115, 95, 52, 95, 48, 0, 104, 108, + 115, 108, 69, 110, 116, 114, 121, 0, 116, 114, 105, 97, 110, 103, 108, + 101, 95, 112, 115, 0, 0, 50, 0, 16, 17, 0, 0, 0, 0, 240, + 1, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 3, 16, 0, 0, 20, 0, 0, 0, 1, 0, 160, + 116, 114, 105, 97, 110, 103, 108, 101, 95, 112, 115, 0, 0, 42, 0, + 62, 17, 0, 16, 0, 0, 9, 0, 80, 111, 115, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 80, + 17, 1, 0, 5, 0, 0, 0, 4, 0, 20, 0, 0, 0, 1, 0, + 36, 0, 0, 0, 0, 0, 22, 0, 80, 17, 1, 0, 5, 0, 4, + 0, 4, 0, 20, 0, 0, 0, 1, 0, 36, 0, 4, 0, 0, 0, + 22, 0, 80, 17, 1, 0, 5, 0, 8, 0, 4, 0, 20, 0, 0, + 0, 1, 0, 36, 0, 8, 0, 0, 0, 22, 0, 80, 17, 1, 0, + 5, 0, 12, 0, 4, 0, 20, 0, 0, 0, 1, 0, 36, 0, 12, + 0, 0, 0, 66, 0, 62, 17, 2, 16, 0, 0, 136, 0, 60, 116, + 114, 105, 97, 110, 103, 108, 101, 95, 112, 115, 32, 114, 101, 116, 117, + 114, 110, 32, 118, 97, 108, 117, 101, 62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 80, 17, + 2, 0, 5, 0, 0, 0, 4, 0, 20, 0, 0, 0, 1, 0, 36, + 0, 0, 0, 0, 0, 22, 0, 80, 17, 2, 0, 5, 0, 4, 0, + 4, 0, 20, 0, 0, 0, 1, 0, 36, 0, 4, 0, 0, 0, 22, + 0, 80, 17, 2, 0, 5, 0, 8, 0, 4, 0, 20, 0, 0, 0, + 1, 0, 36, 0, 8, 0, 0, 0, 22, 0, 80, 17, 2, 0, 5, + 0, 12, 0, 4, 0, 20, 0, 0, 0, 1, 0, 36, 0, 12, 0, + 0, 0, 2, 0, 6, 0, 244, 0, 0, 0, 24, 0, 0, 0, 1, + 0, 0, 0, 16, 1, 198, 126, 9, 119, 80, 41, 185, 174, 68, 56, + 13, 9, 18, 85, 139, 237, 0, 0, 242, 0, 0, 0, 72, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 60, 0, 0, 0, 20, 0, 0, 0, 3, + 0, 0, 128, 20, 0, 0, 0, 3, 0, 0, 0, 52, 0, 0, 0, + 3, 0, 0, 128, 52, 0, 0, 0, 3, 0, 0, 0, 5, 0, 42, + 0, 5, 0, 42, 0, 5, 0, 42, 0, 5, 0, 42, 0, 246, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 202, 49, 1, 56, 0, 0, 0, 0, 16, + 0, 0, 4, 16, 0, 0, 64, 0, 0, 0, 10, 0, 255, 255, 4, + 0, 0, 0, 3, 128, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 16, 0, 0, 0, 8, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 27, 21, 64, 0, 0, 0, 4, 0, 0, 0, 16, 0, + 102, 108, 111, 97, 116, 52, 0, 243, 242, 241, 10, 0, 1, 18, 1, + 0, 0, 0, 0, 16, 0, 0, 10, 0, 24, 21, 0, 16, 0, 0, + 1, 0, 1, 0, 14, 0, 8, 16, 2, 16, 0, 0, 23, 0, 1, + 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, 202, 49, 1, 56, 0, 0, 0, + 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 11, 0, 255, + 255, 4, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 26, 9, + 47, 241, 8, 0, 0, 0, 8, 2, 0, 0, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 37, 17, 0, 0, 0, 0, 140, 0, 0, 0, 1, 0, 116, 114, 105, + 97, 110, 103, 108, 101, 95, 112, 115, 0, 0, 0, 255, 255, 255, 255, + 26, 9, 47, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, + 255, 255, 26, 9, 47, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, 119, 9, 49, 1, 1, 0, 0, 0, 13, + 0, 0, 139, 14, 0, 183, 195, 15, 0, 0, 0, 84, 0, 0, 0, + 32, 0, 0, 0, 44, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 96, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 9, 0, 244, 1, 0, + 0, 0, 0, 0, 0, 124, 0, 0, 0, 1, 0, 0, 0, 176, 93, + 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 116, 114, 105, 97, 110, + 103, 108, 101, 95, 112, 115, 0, 110, 111, 110, 101, 0, 0, 0, 0, + 45, 186, 46, 241, 1, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, + 0, 32, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 2, 0, 7, 0, 0, 0, 0, 0, 1, 0, 255, + 255, 255, 255, 0, 0, 0, 0, 56, 0, 0, 0, 8, 2, 0, 0, + 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, + 255, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 78, 58, + 92, 115, 119, 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, 92, + 100, 105, 114, 101, 99, 116, 109, 111, 100, 101, 92, 112, 105, 120, 101, + 108, 115, 104, 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, 0, 0, + 0, 254, 239, 254, 239, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 12, 0, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 148, 46, 49, 1, 82, 187, 83, 85, 1, 0, 0, + 0, 17, 10, 248, 207, 251, 3, 211, 74, 159, 3, 16, 24, 46, 51, + 151, 101, 90, 0, 0, 0, 47, 76, 105, 110, 107, 73, 110, 102, 111, + 0, 47, 110, 97, 109, 101, 115, 0, 47, 115, 114, 99, 47, 104, 101, + 97, 100, 101, 114, 98, 108, 111, 99, 107, 0, 47, 115, 114, 99, 47, + 102, 105, 108, 101, 115, 47, 110, 58, 92, 115, 119, 92, 112, 118, 116, + 92, 106, 105, 101, 111, 110, 103, 92, 100, 105, 114, 101, 99, 116, 109, + 111, 100, 101, 92, 112, 105, 120, 101, 108, 115, 104, 97, 100, 101, 114, + 46, 104, 108, 115, 108, 0, 4, 0, 0, 0, 6, 0, 0, 0, 1, + 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 7, 0, 0, 0, 10, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 65, 145, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 182, + 0, 0, 0, 120, 0, 0, 0, 75, 1, 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 9, 1, 0, 0, 128, 0, 0, 0, 124, 0, 0, + 0, 120, 2, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 32, 2, 0, 0, 44, 0, 0, 0, 28, 0, 0, 0, 3, + 0, 0, 0, 20, 0, 0, 0, 13, 0, 0, 0, 19, 0, 0, 0, + 14, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, + 0, 11, 0, 0, 0, 12, 0, 0, 0, 7, 0, 0, 0, 6, 0, + 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/examples/pixelshader.hlsl b/examples/pixelshader.hlsl index 413a87c..d5f3245 100755 --- a/examples/pixelshader.hlsl +++ b/examples/pixelshader.hlsl @@ -1,4 +1,4 @@ -float4 triangle_ps(float4 Pos : SV_POSITION) : SV_Target -{ - return float4(1.0f, 1.0f, 1.0f, 1.0f); // Alpha = 1 -} +float4 triangle_ps(float4 Pos : SV_POSITION) : SV_Target +{ + return float4(1.0f, 1.0f, 1.0f, 1.0f); // Alpha = 1 +} diff --git a/examples/pixelshader3d.h b/examples/pixelshader3d.h index 122af40..d154314 100755 --- a/examples/pixelshader3d.h +++ b/examples/pixelshader3d.h @@ -1,60 +1,60 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_POSITION 0 xyzw 0 POS float -// COLOR 0 xyzw 1 NONE float xyzw -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_TARGET 0 xyzw 0 TARGET float xyzw -// -ps_4_0 -dcl_input_ps linear v1.xyzw -dcl_output o0.xyzw -mov o0.xyzw, v1.xyzw -ret -// Approximately 2 instruction slots used -#endif - -const BYTE g_ps[] = { - 68, 88, 66, 67, 88, 53, 236, 82, 9, 230, 104, 159, 220, 48, 43, - 22, 130, 32, 42, 95, 1, 0, 0, 0, 208, 1, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, 140, 0, 0, 0, 224, 0, 0, 0, 20, - 1, 0, 0, 84, 1, 0, 0, 82, 68, 69, 70, 80, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, - 0, 0, 4, 255, 255, 0, 1, 0, 0, 28, 0, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, - 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, - 56, 52, 0, 171, 171, 73, 83, 71, 78, 76, 0, 0, 0, 2, 0, - 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 1, 0, 0, 0, 15, 15, 0, 0, 83, 86, 95, 80, 79, 83, - 73, 84, 73, 79, 78, 0, 67, 79, 76, 79, 82, 0, 171, 171, 79, - 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 65, 82, - 71, 69, 84, 0, 171, 171, 83, 72, 68, 82, 56, 0, 0, 0, 64, - 0, 0, 0, 14, 0, 0, 0, 98, 16, 0, 3, 242, 16, 16, 0, - 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, - 0, 54, 0, 0, 5, 242, 32, 16, 0, 0, 0, 0, 0, 70, 30, - 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 +// +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float +// COLOR 0 xyzw 1 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_TARGET 0 xyzw 0 TARGET float xyzw +// +ps_4_0 +dcl_input_ps linear v1.xyzw +dcl_output o0.xyzw +mov o0.xyzw, v1.xyzw +ret +// Approximately 2 instruction slots used +#endif + +const BYTE g_ps[] = { + 68, 88, 66, 67, 88, 53, 236, 82, 9, 230, 104, 159, 220, 48, 43, + 22, 130, 32, 42, 95, 1, 0, 0, 0, 208, 1, 0, 0, 5, 0, + 0, 0, 52, 0, 0, 0, 140, 0, 0, 0, 224, 0, 0, 0, 20, + 1, 0, 0, 84, 1, 0, 0, 82, 68, 69, 70, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 4, 255, 255, 0, 1, 0, 0, 28, 0, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, + 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, + 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, 46, 49, 54, 51, + 56, 52, 0, 171, 171, 73, 83, 71, 78, 76, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 15, 15, 0, 0, 83, 86, 95, 80, 79, 83, + 73, 84, 73, 79, 78, 0, 67, 79, 76, 79, 82, 0, 171, 171, 79, + 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 65, 82, + 71, 69, 84, 0, 171, 171, 83, 72, 68, 82, 56, 0, 0, 0, 64, + 0, 0, 0, 14, 0, 0, 0, 98, 16, 0, 3, 242, 16, 16, 0, + 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 0, 0, 0, + 0, 54, 0, 0, 5, 242, 32, 16, 0, 0, 0, 0, 0, 70, 30, + 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, 116, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/examples/pixelshader3d.hlsl b/examples/pixelshader3d.hlsl index f39724d..5a5e59b 100755 --- a/examples/pixelshader3d.hlsl +++ b/examples/pixelshader3d.hlsl @@ -1,10 +1,10 @@ -struct PixelShaderInput -{ - float4 position : SV_POSITION; - float4 color : COLOR0; -}; - -float4 SimplePixelShader(PixelShaderInput IN): SV_TARGET -{ - return IN.color; +struct PixelShaderInput +{ + float4 position : SV_POSITION; + float4 color : COLOR0; +}; + +float4 SimplePixelShader(PixelShaderInput IN): SV_TARGET +{ + return IN.color; } \ No newline at end of file diff --git a/examples/vertexshader.h b/examples/vertexshader.h index 70397ff..fc45a53 100755 --- a/examples/vertexshader.h +++ b/examples/vertexshader.h @@ -1,848 +1,848 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// POSITION 0 xyzw 0 NONE float xyzw -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_POSITION 0 xyzw 0 POS float xyzw -// -vs_4_0 -dcl_input v0.xyzw -dcl_output_siv o0.xyzw, position -// -// Initial variable locations: -// v0.x <- Pos.x; v0.y <- Pos.y; v0.z <- Pos.z; v0.w <- Pos.w; -// o0.x <- .x; o0.y <- .y; o0.z <- .z; o0.w <- .w -// -mov o0.xyzw, v0.xyzw -ret -// Approximately 2 instruction slots used -#endif - -const BYTE g_triangle_vs[] = { - 68, 88, 66, 67, 190, 235, 171, 234, 210, 94, 119, 113, 115, 118, 188, - 43, 178, 142, 169, 202, 1, 0, 0, 0, 192, 47, 0, 0, 6, 0, - 0, 0, 56, 0, 0, 0, 144, 0, 0, 0, 196, 0, 0, 0, 248, - 0, 0, 0, 60, 1, 0, 0, 184, 1, 0, 0, 82, 68, 69, 70, - 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 28, 0, 0, 0, 0, 4, 254, 255, 5, 1, 0, 0, 28, 0, - 0, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 44, 0, - 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 15, 15, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, - 171, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 80, - 79, 83, 73, 84, 73, 79, 78, 0, 83, 72, 68, 82, 60, 0, 0, - 0, 64, 0, 1, 0, 15, 0, 0, 0, 95, 0, 0, 3, 242, 16, - 16, 0, 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 54, 0, 0, 5, 242, 32, 16, 0, - 0, 0, 0, 0, 70, 30, 16, 0, 0, 0, 0, 0, 62, 0, 0, - 1, 83, 84, 65, 84, 116, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 83, 80, 68, 66, 0, 46, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 67, 47, 67, 43, 43, 32, 77, - 83, 70, 32, 55, 46, 48, 48, 13, 10, 26, 68, 83, 0, 0, 0, - 0, 2, 0, 0, 2, 0, 0, 0, 23, 0, 0, 0, 132, 0, 0, - 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 56, 0, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 5, 0, 0, 0, 32, 0, 0, 0, 60, 0, 0, - 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 6, 0, - 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 148, 46, 49, 1, 43, 167, 83, - 85, 1, 0, 0, 0, 4, 234, 121, 57, 199, 37, 224, 71, 167, 176, - 19, 160, 242, 144, 242, 133, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 65, 145, 50, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 51, 68, 83, 72, - 68, 82, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 115, 0, - 0, 120, 62, 0, 0, 138, 110, 0, 0, 191, 79, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, - 108, 111, 97, 116, 52, 32, 116, 114, 105, 97, 110, 103, 108, 101, 95, - 118, 115, 40, 102, 108, 111, 97, 116, 52, 32, 80, 111, 115, 32, 58, - 32, 80, 79, 83, 73, 84, 73, 79, 78, 41, 32, 58, 32, 83, 86, - 95, 80, 79, 83, 73, 84, 73, 79, 78, 13, 10, 123, 13, 10, 32, - 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 80, 111, 115, 59, 13, - 10, 125, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 254, 239, 254, 239, 1, 0, 0, 0, 175, 0, 0, 0, 0, 78, - 58, 92, 115, 119, 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, - 92, 100, 105, 114, 101, 99, 116, 109, 111, 100, 101, 92, 118, 101, 114, - 116, 101, 120, 115, 104, 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, - 0, 110, 58, 92, 115, 119, 92, 112, 118, 116, 92, 106, 105, 101, 111, - 110, 103, 92, 100, 105, 114, 101, 99, 116, 109, 111, 100, 101, 92, 118, - 101, 114, 116, 101, 120, 115, 104, 97, 100, 101, 114, 46, 104, 108, 115, - 108, 0, 102, 108, 111, 97, 116, 52, 32, 116, 114, 105, 97, 110, 103, - 108, 101, 95, 118, 115, 40, 102, 108, 111, 97, 116, 52, 32, 80, 111, - 115, 32, 58, 32, 80, 79, 83, 73, 84, 73, 79, 78, 41, 32, 58, - 32, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, 13, 10, 123, - 13, 10, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 80, 111, - 115, 59, 13, 10, 125, 13, 10, 0, 7, 0, 0, 0, 1, 0, 0, - 0, 47, 0, 0, 0, 48, 0, 0, 0, 94, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 226, 48, 1, 128, 0, 0, 0, 242, 201, 223, 196, - 179, 141, 208, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, - 0, 40, 0, 0, 0, 27, 226, 48, 1, 85, 86, 58, 229, 80, 0, - 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 74, 0, 60, 17, 16, 1, - 0, 0, 0, 1, 6, 0, 3, 0, 0, 64, 128, 37, 6, 0, 3, - 0, 0, 64, 128, 37, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, - 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, - 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 58, 0, 61, 17, 1, - 104, 108, 115, 108, 70, 108, 97, 103, 115, 0, 48, 120, 53, 0, 104, - 108, 115, 108, 84, 97, 114, 103, 101, 116, 0, 118, 115, 95, 52, 95, - 48, 0, 104, 108, 115, 108, 69, 110, 116, 114, 121, 0, 116, 114, 105, - 97, 110, 103, 108, 101, 95, 118, 115, 0, 0, 50, 0, 16, 17, 0, - 0, 0, 0, 240, 1, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, - 0, 0, 0, 0, 24, 0, 0, 0, 3, 16, 0, 0, 36, 0, 0, - 0, 1, 0, 160, 116, 114, 105, 97, 110, 103, 108, 101, 95, 118, 115, - 0, 0, 42, 0, 62, 17, 0, 16, 0, 0, 9, 0, 80, 111, 115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 22, 0, 80, 17, 1, 0, 5, 0, 0, 0, 4, 0, 36, 0, - 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 22, 0, 80, 17, 1, - 0, 5, 0, 4, 0, 4, 0, 36, 0, 0, 0, 1, 0, 24, 0, - 4, 0, 0, 0, 22, 0, 80, 17, 1, 0, 5, 0, 8, 0, 4, - 0, 36, 0, 0, 0, 1, 0, 24, 0, 8, 0, 0, 0, 22, 0, - 80, 17, 1, 0, 5, 0, 12, 0, 4, 0, 36, 0, 0, 0, 1, - 0, 24, 0, 12, 0, 0, 0, 66, 0, 62, 17, 2, 16, 0, 0, - 136, 0, 60, 116, 114, 105, 97, 110, 103, 108, 101, 95, 118, 115, 32, - 114, 101, 116, 117, 114, 110, 32, 118, 97, 108, 117, 101, 62, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 22, 0, 80, 17, 2, 0, 5, 0, 0, 0, 4, 0, 36, 0, 0, - 0, 1, 0, 24, 0, 0, 0, 0, 0, 22, 0, 80, 17, 2, 0, - 5, 0, 4, 0, 4, 0, 36, 0, 0, 0, 1, 0, 24, 0, 4, - 0, 0, 0, 22, 0, 80, 17, 2, 0, 5, 0, 8, 0, 4, 0, - 36, 0, 0, 0, 1, 0, 24, 0, 8, 0, 0, 0, 22, 0, 80, - 17, 2, 0, 5, 0, 12, 0, 4, 0, 36, 0, 0, 0, 1, 0, - 24, 0, 12, 0, 0, 0, 2, 0, 6, 0, 244, 0, 0, 0, 24, - 0, 0, 0, 1, 0, 0, 0, 16, 1, 5, 160, 42, 63, 204, 59, - 114, 139, 5, 14, 236, 148, 161, 249, 35, 151, 0, 0, 242, 0, 0, - 0, 72, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 60, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 60, 0, 0, 0, 36, - 0, 0, 0, 3, 0, 0, 128, 36, 0, 0, 0, 3, 0, 0, 0, - 56, 0, 0, 0, 3, 0, 0, 128, 56, 0, 0, 0, 3, 0, 0, - 0, 5, 0, 15, 0, 5, 0, 15, 0, 5, 0, 15, 0, 5, 0, - 15, 0, 246, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 202, 49, 1, 56, 0, - 0, 0, 0, 16, 0, 0, 4, 16, 0, 0, 64, 0, 0, 0, 10, - 0, 255, 255, 4, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 16, 0, 0, 0, 8, 0, 0, 0, 24, 0, 0, - 0, 0, 0, 0, 0, 22, 0, 27, 21, 64, 0, 0, 0, 4, 0, - 0, 0, 16, 0, 102, 108, 111, 97, 116, 52, 0, 243, 242, 241, 10, - 0, 1, 18, 1, 0, 0, 0, 0, 16, 0, 0, 10, 0, 24, 21, - 0, 16, 0, 0, 1, 0, 1, 0, 14, 0, 8, 16, 2, 16, 0, - 0, 23, 0, 1, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 202, 49, 1, - 56, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, - 0, 11, 0, 255, 255, 4, 0, 0, 0, 3, 128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, - 255, 255, 26, 9, 47, 241, 8, 0, 0, 0, 8, 2, 0, 0, 1, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 37, 17, 0, 0, 0, 0, 140, 0, 0, 0, 1, - 0, 116, 114, 105, 97, 110, 103, 108, 101, 95, 118, 115, 0, 0, 0, - 255, 255, 255, 255, 26, 9, 47, 241, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 255, 255, 255, 26, 9, 47, 241, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 119, 9, 49, 1, 1, - 0, 0, 0, 13, 0, 0, 139, 14, 0, 183, 195, 15, 0, 0, 0, - 84, 0, 0, 0, 32, 0, 0, 0, 44, 0, 0, 0, 60, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 25, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 32, 0, 0, 96, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 9, - 0, 244, 1, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 1, 0, - 0, 0, 8, 88, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, - 114, 105, 97, 110, 103, 108, 101, 95, 118, 115, 0, 110, 111, 110, 101, - 0, 0, 0, 0, 45, 186, 46, 241, 1, 0, 0, 0, 0, 0, 0, - 0, 60, 0, 0, 0, 32, 0, 0, 96, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 7, 0, 0, 0, 0, - 0, 1, 0, 255, 255, 255, 255, 0, 0, 0, 0, 60, 0, 0, 0, - 8, 2, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, - 0, 255, 255, 255, 255, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 78, 58, 92, 115, 119, 92, 112, 118, 116, 92, 106, 105, 101, - 111, 110, 103, 92, 100, 105, 114, 101, 99, 116, 109, 111, 100, 101, 92, - 118, 101, 114, 116, 101, 120, 115, 104, 97, 100, 101, 114, 46, 104, 108, - 115, 108, 0, 0, 0, 254, 239, 254, 239, 1, 0, 0, 0, 1, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 12, 0, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 148, 46, 49, 1, 43, 167, 83, - 85, 1, 0, 0, 0, 4, 234, 121, 57, 199, 37, 224, 71, 167, 176, - 19, 160, 242, 144, 242, 133, 91, 0, 0, 0, 47, 76, 105, 110, 107, - 73, 110, 102, 111, 0, 47, 110, 97, 109, 101, 115, 0, 47, 115, 114, - 99, 47, 104, 101, 97, 100, 101, 114, 98, 108, 111, 99, 107, 0, 47, - 115, 114, 99, 47, 102, 105, 108, 101, 115, 47, 110, 58, 92, 115, 119, - 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, 92, 100, 105, 114, - 101, 99, 116, 109, 111, 100, 101, 92, 118, 101, 114, 116, 101, 120, 115, - 104, 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, 4, 0, 0, 0, - 6, 0, 0, 0, 1, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 8, 0, - 0, 0, 10, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 5, - 0, 0, 0, 0, 0, 0, 0, 65, 145, 50, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 32, - 0, 0, 0, 183, 0, 0, 0, 120, 0, 0, 0, 75, 1, 0, 0, - 56, 0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 0, 128, 0, 0, - 0, 80, 0, 0, 0, 120, 2, 0, 0, 24, 0, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 32, 2, 0, 0, 44, 0, 0, 0, 28, - 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 13, 0, 0, 0, - 19, 0, 0, 0, 14, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, - 0, 8, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 7, 0, - 0, 0, 6, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18, - 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 +// +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// POSITION 0 xyzw 0 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float xyzw +// +vs_4_0 +dcl_input v0.xyzw +dcl_output_siv o0.xyzw, position +// +// Initial variable locations: +// v0.x <- Pos.x; v0.y <- Pos.y; v0.z <- Pos.z; v0.w <- Pos.w; +// o0.x <- .x; o0.y <- .y; o0.z <- .z; o0.w <- .w +// +mov o0.xyzw, v0.xyzw +ret +// Approximately 2 instruction slots used +#endif + +const BYTE g_triangle_vs[] = { + 68, 88, 66, 67, 190, 235, 171, 234, 210, 94, 119, 113, 115, 118, 188, + 43, 178, 142, 169, 202, 1, 0, 0, 0, 192, 47, 0, 0, 6, 0, + 0, 0, 56, 0, 0, 0, 144, 0, 0, 0, 196, 0, 0, 0, 248, + 0, 0, 0, 60, 1, 0, 0, 184, 1, 0, 0, 82, 68, 69, 70, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 4, 254, 255, 5, 1, 0, 0, 28, 0, + 0, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, + 46, 49, 54, 51, 56, 52, 0, 171, 171, 73, 83, 71, 78, 44, 0, + 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 80, 79, 83, 73, 84, 73, 79, 78, 0, 171, 171, + 171, 79, 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 80, + 79, 83, 73, 84, 73, 79, 78, 0, 83, 72, 68, 82, 60, 0, 0, + 0, 64, 0, 1, 0, 15, 0, 0, 0, 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 54, 0, 0, 5, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 30, 16, 0, 0, 0, 0, 0, 62, 0, 0, + 1, 83, 84, 65, 84, 116, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 83, 80, 68, 66, 0, 46, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, 116, 32, 67, 47, 67, 43, 43, 32, 77, + 83, 70, 32, 55, 46, 48, 48, 13, 10, 26, 68, 83, 0, 0, 0, + 0, 2, 0, 0, 2, 0, 0, 0, 23, 0, 0, 0, 132, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 56, 0, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 5, 0, 0, 0, 32, 0, 0, 0, 60, 0, 0, + 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 6, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 148, 46, 49, 1, 43, 167, 83, + 85, 1, 0, 0, 0, 4, 234, 121, 57, 199, 37, 224, 71, 167, 176, + 19, 160, 242, 144, 242, 133, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 145, 50, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 51, 68, 83, 72, + 68, 82, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 115, 0, + 0, 120, 62, 0, 0, 138, 110, 0, 0, 191, 79, 0, 0, 0, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, + 108, 111, 97, 116, 52, 32, 116, 114, 105, 97, 110, 103, 108, 101, 95, + 118, 115, 40, 102, 108, 111, 97, 116, 52, 32, 80, 111, 115, 32, 58, + 32, 80, 79, 83, 73, 84, 73, 79, 78, 41, 32, 58, 32, 83, 86, + 95, 80, 79, 83, 73, 84, 73, 79, 78, 13, 10, 123, 13, 10, 32, + 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 80, 111, 115, 59, 13, + 10, 125, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 254, 239, 254, 239, 1, 0, 0, 0, 175, 0, 0, 0, 0, 78, + 58, 92, 115, 119, 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, + 92, 100, 105, 114, 101, 99, 116, 109, 111, 100, 101, 92, 118, 101, 114, + 116, 101, 120, 115, 104, 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, + 0, 110, 58, 92, 115, 119, 92, 112, 118, 116, 92, 106, 105, 101, 111, + 110, 103, 92, 100, 105, 114, 101, 99, 116, 109, 111, 100, 101, 92, 118, + 101, 114, 116, 101, 120, 115, 104, 97, 100, 101, 114, 46, 104, 108, 115, + 108, 0, 102, 108, 111, 97, 116, 52, 32, 116, 114, 105, 97, 110, 103, + 108, 101, 95, 118, 115, 40, 102, 108, 111, 97, 116, 52, 32, 80, 111, + 115, 32, 58, 32, 80, 79, 83, 73, 84, 73, 79, 78, 41, 32, 58, + 32, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, 13, 10, 123, + 13, 10, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 32, 80, 111, + 115, 59, 13, 10, 125, 13, 10, 0, 7, 0, 0, 0, 1, 0, 0, + 0, 47, 0, 0, 0, 48, 0, 0, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 226, 48, 1, 128, 0, 0, 0, 242, 201, 223, 196, + 179, 141, 208, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, + 0, 40, 0, 0, 0, 27, 226, 48, 1, 85, 86, 58, 229, 80, 0, + 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 74, 0, 60, 17, 16, 1, + 0, 0, 0, 1, 6, 0, 3, 0, 0, 64, 128, 37, 6, 0, 3, + 0, 0, 64, 128, 37, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, + 54, 48, 48, 46, 49, 54, 51, 56, 52, 0, 58, 0, 61, 17, 1, + 104, 108, 115, 108, 70, 108, 97, 103, 115, 0, 48, 120, 53, 0, 104, + 108, 115, 108, 84, 97, 114, 103, 101, 116, 0, 118, 115, 95, 52, 95, + 48, 0, 104, 108, 115, 108, 69, 110, 116, 114, 121, 0, 116, 114, 105, + 97, 110, 103, 108, 101, 95, 118, 115, 0, 0, 50, 0, 16, 17, 0, + 0, 0, 0, 240, 1, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 0, 3, 16, 0, 0, 36, 0, 0, + 0, 1, 0, 160, 116, 114, 105, 97, 110, 103, 108, 101, 95, 118, 115, + 0, 0, 42, 0, 62, 17, 0, 16, 0, 0, 9, 0, 80, 111, 115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 80, 17, 1, 0, 5, 0, 0, 0, 4, 0, 36, 0, + 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 22, 0, 80, 17, 1, + 0, 5, 0, 4, 0, 4, 0, 36, 0, 0, 0, 1, 0, 24, 0, + 4, 0, 0, 0, 22, 0, 80, 17, 1, 0, 5, 0, 8, 0, 4, + 0, 36, 0, 0, 0, 1, 0, 24, 0, 8, 0, 0, 0, 22, 0, + 80, 17, 1, 0, 5, 0, 12, 0, 4, 0, 36, 0, 0, 0, 1, + 0, 24, 0, 12, 0, 0, 0, 66, 0, 62, 17, 2, 16, 0, 0, + 136, 0, 60, 116, 114, 105, 97, 110, 103, 108, 101, 95, 118, 115, 32, + 114, 101, 116, 117, 114, 110, 32, 118, 97, 108, 117, 101, 62, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 80, 17, 2, 0, 5, 0, 0, 0, 4, 0, 36, 0, 0, + 0, 1, 0, 24, 0, 0, 0, 0, 0, 22, 0, 80, 17, 2, 0, + 5, 0, 4, 0, 4, 0, 36, 0, 0, 0, 1, 0, 24, 0, 4, + 0, 0, 0, 22, 0, 80, 17, 2, 0, 5, 0, 8, 0, 4, 0, + 36, 0, 0, 0, 1, 0, 24, 0, 8, 0, 0, 0, 22, 0, 80, + 17, 2, 0, 5, 0, 12, 0, 4, 0, 36, 0, 0, 0, 1, 0, + 24, 0, 12, 0, 0, 0, 2, 0, 6, 0, 244, 0, 0, 0, 24, + 0, 0, 0, 1, 0, 0, 0, 16, 1, 5, 160, 42, 63, 204, 59, + 114, 139, 5, 14, 236, 148, 161, 249, 35, 151, 0, 0, 242, 0, 0, + 0, 72, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 60, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 60, 0, 0, 0, 36, + 0, 0, 0, 3, 0, 0, 128, 36, 0, 0, 0, 3, 0, 0, 0, + 56, 0, 0, 0, 3, 0, 0, 128, 56, 0, 0, 0, 3, 0, 0, + 0, 5, 0, 15, 0, 5, 0, 15, 0, 5, 0, 15, 0, 5, 0, + 15, 0, 246, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 202, 49, 1, 56, 0, + 0, 0, 0, 16, 0, 0, 4, 16, 0, 0, 64, 0, 0, 0, 10, + 0, 255, 255, 4, 0, 0, 0, 3, 128, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 16, 0, 0, 0, 8, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 27, 21, 64, 0, 0, 0, 4, 0, + 0, 0, 16, 0, 102, 108, 111, 97, 116, 52, 0, 243, 242, 241, 10, + 0, 1, 18, 1, 0, 0, 0, 0, 16, 0, 0, 10, 0, 24, 21, + 0, 16, 0, 0, 1, 0, 1, 0, 14, 0, 8, 16, 2, 16, 0, + 0, 23, 0, 1, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 202, 49, 1, + 56, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, + 0, 11, 0, 255, 255, 4, 0, 0, 0, 3, 128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, + 255, 255, 26, 9, 47, 241, 8, 0, 0, 0, 8, 2, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 37, 17, 0, 0, 0, 0, 140, 0, 0, 0, 1, + 0, 116, 114, 105, 97, 110, 103, 108, 101, 95, 118, 115, 0, 0, 0, + 255, 255, 255, 255, 26, 9, 47, 241, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 255, 255, 255, 26, 9, 47, 241, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 119, 9, 49, 1, 1, + 0, 0, 0, 13, 0, 0, 139, 14, 0, 183, 195, 15, 0, 0, 0, + 84, 0, 0, 0, 32, 0, 0, 0, 44, 0, 0, 0, 60, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 32, 0, 0, 96, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 9, + 0, 244, 1, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 1, 0, + 0, 0, 8, 88, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, + 114, 105, 97, 110, 103, 108, 101, 95, 118, 115, 0, 110, 111, 110, 101, + 0, 0, 0, 0, 45, 186, 46, 241, 1, 0, 0, 0, 0, 0, 0, + 0, 60, 0, 0, 0, 32, 0, 0, 96, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 7, 0, 0, 0, 0, + 0, 1, 0, 255, 255, 255, 255, 0, 0, 0, 0, 60, 0, 0, 0, + 8, 2, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, + 0, 255, 255, 255, 255, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 78, 58, 92, 115, 119, 92, 112, 118, 116, 92, 106, 105, 101, + 111, 110, 103, 92, 100, 105, 114, 101, 99, 116, 109, 111, 100, 101, 92, + 118, 101, 114, 116, 101, 120, 115, 104, 97, 100, 101, 114, 46, 104, 108, + 115, 108, 0, 0, 0, 254, 239, 254, 239, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 12, 0, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 148, 46, 49, 1, 43, 167, 83, + 85, 1, 0, 0, 0, 4, 234, 121, 57, 199, 37, 224, 71, 167, 176, + 19, 160, 242, 144, 242, 133, 91, 0, 0, 0, 47, 76, 105, 110, 107, + 73, 110, 102, 111, 0, 47, 110, 97, 109, 101, 115, 0, 47, 115, 114, + 99, 47, 104, 101, 97, 100, 101, 114, 98, 108, 111, 99, 107, 0, 47, + 115, 114, 99, 47, 102, 105, 108, 101, 115, 47, 110, 58, 92, 115, 119, + 92, 112, 118, 116, 92, 106, 105, 101, 111, 110, 103, 92, 100, 105, 114, + 101, 99, 116, 109, 111, 100, 101, 92, 118, 101, 114, 116, 101, 120, 115, + 104, 97, 100, 101, 114, 46, 104, 108, 115, 108, 0, 4, 0, 0, 0, + 6, 0, 0, 0, 1, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 8, 0, + 0, 0, 10, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 65, 145, 50, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 32, + 0, 0, 0, 183, 0, 0, 0, 120, 0, 0, 0, 75, 1, 0, 0, + 56, 0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 0, 128, 0, 0, + 0, 80, 0, 0, 0, 120, 2, 0, 0, 24, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 32, 2, 0, 0, 44, 0, 0, 0, 28, + 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 13, 0, 0, 0, + 19, 0, 0, 0, 14, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, + 0, 8, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 7, 0, + 0, 0, 6, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/examples/vertexshader.hlsl b/examples/vertexshader.hlsl index 402ce22..aa73039 100755 --- a/examples/vertexshader.hlsl +++ b/examples/vertexshader.hlsl @@ -1,4 +1,4 @@ -float4 triangle_vs(float4 Pos : POSITION) : SV_POSITION -{ - return Pos; -} +float4 triangle_vs(float4 Pos : POSITION) : SV_POSITION +{ + return Pos; +} diff --git a/examples/vertexshader3d.h b/examples/vertexshader3d.h index b7c89a7..532621f 100755 --- a/examples/vertexshader3d.h +++ b/examples/vertexshader3d.h @@ -1,233 +1,233 @@ -#if 0 -// -// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 -// -// -// Buffer Definitions: -// -// cbuffer cbPerObject -// { -// -// float4x4 projectionMatrix; // Offset: 0 Size: 64 -// float4x4 viewMatrix; // Offset: 64 Size: 64 -// float4x4 worldMatrix; // Offset: 128 Size: 64 -// -// } -// -// -// Resource Bindings: -// -// Name Type Format Dim Slot Elements -// ------------------------------ ---------- ------- ----------- ---- -------- -// cbPerObject cbuffer NA NA 0 1 -// -// -// -// Input signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// POSITION 0 xyzw 0 NONE float xyzw -// COLOR 0 xyzw 1 NONE float xyzw -// -// -// Output signature: -// -// Name Index Mask Register SysValue Format Used -// -------------------- ----- ------ -------- -------- ------- ------ -// SV_POSITION 0 xyzw 0 POS float xyzw -// COLOR 0 xyzw 1 NONE float xyzw -// -vs_4_0 -dcl_constantbuffer cb0[12], immediateIndexed -dcl_input v0.xyzw -dcl_input v1.xyzw -dcl_output_siv o0.xyzw, position -dcl_output o1.xyzw -dcl_temps 3 -mul r0.xyzw, cb0[5].xyzw, cb0[9].yyyy -mad r0.xyzw, cb0[4].xyzw, cb0[9].xxxx, r0.xyzw -mad r0.xyzw, cb0[6].xyzw, cb0[9].zzzz, r0.xyzw -mad r0.xyzw, cb0[7].xyzw, cb0[9].wwww, r0.xyzw -mul r1.xyzw, r0.yyyy, cb0[1].xyzw -mad r1.xyzw, cb0[0].xyzw, r0.xxxx, r1.xyzw -mad r1.xyzw, cb0[2].xyzw, r0.zzzz, r1.xyzw -mad r0.xyzw, cb0[3].xyzw, r0.wwww, r1.xyzw -mul r0.xyzw, r0.xyzw, v0.yyyy -mul r1.xyzw, cb0[5].xyzw, cb0[8].yyyy -mad r1.xyzw, cb0[4].xyzw, cb0[8].xxxx, r1.xyzw -mad r1.xyzw, cb0[6].xyzw, cb0[8].zzzz, r1.xyzw -mad r1.xyzw, cb0[7].xyzw, cb0[8].wwww, r1.xyzw -mul r2.xyzw, r1.yyyy, cb0[1].xyzw -mad r2.xyzw, cb0[0].xyzw, r1.xxxx, r2.xyzw -mad r2.xyzw, cb0[2].xyzw, r1.zzzz, r2.xyzw -mad r1.xyzw, cb0[3].xyzw, r1.wwww, r2.xyzw -mad r0.xyzw, r1.xyzw, v0.xxxx, r0.xyzw -mul r1.xyzw, cb0[5].xyzw, cb0[10].yyyy -mad r1.xyzw, cb0[4].xyzw, cb0[10].xxxx, r1.xyzw -mad r1.xyzw, cb0[6].xyzw, cb0[10].zzzz, r1.xyzw -mad r1.xyzw, cb0[7].xyzw, cb0[10].wwww, r1.xyzw -mul r2.xyzw, r1.yyyy, cb0[1].xyzw -mad r2.xyzw, cb0[0].xyzw, r1.xxxx, r2.xyzw -mad r2.xyzw, cb0[2].xyzw, r1.zzzz, r2.xyzw -mad r1.xyzw, cb0[3].xyzw, r1.wwww, r2.xyzw -mad r0.xyzw, r1.xyzw, v0.zzzz, r0.xyzw -mul r1.xyzw, cb0[5].xyzw, cb0[11].yyyy -mad r1.xyzw, cb0[4].xyzw, cb0[11].xxxx, r1.xyzw -mad r1.xyzw, cb0[6].xyzw, cb0[11].zzzz, r1.xyzw -mad r1.xyzw, cb0[7].xyzw, cb0[11].wwww, r1.xyzw -mul r2.xyzw, r1.yyyy, cb0[1].xyzw -mad r2.xyzw, cb0[0].xyzw, r1.xxxx, r2.xyzw -mad r2.xyzw, cb0[2].xyzw, r1.zzzz, r2.xyzw -mad r1.xyzw, cb0[3].xyzw, r1.wwww, r2.xyzw -mad o0.xyzw, r1.xyzw, v0.wwww, r0.xyzw -mov o1.xyzw, v1.xyzw -ret -// Approximately 38 instruction slots used -#endif - -const BYTE g_vs[] = { - 68, 88, 66, 67, 219, 142, 163, 147, 61, 87, 233, 137, 181, 167, 38, - 83, 15, 147, 27, 13, 1, 0, 0, 0, 112, 8, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, 84, 1, 0, 0, 164, 1, 0, 0, 248, - 1, 0, 0, 244, 7, 0, 0, 82, 68, 69, 70, 24, 1, 0, 0, - 1, 0, 0, 0, 72, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, - 0, 0, 4, 254, 255, 0, 1, 0, 0, 227, 0, 0, 0, 60, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 99, 98, 80, 101, 114, 79, 98, 106, 101, 99, 116, 0, 60, 0, 0, - 0, 3, 0, 0, 0, 96, 0, 0, 0, 192, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 64, - 0, 0, 0, 2, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, - 204, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 2, 0, 0, - 0, 188, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 128, 0, - 0, 0, 64, 0, 0, 0, 2, 0, 0, 0, 188, 0, 0, 0, 0, - 0, 0, 0, 112, 114, 111, 106, 101, 99, 116, 105, 111, 110, 77, 97, - 116, 114, 105, 120, 0, 171, 171, 171, 3, 0, 3, 0, 4, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 105, 101, 119, 77, 97, - 116, 114, 105, 120, 0, 119, 111, 114, 108, 100, 77, 97, 116, 114, 105, - 120, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, - 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, - 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, 83, 71, 78, 72, - 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 15, 15, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 15, 15, 0, 0, 80, - 79, 83, 73, 84, 73, 79, 78, 0, 67, 79, 76, 79, 82, 0, 171, - 79, 83, 71, 78, 76, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, - 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, - 0, 67, 79, 76, 79, 82, 0, 171, 171, 83, 72, 68, 82, 244, 5, - 0, 0, 64, 0, 1, 0, 125, 1, 0, 0, 89, 0, 0, 4, 70, - 142, 32, 0, 0, 0, 0, 0, 12, 0, 0, 0, 95, 0, 0, 3, - 242, 16, 16, 0, 0, 0, 0, 0, 95, 0, 0, 3, 242, 16, 16, - 0, 1, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 1, - 0, 0, 0, 104, 0, 0, 2, 3, 0, 0, 0, 56, 0, 0, 9, - 242, 0, 16, 0, 0, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 86, 133, 32, 0, 0, 0, 0, 0, 9, 0, - 0, 0, 50, 0, 0, 11, 242, 0, 16, 0, 0, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 6, 128, 32, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, - 0, 50, 0, 0, 11, 242, 0, 16, 0, 0, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 166, 138, 32, 0, 0, - 0, 0, 0, 9, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, - 50, 0, 0, 11, 242, 0, 16, 0, 0, 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 7, 0, 0, 0, 246, 143, 32, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 56, - 0, 0, 8, 242, 0, 16, 0, 1, 0, 0, 0, 86, 5, 16, 0, - 0, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 50, 0, 0, 10, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, - 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 166, 10, 16, 0, 0, 0, 0, 0, 70, 14, - 16, 0, 1, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 0, - 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 246, 15, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, - 0, 56, 0, 0, 7, 242, 0, 16, 0, 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, 86, 21, 16, 0, 0, 0, 0, 0, 56, - 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 86, 133, 32, 0, 0, 0, 0, - 0, 8, 0, 0, 0, 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 6, - 128, 32, 0, 0, 0, 0, 0, 8, 0, 0, 0, 70, 14, 16, 0, - 1, 0, 0, 0, 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, - 0, 70, 142, 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 166, 138, - 32, 0, 0, 0, 0, 0, 8, 0, 0, 0, 70, 14, 16, 0, 1, - 0, 0, 0, 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, 0, - 70, 142, 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, 246, 143, 32, - 0, 0, 0, 0, 0, 8, 0, 0, 0, 70, 14, 16, 0, 1, 0, - 0, 0, 56, 0, 0, 8, 242, 0, 16, 0, 2, 0, 0, 0, 86, - 5, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 2, 0, 0, - 0, 70, 142, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, - 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 50, - 0, 0, 10, 242, 0, 16, 0, 2, 0, 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 166, 10, 16, 0, 1, 0, 0, - 0, 70, 14, 16, 0, 2, 0, 0, 0, 50, 0, 0, 10, 242, 0, - 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 246, 15, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, - 2, 0, 0, 0, 50, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, - 0, 70, 14, 16, 0, 1, 0, 0, 0, 6, 16, 16, 0, 0, 0, - 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 56, 0, 0, 9, 242, - 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 86, 133, 32, 0, 0, 0, 0, 0, 10, 0, 0, - 0, 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 6, 128, 32, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, - 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 166, 138, 32, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 50, - 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 246, 143, 32, 0, 0, 0, 0, - 0, 10, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 56, 0, - 0, 8, 242, 0, 16, 0, 2, 0, 0, 0, 86, 5, 16, 0, 1, - 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 50, 0, 0, 10, 242, 0, 16, 0, 2, 0, 0, 0, 70, 142, 32, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 1, 0, - 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 50, 0, 0, 10, 242, - 0, 16, 0, 2, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 166, 10, 16, 0, 1, 0, 0, 0, 70, 14, 16, - 0, 2, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 1, 0, - 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 246, - 15, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, - 50, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 14, 16, - 0, 1, 0, 0, 0, 166, 26, 16, 0, 0, 0, 0, 0, 70, 14, - 16, 0, 0, 0, 0, 0, 56, 0, 0, 9, 242, 0, 16, 0, 1, - 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, - 86, 133, 32, 0, 0, 0, 0, 0, 11, 0, 0, 0, 50, 0, 0, - 11, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 6, 128, 32, 0, 0, 0, 0, 0, 11, - 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, - 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, 0, 11, 0, - 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, 242, - 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 246, 143, 32, 0, 0, 0, 0, 0, 11, 0, 0, - 0, 70, 14, 16, 0, 1, 0, 0, 0, 56, 0, 0, 8, 242, 0, - 16, 0, 2, 0, 0, 0, 86, 5, 16, 0, 1, 0, 0, 0, 70, - 142, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 10, - 242, 0, 16, 0, 2, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 16, 0, 1, 0, 0, 0, 70, 14, - 16, 0, 2, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 2, - 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 166, 10, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, - 0, 50, 0, 0, 10, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, - 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 246, 15, 16, 0, 1, - 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 50, 0, 0, 9, - 242, 32, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, - 0, 246, 31, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, - 0, 0, 54, 0, 0, 5, 242, 32, 16, 0, 1, 0, 0, 0, 70, - 30, 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, - 116, 0, 0, 0, 38, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 6.3.9600.16384 +// +// +// Buffer Definitions: +// +// cbuffer cbPerObject +// { +// +// float4x4 projectionMatrix; // Offset: 0 Size: 64 +// float4x4 viewMatrix; // Offset: 64 Size: 64 +// float4x4 worldMatrix; // Offset: 128 Size: 64 +// +// } +// +// +// Resource Bindings: +// +// Name Type Format Dim Slot Elements +// ------------------------------ ---------- ------- ----------- ---- -------- +// cbPerObject cbuffer NA NA 0 1 +// +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// POSITION 0 xyzw 0 NONE float xyzw +// COLOR 0 xyzw 1 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float xyzw +// COLOR 0 xyzw 1 NONE float xyzw +// +vs_4_0 +dcl_constantbuffer cb0[12], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyzw +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_temps 3 +mul r0.xyzw, cb0[5].xyzw, cb0[9].yyyy +mad r0.xyzw, cb0[4].xyzw, cb0[9].xxxx, r0.xyzw +mad r0.xyzw, cb0[6].xyzw, cb0[9].zzzz, r0.xyzw +mad r0.xyzw, cb0[7].xyzw, cb0[9].wwww, r0.xyzw +mul r1.xyzw, r0.yyyy, cb0[1].xyzw +mad r1.xyzw, cb0[0].xyzw, r0.xxxx, r1.xyzw +mad r1.xyzw, cb0[2].xyzw, r0.zzzz, r1.xyzw +mad r0.xyzw, cb0[3].xyzw, r0.wwww, r1.xyzw +mul r0.xyzw, r0.xyzw, v0.yyyy +mul r1.xyzw, cb0[5].xyzw, cb0[8].yyyy +mad r1.xyzw, cb0[4].xyzw, cb0[8].xxxx, r1.xyzw +mad r1.xyzw, cb0[6].xyzw, cb0[8].zzzz, r1.xyzw +mad r1.xyzw, cb0[7].xyzw, cb0[8].wwww, r1.xyzw +mul r2.xyzw, r1.yyyy, cb0[1].xyzw +mad r2.xyzw, cb0[0].xyzw, r1.xxxx, r2.xyzw +mad r2.xyzw, cb0[2].xyzw, r1.zzzz, r2.xyzw +mad r1.xyzw, cb0[3].xyzw, r1.wwww, r2.xyzw +mad r0.xyzw, r1.xyzw, v0.xxxx, r0.xyzw +mul r1.xyzw, cb0[5].xyzw, cb0[10].yyyy +mad r1.xyzw, cb0[4].xyzw, cb0[10].xxxx, r1.xyzw +mad r1.xyzw, cb0[6].xyzw, cb0[10].zzzz, r1.xyzw +mad r1.xyzw, cb0[7].xyzw, cb0[10].wwww, r1.xyzw +mul r2.xyzw, r1.yyyy, cb0[1].xyzw +mad r2.xyzw, cb0[0].xyzw, r1.xxxx, r2.xyzw +mad r2.xyzw, cb0[2].xyzw, r1.zzzz, r2.xyzw +mad r1.xyzw, cb0[3].xyzw, r1.wwww, r2.xyzw +mad r0.xyzw, r1.xyzw, v0.zzzz, r0.xyzw +mul r1.xyzw, cb0[5].xyzw, cb0[11].yyyy +mad r1.xyzw, cb0[4].xyzw, cb0[11].xxxx, r1.xyzw +mad r1.xyzw, cb0[6].xyzw, cb0[11].zzzz, r1.xyzw +mad r1.xyzw, cb0[7].xyzw, cb0[11].wwww, r1.xyzw +mul r2.xyzw, r1.yyyy, cb0[1].xyzw +mad r2.xyzw, cb0[0].xyzw, r1.xxxx, r2.xyzw +mad r2.xyzw, cb0[2].xyzw, r1.zzzz, r2.xyzw +mad r1.xyzw, cb0[3].xyzw, r1.wwww, r2.xyzw +mad o0.xyzw, r1.xyzw, v0.wwww, r0.xyzw +mov o1.xyzw, v1.xyzw +ret +// Approximately 38 instruction slots used +#endif + +const BYTE g_vs[] = { + 68, 88, 66, 67, 219, 142, 163, 147, 61, 87, 233, 137, 181, 167, 38, + 83, 15, 147, 27, 13, 1, 0, 0, 0, 112, 8, 0, 0, 5, 0, + 0, 0, 52, 0, 0, 0, 84, 1, 0, 0, 164, 1, 0, 0, 248, + 1, 0, 0, 244, 7, 0, 0, 82, 68, 69, 70, 24, 1, 0, 0, + 1, 0, 0, 0, 72, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, + 0, 0, 4, 254, 255, 0, 1, 0, 0, 227, 0, 0, 0, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 99, 98, 80, 101, 114, 79, 98, 106, 101, 99, 116, 0, 60, 0, 0, + 0, 3, 0, 0, 0, 96, 0, 0, 0, 192, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 64, + 0, 0, 0, 2, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, + 204, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 2, 0, 0, + 0, 188, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 128, 0, + 0, 0, 64, 0, 0, 0, 2, 0, 0, 0, 188, 0, 0, 0, 0, + 0, 0, 0, 112, 114, 111, 106, 101, 99, 116, 105, 111, 110, 77, 97, + 116, 114, 105, 120, 0, 171, 171, 171, 3, 0, 3, 0, 4, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 105, 101, 119, 77, 97, + 116, 114, 105, 120, 0, 119, 111, 114, 108, 100, 77, 97, 116, 114, 105, + 120, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, 32, 54, 46, 51, 46, 57, 54, 48, 48, + 46, 49, 54, 51, 56, 52, 0, 171, 171, 171, 73, 83, 71, 78, 72, + 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 15, 15, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 15, 15, 0, 0, 80, + 79, 83, 73, 84, 73, 79, 78, 0, 67, 79, 76, 79, 82, 0, 171, + 79, 83, 71, 78, 76, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, + 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 68, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, 78, + 0, 67, 79, 76, 79, 82, 0, 171, 171, 83, 72, 68, 82, 244, 5, + 0, 0, 64, 0, 1, 0, 125, 1, 0, 0, 89, 0, 0, 4, 70, + 142, 32, 0, 0, 0, 0, 0, 12, 0, 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, 0, 0, 95, 0, 0, 3, 242, 16, 16, + 0, 1, 0, 0, 0, 103, 0, 0, 4, 242, 32, 16, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, 32, 16, 0, 1, + 0, 0, 0, 104, 0, 0, 2, 3, 0, 0, 0, 56, 0, 0, 9, + 242, 0, 16, 0, 0, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, + 0, 5, 0, 0, 0, 86, 133, 32, 0, 0, 0, 0, 0, 9, 0, + 0, 0, 50, 0, 0, 11, 242, 0, 16, 0, 0, 0, 0, 0, 70, + 142, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 6, 128, 32, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, + 0, 50, 0, 0, 11, 242, 0, 16, 0, 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 166, 138, 32, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 242, 0, 16, 0, 0, 0, 0, 0, 70, 142, 32, + 0, 0, 0, 0, 0, 7, 0, 0, 0, 246, 143, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 56, + 0, 0, 8, 242, 0, 16, 0, 1, 0, 0, 0, 86, 5, 16, 0, + 0, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 50, 0, 0, 10, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, + 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 50, 0, 0, 10, + 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 166, 10, 16, 0, 0, 0, 0, 0, 70, 14, + 16, 0, 1, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 0, + 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, + 0, 56, 0, 0, 7, 242, 0, 16, 0, 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, 86, 21, 16, 0, 0, 0, 0, 0, 56, + 0, 0, 9, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 86, 133, 32, 0, 0, 0, 0, + 0, 8, 0, 0, 0, 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, + 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 6, + 128, 32, 0, 0, 0, 0, 0, 8, 0, 0, 0, 70, 14, 16, 0, + 1, 0, 0, 0, 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, + 0, 70, 142, 32, 0, 0, 0, 0, 0, 6, 0, 0, 0, 166, 138, + 32, 0, 0, 0, 0, 0, 8, 0, 0, 0, 70, 14, 16, 0, 1, + 0, 0, 0, 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, 0, + 70, 142, 32, 0, 0, 0, 0, 0, 7, 0, 0, 0, 246, 143, 32, + 0, 0, 0, 0, 0, 8, 0, 0, 0, 70, 14, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 8, 242, 0, 16, 0, 2, 0, 0, 0, 86, + 5, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 2, 0, 0, + 0, 70, 142, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 50, + 0, 0, 10, 242, 0, 16, 0, 2, 0, 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 166, 10, 16, 0, 1, 0, 0, + 0, 70, 14, 16, 0, 2, 0, 0, 0, 50, 0, 0, 10, 242, 0, + 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 246, 15, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 50, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, + 0, 70, 14, 16, 0, 1, 0, 0, 0, 6, 16, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, 0, 0, 0, 0, 56, 0, 0, 9, 242, + 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 86, 133, 32, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, 4, 0, 0, 0, 6, 128, 32, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, + 50, 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, + 0, 0, 0, 0, 0, 6, 0, 0, 0, 166, 138, 32, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 50, + 0, 0, 11, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 246, 143, 32, 0, 0, 0, 0, + 0, 10, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 56, 0, + 0, 8, 242, 0, 16, 0, 2, 0, 0, 0, 86, 5, 16, 0, 1, + 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 50, 0, 0, 10, 242, 0, 16, 0, 2, 0, 0, 0, 70, 142, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 1, 0, + 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 50, 0, 0, 10, 242, + 0, 16, 0, 2, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 166, 10, 16, 0, 1, 0, 0, 0, 70, 14, 16, + 0, 2, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 1, 0, + 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 246, + 15, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, + 50, 0, 0, 9, 242, 0, 16, 0, 0, 0, 0, 0, 70, 14, 16, + 0, 1, 0, 0, 0, 166, 26, 16, 0, 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, 56, 0, 0, 9, 242, 0, 16, 0, 1, + 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 86, 133, 32, 0, 0, 0, 0, 0, 11, 0, 0, 0, 50, 0, 0, + 11, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 6, 128, 32, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, + 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 166, 138, 32, 0, 0, 0, 0, 0, 11, 0, + 0, 0, 70, 14, 16, 0, 1, 0, 0, 0, 50, 0, 0, 11, 242, + 0, 16, 0, 1, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 246, 143, 32, 0, 0, 0, 0, 0, 11, 0, 0, + 0, 70, 14, 16, 0, 1, 0, 0, 0, 56, 0, 0, 8, 242, 0, + 16, 0, 2, 0, 0, 0, 86, 5, 16, 0, 1, 0, 0, 0, 70, + 142, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 10, + 242, 0, 16, 0, 2, 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 16, 0, 1, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, 50, 0, 0, 10, 242, 0, 16, 0, 2, + 0, 0, 0, 70, 142, 32, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 166, 10, 16, 0, 1, 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, + 0, 50, 0, 0, 10, 242, 0, 16, 0, 1, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, 3, 0, 0, 0, 246, 15, 16, 0, 1, + 0, 0, 0, 70, 14, 16, 0, 2, 0, 0, 0, 50, 0, 0, 9, + 242, 32, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 1, 0, 0, + 0, 246, 31, 16, 0, 0, 0, 0, 0, 70, 14, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 5, 242, 32, 16, 0, 1, 0, 0, 0, 70, + 30, 16, 0, 1, 0, 0, 0, 62, 0, 0, 1, 83, 84, 65, 84, + 116, 0, 0, 0, 38, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/installer/README.txt b/installer/README.txt index 2cd886a..4bc7e6f 100755 --- a/installer/README.txt +++ b/installer/README.txt @@ -1,191 +1,191 @@ -IMPORTANT: This installer only includes sample applications and the libraries and source code needed to compile applications. If you are running a pre-compiled Unity, Unreal, or other demo this will not update the version of RenderManager it is linked against; you must either obtain an updated demo or (if you're lucky) copy the RenderManager.dll file from this installer into appropriate location inside the game folder. - -IMPORTANT: Using DirectMode requires - nVidia driver version 364.64 or higher (364.47 and 364.51 have a bug preventing it from working). - or AMD Crimson drivers (tested with version 16.1). - -FAQ: If you have multiple GPUs not in SLI mode, you need to select "Activate all displays" instead of "SLI Disabled" in the nVidia Control Panel under "Configure SLI, Surround, PhysX" to make DirectMode work. - -Step 1: Run an OSVR server (obtained from an OSVR Core install) with a compatible configuration file. - (If you do not have this installed, you can run one of the servers using the installed shortcuts; - these are older-format files run against an older server, but should still work.) - osvr_server_nondirectmode_window: Displays in a window that can be moved around. - osvr_server_*: Configurations for various HMDs and modes - NOTE: As of version 6.36, AMD DirectMode will only work in Landscape mode. - The only current configuration file that works with AMD is OSVR HDK 1.2 landscape directmode. - You can also edit the other configuration files to make the rotation 0 rather than 90. - -Step 2: Run one of the example programs - RenderManager*: Various graphics libraries and modes of operation. - AdjustableRenderingDelayD3D: Shows the impact of timewarp with 500ms rendering delay. - RenderManagerOpenGLHeadSpaceExample: Displays a small cube in head space to debug backwards eyes. - SpinCubeD3D provides a smoothly-rotating cube to test update consistency. - SpinCubeOpenGL provides a smoothly-rotating cube with frame ID displayed to test update consistency. Timing info expects 60Hz DirectMode display device that blocks the app for vsync. - -If DirectMode fails, you can run the DirectModeDebugging program to list available displays on nVidia. -You can also run EnableOSVRDirectModeNVidia or EnableOSVRDirectModeAMD, depending on which type of graphics card you are using. - -NOTE: As of version 0.6.42, nVidia DirectMode only works with a driver that has been modified to white-list the display that you are using. This should be already in the driver versions above 361.43 for OSVR and Vuzix displays. - -An osvr_server.exe must be running to open a display (this is where it gets information about the distortion correction and other system parameters). The osvr_server.exe must use a configuration that defines /me/head (implicitly or explicitly) for head tracking to work. There are shortcuts to run the server with various configuration files. You can leave the server running and run multiple different clients one after the other. All clients should work with all servers. - -Since version 0.6.12, the configuration information for both the display and the RenderManager pipeline are read on the server. This file can be edited to change the behavior of the display, including turning direct_mode on and off and turning vertical sync on (set vertical_sync_block_rendering true). - -Since version 0.6.3, Time Warp works on both OpenGL and Direct3D, and in version 0.6.8 a feature was added to ask it to wait until just before vsync (reducing latency by reading new tracker reports right up until vsync). The DirectMode examples have this capability turned on. - -Since version 0.6.3, distortion correction works on both OpenGL and Direct3D. Since version 0.6.8, distortion correction can use an arbitrary polynomial distortion with respect to the distance from the center of projection on the screen. - -Source code for RenderManager, including example programs, is available at: - https://github.com/sensics/OSVR-RenderManager - -Version notes: -0.6.43: - *ftr Asynchronous time warp is working on all DirectRender configurations - *ftr Client-side per-eye prediction added to reduce judder and latency - *bug Multi-GPU support fixed (Intel + nVidia, with HDMI on nVidia) - ftr Smaller GPU memory use when not using Render() path, and OpenGL/D3D - ftr Now get black borders during time warp rather than texture clamping - ftr Added juddered-rendering example program to test time warp - ftr Added example program that does double-buffered ATW to reduce copies. - bug Removed unused (and un-filled) return structure from D3D open -0.6.42: - ISSUE Asynchronous Time Warp is broken (time warp is working) - ISSUE Multi-GPU support is broken (Intel + nVidia on same computer) - *ftr Handles a change in the nVidia DirectMode driver regarding HDCP - ftr Added DirectMode check for HTC Vive using vendor name HTC -0.6.41: - ISSUE Asynchronous Time Warp is broken (time warp is working) - ISSUE Multi-GPU support is broken (Intel + nVidia on same computer) - ftr Better config file defaults to avoid tearing, build improvements -0.6.40: - ISSUE Asynchronous Time Warp is broken (time warp is working) - ISSUE Multi-GPU support is broken (Intel + nVidia on same computer) - ftr Added ability to use built-in distortion mesh for OSVR HDK 1.3 -0.6.39: - ISSUE Asynchronous Time Warp is broken (time warp is working) - ISSUE Multi-GPU support is broken (Intel + nVidia on same computer) - *ftr Much more rapid unstructured grid distortion correction loading - *ftr Mac OpenGL Core profile support is now working - *ftr Builds and links (not yet tested) on Android - ftr Installer stored shortcuts in sub-folders by type - ftr Added GLES 2.0 sample program - ftr Removed all legacy OpenGL function calls from RenderManager - bug Fixed #define collision on Linux/X11 -0.6.38: - *bug Added header files needed to compile the example code - bug Updated the CMakeLists.txt file included with example code - bug Updated the cmake directory shipped with example code - bug Changed the meshdistort configuration to use relative paths -0.6.37: - *ftr Refactoring code to prepare for open-source release - *bug Fixed bug with OpenGL non-DirectMode introduced as part of mac port -0.6.36: - *ftr Added DirectMode (D2D) on AMD cards for both Direct3D11 and OpenGL - *ftr Asynchronous Time Warp (currently only in a single example program) - ftr Code compiles and links on mac (still needs fixing for OpenGL/Core) - *ftr DirectMode works on nVidia cards co-installed with an Intel card - *ftr DirectModeDebug tool added for nVidia DirectMode - *ftr Code compiles and runs on Linux with all non-DirectMode features -0.6.35: - *ftr Adding ability to read RGB unstructured distortion meshes - *ftr Includes DirectMode debugging program -0.6.34: - *ftr Direct mode working for machines with Intel + nVidia graphics cards - ftr Avoid forcing direct/nondirect mode when it is already set - bug Fixed uninitialized translation in D3D spinning-cube demo -0.6.33: - *ftr Added Oversample parameter to trade finer textures or faster renders -0.6.32: - ftr Added calls to set and clear room rotation from head orientation - ftr Added error checking and warning messages in Enable/Disable DirectMode -0.6.31: - *bug Fixes the mesh-creation code so that all paths denormalize coordinates - ftr Distortion mesh interpolator requires more-orthogonal triplets -0.6.30: - bug Handles systems with only the HDK 1.3 plugged in with new nVidia driver -0.6.29: - bug Uses version 1.1 of nVidia DirectMode, fixing DirectMode on HDKs -0.6.28: - ftr Display configuration parser that can handle more general files -0.6.27: - *bug Fixed oversized field of view introduced earlier (release 0.6.23?) -0.6.26: [Bad, do not use] - *ftr Enables the specification of a general angle-based distortion mesh - ftp Added DirectMode for additional HMD - bug Improved determination of number of displays (works for new configs) -0.6.25: [Bad, do not use] - *ftr Handles off-axis projection based on the display COP parameters - ftr Application can specify IPD when rendering - ftr Added C-API header files into the include directory - *bug Reverted texture-format introspection that caused problems with Unity - *bug Fixed the whitelist entries for SVR and SEN, they were backwards -0.6.24: [Bad, do not use] - ftr Added initial distortion correction for the OSVR HDK 1.3 - ftr Added ability to update distortion mesh while running - ftr Using release 1.0 version of nVidia DirectMode API -0.6.23: [Bad, do not use] - *ftr Added support for dSight dual-display mode in DirectMode and non - *bug Fixed the vertical field of view on OSVR configuration files - bug Fixed the aspect ratio for the windowed example config -0.6.22: - ftr Added per-frame time testing in SpinCubeOpenGL (assumes 60 Hz) - *bug Fixed bug where D3D render/callback path was rendering at half rate - *bug Fixed DirectMode display glitches - bug Viewport set-up now handles overlap_percent entry in config file - bug Handles window quit events from SDL - *ftr Alpha support for dual DirectMode displays (1-buffer rendering only) - ftr Adds support for two-window, two-display HMDs - ftr Enables updating of distortion mesh during run from D3D - ftr Per-eye timing information -0.6.21: - *ftr The application now passes the RenderInfo and Render params back to present - ftr Applications can now specify near and far clipping planes - bug Turning parameters into const references where possible - bug Render() callbacks not called for spaces that do not exist - *ftr Adding mutex to make RenderManager more thread-safe - ftr Making a separate client context for RenderManager (thread safety) - ftr Enabling the application to double-buffer to avoid copies in ATW - bug Checks for zero-sized buffers to enable error report rather than crash -0.6.20: - ftr Removed frame delay when specifying both sync and app-block sync - *bug Check for extra vsync to reduce incidence of screen tearing - *bug Fixed vendor ID for Vuzix display, now working with iWear - bug Removed double-width buffer sizes for rendering buffers - bug Fixed the 2D D3D example program so it shows triangles again - ftr Powers off DirectMode displays when we close them - bug Busy-waits rather than sleeps in demos to avoid O/S delays -0.6.19: - *bug Adds predictive tracking to reduce perceived latency - ftr Adds configuration file and white list for alpha support of Vuzix display -0.6.18: - *ftr Added CMakeLists.txt and instructions for compiling. - ftr Fixed Render() callback-based approach in Direct3D, added example. - ftr Added program to demonstrate drawing a small cube in head space - *bug Fixed Direct3D programs to render correct eyes at 90 and 270 rotations - *bug The code now reads and responds to the swap_eyes entry in display config -0.6.17: - *ftr Applications can now register the same buffer for multiple eyes -0.6.16: - ftr Added an OpenGL spinning-cube demo that prints frame ID in a HUD - *bug Fixed the Render path in OpenGL so objects get drawn in correct spaces - *bug Made the distortion mesh much finer to reduce artifacts - *bug Turned back on distortion in the second eye (was off for debugging) - *bug The code now responds to time warp enable in config (was not being used) -0.6.15: - ftr Added Visual Studio merge modules for CRT and MFC to installer - ftr Added new shortcut to spin the rotating cube backwards for smoothness debug -0.6.14: - ftr Added configuration file to run in a non-directmode mono window -0.6.13: - ftr Added program that spins the cube around the vertical axis -0.6.12: - *ftr Moves the configuration files to the server side. - *ftr Client application sets the type of rendering to use, not config file - bug Render routines check to see if the display has been opened to avoid crashing. - ftr Removed depth buffer clearing (and existence) from internal rendering pass - bug Failure to obtain high-priority rendering now returns PARTIAL rather than FAILURE -0.6.11: - bug Includes the Visual Studio redistributable runtime and Direct3D compiler DLL. -0.6.10: - bug Fixed matrix-order problem where flipping in Y did not work for 90/270 screen rotations. - ftr Turns on vsync by default for the direct-mode examples to avoid tearing. +IMPORTANT: This installer only includes sample applications and the libraries and source code needed to compile applications. If you are running a pre-compiled Unity, Unreal, or other demo this will not update the version of RenderManager it is linked against; you must either obtain an updated demo or (if you're lucky) copy the RenderManager.dll file from this installer into appropriate location inside the game folder. + +IMPORTANT: Using DirectMode requires + nVidia driver version 364.64 or higher (364.47 and 364.51 have a bug preventing it from working). + or AMD Crimson drivers (tested with version 16.1). + +FAQ: If you have multiple GPUs not in SLI mode, you need to select "Activate all displays" instead of "SLI Disabled" in the nVidia Control Panel under "Configure SLI, Surround, PhysX" to make DirectMode work. + +Step 1: Run an OSVR server (obtained from an OSVR Core install) with a compatible configuration file. + (If you do not have this installed, you can run one of the servers using the installed shortcuts; + these are older-format files run against an older server, but should still work.) + osvr_server_nondirectmode_window: Displays in a window that can be moved around. + osvr_server_*: Configurations for various HMDs and modes + NOTE: As of version 6.36, AMD DirectMode will only work in Landscape mode. + The only current configuration file that works with AMD is OSVR HDK 1.2 landscape directmode. + You can also edit the other configuration files to make the rotation 0 rather than 90. + +Step 2: Run one of the example programs + RenderManager*: Various graphics libraries and modes of operation. + AdjustableRenderingDelayD3D: Shows the impact of timewarp with 500ms rendering delay. + RenderManagerOpenGLHeadSpaceExample: Displays a small cube in head space to debug backwards eyes. + SpinCubeD3D provides a smoothly-rotating cube to test update consistency. + SpinCubeOpenGL provides a smoothly-rotating cube with frame ID displayed to test update consistency. Timing info expects 60Hz DirectMode display device that blocks the app for vsync. + +If DirectMode fails, you can run the DirectModeDebugging program to list available displays on nVidia. +You can also run EnableOSVRDirectModeNVidia or EnableOSVRDirectModeAMD, depending on which type of graphics card you are using. + +NOTE: As of version 0.6.42, nVidia DirectMode only works with a driver that has been modified to white-list the display that you are using. This should be already in the driver versions above 361.43 for OSVR and Vuzix displays. + +An osvr_server.exe must be running to open a display (this is where it gets information about the distortion correction and other system parameters). The osvr_server.exe must use a configuration that defines /me/head (implicitly or explicitly) for head tracking to work. There are shortcuts to run the server with various configuration files. You can leave the server running and run multiple different clients one after the other. All clients should work with all servers. + +Since version 0.6.12, the configuration information for both the display and the RenderManager pipeline are read on the server. This file can be edited to change the behavior of the display, including turning direct_mode on and off and turning vertical sync on (set vertical_sync_block_rendering true). + +Since version 0.6.3, Time Warp works on both OpenGL and Direct3D, and in version 0.6.8 a feature was added to ask it to wait until just before vsync (reducing latency by reading new tracker reports right up until vsync). The DirectMode examples have this capability turned on. + +Since version 0.6.3, distortion correction works on both OpenGL and Direct3D. Since version 0.6.8, distortion correction can use an arbitrary polynomial distortion with respect to the distance from the center of projection on the screen. + +Source code for RenderManager, including example programs, is available at: + https://github.com/sensics/OSVR-RenderManager + +Version notes: +0.6.43: + *ftr Asynchronous time warp is working on all DirectRender configurations + *ftr Client-side per-eye prediction added to reduce judder and latency + *bug Multi-GPU support fixed (Intel + nVidia, with HDMI on nVidia) + ftr Smaller GPU memory use when not using Render() path, and OpenGL/D3D + ftr Now get black borders during time warp rather than texture clamping + ftr Added juddered-rendering example program to test time warp + ftr Added example program that does double-buffered ATW to reduce copies. + bug Removed unused (and un-filled) return structure from D3D open +0.6.42: + ISSUE Asynchronous Time Warp is broken (time warp is working) + ISSUE Multi-GPU support is broken (Intel + nVidia on same computer) + *ftr Handles a change in the nVidia DirectMode driver regarding HDCP + ftr Added DirectMode check for HTC Vive using vendor name HTC +0.6.41: + ISSUE Asynchronous Time Warp is broken (time warp is working) + ISSUE Multi-GPU support is broken (Intel + nVidia on same computer) + ftr Better config file defaults to avoid tearing, build improvements +0.6.40: + ISSUE Asynchronous Time Warp is broken (time warp is working) + ISSUE Multi-GPU support is broken (Intel + nVidia on same computer) + ftr Added ability to use built-in distortion mesh for OSVR HDK 1.3 +0.6.39: + ISSUE Asynchronous Time Warp is broken (time warp is working) + ISSUE Multi-GPU support is broken (Intel + nVidia on same computer) + *ftr Much more rapid unstructured grid distortion correction loading + *ftr Mac OpenGL Core profile support is now working + *ftr Builds and links (not yet tested) on Android + ftr Installer stored shortcuts in sub-folders by type + ftr Added GLES 2.0 sample program + ftr Removed all legacy OpenGL function calls from RenderManager + bug Fixed #define collision on Linux/X11 +0.6.38: + *bug Added header files needed to compile the example code + bug Updated the CMakeLists.txt file included with example code + bug Updated the cmake directory shipped with example code + bug Changed the meshdistort configuration to use relative paths +0.6.37: + *ftr Refactoring code to prepare for open-source release + *bug Fixed bug with OpenGL non-DirectMode introduced as part of mac port +0.6.36: + *ftr Added DirectMode (D2D) on AMD cards for both Direct3D11 and OpenGL + *ftr Asynchronous Time Warp (currently only in a single example program) + ftr Code compiles and links on mac (still needs fixing for OpenGL/Core) + *ftr DirectMode works on nVidia cards co-installed with an Intel card + *ftr DirectModeDebug tool added for nVidia DirectMode + *ftr Code compiles and runs on Linux with all non-DirectMode features +0.6.35: + *ftr Adding ability to read RGB unstructured distortion meshes + *ftr Includes DirectMode debugging program +0.6.34: + *ftr Direct mode working for machines with Intel + nVidia graphics cards + ftr Avoid forcing direct/nondirect mode when it is already set + bug Fixed uninitialized translation in D3D spinning-cube demo +0.6.33: + *ftr Added Oversample parameter to trade finer textures or faster renders +0.6.32: + ftr Added calls to set and clear room rotation from head orientation + ftr Added error checking and warning messages in Enable/Disable DirectMode +0.6.31: + *bug Fixes the mesh-creation code so that all paths denormalize coordinates + ftr Distortion mesh interpolator requires more-orthogonal triplets +0.6.30: + bug Handles systems with only the HDK 1.3 plugged in with new nVidia driver +0.6.29: + bug Uses version 1.1 of nVidia DirectMode, fixing DirectMode on HDKs +0.6.28: + ftr Display configuration parser that can handle more general files +0.6.27: + *bug Fixed oversized field of view introduced earlier (release 0.6.23?) +0.6.26: [Bad, do not use] + *ftr Enables the specification of a general angle-based distortion mesh + ftp Added DirectMode for additional HMD + bug Improved determination of number of displays (works for new configs) +0.6.25: [Bad, do not use] + *ftr Handles off-axis projection based on the display COP parameters + ftr Application can specify IPD when rendering + ftr Added C-API header files into the include directory + *bug Reverted texture-format introspection that caused problems with Unity + *bug Fixed the whitelist entries for SVR and SEN, they were backwards +0.6.24: [Bad, do not use] + ftr Added initial distortion correction for the OSVR HDK 1.3 + ftr Added ability to update distortion mesh while running + ftr Using release 1.0 version of nVidia DirectMode API +0.6.23: [Bad, do not use] + *ftr Added support for dSight dual-display mode in DirectMode and non + *bug Fixed the vertical field of view on OSVR configuration files + bug Fixed the aspect ratio for the windowed example config +0.6.22: + ftr Added per-frame time testing in SpinCubeOpenGL (assumes 60 Hz) + *bug Fixed bug where D3D render/callback path was rendering at half rate + *bug Fixed DirectMode display glitches + bug Viewport set-up now handles overlap_percent entry in config file + bug Handles window quit events from SDL + *ftr Alpha support for dual DirectMode displays (1-buffer rendering only) + ftr Adds support for two-window, two-display HMDs + ftr Enables updating of distortion mesh during run from D3D + ftr Per-eye timing information +0.6.21: + *ftr The application now passes the RenderInfo and Render params back to present + ftr Applications can now specify near and far clipping planes + bug Turning parameters into const references where possible + bug Render() callbacks not called for spaces that do not exist + *ftr Adding mutex to make RenderManager more thread-safe + ftr Making a separate client context for RenderManager (thread safety) + ftr Enabling the application to double-buffer to avoid copies in ATW + bug Checks for zero-sized buffers to enable error report rather than crash +0.6.20: + ftr Removed frame delay when specifying both sync and app-block sync + *bug Check for extra vsync to reduce incidence of screen tearing + *bug Fixed vendor ID for Vuzix display, now working with iWear + bug Removed double-width buffer sizes for rendering buffers + bug Fixed the 2D D3D example program so it shows triangles again + ftr Powers off DirectMode displays when we close them + bug Busy-waits rather than sleeps in demos to avoid O/S delays +0.6.19: + *bug Adds predictive tracking to reduce perceived latency + ftr Adds configuration file and white list for alpha support of Vuzix display +0.6.18: + *ftr Added CMakeLists.txt and instructions for compiling. + ftr Fixed Render() callback-based approach in Direct3D, added example. + ftr Added program to demonstrate drawing a small cube in head space + *bug Fixed Direct3D programs to render correct eyes at 90 and 270 rotations + *bug The code now reads and responds to the swap_eyes entry in display config +0.6.17: + *ftr Applications can now register the same buffer for multiple eyes +0.6.16: + ftr Added an OpenGL spinning-cube demo that prints frame ID in a HUD + *bug Fixed the Render path in OpenGL so objects get drawn in correct spaces + *bug Made the distortion mesh much finer to reduce artifacts + *bug Turned back on distortion in the second eye (was off for debugging) + *bug The code now responds to time warp enable in config (was not being used) +0.6.15: + ftr Added Visual Studio merge modules for CRT and MFC to installer + ftr Added new shortcut to spin the rotating cube backwards for smoothness debug +0.6.14: + ftr Added configuration file to run in a non-directmode mono window +0.6.13: + ftr Added program that spins the cube around the vertical axis +0.6.12: + *ftr Moves the configuration files to the server side. + *ftr Client application sets the type of rendering to use, not config file + bug Render routines check to see if the display has been opened to avoid crashing. + ftr Removed depth buffer clearing (and existence) from internal rendering pass + bug Failure to obtain high-priority rendering now returns PARTIAL rather than FAILURE +0.6.11: + bug Includes the Visual Studio redistributable runtime and Direct3D compiler DLL. +0.6.10: + bug Fixed matrix-order problem where flipping in Y did not work for 90/270 screen rotations. + ftr Turns on vsync by default for the direct-mode examples to avoid tearing. diff --git a/installer/README_build.txt b/installer/README_build.txt index 6cc4150..bdbef0a 100755 --- a/installer/README_build.txt +++ b/installer/README_build.txt @@ -1,26 +1,26 @@ -IMPORTANT: Version 0.6.21 has some changes to the API that will require applications built against RenderManager to be updated. See the release notes and example programs. - -In addition to binaries, the RenderManager installer includes all of the source code needed to build and link the example programs. -It also includes a CMakeLists.txt file and associated Find files in the cmake/ directory. - -Building from source requires a number of external libraries: - OpenGL (should be built in with your compiler) - OSVR libraries and headers: - osvr (osvr.org) - libfunctionality (included with OSVR) - jsoncpp (https://github.com/open-source-parsers/jsoncpp) - VRPN (vrpn.org) - quatlib (comes with VRPN) - GLEW (http://glew.sourceforge.net/) - SDL2 (https://www.libsdl.org/index.php) - -Once the above libraries have been installed, you need to point CMake at each of them, using either cmake-gui or ccmake. - -The build has, as of release 0.6.18, only been tested on Windows with the 64-bit Windows binaries for osvrRenderManager. This requires 64-bit binaries for the other libraries as well. - -You should be able to build your own programs by copying the CMakeLists.txt file, the cmake/ directory, and one of the source files to a new directory. -Then you can rename the file and modify CMakeLists.txt to build that application and remove the others. - -Once the programs have been compiled, the associated DLLs need to be copied into the path, or into the same directory as the executables, before you can run them. - - +IMPORTANT: Version 0.6.21 has some changes to the API that will require applications built against RenderManager to be updated. See the release notes and example programs. + +In addition to binaries, the RenderManager installer includes all of the source code needed to build and link the example programs. +It also includes a CMakeLists.txt file and associated Find files in the cmake/ directory. + +Building from source requires a number of external libraries: + OpenGL (should be built in with your compiler) + OSVR libraries and headers: + osvr (osvr.org) + libfunctionality (included with OSVR) + jsoncpp (https://github.com/open-source-parsers/jsoncpp) + VRPN (vrpn.org) + quatlib (comes with VRPN) + GLEW (http://glew.sourceforge.net/) + SDL2 (https://www.libsdl.org/index.php) + +Once the above libraries have been installed, you need to point CMake at each of them, using either cmake-gui or ccmake. + +The build has, as of release 0.6.18, only been tested on Windows with the 64-bit Windows binaries for osvrRenderManager. This requires 64-bit binaries for the other libraries as well. + +You should be able to build your own programs by copying the CMakeLists.txt file, the cmake/ directory, and one of the source files to a new directory. +Then you can rename the file and modify CMakeLists.txt to build that application and remove the others. + +Once the programs have been compiled, the associated DLLs need to be copied into the path, or into the same directory as the executables, before you can run them. + + diff --git a/installer/directmode_HDK1.2.json b/installer/directmode_HDK1.2.json index 42f9a74..196f4e2 100755 --- a/installer/directmode_HDK1.2.json +++ b/installer/directmode_HDK1.2.json @@ -1,98 +1,98 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK in DirectMode in portrait mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1 ], - "polynomial_coeffs_green": [ 0, 1 ], - "polynomial_coeffs_blue": [ 0, 1 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK in DirectMode in portrait mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1 ], + "polynomial_coeffs_green": [ 0, 1 ], + "polynomial_coeffs_blue": [ 0, 1 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/directmode_HDK1.2_landscape.json b/installer/directmode_HDK1.2_landscape.json index fde3e88..27be19b 100755 --- a/installer/directmode_HDK1.2_landscape.json +++ b/installer/directmode_HDK1.2_landscape.json @@ -1,98 +1,98 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 0, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK in DirectMode in portrait mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1 ], - "polynomial_coeffs_green": [ 0, 1 ], - "polynomial_coeffs_blue": [ 0, 1 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 0, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK in DirectMode in portrait mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1 ], + "polynomial_coeffs_green": [ 0, 1 ], + "polynomial_coeffs_blue": [ 0, 1 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/directmode_HDK1.3.json b/installer/directmode_HDK1.3.json index b82a44c..91bc6ae 100755 --- a/installer/directmode_HDK1.3.json +++ b/installer/directmode_HDK1.3.json @@ -1,98 +1,98 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK in DirectMode in portrait mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], - "polynomial_coeffs_green": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], - "polynomial_coeffs_blue": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.471, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.529, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK in DirectMode in portrait mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], + "polynomial_coeffs_green": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], + "polynomial_coeffs_blue": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.471, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.529, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/directmode_HDK1.3_ATW.json b/installer/directmode_HDK1.3_ATW.json index 242a25d..3e5604f 100644 --- a/installer/directmode_HDK1.3_ATW.json +++ b/installer/directmode_HDK1.3_ATW.json @@ -1,98 +1,98 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": true, - "maxMsBeforeVSync": 2 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK in DirectMode in portrait mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], - "polynomial_coeffs_green": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], - "polynomial_coeffs_blue": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.471, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.529, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": true, + "maxMsBeforeVSync": 2 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK in DirectMode in portrait mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], + "polynomial_coeffs_green": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], + "polynomial_coeffs_blue": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.471, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.529, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/directmode_HDK1.3_built_in.json b/installer/directmode_HDK1.3_built_in.json index 1be85ee..a8aab8c 100644 --- a/installer/directmode_HDK1.3_built_in.json +++ b/installer/directmode_HDK1.3_built_in.json @@ -1,96 +1,96 @@ -{ - "sleep": 0, - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 2, - "Version": "1.3", - "Note": "OSVR HDK 1.3 in DirectMode" - } - }, - "field_of_view": { - "monocular_horizontal": 92, - "monocular_vertical": 92, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 2, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "type": "mono_point_samples", - "mono_point_samples_built_in": "OSVR_HDK_13_V1" - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} - +{ + "sleep": 0, + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 2, + "Version": "1.3", + "Note": "OSVR HDK 1.3 in DirectMode" + } + }, + "field_of_view": { + "monocular_horizontal": 92, + "monocular_vertical": 92, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 2, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "type": "mono_point_samples", + "mono_point_samples_built_in": "OSVR_HDK_13_V1" + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} + diff --git a/installer/directmode_HDK1.3_mesh_client.json b/installer/directmode_HDK1.3_mesh_client.json index ed40088..8a595dc 100755 --- a/installer/directmode_HDK1.3_mesh_client.json +++ b/installer/directmode_HDK1.3_mesh_client.json @@ -1,2856 +1,2856 @@ -{ - "display": { - "hmd": { - "field_of_view": { - "monocular_horizontal": 92, - "monocular_vertical": 92, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "distortion": { - "type": "mono_point_samples", - "mono_point_samples": [ -[ - [ [0.9636,0.3251], [1,0.3] ] -,[ [0.9702,0.3442], [1,0.3252] ] -,[ [0.9752,0.3654], [1,0.3496] ] -,[ [0.9785,0.3871], [1,0.3751] ] -,[ [0.9818,0.4092], [1,0.4] ] -,[ [0.9835,0.4317], [1,0.425] ] -,[ [0.9851,0.4543], [1,0.45] ] -,[ [0.9851,0.4771], [1,0.475] ] -,[ [0.9851,0.5], [1,0.5] ] -,[ [0.9851,0.5229], [1,0.525] ] -,[ [0.9851,0.5457], [1,0.55] ] -,[ [0.9835,0.5683], [1,0.575] ] -,[ [0.9818,0.5908], [1,0.6] ] -,[ [0.9785,0.6129], [1,0.6249] ] -,[ [0.9752,0.6346], [1,0.6504] ] -,[ [0.9702,0.6558], [1,0.6748] ] -,[ [0.9636,0.6749], [1,0.7] ] -,[ [0.9487,0.2986], [0.9745,0.2748] ] -,[ [0.9537,0.3192], [0.9745,0.3] ] -,[ [0.957,0.3413], [0.9745,0.3252] ] -,[ [0.9603,0.3624], [0.9745,0.3496] ] -,[ [0.9636,0.3848], [0.9745,0.3751] ] -,[ [0.9653,0.4074], [0.9745,0.4] ] -,[ [0.9669,0.4303], [0.9745,0.425] ] -,[ [0.9686,0.4534], [0.9745,0.45] ] -,[ [0.9686,0.4766], [0.9745,0.475] ] -,[ [0.9702,0.5], [0.9745,0.5] ] -,[ [0.9686,0.5234], [0.9745,0.525] ] -,[ [0.9686,0.5466], [0.9745,0.55] ] -,[ [0.9669,0.5697], [0.9745,0.575] ] -,[ [0.9653,0.5926], [0.9745,0.6] ] -,[ [0.9636,0.6152], [0.9745,0.6249] ] -,[ [0.9603,0.6376], [0.9745,0.6504] ] -,[ [0.957,0.6587], [0.9745,0.6748] ] -,[ [0.9537,0.6808], [0.9745,0.7] ] -,[ [0.9487,0.7014], [0.9745,0.7252] ] -,[ [0.9223,0.2546], [0.9503,0.2246] ] -,[ [0.9289,0.2737], [0.9503,0.2497] ] -,[ [0.9339,0.2942], [0.9503,0.2748] ] -,[ [0.9372,0.3163], [0.9503,0.3] ] -,[ [0.9405,0.3383], [0.9503,0.3252] ] -,[ [0.9438,0.3599], [0.9503,0.3496] ] -,[ [0.9454,0.3827], [0.9503,0.3751] ] -,[ [0.9487,0.4058], [0.9503,0.4] ] -,[ [0.9504,0.429], [0.9503,0.425] ] -,[ [0.9504,0.4525], [0.9503,0.45] ] -,[ [0.9521,0.4762], [0.9503,0.475] ] -,[ [0.9521,0.5], [0.9503,0.5] ] -,[ [0.9521,0.5238], [0.9503,0.525] ] -,[ [0.9504,0.5475], [0.9503,0.55] ] -,[ [0.9504,0.571], [0.9503,0.575] ] -,[ [0.9487,0.5942], [0.9503,0.6] ] -,[ [0.9454,0.6173], [0.9503,0.6249] ] -,[ [0.9438,0.6401], [0.9503,0.6504] ] -,[ [0.9405,0.6617], [0.9503,0.6748] ] -,[ [0.9372,0.6837], [0.9503,0.7] ] -,[ [0.9339,0.7058], [0.9503,0.7252] ] -,[ [0.9289,0.7263], [0.9503,0.7503] ] -,[ [0.9223,0.7454], [0.9503,0.7754] ] -,[ [0.9008,0.2296], [0.9257,0.1995] ] -,[ [0.9058,0.2501], [0.9257,0.2246] ] -,[ [0.9107,0.2693], [0.9257,0.2497] ] -,[ [0.9157,0.2913], [0.9257,0.2748] ] -,[ [0.919,0.3133], [0.9257,0.3] ] -,[ [0.9223,0.3354], [0.9257,0.3252] ] -,[ [0.9256,0.3576], [0.9257,0.3496] ] -,[ [0.9272,0.3805], [0.9257,0.3751] ] -,[ [0.9306,0.404], [0.9257,0.4] ] -,[ [0.9322,0.4277], [0.9257,0.425] ] -,[ [0.9322,0.4516], [0.9257,0.45] ] -,[ [0.9339,0.4757], [0.9257,0.475] ] -,[ [0.9339,0.5], [0.9257,0.5] ] -,[ [0.9339,0.5243], [0.9257,0.525] ] -,[ [0.9322,0.5484], [0.9257,0.55] ] -,[ [0.9322,0.5723], [0.9257,0.575] ] -,[ [0.9306,0.596], [0.9257,0.6] ] -,[ [0.9272,0.6195], [0.9257,0.6249] ] -,[ [0.9256,0.6424], [0.9257,0.6504] ] -,[ [0.9223,0.6646], [0.9257,0.6748] ] -,[ [0.919,0.6867], [0.9257,0.7] ] -,[ [0.9157,0.7087], [0.9257,0.7252] ] -,[ [0.9107,0.7307], [0.9257,0.7503] ] -,[ [0.9058,0.7499], [0.9257,0.7754] ] -,[ [0.9008,0.7704], [0.9257,0.8005] ] -,[ [0.8694,0.1899], [0.8994,0.1505] ] -,[ [0.8776,0.2061], [0.8994,0.1755] ] -,[ [0.8826,0.2252], [0.8994,0.1995] ] -,[ [0.8876,0.2457], [0.8994,0.2246] ] -,[ [0.8925,0.2663], [0.8994,0.2497] ] -,[ [0.8958,0.2869], [0.8994,0.2748] ] -,[ [0.8991,0.3089], [0.8994,0.3] ] -,[ [0.9024,0.3325], [0.8994,0.3252] ] -,[ [0.9058,0.3549], [0.8994,0.3496] ] -,[ [0.9091,0.3783], [0.8994,0.3751] ] -,[ [0.9107,0.4021], [0.8994,0.4] ] -,[ [0.914,0.4262], [0.8994,0.425] ] -,[ [0.9157,0.4506], [0.8994,0.45] ] -,[ [0.9157,0.4753], [0.8994,0.475] ] -,[ [0.9157,0.5], [0.8994,0.5] ] -,[ [0.9157,0.5247], [0.8994,0.525] ] -,[ [0.9157,0.5494], [0.8994,0.55] ] -,[ [0.914,0.5738], [0.8994,0.575] ] -,[ [0.9107,0.5979], [0.8994,0.6] ] -,[ [0.9091,0.6217], [0.8994,0.6249] ] -,[ [0.9058,0.6451], [0.8994,0.6504] ] -,[ [0.9024,0.6675], [0.8994,0.6748] ] -,[ [0.8991,0.6911], [0.8994,0.7] ] -,[ [0.8958,0.7131], [0.8994,0.7252] ] -,[ [0.8925,0.7337], [0.8994,0.7503] ] -,[ [0.8876,0.7543], [0.8994,0.7754] ] -,[ [0.8826,0.7748], [0.8994,0.8005] ] -,[ [0.8776,0.7939], [0.8994,0.8245] ] -,[ [0.8694,0.8101], [0.8994,0.8495] ] -,[ [0.8462,0.1664], [0.8745,0.1255] ] -,[ [0.8528,0.1825], [0.8745,0.1505] ] -,[ [0.8578,0.2016], [0.8745,0.1755] ] -,[ [0.8628,0.2208], [0.8745,0.1995] ] -,[ [0.8677,0.2413], [0.8745,0.2246] ] -,[ [0.871,0.2619], [0.8745,0.2497] ] -,[ [0.876,0.284], [0.8745,0.2748] ] -,[ [0.8793,0.306], [0.8745,0.3] ] -,[ [0.8826,0.3295], [0.8745,0.3252] ] -,[ [0.8876,0.3516], [0.8745,0.3496] ] -,[ [0.8909,0.3758], [0.8745,0.3751] ] -,[ [0.8925,0.3999], [0.8745,0.4] ] -,[ [0.8958,0.4246], [0.8745,0.425] ] -,[ [0.8975,0.4496], [0.8745,0.45] ] -,[ [0.8975,0.4747], [0.8745,0.475] ] -,[ [0.8975,0.5], [0.8745,0.5] ] -,[ [0.8975,0.5253], [0.8745,0.525] ] -,[ [0.8975,0.5504], [0.8745,0.55] ] -,[ [0.8958,0.5754], [0.8745,0.575] ] -,[ [0.8925,0.6001], [0.8745,0.6] ] -,[ [0.8909,0.6242], [0.8745,0.6249] ] -,[ [0.8876,0.6484], [0.8745,0.6504] ] -,[ [0.8826,0.6705], [0.8745,0.6748] ] -,[ [0.8793,0.694], [0.8745,0.7] ] -,[ [0.876,0.716], [0.8745,0.7252] ] -,[ [0.871,0.7381], [0.8745,0.7503] ] -,[ [0.8677,0.7587], [0.8745,0.7754] ] -,[ [0.8628,0.7792], [0.8745,0.8005] ] -,[ [0.8578,0.7984], [0.8745,0.8245] ] -,[ [0.8528,0.8175], [0.8745,0.8495] ] -,[ [0.8462,0.8336], [0.8745,0.8745] ] -,[ [0.828,0.1605], [0.8495,0.1255] ] -,[ [0.833,0.1781], [0.8495,0.1505] ] -,[ [0.838,0.1972], [0.8495,0.1755] ] -,[ [0.8429,0.2178], [0.8495,0.1995] ] -,[ [0.8462,0.2384], [0.8495,0.2246] ] -,[ [0.8512,0.259], [0.8495,0.2497] ] -,[ [0.8545,0.281], [0.8495,0.2748] ] -,[ [0.8595,0.3031], [0.8495,0.3] ] -,[ [0.8628,0.3251], [0.8495,0.3252] ] -,[ [0.8677,0.3486], [0.8495,0.3496] ] -,[ [0.871,0.373], [0.8495,0.3751] ] -,[ [0.8743,0.3977], [0.8495,0.4] ] -,[ [0.876,0.4228], [0.8495,0.425] ] -,[ [0.8776,0.4483], [0.8495,0.45] ] -,[ [0.8793,0.4741], [0.8495,0.475] ] -,[ [0.8793,0.5], [0.8495,0.5] ] -,[ [0.8793,0.5259], [0.8495,0.525] ] -,[ [0.8776,0.5517], [0.8495,0.55] ] -,[ [0.876,0.5772], [0.8495,0.575] ] -,[ [0.8743,0.6023], [0.8495,0.6] ] -,[ [0.871,0.627], [0.8495,0.6249] ] -,[ [0.8677,0.6514], [0.8495,0.6504] ] -,[ [0.8628,0.6749], [0.8495,0.6748] ] -,[ [0.8595,0.6969], [0.8495,0.7] ] -,[ [0.8545,0.719], [0.8495,0.7252] ] -,[ [0.8512,0.741], [0.8495,0.7503] ] -,[ [0.8462,0.7616], [0.8495,0.7754] ] -,[ [0.8429,0.7822], [0.8495,0.8005] ] -,[ [0.838,0.8028], [0.8495,0.8245] ] -,[ [0.833,0.8219], [0.8495,0.8495] ] -,[ [0.828,0.8395], [0.8495,0.8745] ] -,[ [0.8016,0.1384], [0.8245,0.1006] ] -,[ [0.8065,0.1561], [0.8245,0.1255] ] -,[ [0.8115,0.1737], [0.8245,0.1505] ] -,[ [0.8165,0.1928], [0.8245,0.1755] ] -,[ [0.8198,0.2134], [0.8245,0.1995] ] -,[ [0.8247,0.234], [0.8245,0.2246] ] -,[ [0.8297,0.2546], [0.8245,0.2497] ] -,[ [0.8347,0.2766], [0.8245,0.2748] ] -,[ [0.8396,0.2986], [0.8245,0.3] ] -,[ [0.8429,0.3222], [0.8245,0.3252] ] -,[ [0.8479,0.3457], [0.8245,0.3496] ] -,[ [0.8512,0.3701], [0.8245,0.3751] ] -,[ [0.8545,0.3952], [0.8245,0.4] ] -,[ [0.8562,0.4209], [0.8245,0.425] ] -,[ [0.8578,0.4471], [0.8245,0.45] ] -,[ [0.8595,0.4734], [0.8245,0.475] ] -,[ [0.8595,0.5], [0.8245,0.5] ] -,[ [0.8595,0.5266], [0.8245,0.525] ] -,[ [0.8578,0.5529], [0.8245,0.55] ] -,[ [0.8562,0.5791], [0.8245,0.575] ] -,[ [0.8545,0.6048], [0.8245,0.6] ] -,[ [0.8512,0.6299], [0.8245,0.6249] ] -,[ [0.8479,0.6543], [0.8245,0.6504] ] -,[ [0.8429,0.6778], [0.8245,0.6748] ] -,[ [0.8396,0.7014], [0.8245,0.7] ] -,[ [0.8347,0.7234], [0.8245,0.7252] ] -,[ [0.8297,0.7454], [0.8245,0.7503] ] -,[ [0.8247,0.766], [0.8245,0.7754] ] -,[ [0.8198,0.7866], [0.8245,0.8005] ] -,[ [0.8165,0.8072], [0.8245,0.8245] ] -,[ [0.8115,0.8263], [0.8245,0.8495] ] -,[ [0.8065,0.8439], [0.8245,0.8745] ] -,[ [0.8016,0.8616], [0.8245,0.8994] ] -,[ [0.7751,0.1164], [0.8005,0.07432] ] -,[ [0.7801,0.134], [0.8005,0.1006] ] -,[ [0.7851,0.1517], [0.8005,0.1255] ] -,[ [0.7884,0.1693], [0.8005,0.1505] ] -,[ [0.7933,0.1899], [0.8005,0.1755] ] -,[ [0.7983,0.209], [0.8005,0.1995] ] -,[ [0.8032,0.2296], [0.8005,0.2246] ] -,[ [0.8082,0.2501], [0.8005,0.2497] ] -,[ [0.8132,0.2722], [0.8005,0.2748] ] -,[ [0.8181,0.2942], [0.8005,0.3] ] -,[ [0.8214,0.3178], [0.8005,0.3252] ] -,[ [0.8264,0.3427], [0.8005,0.3496] ] -,[ [0.8297,0.3671], [0.8005,0.3751] ] -,[ [0.833,0.3929], [0.8005,0.4] ] -,[ [0.8347,0.419], [0.8005,0.425] ] -,[ [0.8363,0.4458], [0.8005,0.45] ] -,[ [0.838,0.4728], [0.8005,0.475] ] -,[ [0.838,0.5], [0.8005,0.5] ] -,[ [0.838,0.5272], [0.8005,0.525] ] -,[ [0.8363,0.5542], [0.8005,0.55] ] -,[ [0.8347,0.581], [0.8005,0.575] ] -,[ [0.833,0.6071], [0.8005,0.6] ] -,[ [0.8297,0.6329], [0.8005,0.6249] ] -,[ [0.8264,0.6573], [0.8005,0.6504] ] -,[ [0.8214,0.6822], [0.8005,0.6748] ] -,[ [0.8181,0.7058], [0.8005,0.7] ] -,[ [0.8132,0.7278], [0.8005,0.7252] ] -,[ [0.8082,0.7499], [0.8005,0.7503] ] -,[ [0.8032,0.7704], [0.8005,0.7754] ] -,[ [0.7983,0.791], [0.8005,0.8005] ] -,[ [0.7933,0.8101], [0.8005,0.8245] ] -,[ [0.7884,0.8307], [0.8005,0.8495] ] -,[ [0.7851,0.8483], [0.8005,0.8745] ] -,[ [0.7801,0.866], [0.8005,0.8994] ] -,[ [0.7751,0.8836], [0.8005,0.9257] ] -,[ [0.752,0.112], [0.7754,0.07432] ] -,[ [0.7569,0.1296], [0.7754,0.1006] ] -,[ [0.7619,0.1473], [0.7754,0.1255] ] -,[ [0.7652,0.1664], [0.7754,0.1505] ] -,[ [0.7702,0.1855], [0.7754,0.1755] ] -,[ [0.7751,0.2046], [0.7754,0.1995] ] -,[ [0.7801,0.2252], [0.7754,0.2246] ] -,[ [0.7851,0.2457], [0.7754,0.2497] ] -,[ [0.79,0.2678], [0.7754,0.2748] ] -,[ [0.795,0.2898], [0.7754,0.3] ] -,[ [0.7999,0.3148], [0.7754,0.3252] ] -,[ [0.8032,0.3383], [0.7754,0.3496] ] -,[ [0.8065,0.3642], [0.7754,0.3751] ] -,[ [0.8099,0.3905], [0.7754,0.4] ] -,[ [0.8115,0.4173], [0.7754,0.425] ] -,[ [0.8132,0.4446], [0.7754,0.45] ] -,[ [0.8148,0.4722], [0.7754,0.475] ] -,[ [0.8148,0.5], [0.7754,0.5] ] -,[ [0.8148,0.5278], [0.7754,0.525] ] -,[ [0.8132,0.5554], [0.7754,0.55] ] -,[ [0.8115,0.5827], [0.7754,0.575] ] -,[ [0.8099,0.6095], [0.7754,0.6] ] -,[ [0.8065,0.6358], [0.7754,0.6249] ] -,[ [0.8032,0.6617], [0.7754,0.6504] ] -,[ [0.7999,0.6852], [0.7754,0.6748] ] -,[ [0.795,0.7102], [0.7754,0.7] ] -,[ [0.79,0.7322], [0.7754,0.7252] ] -,[ [0.7851,0.7543], [0.7754,0.7503] ] -,[ [0.7801,0.7748], [0.7754,0.7754] ] -,[ [0.7751,0.7954], [0.7754,0.8005] ] -,[ [0.7702,0.8145], [0.7754,0.8245] ] -,[ [0.7652,0.8336], [0.7754,0.8495] ] -,[ [0.7619,0.8527], [0.7754,0.8745] ] -,[ [0.7569,0.8704], [0.7754,0.8994] ] -,[ [0.752,0.888], [0.7754,0.9257] ] -,[ [0.7305,0.1091], [0.7503,0.07432] ] -,[ [0.7338,0.1252], [0.7503,0.1006] ] -,[ [0.7388,0.1443], [0.7503,0.1255] ] -,[ [0.7421,0.162], [0.7503,0.1505] ] -,[ [0.747,0.1811], [0.7503,0.1755] ] -,[ [0.752,0.2002], [0.7503,0.1995] ] -,[ [0.7569,0.2208], [0.7503,0.2246] ] -,[ [0.7619,0.2413], [0.7503,0.2497] ] -,[ [0.7669,0.2634], [0.7503,0.2748] ] -,[ [0.7718,0.2869], [0.7503,0.3] ] -,[ [0.7751,0.3104], [0.7503,0.3252] ] -,[ [0.7784,0.3354], [0.7503,0.3496] ] -,[ [0.7817,0.3616], [0.7503,0.3751] ] -,[ [0.7851,0.3883], [0.7503,0.4] ] -,[ [0.7867,0.4156], [0.7503,0.425] ] -,[ [0.7884,0.4434], [0.7503,0.45] ] -,[ [0.79,0.4716], [0.7503,0.475] ] -,[ [0.79,0.5], [0.7503,0.5] ] -,[ [0.79,0.5284], [0.7503,0.525] ] -,[ [0.7884,0.5566], [0.7503,0.55] ] -,[ [0.7867,0.5844], [0.7503,0.575] ] -,[ [0.7851,0.6117], [0.7503,0.6] ] -,[ [0.7817,0.6384], [0.7503,0.6249] ] -,[ [0.7784,0.6646], [0.7503,0.6504] ] -,[ [0.7751,0.6896], [0.7503,0.6748] ] -,[ [0.7718,0.7131], [0.7503,0.7] ] -,[ [0.7669,0.7366], [0.7503,0.7252] ] -,[ [0.7619,0.7587], [0.7503,0.7503] ] -,[ [0.7569,0.7792], [0.7503,0.7754] ] -,[ [0.752,0.7998], [0.7503,0.8005] ] -,[ [0.747,0.8189], [0.7503,0.8245] ] -,[ [0.7421,0.838], [0.7503,0.8495] ] -,[ [0.7388,0.8557], [0.7503,0.8745] ] -,[ [0.7338,0.8748], [0.7503,0.8994] ] -,[ [0.7305,0.8909], [0.7503,0.9257] ] -,[ [0.7255,0.9071], [0.7503,0.9503] ] -,[ [0.7206,0.9203], [0.7503,0.9745] ] -,[ [0.7106,0.9262], [0.7503,1] ] -,[ [0.6908,0.06349], [0.7252,0] ] -,[ [0.6974,0.07378], [0.7252,0.02551] ] -,[ [0.7024,0.08848], [0.7252,0.04974] ] -,[ [0.7057,0.1046], [0.7252,0.07432] ] -,[ [0.7106,0.1223], [0.7252,0.1006] ] -,[ [0.714,0.1399], [0.7252,0.1255] ] -,[ [0.7173,0.159], [0.7252,0.1505] ] -,[ [0.7222,0.1767], [0.7252,0.1755] ] -,[ [0.7272,0.1958], [0.7252,0.1995] ] -,[ [0.7321,0.2163], [0.7252,0.2246] ] -,[ [0.7371,0.2369], [0.7252,0.2497] ] -,[ [0.7421,0.259], [0.7252,0.2748] ] -,[ [0.7454,0.2825], [0.7252,0.3] ] -,[ [0.7503,0.3075], [0.7252,0.3252] ] -,[ [0.7536,0.3325], [0.7252,0.3496] ] -,[ [0.7569,0.3591], [0.7252,0.3751] ] -,[ [0.7586,0.3861], [0.7252,0.4] ] -,[ [0.7619,0.4139], [0.7252,0.425] ] -,[ [0.7636,0.4422], [0.7252,0.45] ] -,[ [0.7636,0.471], [0.7252,0.475] ] -,[ [0.7652,0.5], [0.7252,0.5] ] -,[ [0.7636,0.529], [0.7252,0.525] ] -,[ [0.7636,0.5578], [0.7252,0.55] ] -,[ [0.7619,0.5861], [0.7252,0.575] ] -,[ [0.7586,0.6139], [0.7252,0.6] ] -,[ [0.7569,0.6409], [0.7252,0.6249] ] -,[ [0.7536,0.6675], [0.7252,0.6504] ] -,[ [0.7503,0.6925], [0.7252,0.6748] ] -,[ [0.7454,0.7175], [0.7252,0.7] ] -,[ [0.7421,0.741], [0.7252,0.7252] ] -,[ [0.7371,0.7631], [0.7252,0.7503] ] -,[ [0.7321,0.7837], [0.7252,0.7754] ] -,[ [0.7272,0.8042], [0.7252,0.8005] ] -,[ [0.7222,0.8233], [0.7252,0.8245] ] -,[ [0.7173,0.841], [0.7252,0.8495] ] -,[ [0.714,0.8601], [0.7252,0.8745] ] -,[ [0.7106,0.8777], [0.7252,0.8994] ] -,[ [0.7057,0.8954], [0.7252,0.9257] ] -,[ [0.7024,0.9115], [0.7252,0.9503] ] -,[ [0.6974,0.9262], [0.7252,0.9745] ] -,[ [0.6908,0.9365], [0.7252,1] ] -,[ [0.6693,0.05761], [0.7,0] ] -,[ [0.6743,0.06937], [0.7,0.02551] ] -,[ [0.6776,0.08554], [0.7,0.04974] ] -,[ [0.6809,0.1017], [0.7,0.07432] ] -,[ [0.6858,0.1193], [0.7,0.1006] ] -,[ [0.6892,0.137], [0.7,0.1255] ] -,[ [0.6925,0.1546], [0.7,0.1505] ] -,[ [0.6974,0.1723], [0.7,0.1755] ] -,[ [0.7024,0.1914], [0.7,0.1995] ] -,[ [0.7073,0.2119], [0.7,0.2246] ] -,[ [0.7106,0.2325], [0.7,0.2497] ] -,[ [0.7156,0.256], [0.7,0.2748] ] -,[ [0.7189,0.2795], [0.7,0.3] ] -,[ [0.7222,0.3045], [0.7,0.3252] ] -,[ [0.7255,0.3295], [0.7,0.3496] ] -,[ [0.7288,0.3564], [0.7,0.3751] ] -,[ [0.7321,0.3839], [0.7,0.4] ] -,[ [0.7354,0.4121], [0.7,0.425] ] -,[ [0.7371,0.4411], [0.7,0.45] ] -,[ [0.7371,0.4703], [0.7,0.475] ] -,[ [0.7371,0.5], [0.7,0.5] ] -,[ [0.7371,0.5297], [0.7,0.525] ] -,[ [0.7371,0.5589], [0.7,0.55] ] -,[ [0.7354,0.5879], [0.7,0.575] ] -,[ [0.7321,0.6161], [0.7,0.6] ] -,[ [0.7288,0.6436], [0.7,0.6249] ] -,[ [0.7255,0.6705], [0.7,0.6504] ] -,[ [0.7222,0.6955], [0.7,0.6748] ] -,[ [0.7189,0.7205], [0.7,0.7] ] -,[ [0.7156,0.744], [0.7,0.7252] ] -,[ [0.7106,0.7675], [0.7,0.7503] ] -,[ [0.7073,0.7881], [0.7,0.7754] ] -,[ [0.7024,0.8086], [0.7,0.8005] ] -,[ [0.6974,0.8277], [0.7,0.8245] ] -,[ [0.6925,0.8454], [0.7,0.8495] ] -,[ [0.6892,0.863], [0.7,0.8745] ] -,[ [0.6858,0.8807], [0.7,0.8994] ] -,[ [0.6809,0.8983], [0.7,0.9257] ] -,[ [0.6776,0.9145], [0.7,0.9503] ] -,[ [0.6743,0.9306], [0.7,0.9745] ] -,[ [0.6693,0.9424], [0.7,1] ] -,[ [0.6462,0.0532], [0.6748,0] ] -,[ [0.6495,0.06643], [0.6748,0.02551] ] -,[ [0.6528,0.0826], [0.6748,0.04974] ] -,[ [0.6561,0.09877], [0.6748,0.07432] ] -,[ [0.6594,0.1164], [0.6748,0.1006] ] -,[ [0.6627,0.134], [0.6748,0.1255] ] -,[ [0.6677,0.1517], [0.6748,0.1505] ] -,[ [0.671,0.1693], [0.6748,0.1755] ] -,[ [0.6759,0.1884], [0.6748,0.1995] ] -,[ [0.6792,0.2075], [0.6748,0.2246] ] -,[ [0.6842,0.2296], [0.6748,0.2497] ] -,[ [0.6875,0.2516], [0.6748,0.2748] ] -,[ [0.6908,0.2766], [0.6748,0.3] ] -,[ [0.6941,0.3016], [0.6748,0.3252] ] -,[ [0.6974,0.3266], [0.6748,0.3496] ] -,[ [0.7007,0.3536], [0.6748,0.3751] ] -,[ [0.704,0.3815], [0.6748,0.4] ] -,[ [0.7057,0.4103], [0.6748,0.425] ] -,[ [0.7073,0.4399], [0.6748,0.45] ] -,[ [0.709,0.4699], [0.6748,0.475] ] -,[ [0.709,0.5], [0.6748,0.5] ] -,[ [0.709,0.5301], [0.6748,0.525] ] -,[ [0.7073,0.5601], [0.6748,0.55] ] -,[ [0.7057,0.5897], [0.6748,0.575] ] -,[ [0.704,0.6185], [0.6748,0.6] ] -,[ [0.7007,0.6464], [0.6748,0.6249] ] -,[ [0.6974,0.6734], [0.6748,0.6504] ] -,[ [0.6941,0.6984], [0.6748,0.6748] ] -,[ [0.6908,0.7234], [0.6748,0.7] ] -,[ [0.6875,0.7484], [0.6748,0.7252] ] -,[ [0.6842,0.7704], [0.6748,0.7503] ] -,[ [0.6792,0.7925], [0.6748,0.7754] ] -,[ [0.6759,0.8116], [0.6748,0.8005] ] -,[ [0.671,0.8307], [0.6748,0.8245] ] -,[ [0.6677,0.8483], [0.6748,0.8495] ] -,[ [0.6627,0.866], [0.6748,0.8745] ] -,[ [0.6594,0.8836], [0.6748,0.8994] ] -,[ [0.6561,0.9012], [0.6748,0.9257] ] -,[ [0.6528,0.9174], [0.6748,0.9503] ] -,[ [0.6495,0.9336], [0.6748,0.9745] ] -,[ [0.6462,0.9468], [0.6748,1] ] -,[ [0.6227,0.05026], [0.6504,0] ] -,[ [0.6257,0.06349], [0.6504,0.02551] ] -,[ [0.6283,0.07966], [0.6504,0.04974] ] -,[ [0.6311,0.09583], [0.6504,0.07432] ] -,[ [0.6341,0.1135], [0.6504,0.1006] ] -,[ [0.6379,0.1296], [0.6504,0.1255] ] -,[ [0.6412,0.1473], [0.6504,0.1505] ] -,[ [0.6445,0.1649], [0.6504,0.1755] ] -,[ [0.6478,0.184], [0.6504,0.1995] ] -,[ [0.6528,0.2046], [0.6504,0.2246] ] -,[ [0.6561,0.2266], [0.6504,0.2497] ] -,[ [0.6594,0.2487], [0.6504,0.2748] ] -,[ [0.6627,0.2737], [0.6504,0.3] ] -,[ [0.666,0.2986], [0.6504,0.3252] ] -,[ [0.6693,0.3236], [0.6504,0.3496] ] -,[ [0.6726,0.3516], [0.6504,0.3751] ] -,[ [0.6743,0.3796], [0.6504,0.4] ] -,[ [0.6743,0.4093], [0.6504,0.425] ] -,[ [0.6759,0.4394], [0.6504,0.45] ] -,[ [0.6759,0.4697], [0.6504,0.475] ] -,[ [0.6759,0.5], [0.6504,0.5] ] -,[ [0.6759,0.5303], [0.6504,0.525] ] -,[ [0.6759,0.5606], [0.6504,0.55] ] -,[ [0.6743,0.5907], [0.6504,0.575] ] -,[ [0.6743,0.6204], [0.6504,0.6] ] -,[ [0.6726,0.6484], [0.6504,0.6249] ] -,[ [0.6693,0.6764], [0.6504,0.6504] ] -,[ [0.666,0.7014], [0.6504,0.6748] ] -,[ [0.6627,0.7263], [0.6504,0.7] ] -,[ [0.6594,0.7513], [0.6504,0.7252] ] -,[ [0.6561,0.7734], [0.6504,0.7503] ] -,[ [0.6528,0.7954], [0.6504,0.7754] ] -,[ [0.6478,0.816], [0.6504,0.8005] ] -,[ [0.6445,0.8351], [0.6504,0.8245] ] -,[ [0.6412,0.8527], [0.6504,0.8495] ] -,[ [0.6379,0.8704], [0.6504,0.8745] ] -,[ [0.6341,0.8865], [0.6504,0.8994] ] -,[ [0.6311,0.9042], [0.6504,0.9257] ] -,[ [0.6283,0.9203], [0.6504,0.9503] ] -,[ [0.6257,0.9365], [0.6504,0.9745] ] -,[ [0.6227,0.9497], [0.6504,1] ] -,[ [0.598,0.04733], [0.6249,0] ] -,[ [0.6005,0.06202], [0.6249,0.02551] ] -,[ [0.6028,0.07819], [0.6249,0.04974] ] -,[ [0.6052,0.09436], [0.6249,0.07432] ] -,[ [0.6078,0.1105], [0.6249,0.1006] ] -,[ [0.6106,0.1267], [0.6249,0.1255] ] -,[ [0.6138,0.1443], [0.6249,0.1505] ] -,[ [0.6171,0.162], [0.6249,0.1755] ] -,[ [0.6204,0.1811], [0.6249,0.1995] ] -,[ [0.6237,0.2016], [0.6249,0.2246] ] -,[ [0.6267,0.2237], [0.6249,0.2497] ] -,[ [0.6295,0.2457], [0.6249,0.2748] ] -,[ [0.6324,0.2707], [0.6249,0.3] ] -,[ [0.6356,0.2957], [0.6249,0.3252] ] -,[ [0.6379,0.3207], [0.6249,0.3496] ] -,[ [0.6412,0.3486], [0.6249,0.3751] ] -,[ [0.6412,0.3789], [0.6249,0.4] ] -,[ [0.6412,0.4093], [0.6249,0.425] ] -,[ [0.6396,0.4399], [0.6249,0.45] ] -,[ [0.6396,0.47], [0.6249,0.475] ] -,[ [0.6396,0.5], [0.6249,0.5] ] -,[ [0.6396,0.53], [0.6249,0.525] ] -,[ [0.6396,0.5601], [0.6249,0.55] ] -,[ [0.6412,0.5907], [0.6249,0.575] ] -,[ [0.6412,0.6211], [0.6249,0.6] ] -,[ [0.6412,0.6514], [0.6249,0.6249] ] -,[ [0.6379,0.6793], [0.6249,0.6504] ] -,[ [0.6356,0.7043], [0.6249,0.6748] ] -,[ [0.6324,0.7293], [0.6249,0.7] ] -,[ [0.6295,0.7543], [0.6249,0.7252] ] -,[ [0.6267,0.7763], [0.6249,0.7503] ] -,[ [0.6237,0.7984], [0.6249,0.7754] ] -,[ [0.6204,0.8189], [0.6249,0.8005] ] -,[ [0.6171,0.838], [0.6249,0.8245] ] -,[ [0.6138,0.8557], [0.6249,0.8495] ] -,[ [0.6106,0.8733], [0.6249,0.8745] ] -,[ [0.6078,0.8895], [0.6249,0.8994] ] -,[ [0.6052,0.9056], [0.6249,0.9257] ] -,[ [0.6028,0.9218], [0.6249,0.9503] ] -,[ [0.6005,0.938], [0.6249,0.9745] ] -,[ [0.598,0.9527], [0.6249,1] ] -,[ [0.5731,0.04586], [0.6,0] ] -,[ [0.5751,0.06055], [0.6,0.02551] ] -,[ [0.5769,0.07525], [0.6,0.04974] ] -,[ [0.5789,0.09289], [0.6,0.07432] ] -,[ [0.581,0.1091], [0.6,0.1006] ] -,[ [0.5835,0.1252], [0.6,0.1255] ] -,[ [0.586,0.1414], [0.6,0.1505] ] -,[ [0.5888,0.159], [0.6,0.1755] ] -,[ [0.5914,0.1781], [0.6,0.1995] ] -,[ [0.5941,0.1987], [0.6,0.2246] ] -,[ [0.5966,0.2208], [0.6,0.2497] ] -,[ [0.599,0.2443], [0.6,0.2748] ] -,[ [0.6015,0.2678], [0.6,0.3] ] -,[ [0.6042,0.2928], [0.6,0.3252] ] -,[ [0.6063,0.3192], [0.6,0.3496] ] -,[ [0.6071,0.3486], [0.6,0.3751] ] -,[ [0.6066,0.3793], [0.6,0.4] ] -,[ [0.6055,0.4103], [0.6,0.425] ] -,[ [0.604,0.4408], [0.6,0.45] ] -,[ [0.603,0.4706], [0.6,0.475] ] -,[ [0.6027,0.5], [0.6,0.5] ] -,[ [0.603,0.5294], [0.6,0.525] ] -,[ [0.604,0.5592], [0.6,0.55] ] -,[ [0.6055,0.5897], [0.6,0.575] ] -,[ [0.6066,0.6207], [0.6,0.6] ] -,[ [0.6071,0.6514], [0.6,0.6249] ] -,[ [0.6063,0.6808], [0.6,0.6504] ] -,[ [0.6042,0.7072], [0.6,0.6748] ] -,[ [0.6015,0.7322], [0.6,0.7] ] -,[ [0.599,0.7557], [0.6,0.7252] ] -,[ [0.5966,0.7792], [0.6,0.7503] ] -,[ [0.5941,0.8013], [0.6,0.7754] ] -,[ [0.5914,0.8219], [0.6,0.8005] ] -,[ [0.5888,0.841], [0.6,0.8245] ] -,[ [0.586,0.8586], [0.6,0.8495] ] -,[ [0.5835,0.8748], [0.6,0.8745] ] -,[ [0.581,0.8909], [0.6,0.8994] ] -,[ [0.5789,0.9071], [0.6,0.9257] ] -,[ [0.5769,0.9248], [0.6,0.9503] ] -,[ [0.5751,0.9394], [0.6,0.9745] ] -,[ [0.5731,0.9541], [0.6,1] ] -,[ [0.5478,0.04439], [0.575,0] ] -,[ [0.5493,0.05908], [0.575,0.02551] ] -,[ [0.5506,0.07378], [0.575,0.04974] ] -,[ [0.5521,0.08995], [0.575,0.07432] ] -,[ [0.5539,0.1061], [0.575,0.1006] ] -,[ [0.5557,0.1223], [0.575,0.1255] ] -,[ [0.5577,0.1399], [0.575,0.1505] ] -,[ [0.5599,0.1576], [0.575,0.1755] ] -,[ [0.562,0.1767], [0.575,0.1995] ] -,[ [0.564,0.1972], [0.575,0.2246] ] -,[ [0.5658,0.2193], [0.575,0.2497] ] -,[ [0.5678,0.2413], [0.575,0.2748] ] -,[ [0.5698,0.2648], [0.575,0.3] ] -,[ [0.5718,0.2913], [0.575,0.3252] ] -,[ [0.5729,0.3192], [0.575,0.3496] ] -,[ [0.5729,0.3486], [0.575,0.3751] ] -,[ [0.5718,0.3804], [0.575,0.4] ] -,[ [0.5703,0.4117], [0.575,0.425] ] -,[ [0.5688,0.4419], [0.575,0.45] ] -,[ [0.5678,0.4713], [0.575,0.475] ] -,[ [0.5675,0.5], [0.575,0.5] ] -,[ [0.5678,0.5287], [0.575,0.525] ] -,[ [0.5688,0.5581], [0.575,0.55] ] -,[ [0.5703,0.5883], [0.575,0.575] ] -,[ [0.5718,0.6196], [0.575,0.6] ] -,[ [0.5729,0.6514], [0.575,0.6249] ] -,[ [0.5729,0.6808], [0.575,0.6504] ] -,[ [0.5718,0.7087], [0.575,0.6748] ] -,[ [0.5698,0.7352], [0.575,0.7] ] -,[ [0.5678,0.7587], [0.575,0.7252] ] -,[ [0.5658,0.7807], [0.575,0.7503] ] -,[ [0.564,0.8028], [0.575,0.7754] ] -,[ [0.562,0.8233], [0.575,0.8005] ] -,[ [0.5599,0.8424], [0.575,0.8245] ] -,[ [0.5577,0.8601], [0.575,0.8495] ] -,[ [0.5557,0.8777], [0.575,0.8745] ] -,[ [0.5539,0.8939], [0.575,0.8994] ] -,[ [0.5521,0.9101], [0.575,0.9257] ] -,[ [0.5506,0.9262], [0.575,0.9503] ] -,[ [0.5493,0.9409], [0.575,0.9745] ] -,[ [0.5478,0.9556], [0.575,1] ] -,[ [0.5223,0.04292], [0.55,0] ] -,[ [0.5233,0.05761], [0.55,0.02551] ] -,[ [0.5241,0.07378], [0.55,0.04974] ] -,[ [0.5253,0.08995], [0.55,0.07432] ] -,[ [0.5265,0.1046], [0.55,0.1006] ] -,[ [0.5276,0.1208], [0.55,0.1255] ] -,[ [0.5291,0.1384], [0.55,0.1505] ] -,[ [0.5304,0.1561], [0.55,0.1755] ] -,[ [0.5319,0.1752], [0.55,0.1995] ] -,[ [0.5332,0.1958], [0.55,0.2246] ] -,[ [0.5346,0.2178], [0.55,0.2497] ] -,[ [0.5359,0.2399], [0.55,0.2748] ] -,[ [0.5372,0.2634], [0.55,0.3] ] -,[ [0.5385,0.2898], [0.55,0.3252] ] -,[ [0.539,0.3178], [0.55,0.3496] ] -,[ [0.5385,0.3501], [0.55,0.3751] ] -,[ [0.5375,0.3817], [0.55,0.4] ] -,[ [0.5362,0.413], [0.55,0.425] ] -,[ [0.5351,0.443], [0.55,0.45] ] -,[ [0.5342,0.4719], [0.55,0.475] ] -,[ [0.5339,0.5], [0.55,0.5] ] -,[ [0.5342,0.5281], [0.55,0.525] ] -,[ [0.5351,0.557], [0.55,0.55] ] -,[ [0.5362,0.587], [0.55,0.575] ] -,[ [0.5375,0.6183], [0.55,0.6] ] -,[ [0.5385,0.6499], [0.55,0.6249] ] -,[ [0.539,0.6822], [0.55,0.6504] ] -,[ [0.5385,0.7102], [0.55,0.6748] ] -,[ [0.5372,0.7366], [0.55,0.7] ] -,[ [0.5359,0.7601], [0.55,0.7252] ] -,[ [0.5346,0.7822], [0.55,0.7503] ] -,[ [0.5332,0.8042], [0.55,0.7754] ] -,[ [0.5319,0.8248], [0.55,0.8005] ] -,[ [0.5304,0.8439], [0.55,0.8245] ] -,[ [0.5291,0.8616], [0.55,0.8495] ] -,[ [0.5276,0.8792], [0.55,0.8745] ] -,[ [0.5265,0.8954], [0.55,0.8994] ] -,[ [0.5253,0.9101], [0.55,0.9257] ] -,[ [0.5241,0.9262], [0.55,0.9503] ] -,[ [0.5233,0.9424], [0.55,0.9745] ] -,[ [0.5223,0.9571], [0.55,1] ] -,[ [0.4967,0.04145], [0.525,0] ] -,[ [0.4972,0.05761], [0.525,0.02551] ] -,[ [0.4975,0.07231], [0.525,0.04974] ] -,[ [0.4982,0.08848], [0.525,0.07432] ] -,[ [0.4987,0.1046], [0.525,0.1006] ] -,[ [0.4993,0.1208], [0.525,0.1255] ] -,[ [0.5,0.137], [0.525,0.1505] ] -,[ [0.5008,0.1546], [0.525,0.1755] ] -,[ [0.5015,0.1737], [0.525,0.1995] ] -,[ [0.5021,0.1943], [0.525,0.2246] ] -,[ [0.5028,0.2163], [0.525,0.2497] ] -,[ [0.5035,0.2399], [0.525,0.2748] ] -,[ [0.5043,0.2634], [0.525,0.3] ] -,[ [0.5048,0.2884], [0.525,0.3252] ] -,[ [0.505,0.3178], [0.525,0.3496] ] -,[ [0.5046,0.3501], [0.525,0.3751] ] -,[ [0.504,0.3826], [0.525,0.4] ] -,[ [0.5031,0.4139], [0.525,0.425] ] -,[ [0.5025,0.4437], [0.525,0.45] ] -,[ [0.502,0.4724], [0.525,0.475] ] -,[ [0.5018,0.5], [0.525,0.5] ] -,[ [0.502,0.5276], [0.525,0.525] ] -,[ [0.5025,0.5563], [0.525,0.55] ] -,[ [0.5031,0.5861], [0.525,0.575] ] -,[ [0.504,0.6174], [0.525,0.6] ] -,[ [0.5046,0.6499], [0.525,0.6249] ] -,[ [0.505,0.6822], [0.525,0.6504] ] -,[ [0.5048,0.7116], [0.525,0.6748] ] -,[ [0.5043,0.7366], [0.525,0.7] ] -,[ [0.5035,0.7601], [0.525,0.7252] ] -,[ [0.5028,0.7837], [0.525,0.7503] ] -,[ [0.5021,0.8057], [0.525,0.7754] ] -,[ [0.5015,0.8263], [0.525,0.8005] ] -,[ [0.5008,0.8454], [0.525,0.8245] ] -,[ [0.5,0.863], [0.525,0.8495] ] -,[ [0.4993,0.8792], [0.525,0.8745] ] -,[ [0.4987,0.8954], [0.525,0.8994] ] -,[ [0.4982,0.9115], [0.525,0.9257] ] -,[ [0.4975,0.9277], [0.525,0.9503] ] -,[ [0.4972,0.9424], [0.525,0.9745] ] -,[ [0.4967,0.9586], [0.525,1] ] -,[ [0.4709,0.04145], [0.5,0] ] -,[ [0.4709,0.05614], [0.5,0.02551] ] -,[ [0.4709,0.07231], [0.5,0.04974] ] -,[ [0.4709,0.08848], [0.5,0.07432] ] -,[ [0.4709,0.1046], [0.5,0.1006] ] -,[ [0.4709,0.1208], [0.5,0.1255] ] -,[ [0.4709,0.137], [0.5,0.1505] ] -,[ [0.4709,0.1546], [0.5,0.1755] ] -,[ [0.4709,0.1737], [0.5,0.1995] ] -,[ [0.4709,0.1943], [0.5,0.2246] ] -,[ [0.4709,0.2163], [0.5,0.2497] ] -,[ [0.4709,0.2384], [0.5,0.2748] ] -,[ [0.4709,0.2634], [0.5,0.3] ] -,[ [0.4709,0.2884], [0.5,0.3252] ] -,[ [0.4709,0.3178], [0.5,0.3496] ] -,[ [0.4709,0.3501], [0.5,0.3751] ] -,[ [0.4709,0.3829], [0.5,0.4] ] -,[ [0.4709,0.4142], [0.5,0.425] ] -,[ [0.4709,0.444], [0.5,0.45] ] -,[ [0.4709,0.4725], [0.5,0.475] ] -,[ [0.4709,0.5], [0.5,0.5] ] -,[ [0.4709,0.5275], [0.5,0.525] ] -,[ [0.4709,0.556], [0.5,0.55] ] -,[ [0.4709,0.5858], [0.5,0.575] ] -,[ [0.4709,0.6171], [0.5,0.6] ] -,[ [0.4709,0.6499], [0.5,0.6249] ] -,[ [0.4709,0.6822], [0.5,0.6504] ] -,[ [0.4709,0.7116], [0.5,0.6748] ] -,[ [0.4709,0.7366], [0.5,0.7] ] -,[ [0.4709,0.7616], [0.5,0.7252] ] -,[ [0.4709,0.7837], [0.5,0.7503] ] -,[ [0.4709,0.8057], [0.5,0.7754] ] -,[ [0.4709,0.8263], [0.5,0.8005] ] -,[ [0.4709,0.8454], [0.5,0.8245] ] -,[ [0.4709,0.863], [0.5,0.8495] ] -,[ [0.4709,0.8792], [0.5,0.8745] ] -,[ [0.4709,0.8954], [0.5,0.8994] ] -,[ [0.4709,0.9115], [0.5,0.9257] ] -,[ [0.4709,0.9277], [0.5,0.9503] ] -,[ [0.4709,0.9439], [0.5,0.9745] ] -,[ [0.4709,0.9586], [0.5,1] ] -,[ [0.4451,0.04145], [0.475,0] ] -,[ [0.4446,0.05761], [0.475,0.02551] ] -,[ [0.4443,0.07231], [0.475,0.04974] ] -,[ [0.4436,0.08848], [0.475,0.07432] ] -,[ [0.4431,0.1046], [0.475,0.1006] ] -,[ [0.4425,0.1208], [0.475,0.1255] ] -,[ [0.4418,0.137], [0.475,0.1505] ] -,[ [0.441,0.1546], [0.475,0.1755] ] -,[ [0.4403,0.1737], [0.475,0.1995] ] -,[ [0.4396,0.1943], [0.475,0.2246] ] -,[ [0.439,0.2163], [0.475,0.2497] ] -,[ [0.4383,0.2399], [0.475,0.2748] ] -,[ [0.4375,0.2634], [0.475,0.3] ] -,[ [0.437,0.2884], [0.475,0.3252] ] -,[ [0.4368,0.3178], [0.475,0.3496] ] -,[ [0.4372,0.3501], [0.475,0.3751] ] -,[ [0.4378,0.3826], [0.475,0.4] ] -,[ [0.4387,0.4139], [0.475,0.425] ] -,[ [0.4393,0.4437], [0.475,0.45] ] -,[ [0.4398,0.4724], [0.475,0.475] ] -,[ [0.44,0.5], [0.475,0.5] ] -,[ [0.4398,0.5276], [0.475,0.525] ] -,[ [0.4393,0.5563], [0.475,0.55] ] -,[ [0.4387,0.5861], [0.475,0.575] ] -,[ [0.4378,0.6174], [0.475,0.6] ] -,[ [0.4372,0.6499], [0.475,0.6249] ] -,[ [0.4368,0.6822], [0.475,0.6504] ] -,[ [0.437,0.7116], [0.475,0.6748] ] -,[ [0.4375,0.7366], [0.475,0.7] ] -,[ [0.4383,0.7601], [0.475,0.7252] ] -,[ [0.439,0.7837], [0.475,0.7503] ] -,[ [0.4396,0.8057], [0.475,0.7754] ] -,[ [0.4403,0.8263], [0.475,0.8005] ] -,[ [0.441,0.8454], [0.475,0.8245] ] -,[ [0.4418,0.863], [0.475,0.8495] ] -,[ [0.4425,0.8792], [0.475,0.8745] ] -,[ [0.4431,0.8954], [0.475,0.8994] ] -,[ [0.4436,0.9115], [0.475,0.9257] ] -,[ [0.4443,0.9277], [0.475,0.9503] ] -,[ [0.4446,0.9424], [0.475,0.9745] ] -,[ [0.4451,0.9586], [0.475,1] ] -,[ [0.4195,0.04292], [0.45,0] ] -,[ [0.4185,0.05761], [0.45,0.02551] ] -,[ [0.4177,0.07378], [0.45,0.04974] ] -,[ [0.4165,0.08995], [0.45,0.07432] ] -,[ [0.4153,0.1046], [0.45,0.1006] ] -,[ [0.4142,0.1208], [0.45,0.1255] ] -,[ [0.4127,0.1384], [0.45,0.1505] ] -,[ [0.4114,0.1561], [0.45,0.1755] ] -,[ [0.4099,0.1752], [0.45,0.1995] ] -,[ [0.4086,0.1958], [0.45,0.2246] ] -,[ [0.4072,0.2178], [0.45,0.2497] ] -,[ [0.4059,0.2399], [0.45,0.2748] ] -,[ [0.4046,0.2634], [0.45,0.3] ] -,[ [0.4033,0.2898], [0.45,0.3252] ] -,[ [0.4028,0.3178], [0.45,0.3496] ] -,[ [0.4033,0.3501], [0.45,0.3751] ] -,[ [0.4043,0.3817], [0.45,0.4] ] -,[ [0.4056,0.413], [0.45,0.425] ] -,[ [0.4067,0.443], [0.45,0.45] ] -,[ [0.4076,0.4719], [0.45,0.475] ] -,[ [0.4079,0.5], [0.45,0.5] ] -,[ [0.4076,0.5281], [0.45,0.525] ] -,[ [0.4067,0.557], [0.45,0.55] ] -,[ [0.4056,0.587], [0.45,0.575] ] -,[ [0.4043,0.6183], [0.45,0.6] ] -,[ [0.4033,0.6499], [0.45,0.6249] ] -,[ [0.4028,0.6822], [0.45,0.6504] ] -,[ [0.4033,0.7102], [0.45,0.6748] ] -,[ [0.4046,0.7366], [0.45,0.7] ] -,[ [0.4059,0.7601], [0.45,0.7252] ] -,[ [0.4072,0.7822], [0.45,0.7503] ] -,[ [0.4086,0.8042], [0.45,0.7754] ] -,[ [0.4099,0.8248], [0.45,0.8005] ] -,[ [0.4114,0.8439], [0.45,0.8245] ] -,[ [0.4127,0.8616], [0.45,0.8495] ] -,[ [0.4142,0.8792], [0.45,0.8745] ] -,[ [0.4153,0.8954], [0.45,0.8994] ] -,[ [0.4165,0.9101], [0.45,0.9257] ] -,[ [0.4177,0.9262], [0.45,0.9503] ] -,[ [0.4185,0.9424], [0.45,0.9745] ] -,[ [0.4195,0.9571], [0.45,1] ] -,[ [0.394,0.04439], [0.425,0] ] -,[ [0.3925,0.05908], [0.425,0.02551] ] -,[ [0.3912,0.07378], [0.425,0.04974] ] -,[ [0.3897,0.08995], [0.425,0.07432] ] -,[ [0.3879,0.1061], [0.425,0.1006] ] -,[ [0.3861,0.1223], [0.425,0.1255] ] -,[ [0.3841,0.1399], [0.425,0.1505] ] -,[ [0.3819,0.1576], [0.425,0.1755] ] -,[ [0.3798,0.1767], [0.425,0.1995] ] -,[ [0.3778,0.1972], [0.425,0.2246] ] -,[ [0.376,0.2193], [0.425,0.2497] ] -,[ [0.374,0.2413], [0.425,0.2748] ] -,[ [0.372,0.2648], [0.425,0.3] ] -,[ [0.37,0.2913], [0.425,0.3252] ] -,[ [0.3689,0.3192], [0.425,0.3496] ] -,[ [0.3689,0.3486], [0.425,0.3751] ] -,[ [0.37,0.3804], [0.425,0.4] ] -,[ [0.3715,0.4117], [0.425,0.425] ] -,[ [0.373,0.4419], [0.425,0.45] ] -,[ [0.374,0.4713], [0.425,0.475] ] -,[ [0.3743,0.5], [0.425,0.5] ] -,[ [0.374,0.5287], [0.425,0.525] ] -,[ [0.373,0.5581], [0.425,0.55] ] -,[ [0.3715,0.5883], [0.425,0.575] ] -,[ [0.37,0.6196], [0.425,0.6] ] -,[ [0.3689,0.6514], [0.425,0.6249] ] -,[ [0.3689,0.6808], [0.425,0.6504] ] -,[ [0.37,0.7087], [0.425,0.6748] ] -,[ [0.372,0.7352], [0.425,0.7] ] -,[ [0.374,0.7587], [0.425,0.7252] ] -,[ [0.376,0.7807], [0.425,0.7503] ] -,[ [0.3778,0.8028], [0.425,0.7754] ] -,[ [0.3798,0.8233], [0.425,0.8005] ] -,[ [0.3819,0.8424], [0.425,0.8245] ] -,[ [0.3841,0.8601], [0.425,0.8495] ] -,[ [0.3861,0.8777], [0.425,0.8745] ] -,[ [0.3879,0.8939], [0.425,0.8994] ] -,[ [0.3897,0.9101], [0.425,0.9257] ] -,[ [0.3912,0.9262], [0.425,0.9503] ] -,[ [0.3925,0.9409], [0.425,0.9745] ] -,[ [0.394,0.9556], [0.425,1] ] -,[ [0.3687,0.04586], [0.4,0] ] -,[ [0.3667,0.06055], [0.4,0.02551] ] -,[ [0.3649,0.07525], [0.4,0.04974] ] -,[ [0.3629,0.09289], [0.4,0.07432] ] -,[ [0.3608,0.1091], [0.4,0.1006] ] -,[ [0.3583,0.1252], [0.4,0.1255] ] -,[ [0.3558,0.1414], [0.4,0.1505] ] -,[ [0.353,0.159], [0.4,0.1755] ] -,[ [0.3504,0.1781], [0.4,0.1995] ] -,[ [0.3477,0.1987], [0.4,0.2246] ] -,[ [0.3452,0.2208], [0.4,0.2497] ] -,[ [0.3428,0.2443], [0.4,0.2748] ] -,[ [0.3403,0.2678], [0.4,0.3] ] -,[ [0.3376,0.2928], [0.4,0.3252] ] -,[ [0.3355,0.3192], [0.4,0.3496] ] -,[ [0.3347,0.3486], [0.4,0.3751] ] -,[ [0.3352,0.3793], [0.4,0.4] ] -,[ [0.3363,0.4103], [0.4,0.425] ] -,[ [0.3378,0.4408], [0.4,0.45] ] -,[ [0.3388,0.4706], [0.4,0.475] ] -,[ [0.3391,0.5], [0.4,0.5] ] -,[ [0.3388,0.5294], [0.4,0.525] ] -,[ [0.3378,0.5592], [0.4,0.55] ] -,[ [0.3363,0.5897], [0.4,0.575] ] -,[ [0.3352,0.6207], [0.4,0.6] ] -,[ [0.3347,0.6514], [0.4,0.6249] ] -,[ [0.3355,0.6808], [0.4,0.6504] ] -,[ [0.3376,0.7072], [0.4,0.6748] ] -,[ [0.3403,0.7322], [0.4,0.7] ] -,[ [0.3428,0.7557], [0.4,0.7252] ] -,[ [0.3452,0.7792], [0.4,0.7503] ] -,[ [0.3477,0.8013], [0.4,0.7754] ] -,[ [0.3504,0.8219], [0.4,0.8005] ] -,[ [0.353,0.841], [0.4,0.8245] ] -,[ [0.3558,0.8586], [0.4,0.8495] ] -,[ [0.3583,0.8748], [0.4,0.8745] ] -,[ [0.3608,0.8909], [0.4,0.8994] ] -,[ [0.3629,0.9071], [0.4,0.9257] ] -,[ [0.3649,0.9248], [0.4,0.9503] ] -,[ [0.3667,0.9394], [0.4,0.9745] ] -,[ [0.3687,0.9541], [0.4,1] ] -,[ [0.3437,0.04733], [0.3751,0] ] -,[ [0.3413,0.06202], [0.3751,0.02551] ] -,[ [0.339,0.07819], [0.3751,0.04974] ] -,[ [0.3366,0.09436], [0.3751,0.07432] ] -,[ [0.334,0.1105], [0.3751,0.1006] ] -,[ [0.3312,0.1267], [0.3751,0.1255] ] -,[ [0.328,0.1443], [0.3751,0.1505] ] -,[ [0.3247,0.162], [0.3751,0.1755] ] -,[ [0.3214,0.1811], [0.3751,0.1995] ] -,[ [0.3181,0.2016], [0.3751,0.2246] ] -,[ [0.3151,0.2237], [0.3751,0.2497] ] -,[ [0.3123,0.2457], [0.3751,0.2748] ] -,[ [0.3094,0.2707], [0.3751,0.3] ] -,[ [0.3062,0.2957], [0.3751,0.3252] ] -,[ [0.3039,0.3207], [0.3751,0.3496] ] -,[ [0.3006,0.3486], [0.3751,0.3751] ] -,[ [0.3006,0.3789], [0.3751,0.4] ] -,[ [0.3006,0.4093], [0.3751,0.425] ] -,[ [0.3022,0.4399], [0.3751,0.45] ] -,[ [0.3022,0.47], [0.3751,0.475] ] -,[ [0.3022,0.5], [0.3751,0.5] ] -,[ [0.3022,0.53], [0.3751,0.525] ] -,[ [0.3022,0.5601], [0.3751,0.55] ] -,[ [0.3006,0.5907], [0.3751,0.575] ] -,[ [0.3006,0.6211], [0.3751,0.6] ] -,[ [0.3006,0.6514], [0.3751,0.6249] ] -,[ [0.3039,0.6793], [0.3751,0.6504] ] -,[ [0.3062,0.7043], [0.3751,0.6748] ] -,[ [0.3094,0.7293], [0.3751,0.7] ] -,[ [0.3123,0.7543], [0.3751,0.7252] ] -,[ [0.3151,0.7763], [0.3751,0.7503] ] -,[ [0.3181,0.7984], [0.3751,0.7754] ] -,[ [0.3214,0.8189], [0.3751,0.8005] ] -,[ [0.3247,0.838], [0.3751,0.8245] ] -,[ [0.328,0.8557], [0.3751,0.8495] ] -,[ [0.3312,0.8733], [0.3751,0.8745] ] -,[ [0.334,0.8895], [0.3751,0.8994] ] -,[ [0.3366,0.9056], [0.3751,0.9257] ] -,[ [0.339,0.9218], [0.3751,0.9503] ] -,[ [0.3413,0.938], [0.3751,0.9745] ] -,[ [0.3437,0.9527], [0.3751,1] ] -,[ [0.3191,0.05026], [0.3496,0] ] -,[ [0.3161,0.06349], [0.3496,0.02551] ] -,[ [0.3135,0.07966], [0.3496,0.04974] ] -,[ [0.3107,0.09583], [0.3496,0.07432] ] -,[ [0.3077,0.1135], [0.3496,0.1006] ] -,[ [0.3039,0.1296], [0.3496,0.1255] ] -,[ [0.3006,0.1473], [0.3496,0.1505] ] -,[ [0.2973,0.1649], [0.3496,0.1755] ] -,[ [0.294,0.184], [0.3496,0.1995] ] -,[ [0.289,0.2046], [0.3496,0.2246] ] -,[ [0.2857,0.2266], [0.3496,0.2497] ] -,[ [0.2824,0.2487], [0.3496,0.2748] ] -,[ [0.2791,0.2737], [0.3496,0.3] ] -,[ [0.2758,0.2986], [0.3496,0.3252] ] -,[ [0.2725,0.3236], [0.3496,0.3496] ] -,[ [0.2692,0.3516], [0.3496,0.3751] ] -,[ [0.2675,0.3796], [0.3496,0.4] ] -,[ [0.2675,0.4093], [0.3496,0.425] ] -,[ [0.2659,0.4394], [0.3496,0.45] ] -,[ [0.2659,0.4697], [0.3496,0.475] ] -,[ [0.2659,0.5], [0.3496,0.5] ] -,[ [0.2659,0.5303], [0.3496,0.525] ] -,[ [0.2659,0.5606], [0.3496,0.55] ] -,[ [0.2675,0.5907], [0.3496,0.575] ] -,[ [0.2675,0.6204], [0.3496,0.6] ] -,[ [0.2692,0.6484], [0.3496,0.6249] ] -,[ [0.2725,0.6764], [0.3496,0.6504] ] -,[ [0.2758,0.7014], [0.3496,0.6748] ] -,[ [0.2791,0.7263], [0.3496,0.7] ] -,[ [0.2824,0.7513], [0.3496,0.7252] ] -,[ [0.2857,0.7734], [0.3496,0.7503] ] -,[ [0.289,0.7954], [0.3496,0.7754] ] -,[ [0.294,0.816], [0.3496,0.8005] ] -,[ [0.2973,0.8351], [0.3496,0.8245] ] -,[ [0.3006,0.8527], [0.3496,0.8495] ] -,[ [0.3039,0.8704], [0.3496,0.8745] ] -,[ [0.3077,0.8865], [0.3496,0.8994] ] -,[ [0.3107,0.9042], [0.3496,0.9257] ] -,[ [0.3135,0.9203], [0.3496,0.9503] ] -,[ [0.3161,0.9365], [0.3496,0.9745] ] -,[ [0.3191,0.9497], [0.3496,1] ] -,[ [0.2956,0.0532], [0.3252,0] ] -,[ [0.2923,0.06643], [0.3252,0.02551] ] -,[ [0.289,0.0826], [0.3252,0.04974] ] -,[ [0.2857,0.09877], [0.3252,0.07432] ] -,[ [0.2824,0.1164], [0.3252,0.1006] ] -,[ [0.2791,0.134], [0.3252,0.1255] ] -,[ [0.2741,0.1517], [0.3252,0.1505] ] -,[ [0.2708,0.1693], [0.3252,0.1755] ] -,[ [0.2659,0.1884], [0.3252,0.1995] ] -,[ [0.2626,0.2075], [0.3252,0.2246] ] -,[ [0.2576,0.2296], [0.3252,0.2497] ] -,[ [0.2543,0.2516], [0.3252,0.2748] ] -,[ [0.251,0.2766], [0.3252,0.3] ] -,[ [0.2477,0.3016], [0.3252,0.3252] ] -,[ [0.2444,0.3266], [0.3252,0.3496] ] -,[ [0.2411,0.3536], [0.3252,0.3751] ] -,[ [0.2378,0.3815], [0.3252,0.4] ] -,[ [0.2361,0.4103], [0.3252,0.425] ] -,[ [0.2345,0.4399], [0.3252,0.45] ] -,[ [0.2328,0.4699], [0.3252,0.475] ] -,[ [0.2328,0.5], [0.3252,0.5] ] -,[ [0.2328,0.5301], [0.3252,0.525] ] -,[ [0.2345,0.5601], [0.3252,0.55] ] -,[ [0.2361,0.5897], [0.3252,0.575] ] -,[ [0.2378,0.6185], [0.3252,0.6] ] -,[ [0.2411,0.6464], [0.3252,0.6249] ] -,[ [0.2444,0.6734], [0.3252,0.6504] ] -,[ [0.2477,0.6984], [0.3252,0.6748] ] -,[ [0.251,0.7234], [0.3252,0.7] ] -,[ [0.2543,0.7484], [0.3252,0.7252] ] -,[ [0.2576,0.7704], [0.3252,0.7503] ] -,[ [0.2626,0.7925], [0.3252,0.7754] ] -,[ [0.2659,0.8116], [0.3252,0.8005] ] -,[ [0.2708,0.8307], [0.3252,0.8245] ] -,[ [0.2741,0.8483], [0.3252,0.8495] ] -,[ [0.2791,0.866], [0.3252,0.8745] ] -,[ [0.2824,0.8836], [0.3252,0.8994] ] -,[ [0.2857,0.9012], [0.3252,0.9257] ] -,[ [0.289,0.9174], [0.3252,0.9503] ] -,[ [0.2923,0.9336], [0.3252,0.9745] ] -,[ [0.2956,0.9468], [0.3252,1] ] -,[ [0.2725,0.05761], [0.3,0] ] -,[ [0.2675,0.06937], [0.3,0.02551] ] -,[ [0.2642,0.08554], [0.3,0.04974] ] -,[ [0.2609,0.1017], [0.3,0.07432] ] -,[ [0.256,0.1193], [0.3,0.1006] ] -,[ [0.2526,0.137], [0.3,0.1255] ] -,[ [0.2493,0.1546], [0.3,0.1505] ] -,[ [0.2444,0.1723], [0.3,0.1755] ] -,[ [0.2394,0.1914], [0.3,0.1995] ] -,[ [0.2345,0.2119], [0.3,0.2246] ] -,[ [0.2312,0.2325], [0.3,0.2497] ] -,[ [0.2262,0.256], [0.3,0.2748] ] -,[ [0.2229,0.2795], [0.3,0.3] ] -,[ [0.2196,0.3045], [0.3,0.3252] ] -,[ [0.2163,0.3295], [0.3,0.3496] ] -,[ [0.213,0.3564], [0.3,0.3751] ] -,[ [0.2097,0.3839], [0.3,0.4] ] -,[ [0.2063,0.4121], [0.3,0.425] ] -,[ [0.2047,0.4411], [0.3,0.45] ] -,[ [0.2047,0.4703], [0.3,0.475] ] -,[ [0.2047,0.5], [0.3,0.5] ] -,[ [0.2047,0.5297], [0.3,0.525] ] -,[ [0.2047,0.5589], [0.3,0.55] ] -,[ [0.2063,0.5879], [0.3,0.575] ] -,[ [0.2097,0.6161], [0.3,0.6] ] -,[ [0.213,0.6436], [0.3,0.6249] ] -,[ [0.2163,0.6705], [0.3,0.6504] ] -,[ [0.2196,0.6955], [0.3,0.6748] ] -,[ [0.2229,0.7205], [0.3,0.7] ] -,[ [0.2262,0.744], [0.3,0.7252] ] -,[ [0.2312,0.7675], [0.3,0.7503] ] -,[ [0.2345,0.7881], [0.3,0.7754] ] -,[ [0.2394,0.8086], [0.3,0.8005] ] -,[ [0.2444,0.8277], [0.3,0.8245] ] -,[ [0.2493,0.8454], [0.3,0.8495] ] -,[ [0.2526,0.863], [0.3,0.8745] ] -,[ [0.256,0.8807], [0.3,0.8994] ] -,[ [0.2609,0.8983], [0.3,0.9257] ] -,[ [0.2642,0.9145], [0.3,0.9503] ] -,[ [0.2675,0.9306], [0.3,0.9745] ] -,[ [0.2725,0.9424], [0.3,1] ] -,[ [0.251,0.06349], [0.2748,0] ] -,[ [0.2444,0.07378], [0.2748,0.02551] ] -,[ [0.2394,0.08848], [0.2748,0.04974] ] -,[ [0.2361,0.1046], [0.2748,0.07432] ] -,[ [0.2312,0.1223], [0.2748,0.1006] ] -,[ [0.2278,0.1399], [0.2748,0.1255] ] -,[ [0.2245,0.159], [0.2748,0.1505] ] -,[ [0.2196,0.1767], [0.2748,0.1755] ] -,[ [0.2146,0.1958], [0.2748,0.1995] ] -,[ [0.2097,0.2163], [0.2748,0.2246] ] -,[ [0.2047,0.2369], [0.2748,0.2497] ] -,[ [0.1997,0.259], [0.2748,0.2748] ] -,[ [0.1964,0.2825], [0.2748,0.3] ] -,[ [0.1915,0.3075], [0.2748,0.3252] ] -,[ [0.1882,0.3325], [0.2748,0.3496] ] -,[ [0.1849,0.3591], [0.2748,0.3751] ] -,[ [0.1832,0.3861], [0.2748,0.4] ] -,[ [0.1799,0.4139], [0.2748,0.425] ] -,[ [0.1782,0.4422], [0.2748,0.45] ] -,[ [0.1782,0.471], [0.2748,0.475] ] -,[ [0.1766,0.5], [0.2748,0.5] ] -,[ [0.1782,0.529], [0.2748,0.525] ] -,[ [0.1782,0.5578], [0.2748,0.55] ] -,[ [0.1799,0.5861], [0.2748,0.575] ] -,[ [0.1832,0.6139], [0.2748,0.6] ] -,[ [0.1849,0.6409], [0.2748,0.6249] ] -,[ [0.1882,0.6675], [0.2748,0.6504] ] -,[ [0.1915,0.6925], [0.2748,0.6748] ] -,[ [0.1964,0.7175], [0.2748,0.7] ] -,[ [0.1997,0.741], [0.2748,0.7252] ] -,[ [0.2047,0.7631], [0.2748,0.7503] ] -,[ [0.2097,0.7837], [0.2748,0.7754] ] -,[ [0.2146,0.8042], [0.2748,0.8005] ] -,[ [0.2196,0.8233], [0.2748,0.8245] ] -,[ [0.2245,0.841], [0.2748,0.8495] ] -,[ [0.2278,0.8601], [0.2748,0.8745] ] -,[ [0.2312,0.8777], [0.2748,0.8994] ] -,[ [0.2361,0.8954], [0.2748,0.9257] ] -,[ [0.2394,0.9115], [0.2748,0.9503] ] -,[ [0.2444,0.9262], [0.2748,0.9745] ] -,[ [0.251,0.9365], [0.2748,1] ] -,[ [0.2312,0.07378], [0.2497,0] ] -,[ [0.2212,0.07966], [0.2497,0.02551] ] -,[ [0.2163,0.09289], [0.2497,0.04974] ] -,[ [0.2113,0.1091], [0.2497,0.07432] ] -,[ [0.208,0.1252], [0.2497,0.1006] ] -,[ [0.203,0.1443], [0.2497,0.1255] ] -,[ [0.1997,0.162], [0.2497,0.1505] ] -,[ [0.1948,0.1811], [0.2497,0.1755] ] -,[ [0.1898,0.2002], [0.2497,0.1995] ] -,[ [0.1849,0.2208], [0.2497,0.2246] ] -,[ [0.1799,0.2413], [0.2497,0.2497] ] -,[ [0.1749,0.2634], [0.2497,0.2748] ] -,[ [0.17,0.2869], [0.2497,0.3] ] -,[ [0.1667,0.3104], [0.2497,0.3252] ] -,[ [0.1634,0.3354], [0.2497,0.3496] ] -,[ [0.1601,0.3616], [0.2497,0.3751] ] -,[ [0.1567,0.3883], [0.2497,0.4] ] -,[ [0.1551,0.4156], [0.2497,0.425] ] -,[ [0.1534,0.4434], [0.2497,0.45] ] -,[ [0.1518,0.4716], [0.2497,0.475] ] -,[ [0.1518,0.5], [0.2497,0.5] ] -,[ [0.1518,0.5284], [0.2497,0.525] ] -,[ [0.1534,0.5566], [0.2497,0.55] ] -,[ [0.1551,0.5844], [0.2497,0.575] ] -,[ [0.1567,0.6117], [0.2497,0.6] ] -,[ [0.1601,0.6384], [0.2497,0.6249] ] -,[ [0.1634,0.6646], [0.2497,0.6504] ] -,[ [0.1667,0.6896], [0.2497,0.6748] ] -,[ [0.17,0.7131], [0.2497,0.7] ] -,[ [0.1749,0.7366], [0.2497,0.7252] ] -,[ [0.1799,0.7587], [0.2497,0.7503] ] -,[ [0.1849,0.7792], [0.2497,0.7754] ] -,[ [0.1898,0.7998], [0.2497,0.8005] ] -,[ [0.1948,0.8189], [0.2497,0.8245] ] -,[ [0.1997,0.838], [0.2497,0.8495] ] -,[ [0.203,0.8557], [0.2497,0.8745] ] -,[ [0.208,0.8748], [0.2497,0.8994] ] -,[ [0.2113,0.8909], [0.2497,0.9257] ] -,[ [0.1898,0.112], [0.2246,0.07432] ] -,[ [0.1849,0.1296], [0.2246,0.1006] ] -,[ [0.1799,0.1473], [0.2246,0.1255] ] -,[ [0.1766,0.1664], [0.2246,0.1505] ] -,[ [0.1716,0.1855], [0.2246,0.1755] ] -,[ [0.1667,0.2046], [0.2246,0.1995] ] -,[ [0.1617,0.2252], [0.2246,0.2246] ] -,[ [0.1567,0.2457], [0.2246,0.2497] ] -,[ [0.1518,0.2678], [0.2246,0.2748] ] -,[ [0.1468,0.2898], [0.2246,0.3] ] -,[ [0.1419,0.3148], [0.2246,0.3252] ] -,[ [0.1386,0.3383], [0.2246,0.3496] ] -,[ [0.1353,0.3642], [0.2246,0.3751] ] -,[ [0.1319,0.3905], [0.2246,0.4] ] -,[ [0.1303,0.4173], [0.2246,0.425] ] -,[ [0.1286,0.4446], [0.2246,0.45] ] -,[ [0.127,0.4722], [0.2246,0.475] ] -,[ [0.127,0.5], [0.2246,0.5] ] -,[ [0.127,0.5278], [0.2246,0.525] ] -,[ [0.1286,0.5554], [0.2246,0.55] ] -,[ [0.1303,0.5827], [0.2246,0.575] ] -,[ [0.1319,0.6095], [0.2246,0.6] ] -,[ [0.1353,0.6358], [0.2246,0.6249] ] -,[ [0.1386,0.6617], [0.2246,0.6504] ] -,[ [0.1419,0.6852], [0.2246,0.6748] ] -,[ [0.1468,0.7102], [0.2246,0.7] ] -,[ [0.1518,0.7322], [0.2246,0.7252] ] -,[ [0.1567,0.7543], [0.2246,0.7503] ] -,[ [0.1617,0.7748], [0.2246,0.7754] ] -,[ [0.1667,0.7954], [0.2246,0.8005] ] -,[ [0.1716,0.8145], [0.2246,0.8245] ] -,[ [0.1766,0.8336], [0.2246,0.8495] ] -,[ [0.1799,0.8527], [0.2246,0.8745] ] -,[ [0.1849,0.8704], [0.2246,0.8994] ] -,[ [0.1898,0.888], [0.2246,0.9257] ] -,[ [0.1667,0.1164], [0.1995,0.07432] ] -,[ [0.1617,0.134], [0.1995,0.1006] ] -,[ [0.1567,0.1517], [0.1995,0.1255] ] -,[ [0.1534,0.1693], [0.1995,0.1505] ] -,[ [0.1485,0.1899], [0.1995,0.1755] ] -,[ [0.1435,0.209], [0.1995,0.1995] ] -,[ [0.1386,0.2296], [0.1995,0.2246] ] -,[ [0.1336,0.2501], [0.1995,0.2497] ] -,[ [0.1286,0.2722], [0.1995,0.2748] ] -,[ [0.1237,0.2942], [0.1995,0.3] ] -,[ [0.1204,0.3178], [0.1995,0.3252] ] -,[ [0.1154,0.3427], [0.1995,0.3496] ] -,[ [0.1121,0.3671], [0.1995,0.3751] ] -,[ [0.1088,0.3929], [0.1995,0.4] ] -,[ [0.1071,0.419], [0.1995,0.425] ] -,[ [0.1055,0.4458], [0.1995,0.45] ] -,[ [0.1038,0.4728], [0.1995,0.475] ] -,[ [0.1038,0.5], [0.1995,0.5] ] -,[ [0.1038,0.5272], [0.1995,0.525] ] -,[ [0.1055,0.5542], [0.1995,0.55] ] -,[ [0.1071,0.581], [0.1995,0.575] ] -,[ [0.1088,0.6071], [0.1995,0.6] ] -,[ [0.1121,0.6329], [0.1995,0.6249] ] -,[ [0.1154,0.6573], [0.1995,0.6504] ] -,[ [0.1204,0.6822], [0.1995,0.6748] ] -,[ [0.1237,0.7058], [0.1995,0.7] ] -,[ [0.1286,0.7278], [0.1995,0.7252] ] -,[ [0.1336,0.7499], [0.1995,0.7503] ] -,[ [0.1386,0.7704], [0.1995,0.7754] ] -,[ [0.1435,0.791], [0.1995,0.8005] ] -,[ [0.1485,0.8101], [0.1995,0.8245] ] -,[ [0.1534,0.8307], [0.1995,0.8495] ] -,[ [0.1567,0.8483], [0.1995,0.8745] ] -,[ [0.1617,0.866], [0.1995,0.8994] ] -,[ [0.1667,0.8836], [0.1995,0.9257] ] -,[ [0.1402,0.1384], [0.1755,0.1006] ] -,[ [0.1353,0.1561], [0.1755,0.1255] ] -,[ [0.1303,0.1737], [0.1755,0.1505] ] -,[ [0.1253,0.1928], [0.1755,0.1755] ] -,[ [0.122,0.2134], [0.1755,0.1995] ] -,[ [0.1171,0.234], [0.1755,0.2246] ] -,[ [0.1121,0.2546], [0.1755,0.2497] ] -,[ [0.1071,0.2766], [0.1755,0.2748] ] -,[ [0.1022,0.2986], [0.1755,0.3] ] -,[ [0.09888,0.3222], [0.1755,0.3252] ] -,[ [0.09392,0.3457], [0.1755,0.3496] ] -,[ [0.09061,0.3701], [0.1755,0.3751] ] -,[ [0.0873,0.3952], [0.1755,0.4] ] -,[ [0.08565,0.4209], [0.1755,0.425] ] -,[ [0.08399,0.4471], [0.1755,0.45] ] -,[ [0.08234,0.4734], [0.1755,0.475] ] -,[ [0.08234,0.5], [0.1755,0.5] ] -,[ [0.08234,0.5266], [0.1755,0.525] ] -,[ [0.08399,0.5529], [0.1755,0.55] ] -,[ [0.08565,0.5791], [0.1755,0.575] ] -,[ [0.0873,0.6048], [0.1755,0.6] ] -,[ [0.09061,0.6299], [0.1755,0.6249] ] -,[ [0.09392,0.6543], [0.1755,0.6504] ] -,[ [0.09888,0.6778], [0.1755,0.6748] ] -,[ [0.1022,0.7014], [0.1755,0.7] ] -,[ [0.1071,0.7234], [0.1755,0.7252] ] -,[ [0.1121,0.7454], [0.1755,0.7503] ] -,[ [0.1171,0.766], [0.1755,0.7754] ] -,[ [0.122,0.7866], [0.1755,0.8005] ] -,[ [0.1253,0.8072], [0.1755,0.8245] ] -,[ [0.1303,0.8263], [0.1755,0.8495] ] -,[ [0.1353,0.8439], [0.1755,0.8745] ] -,[ [0.1402,0.8616], [0.1755,0.8994] ] -,[ [0.1138,0.1605], [0.1505,0.1255] ] -,[ [0.1088,0.1781], [0.1505,0.1505] ] -,[ [0.1038,0.1972], [0.1505,0.1755] ] -,[ [0.09888,0.2178], [0.1505,0.1995] ] -,[ [0.09557,0.2384], [0.1505,0.2246] ] -,[ [0.09061,0.259], [0.1505,0.2497] ] -,[ [0.0873,0.281], [0.1505,0.2748] ] -,[ [0.08234,0.3031], [0.1505,0.3] ] -,[ [0.07903,0.3251], [0.1505,0.3252] ] -,[ [0.07407,0.3486], [0.1505,0.3496] ] -,[ [0.07077,0.373], [0.1505,0.3751] ] -,[ [0.06746,0.3977], [0.1505,0.4] ] -,[ [0.06581,0.4228], [0.1505,0.425] ] -,[ [0.06415,0.4483], [0.1505,0.45] ] -,[ [0.0625,0.4741], [0.1505,0.475] ] -,[ [0.0625,0.5], [0.1505,0.5] ] -,[ [0.0625,0.5259], [0.1505,0.525] ] -,[ [0.06415,0.5517], [0.1505,0.55] ] -,[ [0.06581,0.5772], [0.1505,0.575] ] -,[ [0.06746,0.6023], [0.1505,0.6] ] -,[ [0.07077,0.627], [0.1505,0.6249] ] -,[ [0.07407,0.6514], [0.1505,0.6504] ] -,[ [0.07903,0.6749], [0.1505,0.6748] ] -,[ [0.08234,0.6969], [0.1505,0.7] ] -,[ [0.0873,0.719], [0.1505,0.7252] ] -,[ [0.09061,0.741], [0.1505,0.7503] ] -,[ [0.09557,0.7616], [0.1505,0.7754] ] -,[ [0.09888,0.7822], [0.1505,0.8005] ] -,[ [0.1038,0.8028], [0.1505,0.8245] ] -,[ [0.1088,0.8219], [0.1505,0.8495] ] -,[ [0.1138,0.8395], [0.1505,0.8745] ] -,[ [0.09557,0.1664], [0.1255,0.1255] ] -,[ [0.08896,0.1825], [0.1255,0.1505] ] -,[ [0.08399,0.2016], [0.1255,0.1755] ] -,[ [0.07903,0.2208], [0.1255,0.1995] ] -,[ [0.07407,0.2413], [0.1255,0.2246] ] -,[ [0.07077,0.2619], [0.1255,0.2497] ] -,[ [0.06581,0.284], [0.1255,0.2748] ] -,[ [0.0625,0.306], [0.1255,0.3] ] -,[ [0.05919,0.3295], [0.1255,0.3252] ] -,[ [0.05423,0.3516], [0.1255,0.3496] ] -,[ [0.05093,0.3758], [0.1255,0.3751] ] -,[ [0.04927,0.3999], [0.1255,0.4] ] -,[ [0.04597,0.4246], [0.1255,0.425] ] -,[ [0.04431,0.4496], [0.1255,0.45] ] -,[ [0.04431,0.4747], [0.1255,0.475] ] -,[ [0.04431,0.5], [0.1255,0.5] ] -,[ [0.04431,0.5253], [0.1255,0.525] ] -,[ [0.04431,0.5504], [0.1255,0.55] ] -,[ [0.04597,0.5754], [0.1255,0.575] ] -,[ [0.04927,0.6001], [0.1255,0.6] ] -,[ [0.05093,0.6242], [0.1255,0.6249] ] -,[ [0.05423,0.6484], [0.1255,0.6504] ] -,[ [0.05919,0.6705], [0.1255,0.6748] ] -,[ [0.0625,0.694], [0.1255,0.7] ] -,[ [0.06581,0.716], [0.1255,0.7252] ] -,[ [0.07077,0.7381], [0.1255,0.7503] ] -,[ [0.07407,0.7587], [0.1255,0.7754] ] -,[ [0.07903,0.7792], [0.1255,0.8005] ] -,[ [0.08399,0.7984], [0.1255,0.8245] ] -,[ [0.08896,0.8175], [0.1255,0.8495] ] -,[ [0.09557,0.8336], [0.1255,0.8745] ] -,[ [0.07242,0.1899], [0.1006,0.1505] ] -,[ [0.06415,0.2061], [0.1006,0.1755] ] -,[ [0.05919,0.2252], [0.1006,0.1995] ] -,[ [0.05423,0.2457], [0.1006,0.2246] ] -,[ [0.04927,0.2663], [0.1006,0.2497] ] -,[ [0.04597,0.2869], [0.1006,0.2748] ] -,[ [0.04266,0.3089], [0.1006,0.3] ] -,[ [0.03935,0.3325], [0.1006,0.3252] ] -,[ [0.03604,0.3549], [0.1006,0.3496] ] -,[ [0.03274,0.3783], [0.1006,0.3751] ] -,[ [0.03108,0.4021], [0.1006,0.4] ] -,[ [0.02778,0.4262], [0.1006,0.425] ] -,[ [0.02612,0.4506], [0.1006,0.45] ] -,[ [0.02612,0.4753], [0.1006,0.475] ] -,[ [0.02612,0.5], [0.1006,0.5] ] -,[ [0.02612,0.5247], [0.1006,0.525] ] -,[ [0.02612,0.5494], [0.1006,0.55] ] -,[ [0.02778,0.5738], [0.1006,0.575] ] -,[ [0.03108,0.5979], [0.1006,0.6] ] -,[ [0.03274,0.6217], [0.1006,0.6249] ] -,[ [0.03604,0.6451], [0.1006,0.6504] ] -,[ [0.03935,0.6675], [0.1006,0.6748] ] -,[ [0.04266,0.6911], [0.1006,0.7] ] -,[ [0.04597,0.7131], [0.1006,0.7252] ] -,[ [0.04927,0.7337], [0.1006,0.7503] ] -,[ [0.05423,0.7543], [0.1006,0.7754] ] -,[ [0.05919,0.7748], [0.1006,0.8005] ] -,[ [0.06415,0.7939], [0.1006,0.8245] ] -,[ [0.07242,0.8101], [0.1006,0.8495] ] -,[ [0.04101,0.2296], [0.07432,0.1995] ] -,[ [0.03604,0.2501], [0.07432,0.2246] ] -,[ [0.03108,0.2693], [0.07432,0.2497] ] -,[ [0.02612,0.2913], [0.07432,0.2748] ] -,[ [0.02282,0.3133], [0.07432,0.3] ] -,[ [0.01951,0.3354], [0.07432,0.3252] ] -,[ [0.0162,0.3576], [0.07432,0.3496] ] -,[ [0.01455,0.3805], [0.07432,0.3751] ] -,[ [0.01124,0.404], [0.07432,0.4] ] -,[ [0.00959,0.4277], [0.07432,0.425] ] -,[ [0.00959,0.4516], [0.07432,0.45] ] -,[ [0.007937,0.4757], [0.07432,0.475] ] -,[ [0.007937,0.5], [0.07432,0.5] ] -,[ [0.007937,0.5243], [0.07432,0.525] ] -,[ [0.00959,0.5484], [0.07432,0.55] ] -,[ [0.00959,0.5723], [0.07432,0.575] ] -,[ [0.01124,0.596], [0.07432,0.6] ] -,[ [0.01455,0.6195], [0.07432,0.6249] ] -,[ [0.0162,0.6424], [0.07432,0.6504] ] -,[ [0.01951,0.6646], [0.07432,0.6748] ] -,[ [0.02282,0.6867], [0.07432,0.7] ] -,[ [0.02612,0.7087], [0.07432,0.7252] ] -,[ [0.03108,0.7307], [0.07432,0.7503] ] -,[ [0.03604,0.7499], [0.07432,0.7754] ] -,[ [0.04101,0.7704], [0.07432,0.8005] ] -,[ [0.01951,0.2546], [0.04974,0.2246] ] -,[ [0.0129,0.2737], [0.04974,0.2497] ] -,[ [0.007937,0.2942], [0.04974,0.2748] ] -,[ [0.00463,0.3163], [0.04974,0.3] ] -,[ [0.001323,0.3383], [0.04974,0.3252] ] -,[ [-0.001984,0.3599], [0.04974,0.3496] ] -,[ [-0.003638,0.3827], [0.04974,0.3751] ] -,[ [-0.006944,0.4058], [0.04974,0.4] ] -,[ [-0.008598,0.429], [0.04974,0.425] ] -,[ [-0.008598,0.4525], [0.04974,0.45] ] -,[ [-0.01025,0.4762], [0.04974,0.475] ] -,[ [-0.01025,0.5], [0.04974,0.5] ] -,[ [-0.01025,0.5238], [0.04974,0.525] ] -,[ [-0.008598,0.5475], [0.04974,0.55] ] -,[ [-0.008598,0.571], [0.04974,0.575] ] -,[ [-0.006944,0.5942], [0.04974,0.6] ] -,[ [-0.003638,0.6173], [0.04974,0.6249] ] -,[ [-0.001984,0.6401], [0.04974,0.6504] ] -,[ [0.001323,0.6617], [0.04974,0.6748] ] -,[ [0.00463,0.6837], [0.04974,0.7] ] -,[ [0.007937,0.7058], [0.04974,0.7252] ] -,[ [0.0129,0.7263], [0.04974,0.7503] ] -,[ [0.01951,0.7454], [0.04974,0.7754] ] -,[ [-0.006944,0.2986], [0.02551,0.2748] ] -,[ [-0.0119,0.3192], [0.02551,0.3] ] -,[ [-0.01521,0.3413], [0.02551,0.3252] ] -,[ [-0.01852,0.3624], [0.02551,0.3496] ] -,[ [-0.02183,0.3848], [0.02551,0.3751] ] -,[ [-0.02348,0.4074], [0.02551,0.4] ] -,[ [-0.02513,0.4303], [0.02551,0.425] ] -,[ [-0.02679,0.4534], [0.02551,0.45] ] -,[ [-0.02679,0.4766], [0.02551,0.475] ] -,[ [-0.02844,0.5], [0.02551,0.5] ] -,[ [-0.02679,0.5234], [0.02551,0.525] ] -,[ [-0.02679,0.5466], [0.02551,0.55] ] -,[ [-0.02513,0.5697], [0.02551,0.575] ] -,[ [-0.02348,0.5926], [0.02551,0.6] ] -,[ [-0.02183,0.6152], [0.02551,0.6249] ] -,[ [-0.01852,0.6376], [0.02551,0.6504] ] -,[ [-0.01521,0.6587], [0.02551,0.6748] ] -,[ [-0.0119,0.6808], [0.02551,0.7] ] -,[ [-0.006944,0.7014], [0.02551,0.7252] ] -,[ [-0.02183,0.3251], [0,0.3] ] -,[ [-0.02844,0.3442], [0,0.3252] ] -,[ [-0.0334,0.3654], [0,0.3496] ] -,[ [-0.03671,0.3871], [0,0.3751] ] -,[ [-0.04001,0.4092], [0,0.4] ] -,[ [-0.04167,0.4317], [0,0.425] ] -,[ [-0.04332,0.4543], [0,0.45] ] -,[ [-0.04332,0.4771], [0,0.475] ] -,[ [-0.04332,0.5], [0,0.5] ] -,[ [-0.04332,0.5229], [0,0.525] ] -,[ [-0.04332,0.5457], [0,0.55] ] -,[ [-0.04167,0.5683], [0,0.575] ] -,[ [-0.04001,0.5908], [0,0.6] ] -,[ [-0.03671,0.6129], [0,0.6249] ] -,[ [-0.0334,0.6346], [0,0.6504] ] -,[ [-0.02844,0.6558], [0,0.6748] ] -,[ [-0.02183,0.6749], [0,0.7] ] -] -, -[ - [ [0.03638,0.3251], [0,0.3] ] -,[ [0.02976,0.3442], [0,0.3252] ] -,[ [0.0248,0.3654], [0,0.3496] ] -,[ [0.02149,0.3871], [0,0.3751] ] -,[ [0.01819,0.4092], [0,0.4] ] -,[ [0.01653,0.4317], [0,0.425] ] -,[ [0.01488,0.4543], [0,0.45] ] -,[ [0.01488,0.4771], [0,0.475] ] -,[ [0.01488,0.5], [0,0.5] ] -,[ [0.01488,0.5229], [0,0.525] ] -,[ [0.01488,0.5457], [0,0.55] ] -,[ [0.01653,0.5683], [0,0.575] ] -,[ [0.01819,0.5908], [0,0.6] ] -,[ [0.02149,0.6129], [0,0.6249] ] -,[ [0.0248,0.6346], [0,0.6504] ] -,[ [0.02976,0.6558], [0,0.6748] ] -,[ [0.03638,0.6749], [0,0.7] ] -,[ [0.05126,0.2986], [0.02551,0.2748] ] -,[ [0.0463,0.3192], [0.02551,0.3] ] -,[ [0.04299,0.3413], [0.02551,0.3252] ] -,[ [0.03968,0.3624], [0.02551,0.3496] ] -,[ [0.03638,0.3848], [0.02551,0.3751] ] -,[ [0.03472,0.4074], [0.02551,0.4] ] -,[ [0.03307,0.4303], [0.02551,0.425] ] -,[ [0.03142,0.4534], [0.02551,0.45] ] -,[ [0.03142,0.4766], [0.02551,0.475] ] -,[ [0.02976,0.5], [0.02551,0.5] ] -,[ [0.03142,0.5234], [0.02551,0.525] ] -,[ [0.03142,0.5466], [0.02551,0.55] ] -,[ [0.03307,0.5697], [0.02551,0.575] ] -,[ [0.03472,0.5926], [0.02551,0.6] ] -,[ [0.03638,0.6152], [0.02551,0.6249] ] -,[ [0.03968,0.6376], [0.02551,0.6504] ] -,[ [0.04299,0.6587], [0.02551,0.6748] ] -,[ [0.0463,0.6808], [0.02551,0.7] ] -,[ [0.05126,0.7014], [0.02551,0.7252] ] -,[ [0.07771,0.2546], [0.04974,0.2246] ] -,[ [0.0711,0.2737], [0.04974,0.2497] ] -,[ [0.06614,0.2942], [0.04974,0.2748] ] -,[ [0.06283,0.3163], [0.04974,0.3] ] -,[ [0.05952,0.3383], [0.04974,0.3252] ] -,[ [0.05622,0.3599], [0.04974,0.3496] ] -,[ [0.05456,0.3827], [0.04974,0.3751] ] -,[ [0.05126,0.4058], [0.04974,0.4] ] -,[ [0.0496,0.429], [0.04974,0.425] ] -,[ [0.0496,0.4525], [0.04974,0.45] ] -,[ [0.04795,0.4762], [0.04974,0.475] ] -,[ [0.04795,0.5], [0.04974,0.5] ] -,[ [0.04795,0.5238], [0.04974,0.525] ] -,[ [0.0496,0.5475], [0.04974,0.55] ] -,[ [0.0496,0.571], [0.04974,0.575] ] -,[ [0.05126,0.5942], [0.04974,0.6] ] -,[ [0.05456,0.6173], [0.04974,0.6249] ] -,[ [0.05622,0.6401], [0.04974,0.6504] ] -,[ [0.05952,0.6617], [0.04974,0.6748] ] -,[ [0.06283,0.6837], [0.04974,0.7] ] -,[ [0.06614,0.7058], [0.04974,0.7252] ] -,[ [0.0711,0.7263], [0.04974,0.7503] ] -,[ [0.07771,0.7454], [0.04974,0.7754] ] -,[ [0.09921,0.2296], [0.07432,0.1995] ] -,[ [0.09425,0.2501], [0.07432,0.2246] ] -,[ [0.08929,0.2693], [0.07432,0.2497] ] -,[ [0.08433,0.2913], [0.07432,0.2748] ] -,[ [0.08102,0.3133], [0.07432,0.3] ] -,[ [0.07771,0.3354], [0.07432,0.3252] ] -,[ [0.0744,0.3576], [0.07432,0.3496] ] -,[ [0.07275,0.3805], [0.07432,0.3751] ] -,[ [0.06944,0.404], [0.07432,0.4] ] -,[ [0.06779,0.4277], [0.07432,0.425] ] -,[ [0.06779,0.4516], [0.07432,0.45] ] -,[ [0.06614,0.4757], [0.07432,0.475] ] -,[ [0.06614,0.5], [0.07432,0.5] ] -,[ [0.06614,0.5243], [0.07432,0.525] ] -,[ [0.06779,0.5484], [0.07432,0.55] ] -,[ [0.06779,0.5723], [0.07432,0.575] ] -,[ [0.06944,0.596], [0.07432,0.6] ] -,[ [0.07275,0.6195], [0.07432,0.6249] ] -,[ [0.0744,0.6424], [0.07432,0.6504] ] -,[ [0.07771,0.6646], [0.07432,0.6748] ] -,[ [0.08102,0.6867], [0.07432,0.7] ] -,[ [0.08433,0.7087], [0.07432,0.7252] ] -,[ [0.08929,0.7307], [0.07432,0.7503] ] -,[ [0.09425,0.7499], [0.07432,0.7754] ] -,[ [0.09921,0.7704], [0.07432,0.8005] ] -,[ [0.1306,0.1899], [0.1006,0.1505] ] -,[ [0.1224,0.2061], [0.1006,0.1755] ] -,[ [0.1174,0.2252], [0.1006,0.1995] ] -,[ [0.1124,0.2457], [0.1006,0.2246] ] -,[ [0.1075,0.2663], [0.1006,0.2497] ] -,[ [0.1042,0.2869], [0.1006,0.2748] ] -,[ [0.1009,0.3089], [0.1006,0.3] ] -,[ [0.09755,0.3325], [0.1006,0.3252] ] -,[ [0.09425,0.3549], [0.1006,0.3496] ] -,[ [0.09094,0.3783], [0.1006,0.3751] ] -,[ [0.08929,0.4021], [0.1006,0.4] ] -,[ [0.08598,0.4262], [0.1006,0.425] ] -,[ [0.08433,0.4506], [0.1006,0.45] ] -,[ [0.08433,0.4753], [0.1006,0.475] ] -,[ [0.08433,0.5], [0.1006,0.5] ] -,[ [0.08433,0.5247], [0.1006,0.525] ] -,[ [0.08433,0.5494], [0.1006,0.55] ] -,[ [0.08598,0.5738], [0.1006,0.575] ] -,[ [0.08929,0.5979], [0.1006,0.6] ] -,[ [0.09094,0.6217], [0.1006,0.6249] ] -,[ [0.09425,0.6451], [0.1006,0.6504] ] -,[ [0.09755,0.6675], [0.1006,0.6748] ] -,[ [0.1009,0.6911], [0.1006,0.7] ] -,[ [0.1042,0.7131], [0.1006,0.7252] ] -,[ [0.1075,0.7337], [0.1006,0.7503] ] -,[ [0.1124,0.7543], [0.1006,0.7754] ] -,[ [0.1174,0.7748], [0.1006,0.8005] ] -,[ [0.1224,0.7939], [0.1006,0.8245] ] -,[ [0.1306,0.8101], [0.1006,0.8495] ] -,[ [0.1538,0.1664], [0.1255,0.1255] ] -,[ [0.1472,0.1825], [0.1255,0.1505] ] -,[ [0.1422,0.2016], [0.1255,0.1755] ] -,[ [0.1372,0.2208], [0.1255,0.1995] ] -,[ [0.1323,0.2413], [0.1255,0.2246] ] -,[ [0.129,0.2619], [0.1255,0.2497] ] -,[ [0.124,0.284], [0.1255,0.2748] ] -,[ [0.1207,0.306], [0.1255,0.3] ] -,[ [0.1174,0.3295], [0.1255,0.3252] ] -,[ [0.1124,0.3516], [0.1255,0.3496] ] -,[ [0.1091,0.3758], [0.1255,0.3751] ] -,[ [0.1075,0.3999], [0.1255,0.4] ] -,[ [0.1042,0.4246], [0.1255,0.425] ] -,[ [0.1025,0.4496], [0.1255,0.45] ] -,[ [0.1025,0.4747], [0.1255,0.475] ] -,[ [0.1025,0.5], [0.1255,0.5] ] -,[ [0.1025,0.5253], [0.1255,0.525] ] -,[ [0.1025,0.5504], [0.1255,0.55] ] -,[ [0.1042,0.5754], [0.1255,0.575] ] -,[ [0.1075,0.6001], [0.1255,0.6] ] -,[ [0.1091,0.6242], [0.1255,0.6249] ] -,[ [0.1124,0.6484], [0.1255,0.6504] ] -,[ [0.1174,0.6705], [0.1255,0.6748] ] -,[ [0.1207,0.694], [0.1255,0.7] ] -,[ [0.124,0.716], [0.1255,0.7252] ] -,[ [0.129,0.7381], [0.1255,0.7503] ] -,[ [0.1323,0.7587], [0.1255,0.7754] ] -,[ [0.1372,0.7792], [0.1255,0.8005] ] -,[ [0.1422,0.7984], [0.1255,0.8245] ] -,[ [0.1472,0.8175], [0.1255,0.8495] ] -,[ [0.1538,0.8336], [0.1255,0.8745] ] -,[ [0.172,0.1605], [0.1505,0.1255] ] -,[ [0.167,0.1781], [0.1505,0.1505] ] -,[ [0.162,0.1972], [0.1505,0.1755] ] -,[ [0.1571,0.2178], [0.1505,0.1995] ] -,[ [0.1538,0.2384], [0.1505,0.2246] ] -,[ [0.1488,0.259], [0.1505,0.2497] ] -,[ [0.1455,0.281], [0.1505,0.2748] ] -,[ [0.1405,0.3031], [0.1505,0.3] ] -,[ [0.1372,0.3251], [0.1505,0.3252] ] -,[ [0.1323,0.3486], [0.1505,0.3496] ] -,[ [0.129,0.373], [0.1505,0.3751] ] -,[ [0.1257,0.3977], [0.1505,0.4] ] -,[ [0.124,0.4228], [0.1505,0.425] ] -,[ [0.1224,0.4483], [0.1505,0.45] ] -,[ [0.1207,0.4741], [0.1505,0.475] ] -,[ [0.1207,0.5], [0.1505,0.5] ] -,[ [0.1207,0.5259], [0.1505,0.525] ] -,[ [0.1224,0.5517], [0.1505,0.55] ] -,[ [0.124,0.5772], [0.1505,0.575] ] -,[ [0.1257,0.6023], [0.1505,0.6] ] -,[ [0.129,0.627], [0.1505,0.6249] ] -,[ [0.1323,0.6514], [0.1505,0.6504] ] -,[ [0.1372,0.6749], [0.1505,0.6748] ] -,[ [0.1405,0.6969], [0.1505,0.7] ] -,[ [0.1455,0.719], [0.1505,0.7252] ] -,[ [0.1488,0.741], [0.1505,0.7503] ] -,[ [0.1538,0.7616], [0.1505,0.7754] ] -,[ [0.1571,0.7822], [0.1505,0.8005] ] -,[ [0.162,0.8028], [0.1505,0.8245] ] -,[ [0.167,0.8219], [0.1505,0.8495] ] -,[ [0.172,0.8395], [0.1505,0.8745] ] -,[ [0.1984,0.1384], [0.1755,0.1006] ] -,[ [0.1935,0.1561], [0.1755,0.1255] ] -,[ [0.1885,0.1737], [0.1755,0.1505] ] -,[ [0.1835,0.1928], [0.1755,0.1755] ] -,[ [0.1802,0.2134], [0.1755,0.1995] ] -,[ [0.1753,0.234], [0.1755,0.2246] ] -,[ [0.1703,0.2546], [0.1755,0.2497] ] -,[ [0.1653,0.2766], [0.1755,0.2748] ] -,[ [0.1604,0.2986], [0.1755,0.3] ] -,[ [0.1571,0.3222], [0.1755,0.3252] ] -,[ [0.1521,0.3457], [0.1755,0.3496] ] -,[ [0.1488,0.3701], [0.1755,0.3751] ] -,[ [0.1455,0.3952], [0.1755,0.4] ] -,[ [0.1438,0.4209], [0.1755,0.425] ] -,[ [0.1422,0.4471], [0.1755,0.45] ] -,[ [0.1405,0.4734], [0.1755,0.475] ] -,[ [0.1405,0.5], [0.1755,0.5] ] -,[ [0.1405,0.5266], [0.1755,0.525] ] -,[ [0.1422,0.5529], [0.1755,0.55] ] -,[ [0.1438,0.5791], [0.1755,0.575] ] -,[ [0.1455,0.6048], [0.1755,0.6] ] -,[ [0.1488,0.6299], [0.1755,0.6249] ] -,[ [0.1521,0.6543], [0.1755,0.6504] ] -,[ [0.1571,0.6778], [0.1755,0.6748] ] -,[ [0.1604,0.7014], [0.1755,0.7] ] -,[ [0.1653,0.7234], [0.1755,0.7252] ] -,[ [0.1703,0.7454], [0.1755,0.7503] ] -,[ [0.1753,0.766], [0.1755,0.7754] ] -,[ [0.1802,0.7866], [0.1755,0.8005] ] -,[ [0.1835,0.8072], [0.1755,0.8245] ] -,[ [0.1885,0.8263], [0.1755,0.8495] ] -,[ [0.1935,0.8439], [0.1755,0.8745] ] -,[ [0.1984,0.8616], [0.1755,0.8994] ] -,[ [0.2249,0.1164], [0.1995,0.07432] ] -,[ [0.2199,0.134], [0.1995,0.1006] ] -,[ [0.2149,0.1517], [0.1995,0.1255] ] -,[ [0.2116,0.1693], [0.1995,0.1505] ] -,[ [0.2067,0.1899], [0.1995,0.1755] ] -,[ [0.2017,0.209], [0.1995,0.1995] ] -,[ [0.1968,0.2296], [0.1995,0.2246] ] -,[ [0.1918,0.2501], [0.1995,0.2497] ] -,[ [0.1868,0.2722], [0.1995,0.2748] ] -,[ [0.1819,0.2942], [0.1995,0.3] ] -,[ [0.1786,0.3178], [0.1995,0.3252] ] -,[ [0.1736,0.3427], [0.1995,0.3496] ] -,[ [0.1703,0.3671], [0.1995,0.3751] ] -,[ [0.167,0.3929], [0.1995,0.4] ] -,[ [0.1653,0.419], [0.1995,0.425] ] -,[ [0.1637,0.4458], [0.1995,0.45] ] -,[ [0.162,0.4728], [0.1995,0.475] ] -,[ [0.162,0.5], [0.1995,0.5] ] -,[ [0.162,0.5272], [0.1995,0.525] ] -,[ [0.1637,0.5542], [0.1995,0.55] ] -,[ [0.1653,0.581], [0.1995,0.575] ] -,[ [0.167,0.6071], [0.1995,0.6] ] -,[ [0.1703,0.6329], [0.1995,0.6249] ] -,[ [0.1736,0.6573], [0.1995,0.6504] ] -,[ [0.1786,0.6822], [0.1995,0.6748] ] -,[ [0.1819,0.7058], [0.1995,0.7] ] -,[ [0.1868,0.7278], [0.1995,0.7252] ] -,[ [0.1918,0.7499], [0.1995,0.7503] ] -,[ [0.1968,0.7704], [0.1995,0.7754] ] -,[ [0.2017,0.791], [0.1995,0.8005] ] -,[ [0.2067,0.8101], [0.1995,0.8245] ] -,[ [0.2116,0.8307], [0.1995,0.8495] ] -,[ [0.2149,0.8483], [0.1995,0.8745] ] -,[ [0.2199,0.866], [0.1995,0.8994] ] -,[ [0.2249,0.8836], [0.1995,0.9257] ] -,[ [0.248,0.112], [0.2246,0.07432] ] -,[ [0.2431,0.1296], [0.2246,0.1006] ] -,[ [0.2381,0.1473], [0.2246,0.1255] ] -,[ [0.2348,0.1664], [0.2246,0.1505] ] -,[ [0.2298,0.1855], [0.2246,0.1755] ] -,[ [0.2249,0.2046], [0.2246,0.1995] ] -,[ [0.2199,0.2252], [0.2246,0.2246] ] -,[ [0.2149,0.2457], [0.2246,0.2497] ] -,[ [0.21,0.2678], [0.2246,0.2748] ] -,[ [0.205,0.2898], [0.2246,0.3] ] -,[ [0.2001,0.3148], [0.2246,0.3252] ] -,[ [0.1968,0.3383], [0.2246,0.3496] ] -,[ [0.1935,0.3642], [0.2246,0.3751] ] -,[ [0.1901,0.3905], [0.2246,0.4] ] -,[ [0.1885,0.4173], [0.2246,0.425] ] -,[ [0.1868,0.4446], [0.2246,0.45] ] -,[ [0.1852,0.4722], [0.2246,0.475] ] -,[ [0.1852,0.5], [0.2246,0.5] ] -,[ [0.1852,0.5278], [0.2246,0.525] ] -,[ [0.1868,0.5554], [0.2246,0.55] ] -,[ [0.1885,0.5827], [0.2246,0.575] ] -,[ [0.1901,0.6095], [0.2246,0.6] ] -,[ [0.1935,0.6358], [0.2246,0.6249] ] -,[ [0.1968,0.6617], [0.2246,0.6504] ] -,[ [0.2001,0.6852], [0.2246,0.6748] ] -,[ [0.205,0.7102], [0.2246,0.7] ] -,[ [0.21,0.7322], [0.2246,0.7252] ] -,[ [0.2149,0.7543], [0.2246,0.7503] ] -,[ [0.2199,0.7748], [0.2246,0.7754] ] -,[ [0.2249,0.7954], [0.2246,0.8005] ] -,[ [0.2298,0.8145], [0.2246,0.8245] ] -,[ [0.2348,0.8336], [0.2246,0.8495] ] -,[ [0.2381,0.8527], [0.2246,0.8745] ] -,[ [0.2431,0.8704], [0.2246,0.8994] ] -,[ [0.248,0.888], [0.2246,0.9257] ] -,[ [0.2695,0.1091], [0.2497,0.07432] ] -,[ [0.2662,0.1252], [0.2497,0.1006] ] -,[ [0.2612,0.1443], [0.2497,0.1255] ] -,[ [0.2579,0.162], [0.2497,0.1505] ] -,[ [0.253,0.1811], [0.2497,0.1755] ] -,[ [0.248,0.2002], [0.2497,0.1995] ] -,[ [0.2431,0.2208], [0.2497,0.2246] ] -,[ [0.2381,0.2413], [0.2497,0.2497] ] -,[ [0.2331,0.2634], [0.2497,0.2748] ] -,[ [0.2282,0.2869], [0.2497,0.3] ] -,[ [0.2249,0.3104], [0.2497,0.3252] ] -,[ [0.2216,0.3354], [0.2497,0.3496] ] -,[ [0.2183,0.3616], [0.2497,0.3751] ] -,[ [0.2149,0.3883], [0.2497,0.4] ] -,[ [0.2133,0.4156], [0.2497,0.425] ] -,[ [0.2116,0.4434], [0.2497,0.45] ] -,[ [0.21,0.4716], [0.2497,0.475] ] -,[ [0.21,0.5], [0.2497,0.5] ] -,[ [0.21,0.5284], [0.2497,0.525] ] -,[ [0.2116,0.5566], [0.2497,0.55] ] -,[ [0.2133,0.5844], [0.2497,0.575] ] -,[ [0.2149,0.6117], [0.2497,0.6] ] -,[ [0.2183,0.6384], [0.2497,0.6249] ] -,[ [0.2216,0.6646], [0.2497,0.6504] ] -,[ [0.2249,0.6896], [0.2497,0.6748] ] -,[ [0.2282,0.7131], [0.2497,0.7] ] -,[ [0.2331,0.7366], [0.2497,0.7252] ] -,[ [0.2381,0.7587], [0.2497,0.7503] ] -,[ [0.2431,0.7792], [0.2497,0.7754] ] -,[ [0.248,0.7998], [0.2497,0.8005] ] -,[ [0.253,0.8189], [0.2497,0.8245] ] -,[ [0.2579,0.838], [0.2497,0.8495] ] -,[ [0.2612,0.8557], [0.2497,0.8745] ] -,[ [0.2662,0.8748], [0.2497,0.8994] ] -,[ [0.2695,0.8909], [0.2497,0.9257] ] -,[ [0.2745,0.9071], [0.2497,0.9503] ] -,[ [0.2794,0.9203], [0.2497,0.9745] ] -,[ [0.2894,0.9262], [0.2497,1] ] -,[ [0.3092,0.06349], [0.2748,0] ] -,[ [0.3026,0.07378], [0.2748,0.02551] ] -,[ [0.2976,0.08848], [0.2748,0.04974] ] -,[ [0.2943,0.1046], [0.2748,0.07432] ] -,[ [0.2894,0.1223], [0.2748,0.1006] ] -,[ [0.286,0.1399], [0.2748,0.1255] ] -,[ [0.2827,0.159], [0.2748,0.1505] ] -,[ [0.2778,0.1767], [0.2748,0.1755] ] -,[ [0.2728,0.1958], [0.2748,0.1995] ] -,[ [0.2679,0.2163], [0.2748,0.2246] ] -,[ [0.2629,0.2369], [0.2748,0.2497] ] -,[ [0.2579,0.259], [0.2748,0.2748] ] -,[ [0.2546,0.2825], [0.2748,0.3] ] -,[ [0.2497,0.3075], [0.2748,0.3252] ] -,[ [0.2464,0.3325], [0.2748,0.3496] ] -,[ [0.2431,0.3591], [0.2748,0.3751] ] -,[ [0.2414,0.3861], [0.2748,0.4] ] -,[ [0.2381,0.4139], [0.2748,0.425] ] -,[ [0.2364,0.4422], [0.2748,0.45] ] -,[ [0.2364,0.471], [0.2748,0.475] ] -,[ [0.2348,0.5], [0.2748,0.5] ] -,[ [0.2364,0.529], [0.2748,0.525] ] -,[ [0.2364,0.5578], [0.2748,0.55] ] -,[ [0.2381,0.5861], [0.2748,0.575] ] -,[ [0.2414,0.6139], [0.2748,0.6] ] -,[ [0.2431,0.6409], [0.2748,0.6249] ] -,[ [0.2464,0.6675], [0.2748,0.6504] ] -,[ [0.2497,0.6925], [0.2748,0.6748] ] -,[ [0.2546,0.7175], [0.2748,0.7] ] -,[ [0.2579,0.741], [0.2748,0.7252] ] -,[ [0.2629,0.7631], [0.2748,0.7503] ] -,[ [0.2679,0.7837], [0.2748,0.7754] ] -,[ [0.2728,0.8042], [0.2748,0.8005] ] -,[ [0.2778,0.8233], [0.2748,0.8245] ] -,[ [0.2827,0.841], [0.2748,0.8495] ] -,[ [0.286,0.8601], [0.2748,0.8745] ] -,[ [0.2894,0.8777], [0.2748,0.8994] ] -,[ [0.2943,0.8954], [0.2748,0.9257] ] -,[ [0.2976,0.9115], [0.2748,0.9503] ] -,[ [0.3026,0.9262], [0.2748,0.9745] ] -,[ [0.3092,0.9365], [0.2748,1] ] -,[ [0.3307,0.05761], [0.3,0] ] -,[ [0.3257,0.06937], [0.3,0.02551] ] -,[ [0.3224,0.08554], [0.3,0.04974] ] -,[ [0.3191,0.1017], [0.3,0.07432] ] -,[ [0.3142,0.1193], [0.3,0.1006] ] -,[ [0.3108,0.137], [0.3,0.1255] ] -,[ [0.3075,0.1546], [0.3,0.1505] ] -,[ [0.3026,0.1723], [0.3,0.1755] ] -,[ [0.2976,0.1914], [0.3,0.1995] ] -,[ [0.2927,0.2119], [0.3,0.2246] ] -,[ [0.2894,0.2325], [0.3,0.2497] ] -,[ [0.2844,0.256], [0.3,0.2748] ] -,[ [0.2811,0.2795], [0.3,0.3] ] -,[ [0.2778,0.3045], [0.3,0.3252] ] -,[ [0.2745,0.3295], [0.3,0.3496] ] -,[ [0.2712,0.3564], [0.3,0.3751] ] -,[ [0.2679,0.3839], [0.3,0.4] ] -,[ [0.2646,0.4121], [0.3,0.425] ] -,[ [0.2629,0.4411], [0.3,0.45] ] -,[ [0.2629,0.4703], [0.3,0.475] ] -,[ [0.2629,0.5], [0.3,0.5] ] -,[ [0.2629,0.5297], [0.3,0.525] ] -,[ [0.2629,0.5589], [0.3,0.55] ] -,[ [0.2646,0.5879], [0.3,0.575] ] -,[ [0.2679,0.6161], [0.3,0.6] ] -,[ [0.2712,0.6436], [0.3,0.6249] ] -,[ [0.2745,0.6705], [0.3,0.6504] ] -,[ [0.2778,0.6955], [0.3,0.6748] ] -,[ [0.2811,0.7205], [0.3,0.7] ] -,[ [0.2844,0.744], [0.3,0.7252] ] -,[ [0.2894,0.7675], [0.3,0.7503] ] -,[ [0.2927,0.7881], [0.3,0.7754] ] -,[ [0.2976,0.8086], [0.3,0.8005] ] -,[ [0.3026,0.8277], [0.3,0.8245] ] -,[ [0.3075,0.8454], [0.3,0.8495] ] -,[ [0.3108,0.863], [0.3,0.8745] ] -,[ [0.3142,0.8807], [0.3,0.8994] ] -,[ [0.3191,0.8983], [0.3,0.9257] ] -,[ [0.3224,0.9145], [0.3,0.9503] ] -,[ [0.3257,0.9306], [0.3,0.9745] ] -,[ [0.3307,0.9424], [0.3,1] ] -,[ [0.3538,0.0532], [0.3252,0] ] -,[ [0.3505,0.06643], [0.3252,0.02551] ] -,[ [0.3472,0.0826], [0.3252,0.04974] ] -,[ [0.3439,0.09877], [0.3252,0.07432] ] -,[ [0.3406,0.1164], [0.3252,0.1006] ] -,[ [0.3373,0.134], [0.3252,0.1255] ] -,[ [0.3323,0.1517], [0.3252,0.1505] ] -,[ [0.329,0.1693], [0.3252,0.1755] ] -,[ [0.3241,0.1884], [0.3252,0.1995] ] -,[ [0.3208,0.2075], [0.3252,0.2246] ] -,[ [0.3158,0.2296], [0.3252,0.2497] ] -,[ [0.3125,0.2516], [0.3252,0.2748] ] -,[ [0.3092,0.2766], [0.3252,0.3] ] -,[ [0.3059,0.3016], [0.3252,0.3252] ] -,[ [0.3026,0.3266], [0.3252,0.3496] ] -,[ [0.2993,0.3536], [0.3252,0.3751] ] -,[ [0.296,0.3815], [0.3252,0.4] ] -,[ [0.2943,0.4103], [0.3252,0.425] ] -,[ [0.2927,0.4399], [0.3252,0.45] ] -,[ [0.291,0.4699], [0.3252,0.475] ] -,[ [0.291,0.5], [0.3252,0.5] ] -,[ [0.291,0.5301], [0.3252,0.525] ] -,[ [0.2927,0.5601], [0.3252,0.55] ] -,[ [0.2943,0.5897], [0.3252,0.575] ] -,[ [0.296,0.6185], [0.3252,0.6] ] -,[ [0.2993,0.6464], [0.3252,0.6249] ] -,[ [0.3026,0.6734], [0.3252,0.6504] ] -,[ [0.3059,0.6984], [0.3252,0.6748] ] -,[ [0.3092,0.7234], [0.3252,0.7] ] -,[ [0.3125,0.7484], [0.3252,0.7252] ] -,[ [0.3158,0.7704], [0.3252,0.7503] ] -,[ [0.3208,0.7925], [0.3252,0.7754] ] -,[ [0.3241,0.8116], [0.3252,0.8005] ] -,[ [0.329,0.8307], [0.3252,0.8245] ] -,[ [0.3323,0.8483], [0.3252,0.8495] ] -,[ [0.3373,0.866], [0.3252,0.8745] ] -,[ [0.3406,0.8836], [0.3252,0.8994] ] -,[ [0.3439,0.9012], [0.3252,0.9257] ] -,[ [0.3472,0.9174], [0.3252,0.9503] ] -,[ [0.3505,0.9336], [0.3252,0.9745] ] -,[ [0.3538,0.9468], [0.3252,1] ] -,[ [0.3773,0.05026], [0.3496,0] ] -,[ [0.3743,0.06349], [0.3496,0.02551] ] -,[ [0.3717,0.07966], [0.3496,0.04974] ] -,[ [0.3689,0.09583], [0.3496,0.07432] ] -,[ [0.3659,0.1135], [0.3496,0.1006] ] -,[ [0.3621,0.1296], [0.3496,0.1255] ] -,[ [0.3588,0.1473], [0.3496,0.1505] ] -,[ [0.3555,0.1649], [0.3496,0.1755] ] -,[ [0.3522,0.184], [0.3496,0.1995] ] -,[ [0.3472,0.2046], [0.3496,0.2246] ] -,[ [0.3439,0.2266], [0.3496,0.2497] ] -,[ [0.3406,0.2487], [0.3496,0.2748] ] -,[ [0.3373,0.2737], [0.3496,0.3] ] -,[ [0.334,0.2986], [0.3496,0.3252] ] -,[ [0.3307,0.3236], [0.3496,0.3496] ] -,[ [0.3274,0.3516], [0.3496,0.3751] ] -,[ [0.3257,0.3796], [0.3496,0.4] ] -,[ [0.3257,0.4093], [0.3496,0.425] ] -,[ [0.3241,0.4394], [0.3496,0.45] ] -,[ [0.3241,0.4697], [0.3496,0.475] ] -,[ [0.3241,0.5], [0.3496,0.5] ] -,[ [0.3241,0.5303], [0.3496,0.525] ] -,[ [0.3241,0.5606], [0.3496,0.55] ] -,[ [0.3257,0.5907], [0.3496,0.575] ] -,[ [0.3257,0.6204], [0.3496,0.6] ] -,[ [0.3274,0.6484], [0.3496,0.6249] ] -,[ [0.3307,0.6764], [0.3496,0.6504] ] -,[ [0.334,0.7014], [0.3496,0.6748] ] -,[ [0.3373,0.7263], [0.3496,0.7] ] -,[ [0.3406,0.7513], [0.3496,0.7252] ] -,[ [0.3439,0.7734], [0.3496,0.7503] ] -,[ [0.3472,0.7954], [0.3496,0.7754] ] -,[ [0.3522,0.816], [0.3496,0.8005] ] -,[ [0.3555,0.8351], [0.3496,0.8245] ] -,[ [0.3588,0.8527], [0.3496,0.8495] ] -,[ [0.3621,0.8704], [0.3496,0.8745] ] -,[ [0.3659,0.8865], [0.3496,0.8994] ] -,[ [0.3689,0.9042], [0.3496,0.9257] ] -,[ [0.3717,0.9203], [0.3496,0.9503] ] -,[ [0.3743,0.9365], [0.3496,0.9745] ] -,[ [0.3773,0.9497], [0.3496,1] ] -,[ [0.402,0.04733], [0.3751,0] ] -,[ [0.3995,0.06202], [0.3751,0.02551] ] -,[ [0.3972,0.07819], [0.3751,0.04974] ] -,[ [0.3948,0.09436], [0.3751,0.07432] ] -,[ [0.3922,0.1105], [0.3751,0.1006] ] -,[ [0.3894,0.1267], [0.3751,0.1255] ] -,[ [0.3862,0.1443], [0.3751,0.1505] ] -,[ [0.3829,0.162], [0.3751,0.1755] ] -,[ [0.3796,0.1811], [0.3751,0.1995] ] -,[ [0.3763,0.2016], [0.3751,0.2246] ] -,[ [0.3733,0.2237], [0.3751,0.2497] ] -,[ [0.3705,0.2457], [0.3751,0.2748] ] -,[ [0.3676,0.2707], [0.3751,0.3] ] -,[ [0.3644,0.2957], [0.3751,0.3252] ] -,[ [0.3621,0.3207], [0.3751,0.3496] ] -,[ [0.3588,0.3486], [0.3751,0.3751] ] -,[ [0.3588,0.3789], [0.3751,0.4] ] -,[ [0.3588,0.4093], [0.3751,0.425] ] -,[ [0.3604,0.4399], [0.3751,0.45] ] -,[ [0.3604,0.47], [0.3751,0.475] ] -,[ [0.3604,0.5], [0.3751,0.5] ] -,[ [0.3604,0.53], [0.3751,0.525] ] -,[ [0.3604,0.5601], [0.3751,0.55] ] -,[ [0.3588,0.5907], [0.3751,0.575] ] -,[ [0.3588,0.6211], [0.3751,0.6] ] -,[ [0.3588,0.6514], [0.3751,0.6249] ] -,[ [0.3621,0.6793], [0.3751,0.6504] ] -,[ [0.3644,0.7043], [0.3751,0.6748] ] -,[ [0.3676,0.7293], [0.3751,0.7] ] -,[ [0.3705,0.7543], [0.3751,0.7252] ] -,[ [0.3733,0.7763], [0.3751,0.7503] ] -,[ [0.3763,0.7984], [0.3751,0.7754] ] -,[ [0.3796,0.8189], [0.3751,0.8005] ] -,[ [0.3829,0.838], [0.3751,0.8245] ] -,[ [0.3862,0.8557], [0.3751,0.8495] ] -,[ [0.3894,0.8733], [0.3751,0.8745] ] -,[ [0.3922,0.8895], [0.3751,0.8994] ] -,[ [0.3948,0.9056], [0.3751,0.9257] ] -,[ [0.3972,0.9218], [0.3751,0.9503] ] -,[ [0.3995,0.938], [0.3751,0.9745] ] -,[ [0.402,0.9527], [0.3751,1] ] -,[ [0.4269,0.04586], [0.4,0] ] -,[ [0.4249,0.06055], [0.4,0.02551] ] -,[ [0.4231,0.07525], [0.4,0.04974] ] -,[ [0.4211,0.09289], [0.4,0.07432] ] -,[ [0.419,0.1091], [0.4,0.1006] ] -,[ [0.4165,0.1252], [0.4,0.1255] ] -,[ [0.414,0.1414], [0.4,0.1505] ] -,[ [0.4112,0.159], [0.4,0.1755] ] -,[ [0.4086,0.1781], [0.4,0.1995] ] -,[ [0.4059,0.1987], [0.4,0.2246] ] -,[ [0.4034,0.2208], [0.4,0.2497] ] -,[ [0.401,0.2443], [0.4,0.2748] ] -,[ [0.3985,0.2678], [0.4,0.3] ] -,[ [0.3958,0.2928], [0.4,0.3252] ] -,[ [0.3937,0.3192], [0.4,0.3496] ] -,[ [0.3929,0.3486], [0.4,0.3751] ] -,[ [0.3934,0.3793], [0.4,0.4] ] -,[ [0.3945,0.4103], [0.4,0.425] ] -,[ [0.396,0.4408], [0.4,0.45] ] -,[ [0.397,0.4706], [0.4,0.475] ] -,[ [0.3973,0.5], [0.4,0.5] ] -,[ [0.397,0.5294], [0.4,0.525] ] -,[ [0.396,0.5592], [0.4,0.55] ] -,[ [0.3945,0.5897], [0.4,0.575] ] -,[ [0.3934,0.6207], [0.4,0.6] ] -,[ [0.3929,0.6514], [0.4,0.6249] ] -,[ [0.3937,0.6808], [0.4,0.6504] ] -,[ [0.3958,0.7072], [0.4,0.6748] ] -,[ [0.3985,0.7322], [0.4,0.7] ] -,[ [0.401,0.7557], [0.4,0.7252] ] -,[ [0.4034,0.7792], [0.4,0.7503] ] -,[ [0.4059,0.8013], [0.4,0.7754] ] -,[ [0.4086,0.8219], [0.4,0.8005] ] -,[ [0.4112,0.841], [0.4,0.8245] ] -,[ [0.414,0.8586], [0.4,0.8495] ] -,[ [0.4165,0.8748], [0.4,0.8745] ] -,[ [0.419,0.8909], [0.4,0.8994] ] -,[ [0.4211,0.9071], [0.4,0.9257] ] -,[ [0.4231,0.9248], [0.4,0.9503] ] -,[ [0.4249,0.9394], [0.4,0.9745] ] -,[ [0.4269,0.9541], [0.4,1] ] -,[ [0.4522,0.04439], [0.425,0] ] -,[ [0.4507,0.05908], [0.425,0.02551] ] -,[ [0.4494,0.07378], [0.425,0.04974] ] -,[ [0.4479,0.08995], [0.425,0.07432] ] -,[ [0.4461,0.1061], [0.425,0.1006] ] -,[ [0.4443,0.1223], [0.425,0.1255] ] -,[ [0.4423,0.1399], [0.425,0.1505] ] -,[ [0.4401,0.1576], [0.425,0.1755] ] -,[ [0.438,0.1767], [0.425,0.1995] ] -,[ [0.436,0.1972], [0.425,0.2246] ] -,[ [0.4342,0.2193], [0.425,0.2497] ] -,[ [0.4322,0.2413], [0.425,0.2748] ] -,[ [0.4302,0.2648], [0.425,0.3] ] -,[ [0.4282,0.2913], [0.425,0.3252] ] -,[ [0.4271,0.3192], [0.425,0.3496] ] -,[ [0.4271,0.3486], [0.425,0.3751] ] -,[ [0.4282,0.3804], [0.425,0.4] ] -,[ [0.4297,0.4117], [0.425,0.425] ] -,[ [0.4312,0.4419], [0.425,0.45] ] -,[ [0.4322,0.4713], [0.425,0.475] ] -,[ [0.4325,0.5], [0.425,0.5] ] -,[ [0.4322,0.5287], [0.425,0.525] ] -,[ [0.4312,0.5581], [0.425,0.55] ] -,[ [0.4297,0.5883], [0.425,0.575] ] -,[ [0.4282,0.6196], [0.425,0.6] ] -,[ [0.4271,0.6514], [0.425,0.6249] ] -,[ [0.4271,0.6808], [0.425,0.6504] ] -,[ [0.4282,0.7087], [0.425,0.6748] ] -,[ [0.4302,0.7352], [0.425,0.7] ] -,[ [0.4322,0.7587], [0.425,0.7252] ] -,[ [0.4342,0.7807], [0.425,0.7503] ] -,[ [0.436,0.8028], [0.425,0.7754] ] -,[ [0.438,0.8233], [0.425,0.8005] ] -,[ [0.4401,0.8424], [0.425,0.8245] ] -,[ [0.4423,0.8601], [0.425,0.8495] ] -,[ [0.4443,0.8777], [0.425,0.8745] ] -,[ [0.4461,0.8939], [0.425,0.8994] ] -,[ [0.4479,0.9101], [0.425,0.9257] ] -,[ [0.4494,0.9262], [0.425,0.9503] ] -,[ [0.4507,0.9409], [0.425,0.9745] ] -,[ [0.4522,0.9556], [0.425,1] ] -,[ [0.4777,0.04292], [0.45,0] ] -,[ [0.4767,0.05761], [0.45,0.02551] ] -,[ [0.4759,0.07378], [0.45,0.04974] ] -,[ [0.4747,0.08995], [0.45,0.07432] ] -,[ [0.4735,0.1046], [0.45,0.1006] ] -,[ [0.4724,0.1208], [0.45,0.1255] ] -,[ [0.4709,0.1384], [0.45,0.1505] ] -,[ [0.4696,0.1561], [0.45,0.1755] ] -,[ [0.4681,0.1752], [0.45,0.1995] ] -,[ [0.4668,0.1958], [0.45,0.2246] ] -,[ [0.4654,0.2178], [0.45,0.2497] ] -,[ [0.4641,0.2399], [0.45,0.2748] ] -,[ [0.4628,0.2634], [0.45,0.3] ] -,[ [0.4615,0.2898], [0.45,0.3252] ] -,[ [0.461,0.3178], [0.45,0.3496] ] -,[ [0.4615,0.3501], [0.45,0.3751] ] -,[ [0.4625,0.3817], [0.45,0.4] ] -,[ [0.4638,0.413], [0.45,0.425] ] -,[ [0.4649,0.443], [0.45,0.45] ] -,[ [0.4658,0.4719], [0.45,0.475] ] -,[ [0.4661,0.5], [0.45,0.5] ] -,[ [0.4658,0.5281], [0.45,0.525] ] -,[ [0.4649,0.557], [0.45,0.55] ] -,[ [0.4638,0.587], [0.45,0.575] ] -,[ [0.4625,0.6183], [0.45,0.6] ] -,[ [0.4615,0.6499], [0.45,0.6249] ] -,[ [0.461,0.6822], [0.45,0.6504] ] -,[ [0.4615,0.7102], [0.45,0.6748] ] -,[ [0.4628,0.7366], [0.45,0.7] ] -,[ [0.4641,0.7601], [0.45,0.7252] ] -,[ [0.4654,0.7822], [0.45,0.7503] ] -,[ [0.4668,0.8042], [0.45,0.7754] ] -,[ [0.4681,0.8248], [0.45,0.8005] ] -,[ [0.4696,0.8439], [0.45,0.8245] ] -,[ [0.4709,0.8616], [0.45,0.8495] ] -,[ [0.4724,0.8792], [0.45,0.8745] ] -,[ [0.4735,0.8954], [0.45,0.8994] ] -,[ [0.4747,0.9101], [0.45,0.9257] ] -,[ [0.4759,0.9262], [0.45,0.9503] ] -,[ [0.4767,0.9424], [0.45,0.9745] ] -,[ [0.4777,0.9571], [0.45,1] ] -,[ [0.5033,0.04145], [0.475,0] ] -,[ [0.5028,0.05761], [0.475,0.02551] ] -,[ [0.5025,0.07231], [0.475,0.04974] ] -,[ [0.5018,0.08848], [0.475,0.07432] ] -,[ [0.5013,0.1046], [0.475,0.1006] ] -,[ [0.5007,0.1208], [0.475,0.1255] ] -,[ [0.5,0.137], [0.475,0.1505] ] -,[ [0.4992,0.1546], [0.475,0.1755] ] -,[ [0.4985,0.1737], [0.475,0.1995] ] -,[ [0.4979,0.1943], [0.475,0.2246] ] -,[ [0.4972,0.2163], [0.475,0.2497] ] -,[ [0.4965,0.2399], [0.475,0.2748] ] -,[ [0.4957,0.2634], [0.475,0.3] ] -,[ [0.4952,0.2884], [0.475,0.3252] ] -,[ [0.495,0.3178], [0.475,0.3496] ] -,[ [0.4954,0.3501], [0.475,0.3751] ] -,[ [0.496,0.3826], [0.475,0.4] ] -,[ [0.4969,0.4139], [0.475,0.425] ] -,[ [0.4975,0.4437], [0.475,0.45] ] -,[ [0.498,0.4724], [0.475,0.475] ] -,[ [0.4982,0.5], [0.475,0.5] ] -,[ [0.498,0.5276], [0.475,0.525] ] -,[ [0.4975,0.5563], [0.475,0.55] ] -,[ [0.4969,0.5861], [0.475,0.575] ] -,[ [0.496,0.6174], [0.475,0.6] ] -,[ [0.4954,0.6499], [0.475,0.6249] ] -,[ [0.495,0.6822], [0.475,0.6504] ] -,[ [0.4952,0.7116], [0.475,0.6748] ] -,[ [0.4957,0.7366], [0.475,0.7] ] -,[ [0.4965,0.7601], [0.475,0.7252] ] -,[ [0.4972,0.7837], [0.475,0.7503] ] -,[ [0.4979,0.8057], [0.475,0.7754] ] -,[ [0.4985,0.8263], [0.475,0.8005] ] -,[ [0.4992,0.8454], [0.475,0.8245] ] -,[ [0.5,0.863], [0.475,0.8495] ] -,[ [0.5007,0.8792], [0.475,0.8745] ] -,[ [0.5013,0.8954], [0.475,0.8994] ] -,[ [0.5018,0.9115], [0.475,0.9257] ] -,[ [0.5025,0.9277], [0.475,0.9503] ] -,[ [0.5028,0.9424], [0.475,0.9745] ] -,[ [0.5033,0.9586], [0.475,1] ] -,[ [0.5291,0.04145], [0.5,0] ] -,[ [0.5291,0.05614], [0.5,0.02551] ] -,[ [0.5291,0.07231], [0.5,0.04974] ] -,[ [0.5291,0.08848], [0.5,0.07432] ] -,[ [0.5291,0.1046], [0.5,0.1006] ] -,[ [0.5291,0.1208], [0.5,0.1255] ] -,[ [0.5291,0.137], [0.5,0.1505] ] -,[ [0.5291,0.1546], [0.5,0.1755] ] -,[ [0.5291,0.1737], [0.5,0.1995] ] -,[ [0.5291,0.1943], [0.5,0.2246] ] -,[ [0.5291,0.2163], [0.5,0.2497] ] -,[ [0.5291,0.2384], [0.5,0.2748] ] -,[ [0.5291,0.2634], [0.5,0.3] ] -,[ [0.5291,0.2884], [0.5,0.3252] ] -,[ [0.5291,0.3178], [0.5,0.3496] ] -,[ [0.5291,0.3501], [0.5,0.3751] ] -,[ [0.5291,0.3829], [0.5,0.4] ] -,[ [0.5291,0.4142], [0.5,0.425] ] -,[ [0.5291,0.444], [0.5,0.45] ] -,[ [0.5291,0.4725], [0.5,0.475] ] -,[ [0.5291,0.5], [0.5,0.5] ] -,[ [0.5291,0.5275], [0.5,0.525] ] -,[ [0.5291,0.556], [0.5,0.55] ] -,[ [0.5291,0.5858], [0.5,0.575] ] -,[ [0.5291,0.6171], [0.5,0.6] ] -,[ [0.5291,0.6499], [0.5,0.6249] ] -,[ [0.5291,0.6822], [0.5,0.6504] ] -,[ [0.5291,0.7116], [0.5,0.6748] ] -,[ [0.5291,0.7366], [0.5,0.7] ] -,[ [0.5291,0.7616], [0.5,0.7252] ] -,[ [0.5291,0.7837], [0.5,0.7503] ] -,[ [0.5291,0.8057], [0.5,0.7754] ] -,[ [0.5291,0.8263], [0.5,0.8005] ] -,[ [0.5291,0.8454], [0.5,0.8245] ] -,[ [0.5291,0.863], [0.5,0.8495] ] -,[ [0.5291,0.8792], [0.5,0.8745] ] -,[ [0.5291,0.8954], [0.5,0.8994] ] -,[ [0.5291,0.9115], [0.5,0.9257] ] -,[ [0.5291,0.9277], [0.5,0.9503] ] -,[ [0.5291,0.9439], [0.5,0.9745] ] -,[ [0.5291,0.9586], [0.5,1] ] -,[ [0.5549,0.04145], [0.525,0] ] -,[ [0.5554,0.05761], [0.525,0.02551] ] -,[ [0.5557,0.07231], [0.525,0.04974] ] -,[ [0.5564,0.08848], [0.525,0.07432] ] -,[ [0.5569,0.1046], [0.525,0.1006] ] -,[ [0.5575,0.1208], [0.525,0.1255] ] -,[ [0.5582,0.137], [0.525,0.1505] ] -,[ [0.559,0.1546], [0.525,0.1755] ] -,[ [0.5597,0.1737], [0.525,0.1995] ] -,[ [0.5604,0.1943], [0.525,0.2246] ] -,[ [0.561,0.2163], [0.525,0.2497] ] -,[ [0.5617,0.2399], [0.525,0.2748] ] -,[ [0.5625,0.2634], [0.525,0.3] ] -,[ [0.563,0.2884], [0.525,0.3252] ] -,[ [0.5632,0.3178], [0.525,0.3496] ] -,[ [0.5628,0.3501], [0.525,0.3751] ] -,[ [0.5622,0.3826], [0.525,0.4] ] -,[ [0.5613,0.4139], [0.525,0.425] ] -,[ [0.5607,0.4437], [0.525,0.45] ] -,[ [0.5602,0.4724], [0.525,0.475] ] -,[ [0.56,0.5], [0.525,0.5] ] -,[ [0.5602,0.5276], [0.525,0.525] ] -,[ [0.5607,0.5563], [0.525,0.55] ] -,[ [0.5613,0.5861], [0.525,0.575] ] -,[ [0.5622,0.6174], [0.525,0.6] ] -,[ [0.5628,0.6499], [0.525,0.6249] ] -,[ [0.5632,0.6822], [0.525,0.6504] ] -,[ [0.563,0.7116], [0.525,0.6748] ] -,[ [0.5625,0.7366], [0.525,0.7] ] -,[ [0.5617,0.7601], [0.525,0.7252] ] -,[ [0.561,0.7837], [0.525,0.7503] ] -,[ [0.5604,0.8057], [0.525,0.7754] ] -,[ [0.5597,0.8263], [0.525,0.8005] ] -,[ [0.559,0.8454], [0.525,0.8245] ] -,[ [0.5582,0.863], [0.525,0.8495] ] -,[ [0.5575,0.8792], [0.525,0.8745] ] -,[ [0.5569,0.8954], [0.525,0.8994] ] -,[ [0.5564,0.9115], [0.525,0.9257] ] -,[ [0.5557,0.9277], [0.525,0.9503] ] -,[ [0.5554,0.9424], [0.525,0.9745] ] -,[ [0.5549,0.9586], [0.525,1] ] -,[ [0.5805,0.04292], [0.55,0] ] -,[ [0.5815,0.05761], [0.55,0.02551] ] -,[ [0.5823,0.07378], [0.55,0.04974] ] -,[ [0.5835,0.08995], [0.55,0.07432] ] -,[ [0.5847,0.1046], [0.55,0.1006] ] -,[ [0.5858,0.1208], [0.55,0.1255] ] -,[ [0.5873,0.1384], [0.55,0.1505] ] -,[ [0.5886,0.1561], [0.55,0.1755] ] -,[ [0.5901,0.1752], [0.55,0.1995] ] -,[ [0.5914,0.1958], [0.55,0.2246] ] -,[ [0.5928,0.2178], [0.55,0.2497] ] -,[ [0.5941,0.2399], [0.55,0.2748] ] -,[ [0.5954,0.2634], [0.55,0.3] ] -,[ [0.5967,0.2898], [0.55,0.3252] ] -,[ [0.5972,0.3178], [0.55,0.3496] ] -,[ [0.5967,0.3501], [0.55,0.3751] ] -,[ [0.5957,0.3817], [0.55,0.4] ] -,[ [0.5944,0.413], [0.55,0.425] ] -,[ [0.5933,0.443], [0.55,0.45] ] -,[ [0.5924,0.4719], [0.55,0.475] ] -,[ [0.5921,0.5], [0.55,0.5] ] -,[ [0.5924,0.5281], [0.55,0.525] ] -,[ [0.5933,0.557], [0.55,0.55] ] -,[ [0.5944,0.587], [0.55,0.575] ] -,[ [0.5957,0.6183], [0.55,0.6] ] -,[ [0.5967,0.6499], [0.55,0.6249] ] -,[ [0.5972,0.6822], [0.55,0.6504] ] -,[ [0.5967,0.7102], [0.55,0.6748] ] -,[ [0.5954,0.7366], [0.55,0.7] ] -,[ [0.5941,0.7601], [0.55,0.7252] ] -,[ [0.5928,0.7822], [0.55,0.7503] ] -,[ [0.5914,0.8042], [0.55,0.7754] ] -,[ [0.5901,0.8248], [0.55,0.8005] ] -,[ [0.5886,0.8439], [0.55,0.8245] ] -,[ [0.5873,0.8616], [0.55,0.8495] ] -,[ [0.5858,0.8792], [0.55,0.8745] ] -,[ [0.5847,0.8954], [0.55,0.8994] ] -,[ [0.5835,0.9101], [0.55,0.9257] ] -,[ [0.5823,0.9262], [0.55,0.9503] ] -,[ [0.5815,0.9424], [0.55,0.9745] ] -,[ [0.5805,0.9571], [0.55,1] ] -,[ [0.606,0.04439], [0.575,0] ] -,[ [0.6075,0.05908], [0.575,0.02551] ] -,[ [0.6088,0.07378], [0.575,0.04974] ] -,[ [0.6103,0.08995], [0.575,0.07432] ] -,[ [0.6121,0.1061], [0.575,0.1006] ] -,[ [0.6139,0.1223], [0.575,0.1255] ] -,[ [0.6159,0.1399], [0.575,0.1505] ] -,[ [0.6181,0.1576], [0.575,0.1755] ] -,[ [0.6202,0.1767], [0.575,0.1995] ] -,[ [0.6222,0.1972], [0.575,0.2246] ] -,[ [0.624,0.2193], [0.575,0.2497] ] -,[ [0.626,0.2413], [0.575,0.2748] ] -,[ [0.628,0.2648], [0.575,0.3] ] -,[ [0.63,0.2913], [0.575,0.3252] ] -,[ [0.6311,0.3192], [0.575,0.3496] ] -,[ [0.6311,0.3486], [0.575,0.3751] ] -,[ [0.63,0.3804], [0.575,0.4] ] -,[ [0.6285,0.4117], [0.575,0.425] ] -,[ [0.627,0.4419], [0.575,0.45] ] -,[ [0.626,0.4713], [0.575,0.475] ] -,[ [0.6257,0.5], [0.575,0.5] ] -,[ [0.626,0.5287], [0.575,0.525] ] -,[ [0.627,0.5581], [0.575,0.55] ] -,[ [0.6285,0.5883], [0.575,0.575] ] -,[ [0.63,0.6196], [0.575,0.6] ] -,[ [0.6311,0.6514], [0.575,0.6249] ] -,[ [0.6311,0.6808], [0.575,0.6504] ] -,[ [0.63,0.7087], [0.575,0.6748] ] -,[ [0.628,0.7352], [0.575,0.7] ] -,[ [0.626,0.7587], [0.575,0.7252] ] -,[ [0.624,0.7807], [0.575,0.7503] ] -,[ [0.6222,0.8028], [0.575,0.7754] ] -,[ [0.6202,0.8233], [0.575,0.8005] ] -,[ [0.6181,0.8424], [0.575,0.8245] ] -,[ [0.6159,0.8601], [0.575,0.8495] ] -,[ [0.6139,0.8777], [0.575,0.8745] ] -,[ [0.6121,0.8939], [0.575,0.8994] ] -,[ [0.6103,0.9101], [0.575,0.9257] ] -,[ [0.6088,0.9262], [0.575,0.9503] ] -,[ [0.6075,0.9409], [0.575,0.9745] ] -,[ [0.606,0.9556], [0.575,1] ] -,[ [0.6313,0.04586], [0.6,0] ] -,[ [0.6333,0.06055], [0.6,0.02551] ] -,[ [0.6351,0.07525], [0.6,0.04974] ] -,[ [0.6371,0.09289], [0.6,0.07432] ] -,[ [0.6392,0.1091], [0.6,0.1006] ] -,[ [0.6417,0.1252], [0.6,0.1255] ] -,[ [0.6442,0.1414], [0.6,0.1505] ] -,[ [0.647,0.159], [0.6,0.1755] ] -,[ [0.6496,0.1781], [0.6,0.1995] ] -,[ [0.6523,0.1987], [0.6,0.2246] ] -,[ [0.6548,0.2208], [0.6,0.2497] ] -,[ [0.6572,0.2443], [0.6,0.2748] ] -,[ [0.6597,0.2678], [0.6,0.3] ] -,[ [0.6624,0.2928], [0.6,0.3252] ] -,[ [0.6645,0.3192], [0.6,0.3496] ] -,[ [0.6653,0.3486], [0.6,0.3751] ] -,[ [0.6648,0.3793], [0.6,0.4] ] -,[ [0.6637,0.4103], [0.6,0.425] ] -,[ [0.6622,0.4408], [0.6,0.45] ] -,[ [0.6612,0.4706], [0.6,0.475] ] -,[ [0.6609,0.5], [0.6,0.5] ] -,[ [0.6612,0.5294], [0.6,0.525] ] -,[ [0.6622,0.5592], [0.6,0.55] ] -,[ [0.6637,0.5897], [0.6,0.575] ] -,[ [0.6648,0.6207], [0.6,0.6] ] -,[ [0.6653,0.6514], [0.6,0.6249] ] -,[ [0.6645,0.6808], [0.6,0.6504] ] -,[ [0.6624,0.7072], [0.6,0.6748] ] -,[ [0.6597,0.7322], [0.6,0.7] ] -,[ [0.6572,0.7557], [0.6,0.7252] ] -,[ [0.6548,0.7792], [0.6,0.7503] ] -,[ [0.6523,0.8013], [0.6,0.7754] ] -,[ [0.6496,0.8219], [0.6,0.8005] ] -,[ [0.647,0.841], [0.6,0.8245] ] -,[ [0.6442,0.8586], [0.6,0.8495] ] -,[ [0.6417,0.8748], [0.6,0.8745] ] -,[ [0.6392,0.8909], [0.6,0.8994] ] -,[ [0.6371,0.9071], [0.6,0.9257] ] -,[ [0.6351,0.9248], [0.6,0.9503] ] -,[ [0.6333,0.9394], [0.6,0.9745] ] -,[ [0.6313,0.9541], [0.6,1] ] -,[ [0.6563,0.04733], [0.6249,0] ] -,[ [0.6587,0.06202], [0.6249,0.02551] ] -,[ [0.661,0.07819], [0.6249,0.04974] ] -,[ [0.6634,0.09436], [0.6249,0.07432] ] -,[ [0.666,0.1105], [0.6249,0.1006] ] -,[ [0.6688,0.1267], [0.6249,0.1255] ] -,[ [0.672,0.1443], [0.6249,0.1505] ] -,[ [0.6753,0.162], [0.6249,0.1755] ] -,[ [0.6786,0.1811], [0.6249,0.1995] ] -,[ [0.6819,0.2016], [0.6249,0.2246] ] -,[ [0.6849,0.2237], [0.6249,0.2497] ] -,[ [0.6877,0.2457], [0.6249,0.2748] ] -,[ [0.6906,0.2707], [0.6249,0.3] ] -,[ [0.6938,0.2957], [0.6249,0.3252] ] -,[ [0.6961,0.3207], [0.6249,0.3496] ] -,[ [0.6994,0.3486], [0.6249,0.3751] ] -,[ [0.6994,0.3789], [0.6249,0.4] ] -,[ [0.6994,0.4093], [0.6249,0.425] ] -,[ [0.6978,0.4399], [0.6249,0.45] ] -,[ [0.6978,0.47], [0.6249,0.475] ] -,[ [0.6978,0.5], [0.6249,0.5] ] -,[ [0.6978,0.53], [0.6249,0.525] ] -,[ [0.6978,0.5601], [0.6249,0.55] ] -,[ [0.6994,0.5907], [0.6249,0.575] ] -,[ [0.6994,0.6211], [0.6249,0.6] ] -,[ [0.6994,0.6514], [0.6249,0.6249] ] -,[ [0.6961,0.6793], [0.6249,0.6504] ] -,[ [0.6938,0.7043], [0.6249,0.6748] ] -,[ [0.6906,0.7293], [0.6249,0.7] ] -,[ [0.6877,0.7543], [0.6249,0.7252] ] -,[ [0.6849,0.7763], [0.6249,0.7503] ] -,[ [0.6819,0.7984], [0.6249,0.7754] ] -,[ [0.6786,0.8189], [0.6249,0.8005] ] -,[ [0.6753,0.838], [0.6249,0.8245] ] -,[ [0.672,0.8557], [0.6249,0.8495] ] -,[ [0.6688,0.8733], [0.6249,0.8745] ] -,[ [0.666,0.8895], [0.6249,0.8994] ] -,[ [0.6634,0.9056], [0.6249,0.9257] ] -,[ [0.661,0.9218], [0.6249,0.9503] ] -,[ [0.6587,0.938], [0.6249,0.9745] ] -,[ [0.6563,0.9527], [0.6249,1] ] -,[ [0.6809,0.05026], [0.6504,0] ] -,[ [0.6839,0.06349], [0.6504,0.02551] ] -,[ [0.6865,0.07966], [0.6504,0.04974] ] -,[ [0.6893,0.09583], [0.6504,0.07432] ] -,[ [0.6923,0.1135], [0.6504,0.1006] ] -,[ [0.6961,0.1296], [0.6504,0.1255] ] -,[ [0.6994,0.1473], [0.6504,0.1505] ] -,[ [0.7027,0.1649], [0.6504,0.1755] ] -,[ [0.706,0.184], [0.6504,0.1995] ] -,[ [0.711,0.2046], [0.6504,0.2246] ] -,[ [0.7143,0.2266], [0.6504,0.2497] ] -,[ [0.7176,0.2487], [0.6504,0.2748] ] -,[ [0.7209,0.2737], [0.6504,0.3] ] -,[ [0.7242,0.2986], [0.6504,0.3252] ] -,[ [0.7275,0.3236], [0.6504,0.3496] ] -,[ [0.7308,0.3516], [0.6504,0.3751] ] -,[ [0.7325,0.3796], [0.6504,0.4] ] -,[ [0.7325,0.4093], [0.6504,0.425] ] -,[ [0.7341,0.4394], [0.6504,0.45] ] -,[ [0.7341,0.4697], [0.6504,0.475] ] -,[ [0.7341,0.5], [0.6504,0.5] ] -,[ [0.7341,0.5303], [0.6504,0.525] ] -,[ [0.7341,0.5606], [0.6504,0.55] ] -,[ [0.7325,0.5907], [0.6504,0.575] ] -,[ [0.7325,0.6204], [0.6504,0.6] ] -,[ [0.7308,0.6484], [0.6504,0.6249] ] -,[ [0.7275,0.6764], [0.6504,0.6504] ] -,[ [0.7242,0.7014], [0.6504,0.6748] ] -,[ [0.7209,0.7263], [0.6504,0.7] ] -,[ [0.7176,0.7513], [0.6504,0.7252] ] -,[ [0.7143,0.7734], [0.6504,0.7503] ] -,[ [0.711,0.7954], [0.6504,0.7754] ] -,[ [0.706,0.816], [0.6504,0.8005] ] -,[ [0.7027,0.8351], [0.6504,0.8245] ] -,[ [0.6994,0.8527], [0.6504,0.8495] ] -,[ [0.6961,0.8704], [0.6504,0.8745] ] -,[ [0.6923,0.8865], [0.6504,0.8994] ] -,[ [0.6893,0.9042], [0.6504,0.9257] ] -,[ [0.6865,0.9203], [0.6504,0.9503] ] -,[ [0.6839,0.9365], [0.6504,0.9745] ] -,[ [0.6809,0.9497], [0.6504,1] ] -,[ [0.7044,0.0532], [0.6748,0] ] -,[ [0.7077,0.06643], [0.6748,0.02551] ] -,[ [0.711,0.0826], [0.6748,0.04974] ] -,[ [0.7143,0.09877], [0.6748,0.07432] ] -,[ [0.7176,0.1164], [0.6748,0.1006] ] -,[ [0.7209,0.134], [0.6748,0.1255] ] -,[ [0.7259,0.1517], [0.6748,0.1505] ] -,[ [0.7292,0.1693], [0.6748,0.1755] ] -,[ [0.7341,0.1884], [0.6748,0.1995] ] -,[ [0.7374,0.2075], [0.6748,0.2246] ] -,[ [0.7424,0.2296], [0.6748,0.2497] ] -,[ [0.7457,0.2516], [0.6748,0.2748] ] -,[ [0.749,0.2766], [0.6748,0.3] ] -,[ [0.7523,0.3016], [0.6748,0.3252] ] -,[ [0.7556,0.3266], [0.6748,0.3496] ] -,[ [0.7589,0.3536], [0.6748,0.3751] ] -,[ [0.7622,0.3815], [0.6748,0.4] ] -,[ [0.7639,0.4103], [0.6748,0.425] ] -,[ [0.7655,0.4399], [0.6748,0.45] ] -,[ [0.7672,0.4699], [0.6748,0.475] ] -,[ [0.7672,0.5], [0.6748,0.5] ] -,[ [0.7672,0.5301], [0.6748,0.525] ] -,[ [0.7655,0.5601], [0.6748,0.55] ] -,[ [0.7639,0.5897], [0.6748,0.575] ] -,[ [0.7622,0.6185], [0.6748,0.6] ] -,[ [0.7589,0.6464], [0.6748,0.6249] ] -,[ [0.7556,0.6734], [0.6748,0.6504] ] -,[ [0.7523,0.6984], [0.6748,0.6748] ] -,[ [0.749,0.7234], [0.6748,0.7] ] -,[ [0.7457,0.7484], [0.6748,0.7252] ] -,[ [0.7424,0.7704], [0.6748,0.7503] ] -,[ [0.7374,0.7925], [0.6748,0.7754] ] -,[ [0.7341,0.8116], [0.6748,0.8005] ] -,[ [0.7292,0.8307], [0.6748,0.8245] ] -,[ [0.7259,0.8483], [0.6748,0.8495] ] -,[ [0.7209,0.866], [0.6748,0.8745] ] -,[ [0.7176,0.8836], [0.6748,0.8994] ] -,[ [0.7143,0.9012], [0.6748,0.9257] ] -,[ [0.711,0.9174], [0.6748,0.9503] ] -,[ [0.7077,0.9336], [0.6748,0.9745] ] -,[ [0.7044,0.9468], [0.6748,1] ] -,[ [0.7275,0.05761], [0.7,0] ] -,[ [0.7325,0.06937], [0.7,0.02551] ] -,[ [0.7358,0.08554], [0.7,0.04974] ] -,[ [0.7391,0.1017], [0.7,0.07432] ] -,[ [0.744,0.1193], [0.7,0.1006] ] -,[ [0.7474,0.137], [0.7,0.1255] ] -,[ [0.7507,0.1546], [0.7,0.1505] ] -,[ [0.7556,0.1723], [0.7,0.1755] ] -,[ [0.7606,0.1914], [0.7,0.1995] ] -,[ [0.7655,0.2119], [0.7,0.2246] ] -,[ [0.7688,0.2325], [0.7,0.2497] ] -,[ [0.7738,0.256], [0.7,0.2748] ] -,[ [0.7771,0.2795], [0.7,0.3] ] -,[ [0.7804,0.3045], [0.7,0.3252] ] -,[ [0.7837,0.3295], [0.7,0.3496] ] -,[ [0.787,0.3564], [0.7,0.3751] ] -,[ [0.7903,0.3839], [0.7,0.4] ] -,[ [0.7937,0.4121], [0.7,0.425] ] -,[ [0.7953,0.4411], [0.7,0.45] ] -,[ [0.7953,0.4703], [0.7,0.475] ] -,[ [0.7953,0.5], [0.7,0.5] ] -,[ [0.7953,0.5297], [0.7,0.525] ] -,[ [0.7953,0.5589], [0.7,0.55] ] -,[ [0.7937,0.5879], [0.7,0.575] ] -,[ [0.7903,0.6161], [0.7,0.6] ] -,[ [0.787,0.6436], [0.7,0.6249] ] -,[ [0.7837,0.6705], [0.7,0.6504] ] -,[ [0.7804,0.6955], [0.7,0.6748] ] -,[ [0.7771,0.7205], [0.7,0.7] ] -,[ [0.7738,0.744], [0.7,0.7252] ] -,[ [0.7688,0.7675], [0.7,0.7503] ] -,[ [0.7655,0.7881], [0.7,0.7754] ] -,[ [0.7606,0.8086], [0.7,0.8005] ] -,[ [0.7556,0.8277], [0.7,0.8245] ] -,[ [0.7507,0.8454], [0.7,0.8495] ] -,[ [0.7474,0.863], [0.7,0.8745] ] -,[ [0.744,0.8807], [0.7,0.8994] ] -,[ [0.7391,0.8983], [0.7,0.9257] ] -,[ [0.7358,0.9145], [0.7,0.9503] ] -,[ [0.7325,0.9306], [0.7,0.9745] ] -,[ [0.7275,0.9424], [0.7,1] ] -,[ [0.749,0.06349], [0.7252,0] ] -,[ [0.7556,0.07378], [0.7252,0.02551] ] -,[ [0.7606,0.08848], [0.7252,0.04974] ] -,[ [0.7639,0.1046], [0.7252,0.07432] ] -,[ [0.7688,0.1223], [0.7252,0.1006] ] -,[ [0.7722,0.1399], [0.7252,0.1255] ] -,[ [0.7755,0.159], [0.7252,0.1505] ] -,[ [0.7804,0.1767], [0.7252,0.1755] ] -,[ [0.7854,0.1958], [0.7252,0.1995] ] -,[ [0.7903,0.2163], [0.7252,0.2246] ] -,[ [0.7953,0.2369], [0.7252,0.2497] ] -,[ [0.8003,0.259], [0.7252,0.2748] ] -,[ [0.8036,0.2825], [0.7252,0.3] ] -,[ [0.8085,0.3075], [0.7252,0.3252] ] -,[ [0.8118,0.3325], [0.7252,0.3496] ] -,[ [0.8151,0.3591], [0.7252,0.3751] ] -,[ [0.8168,0.3861], [0.7252,0.4] ] -,[ [0.8201,0.4139], [0.7252,0.425] ] -,[ [0.8218,0.4422], [0.7252,0.45] ] -,[ [0.8218,0.471], [0.7252,0.475] ] -,[ [0.8234,0.5], [0.7252,0.5] ] -,[ [0.8218,0.529], [0.7252,0.525] ] -,[ [0.8218,0.5578], [0.7252,0.55] ] -,[ [0.8201,0.5861], [0.7252,0.575] ] -,[ [0.8168,0.6139], [0.7252,0.6] ] -,[ [0.8151,0.6409], [0.7252,0.6249] ] -,[ [0.8118,0.6675], [0.7252,0.6504] ] -,[ [0.8085,0.6925], [0.7252,0.6748] ] -,[ [0.8036,0.7175], [0.7252,0.7] ] -,[ [0.8003,0.741], [0.7252,0.7252] ] -,[ [0.7953,0.7631], [0.7252,0.7503] ] -,[ [0.7903,0.7837], [0.7252,0.7754] ] -,[ [0.7854,0.8042], [0.7252,0.8005] ] -,[ [0.7804,0.8233], [0.7252,0.8245] ] -,[ [0.7755,0.841], [0.7252,0.8495] ] -,[ [0.7722,0.8601], [0.7252,0.8745] ] -,[ [0.7688,0.8777], [0.7252,0.8994] ] -,[ [0.7639,0.8954], [0.7252,0.9257] ] -,[ [0.7606,0.9115], [0.7252,0.9503] ] -,[ [0.7556,0.9262], [0.7252,0.9745] ] -,[ [0.749,0.9365], [0.7252,1] ] -,[ [0.7688,0.07378], [0.7503,0] ] -,[ [0.7788,0.07966], [0.7503,0.02551] ] -,[ [0.7837,0.09289], [0.7503,0.04974] ] -,[ [0.7887,0.1091], [0.7503,0.07432] ] -,[ [0.792,0.1252], [0.7503,0.1006] ] -,[ [0.797,0.1443], [0.7503,0.1255] ] -,[ [0.8003,0.162], [0.7503,0.1505] ] -,[ [0.8052,0.1811], [0.7503,0.1755] ] -,[ [0.8102,0.2002], [0.7503,0.1995] ] -,[ [0.8151,0.2208], [0.7503,0.2246] ] -,[ [0.8201,0.2413], [0.7503,0.2497] ] -,[ [0.8251,0.2634], [0.7503,0.2748] ] -,[ [0.83,0.2869], [0.7503,0.3] ] -,[ [0.8333,0.3104], [0.7503,0.3252] ] -,[ [0.8366,0.3354], [0.7503,0.3496] ] -,[ [0.8399,0.3616], [0.7503,0.3751] ] -,[ [0.8433,0.3883], [0.7503,0.4] ] -,[ [0.8449,0.4156], [0.7503,0.425] ] -,[ [0.8466,0.4434], [0.7503,0.45] ] -,[ [0.8482,0.4716], [0.7503,0.475] ] -,[ [0.8482,0.5], [0.7503,0.5] ] -,[ [0.8482,0.5284], [0.7503,0.525] ] -,[ [0.8466,0.5566], [0.7503,0.55] ] -,[ [0.8449,0.5844], [0.7503,0.575] ] -,[ [0.8433,0.6117], [0.7503,0.6] ] -,[ [0.8399,0.6384], [0.7503,0.6249] ] -,[ [0.8366,0.6646], [0.7503,0.6504] ] -,[ [0.8333,0.6896], [0.7503,0.6748] ] -,[ [0.83,0.7131], [0.7503,0.7] ] -,[ [0.8251,0.7366], [0.7503,0.7252] ] -,[ [0.8201,0.7587], [0.7503,0.7503] ] -,[ [0.8151,0.7792], [0.7503,0.7754] ] -,[ [0.8102,0.7998], [0.7503,0.8005] ] -,[ [0.8052,0.8189], [0.7503,0.8245] ] -,[ [0.8003,0.838], [0.7503,0.8495] ] -,[ [0.797,0.8557], [0.7503,0.8745] ] -,[ [0.792,0.8748], [0.7503,0.8994] ] -,[ [0.7887,0.8909], [0.7503,0.9257] ] -,[ [0.8102,0.112], [0.7754,0.07432] ] -,[ [0.8151,0.1296], [0.7754,0.1006] ] -,[ [0.8201,0.1473], [0.7754,0.1255] ] -,[ [0.8234,0.1664], [0.7754,0.1505] ] -,[ [0.8284,0.1855], [0.7754,0.1755] ] -,[ [0.8333,0.2046], [0.7754,0.1995] ] -,[ [0.8383,0.2252], [0.7754,0.2246] ] -,[ [0.8433,0.2457], [0.7754,0.2497] ] -,[ [0.8482,0.2678], [0.7754,0.2748] ] -,[ [0.8532,0.2898], [0.7754,0.3] ] -,[ [0.8581,0.3148], [0.7754,0.3252] ] -,[ [0.8614,0.3383], [0.7754,0.3496] ] -,[ [0.8647,0.3642], [0.7754,0.3751] ] -,[ [0.8681,0.3905], [0.7754,0.4] ] -,[ [0.8697,0.4173], [0.7754,0.425] ] -,[ [0.8714,0.4446], [0.7754,0.45] ] -,[ [0.873,0.4722], [0.7754,0.475] ] -,[ [0.873,0.5], [0.7754,0.5] ] -,[ [0.873,0.5278], [0.7754,0.525] ] -,[ [0.8714,0.5554], [0.7754,0.55] ] -,[ [0.8697,0.5827], [0.7754,0.575] ] -,[ [0.8681,0.6095], [0.7754,0.6] ] -,[ [0.8647,0.6358], [0.7754,0.6249] ] -,[ [0.8614,0.6617], [0.7754,0.6504] ] -,[ [0.8581,0.6852], [0.7754,0.6748] ] -,[ [0.8532,0.7102], [0.7754,0.7] ] -,[ [0.8482,0.7322], [0.7754,0.7252] ] -,[ [0.8433,0.7543], [0.7754,0.7503] ] -,[ [0.8383,0.7748], [0.7754,0.7754] ] -,[ [0.8333,0.7954], [0.7754,0.8005] ] -,[ [0.8284,0.8145], [0.7754,0.8245] ] -,[ [0.8234,0.8336], [0.7754,0.8495] ] -,[ [0.8201,0.8527], [0.7754,0.8745] ] -,[ [0.8151,0.8704], [0.7754,0.8994] ] -,[ [0.8102,0.888], [0.7754,0.9257] ] -,[ [0.8333,0.1164], [0.8005,0.07432] ] -,[ [0.8383,0.134], [0.8005,0.1006] ] -,[ [0.8433,0.1517], [0.8005,0.1255] ] -,[ [0.8466,0.1693], [0.8005,0.1505] ] -,[ [0.8515,0.1899], [0.8005,0.1755] ] -,[ [0.8565,0.209], [0.8005,0.1995] ] -,[ [0.8614,0.2296], [0.8005,0.2246] ] -,[ [0.8664,0.2501], [0.8005,0.2497] ] -,[ [0.8714,0.2722], [0.8005,0.2748] ] -,[ [0.8763,0.2942], [0.8005,0.3] ] -,[ [0.8796,0.3178], [0.8005,0.3252] ] -,[ [0.8846,0.3427], [0.8005,0.3496] ] -,[ [0.8879,0.3671], [0.8005,0.3751] ] -,[ [0.8912,0.3929], [0.8005,0.4] ] -,[ [0.8929,0.419], [0.8005,0.425] ] -,[ [0.8945,0.4458], [0.8005,0.45] ] -,[ [0.8962,0.4728], [0.8005,0.475] ] -,[ [0.8962,0.5], [0.8005,0.5] ] -,[ [0.8962,0.5272], [0.8005,0.525] ] -,[ [0.8945,0.5542], [0.8005,0.55] ] -,[ [0.8929,0.581], [0.8005,0.575] ] -,[ [0.8912,0.6071], [0.8005,0.6] ] -,[ [0.8879,0.6329], [0.8005,0.6249] ] -,[ [0.8846,0.6573], [0.8005,0.6504] ] -,[ [0.8796,0.6822], [0.8005,0.6748] ] -,[ [0.8763,0.7058], [0.8005,0.7] ] -,[ [0.8714,0.7278], [0.8005,0.7252] ] -,[ [0.8664,0.7499], [0.8005,0.7503] ] -,[ [0.8614,0.7704], [0.8005,0.7754] ] -,[ [0.8565,0.791], [0.8005,0.8005] ] -,[ [0.8515,0.8101], [0.8005,0.8245] ] -,[ [0.8466,0.8307], [0.8005,0.8495] ] -,[ [0.8433,0.8483], [0.8005,0.8745] ] -,[ [0.8383,0.866], [0.8005,0.8994] ] -,[ [0.8333,0.8836], [0.8005,0.9257] ] -,[ [0.8598,0.1384], [0.8245,0.1006] ] -,[ [0.8647,0.1561], [0.8245,0.1255] ] -,[ [0.8697,0.1737], [0.8245,0.1505] ] -,[ [0.8747,0.1928], [0.8245,0.1755] ] -,[ [0.878,0.2134], [0.8245,0.1995] ] -,[ [0.8829,0.234], [0.8245,0.2246] ] -,[ [0.8879,0.2546], [0.8245,0.2497] ] -,[ [0.8929,0.2766], [0.8245,0.2748] ] -,[ [0.8978,0.2986], [0.8245,0.3] ] -,[ [0.9011,0.3222], [0.8245,0.3252] ] -,[ [0.9061,0.3457], [0.8245,0.3496] ] -,[ [0.9094,0.3701], [0.8245,0.3751] ] -,[ [0.9127,0.3952], [0.8245,0.4] ] -,[ [0.9144,0.4209], [0.8245,0.425] ] -,[ [0.916,0.4471], [0.8245,0.45] ] -,[ [0.9177,0.4734], [0.8245,0.475] ] -,[ [0.9177,0.5], [0.8245,0.5] ] -,[ [0.9177,0.5266], [0.8245,0.525] ] -,[ [0.916,0.5529], [0.8245,0.55] ] -,[ [0.9144,0.5791], [0.8245,0.575] ] -,[ [0.9127,0.6048], [0.8245,0.6] ] -,[ [0.9094,0.6299], [0.8245,0.6249] ] -,[ [0.9061,0.6543], [0.8245,0.6504] ] -,[ [0.9011,0.6778], [0.8245,0.6748] ] -,[ [0.8978,0.7014], [0.8245,0.7] ] -,[ [0.8929,0.7234], [0.8245,0.7252] ] -,[ [0.8879,0.7454], [0.8245,0.7503] ] -,[ [0.8829,0.766], [0.8245,0.7754] ] -,[ [0.878,0.7866], [0.8245,0.8005] ] -,[ [0.8747,0.8072], [0.8245,0.8245] ] -,[ [0.8697,0.8263], [0.8245,0.8495] ] -,[ [0.8647,0.8439], [0.8245,0.8745] ] -,[ [0.8598,0.8616], [0.8245,0.8994] ] -,[ [0.8862,0.1605], [0.8495,0.1255] ] -,[ [0.8912,0.1781], [0.8495,0.1505] ] -,[ [0.8962,0.1972], [0.8495,0.1755] ] -,[ [0.9011,0.2178], [0.8495,0.1995] ] -,[ [0.9044,0.2384], [0.8495,0.2246] ] -,[ [0.9094,0.259], [0.8495,0.2497] ] -,[ [0.9127,0.281], [0.8495,0.2748] ] -,[ [0.9177,0.3031], [0.8495,0.3] ] -,[ [0.921,0.3251], [0.8495,0.3252] ] -,[ [0.9259,0.3486], [0.8495,0.3496] ] -,[ [0.9292,0.373], [0.8495,0.3751] ] -,[ [0.9325,0.3977], [0.8495,0.4] ] -,[ [0.9342,0.4228], [0.8495,0.425] ] -,[ [0.9358,0.4483], [0.8495,0.45] ] -,[ [0.9375,0.4741], [0.8495,0.475] ] -,[ [0.9375,0.5], [0.8495,0.5] ] -,[ [0.9375,0.5259], [0.8495,0.525] ] -,[ [0.9358,0.5517], [0.8495,0.55] ] -,[ [0.9342,0.5772], [0.8495,0.575] ] -,[ [0.9325,0.6023], [0.8495,0.6] ] -,[ [0.9292,0.627], [0.8495,0.6249] ] -,[ [0.9259,0.6514], [0.8495,0.6504] ] -,[ [0.921,0.6749], [0.8495,0.6748] ] -,[ [0.9177,0.6969], [0.8495,0.7] ] -,[ [0.9127,0.719], [0.8495,0.7252] ] -,[ [0.9094,0.741], [0.8495,0.7503] ] -,[ [0.9044,0.7616], [0.8495,0.7754] ] -,[ [0.9011,0.7822], [0.8495,0.8005] ] -,[ [0.8962,0.8028], [0.8495,0.8245] ] -,[ [0.8912,0.8219], [0.8495,0.8495] ] -,[ [0.8862,0.8395], [0.8495,0.8745] ] -,[ [0.9044,0.1664], [0.8745,0.1255] ] -,[ [0.911,0.1825], [0.8745,0.1505] ] -,[ [0.916,0.2016], [0.8745,0.1755] ] -,[ [0.921,0.2208], [0.8745,0.1995] ] -,[ [0.9259,0.2413], [0.8745,0.2246] ] -,[ [0.9292,0.2619], [0.8745,0.2497] ] -,[ [0.9342,0.284], [0.8745,0.2748] ] -,[ [0.9375,0.306], [0.8745,0.3] ] -,[ [0.9408,0.3295], [0.8745,0.3252] ] -,[ [0.9458,0.3516], [0.8745,0.3496] ] -,[ [0.9491,0.3758], [0.8745,0.3751] ] -,[ [0.9507,0.3999], [0.8745,0.4] ] -,[ [0.954,0.4246], [0.8745,0.425] ] -,[ [0.9557,0.4496], [0.8745,0.45] ] -,[ [0.9557,0.4747], [0.8745,0.475] ] -,[ [0.9557,0.5], [0.8745,0.5] ] -,[ [0.9557,0.5253], [0.8745,0.525] ] -,[ [0.9557,0.5504], [0.8745,0.55] ] -,[ [0.954,0.5754], [0.8745,0.575] ] -,[ [0.9507,0.6001], [0.8745,0.6] ] -,[ [0.9491,0.6242], [0.8745,0.6249] ] -,[ [0.9458,0.6484], [0.8745,0.6504] ] -,[ [0.9408,0.6705], [0.8745,0.6748] ] -,[ [0.9375,0.694], [0.8745,0.7] ] -,[ [0.9342,0.716], [0.8745,0.7252] ] -,[ [0.9292,0.7381], [0.8745,0.7503] ] -,[ [0.9259,0.7587], [0.8745,0.7754] ] -,[ [0.921,0.7792], [0.8745,0.8005] ] -,[ [0.916,0.7984], [0.8745,0.8245] ] -,[ [0.911,0.8175], [0.8745,0.8495] ] -,[ [0.9044,0.8336], [0.8745,0.8745] ] -,[ [0.9276,0.1899], [0.8994,0.1505] ] -,[ [0.9358,0.2061], [0.8994,0.1755] ] -,[ [0.9408,0.2252], [0.8994,0.1995] ] -,[ [0.9458,0.2457], [0.8994,0.2246] ] -,[ [0.9507,0.2663], [0.8994,0.2497] ] -,[ [0.954,0.2869], [0.8994,0.2748] ] -,[ [0.9573,0.3089], [0.8994,0.3] ] -,[ [0.9606,0.3325], [0.8994,0.3252] ] -,[ [0.964,0.3549], [0.8994,0.3496] ] -,[ [0.9673,0.3783], [0.8994,0.3751] ] -,[ [0.9689,0.4021], [0.8994,0.4] ] -,[ [0.9722,0.4262], [0.8994,0.425] ] -,[ [0.9739,0.4506], [0.8994,0.45] ] -,[ [0.9739,0.4753], [0.8994,0.475] ] -,[ [0.9739,0.5], [0.8994,0.5] ] -,[ [0.9739,0.5247], [0.8994,0.525] ] -,[ [0.9739,0.5494], [0.8994,0.55] ] -,[ [0.9722,0.5738], [0.8994,0.575] ] -,[ [0.9689,0.5979], [0.8994,0.6] ] -,[ [0.9673,0.6217], [0.8994,0.6249] ] -,[ [0.964,0.6451], [0.8994,0.6504] ] -,[ [0.9606,0.6675], [0.8994,0.6748] ] -,[ [0.9573,0.6911], [0.8994,0.7] ] -,[ [0.954,0.7131], [0.8994,0.7252] ] -,[ [0.9507,0.7337], [0.8994,0.7503] ] -,[ [0.9458,0.7543], [0.8994,0.7754] ] -,[ [0.9408,0.7748], [0.8994,0.8005] ] -,[ [0.9358,0.7939], [0.8994,0.8245] ] -,[ [0.9276,0.8101], [0.8994,0.8495] ] -,[ [0.959,0.2296], [0.9257,0.1995] ] -,[ [0.964,0.2501], [0.9257,0.2246] ] -,[ [0.9689,0.2693], [0.9257,0.2497] ] -,[ [0.9739,0.2913], [0.9257,0.2748] ] -,[ [0.9772,0.3133], [0.9257,0.3] ] -,[ [0.9805,0.3354], [0.9257,0.3252] ] -,[ [0.9838,0.3576], [0.9257,0.3496] ] -,[ [0.9854,0.3805], [0.9257,0.3751] ] -,[ [0.9888,0.404], [0.9257,0.4] ] -,[ [0.9904,0.4277], [0.9257,0.425] ] -,[ [0.9904,0.4516], [0.9257,0.45] ] -,[ [0.9921,0.4757], [0.9257,0.475] ] -,[ [0.9921,0.5], [0.9257,0.5] ] -,[ [0.9921,0.5243], [0.9257,0.525] ] -,[ [0.9904,0.5484], [0.9257,0.55] ] -,[ [0.9904,0.5723], [0.9257,0.575] ] -,[ [0.9888,0.596], [0.9257,0.6] ] -,[ [0.9854,0.6195], [0.9257,0.6249] ] -,[ [0.9838,0.6424], [0.9257,0.6504] ] -,[ [0.9805,0.6646], [0.9257,0.6748] ] -,[ [0.9772,0.6867], [0.9257,0.7] ] -,[ [0.9739,0.7087], [0.9257,0.7252] ] -,[ [0.9689,0.7307], [0.9257,0.7503] ] -,[ [0.964,0.7499], [0.9257,0.7754] ] -,[ [0.959,0.7704], [0.9257,0.8005] ] -,[ [0.9805,0.2546], [0.9503,0.2246] ] -,[ [0.9871,0.2737], [0.9503,0.2497] ] -,[ [0.9921,0.2942], [0.9503,0.2748] ] -,[ [0.9954,0.3163], [0.9503,0.3] ] -,[ [0.9987,0.3383], [0.9503,0.3252] ] -,[ [1.002,0.3599], [0.9503,0.3496] ] -,[ [1.004,0.3827], [0.9503,0.3751] ] -,[ [1.007,0.4058], [0.9503,0.4] ] -,[ [1.009,0.429], [0.9503,0.425] ] -,[ [1.009,0.4525], [0.9503,0.45] ] -,[ [1.01,0.4762], [0.9503,0.475] ] -,[ [1.01,0.5], [0.9503,0.5] ] -,[ [1.01,0.5238], [0.9503,0.525] ] -,[ [1.009,0.5475], [0.9503,0.55] ] -,[ [1.009,0.571], [0.9503,0.575] ] -,[ [1.007,0.5942], [0.9503,0.6] ] -,[ [1.004,0.6173], [0.9503,0.6249] ] -,[ [1.002,0.6401], [0.9503,0.6504] ] -,[ [0.9987,0.6617], [0.9503,0.6748] ] -,[ [0.9954,0.6837], [0.9503,0.7] ] -,[ [0.9921,0.7058], [0.9503,0.7252] ] -,[ [0.9871,0.7263], [0.9503,0.7503] ] -,[ [0.9805,0.7454], [0.9503,0.7754] ] -,[ [1.007,0.2986], [0.9745,0.2748] ] -,[ [1.012,0.3192], [0.9745,0.3] ] -,[ [1.015,0.3413], [0.9745,0.3252] ] -,[ [1.019,0.3624], [0.9745,0.3496] ] -,[ [1.022,0.3848], [0.9745,0.3751] ] -,[ [1.023,0.4074], [0.9745,0.4] ] -,[ [1.025,0.4303], [0.9745,0.425] ] -,[ [1.027,0.4534], [0.9745,0.45] ] -,[ [1.027,0.4766], [0.9745,0.475] ] -,[ [1.028,0.5], [0.9745,0.5] ] -,[ [1.027,0.5234], [0.9745,0.525] ] -,[ [1.027,0.5466], [0.9745,0.55] ] -,[ [1.025,0.5697], [0.9745,0.575] ] -,[ [1.023,0.5926], [0.9745,0.6] ] -,[ [1.022,0.6152], [0.9745,0.6249] ] -,[ [1.019,0.6376], [0.9745,0.6504] ] -,[ [1.015,0.6587], [0.9745,0.6748] ] -,[ [1.012,0.6808], [0.9745,0.7] ] -,[ [1.007,0.7014], [0.9745,0.7252] ] -,[ [1.022,0.3251], [1,0.3] ] -,[ [1.028,0.3442], [1,0.3252] ] -,[ [1.033,0.3654], [1,0.3496] ] -,[ [1.037,0.3871], [1,0.3751] ] -,[ [1.04,0.4092], [1,0.4] ] -,[ [1.042,0.4317], [1,0.425] ] -,[ [1.043,0.4543], [1,0.45] ] -,[ [1.043,0.4771], [1,0.475] ] -,[ [1.043,0.5], [1,0.5] ] -,[ [1.043,0.5229], [1,0.525] ] -,[ [1.043,0.5457], [1,0.55] ] -,[ [1.042,0.5683], [1,0.575] ] -,[ [1.04,0.5908], [1,0.6] ] -,[ [1.037,0.6129], [1,0.6249] ] -,[ [1.033,0.6346], [1,0.6504] ] -,[ [1.028,0.6558], [1,0.6748] ] -,[ [1.022,0.6749], [1,0.7] ] -] - ] - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "display": { + "hmd": { + "field_of_view": { + "monocular_horizontal": 92, + "monocular_vertical": 92, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "distortion": { + "type": "mono_point_samples", + "mono_point_samples": [ +[ + [ [0.9636,0.3251], [1,0.3] ] +,[ [0.9702,0.3442], [1,0.3252] ] +,[ [0.9752,0.3654], [1,0.3496] ] +,[ [0.9785,0.3871], [1,0.3751] ] +,[ [0.9818,0.4092], [1,0.4] ] +,[ [0.9835,0.4317], [1,0.425] ] +,[ [0.9851,0.4543], [1,0.45] ] +,[ [0.9851,0.4771], [1,0.475] ] +,[ [0.9851,0.5], [1,0.5] ] +,[ [0.9851,0.5229], [1,0.525] ] +,[ [0.9851,0.5457], [1,0.55] ] +,[ [0.9835,0.5683], [1,0.575] ] +,[ [0.9818,0.5908], [1,0.6] ] +,[ [0.9785,0.6129], [1,0.6249] ] +,[ [0.9752,0.6346], [1,0.6504] ] +,[ [0.9702,0.6558], [1,0.6748] ] +,[ [0.9636,0.6749], [1,0.7] ] +,[ [0.9487,0.2986], [0.9745,0.2748] ] +,[ [0.9537,0.3192], [0.9745,0.3] ] +,[ [0.957,0.3413], [0.9745,0.3252] ] +,[ [0.9603,0.3624], [0.9745,0.3496] ] +,[ [0.9636,0.3848], [0.9745,0.3751] ] +,[ [0.9653,0.4074], [0.9745,0.4] ] +,[ [0.9669,0.4303], [0.9745,0.425] ] +,[ [0.9686,0.4534], [0.9745,0.45] ] +,[ [0.9686,0.4766], [0.9745,0.475] ] +,[ [0.9702,0.5], [0.9745,0.5] ] +,[ [0.9686,0.5234], [0.9745,0.525] ] +,[ [0.9686,0.5466], [0.9745,0.55] ] +,[ [0.9669,0.5697], [0.9745,0.575] ] +,[ [0.9653,0.5926], [0.9745,0.6] ] +,[ [0.9636,0.6152], [0.9745,0.6249] ] +,[ [0.9603,0.6376], [0.9745,0.6504] ] +,[ [0.957,0.6587], [0.9745,0.6748] ] +,[ [0.9537,0.6808], [0.9745,0.7] ] +,[ [0.9487,0.7014], [0.9745,0.7252] ] +,[ [0.9223,0.2546], [0.9503,0.2246] ] +,[ [0.9289,0.2737], [0.9503,0.2497] ] +,[ [0.9339,0.2942], [0.9503,0.2748] ] +,[ [0.9372,0.3163], [0.9503,0.3] ] +,[ [0.9405,0.3383], [0.9503,0.3252] ] +,[ [0.9438,0.3599], [0.9503,0.3496] ] +,[ [0.9454,0.3827], [0.9503,0.3751] ] +,[ [0.9487,0.4058], [0.9503,0.4] ] +,[ [0.9504,0.429], [0.9503,0.425] ] +,[ [0.9504,0.4525], [0.9503,0.45] ] +,[ [0.9521,0.4762], [0.9503,0.475] ] +,[ [0.9521,0.5], [0.9503,0.5] ] +,[ [0.9521,0.5238], [0.9503,0.525] ] +,[ [0.9504,0.5475], [0.9503,0.55] ] +,[ [0.9504,0.571], [0.9503,0.575] ] +,[ [0.9487,0.5942], [0.9503,0.6] ] +,[ [0.9454,0.6173], [0.9503,0.6249] ] +,[ [0.9438,0.6401], [0.9503,0.6504] ] +,[ [0.9405,0.6617], [0.9503,0.6748] ] +,[ [0.9372,0.6837], [0.9503,0.7] ] +,[ [0.9339,0.7058], [0.9503,0.7252] ] +,[ [0.9289,0.7263], [0.9503,0.7503] ] +,[ [0.9223,0.7454], [0.9503,0.7754] ] +,[ [0.9008,0.2296], [0.9257,0.1995] ] +,[ [0.9058,0.2501], [0.9257,0.2246] ] +,[ [0.9107,0.2693], [0.9257,0.2497] ] +,[ [0.9157,0.2913], [0.9257,0.2748] ] +,[ [0.919,0.3133], [0.9257,0.3] ] +,[ [0.9223,0.3354], [0.9257,0.3252] ] +,[ [0.9256,0.3576], [0.9257,0.3496] ] +,[ [0.9272,0.3805], [0.9257,0.3751] ] +,[ [0.9306,0.404], [0.9257,0.4] ] +,[ [0.9322,0.4277], [0.9257,0.425] ] +,[ [0.9322,0.4516], [0.9257,0.45] ] +,[ [0.9339,0.4757], [0.9257,0.475] ] +,[ [0.9339,0.5], [0.9257,0.5] ] +,[ [0.9339,0.5243], [0.9257,0.525] ] +,[ [0.9322,0.5484], [0.9257,0.55] ] +,[ [0.9322,0.5723], [0.9257,0.575] ] +,[ [0.9306,0.596], [0.9257,0.6] ] +,[ [0.9272,0.6195], [0.9257,0.6249] ] +,[ [0.9256,0.6424], [0.9257,0.6504] ] +,[ [0.9223,0.6646], [0.9257,0.6748] ] +,[ [0.919,0.6867], [0.9257,0.7] ] +,[ [0.9157,0.7087], [0.9257,0.7252] ] +,[ [0.9107,0.7307], [0.9257,0.7503] ] +,[ [0.9058,0.7499], [0.9257,0.7754] ] +,[ [0.9008,0.7704], [0.9257,0.8005] ] +,[ [0.8694,0.1899], [0.8994,0.1505] ] +,[ [0.8776,0.2061], [0.8994,0.1755] ] +,[ [0.8826,0.2252], [0.8994,0.1995] ] +,[ [0.8876,0.2457], [0.8994,0.2246] ] +,[ [0.8925,0.2663], [0.8994,0.2497] ] +,[ [0.8958,0.2869], [0.8994,0.2748] ] +,[ [0.8991,0.3089], [0.8994,0.3] ] +,[ [0.9024,0.3325], [0.8994,0.3252] ] +,[ [0.9058,0.3549], [0.8994,0.3496] ] +,[ [0.9091,0.3783], [0.8994,0.3751] ] +,[ [0.9107,0.4021], [0.8994,0.4] ] +,[ [0.914,0.4262], [0.8994,0.425] ] +,[ [0.9157,0.4506], [0.8994,0.45] ] +,[ [0.9157,0.4753], [0.8994,0.475] ] +,[ [0.9157,0.5], [0.8994,0.5] ] +,[ [0.9157,0.5247], [0.8994,0.525] ] +,[ [0.9157,0.5494], [0.8994,0.55] ] +,[ [0.914,0.5738], [0.8994,0.575] ] +,[ [0.9107,0.5979], [0.8994,0.6] ] +,[ [0.9091,0.6217], [0.8994,0.6249] ] +,[ [0.9058,0.6451], [0.8994,0.6504] ] +,[ [0.9024,0.6675], [0.8994,0.6748] ] +,[ [0.8991,0.6911], [0.8994,0.7] ] +,[ [0.8958,0.7131], [0.8994,0.7252] ] +,[ [0.8925,0.7337], [0.8994,0.7503] ] +,[ [0.8876,0.7543], [0.8994,0.7754] ] +,[ [0.8826,0.7748], [0.8994,0.8005] ] +,[ [0.8776,0.7939], [0.8994,0.8245] ] +,[ [0.8694,0.8101], [0.8994,0.8495] ] +,[ [0.8462,0.1664], [0.8745,0.1255] ] +,[ [0.8528,0.1825], [0.8745,0.1505] ] +,[ [0.8578,0.2016], [0.8745,0.1755] ] +,[ [0.8628,0.2208], [0.8745,0.1995] ] +,[ [0.8677,0.2413], [0.8745,0.2246] ] +,[ [0.871,0.2619], [0.8745,0.2497] ] +,[ [0.876,0.284], [0.8745,0.2748] ] +,[ [0.8793,0.306], [0.8745,0.3] ] +,[ [0.8826,0.3295], [0.8745,0.3252] ] +,[ [0.8876,0.3516], [0.8745,0.3496] ] +,[ [0.8909,0.3758], [0.8745,0.3751] ] +,[ [0.8925,0.3999], [0.8745,0.4] ] +,[ [0.8958,0.4246], [0.8745,0.425] ] +,[ [0.8975,0.4496], [0.8745,0.45] ] +,[ [0.8975,0.4747], [0.8745,0.475] ] +,[ [0.8975,0.5], [0.8745,0.5] ] +,[ [0.8975,0.5253], [0.8745,0.525] ] +,[ [0.8975,0.5504], [0.8745,0.55] ] +,[ [0.8958,0.5754], [0.8745,0.575] ] +,[ [0.8925,0.6001], [0.8745,0.6] ] +,[ [0.8909,0.6242], [0.8745,0.6249] ] +,[ [0.8876,0.6484], [0.8745,0.6504] ] +,[ [0.8826,0.6705], [0.8745,0.6748] ] +,[ [0.8793,0.694], [0.8745,0.7] ] +,[ [0.876,0.716], [0.8745,0.7252] ] +,[ [0.871,0.7381], [0.8745,0.7503] ] +,[ [0.8677,0.7587], [0.8745,0.7754] ] +,[ [0.8628,0.7792], [0.8745,0.8005] ] +,[ [0.8578,0.7984], [0.8745,0.8245] ] +,[ [0.8528,0.8175], [0.8745,0.8495] ] +,[ [0.8462,0.8336], [0.8745,0.8745] ] +,[ [0.828,0.1605], [0.8495,0.1255] ] +,[ [0.833,0.1781], [0.8495,0.1505] ] +,[ [0.838,0.1972], [0.8495,0.1755] ] +,[ [0.8429,0.2178], [0.8495,0.1995] ] +,[ [0.8462,0.2384], [0.8495,0.2246] ] +,[ [0.8512,0.259], [0.8495,0.2497] ] +,[ [0.8545,0.281], [0.8495,0.2748] ] +,[ [0.8595,0.3031], [0.8495,0.3] ] +,[ [0.8628,0.3251], [0.8495,0.3252] ] +,[ [0.8677,0.3486], [0.8495,0.3496] ] +,[ [0.871,0.373], [0.8495,0.3751] ] +,[ [0.8743,0.3977], [0.8495,0.4] ] +,[ [0.876,0.4228], [0.8495,0.425] ] +,[ [0.8776,0.4483], [0.8495,0.45] ] +,[ [0.8793,0.4741], [0.8495,0.475] ] +,[ [0.8793,0.5], [0.8495,0.5] ] +,[ [0.8793,0.5259], [0.8495,0.525] ] +,[ [0.8776,0.5517], [0.8495,0.55] ] +,[ [0.876,0.5772], [0.8495,0.575] ] +,[ [0.8743,0.6023], [0.8495,0.6] ] +,[ [0.871,0.627], [0.8495,0.6249] ] +,[ [0.8677,0.6514], [0.8495,0.6504] ] +,[ [0.8628,0.6749], [0.8495,0.6748] ] +,[ [0.8595,0.6969], [0.8495,0.7] ] +,[ [0.8545,0.719], [0.8495,0.7252] ] +,[ [0.8512,0.741], [0.8495,0.7503] ] +,[ [0.8462,0.7616], [0.8495,0.7754] ] +,[ [0.8429,0.7822], [0.8495,0.8005] ] +,[ [0.838,0.8028], [0.8495,0.8245] ] +,[ [0.833,0.8219], [0.8495,0.8495] ] +,[ [0.828,0.8395], [0.8495,0.8745] ] +,[ [0.8016,0.1384], [0.8245,0.1006] ] +,[ [0.8065,0.1561], [0.8245,0.1255] ] +,[ [0.8115,0.1737], [0.8245,0.1505] ] +,[ [0.8165,0.1928], [0.8245,0.1755] ] +,[ [0.8198,0.2134], [0.8245,0.1995] ] +,[ [0.8247,0.234], [0.8245,0.2246] ] +,[ [0.8297,0.2546], [0.8245,0.2497] ] +,[ [0.8347,0.2766], [0.8245,0.2748] ] +,[ [0.8396,0.2986], [0.8245,0.3] ] +,[ [0.8429,0.3222], [0.8245,0.3252] ] +,[ [0.8479,0.3457], [0.8245,0.3496] ] +,[ [0.8512,0.3701], [0.8245,0.3751] ] +,[ [0.8545,0.3952], [0.8245,0.4] ] +,[ [0.8562,0.4209], [0.8245,0.425] ] +,[ [0.8578,0.4471], [0.8245,0.45] ] +,[ [0.8595,0.4734], [0.8245,0.475] ] +,[ [0.8595,0.5], [0.8245,0.5] ] +,[ [0.8595,0.5266], [0.8245,0.525] ] +,[ [0.8578,0.5529], [0.8245,0.55] ] +,[ [0.8562,0.5791], [0.8245,0.575] ] +,[ [0.8545,0.6048], [0.8245,0.6] ] +,[ [0.8512,0.6299], [0.8245,0.6249] ] +,[ [0.8479,0.6543], [0.8245,0.6504] ] +,[ [0.8429,0.6778], [0.8245,0.6748] ] +,[ [0.8396,0.7014], [0.8245,0.7] ] +,[ [0.8347,0.7234], [0.8245,0.7252] ] +,[ [0.8297,0.7454], [0.8245,0.7503] ] +,[ [0.8247,0.766], [0.8245,0.7754] ] +,[ [0.8198,0.7866], [0.8245,0.8005] ] +,[ [0.8165,0.8072], [0.8245,0.8245] ] +,[ [0.8115,0.8263], [0.8245,0.8495] ] +,[ [0.8065,0.8439], [0.8245,0.8745] ] +,[ [0.8016,0.8616], [0.8245,0.8994] ] +,[ [0.7751,0.1164], [0.8005,0.07432] ] +,[ [0.7801,0.134], [0.8005,0.1006] ] +,[ [0.7851,0.1517], [0.8005,0.1255] ] +,[ [0.7884,0.1693], [0.8005,0.1505] ] +,[ [0.7933,0.1899], [0.8005,0.1755] ] +,[ [0.7983,0.209], [0.8005,0.1995] ] +,[ [0.8032,0.2296], [0.8005,0.2246] ] +,[ [0.8082,0.2501], [0.8005,0.2497] ] +,[ [0.8132,0.2722], [0.8005,0.2748] ] +,[ [0.8181,0.2942], [0.8005,0.3] ] +,[ [0.8214,0.3178], [0.8005,0.3252] ] +,[ [0.8264,0.3427], [0.8005,0.3496] ] +,[ [0.8297,0.3671], [0.8005,0.3751] ] +,[ [0.833,0.3929], [0.8005,0.4] ] +,[ [0.8347,0.419], [0.8005,0.425] ] +,[ [0.8363,0.4458], [0.8005,0.45] ] +,[ [0.838,0.4728], [0.8005,0.475] ] +,[ [0.838,0.5], [0.8005,0.5] ] +,[ [0.838,0.5272], [0.8005,0.525] ] +,[ [0.8363,0.5542], [0.8005,0.55] ] +,[ [0.8347,0.581], [0.8005,0.575] ] +,[ [0.833,0.6071], [0.8005,0.6] ] +,[ [0.8297,0.6329], [0.8005,0.6249] ] +,[ [0.8264,0.6573], [0.8005,0.6504] ] +,[ [0.8214,0.6822], [0.8005,0.6748] ] +,[ [0.8181,0.7058], [0.8005,0.7] ] +,[ [0.8132,0.7278], [0.8005,0.7252] ] +,[ [0.8082,0.7499], [0.8005,0.7503] ] +,[ [0.8032,0.7704], [0.8005,0.7754] ] +,[ [0.7983,0.791], [0.8005,0.8005] ] +,[ [0.7933,0.8101], [0.8005,0.8245] ] +,[ [0.7884,0.8307], [0.8005,0.8495] ] +,[ [0.7851,0.8483], [0.8005,0.8745] ] +,[ [0.7801,0.866], [0.8005,0.8994] ] +,[ [0.7751,0.8836], [0.8005,0.9257] ] +,[ [0.752,0.112], [0.7754,0.07432] ] +,[ [0.7569,0.1296], [0.7754,0.1006] ] +,[ [0.7619,0.1473], [0.7754,0.1255] ] +,[ [0.7652,0.1664], [0.7754,0.1505] ] +,[ [0.7702,0.1855], [0.7754,0.1755] ] +,[ [0.7751,0.2046], [0.7754,0.1995] ] +,[ [0.7801,0.2252], [0.7754,0.2246] ] +,[ [0.7851,0.2457], [0.7754,0.2497] ] +,[ [0.79,0.2678], [0.7754,0.2748] ] +,[ [0.795,0.2898], [0.7754,0.3] ] +,[ [0.7999,0.3148], [0.7754,0.3252] ] +,[ [0.8032,0.3383], [0.7754,0.3496] ] +,[ [0.8065,0.3642], [0.7754,0.3751] ] +,[ [0.8099,0.3905], [0.7754,0.4] ] +,[ [0.8115,0.4173], [0.7754,0.425] ] +,[ [0.8132,0.4446], [0.7754,0.45] ] +,[ [0.8148,0.4722], [0.7754,0.475] ] +,[ [0.8148,0.5], [0.7754,0.5] ] +,[ [0.8148,0.5278], [0.7754,0.525] ] +,[ [0.8132,0.5554], [0.7754,0.55] ] +,[ [0.8115,0.5827], [0.7754,0.575] ] +,[ [0.8099,0.6095], [0.7754,0.6] ] +,[ [0.8065,0.6358], [0.7754,0.6249] ] +,[ [0.8032,0.6617], [0.7754,0.6504] ] +,[ [0.7999,0.6852], [0.7754,0.6748] ] +,[ [0.795,0.7102], [0.7754,0.7] ] +,[ [0.79,0.7322], [0.7754,0.7252] ] +,[ [0.7851,0.7543], [0.7754,0.7503] ] +,[ [0.7801,0.7748], [0.7754,0.7754] ] +,[ [0.7751,0.7954], [0.7754,0.8005] ] +,[ [0.7702,0.8145], [0.7754,0.8245] ] +,[ [0.7652,0.8336], [0.7754,0.8495] ] +,[ [0.7619,0.8527], [0.7754,0.8745] ] +,[ [0.7569,0.8704], [0.7754,0.8994] ] +,[ [0.752,0.888], [0.7754,0.9257] ] +,[ [0.7305,0.1091], [0.7503,0.07432] ] +,[ [0.7338,0.1252], [0.7503,0.1006] ] +,[ [0.7388,0.1443], [0.7503,0.1255] ] +,[ [0.7421,0.162], [0.7503,0.1505] ] +,[ [0.747,0.1811], [0.7503,0.1755] ] +,[ [0.752,0.2002], [0.7503,0.1995] ] +,[ [0.7569,0.2208], [0.7503,0.2246] ] +,[ [0.7619,0.2413], [0.7503,0.2497] ] +,[ [0.7669,0.2634], [0.7503,0.2748] ] +,[ [0.7718,0.2869], [0.7503,0.3] ] +,[ [0.7751,0.3104], [0.7503,0.3252] ] +,[ [0.7784,0.3354], [0.7503,0.3496] ] +,[ [0.7817,0.3616], [0.7503,0.3751] ] +,[ [0.7851,0.3883], [0.7503,0.4] ] +,[ [0.7867,0.4156], [0.7503,0.425] ] +,[ [0.7884,0.4434], [0.7503,0.45] ] +,[ [0.79,0.4716], [0.7503,0.475] ] +,[ [0.79,0.5], [0.7503,0.5] ] +,[ [0.79,0.5284], [0.7503,0.525] ] +,[ [0.7884,0.5566], [0.7503,0.55] ] +,[ [0.7867,0.5844], [0.7503,0.575] ] +,[ [0.7851,0.6117], [0.7503,0.6] ] +,[ [0.7817,0.6384], [0.7503,0.6249] ] +,[ [0.7784,0.6646], [0.7503,0.6504] ] +,[ [0.7751,0.6896], [0.7503,0.6748] ] +,[ [0.7718,0.7131], [0.7503,0.7] ] +,[ [0.7669,0.7366], [0.7503,0.7252] ] +,[ [0.7619,0.7587], [0.7503,0.7503] ] +,[ [0.7569,0.7792], [0.7503,0.7754] ] +,[ [0.752,0.7998], [0.7503,0.8005] ] +,[ [0.747,0.8189], [0.7503,0.8245] ] +,[ [0.7421,0.838], [0.7503,0.8495] ] +,[ [0.7388,0.8557], [0.7503,0.8745] ] +,[ [0.7338,0.8748], [0.7503,0.8994] ] +,[ [0.7305,0.8909], [0.7503,0.9257] ] +,[ [0.7255,0.9071], [0.7503,0.9503] ] +,[ [0.7206,0.9203], [0.7503,0.9745] ] +,[ [0.7106,0.9262], [0.7503,1] ] +,[ [0.6908,0.06349], [0.7252,0] ] +,[ [0.6974,0.07378], [0.7252,0.02551] ] +,[ [0.7024,0.08848], [0.7252,0.04974] ] +,[ [0.7057,0.1046], [0.7252,0.07432] ] +,[ [0.7106,0.1223], [0.7252,0.1006] ] +,[ [0.714,0.1399], [0.7252,0.1255] ] +,[ [0.7173,0.159], [0.7252,0.1505] ] +,[ [0.7222,0.1767], [0.7252,0.1755] ] +,[ [0.7272,0.1958], [0.7252,0.1995] ] +,[ [0.7321,0.2163], [0.7252,0.2246] ] +,[ [0.7371,0.2369], [0.7252,0.2497] ] +,[ [0.7421,0.259], [0.7252,0.2748] ] +,[ [0.7454,0.2825], [0.7252,0.3] ] +,[ [0.7503,0.3075], [0.7252,0.3252] ] +,[ [0.7536,0.3325], [0.7252,0.3496] ] +,[ [0.7569,0.3591], [0.7252,0.3751] ] +,[ [0.7586,0.3861], [0.7252,0.4] ] +,[ [0.7619,0.4139], [0.7252,0.425] ] +,[ [0.7636,0.4422], [0.7252,0.45] ] +,[ [0.7636,0.471], [0.7252,0.475] ] +,[ [0.7652,0.5], [0.7252,0.5] ] +,[ [0.7636,0.529], [0.7252,0.525] ] +,[ [0.7636,0.5578], [0.7252,0.55] ] +,[ [0.7619,0.5861], [0.7252,0.575] ] +,[ [0.7586,0.6139], [0.7252,0.6] ] +,[ [0.7569,0.6409], [0.7252,0.6249] ] +,[ [0.7536,0.6675], [0.7252,0.6504] ] +,[ [0.7503,0.6925], [0.7252,0.6748] ] +,[ [0.7454,0.7175], [0.7252,0.7] ] +,[ [0.7421,0.741], [0.7252,0.7252] ] +,[ [0.7371,0.7631], [0.7252,0.7503] ] +,[ [0.7321,0.7837], [0.7252,0.7754] ] +,[ [0.7272,0.8042], [0.7252,0.8005] ] +,[ [0.7222,0.8233], [0.7252,0.8245] ] +,[ [0.7173,0.841], [0.7252,0.8495] ] +,[ [0.714,0.8601], [0.7252,0.8745] ] +,[ [0.7106,0.8777], [0.7252,0.8994] ] +,[ [0.7057,0.8954], [0.7252,0.9257] ] +,[ [0.7024,0.9115], [0.7252,0.9503] ] +,[ [0.6974,0.9262], [0.7252,0.9745] ] +,[ [0.6908,0.9365], [0.7252,1] ] +,[ [0.6693,0.05761], [0.7,0] ] +,[ [0.6743,0.06937], [0.7,0.02551] ] +,[ [0.6776,0.08554], [0.7,0.04974] ] +,[ [0.6809,0.1017], [0.7,0.07432] ] +,[ [0.6858,0.1193], [0.7,0.1006] ] +,[ [0.6892,0.137], [0.7,0.1255] ] +,[ [0.6925,0.1546], [0.7,0.1505] ] +,[ [0.6974,0.1723], [0.7,0.1755] ] +,[ [0.7024,0.1914], [0.7,0.1995] ] +,[ [0.7073,0.2119], [0.7,0.2246] ] +,[ [0.7106,0.2325], [0.7,0.2497] ] +,[ [0.7156,0.256], [0.7,0.2748] ] +,[ [0.7189,0.2795], [0.7,0.3] ] +,[ [0.7222,0.3045], [0.7,0.3252] ] +,[ [0.7255,0.3295], [0.7,0.3496] ] +,[ [0.7288,0.3564], [0.7,0.3751] ] +,[ [0.7321,0.3839], [0.7,0.4] ] +,[ [0.7354,0.4121], [0.7,0.425] ] +,[ [0.7371,0.4411], [0.7,0.45] ] +,[ [0.7371,0.4703], [0.7,0.475] ] +,[ [0.7371,0.5], [0.7,0.5] ] +,[ [0.7371,0.5297], [0.7,0.525] ] +,[ [0.7371,0.5589], [0.7,0.55] ] +,[ [0.7354,0.5879], [0.7,0.575] ] +,[ [0.7321,0.6161], [0.7,0.6] ] +,[ [0.7288,0.6436], [0.7,0.6249] ] +,[ [0.7255,0.6705], [0.7,0.6504] ] +,[ [0.7222,0.6955], [0.7,0.6748] ] +,[ [0.7189,0.7205], [0.7,0.7] ] +,[ [0.7156,0.744], [0.7,0.7252] ] +,[ [0.7106,0.7675], [0.7,0.7503] ] +,[ [0.7073,0.7881], [0.7,0.7754] ] +,[ [0.7024,0.8086], [0.7,0.8005] ] +,[ [0.6974,0.8277], [0.7,0.8245] ] +,[ [0.6925,0.8454], [0.7,0.8495] ] +,[ [0.6892,0.863], [0.7,0.8745] ] +,[ [0.6858,0.8807], [0.7,0.8994] ] +,[ [0.6809,0.8983], [0.7,0.9257] ] +,[ [0.6776,0.9145], [0.7,0.9503] ] +,[ [0.6743,0.9306], [0.7,0.9745] ] +,[ [0.6693,0.9424], [0.7,1] ] +,[ [0.6462,0.0532], [0.6748,0] ] +,[ [0.6495,0.06643], [0.6748,0.02551] ] +,[ [0.6528,0.0826], [0.6748,0.04974] ] +,[ [0.6561,0.09877], [0.6748,0.07432] ] +,[ [0.6594,0.1164], [0.6748,0.1006] ] +,[ [0.6627,0.134], [0.6748,0.1255] ] +,[ [0.6677,0.1517], [0.6748,0.1505] ] +,[ [0.671,0.1693], [0.6748,0.1755] ] +,[ [0.6759,0.1884], [0.6748,0.1995] ] +,[ [0.6792,0.2075], [0.6748,0.2246] ] +,[ [0.6842,0.2296], [0.6748,0.2497] ] +,[ [0.6875,0.2516], [0.6748,0.2748] ] +,[ [0.6908,0.2766], [0.6748,0.3] ] +,[ [0.6941,0.3016], [0.6748,0.3252] ] +,[ [0.6974,0.3266], [0.6748,0.3496] ] +,[ [0.7007,0.3536], [0.6748,0.3751] ] +,[ [0.704,0.3815], [0.6748,0.4] ] +,[ [0.7057,0.4103], [0.6748,0.425] ] +,[ [0.7073,0.4399], [0.6748,0.45] ] +,[ [0.709,0.4699], [0.6748,0.475] ] +,[ [0.709,0.5], [0.6748,0.5] ] +,[ [0.709,0.5301], [0.6748,0.525] ] +,[ [0.7073,0.5601], [0.6748,0.55] ] +,[ [0.7057,0.5897], [0.6748,0.575] ] +,[ [0.704,0.6185], [0.6748,0.6] ] +,[ [0.7007,0.6464], [0.6748,0.6249] ] +,[ [0.6974,0.6734], [0.6748,0.6504] ] +,[ [0.6941,0.6984], [0.6748,0.6748] ] +,[ [0.6908,0.7234], [0.6748,0.7] ] +,[ [0.6875,0.7484], [0.6748,0.7252] ] +,[ [0.6842,0.7704], [0.6748,0.7503] ] +,[ [0.6792,0.7925], [0.6748,0.7754] ] +,[ [0.6759,0.8116], [0.6748,0.8005] ] +,[ [0.671,0.8307], [0.6748,0.8245] ] +,[ [0.6677,0.8483], [0.6748,0.8495] ] +,[ [0.6627,0.866], [0.6748,0.8745] ] +,[ [0.6594,0.8836], [0.6748,0.8994] ] +,[ [0.6561,0.9012], [0.6748,0.9257] ] +,[ [0.6528,0.9174], [0.6748,0.9503] ] +,[ [0.6495,0.9336], [0.6748,0.9745] ] +,[ [0.6462,0.9468], [0.6748,1] ] +,[ [0.6227,0.05026], [0.6504,0] ] +,[ [0.6257,0.06349], [0.6504,0.02551] ] +,[ [0.6283,0.07966], [0.6504,0.04974] ] +,[ [0.6311,0.09583], [0.6504,0.07432] ] +,[ [0.6341,0.1135], [0.6504,0.1006] ] +,[ [0.6379,0.1296], [0.6504,0.1255] ] +,[ [0.6412,0.1473], [0.6504,0.1505] ] +,[ [0.6445,0.1649], [0.6504,0.1755] ] +,[ [0.6478,0.184], [0.6504,0.1995] ] +,[ [0.6528,0.2046], [0.6504,0.2246] ] +,[ [0.6561,0.2266], [0.6504,0.2497] ] +,[ [0.6594,0.2487], [0.6504,0.2748] ] +,[ [0.6627,0.2737], [0.6504,0.3] ] +,[ [0.666,0.2986], [0.6504,0.3252] ] +,[ [0.6693,0.3236], [0.6504,0.3496] ] +,[ [0.6726,0.3516], [0.6504,0.3751] ] +,[ [0.6743,0.3796], [0.6504,0.4] ] +,[ [0.6743,0.4093], [0.6504,0.425] ] +,[ [0.6759,0.4394], [0.6504,0.45] ] +,[ [0.6759,0.4697], [0.6504,0.475] ] +,[ [0.6759,0.5], [0.6504,0.5] ] +,[ [0.6759,0.5303], [0.6504,0.525] ] +,[ [0.6759,0.5606], [0.6504,0.55] ] +,[ [0.6743,0.5907], [0.6504,0.575] ] +,[ [0.6743,0.6204], [0.6504,0.6] ] +,[ [0.6726,0.6484], [0.6504,0.6249] ] +,[ [0.6693,0.6764], [0.6504,0.6504] ] +,[ [0.666,0.7014], [0.6504,0.6748] ] +,[ [0.6627,0.7263], [0.6504,0.7] ] +,[ [0.6594,0.7513], [0.6504,0.7252] ] +,[ [0.6561,0.7734], [0.6504,0.7503] ] +,[ [0.6528,0.7954], [0.6504,0.7754] ] +,[ [0.6478,0.816], [0.6504,0.8005] ] +,[ [0.6445,0.8351], [0.6504,0.8245] ] +,[ [0.6412,0.8527], [0.6504,0.8495] ] +,[ [0.6379,0.8704], [0.6504,0.8745] ] +,[ [0.6341,0.8865], [0.6504,0.8994] ] +,[ [0.6311,0.9042], [0.6504,0.9257] ] +,[ [0.6283,0.9203], [0.6504,0.9503] ] +,[ [0.6257,0.9365], [0.6504,0.9745] ] +,[ [0.6227,0.9497], [0.6504,1] ] +,[ [0.598,0.04733], [0.6249,0] ] +,[ [0.6005,0.06202], [0.6249,0.02551] ] +,[ [0.6028,0.07819], [0.6249,0.04974] ] +,[ [0.6052,0.09436], [0.6249,0.07432] ] +,[ [0.6078,0.1105], [0.6249,0.1006] ] +,[ [0.6106,0.1267], [0.6249,0.1255] ] +,[ [0.6138,0.1443], [0.6249,0.1505] ] +,[ [0.6171,0.162], [0.6249,0.1755] ] +,[ [0.6204,0.1811], [0.6249,0.1995] ] +,[ [0.6237,0.2016], [0.6249,0.2246] ] +,[ [0.6267,0.2237], [0.6249,0.2497] ] +,[ [0.6295,0.2457], [0.6249,0.2748] ] +,[ [0.6324,0.2707], [0.6249,0.3] ] +,[ [0.6356,0.2957], [0.6249,0.3252] ] +,[ [0.6379,0.3207], [0.6249,0.3496] ] +,[ [0.6412,0.3486], [0.6249,0.3751] ] +,[ [0.6412,0.3789], [0.6249,0.4] ] +,[ [0.6412,0.4093], [0.6249,0.425] ] +,[ [0.6396,0.4399], [0.6249,0.45] ] +,[ [0.6396,0.47], [0.6249,0.475] ] +,[ [0.6396,0.5], [0.6249,0.5] ] +,[ [0.6396,0.53], [0.6249,0.525] ] +,[ [0.6396,0.5601], [0.6249,0.55] ] +,[ [0.6412,0.5907], [0.6249,0.575] ] +,[ [0.6412,0.6211], [0.6249,0.6] ] +,[ [0.6412,0.6514], [0.6249,0.6249] ] +,[ [0.6379,0.6793], [0.6249,0.6504] ] +,[ [0.6356,0.7043], [0.6249,0.6748] ] +,[ [0.6324,0.7293], [0.6249,0.7] ] +,[ [0.6295,0.7543], [0.6249,0.7252] ] +,[ [0.6267,0.7763], [0.6249,0.7503] ] +,[ [0.6237,0.7984], [0.6249,0.7754] ] +,[ [0.6204,0.8189], [0.6249,0.8005] ] +,[ [0.6171,0.838], [0.6249,0.8245] ] +,[ [0.6138,0.8557], [0.6249,0.8495] ] +,[ [0.6106,0.8733], [0.6249,0.8745] ] +,[ [0.6078,0.8895], [0.6249,0.8994] ] +,[ [0.6052,0.9056], [0.6249,0.9257] ] +,[ [0.6028,0.9218], [0.6249,0.9503] ] +,[ [0.6005,0.938], [0.6249,0.9745] ] +,[ [0.598,0.9527], [0.6249,1] ] +,[ [0.5731,0.04586], [0.6,0] ] +,[ [0.5751,0.06055], [0.6,0.02551] ] +,[ [0.5769,0.07525], [0.6,0.04974] ] +,[ [0.5789,0.09289], [0.6,0.07432] ] +,[ [0.581,0.1091], [0.6,0.1006] ] +,[ [0.5835,0.1252], [0.6,0.1255] ] +,[ [0.586,0.1414], [0.6,0.1505] ] +,[ [0.5888,0.159], [0.6,0.1755] ] +,[ [0.5914,0.1781], [0.6,0.1995] ] +,[ [0.5941,0.1987], [0.6,0.2246] ] +,[ [0.5966,0.2208], [0.6,0.2497] ] +,[ [0.599,0.2443], [0.6,0.2748] ] +,[ [0.6015,0.2678], [0.6,0.3] ] +,[ [0.6042,0.2928], [0.6,0.3252] ] +,[ [0.6063,0.3192], [0.6,0.3496] ] +,[ [0.6071,0.3486], [0.6,0.3751] ] +,[ [0.6066,0.3793], [0.6,0.4] ] +,[ [0.6055,0.4103], [0.6,0.425] ] +,[ [0.604,0.4408], [0.6,0.45] ] +,[ [0.603,0.4706], [0.6,0.475] ] +,[ [0.6027,0.5], [0.6,0.5] ] +,[ [0.603,0.5294], [0.6,0.525] ] +,[ [0.604,0.5592], [0.6,0.55] ] +,[ [0.6055,0.5897], [0.6,0.575] ] +,[ [0.6066,0.6207], [0.6,0.6] ] +,[ [0.6071,0.6514], [0.6,0.6249] ] +,[ [0.6063,0.6808], [0.6,0.6504] ] +,[ [0.6042,0.7072], [0.6,0.6748] ] +,[ [0.6015,0.7322], [0.6,0.7] ] +,[ [0.599,0.7557], [0.6,0.7252] ] +,[ [0.5966,0.7792], [0.6,0.7503] ] +,[ [0.5941,0.8013], [0.6,0.7754] ] +,[ [0.5914,0.8219], [0.6,0.8005] ] +,[ [0.5888,0.841], [0.6,0.8245] ] +,[ [0.586,0.8586], [0.6,0.8495] ] +,[ [0.5835,0.8748], [0.6,0.8745] ] +,[ [0.581,0.8909], [0.6,0.8994] ] +,[ [0.5789,0.9071], [0.6,0.9257] ] +,[ [0.5769,0.9248], [0.6,0.9503] ] +,[ [0.5751,0.9394], [0.6,0.9745] ] +,[ [0.5731,0.9541], [0.6,1] ] +,[ [0.5478,0.04439], [0.575,0] ] +,[ [0.5493,0.05908], [0.575,0.02551] ] +,[ [0.5506,0.07378], [0.575,0.04974] ] +,[ [0.5521,0.08995], [0.575,0.07432] ] +,[ [0.5539,0.1061], [0.575,0.1006] ] +,[ [0.5557,0.1223], [0.575,0.1255] ] +,[ [0.5577,0.1399], [0.575,0.1505] ] +,[ [0.5599,0.1576], [0.575,0.1755] ] +,[ [0.562,0.1767], [0.575,0.1995] ] +,[ [0.564,0.1972], [0.575,0.2246] ] +,[ [0.5658,0.2193], [0.575,0.2497] ] +,[ [0.5678,0.2413], [0.575,0.2748] ] +,[ [0.5698,0.2648], [0.575,0.3] ] +,[ [0.5718,0.2913], [0.575,0.3252] ] +,[ [0.5729,0.3192], [0.575,0.3496] ] +,[ [0.5729,0.3486], [0.575,0.3751] ] +,[ [0.5718,0.3804], [0.575,0.4] ] +,[ [0.5703,0.4117], [0.575,0.425] ] +,[ [0.5688,0.4419], [0.575,0.45] ] +,[ [0.5678,0.4713], [0.575,0.475] ] +,[ [0.5675,0.5], [0.575,0.5] ] +,[ [0.5678,0.5287], [0.575,0.525] ] +,[ [0.5688,0.5581], [0.575,0.55] ] +,[ [0.5703,0.5883], [0.575,0.575] ] +,[ [0.5718,0.6196], [0.575,0.6] ] +,[ [0.5729,0.6514], [0.575,0.6249] ] +,[ [0.5729,0.6808], [0.575,0.6504] ] +,[ [0.5718,0.7087], [0.575,0.6748] ] +,[ [0.5698,0.7352], [0.575,0.7] ] +,[ [0.5678,0.7587], [0.575,0.7252] ] +,[ [0.5658,0.7807], [0.575,0.7503] ] +,[ [0.564,0.8028], [0.575,0.7754] ] +,[ [0.562,0.8233], [0.575,0.8005] ] +,[ [0.5599,0.8424], [0.575,0.8245] ] +,[ [0.5577,0.8601], [0.575,0.8495] ] +,[ [0.5557,0.8777], [0.575,0.8745] ] +,[ [0.5539,0.8939], [0.575,0.8994] ] +,[ [0.5521,0.9101], [0.575,0.9257] ] +,[ [0.5506,0.9262], [0.575,0.9503] ] +,[ [0.5493,0.9409], [0.575,0.9745] ] +,[ [0.5478,0.9556], [0.575,1] ] +,[ [0.5223,0.04292], [0.55,0] ] +,[ [0.5233,0.05761], [0.55,0.02551] ] +,[ [0.5241,0.07378], [0.55,0.04974] ] +,[ [0.5253,0.08995], [0.55,0.07432] ] +,[ [0.5265,0.1046], [0.55,0.1006] ] +,[ [0.5276,0.1208], [0.55,0.1255] ] +,[ [0.5291,0.1384], [0.55,0.1505] ] +,[ [0.5304,0.1561], [0.55,0.1755] ] +,[ [0.5319,0.1752], [0.55,0.1995] ] +,[ [0.5332,0.1958], [0.55,0.2246] ] +,[ [0.5346,0.2178], [0.55,0.2497] ] +,[ [0.5359,0.2399], [0.55,0.2748] ] +,[ [0.5372,0.2634], [0.55,0.3] ] +,[ [0.5385,0.2898], [0.55,0.3252] ] +,[ [0.539,0.3178], [0.55,0.3496] ] +,[ [0.5385,0.3501], [0.55,0.3751] ] +,[ [0.5375,0.3817], [0.55,0.4] ] +,[ [0.5362,0.413], [0.55,0.425] ] +,[ [0.5351,0.443], [0.55,0.45] ] +,[ [0.5342,0.4719], [0.55,0.475] ] +,[ [0.5339,0.5], [0.55,0.5] ] +,[ [0.5342,0.5281], [0.55,0.525] ] +,[ [0.5351,0.557], [0.55,0.55] ] +,[ [0.5362,0.587], [0.55,0.575] ] +,[ [0.5375,0.6183], [0.55,0.6] ] +,[ [0.5385,0.6499], [0.55,0.6249] ] +,[ [0.539,0.6822], [0.55,0.6504] ] +,[ [0.5385,0.7102], [0.55,0.6748] ] +,[ [0.5372,0.7366], [0.55,0.7] ] +,[ [0.5359,0.7601], [0.55,0.7252] ] +,[ [0.5346,0.7822], [0.55,0.7503] ] +,[ [0.5332,0.8042], [0.55,0.7754] ] +,[ [0.5319,0.8248], [0.55,0.8005] ] +,[ [0.5304,0.8439], [0.55,0.8245] ] +,[ [0.5291,0.8616], [0.55,0.8495] ] +,[ [0.5276,0.8792], [0.55,0.8745] ] +,[ [0.5265,0.8954], [0.55,0.8994] ] +,[ [0.5253,0.9101], [0.55,0.9257] ] +,[ [0.5241,0.9262], [0.55,0.9503] ] +,[ [0.5233,0.9424], [0.55,0.9745] ] +,[ [0.5223,0.9571], [0.55,1] ] +,[ [0.4967,0.04145], [0.525,0] ] +,[ [0.4972,0.05761], [0.525,0.02551] ] +,[ [0.4975,0.07231], [0.525,0.04974] ] +,[ [0.4982,0.08848], [0.525,0.07432] ] +,[ [0.4987,0.1046], [0.525,0.1006] ] +,[ [0.4993,0.1208], [0.525,0.1255] ] +,[ [0.5,0.137], [0.525,0.1505] ] +,[ [0.5008,0.1546], [0.525,0.1755] ] +,[ [0.5015,0.1737], [0.525,0.1995] ] +,[ [0.5021,0.1943], [0.525,0.2246] ] +,[ [0.5028,0.2163], [0.525,0.2497] ] +,[ [0.5035,0.2399], [0.525,0.2748] ] +,[ [0.5043,0.2634], [0.525,0.3] ] +,[ [0.5048,0.2884], [0.525,0.3252] ] +,[ [0.505,0.3178], [0.525,0.3496] ] +,[ [0.5046,0.3501], [0.525,0.3751] ] +,[ [0.504,0.3826], [0.525,0.4] ] +,[ [0.5031,0.4139], [0.525,0.425] ] +,[ [0.5025,0.4437], [0.525,0.45] ] +,[ [0.502,0.4724], [0.525,0.475] ] +,[ [0.5018,0.5], [0.525,0.5] ] +,[ [0.502,0.5276], [0.525,0.525] ] +,[ [0.5025,0.5563], [0.525,0.55] ] +,[ [0.5031,0.5861], [0.525,0.575] ] +,[ [0.504,0.6174], [0.525,0.6] ] +,[ [0.5046,0.6499], [0.525,0.6249] ] +,[ [0.505,0.6822], [0.525,0.6504] ] +,[ [0.5048,0.7116], [0.525,0.6748] ] +,[ [0.5043,0.7366], [0.525,0.7] ] +,[ [0.5035,0.7601], [0.525,0.7252] ] +,[ [0.5028,0.7837], [0.525,0.7503] ] +,[ [0.5021,0.8057], [0.525,0.7754] ] +,[ [0.5015,0.8263], [0.525,0.8005] ] +,[ [0.5008,0.8454], [0.525,0.8245] ] +,[ [0.5,0.863], [0.525,0.8495] ] +,[ [0.4993,0.8792], [0.525,0.8745] ] +,[ [0.4987,0.8954], [0.525,0.8994] ] +,[ [0.4982,0.9115], [0.525,0.9257] ] +,[ [0.4975,0.9277], [0.525,0.9503] ] +,[ [0.4972,0.9424], [0.525,0.9745] ] +,[ [0.4967,0.9586], [0.525,1] ] +,[ [0.4709,0.04145], [0.5,0] ] +,[ [0.4709,0.05614], [0.5,0.02551] ] +,[ [0.4709,0.07231], [0.5,0.04974] ] +,[ [0.4709,0.08848], [0.5,0.07432] ] +,[ [0.4709,0.1046], [0.5,0.1006] ] +,[ [0.4709,0.1208], [0.5,0.1255] ] +,[ [0.4709,0.137], [0.5,0.1505] ] +,[ [0.4709,0.1546], [0.5,0.1755] ] +,[ [0.4709,0.1737], [0.5,0.1995] ] +,[ [0.4709,0.1943], [0.5,0.2246] ] +,[ [0.4709,0.2163], [0.5,0.2497] ] +,[ [0.4709,0.2384], [0.5,0.2748] ] +,[ [0.4709,0.2634], [0.5,0.3] ] +,[ [0.4709,0.2884], [0.5,0.3252] ] +,[ [0.4709,0.3178], [0.5,0.3496] ] +,[ [0.4709,0.3501], [0.5,0.3751] ] +,[ [0.4709,0.3829], [0.5,0.4] ] +,[ [0.4709,0.4142], [0.5,0.425] ] +,[ [0.4709,0.444], [0.5,0.45] ] +,[ [0.4709,0.4725], [0.5,0.475] ] +,[ [0.4709,0.5], [0.5,0.5] ] +,[ [0.4709,0.5275], [0.5,0.525] ] +,[ [0.4709,0.556], [0.5,0.55] ] +,[ [0.4709,0.5858], [0.5,0.575] ] +,[ [0.4709,0.6171], [0.5,0.6] ] +,[ [0.4709,0.6499], [0.5,0.6249] ] +,[ [0.4709,0.6822], [0.5,0.6504] ] +,[ [0.4709,0.7116], [0.5,0.6748] ] +,[ [0.4709,0.7366], [0.5,0.7] ] +,[ [0.4709,0.7616], [0.5,0.7252] ] +,[ [0.4709,0.7837], [0.5,0.7503] ] +,[ [0.4709,0.8057], [0.5,0.7754] ] +,[ [0.4709,0.8263], [0.5,0.8005] ] +,[ [0.4709,0.8454], [0.5,0.8245] ] +,[ [0.4709,0.863], [0.5,0.8495] ] +,[ [0.4709,0.8792], [0.5,0.8745] ] +,[ [0.4709,0.8954], [0.5,0.8994] ] +,[ [0.4709,0.9115], [0.5,0.9257] ] +,[ [0.4709,0.9277], [0.5,0.9503] ] +,[ [0.4709,0.9439], [0.5,0.9745] ] +,[ [0.4709,0.9586], [0.5,1] ] +,[ [0.4451,0.04145], [0.475,0] ] +,[ [0.4446,0.05761], [0.475,0.02551] ] +,[ [0.4443,0.07231], [0.475,0.04974] ] +,[ [0.4436,0.08848], [0.475,0.07432] ] +,[ [0.4431,0.1046], [0.475,0.1006] ] +,[ [0.4425,0.1208], [0.475,0.1255] ] +,[ [0.4418,0.137], [0.475,0.1505] ] +,[ [0.441,0.1546], [0.475,0.1755] ] +,[ [0.4403,0.1737], [0.475,0.1995] ] +,[ [0.4396,0.1943], [0.475,0.2246] ] +,[ [0.439,0.2163], [0.475,0.2497] ] +,[ [0.4383,0.2399], [0.475,0.2748] ] +,[ [0.4375,0.2634], [0.475,0.3] ] +,[ [0.437,0.2884], [0.475,0.3252] ] +,[ [0.4368,0.3178], [0.475,0.3496] ] +,[ [0.4372,0.3501], [0.475,0.3751] ] +,[ [0.4378,0.3826], [0.475,0.4] ] +,[ [0.4387,0.4139], [0.475,0.425] ] +,[ [0.4393,0.4437], [0.475,0.45] ] +,[ [0.4398,0.4724], [0.475,0.475] ] +,[ [0.44,0.5], [0.475,0.5] ] +,[ [0.4398,0.5276], [0.475,0.525] ] +,[ [0.4393,0.5563], [0.475,0.55] ] +,[ [0.4387,0.5861], [0.475,0.575] ] +,[ [0.4378,0.6174], [0.475,0.6] ] +,[ [0.4372,0.6499], [0.475,0.6249] ] +,[ [0.4368,0.6822], [0.475,0.6504] ] +,[ [0.437,0.7116], [0.475,0.6748] ] +,[ [0.4375,0.7366], [0.475,0.7] ] +,[ [0.4383,0.7601], [0.475,0.7252] ] +,[ [0.439,0.7837], [0.475,0.7503] ] +,[ [0.4396,0.8057], [0.475,0.7754] ] +,[ [0.4403,0.8263], [0.475,0.8005] ] +,[ [0.441,0.8454], [0.475,0.8245] ] +,[ [0.4418,0.863], [0.475,0.8495] ] +,[ [0.4425,0.8792], [0.475,0.8745] ] +,[ [0.4431,0.8954], [0.475,0.8994] ] +,[ [0.4436,0.9115], [0.475,0.9257] ] +,[ [0.4443,0.9277], [0.475,0.9503] ] +,[ [0.4446,0.9424], [0.475,0.9745] ] +,[ [0.4451,0.9586], [0.475,1] ] +,[ [0.4195,0.04292], [0.45,0] ] +,[ [0.4185,0.05761], [0.45,0.02551] ] +,[ [0.4177,0.07378], [0.45,0.04974] ] +,[ [0.4165,0.08995], [0.45,0.07432] ] +,[ [0.4153,0.1046], [0.45,0.1006] ] +,[ [0.4142,0.1208], [0.45,0.1255] ] +,[ [0.4127,0.1384], [0.45,0.1505] ] +,[ [0.4114,0.1561], [0.45,0.1755] ] +,[ [0.4099,0.1752], [0.45,0.1995] ] +,[ [0.4086,0.1958], [0.45,0.2246] ] +,[ [0.4072,0.2178], [0.45,0.2497] ] +,[ [0.4059,0.2399], [0.45,0.2748] ] +,[ [0.4046,0.2634], [0.45,0.3] ] +,[ [0.4033,0.2898], [0.45,0.3252] ] +,[ [0.4028,0.3178], [0.45,0.3496] ] +,[ [0.4033,0.3501], [0.45,0.3751] ] +,[ [0.4043,0.3817], [0.45,0.4] ] +,[ [0.4056,0.413], [0.45,0.425] ] +,[ [0.4067,0.443], [0.45,0.45] ] +,[ [0.4076,0.4719], [0.45,0.475] ] +,[ [0.4079,0.5], [0.45,0.5] ] +,[ [0.4076,0.5281], [0.45,0.525] ] +,[ [0.4067,0.557], [0.45,0.55] ] +,[ [0.4056,0.587], [0.45,0.575] ] +,[ [0.4043,0.6183], [0.45,0.6] ] +,[ [0.4033,0.6499], [0.45,0.6249] ] +,[ [0.4028,0.6822], [0.45,0.6504] ] +,[ [0.4033,0.7102], [0.45,0.6748] ] +,[ [0.4046,0.7366], [0.45,0.7] ] +,[ [0.4059,0.7601], [0.45,0.7252] ] +,[ [0.4072,0.7822], [0.45,0.7503] ] +,[ [0.4086,0.8042], [0.45,0.7754] ] +,[ [0.4099,0.8248], [0.45,0.8005] ] +,[ [0.4114,0.8439], [0.45,0.8245] ] +,[ [0.4127,0.8616], [0.45,0.8495] ] +,[ [0.4142,0.8792], [0.45,0.8745] ] +,[ [0.4153,0.8954], [0.45,0.8994] ] +,[ [0.4165,0.9101], [0.45,0.9257] ] +,[ [0.4177,0.9262], [0.45,0.9503] ] +,[ [0.4185,0.9424], [0.45,0.9745] ] +,[ [0.4195,0.9571], [0.45,1] ] +,[ [0.394,0.04439], [0.425,0] ] +,[ [0.3925,0.05908], [0.425,0.02551] ] +,[ [0.3912,0.07378], [0.425,0.04974] ] +,[ [0.3897,0.08995], [0.425,0.07432] ] +,[ [0.3879,0.1061], [0.425,0.1006] ] +,[ [0.3861,0.1223], [0.425,0.1255] ] +,[ [0.3841,0.1399], [0.425,0.1505] ] +,[ [0.3819,0.1576], [0.425,0.1755] ] +,[ [0.3798,0.1767], [0.425,0.1995] ] +,[ [0.3778,0.1972], [0.425,0.2246] ] +,[ [0.376,0.2193], [0.425,0.2497] ] +,[ [0.374,0.2413], [0.425,0.2748] ] +,[ [0.372,0.2648], [0.425,0.3] ] +,[ [0.37,0.2913], [0.425,0.3252] ] +,[ [0.3689,0.3192], [0.425,0.3496] ] +,[ [0.3689,0.3486], [0.425,0.3751] ] +,[ [0.37,0.3804], [0.425,0.4] ] +,[ [0.3715,0.4117], [0.425,0.425] ] +,[ [0.373,0.4419], [0.425,0.45] ] +,[ [0.374,0.4713], [0.425,0.475] ] +,[ [0.3743,0.5], [0.425,0.5] ] +,[ [0.374,0.5287], [0.425,0.525] ] +,[ [0.373,0.5581], [0.425,0.55] ] +,[ [0.3715,0.5883], [0.425,0.575] ] +,[ [0.37,0.6196], [0.425,0.6] ] +,[ [0.3689,0.6514], [0.425,0.6249] ] +,[ [0.3689,0.6808], [0.425,0.6504] ] +,[ [0.37,0.7087], [0.425,0.6748] ] +,[ [0.372,0.7352], [0.425,0.7] ] +,[ [0.374,0.7587], [0.425,0.7252] ] +,[ [0.376,0.7807], [0.425,0.7503] ] +,[ [0.3778,0.8028], [0.425,0.7754] ] +,[ [0.3798,0.8233], [0.425,0.8005] ] +,[ [0.3819,0.8424], [0.425,0.8245] ] +,[ [0.3841,0.8601], [0.425,0.8495] ] +,[ [0.3861,0.8777], [0.425,0.8745] ] +,[ [0.3879,0.8939], [0.425,0.8994] ] +,[ [0.3897,0.9101], [0.425,0.9257] ] +,[ [0.3912,0.9262], [0.425,0.9503] ] +,[ [0.3925,0.9409], [0.425,0.9745] ] +,[ [0.394,0.9556], [0.425,1] ] +,[ [0.3687,0.04586], [0.4,0] ] +,[ [0.3667,0.06055], [0.4,0.02551] ] +,[ [0.3649,0.07525], [0.4,0.04974] ] +,[ [0.3629,0.09289], [0.4,0.07432] ] +,[ [0.3608,0.1091], [0.4,0.1006] ] +,[ [0.3583,0.1252], [0.4,0.1255] ] +,[ [0.3558,0.1414], [0.4,0.1505] ] +,[ [0.353,0.159], [0.4,0.1755] ] +,[ [0.3504,0.1781], [0.4,0.1995] ] +,[ [0.3477,0.1987], [0.4,0.2246] ] +,[ [0.3452,0.2208], [0.4,0.2497] ] +,[ [0.3428,0.2443], [0.4,0.2748] ] +,[ [0.3403,0.2678], [0.4,0.3] ] +,[ [0.3376,0.2928], [0.4,0.3252] ] +,[ [0.3355,0.3192], [0.4,0.3496] ] +,[ [0.3347,0.3486], [0.4,0.3751] ] +,[ [0.3352,0.3793], [0.4,0.4] ] +,[ [0.3363,0.4103], [0.4,0.425] ] +,[ [0.3378,0.4408], [0.4,0.45] ] +,[ [0.3388,0.4706], [0.4,0.475] ] +,[ [0.3391,0.5], [0.4,0.5] ] +,[ [0.3388,0.5294], [0.4,0.525] ] +,[ [0.3378,0.5592], [0.4,0.55] ] +,[ [0.3363,0.5897], [0.4,0.575] ] +,[ [0.3352,0.6207], [0.4,0.6] ] +,[ [0.3347,0.6514], [0.4,0.6249] ] +,[ [0.3355,0.6808], [0.4,0.6504] ] +,[ [0.3376,0.7072], [0.4,0.6748] ] +,[ [0.3403,0.7322], [0.4,0.7] ] +,[ [0.3428,0.7557], [0.4,0.7252] ] +,[ [0.3452,0.7792], [0.4,0.7503] ] +,[ [0.3477,0.8013], [0.4,0.7754] ] +,[ [0.3504,0.8219], [0.4,0.8005] ] +,[ [0.353,0.841], [0.4,0.8245] ] +,[ [0.3558,0.8586], [0.4,0.8495] ] +,[ [0.3583,0.8748], [0.4,0.8745] ] +,[ [0.3608,0.8909], [0.4,0.8994] ] +,[ [0.3629,0.9071], [0.4,0.9257] ] +,[ [0.3649,0.9248], [0.4,0.9503] ] +,[ [0.3667,0.9394], [0.4,0.9745] ] +,[ [0.3687,0.9541], [0.4,1] ] +,[ [0.3437,0.04733], [0.3751,0] ] +,[ [0.3413,0.06202], [0.3751,0.02551] ] +,[ [0.339,0.07819], [0.3751,0.04974] ] +,[ [0.3366,0.09436], [0.3751,0.07432] ] +,[ [0.334,0.1105], [0.3751,0.1006] ] +,[ [0.3312,0.1267], [0.3751,0.1255] ] +,[ [0.328,0.1443], [0.3751,0.1505] ] +,[ [0.3247,0.162], [0.3751,0.1755] ] +,[ [0.3214,0.1811], [0.3751,0.1995] ] +,[ [0.3181,0.2016], [0.3751,0.2246] ] +,[ [0.3151,0.2237], [0.3751,0.2497] ] +,[ [0.3123,0.2457], [0.3751,0.2748] ] +,[ [0.3094,0.2707], [0.3751,0.3] ] +,[ [0.3062,0.2957], [0.3751,0.3252] ] +,[ [0.3039,0.3207], [0.3751,0.3496] ] +,[ [0.3006,0.3486], [0.3751,0.3751] ] +,[ [0.3006,0.3789], [0.3751,0.4] ] +,[ [0.3006,0.4093], [0.3751,0.425] ] +,[ [0.3022,0.4399], [0.3751,0.45] ] +,[ [0.3022,0.47], [0.3751,0.475] ] +,[ [0.3022,0.5], [0.3751,0.5] ] +,[ [0.3022,0.53], [0.3751,0.525] ] +,[ [0.3022,0.5601], [0.3751,0.55] ] +,[ [0.3006,0.5907], [0.3751,0.575] ] +,[ [0.3006,0.6211], [0.3751,0.6] ] +,[ [0.3006,0.6514], [0.3751,0.6249] ] +,[ [0.3039,0.6793], [0.3751,0.6504] ] +,[ [0.3062,0.7043], [0.3751,0.6748] ] +,[ [0.3094,0.7293], [0.3751,0.7] ] +,[ [0.3123,0.7543], [0.3751,0.7252] ] +,[ [0.3151,0.7763], [0.3751,0.7503] ] +,[ [0.3181,0.7984], [0.3751,0.7754] ] +,[ [0.3214,0.8189], [0.3751,0.8005] ] +,[ [0.3247,0.838], [0.3751,0.8245] ] +,[ [0.328,0.8557], [0.3751,0.8495] ] +,[ [0.3312,0.8733], [0.3751,0.8745] ] +,[ [0.334,0.8895], [0.3751,0.8994] ] +,[ [0.3366,0.9056], [0.3751,0.9257] ] +,[ [0.339,0.9218], [0.3751,0.9503] ] +,[ [0.3413,0.938], [0.3751,0.9745] ] +,[ [0.3437,0.9527], [0.3751,1] ] +,[ [0.3191,0.05026], [0.3496,0] ] +,[ [0.3161,0.06349], [0.3496,0.02551] ] +,[ [0.3135,0.07966], [0.3496,0.04974] ] +,[ [0.3107,0.09583], [0.3496,0.07432] ] +,[ [0.3077,0.1135], [0.3496,0.1006] ] +,[ [0.3039,0.1296], [0.3496,0.1255] ] +,[ [0.3006,0.1473], [0.3496,0.1505] ] +,[ [0.2973,0.1649], [0.3496,0.1755] ] +,[ [0.294,0.184], [0.3496,0.1995] ] +,[ [0.289,0.2046], [0.3496,0.2246] ] +,[ [0.2857,0.2266], [0.3496,0.2497] ] +,[ [0.2824,0.2487], [0.3496,0.2748] ] +,[ [0.2791,0.2737], [0.3496,0.3] ] +,[ [0.2758,0.2986], [0.3496,0.3252] ] +,[ [0.2725,0.3236], [0.3496,0.3496] ] +,[ [0.2692,0.3516], [0.3496,0.3751] ] +,[ [0.2675,0.3796], [0.3496,0.4] ] +,[ [0.2675,0.4093], [0.3496,0.425] ] +,[ [0.2659,0.4394], [0.3496,0.45] ] +,[ [0.2659,0.4697], [0.3496,0.475] ] +,[ [0.2659,0.5], [0.3496,0.5] ] +,[ [0.2659,0.5303], [0.3496,0.525] ] +,[ [0.2659,0.5606], [0.3496,0.55] ] +,[ [0.2675,0.5907], [0.3496,0.575] ] +,[ [0.2675,0.6204], [0.3496,0.6] ] +,[ [0.2692,0.6484], [0.3496,0.6249] ] +,[ [0.2725,0.6764], [0.3496,0.6504] ] +,[ [0.2758,0.7014], [0.3496,0.6748] ] +,[ [0.2791,0.7263], [0.3496,0.7] ] +,[ [0.2824,0.7513], [0.3496,0.7252] ] +,[ [0.2857,0.7734], [0.3496,0.7503] ] +,[ [0.289,0.7954], [0.3496,0.7754] ] +,[ [0.294,0.816], [0.3496,0.8005] ] +,[ [0.2973,0.8351], [0.3496,0.8245] ] +,[ [0.3006,0.8527], [0.3496,0.8495] ] +,[ [0.3039,0.8704], [0.3496,0.8745] ] +,[ [0.3077,0.8865], [0.3496,0.8994] ] +,[ [0.3107,0.9042], [0.3496,0.9257] ] +,[ [0.3135,0.9203], [0.3496,0.9503] ] +,[ [0.3161,0.9365], [0.3496,0.9745] ] +,[ [0.3191,0.9497], [0.3496,1] ] +,[ [0.2956,0.0532], [0.3252,0] ] +,[ [0.2923,0.06643], [0.3252,0.02551] ] +,[ [0.289,0.0826], [0.3252,0.04974] ] +,[ [0.2857,0.09877], [0.3252,0.07432] ] +,[ [0.2824,0.1164], [0.3252,0.1006] ] +,[ [0.2791,0.134], [0.3252,0.1255] ] +,[ [0.2741,0.1517], [0.3252,0.1505] ] +,[ [0.2708,0.1693], [0.3252,0.1755] ] +,[ [0.2659,0.1884], [0.3252,0.1995] ] +,[ [0.2626,0.2075], [0.3252,0.2246] ] +,[ [0.2576,0.2296], [0.3252,0.2497] ] +,[ [0.2543,0.2516], [0.3252,0.2748] ] +,[ [0.251,0.2766], [0.3252,0.3] ] +,[ [0.2477,0.3016], [0.3252,0.3252] ] +,[ [0.2444,0.3266], [0.3252,0.3496] ] +,[ [0.2411,0.3536], [0.3252,0.3751] ] +,[ [0.2378,0.3815], [0.3252,0.4] ] +,[ [0.2361,0.4103], [0.3252,0.425] ] +,[ [0.2345,0.4399], [0.3252,0.45] ] +,[ [0.2328,0.4699], [0.3252,0.475] ] +,[ [0.2328,0.5], [0.3252,0.5] ] +,[ [0.2328,0.5301], [0.3252,0.525] ] +,[ [0.2345,0.5601], [0.3252,0.55] ] +,[ [0.2361,0.5897], [0.3252,0.575] ] +,[ [0.2378,0.6185], [0.3252,0.6] ] +,[ [0.2411,0.6464], [0.3252,0.6249] ] +,[ [0.2444,0.6734], [0.3252,0.6504] ] +,[ [0.2477,0.6984], [0.3252,0.6748] ] +,[ [0.251,0.7234], [0.3252,0.7] ] +,[ [0.2543,0.7484], [0.3252,0.7252] ] +,[ [0.2576,0.7704], [0.3252,0.7503] ] +,[ [0.2626,0.7925], [0.3252,0.7754] ] +,[ [0.2659,0.8116], [0.3252,0.8005] ] +,[ [0.2708,0.8307], [0.3252,0.8245] ] +,[ [0.2741,0.8483], [0.3252,0.8495] ] +,[ [0.2791,0.866], [0.3252,0.8745] ] +,[ [0.2824,0.8836], [0.3252,0.8994] ] +,[ [0.2857,0.9012], [0.3252,0.9257] ] +,[ [0.289,0.9174], [0.3252,0.9503] ] +,[ [0.2923,0.9336], [0.3252,0.9745] ] +,[ [0.2956,0.9468], [0.3252,1] ] +,[ [0.2725,0.05761], [0.3,0] ] +,[ [0.2675,0.06937], [0.3,0.02551] ] +,[ [0.2642,0.08554], [0.3,0.04974] ] +,[ [0.2609,0.1017], [0.3,0.07432] ] +,[ [0.256,0.1193], [0.3,0.1006] ] +,[ [0.2526,0.137], [0.3,0.1255] ] +,[ [0.2493,0.1546], [0.3,0.1505] ] +,[ [0.2444,0.1723], [0.3,0.1755] ] +,[ [0.2394,0.1914], [0.3,0.1995] ] +,[ [0.2345,0.2119], [0.3,0.2246] ] +,[ [0.2312,0.2325], [0.3,0.2497] ] +,[ [0.2262,0.256], [0.3,0.2748] ] +,[ [0.2229,0.2795], [0.3,0.3] ] +,[ [0.2196,0.3045], [0.3,0.3252] ] +,[ [0.2163,0.3295], [0.3,0.3496] ] +,[ [0.213,0.3564], [0.3,0.3751] ] +,[ [0.2097,0.3839], [0.3,0.4] ] +,[ [0.2063,0.4121], [0.3,0.425] ] +,[ [0.2047,0.4411], [0.3,0.45] ] +,[ [0.2047,0.4703], [0.3,0.475] ] +,[ [0.2047,0.5], [0.3,0.5] ] +,[ [0.2047,0.5297], [0.3,0.525] ] +,[ [0.2047,0.5589], [0.3,0.55] ] +,[ [0.2063,0.5879], [0.3,0.575] ] +,[ [0.2097,0.6161], [0.3,0.6] ] +,[ [0.213,0.6436], [0.3,0.6249] ] +,[ [0.2163,0.6705], [0.3,0.6504] ] +,[ [0.2196,0.6955], [0.3,0.6748] ] +,[ [0.2229,0.7205], [0.3,0.7] ] +,[ [0.2262,0.744], [0.3,0.7252] ] +,[ [0.2312,0.7675], [0.3,0.7503] ] +,[ [0.2345,0.7881], [0.3,0.7754] ] +,[ [0.2394,0.8086], [0.3,0.8005] ] +,[ [0.2444,0.8277], [0.3,0.8245] ] +,[ [0.2493,0.8454], [0.3,0.8495] ] +,[ [0.2526,0.863], [0.3,0.8745] ] +,[ [0.256,0.8807], [0.3,0.8994] ] +,[ [0.2609,0.8983], [0.3,0.9257] ] +,[ [0.2642,0.9145], [0.3,0.9503] ] +,[ [0.2675,0.9306], [0.3,0.9745] ] +,[ [0.2725,0.9424], [0.3,1] ] +,[ [0.251,0.06349], [0.2748,0] ] +,[ [0.2444,0.07378], [0.2748,0.02551] ] +,[ [0.2394,0.08848], [0.2748,0.04974] ] +,[ [0.2361,0.1046], [0.2748,0.07432] ] +,[ [0.2312,0.1223], [0.2748,0.1006] ] +,[ [0.2278,0.1399], [0.2748,0.1255] ] +,[ [0.2245,0.159], [0.2748,0.1505] ] +,[ [0.2196,0.1767], [0.2748,0.1755] ] +,[ [0.2146,0.1958], [0.2748,0.1995] ] +,[ [0.2097,0.2163], [0.2748,0.2246] ] +,[ [0.2047,0.2369], [0.2748,0.2497] ] +,[ [0.1997,0.259], [0.2748,0.2748] ] +,[ [0.1964,0.2825], [0.2748,0.3] ] +,[ [0.1915,0.3075], [0.2748,0.3252] ] +,[ [0.1882,0.3325], [0.2748,0.3496] ] +,[ [0.1849,0.3591], [0.2748,0.3751] ] +,[ [0.1832,0.3861], [0.2748,0.4] ] +,[ [0.1799,0.4139], [0.2748,0.425] ] +,[ [0.1782,0.4422], [0.2748,0.45] ] +,[ [0.1782,0.471], [0.2748,0.475] ] +,[ [0.1766,0.5], [0.2748,0.5] ] +,[ [0.1782,0.529], [0.2748,0.525] ] +,[ [0.1782,0.5578], [0.2748,0.55] ] +,[ [0.1799,0.5861], [0.2748,0.575] ] +,[ [0.1832,0.6139], [0.2748,0.6] ] +,[ [0.1849,0.6409], [0.2748,0.6249] ] +,[ [0.1882,0.6675], [0.2748,0.6504] ] +,[ [0.1915,0.6925], [0.2748,0.6748] ] +,[ [0.1964,0.7175], [0.2748,0.7] ] +,[ [0.1997,0.741], [0.2748,0.7252] ] +,[ [0.2047,0.7631], [0.2748,0.7503] ] +,[ [0.2097,0.7837], [0.2748,0.7754] ] +,[ [0.2146,0.8042], [0.2748,0.8005] ] +,[ [0.2196,0.8233], [0.2748,0.8245] ] +,[ [0.2245,0.841], [0.2748,0.8495] ] +,[ [0.2278,0.8601], [0.2748,0.8745] ] +,[ [0.2312,0.8777], [0.2748,0.8994] ] +,[ [0.2361,0.8954], [0.2748,0.9257] ] +,[ [0.2394,0.9115], [0.2748,0.9503] ] +,[ [0.2444,0.9262], [0.2748,0.9745] ] +,[ [0.251,0.9365], [0.2748,1] ] +,[ [0.2312,0.07378], [0.2497,0] ] +,[ [0.2212,0.07966], [0.2497,0.02551] ] +,[ [0.2163,0.09289], [0.2497,0.04974] ] +,[ [0.2113,0.1091], [0.2497,0.07432] ] +,[ [0.208,0.1252], [0.2497,0.1006] ] +,[ [0.203,0.1443], [0.2497,0.1255] ] +,[ [0.1997,0.162], [0.2497,0.1505] ] +,[ [0.1948,0.1811], [0.2497,0.1755] ] +,[ [0.1898,0.2002], [0.2497,0.1995] ] +,[ [0.1849,0.2208], [0.2497,0.2246] ] +,[ [0.1799,0.2413], [0.2497,0.2497] ] +,[ [0.1749,0.2634], [0.2497,0.2748] ] +,[ [0.17,0.2869], [0.2497,0.3] ] +,[ [0.1667,0.3104], [0.2497,0.3252] ] +,[ [0.1634,0.3354], [0.2497,0.3496] ] +,[ [0.1601,0.3616], [0.2497,0.3751] ] +,[ [0.1567,0.3883], [0.2497,0.4] ] +,[ [0.1551,0.4156], [0.2497,0.425] ] +,[ [0.1534,0.4434], [0.2497,0.45] ] +,[ [0.1518,0.4716], [0.2497,0.475] ] +,[ [0.1518,0.5], [0.2497,0.5] ] +,[ [0.1518,0.5284], [0.2497,0.525] ] +,[ [0.1534,0.5566], [0.2497,0.55] ] +,[ [0.1551,0.5844], [0.2497,0.575] ] +,[ [0.1567,0.6117], [0.2497,0.6] ] +,[ [0.1601,0.6384], [0.2497,0.6249] ] +,[ [0.1634,0.6646], [0.2497,0.6504] ] +,[ [0.1667,0.6896], [0.2497,0.6748] ] +,[ [0.17,0.7131], [0.2497,0.7] ] +,[ [0.1749,0.7366], [0.2497,0.7252] ] +,[ [0.1799,0.7587], [0.2497,0.7503] ] +,[ [0.1849,0.7792], [0.2497,0.7754] ] +,[ [0.1898,0.7998], [0.2497,0.8005] ] +,[ [0.1948,0.8189], [0.2497,0.8245] ] +,[ [0.1997,0.838], [0.2497,0.8495] ] +,[ [0.203,0.8557], [0.2497,0.8745] ] +,[ [0.208,0.8748], [0.2497,0.8994] ] +,[ [0.2113,0.8909], [0.2497,0.9257] ] +,[ [0.1898,0.112], [0.2246,0.07432] ] +,[ [0.1849,0.1296], [0.2246,0.1006] ] +,[ [0.1799,0.1473], [0.2246,0.1255] ] +,[ [0.1766,0.1664], [0.2246,0.1505] ] +,[ [0.1716,0.1855], [0.2246,0.1755] ] +,[ [0.1667,0.2046], [0.2246,0.1995] ] +,[ [0.1617,0.2252], [0.2246,0.2246] ] +,[ [0.1567,0.2457], [0.2246,0.2497] ] +,[ [0.1518,0.2678], [0.2246,0.2748] ] +,[ [0.1468,0.2898], [0.2246,0.3] ] +,[ [0.1419,0.3148], [0.2246,0.3252] ] +,[ [0.1386,0.3383], [0.2246,0.3496] ] +,[ [0.1353,0.3642], [0.2246,0.3751] ] +,[ [0.1319,0.3905], [0.2246,0.4] ] +,[ [0.1303,0.4173], [0.2246,0.425] ] +,[ [0.1286,0.4446], [0.2246,0.45] ] +,[ [0.127,0.4722], [0.2246,0.475] ] +,[ [0.127,0.5], [0.2246,0.5] ] +,[ [0.127,0.5278], [0.2246,0.525] ] +,[ [0.1286,0.5554], [0.2246,0.55] ] +,[ [0.1303,0.5827], [0.2246,0.575] ] +,[ [0.1319,0.6095], [0.2246,0.6] ] +,[ [0.1353,0.6358], [0.2246,0.6249] ] +,[ [0.1386,0.6617], [0.2246,0.6504] ] +,[ [0.1419,0.6852], [0.2246,0.6748] ] +,[ [0.1468,0.7102], [0.2246,0.7] ] +,[ [0.1518,0.7322], [0.2246,0.7252] ] +,[ [0.1567,0.7543], [0.2246,0.7503] ] +,[ [0.1617,0.7748], [0.2246,0.7754] ] +,[ [0.1667,0.7954], [0.2246,0.8005] ] +,[ [0.1716,0.8145], [0.2246,0.8245] ] +,[ [0.1766,0.8336], [0.2246,0.8495] ] +,[ [0.1799,0.8527], [0.2246,0.8745] ] +,[ [0.1849,0.8704], [0.2246,0.8994] ] +,[ [0.1898,0.888], [0.2246,0.9257] ] +,[ [0.1667,0.1164], [0.1995,0.07432] ] +,[ [0.1617,0.134], [0.1995,0.1006] ] +,[ [0.1567,0.1517], [0.1995,0.1255] ] +,[ [0.1534,0.1693], [0.1995,0.1505] ] +,[ [0.1485,0.1899], [0.1995,0.1755] ] +,[ [0.1435,0.209], [0.1995,0.1995] ] +,[ [0.1386,0.2296], [0.1995,0.2246] ] +,[ [0.1336,0.2501], [0.1995,0.2497] ] +,[ [0.1286,0.2722], [0.1995,0.2748] ] +,[ [0.1237,0.2942], [0.1995,0.3] ] +,[ [0.1204,0.3178], [0.1995,0.3252] ] +,[ [0.1154,0.3427], [0.1995,0.3496] ] +,[ [0.1121,0.3671], [0.1995,0.3751] ] +,[ [0.1088,0.3929], [0.1995,0.4] ] +,[ [0.1071,0.419], [0.1995,0.425] ] +,[ [0.1055,0.4458], [0.1995,0.45] ] +,[ [0.1038,0.4728], [0.1995,0.475] ] +,[ [0.1038,0.5], [0.1995,0.5] ] +,[ [0.1038,0.5272], [0.1995,0.525] ] +,[ [0.1055,0.5542], [0.1995,0.55] ] +,[ [0.1071,0.581], [0.1995,0.575] ] +,[ [0.1088,0.6071], [0.1995,0.6] ] +,[ [0.1121,0.6329], [0.1995,0.6249] ] +,[ [0.1154,0.6573], [0.1995,0.6504] ] +,[ [0.1204,0.6822], [0.1995,0.6748] ] +,[ [0.1237,0.7058], [0.1995,0.7] ] +,[ [0.1286,0.7278], [0.1995,0.7252] ] +,[ [0.1336,0.7499], [0.1995,0.7503] ] +,[ [0.1386,0.7704], [0.1995,0.7754] ] +,[ [0.1435,0.791], [0.1995,0.8005] ] +,[ [0.1485,0.8101], [0.1995,0.8245] ] +,[ [0.1534,0.8307], [0.1995,0.8495] ] +,[ [0.1567,0.8483], [0.1995,0.8745] ] +,[ [0.1617,0.866], [0.1995,0.8994] ] +,[ [0.1667,0.8836], [0.1995,0.9257] ] +,[ [0.1402,0.1384], [0.1755,0.1006] ] +,[ [0.1353,0.1561], [0.1755,0.1255] ] +,[ [0.1303,0.1737], [0.1755,0.1505] ] +,[ [0.1253,0.1928], [0.1755,0.1755] ] +,[ [0.122,0.2134], [0.1755,0.1995] ] +,[ [0.1171,0.234], [0.1755,0.2246] ] +,[ [0.1121,0.2546], [0.1755,0.2497] ] +,[ [0.1071,0.2766], [0.1755,0.2748] ] +,[ [0.1022,0.2986], [0.1755,0.3] ] +,[ [0.09888,0.3222], [0.1755,0.3252] ] +,[ [0.09392,0.3457], [0.1755,0.3496] ] +,[ [0.09061,0.3701], [0.1755,0.3751] ] +,[ [0.0873,0.3952], [0.1755,0.4] ] +,[ [0.08565,0.4209], [0.1755,0.425] ] +,[ [0.08399,0.4471], [0.1755,0.45] ] +,[ [0.08234,0.4734], [0.1755,0.475] ] +,[ [0.08234,0.5], [0.1755,0.5] ] +,[ [0.08234,0.5266], [0.1755,0.525] ] +,[ [0.08399,0.5529], [0.1755,0.55] ] +,[ [0.08565,0.5791], [0.1755,0.575] ] +,[ [0.0873,0.6048], [0.1755,0.6] ] +,[ [0.09061,0.6299], [0.1755,0.6249] ] +,[ [0.09392,0.6543], [0.1755,0.6504] ] +,[ [0.09888,0.6778], [0.1755,0.6748] ] +,[ [0.1022,0.7014], [0.1755,0.7] ] +,[ [0.1071,0.7234], [0.1755,0.7252] ] +,[ [0.1121,0.7454], [0.1755,0.7503] ] +,[ [0.1171,0.766], [0.1755,0.7754] ] +,[ [0.122,0.7866], [0.1755,0.8005] ] +,[ [0.1253,0.8072], [0.1755,0.8245] ] +,[ [0.1303,0.8263], [0.1755,0.8495] ] +,[ [0.1353,0.8439], [0.1755,0.8745] ] +,[ [0.1402,0.8616], [0.1755,0.8994] ] +,[ [0.1138,0.1605], [0.1505,0.1255] ] +,[ [0.1088,0.1781], [0.1505,0.1505] ] +,[ [0.1038,0.1972], [0.1505,0.1755] ] +,[ [0.09888,0.2178], [0.1505,0.1995] ] +,[ [0.09557,0.2384], [0.1505,0.2246] ] +,[ [0.09061,0.259], [0.1505,0.2497] ] +,[ [0.0873,0.281], [0.1505,0.2748] ] +,[ [0.08234,0.3031], [0.1505,0.3] ] +,[ [0.07903,0.3251], [0.1505,0.3252] ] +,[ [0.07407,0.3486], [0.1505,0.3496] ] +,[ [0.07077,0.373], [0.1505,0.3751] ] +,[ [0.06746,0.3977], [0.1505,0.4] ] +,[ [0.06581,0.4228], [0.1505,0.425] ] +,[ [0.06415,0.4483], [0.1505,0.45] ] +,[ [0.0625,0.4741], [0.1505,0.475] ] +,[ [0.0625,0.5], [0.1505,0.5] ] +,[ [0.0625,0.5259], [0.1505,0.525] ] +,[ [0.06415,0.5517], [0.1505,0.55] ] +,[ [0.06581,0.5772], [0.1505,0.575] ] +,[ [0.06746,0.6023], [0.1505,0.6] ] +,[ [0.07077,0.627], [0.1505,0.6249] ] +,[ [0.07407,0.6514], [0.1505,0.6504] ] +,[ [0.07903,0.6749], [0.1505,0.6748] ] +,[ [0.08234,0.6969], [0.1505,0.7] ] +,[ [0.0873,0.719], [0.1505,0.7252] ] +,[ [0.09061,0.741], [0.1505,0.7503] ] +,[ [0.09557,0.7616], [0.1505,0.7754] ] +,[ [0.09888,0.7822], [0.1505,0.8005] ] +,[ [0.1038,0.8028], [0.1505,0.8245] ] +,[ [0.1088,0.8219], [0.1505,0.8495] ] +,[ [0.1138,0.8395], [0.1505,0.8745] ] +,[ [0.09557,0.1664], [0.1255,0.1255] ] +,[ [0.08896,0.1825], [0.1255,0.1505] ] +,[ [0.08399,0.2016], [0.1255,0.1755] ] +,[ [0.07903,0.2208], [0.1255,0.1995] ] +,[ [0.07407,0.2413], [0.1255,0.2246] ] +,[ [0.07077,0.2619], [0.1255,0.2497] ] +,[ [0.06581,0.284], [0.1255,0.2748] ] +,[ [0.0625,0.306], [0.1255,0.3] ] +,[ [0.05919,0.3295], [0.1255,0.3252] ] +,[ [0.05423,0.3516], [0.1255,0.3496] ] +,[ [0.05093,0.3758], [0.1255,0.3751] ] +,[ [0.04927,0.3999], [0.1255,0.4] ] +,[ [0.04597,0.4246], [0.1255,0.425] ] +,[ [0.04431,0.4496], [0.1255,0.45] ] +,[ [0.04431,0.4747], [0.1255,0.475] ] +,[ [0.04431,0.5], [0.1255,0.5] ] +,[ [0.04431,0.5253], [0.1255,0.525] ] +,[ [0.04431,0.5504], [0.1255,0.55] ] +,[ [0.04597,0.5754], [0.1255,0.575] ] +,[ [0.04927,0.6001], [0.1255,0.6] ] +,[ [0.05093,0.6242], [0.1255,0.6249] ] +,[ [0.05423,0.6484], [0.1255,0.6504] ] +,[ [0.05919,0.6705], [0.1255,0.6748] ] +,[ [0.0625,0.694], [0.1255,0.7] ] +,[ [0.06581,0.716], [0.1255,0.7252] ] +,[ [0.07077,0.7381], [0.1255,0.7503] ] +,[ [0.07407,0.7587], [0.1255,0.7754] ] +,[ [0.07903,0.7792], [0.1255,0.8005] ] +,[ [0.08399,0.7984], [0.1255,0.8245] ] +,[ [0.08896,0.8175], [0.1255,0.8495] ] +,[ [0.09557,0.8336], [0.1255,0.8745] ] +,[ [0.07242,0.1899], [0.1006,0.1505] ] +,[ [0.06415,0.2061], [0.1006,0.1755] ] +,[ [0.05919,0.2252], [0.1006,0.1995] ] +,[ [0.05423,0.2457], [0.1006,0.2246] ] +,[ [0.04927,0.2663], [0.1006,0.2497] ] +,[ [0.04597,0.2869], [0.1006,0.2748] ] +,[ [0.04266,0.3089], [0.1006,0.3] ] +,[ [0.03935,0.3325], [0.1006,0.3252] ] +,[ [0.03604,0.3549], [0.1006,0.3496] ] +,[ [0.03274,0.3783], [0.1006,0.3751] ] +,[ [0.03108,0.4021], [0.1006,0.4] ] +,[ [0.02778,0.4262], [0.1006,0.425] ] +,[ [0.02612,0.4506], [0.1006,0.45] ] +,[ [0.02612,0.4753], [0.1006,0.475] ] +,[ [0.02612,0.5], [0.1006,0.5] ] +,[ [0.02612,0.5247], [0.1006,0.525] ] +,[ [0.02612,0.5494], [0.1006,0.55] ] +,[ [0.02778,0.5738], [0.1006,0.575] ] +,[ [0.03108,0.5979], [0.1006,0.6] ] +,[ [0.03274,0.6217], [0.1006,0.6249] ] +,[ [0.03604,0.6451], [0.1006,0.6504] ] +,[ [0.03935,0.6675], [0.1006,0.6748] ] +,[ [0.04266,0.6911], [0.1006,0.7] ] +,[ [0.04597,0.7131], [0.1006,0.7252] ] +,[ [0.04927,0.7337], [0.1006,0.7503] ] +,[ [0.05423,0.7543], [0.1006,0.7754] ] +,[ [0.05919,0.7748], [0.1006,0.8005] ] +,[ [0.06415,0.7939], [0.1006,0.8245] ] +,[ [0.07242,0.8101], [0.1006,0.8495] ] +,[ [0.04101,0.2296], [0.07432,0.1995] ] +,[ [0.03604,0.2501], [0.07432,0.2246] ] +,[ [0.03108,0.2693], [0.07432,0.2497] ] +,[ [0.02612,0.2913], [0.07432,0.2748] ] +,[ [0.02282,0.3133], [0.07432,0.3] ] +,[ [0.01951,0.3354], [0.07432,0.3252] ] +,[ [0.0162,0.3576], [0.07432,0.3496] ] +,[ [0.01455,0.3805], [0.07432,0.3751] ] +,[ [0.01124,0.404], [0.07432,0.4] ] +,[ [0.00959,0.4277], [0.07432,0.425] ] +,[ [0.00959,0.4516], [0.07432,0.45] ] +,[ [0.007937,0.4757], [0.07432,0.475] ] +,[ [0.007937,0.5], [0.07432,0.5] ] +,[ [0.007937,0.5243], [0.07432,0.525] ] +,[ [0.00959,0.5484], [0.07432,0.55] ] +,[ [0.00959,0.5723], [0.07432,0.575] ] +,[ [0.01124,0.596], [0.07432,0.6] ] +,[ [0.01455,0.6195], [0.07432,0.6249] ] +,[ [0.0162,0.6424], [0.07432,0.6504] ] +,[ [0.01951,0.6646], [0.07432,0.6748] ] +,[ [0.02282,0.6867], [0.07432,0.7] ] +,[ [0.02612,0.7087], [0.07432,0.7252] ] +,[ [0.03108,0.7307], [0.07432,0.7503] ] +,[ [0.03604,0.7499], [0.07432,0.7754] ] +,[ [0.04101,0.7704], [0.07432,0.8005] ] +,[ [0.01951,0.2546], [0.04974,0.2246] ] +,[ [0.0129,0.2737], [0.04974,0.2497] ] +,[ [0.007937,0.2942], [0.04974,0.2748] ] +,[ [0.00463,0.3163], [0.04974,0.3] ] +,[ [0.001323,0.3383], [0.04974,0.3252] ] +,[ [-0.001984,0.3599], [0.04974,0.3496] ] +,[ [-0.003638,0.3827], [0.04974,0.3751] ] +,[ [-0.006944,0.4058], [0.04974,0.4] ] +,[ [-0.008598,0.429], [0.04974,0.425] ] +,[ [-0.008598,0.4525], [0.04974,0.45] ] +,[ [-0.01025,0.4762], [0.04974,0.475] ] +,[ [-0.01025,0.5], [0.04974,0.5] ] +,[ [-0.01025,0.5238], [0.04974,0.525] ] +,[ [-0.008598,0.5475], [0.04974,0.55] ] +,[ [-0.008598,0.571], [0.04974,0.575] ] +,[ [-0.006944,0.5942], [0.04974,0.6] ] +,[ [-0.003638,0.6173], [0.04974,0.6249] ] +,[ [-0.001984,0.6401], [0.04974,0.6504] ] +,[ [0.001323,0.6617], [0.04974,0.6748] ] +,[ [0.00463,0.6837], [0.04974,0.7] ] +,[ [0.007937,0.7058], [0.04974,0.7252] ] +,[ [0.0129,0.7263], [0.04974,0.7503] ] +,[ [0.01951,0.7454], [0.04974,0.7754] ] +,[ [-0.006944,0.2986], [0.02551,0.2748] ] +,[ [-0.0119,0.3192], [0.02551,0.3] ] +,[ [-0.01521,0.3413], [0.02551,0.3252] ] +,[ [-0.01852,0.3624], [0.02551,0.3496] ] +,[ [-0.02183,0.3848], [0.02551,0.3751] ] +,[ [-0.02348,0.4074], [0.02551,0.4] ] +,[ [-0.02513,0.4303], [0.02551,0.425] ] +,[ [-0.02679,0.4534], [0.02551,0.45] ] +,[ [-0.02679,0.4766], [0.02551,0.475] ] +,[ [-0.02844,0.5], [0.02551,0.5] ] +,[ [-0.02679,0.5234], [0.02551,0.525] ] +,[ [-0.02679,0.5466], [0.02551,0.55] ] +,[ [-0.02513,0.5697], [0.02551,0.575] ] +,[ [-0.02348,0.5926], [0.02551,0.6] ] +,[ [-0.02183,0.6152], [0.02551,0.6249] ] +,[ [-0.01852,0.6376], [0.02551,0.6504] ] +,[ [-0.01521,0.6587], [0.02551,0.6748] ] +,[ [-0.0119,0.6808], [0.02551,0.7] ] +,[ [-0.006944,0.7014], [0.02551,0.7252] ] +,[ [-0.02183,0.3251], [0,0.3] ] +,[ [-0.02844,0.3442], [0,0.3252] ] +,[ [-0.0334,0.3654], [0,0.3496] ] +,[ [-0.03671,0.3871], [0,0.3751] ] +,[ [-0.04001,0.4092], [0,0.4] ] +,[ [-0.04167,0.4317], [0,0.425] ] +,[ [-0.04332,0.4543], [0,0.45] ] +,[ [-0.04332,0.4771], [0,0.475] ] +,[ [-0.04332,0.5], [0,0.5] ] +,[ [-0.04332,0.5229], [0,0.525] ] +,[ [-0.04332,0.5457], [0,0.55] ] +,[ [-0.04167,0.5683], [0,0.575] ] +,[ [-0.04001,0.5908], [0,0.6] ] +,[ [-0.03671,0.6129], [0,0.6249] ] +,[ [-0.0334,0.6346], [0,0.6504] ] +,[ [-0.02844,0.6558], [0,0.6748] ] +,[ [-0.02183,0.6749], [0,0.7] ] +] +, +[ + [ [0.03638,0.3251], [0,0.3] ] +,[ [0.02976,0.3442], [0,0.3252] ] +,[ [0.0248,0.3654], [0,0.3496] ] +,[ [0.02149,0.3871], [0,0.3751] ] +,[ [0.01819,0.4092], [0,0.4] ] +,[ [0.01653,0.4317], [0,0.425] ] +,[ [0.01488,0.4543], [0,0.45] ] +,[ [0.01488,0.4771], [0,0.475] ] +,[ [0.01488,0.5], [0,0.5] ] +,[ [0.01488,0.5229], [0,0.525] ] +,[ [0.01488,0.5457], [0,0.55] ] +,[ [0.01653,0.5683], [0,0.575] ] +,[ [0.01819,0.5908], [0,0.6] ] +,[ [0.02149,0.6129], [0,0.6249] ] +,[ [0.0248,0.6346], [0,0.6504] ] +,[ [0.02976,0.6558], [0,0.6748] ] +,[ [0.03638,0.6749], [0,0.7] ] +,[ [0.05126,0.2986], [0.02551,0.2748] ] +,[ [0.0463,0.3192], [0.02551,0.3] ] +,[ [0.04299,0.3413], [0.02551,0.3252] ] +,[ [0.03968,0.3624], [0.02551,0.3496] ] +,[ [0.03638,0.3848], [0.02551,0.3751] ] +,[ [0.03472,0.4074], [0.02551,0.4] ] +,[ [0.03307,0.4303], [0.02551,0.425] ] +,[ [0.03142,0.4534], [0.02551,0.45] ] +,[ [0.03142,0.4766], [0.02551,0.475] ] +,[ [0.02976,0.5], [0.02551,0.5] ] +,[ [0.03142,0.5234], [0.02551,0.525] ] +,[ [0.03142,0.5466], [0.02551,0.55] ] +,[ [0.03307,0.5697], [0.02551,0.575] ] +,[ [0.03472,0.5926], [0.02551,0.6] ] +,[ [0.03638,0.6152], [0.02551,0.6249] ] +,[ [0.03968,0.6376], [0.02551,0.6504] ] +,[ [0.04299,0.6587], [0.02551,0.6748] ] +,[ [0.0463,0.6808], [0.02551,0.7] ] +,[ [0.05126,0.7014], [0.02551,0.7252] ] +,[ [0.07771,0.2546], [0.04974,0.2246] ] +,[ [0.0711,0.2737], [0.04974,0.2497] ] +,[ [0.06614,0.2942], [0.04974,0.2748] ] +,[ [0.06283,0.3163], [0.04974,0.3] ] +,[ [0.05952,0.3383], [0.04974,0.3252] ] +,[ [0.05622,0.3599], [0.04974,0.3496] ] +,[ [0.05456,0.3827], [0.04974,0.3751] ] +,[ [0.05126,0.4058], [0.04974,0.4] ] +,[ [0.0496,0.429], [0.04974,0.425] ] +,[ [0.0496,0.4525], [0.04974,0.45] ] +,[ [0.04795,0.4762], [0.04974,0.475] ] +,[ [0.04795,0.5], [0.04974,0.5] ] +,[ [0.04795,0.5238], [0.04974,0.525] ] +,[ [0.0496,0.5475], [0.04974,0.55] ] +,[ [0.0496,0.571], [0.04974,0.575] ] +,[ [0.05126,0.5942], [0.04974,0.6] ] +,[ [0.05456,0.6173], [0.04974,0.6249] ] +,[ [0.05622,0.6401], [0.04974,0.6504] ] +,[ [0.05952,0.6617], [0.04974,0.6748] ] +,[ [0.06283,0.6837], [0.04974,0.7] ] +,[ [0.06614,0.7058], [0.04974,0.7252] ] +,[ [0.0711,0.7263], [0.04974,0.7503] ] +,[ [0.07771,0.7454], [0.04974,0.7754] ] +,[ [0.09921,0.2296], [0.07432,0.1995] ] +,[ [0.09425,0.2501], [0.07432,0.2246] ] +,[ [0.08929,0.2693], [0.07432,0.2497] ] +,[ [0.08433,0.2913], [0.07432,0.2748] ] +,[ [0.08102,0.3133], [0.07432,0.3] ] +,[ [0.07771,0.3354], [0.07432,0.3252] ] +,[ [0.0744,0.3576], [0.07432,0.3496] ] +,[ [0.07275,0.3805], [0.07432,0.3751] ] +,[ [0.06944,0.404], [0.07432,0.4] ] +,[ [0.06779,0.4277], [0.07432,0.425] ] +,[ [0.06779,0.4516], [0.07432,0.45] ] +,[ [0.06614,0.4757], [0.07432,0.475] ] +,[ [0.06614,0.5], [0.07432,0.5] ] +,[ [0.06614,0.5243], [0.07432,0.525] ] +,[ [0.06779,0.5484], [0.07432,0.55] ] +,[ [0.06779,0.5723], [0.07432,0.575] ] +,[ [0.06944,0.596], [0.07432,0.6] ] +,[ [0.07275,0.6195], [0.07432,0.6249] ] +,[ [0.0744,0.6424], [0.07432,0.6504] ] +,[ [0.07771,0.6646], [0.07432,0.6748] ] +,[ [0.08102,0.6867], [0.07432,0.7] ] +,[ [0.08433,0.7087], [0.07432,0.7252] ] +,[ [0.08929,0.7307], [0.07432,0.7503] ] +,[ [0.09425,0.7499], [0.07432,0.7754] ] +,[ [0.09921,0.7704], [0.07432,0.8005] ] +,[ [0.1306,0.1899], [0.1006,0.1505] ] +,[ [0.1224,0.2061], [0.1006,0.1755] ] +,[ [0.1174,0.2252], [0.1006,0.1995] ] +,[ [0.1124,0.2457], [0.1006,0.2246] ] +,[ [0.1075,0.2663], [0.1006,0.2497] ] +,[ [0.1042,0.2869], [0.1006,0.2748] ] +,[ [0.1009,0.3089], [0.1006,0.3] ] +,[ [0.09755,0.3325], [0.1006,0.3252] ] +,[ [0.09425,0.3549], [0.1006,0.3496] ] +,[ [0.09094,0.3783], [0.1006,0.3751] ] +,[ [0.08929,0.4021], [0.1006,0.4] ] +,[ [0.08598,0.4262], [0.1006,0.425] ] +,[ [0.08433,0.4506], [0.1006,0.45] ] +,[ [0.08433,0.4753], [0.1006,0.475] ] +,[ [0.08433,0.5], [0.1006,0.5] ] +,[ [0.08433,0.5247], [0.1006,0.525] ] +,[ [0.08433,0.5494], [0.1006,0.55] ] +,[ [0.08598,0.5738], [0.1006,0.575] ] +,[ [0.08929,0.5979], [0.1006,0.6] ] +,[ [0.09094,0.6217], [0.1006,0.6249] ] +,[ [0.09425,0.6451], [0.1006,0.6504] ] +,[ [0.09755,0.6675], [0.1006,0.6748] ] +,[ [0.1009,0.6911], [0.1006,0.7] ] +,[ [0.1042,0.7131], [0.1006,0.7252] ] +,[ [0.1075,0.7337], [0.1006,0.7503] ] +,[ [0.1124,0.7543], [0.1006,0.7754] ] +,[ [0.1174,0.7748], [0.1006,0.8005] ] +,[ [0.1224,0.7939], [0.1006,0.8245] ] +,[ [0.1306,0.8101], [0.1006,0.8495] ] +,[ [0.1538,0.1664], [0.1255,0.1255] ] +,[ [0.1472,0.1825], [0.1255,0.1505] ] +,[ [0.1422,0.2016], [0.1255,0.1755] ] +,[ [0.1372,0.2208], [0.1255,0.1995] ] +,[ [0.1323,0.2413], [0.1255,0.2246] ] +,[ [0.129,0.2619], [0.1255,0.2497] ] +,[ [0.124,0.284], [0.1255,0.2748] ] +,[ [0.1207,0.306], [0.1255,0.3] ] +,[ [0.1174,0.3295], [0.1255,0.3252] ] +,[ [0.1124,0.3516], [0.1255,0.3496] ] +,[ [0.1091,0.3758], [0.1255,0.3751] ] +,[ [0.1075,0.3999], [0.1255,0.4] ] +,[ [0.1042,0.4246], [0.1255,0.425] ] +,[ [0.1025,0.4496], [0.1255,0.45] ] +,[ [0.1025,0.4747], [0.1255,0.475] ] +,[ [0.1025,0.5], [0.1255,0.5] ] +,[ [0.1025,0.5253], [0.1255,0.525] ] +,[ [0.1025,0.5504], [0.1255,0.55] ] +,[ [0.1042,0.5754], [0.1255,0.575] ] +,[ [0.1075,0.6001], [0.1255,0.6] ] +,[ [0.1091,0.6242], [0.1255,0.6249] ] +,[ [0.1124,0.6484], [0.1255,0.6504] ] +,[ [0.1174,0.6705], [0.1255,0.6748] ] +,[ [0.1207,0.694], [0.1255,0.7] ] +,[ [0.124,0.716], [0.1255,0.7252] ] +,[ [0.129,0.7381], [0.1255,0.7503] ] +,[ [0.1323,0.7587], [0.1255,0.7754] ] +,[ [0.1372,0.7792], [0.1255,0.8005] ] +,[ [0.1422,0.7984], [0.1255,0.8245] ] +,[ [0.1472,0.8175], [0.1255,0.8495] ] +,[ [0.1538,0.8336], [0.1255,0.8745] ] +,[ [0.172,0.1605], [0.1505,0.1255] ] +,[ [0.167,0.1781], [0.1505,0.1505] ] +,[ [0.162,0.1972], [0.1505,0.1755] ] +,[ [0.1571,0.2178], [0.1505,0.1995] ] +,[ [0.1538,0.2384], [0.1505,0.2246] ] +,[ [0.1488,0.259], [0.1505,0.2497] ] +,[ [0.1455,0.281], [0.1505,0.2748] ] +,[ [0.1405,0.3031], [0.1505,0.3] ] +,[ [0.1372,0.3251], [0.1505,0.3252] ] +,[ [0.1323,0.3486], [0.1505,0.3496] ] +,[ [0.129,0.373], [0.1505,0.3751] ] +,[ [0.1257,0.3977], [0.1505,0.4] ] +,[ [0.124,0.4228], [0.1505,0.425] ] +,[ [0.1224,0.4483], [0.1505,0.45] ] +,[ [0.1207,0.4741], [0.1505,0.475] ] +,[ [0.1207,0.5], [0.1505,0.5] ] +,[ [0.1207,0.5259], [0.1505,0.525] ] +,[ [0.1224,0.5517], [0.1505,0.55] ] +,[ [0.124,0.5772], [0.1505,0.575] ] +,[ [0.1257,0.6023], [0.1505,0.6] ] +,[ [0.129,0.627], [0.1505,0.6249] ] +,[ [0.1323,0.6514], [0.1505,0.6504] ] +,[ [0.1372,0.6749], [0.1505,0.6748] ] +,[ [0.1405,0.6969], [0.1505,0.7] ] +,[ [0.1455,0.719], [0.1505,0.7252] ] +,[ [0.1488,0.741], [0.1505,0.7503] ] +,[ [0.1538,0.7616], [0.1505,0.7754] ] +,[ [0.1571,0.7822], [0.1505,0.8005] ] +,[ [0.162,0.8028], [0.1505,0.8245] ] +,[ [0.167,0.8219], [0.1505,0.8495] ] +,[ [0.172,0.8395], [0.1505,0.8745] ] +,[ [0.1984,0.1384], [0.1755,0.1006] ] +,[ [0.1935,0.1561], [0.1755,0.1255] ] +,[ [0.1885,0.1737], [0.1755,0.1505] ] +,[ [0.1835,0.1928], [0.1755,0.1755] ] +,[ [0.1802,0.2134], [0.1755,0.1995] ] +,[ [0.1753,0.234], [0.1755,0.2246] ] +,[ [0.1703,0.2546], [0.1755,0.2497] ] +,[ [0.1653,0.2766], [0.1755,0.2748] ] +,[ [0.1604,0.2986], [0.1755,0.3] ] +,[ [0.1571,0.3222], [0.1755,0.3252] ] +,[ [0.1521,0.3457], [0.1755,0.3496] ] +,[ [0.1488,0.3701], [0.1755,0.3751] ] +,[ [0.1455,0.3952], [0.1755,0.4] ] +,[ [0.1438,0.4209], [0.1755,0.425] ] +,[ [0.1422,0.4471], [0.1755,0.45] ] +,[ [0.1405,0.4734], [0.1755,0.475] ] +,[ [0.1405,0.5], [0.1755,0.5] ] +,[ [0.1405,0.5266], [0.1755,0.525] ] +,[ [0.1422,0.5529], [0.1755,0.55] ] +,[ [0.1438,0.5791], [0.1755,0.575] ] +,[ [0.1455,0.6048], [0.1755,0.6] ] +,[ [0.1488,0.6299], [0.1755,0.6249] ] +,[ [0.1521,0.6543], [0.1755,0.6504] ] +,[ [0.1571,0.6778], [0.1755,0.6748] ] +,[ [0.1604,0.7014], [0.1755,0.7] ] +,[ [0.1653,0.7234], [0.1755,0.7252] ] +,[ [0.1703,0.7454], [0.1755,0.7503] ] +,[ [0.1753,0.766], [0.1755,0.7754] ] +,[ [0.1802,0.7866], [0.1755,0.8005] ] +,[ [0.1835,0.8072], [0.1755,0.8245] ] +,[ [0.1885,0.8263], [0.1755,0.8495] ] +,[ [0.1935,0.8439], [0.1755,0.8745] ] +,[ [0.1984,0.8616], [0.1755,0.8994] ] +,[ [0.2249,0.1164], [0.1995,0.07432] ] +,[ [0.2199,0.134], [0.1995,0.1006] ] +,[ [0.2149,0.1517], [0.1995,0.1255] ] +,[ [0.2116,0.1693], [0.1995,0.1505] ] +,[ [0.2067,0.1899], [0.1995,0.1755] ] +,[ [0.2017,0.209], [0.1995,0.1995] ] +,[ [0.1968,0.2296], [0.1995,0.2246] ] +,[ [0.1918,0.2501], [0.1995,0.2497] ] +,[ [0.1868,0.2722], [0.1995,0.2748] ] +,[ [0.1819,0.2942], [0.1995,0.3] ] +,[ [0.1786,0.3178], [0.1995,0.3252] ] +,[ [0.1736,0.3427], [0.1995,0.3496] ] +,[ [0.1703,0.3671], [0.1995,0.3751] ] +,[ [0.167,0.3929], [0.1995,0.4] ] +,[ [0.1653,0.419], [0.1995,0.425] ] +,[ [0.1637,0.4458], [0.1995,0.45] ] +,[ [0.162,0.4728], [0.1995,0.475] ] +,[ [0.162,0.5], [0.1995,0.5] ] +,[ [0.162,0.5272], [0.1995,0.525] ] +,[ [0.1637,0.5542], [0.1995,0.55] ] +,[ [0.1653,0.581], [0.1995,0.575] ] +,[ [0.167,0.6071], [0.1995,0.6] ] +,[ [0.1703,0.6329], [0.1995,0.6249] ] +,[ [0.1736,0.6573], [0.1995,0.6504] ] +,[ [0.1786,0.6822], [0.1995,0.6748] ] +,[ [0.1819,0.7058], [0.1995,0.7] ] +,[ [0.1868,0.7278], [0.1995,0.7252] ] +,[ [0.1918,0.7499], [0.1995,0.7503] ] +,[ [0.1968,0.7704], [0.1995,0.7754] ] +,[ [0.2017,0.791], [0.1995,0.8005] ] +,[ [0.2067,0.8101], [0.1995,0.8245] ] +,[ [0.2116,0.8307], [0.1995,0.8495] ] +,[ [0.2149,0.8483], [0.1995,0.8745] ] +,[ [0.2199,0.866], [0.1995,0.8994] ] +,[ [0.2249,0.8836], [0.1995,0.9257] ] +,[ [0.248,0.112], [0.2246,0.07432] ] +,[ [0.2431,0.1296], [0.2246,0.1006] ] +,[ [0.2381,0.1473], [0.2246,0.1255] ] +,[ [0.2348,0.1664], [0.2246,0.1505] ] +,[ [0.2298,0.1855], [0.2246,0.1755] ] +,[ [0.2249,0.2046], [0.2246,0.1995] ] +,[ [0.2199,0.2252], [0.2246,0.2246] ] +,[ [0.2149,0.2457], [0.2246,0.2497] ] +,[ [0.21,0.2678], [0.2246,0.2748] ] +,[ [0.205,0.2898], [0.2246,0.3] ] +,[ [0.2001,0.3148], [0.2246,0.3252] ] +,[ [0.1968,0.3383], [0.2246,0.3496] ] +,[ [0.1935,0.3642], [0.2246,0.3751] ] +,[ [0.1901,0.3905], [0.2246,0.4] ] +,[ [0.1885,0.4173], [0.2246,0.425] ] +,[ [0.1868,0.4446], [0.2246,0.45] ] +,[ [0.1852,0.4722], [0.2246,0.475] ] +,[ [0.1852,0.5], [0.2246,0.5] ] +,[ [0.1852,0.5278], [0.2246,0.525] ] +,[ [0.1868,0.5554], [0.2246,0.55] ] +,[ [0.1885,0.5827], [0.2246,0.575] ] +,[ [0.1901,0.6095], [0.2246,0.6] ] +,[ [0.1935,0.6358], [0.2246,0.6249] ] +,[ [0.1968,0.6617], [0.2246,0.6504] ] +,[ [0.2001,0.6852], [0.2246,0.6748] ] +,[ [0.205,0.7102], [0.2246,0.7] ] +,[ [0.21,0.7322], [0.2246,0.7252] ] +,[ [0.2149,0.7543], [0.2246,0.7503] ] +,[ [0.2199,0.7748], [0.2246,0.7754] ] +,[ [0.2249,0.7954], [0.2246,0.8005] ] +,[ [0.2298,0.8145], [0.2246,0.8245] ] +,[ [0.2348,0.8336], [0.2246,0.8495] ] +,[ [0.2381,0.8527], [0.2246,0.8745] ] +,[ [0.2431,0.8704], [0.2246,0.8994] ] +,[ [0.248,0.888], [0.2246,0.9257] ] +,[ [0.2695,0.1091], [0.2497,0.07432] ] +,[ [0.2662,0.1252], [0.2497,0.1006] ] +,[ [0.2612,0.1443], [0.2497,0.1255] ] +,[ [0.2579,0.162], [0.2497,0.1505] ] +,[ [0.253,0.1811], [0.2497,0.1755] ] +,[ [0.248,0.2002], [0.2497,0.1995] ] +,[ [0.2431,0.2208], [0.2497,0.2246] ] +,[ [0.2381,0.2413], [0.2497,0.2497] ] +,[ [0.2331,0.2634], [0.2497,0.2748] ] +,[ [0.2282,0.2869], [0.2497,0.3] ] +,[ [0.2249,0.3104], [0.2497,0.3252] ] +,[ [0.2216,0.3354], [0.2497,0.3496] ] +,[ [0.2183,0.3616], [0.2497,0.3751] ] +,[ [0.2149,0.3883], [0.2497,0.4] ] +,[ [0.2133,0.4156], [0.2497,0.425] ] +,[ [0.2116,0.4434], [0.2497,0.45] ] +,[ [0.21,0.4716], [0.2497,0.475] ] +,[ [0.21,0.5], [0.2497,0.5] ] +,[ [0.21,0.5284], [0.2497,0.525] ] +,[ [0.2116,0.5566], [0.2497,0.55] ] +,[ [0.2133,0.5844], [0.2497,0.575] ] +,[ [0.2149,0.6117], [0.2497,0.6] ] +,[ [0.2183,0.6384], [0.2497,0.6249] ] +,[ [0.2216,0.6646], [0.2497,0.6504] ] +,[ [0.2249,0.6896], [0.2497,0.6748] ] +,[ [0.2282,0.7131], [0.2497,0.7] ] +,[ [0.2331,0.7366], [0.2497,0.7252] ] +,[ [0.2381,0.7587], [0.2497,0.7503] ] +,[ [0.2431,0.7792], [0.2497,0.7754] ] +,[ [0.248,0.7998], [0.2497,0.8005] ] +,[ [0.253,0.8189], [0.2497,0.8245] ] +,[ [0.2579,0.838], [0.2497,0.8495] ] +,[ [0.2612,0.8557], [0.2497,0.8745] ] +,[ [0.2662,0.8748], [0.2497,0.8994] ] +,[ [0.2695,0.8909], [0.2497,0.9257] ] +,[ [0.2745,0.9071], [0.2497,0.9503] ] +,[ [0.2794,0.9203], [0.2497,0.9745] ] +,[ [0.2894,0.9262], [0.2497,1] ] +,[ [0.3092,0.06349], [0.2748,0] ] +,[ [0.3026,0.07378], [0.2748,0.02551] ] +,[ [0.2976,0.08848], [0.2748,0.04974] ] +,[ [0.2943,0.1046], [0.2748,0.07432] ] +,[ [0.2894,0.1223], [0.2748,0.1006] ] +,[ [0.286,0.1399], [0.2748,0.1255] ] +,[ [0.2827,0.159], [0.2748,0.1505] ] +,[ [0.2778,0.1767], [0.2748,0.1755] ] +,[ [0.2728,0.1958], [0.2748,0.1995] ] +,[ [0.2679,0.2163], [0.2748,0.2246] ] +,[ [0.2629,0.2369], [0.2748,0.2497] ] +,[ [0.2579,0.259], [0.2748,0.2748] ] +,[ [0.2546,0.2825], [0.2748,0.3] ] +,[ [0.2497,0.3075], [0.2748,0.3252] ] +,[ [0.2464,0.3325], [0.2748,0.3496] ] +,[ [0.2431,0.3591], [0.2748,0.3751] ] +,[ [0.2414,0.3861], [0.2748,0.4] ] +,[ [0.2381,0.4139], [0.2748,0.425] ] +,[ [0.2364,0.4422], [0.2748,0.45] ] +,[ [0.2364,0.471], [0.2748,0.475] ] +,[ [0.2348,0.5], [0.2748,0.5] ] +,[ [0.2364,0.529], [0.2748,0.525] ] +,[ [0.2364,0.5578], [0.2748,0.55] ] +,[ [0.2381,0.5861], [0.2748,0.575] ] +,[ [0.2414,0.6139], [0.2748,0.6] ] +,[ [0.2431,0.6409], [0.2748,0.6249] ] +,[ [0.2464,0.6675], [0.2748,0.6504] ] +,[ [0.2497,0.6925], [0.2748,0.6748] ] +,[ [0.2546,0.7175], [0.2748,0.7] ] +,[ [0.2579,0.741], [0.2748,0.7252] ] +,[ [0.2629,0.7631], [0.2748,0.7503] ] +,[ [0.2679,0.7837], [0.2748,0.7754] ] +,[ [0.2728,0.8042], [0.2748,0.8005] ] +,[ [0.2778,0.8233], [0.2748,0.8245] ] +,[ [0.2827,0.841], [0.2748,0.8495] ] +,[ [0.286,0.8601], [0.2748,0.8745] ] +,[ [0.2894,0.8777], [0.2748,0.8994] ] +,[ [0.2943,0.8954], [0.2748,0.9257] ] +,[ [0.2976,0.9115], [0.2748,0.9503] ] +,[ [0.3026,0.9262], [0.2748,0.9745] ] +,[ [0.3092,0.9365], [0.2748,1] ] +,[ [0.3307,0.05761], [0.3,0] ] +,[ [0.3257,0.06937], [0.3,0.02551] ] +,[ [0.3224,0.08554], [0.3,0.04974] ] +,[ [0.3191,0.1017], [0.3,0.07432] ] +,[ [0.3142,0.1193], [0.3,0.1006] ] +,[ [0.3108,0.137], [0.3,0.1255] ] +,[ [0.3075,0.1546], [0.3,0.1505] ] +,[ [0.3026,0.1723], [0.3,0.1755] ] +,[ [0.2976,0.1914], [0.3,0.1995] ] +,[ [0.2927,0.2119], [0.3,0.2246] ] +,[ [0.2894,0.2325], [0.3,0.2497] ] +,[ [0.2844,0.256], [0.3,0.2748] ] +,[ [0.2811,0.2795], [0.3,0.3] ] +,[ [0.2778,0.3045], [0.3,0.3252] ] +,[ [0.2745,0.3295], [0.3,0.3496] ] +,[ [0.2712,0.3564], [0.3,0.3751] ] +,[ [0.2679,0.3839], [0.3,0.4] ] +,[ [0.2646,0.4121], [0.3,0.425] ] +,[ [0.2629,0.4411], [0.3,0.45] ] +,[ [0.2629,0.4703], [0.3,0.475] ] +,[ [0.2629,0.5], [0.3,0.5] ] +,[ [0.2629,0.5297], [0.3,0.525] ] +,[ [0.2629,0.5589], [0.3,0.55] ] +,[ [0.2646,0.5879], [0.3,0.575] ] +,[ [0.2679,0.6161], [0.3,0.6] ] +,[ [0.2712,0.6436], [0.3,0.6249] ] +,[ [0.2745,0.6705], [0.3,0.6504] ] +,[ [0.2778,0.6955], [0.3,0.6748] ] +,[ [0.2811,0.7205], [0.3,0.7] ] +,[ [0.2844,0.744], [0.3,0.7252] ] +,[ [0.2894,0.7675], [0.3,0.7503] ] +,[ [0.2927,0.7881], [0.3,0.7754] ] +,[ [0.2976,0.8086], [0.3,0.8005] ] +,[ [0.3026,0.8277], [0.3,0.8245] ] +,[ [0.3075,0.8454], [0.3,0.8495] ] +,[ [0.3108,0.863], [0.3,0.8745] ] +,[ [0.3142,0.8807], [0.3,0.8994] ] +,[ [0.3191,0.8983], [0.3,0.9257] ] +,[ [0.3224,0.9145], [0.3,0.9503] ] +,[ [0.3257,0.9306], [0.3,0.9745] ] +,[ [0.3307,0.9424], [0.3,1] ] +,[ [0.3538,0.0532], [0.3252,0] ] +,[ [0.3505,0.06643], [0.3252,0.02551] ] +,[ [0.3472,0.0826], [0.3252,0.04974] ] +,[ [0.3439,0.09877], [0.3252,0.07432] ] +,[ [0.3406,0.1164], [0.3252,0.1006] ] +,[ [0.3373,0.134], [0.3252,0.1255] ] +,[ [0.3323,0.1517], [0.3252,0.1505] ] +,[ [0.329,0.1693], [0.3252,0.1755] ] +,[ [0.3241,0.1884], [0.3252,0.1995] ] +,[ [0.3208,0.2075], [0.3252,0.2246] ] +,[ [0.3158,0.2296], [0.3252,0.2497] ] +,[ [0.3125,0.2516], [0.3252,0.2748] ] +,[ [0.3092,0.2766], [0.3252,0.3] ] +,[ [0.3059,0.3016], [0.3252,0.3252] ] +,[ [0.3026,0.3266], [0.3252,0.3496] ] +,[ [0.2993,0.3536], [0.3252,0.3751] ] +,[ [0.296,0.3815], [0.3252,0.4] ] +,[ [0.2943,0.4103], [0.3252,0.425] ] +,[ [0.2927,0.4399], [0.3252,0.45] ] +,[ [0.291,0.4699], [0.3252,0.475] ] +,[ [0.291,0.5], [0.3252,0.5] ] +,[ [0.291,0.5301], [0.3252,0.525] ] +,[ [0.2927,0.5601], [0.3252,0.55] ] +,[ [0.2943,0.5897], [0.3252,0.575] ] +,[ [0.296,0.6185], [0.3252,0.6] ] +,[ [0.2993,0.6464], [0.3252,0.6249] ] +,[ [0.3026,0.6734], [0.3252,0.6504] ] +,[ [0.3059,0.6984], [0.3252,0.6748] ] +,[ [0.3092,0.7234], [0.3252,0.7] ] +,[ [0.3125,0.7484], [0.3252,0.7252] ] +,[ [0.3158,0.7704], [0.3252,0.7503] ] +,[ [0.3208,0.7925], [0.3252,0.7754] ] +,[ [0.3241,0.8116], [0.3252,0.8005] ] +,[ [0.329,0.8307], [0.3252,0.8245] ] +,[ [0.3323,0.8483], [0.3252,0.8495] ] +,[ [0.3373,0.866], [0.3252,0.8745] ] +,[ [0.3406,0.8836], [0.3252,0.8994] ] +,[ [0.3439,0.9012], [0.3252,0.9257] ] +,[ [0.3472,0.9174], [0.3252,0.9503] ] +,[ [0.3505,0.9336], [0.3252,0.9745] ] +,[ [0.3538,0.9468], [0.3252,1] ] +,[ [0.3773,0.05026], [0.3496,0] ] +,[ [0.3743,0.06349], [0.3496,0.02551] ] +,[ [0.3717,0.07966], [0.3496,0.04974] ] +,[ [0.3689,0.09583], [0.3496,0.07432] ] +,[ [0.3659,0.1135], [0.3496,0.1006] ] +,[ [0.3621,0.1296], [0.3496,0.1255] ] +,[ [0.3588,0.1473], [0.3496,0.1505] ] +,[ [0.3555,0.1649], [0.3496,0.1755] ] +,[ [0.3522,0.184], [0.3496,0.1995] ] +,[ [0.3472,0.2046], [0.3496,0.2246] ] +,[ [0.3439,0.2266], [0.3496,0.2497] ] +,[ [0.3406,0.2487], [0.3496,0.2748] ] +,[ [0.3373,0.2737], [0.3496,0.3] ] +,[ [0.334,0.2986], [0.3496,0.3252] ] +,[ [0.3307,0.3236], [0.3496,0.3496] ] +,[ [0.3274,0.3516], [0.3496,0.3751] ] +,[ [0.3257,0.3796], [0.3496,0.4] ] +,[ [0.3257,0.4093], [0.3496,0.425] ] +,[ [0.3241,0.4394], [0.3496,0.45] ] +,[ [0.3241,0.4697], [0.3496,0.475] ] +,[ [0.3241,0.5], [0.3496,0.5] ] +,[ [0.3241,0.5303], [0.3496,0.525] ] +,[ [0.3241,0.5606], [0.3496,0.55] ] +,[ [0.3257,0.5907], [0.3496,0.575] ] +,[ [0.3257,0.6204], [0.3496,0.6] ] +,[ [0.3274,0.6484], [0.3496,0.6249] ] +,[ [0.3307,0.6764], [0.3496,0.6504] ] +,[ [0.334,0.7014], [0.3496,0.6748] ] +,[ [0.3373,0.7263], [0.3496,0.7] ] +,[ [0.3406,0.7513], [0.3496,0.7252] ] +,[ [0.3439,0.7734], [0.3496,0.7503] ] +,[ [0.3472,0.7954], [0.3496,0.7754] ] +,[ [0.3522,0.816], [0.3496,0.8005] ] +,[ [0.3555,0.8351], [0.3496,0.8245] ] +,[ [0.3588,0.8527], [0.3496,0.8495] ] +,[ [0.3621,0.8704], [0.3496,0.8745] ] +,[ [0.3659,0.8865], [0.3496,0.8994] ] +,[ [0.3689,0.9042], [0.3496,0.9257] ] +,[ [0.3717,0.9203], [0.3496,0.9503] ] +,[ [0.3743,0.9365], [0.3496,0.9745] ] +,[ [0.3773,0.9497], [0.3496,1] ] +,[ [0.402,0.04733], [0.3751,0] ] +,[ [0.3995,0.06202], [0.3751,0.02551] ] +,[ [0.3972,0.07819], [0.3751,0.04974] ] +,[ [0.3948,0.09436], [0.3751,0.07432] ] +,[ [0.3922,0.1105], [0.3751,0.1006] ] +,[ [0.3894,0.1267], [0.3751,0.1255] ] +,[ [0.3862,0.1443], [0.3751,0.1505] ] +,[ [0.3829,0.162], [0.3751,0.1755] ] +,[ [0.3796,0.1811], [0.3751,0.1995] ] +,[ [0.3763,0.2016], [0.3751,0.2246] ] +,[ [0.3733,0.2237], [0.3751,0.2497] ] +,[ [0.3705,0.2457], [0.3751,0.2748] ] +,[ [0.3676,0.2707], [0.3751,0.3] ] +,[ [0.3644,0.2957], [0.3751,0.3252] ] +,[ [0.3621,0.3207], [0.3751,0.3496] ] +,[ [0.3588,0.3486], [0.3751,0.3751] ] +,[ [0.3588,0.3789], [0.3751,0.4] ] +,[ [0.3588,0.4093], [0.3751,0.425] ] +,[ [0.3604,0.4399], [0.3751,0.45] ] +,[ [0.3604,0.47], [0.3751,0.475] ] +,[ [0.3604,0.5], [0.3751,0.5] ] +,[ [0.3604,0.53], [0.3751,0.525] ] +,[ [0.3604,0.5601], [0.3751,0.55] ] +,[ [0.3588,0.5907], [0.3751,0.575] ] +,[ [0.3588,0.6211], [0.3751,0.6] ] +,[ [0.3588,0.6514], [0.3751,0.6249] ] +,[ [0.3621,0.6793], [0.3751,0.6504] ] +,[ [0.3644,0.7043], [0.3751,0.6748] ] +,[ [0.3676,0.7293], [0.3751,0.7] ] +,[ [0.3705,0.7543], [0.3751,0.7252] ] +,[ [0.3733,0.7763], [0.3751,0.7503] ] +,[ [0.3763,0.7984], [0.3751,0.7754] ] +,[ [0.3796,0.8189], [0.3751,0.8005] ] +,[ [0.3829,0.838], [0.3751,0.8245] ] +,[ [0.3862,0.8557], [0.3751,0.8495] ] +,[ [0.3894,0.8733], [0.3751,0.8745] ] +,[ [0.3922,0.8895], [0.3751,0.8994] ] +,[ [0.3948,0.9056], [0.3751,0.9257] ] +,[ [0.3972,0.9218], [0.3751,0.9503] ] +,[ [0.3995,0.938], [0.3751,0.9745] ] +,[ [0.402,0.9527], [0.3751,1] ] +,[ [0.4269,0.04586], [0.4,0] ] +,[ [0.4249,0.06055], [0.4,0.02551] ] +,[ [0.4231,0.07525], [0.4,0.04974] ] +,[ [0.4211,0.09289], [0.4,0.07432] ] +,[ [0.419,0.1091], [0.4,0.1006] ] +,[ [0.4165,0.1252], [0.4,0.1255] ] +,[ [0.414,0.1414], [0.4,0.1505] ] +,[ [0.4112,0.159], [0.4,0.1755] ] +,[ [0.4086,0.1781], [0.4,0.1995] ] +,[ [0.4059,0.1987], [0.4,0.2246] ] +,[ [0.4034,0.2208], [0.4,0.2497] ] +,[ [0.401,0.2443], [0.4,0.2748] ] +,[ [0.3985,0.2678], [0.4,0.3] ] +,[ [0.3958,0.2928], [0.4,0.3252] ] +,[ [0.3937,0.3192], [0.4,0.3496] ] +,[ [0.3929,0.3486], [0.4,0.3751] ] +,[ [0.3934,0.3793], [0.4,0.4] ] +,[ [0.3945,0.4103], [0.4,0.425] ] +,[ [0.396,0.4408], [0.4,0.45] ] +,[ [0.397,0.4706], [0.4,0.475] ] +,[ [0.3973,0.5], [0.4,0.5] ] +,[ [0.397,0.5294], [0.4,0.525] ] +,[ [0.396,0.5592], [0.4,0.55] ] +,[ [0.3945,0.5897], [0.4,0.575] ] +,[ [0.3934,0.6207], [0.4,0.6] ] +,[ [0.3929,0.6514], [0.4,0.6249] ] +,[ [0.3937,0.6808], [0.4,0.6504] ] +,[ [0.3958,0.7072], [0.4,0.6748] ] +,[ [0.3985,0.7322], [0.4,0.7] ] +,[ [0.401,0.7557], [0.4,0.7252] ] +,[ [0.4034,0.7792], [0.4,0.7503] ] +,[ [0.4059,0.8013], [0.4,0.7754] ] +,[ [0.4086,0.8219], [0.4,0.8005] ] +,[ [0.4112,0.841], [0.4,0.8245] ] +,[ [0.414,0.8586], [0.4,0.8495] ] +,[ [0.4165,0.8748], [0.4,0.8745] ] +,[ [0.419,0.8909], [0.4,0.8994] ] +,[ [0.4211,0.9071], [0.4,0.9257] ] +,[ [0.4231,0.9248], [0.4,0.9503] ] +,[ [0.4249,0.9394], [0.4,0.9745] ] +,[ [0.4269,0.9541], [0.4,1] ] +,[ [0.4522,0.04439], [0.425,0] ] +,[ [0.4507,0.05908], [0.425,0.02551] ] +,[ [0.4494,0.07378], [0.425,0.04974] ] +,[ [0.4479,0.08995], [0.425,0.07432] ] +,[ [0.4461,0.1061], [0.425,0.1006] ] +,[ [0.4443,0.1223], [0.425,0.1255] ] +,[ [0.4423,0.1399], [0.425,0.1505] ] +,[ [0.4401,0.1576], [0.425,0.1755] ] +,[ [0.438,0.1767], [0.425,0.1995] ] +,[ [0.436,0.1972], [0.425,0.2246] ] +,[ [0.4342,0.2193], [0.425,0.2497] ] +,[ [0.4322,0.2413], [0.425,0.2748] ] +,[ [0.4302,0.2648], [0.425,0.3] ] +,[ [0.4282,0.2913], [0.425,0.3252] ] +,[ [0.4271,0.3192], [0.425,0.3496] ] +,[ [0.4271,0.3486], [0.425,0.3751] ] +,[ [0.4282,0.3804], [0.425,0.4] ] +,[ [0.4297,0.4117], [0.425,0.425] ] +,[ [0.4312,0.4419], [0.425,0.45] ] +,[ [0.4322,0.4713], [0.425,0.475] ] +,[ [0.4325,0.5], [0.425,0.5] ] +,[ [0.4322,0.5287], [0.425,0.525] ] +,[ [0.4312,0.5581], [0.425,0.55] ] +,[ [0.4297,0.5883], [0.425,0.575] ] +,[ [0.4282,0.6196], [0.425,0.6] ] +,[ [0.4271,0.6514], [0.425,0.6249] ] +,[ [0.4271,0.6808], [0.425,0.6504] ] +,[ [0.4282,0.7087], [0.425,0.6748] ] +,[ [0.4302,0.7352], [0.425,0.7] ] +,[ [0.4322,0.7587], [0.425,0.7252] ] +,[ [0.4342,0.7807], [0.425,0.7503] ] +,[ [0.436,0.8028], [0.425,0.7754] ] +,[ [0.438,0.8233], [0.425,0.8005] ] +,[ [0.4401,0.8424], [0.425,0.8245] ] +,[ [0.4423,0.8601], [0.425,0.8495] ] +,[ [0.4443,0.8777], [0.425,0.8745] ] +,[ [0.4461,0.8939], [0.425,0.8994] ] +,[ [0.4479,0.9101], [0.425,0.9257] ] +,[ [0.4494,0.9262], [0.425,0.9503] ] +,[ [0.4507,0.9409], [0.425,0.9745] ] +,[ [0.4522,0.9556], [0.425,1] ] +,[ [0.4777,0.04292], [0.45,0] ] +,[ [0.4767,0.05761], [0.45,0.02551] ] +,[ [0.4759,0.07378], [0.45,0.04974] ] +,[ [0.4747,0.08995], [0.45,0.07432] ] +,[ [0.4735,0.1046], [0.45,0.1006] ] +,[ [0.4724,0.1208], [0.45,0.1255] ] +,[ [0.4709,0.1384], [0.45,0.1505] ] +,[ [0.4696,0.1561], [0.45,0.1755] ] +,[ [0.4681,0.1752], [0.45,0.1995] ] +,[ [0.4668,0.1958], [0.45,0.2246] ] +,[ [0.4654,0.2178], [0.45,0.2497] ] +,[ [0.4641,0.2399], [0.45,0.2748] ] +,[ [0.4628,0.2634], [0.45,0.3] ] +,[ [0.4615,0.2898], [0.45,0.3252] ] +,[ [0.461,0.3178], [0.45,0.3496] ] +,[ [0.4615,0.3501], [0.45,0.3751] ] +,[ [0.4625,0.3817], [0.45,0.4] ] +,[ [0.4638,0.413], [0.45,0.425] ] +,[ [0.4649,0.443], [0.45,0.45] ] +,[ [0.4658,0.4719], [0.45,0.475] ] +,[ [0.4661,0.5], [0.45,0.5] ] +,[ [0.4658,0.5281], [0.45,0.525] ] +,[ [0.4649,0.557], [0.45,0.55] ] +,[ [0.4638,0.587], [0.45,0.575] ] +,[ [0.4625,0.6183], [0.45,0.6] ] +,[ [0.4615,0.6499], [0.45,0.6249] ] +,[ [0.461,0.6822], [0.45,0.6504] ] +,[ [0.4615,0.7102], [0.45,0.6748] ] +,[ [0.4628,0.7366], [0.45,0.7] ] +,[ [0.4641,0.7601], [0.45,0.7252] ] +,[ [0.4654,0.7822], [0.45,0.7503] ] +,[ [0.4668,0.8042], [0.45,0.7754] ] +,[ [0.4681,0.8248], [0.45,0.8005] ] +,[ [0.4696,0.8439], [0.45,0.8245] ] +,[ [0.4709,0.8616], [0.45,0.8495] ] +,[ [0.4724,0.8792], [0.45,0.8745] ] +,[ [0.4735,0.8954], [0.45,0.8994] ] +,[ [0.4747,0.9101], [0.45,0.9257] ] +,[ [0.4759,0.9262], [0.45,0.9503] ] +,[ [0.4767,0.9424], [0.45,0.9745] ] +,[ [0.4777,0.9571], [0.45,1] ] +,[ [0.5033,0.04145], [0.475,0] ] +,[ [0.5028,0.05761], [0.475,0.02551] ] +,[ [0.5025,0.07231], [0.475,0.04974] ] +,[ [0.5018,0.08848], [0.475,0.07432] ] +,[ [0.5013,0.1046], [0.475,0.1006] ] +,[ [0.5007,0.1208], [0.475,0.1255] ] +,[ [0.5,0.137], [0.475,0.1505] ] +,[ [0.4992,0.1546], [0.475,0.1755] ] +,[ [0.4985,0.1737], [0.475,0.1995] ] +,[ [0.4979,0.1943], [0.475,0.2246] ] +,[ [0.4972,0.2163], [0.475,0.2497] ] +,[ [0.4965,0.2399], [0.475,0.2748] ] +,[ [0.4957,0.2634], [0.475,0.3] ] +,[ [0.4952,0.2884], [0.475,0.3252] ] +,[ [0.495,0.3178], [0.475,0.3496] ] +,[ [0.4954,0.3501], [0.475,0.3751] ] +,[ [0.496,0.3826], [0.475,0.4] ] +,[ [0.4969,0.4139], [0.475,0.425] ] +,[ [0.4975,0.4437], [0.475,0.45] ] +,[ [0.498,0.4724], [0.475,0.475] ] +,[ [0.4982,0.5], [0.475,0.5] ] +,[ [0.498,0.5276], [0.475,0.525] ] +,[ [0.4975,0.5563], [0.475,0.55] ] +,[ [0.4969,0.5861], [0.475,0.575] ] +,[ [0.496,0.6174], [0.475,0.6] ] +,[ [0.4954,0.6499], [0.475,0.6249] ] +,[ [0.495,0.6822], [0.475,0.6504] ] +,[ [0.4952,0.7116], [0.475,0.6748] ] +,[ [0.4957,0.7366], [0.475,0.7] ] +,[ [0.4965,0.7601], [0.475,0.7252] ] +,[ [0.4972,0.7837], [0.475,0.7503] ] +,[ [0.4979,0.8057], [0.475,0.7754] ] +,[ [0.4985,0.8263], [0.475,0.8005] ] +,[ [0.4992,0.8454], [0.475,0.8245] ] +,[ [0.5,0.863], [0.475,0.8495] ] +,[ [0.5007,0.8792], [0.475,0.8745] ] +,[ [0.5013,0.8954], [0.475,0.8994] ] +,[ [0.5018,0.9115], [0.475,0.9257] ] +,[ [0.5025,0.9277], [0.475,0.9503] ] +,[ [0.5028,0.9424], [0.475,0.9745] ] +,[ [0.5033,0.9586], [0.475,1] ] +,[ [0.5291,0.04145], [0.5,0] ] +,[ [0.5291,0.05614], [0.5,0.02551] ] +,[ [0.5291,0.07231], [0.5,0.04974] ] +,[ [0.5291,0.08848], [0.5,0.07432] ] +,[ [0.5291,0.1046], [0.5,0.1006] ] +,[ [0.5291,0.1208], [0.5,0.1255] ] +,[ [0.5291,0.137], [0.5,0.1505] ] +,[ [0.5291,0.1546], [0.5,0.1755] ] +,[ [0.5291,0.1737], [0.5,0.1995] ] +,[ [0.5291,0.1943], [0.5,0.2246] ] +,[ [0.5291,0.2163], [0.5,0.2497] ] +,[ [0.5291,0.2384], [0.5,0.2748] ] +,[ [0.5291,0.2634], [0.5,0.3] ] +,[ [0.5291,0.2884], [0.5,0.3252] ] +,[ [0.5291,0.3178], [0.5,0.3496] ] +,[ [0.5291,0.3501], [0.5,0.3751] ] +,[ [0.5291,0.3829], [0.5,0.4] ] +,[ [0.5291,0.4142], [0.5,0.425] ] +,[ [0.5291,0.444], [0.5,0.45] ] +,[ [0.5291,0.4725], [0.5,0.475] ] +,[ [0.5291,0.5], [0.5,0.5] ] +,[ [0.5291,0.5275], [0.5,0.525] ] +,[ [0.5291,0.556], [0.5,0.55] ] +,[ [0.5291,0.5858], [0.5,0.575] ] +,[ [0.5291,0.6171], [0.5,0.6] ] +,[ [0.5291,0.6499], [0.5,0.6249] ] +,[ [0.5291,0.6822], [0.5,0.6504] ] +,[ [0.5291,0.7116], [0.5,0.6748] ] +,[ [0.5291,0.7366], [0.5,0.7] ] +,[ [0.5291,0.7616], [0.5,0.7252] ] +,[ [0.5291,0.7837], [0.5,0.7503] ] +,[ [0.5291,0.8057], [0.5,0.7754] ] +,[ [0.5291,0.8263], [0.5,0.8005] ] +,[ [0.5291,0.8454], [0.5,0.8245] ] +,[ [0.5291,0.863], [0.5,0.8495] ] +,[ [0.5291,0.8792], [0.5,0.8745] ] +,[ [0.5291,0.8954], [0.5,0.8994] ] +,[ [0.5291,0.9115], [0.5,0.9257] ] +,[ [0.5291,0.9277], [0.5,0.9503] ] +,[ [0.5291,0.9439], [0.5,0.9745] ] +,[ [0.5291,0.9586], [0.5,1] ] +,[ [0.5549,0.04145], [0.525,0] ] +,[ [0.5554,0.05761], [0.525,0.02551] ] +,[ [0.5557,0.07231], [0.525,0.04974] ] +,[ [0.5564,0.08848], [0.525,0.07432] ] +,[ [0.5569,0.1046], [0.525,0.1006] ] +,[ [0.5575,0.1208], [0.525,0.1255] ] +,[ [0.5582,0.137], [0.525,0.1505] ] +,[ [0.559,0.1546], [0.525,0.1755] ] +,[ [0.5597,0.1737], [0.525,0.1995] ] +,[ [0.5604,0.1943], [0.525,0.2246] ] +,[ [0.561,0.2163], [0.525,0.2497] ] +,[ [0.5617,0.2399], [0.525,0.2748] ] +,[ [0.5625,0.2634], [0.525,0.3] ] +,[ [0.563,0.2884], [0.525,0.3252] ] +,[ [0.5632,0.3178], [0.525,0.3496] ] +,[ [0.5628,0.3501], [0.525,0.3751] ] +,[ [0.5622,0.3826], [0.525,0.4] ] +,[ [0.5613,0.4139], [0.525,0.425] ] +,[ [0.5607,0.4437], [0.525,0.45] ] +,[ [0.5602,0.4724], [0.525,0.475] ] +,[ [0.56,0.5], [0.525,0.5] ] +,[ [0.5602,0.5276], [0.525,0.525] ] +,[ [0.5607,0.5563], [0.525,0.55] ] +,[ [0.5613,0.5861], [0.525,0.575] ] +,[ [0.5622,0.6174], [0.525,0.6] ] +,[ [0.5628,0.6499], [0.525,0.6249] ] +,[ [0.5632,0.6822], [0.525,0.6504] ] +,[ [0.563,0.7116], [0.525,0.6748] ] +,[ [0.5625,0.7366], [0.525,0.7] ] +,[ [0.5617,0.7601], [0.525,0.7252] ] +,[ [0.561,0.7837], [0.525,0.7503] ] +,[ [0.5604,0.8057], [0.525,0.7754] ] +,[ [0.5597,0.8263], [0.525,0.8005] ] +,[ [0.559,0.8454], [0.525,0.8245] ] +,[ [0.5582,0.863], [0.525,0.8495] ] +,[ [0.5575,0.8792], [0.525,0.8745] ] +,[ [0.5569,0.8954], [0.525,0.8994] ] +,[ [0.5564,0.9115], [0.525,0.9257] ] +,[ [0.5557,0.9277], [0.525,0.9503] ] +,[ [0.5554,0.9424], [0.525,0.9745] ] +,[ [0.5549,0.9586], [0.525,1] ] +,[ [0.5805,0.04292], [0.55,0] ] +,[ [0.5815,0.05761], [0.55,0.02551] ] +,[ [0.5823,0.07378], [0.55,0.04974] ] +,[ [0.5835,0.08995], [0.55,0.07432] ] +,[ [0.5847,0.1046], [0.55,0.1006] ] +,[ [0.5858,0.1208], [0.55,0.1255] ] +,[ [0.5873,0.1384], [0.55,0.1505] ] +,[ [0.5886,0.1561], [0.55,0.1755] ] +,[ [0.5901,0.1752], [0.55,0.1995] ] +,[ [0.5914,0.1958], [0.55,0.2246] ] +,[ [0.5928,0.2178], [0.55,0.2497] ] +,[ [0.5941,0.2399], [0.55,0.2748] ] +,[ [0.5954,0.2634], [0.55,0.3] ] +,[ [0.5967,0.2898], [0.55,0.3252] ] +,[ [0.5972,0.3178], [0.55,0.3496] ] +,[ [0.5967,0.3501], [0.55,0.3751] ] +,[ [0.5957,0.3817], [0.55,0.4] ] +,[ [0.5944,0.413], [0.55,0.425] ] +,[ [0.5933,0.443], [0.55,0.45] ] +,[ [0.5924,0.4719], [0.55,0.475] ] +,[ [0.5921,0.5], [0.55,0.5] ] +,[ [0.5924,0.5281], [0.55,0.525] ] +,[ [0.5933,0.557], [0.55,0.55] ] +,[ [0.5944,0.587], [0.55,0.575] ] +,[ [0.5957,0.6183], [0.55,0.6] ] +,[ [0.5967,0.6499], [0.55,0.6249] ] +,[ [0.5972,0.6822], [0.55,0.6504] ] +,[ [0.5967,0.7102], [0.55,0.6748] ] +,[ [0.5954,0.7366], [0.55,0.7] ] +,[ [0.5941,0.7601], [0.55,0.7252] ] +,[ [0.5928,0.7822], [0.55,0.7503] ] +,[ [0.5914,0.8042], [0.55,0.7754] ] +,[ [0.5901,0.8248], [0.55,0.8005] ] +,[ [0.5886,0.8439], [0.55,0.8245] ] +,[ [0.5873,0.8616], [0.55,0.8495] ] +,[ [0.5858,0.8792], [0.55,0.8745] ] +,[ [0.5847,0.8954], [0.55,0.8994] ] +,[ [0.5835,0.9101], [0.55,0.9257] ] +,[ [0.5823,0.9262], [0.55,0.9503] ] +,[ [0.5815,0.9424], [0.55,0.9745] ] +,[ [0.5805,0.9571], [0.55,1] ] +,[ [0.606,0.04439], [0.575,0] ] +,[ [0.6075,0.05908], [0.575,0.02551] ] +,[ [0.6088,0.07378], [0.575,0.04974] ] +,[ [0.6103,0.08995], [0.575,0.07432] ] +,[ [0.6121,0.1061], [0.575,0.1006] ] +,[ [0.6139,0.1223], [0.575,0.1255] ] +,[ [0.6159,0.1399], [0.575,0.1505] ] +,[ [0.6181,0.1576], [0.575,0.1755] ] +,[ [0.6202,0.1767], [0.575,0.1995] ] +,[ [0.6222,0.1972], [0.575,0.2246] ] +,[ [0.624,0.2193], [0.575,0.2497] ] +,[ [0.626,0.2413], [0.575,0.2748] ] +,[ [0.628,0.2648], [0.575,0.3] ] +,[ [0.63,0.2913], [0.575,0.3252] ] +,[ [0.6311,0.3192], [0.575,0.3496] ] +,[ [0.6311,0.3486], [0.575,0.3751] ] +,[ [0.63,0.3804], [0.575,0.4] ] +,[ [0.6285,0.4117], [0.575,0.425] ] +,[ [0.627,0.4419], [0.575,0.45] ] +,[ [0.626,0.4713], [0.575,0.475] ] +,[ [0.6257,0.5], [0.575,0.5] ] +,[ [0.626,0.5287], [0.575,0.525] ] +,[ [0.627,0.5581], [0.575,0.55] ] +,[ [0.6285,0.5883], [0.575,0.575] ] +,[ [0.63,0.6196], [0.575,0.6] ] +,[ [0.6311,0.6514], [0.575,0.6249] ] +,[ [0.6311,0.6808], [0.575,0.6504] ] +,[ [0.63,0.7087], [0.575,0.6748] ] +,[ [0.628,0.7352], [0.575,0.7] ] +,[ [0.626,0.7587], [0.575,0.7252] ] +,[ [0.624,0.7807], [0.575,0.7503] ] +,[ [0.6222,0.8028], [0.575,0.7754] ] +,[ [0.6202,0.8233], [0.575,0.8005] ] +,[ [0.6181,0.8424], [0.575,0.8245] ] +,[ [0.6159,0.8601], [0.575,0.8495] ] +,[ [0.6139,0.8777], [0.575,0.8745] ] +,[ [0.6121,0.8939], [0.575,0.8994] ] +,[ [0.6103,0.9101], [0.575,0.9257] ] +,[ [0.6088,0.9262], [0.575,0.9503] ] +,[ [0.6075,0.9409], [0.575,0.9745] ] +,[ [0.606,0.9556], [0.575,1] ] +,[ [0.6313,0.04586], [0.6,0] ] +,[ [0.6333,0.06055], [0.6,0.02551] ] +,[ [0.6351,0.07525], [0.6,0.04974] ] +,[ [0.6371,0.09289], [0.6,0.07432] ] +,[ [0.6392,0.1091], [0.6,0.1006] ] +,[ [0.6417,0.1252], [0.6,0.1255] ] +,[ [0.6442,0.1414], [0.6,0.1505] ] +,[ [0.647,0.159], [0.6,0.1755] ] +,[ [0.6496,0.1781], [0.6,0.1995] ] +,[ [0.6523,0.1987], [0.6,0.2246] ] +,[ [0.6548,0.2208], [0.6,0.2497] ] +,[ [0.6572,0.2443], [0.6,0.2748] ] +,[ [0.6597,0.2678], [0.6,0.3] ] +,[ [0.6624,0.2928], [0.6,0.3252] ] +,[ [0.6645,0.3192], [0.6,0.3496] ] +,[ [0.6653,0.3486], [0.6,0.3751] ] +,[ [0.6648,0.3793], [0.6,0.4] ] +,[ [0.6637,0.4103], [0.6,0.425] ] +,[ [0.6622,0.4408], [0.6,0.45] ] +,[ [0.6612,0.4706], [0.6,0.475] ] +,[ [0.6609,0.5], [0.6,0.5] ] +,[ [0.6612,0.5294], [0.6,0.525] ] +,[ [0.6622,0.5592], [0.6,0.55] ] +,[ [0.6637,0.5897], [0.6,0.575] ] +,[ [0.6648,0.6207], [0.6,0.6] ] +,[ [0.6653,0.6514], [0.6,0.6249] ] +,[ [0.6645,0.6808], [0.6,0.6504] ] +,[ [0.6624,0.7072], [0.6,0.6748] ] +,[ [0.6597,0.7322], [0.6,0.7] ] +,[ [0.6572,0.7557], [0.6,0.7252] ] +,[ [0.6548,0.7792], [0.6,0.7503] ] +,[ [0.6523,0.8013], [0.6,0.7754] ] +,[ [0.6496,0.8219], [0.6,0.8005] ] +,[ [0.647,0.841], [0.6,0.8245] ] +,[ [0.6442,0.8586], [0.6,0.8495] ] +,[ [0.6417,0.8748], [0.6,0.8745] ] +,[ [0.6392,0.8909], [0.6,0.8994] ] +,[ [0.6371,0.9071], [0.6,0.9257] ] +,[ [0.6351,0.9248], [0.6,0.9503] ] +,[ [0.6333,0.9394], [0.6,0.9745] ] +,[ [0.6313,0.9541], [0.6,1] ] +,[ [0.6563,0.04733], [0.6249,0] ] +,[ [0.6587,0.06202], [0.6249,0.02551] ] +,[ [0.661,0.07819], [0.6249,0.04974] ] +,[ [0.6634,0.09436], [0.6249,0.07432] ] +,[ [0.666,0.1105], [0.6249,0.1006] ] +,[ [0.6688,0.1267], [0.6249,0.1255] ] +,[ [0.672,0.1443], [0.6249,0.1505] ] +,[ [0.6753,0.162], [0.6249,0.1755] ] +,[ [0.6786,0.1811], [0.6249,0.1995] ] +,[ [0.6819,0.2016], [0.6249,0.2246] ] +,[ [0.6849,0.2237], [0.6249,0.2497] ] +,[ [0.6877,0.2457], [0.6249,0.2748] ] +,[ [0.6906,0.2707], [0.6249,0.3] ] +,[ [0.6938,0.2957], [0.6249,0.3252] ] +,[ [0.6961,0.3207], [0.6249,0.3496] ] +,[ [0.6994,0.3486], [0.6249,0.3751] ] +,[ [0.6994,0.3789], [0.6249,0.4] ] +,[ [0.6994,0.4093], [0.6249,0.425] ] +,[ [0.6978,0.4399], [0.6249,0.45] ] +,[ [0.6978,0.47], [0.6249,0.475] ] +,[ [0.6978,0.5], [0.6249,0.5] ] +,[ [0.6978,0.53], [0.6249,0.525] ] +,[ [0.6978,0.5601], [0.6249,0.55] ] +,[ [0.6994,0.5907], [0.6249,0.575] ] +,[ [0.6994,0.6211], [0.6249,0.6] ] +,[ [0.6994,0.6514], [0.6249,0.6249] ] +,[ [0.6961,0.6793], [0.6249,0.6504] ] +,[ [0.6938,0.7043], [0.6249,0.6748] ] +,[ [0.6906,0.7293], [0.6249,0.7] ] +,[ [0.6877,0.7543], [0.6249,0.7252] ] +,[ [0.6849,0.7763], [0.6249,0.7503] ] +,[ [0.6819,0.7984], [0.6249,0.7754] ] +,[ [0.6786,0.8189], [0.6249,0.8005] ] +,[ [0.6753,0.838], [0.6249,0.8245] ] +,[ [0.672,0.8557], [0.6249,0.8495] ] +,[ [0.6688,0.8733], [0.6249,0.8745] ] +,[ [0.666,0.8895], [0.6249,0.8994] ] +,[ [0.6634,0.9056], [0.6249,0.9257] ] +,[ [0.661,0.9218], [0.6249,0.9503] ] +,[ [0.6587,0.938], [0.6249,0.9745] ] +,[ [0.6563,0.9527], [0.6249,1] ] +,[ [0.6809,0.05026], [0.6504,0] ] +,[ [0.6839,0.06349], [0.6504,0.02551] ] +,[ [0.6865,0.07966], [0.6504,0.04974] ] +,[ [0.6893,0.09583], [0.6504,0.07432] ] +,[ [0.6923,0.1135], [0.6504,0.1006] ] +,[ [0.6961,0.1296], [0.6504,0.1255] ] +,[ [0.6994,0.1473], [0.6504,0.1505] ] +,[ [0.7027,0.1649], [0.6504,0.1755] ] +,[ [0.706,0.184], [0.6504,0.1995] ] +,[ [0.711,0.2046], [0.6504,0.2246] ] +,[ [0.7143,0.2266], [0.6504,0.2497] ] +,[ [0.7176,0.2487], [0.6504,0.2748] ] +,[ [0.7209,0.2737], [0.6504,0.3] ] +,[ [0.7242,0.2986], [0.6504,0.3252] ] +,[ [0.7275,0.3236], [0.6504,0.3496] ] +,[ [0.7308,0.3516], [0.6504,0.3751] ] +,[ [0.7325,0.3796], [0.6504,0.4] ] +,[ [0.7325,0.4093], [0.6504,0.425] ] +,[ [0.7341,0.4394], [0.6504,0.45] ] +,[ [0.7341,0.4697], [0.6504,0.475] ] +,[ [0.7341,0.5], [0.6504,0.5] ] +,[ [0.7341,0.5303], [0.6504,0.525] ] +,[ [0.7341,0.5606], [0.6504,0.55] ] +,[ [0.7325,0.5907], [0.6504,0.575] ] +,[ [0.7325,0.6204], [0.6504,0.6] ] +,[ [0.7308,0.6484], [0.6504,0.6249] ] +,[ [0.7275,0.6764], [0.6504,0.6504] ] +,[ [0.7242,0.7014], [0.6504,0.6748] ] +,[ [0.7209,0.7263], [0.6504,0.7] ] +,[ [0.7176,0.7513], [0.6504,0.7252] ] +,[ [0.7143,0.7734], [0.6504,0.7503] ] +,[ [0.711,0.7954], [0.6504,0.7754] ] +,[ [0.706,0.816], [0.6504,0.8005] ] +,[ [0.7027,0.8351], [0.6504,0.8245] ] +,[ [0.6994,0.8527], [0.6504,0.8495] ] +,[ [0.6961,0.8704], [0.6504,0.8745] ] +,[ [0.6923,0.8865], [0.6504,0.8994] ] +,[ [0.6893,0.9042], [0.6504,0.9257] ] +,[ [0.6865,0.9203], [0.6504,0.9503] ] +,[ [0.6839,0.9365], [0.6504,0.9745] ] +,[ [0.6809,0.9497], [0.6504,1] ] +,[ [0.7044,0.0532], [0.6748,0] ] +,[ [0.7077,0.06643], [0.6748,0.02551] ] +,[ [0.711,0.0826], [0.6748,0.04974] ] +,[ [0.7143,0.09877], [0.6748,0.07432] ] +,[ [0.7176,0.1164], [0.6748,0.1006] ] +,[ [0.7209,0.134], [0.6748,0.1255] ] +,[ [0.7259,0.1517], [0.6748,0.1505] ] +,[ [0.7292,0.1693], [0.6748,0.1755] ] +,[ [0.7341,0.1884], [0.6748,0.1995] ] +,[ [0.7374,0.2075], [0.6748,0.2246] ] +,[ [0.7424,0.2296], [0.6748,0.2497] ] +,[ [0.7457,0.2516], [0.6748,0.2748] ] +,[ [0.749,0.2766], [0.6748,0.3] ] +,[ [0.7523,0.3016], [0.6748,0.3252] ] +,[ [0.7556,0.3266], [0.6748,0.3496] ] +,[ [0.7589,0.3536], [0.6748,0.3751] ] +,[ [0.7622,0.3815], [0.6748,0.4] ] +,[ [0.7639,0.4103], [0.6748,0.425] ] +,[ [0.7655,0.4399], [0.6748,0.45] ] +,[ [0.7672,0.4699], [0.6748,0.475] ] +,[ [0.7672,0.5], [0.6748,0.5] ] +,[ [0.7672,0.5301], [0.6748,0.525] ] +,[ [0.7655,0.5601], [0.6748,0.55] ] +,[ [0.7639,0.5897], [0.6748,0.575] ] +,[ [0.7622,0.6185], [0.6748,0.6] ] +,[ [0.7589,0.6464], [0.6748,0.6249] ] +,[ [0.7556,0.6734], [0.6748,0.6504] ] +,[ [0.7523,0.6984], [0.6748,0.6748] ] +,[ [0.749,0.7234], [0.6748,0.7] ] +,[ [0.7457,0.7484], [0.6748,0.7252] ] +,[ [0.7424,0.7704], [0.6748,0.7503] ] +,[ [0.7374,0.7925], [0.6748,0.7754] ] +,[ [0.7341,0.8116], [0.6748,0.8005] ] +,[ [0.7292,0.8307], [0.6748,0.8245] ] +,[ [0.7259,0.8483], [0.6748,0.8495] ] +,[ [0.7209,0.866], [0.6748,0.8745] ] +,[ [0.7176,0.8836], [0.6748,0.8994] ] +,[ [0.7143,0.9012], [0.6748,0.9257] ] +,[ [0.711,0.9174], [0.6748,0.9503] ] +,[ [0.7077,0.9336], [0.6748,0.9745] ] +,[ [0.7044,0.9468], [0.6748,1] ] +,[ [0.7275,0.05761], [0.7,0] ] +,[ [0.7325,0.06937], [0.7,0.02551] ] +,[ [0.7358,0.08554], [0.7,0.04974] ] +,[ [0.7391,0.1017], [0.7,0.07432] ] +,[ [0.744,0.1193], [0.7,0.1006] ] +,[ [0.7474,0.137], [0.7,0.1255] ] +,[ [0.7507,0.1546], [0.7,0.1505] ] +,[ [0.7556,0.1723], [0.7,0.1755] ] +,[ [0.7606,0.1914], [0.7,0.1995] ] +,[ [0.7655,0.2119], [0.7,0.2246] ] +,[ [0.7688,0.2325], [0.7,0.2497] ] +,[ [0.7738,0.256], [0.7,0.2748] ] +,[ [0.7771,0.2795], [0.7,0.3] ] +,[ [0.7804,0.3045], [0.7,0.3252] ] +,[ [0.7837,0.3295], [0.7,0.3496] ] +,[ [0.787,0.3564], [0.7,0.3751] ] +,[ [0.7903,0.3839], [0.7,0.4] ] +,[ [0.7937,0.4121], [0.7,0.425] ] +,[ [0.7953,0.4411], [0.7,0.45] ] +,[ [0.7953,0.4703], [0.7,0.475] ] +,[ [0.7953,0.5], [0.7,0.5] ] +,[ [0.7953,0.5297], [0.7,0.525] ] +,[ [0.7953,0.5589], [0.7,0.55] ] +,[ [0.7937,0.5879], [0.7,0.575] ] +,[ [0.7903,0.6161], [0.7,0.6] ] +,[ [0.787,0.6436], [0.7,0.6249] ] +,[ [0.7837,0.6705], [0.7,0.6504] ] +,[ [0.7804,0.6955], [0.7,0.6748] ] +,[ [0.7771,0.7205], [0.7,0.7] ] +,[ [0.7738,0.744], [0.7,0.7252] ] +,[ [0.7688,0.7675], [0.7,0.7503] ] +,[ [0.7655,0.7881], [0.7,0.7754] ] +,[ [0.7606,0.8086], [0.7,0.8005] ] +,[ [0.7556,0.8277], [0.7,0.8245] ] +,[ [0.7507,0.8454], [0.7,0.8495] ] +,[ [0.7474,0.863], [0.7,0.8745] ] +,[ [0.744,0.8807], [0.7,0.8994] ] +,[ [0.7391,0.8983], [0.7,0.9257] ] +,[ [0.7358,0.9145], [0.7,0.9503] ] +,[ [0.7325,0.9306], [0.7,0.9745] ] +,[ [0.7275,0.9424], [0.7,1] ] +,[ [0.749,0.06349], [0.7252,0] ] +,[ [0.7556,0.07378], [0.7252,0.02551] ] +,[ [0.7606,0.08848], [0.7252,0.04974] ] +,[ [0.7639,0.1046], [0.7252,0.07432] ] +,[ [0.7688,0.1223], [0.7252,0.1006] ] +,[ [0.7722,0.1399], [0.7252,0.1255] ] +,[ [0.7755,0.159], [0.7252,0.1505] ] +,[ [0.7804,0.1767], [0.7252,0.1755] ] +,[ [0.7854,0.1958], [0.7252,0.1995] ] +,[ [0.7903,0.2163], [0.7252,0.2246] ] +,[ [0.7953,0.2369], [0.7252,0.2497] ] +,[ [0.8003,0.259], [0.7252,0.2748] ] +,[ [0.8036,0.2825], [0.7252,0.3] ] +,[ [0.8085,0.3075], [0.7252,0.3252] ] +,[ [0.8118,0.3325], [0.7252,0.3496] ] +,[ [0.8151,0.3591], [0.7252,0.3751] ] +,[ [0.8168,0.3861], [0.7252,0.4] ] +,[ [0.8201,0.4139], [0.7252,0.425] ] +,[ [0.8218,0.4422], [0.7252,0.45] ] +,[ [0.8218,0.471], [0.7252,0.475] ] +,[ [0.8234,0.5], [0.7252,0.5] ] +,[ [0.8218,0.529], [0.7252,0.525] ] +,[ [0.8218,0.5578], [0.7252,0.55] ] +,[ [0.8201,0.5861], [0.7252,0.575] ] +,[ [0.8168,0.6139], [0.7252,0.6] ] +,[ [0.8151,0.6409], [0.7252,0.6249] ] +,[ [0.8118,0.6675], [0.7252,0.6504] ] +,[ [0.8085,0.6925], [0.7252,0.6748] ] +,[ [0.8036,0.7175], [0.7252,0.7] ] +,[ [0.8003,0.741], [0.7252,0.7252] ] +,[ [0.7953,0.7631], [0.7252,0.7503] ] +,[ [0.7903,0.7837], [0.7252,0.7754] ] +,[ [0.7854,0.8042], [0.7252,0.8005] ] +,[ [0.7804,0.8233], [0.7252,0.8245] ] +,[ [0.7755,0.841], [0.7252,0.8495] ] +,[ [0.7722,0.8601], [0.7252,0.8745] ] +,[ [0.7688,0.8777], [0.7252,0.8994] ] +,[ [0.7639,0.8954], [0.7252,0.9257] ] +,[ [0.7606,0.9115], [0.7252,0.9503] ] +,[ [0.7556,0.9262], [0.7252,0.9745] ] +,[ [0.749,0.9365], [0.7252,1] ] +,[ [0.7688,0.07378], [0.7503,0] ] +,[ [0.7788,0.07966], [0.7503,0.02551] ] +,[ [0.7837,0.09289], [0.7503,0.04974] ] +,[ [0.7887,0.1091], [0.7503,0.07432] ] +,[ [0.792,0.1252], [0.7503,0.1006] ] +,[ [0.797,0.1443], [0.7503,0.1255] ] +,[ [0.8003,0.162], [0.7503,0.1505] ] +,[ [0.8052,0.1811], [0.7503,0.1755] ] +,[ [0.8102,0.2002], [0.7503,0.1995] ] +,[ [0.8151,0.2208], [0.7503,0.2246] ] +,[ [0.8201,0.2413], [0.7503,0.2497] ] +,[ [0.8251,0.2634], [0.7503,0.2748] ] +,[ [0.83,0.2869], [0.7503,0.3] ] +,[ [0.8333,0.3104], [0.7503,0.3252] ] +,[ [0.8366,0.3354], [0.7503,0.3496] ] +,[ [0.8399,0.3616], [0.7503,0.3751] ] +,[ [0.8433,0.3883], [0.7503,0.4] ] +,[ [0.8449,0.4156], [0.7503,0.425] ] +,[ [0.8466,0.4434], [0.7503,0.45] ] +,[ [0.8482,0.4716], [0.7503,0.475] ] +,[ [0.8482,0.5], [0.7503,0.5] ] +,[ [0.8482,0.5284], [0.7503,0.525] ] +,[ [0.8466,0.5566], [0.7503,0.55] ] +,[ [0.8449,0.5844], [0.7503,0.575] ] +,[ [0.8433,0.6117], [0.7503,0.6] ] +,[ [0.8399,0.6384], [0.7503,0.6249] ] +,[ [0.8366,0.6646], [0.7503,0.6504] ] +,[ [0.8333,0.6896], [0.7503,0.6748] ] +,[ [0.83,0.7131], [0.7503,0.7] ] +,[ [0.8251,0.7366], [0.7503,0.7252] ] +,[ [0.8201,0.7587], [0.7503,0.7503] ] +,[ [0.8151,0.7792], [0.7503,0.7754] ] +,[ [0.8102,0.7998], [0.7503,0.8005] ] +,[ [0.8052,0.8189], [0.7503,0.8245] ] +,[ [0.8003,0.838], [0.7503,0.8495] ] +,[ [0.797,0.8557], [0.7503,0.8745] ] +,[ [0.792,0.8748], [0.7503,0.8994] ] +,[ [0.7887,0.8909], [0.7503,0.9257] ] +,[ [0.8102,0.112], [0.7754,0.07432] ] +,[ [0.8151,0.1296], [0.7754,0.1006] ] +,[ [0.8201,0.1473], [0.7754,0.1255] ] +,[ [0.8234,0.1664], [0.7754,0.1505] ] +,[ [0.8284,0.1855], [0.7754,0.1755] ] +,[ [0.8333,0.2046], [0.7754,0.1995] ] +,[ [0.8383,0.2252], [0.7754,0.2246] ] +,[ [0.8433,0.2457], [0.7754,0.2497] ] +,[ [0.8482,0.2678], [0.7754,0.2748] ] +,[ [0.8532,0.2898], [0.7754,0.3] ] +,[ [0.8581,0.3148], [0.7754,0.3252] ] +,[ [0.8614,0.3383], [0.7754,0.3496] ] +,[ [0.8647,0.3642], [0.7754,0.3751] ] +,[ [0.8681,0.3905], [0.7754,0.4] ] +,[ [0.8697,0.4173], [0.7754,0.425] ] +,[ [0.8714,0.4446], [0.7754,0.45] ] +,[ [0.873,0.4722], [0.7754,0.475] ] +,[ [0.873,0.5], [0.7754,0.5] ] +,[ [0.873,0.5278], [0.7754,0.525] ] +,[ [0.8714,0.5554], [0.7754,0.55] ] +,[ [0.8697,0.5827], [0.7754,0.575] ] +,[ [0.8681,0.6095], [0.7754,0.6] ] +,[ [0.8647,0.6358], [0.7754,0.6249] ] +,[ [0.8614,0.6617], [0.7754,0.6504] ] +,[ [0.8581,0.6852], [0.7754,0.6748] ] +,[ [0.8532,0.7102], [0.7754,0.7] ] +,[ [0.8482,0.7322], [0.7754,0.7252] ] +,[ [0.8433,0.7543], [0.7754,0.7503] ] +,[ [0.8383,0.7748], [0.7754,0.7754] ] +,[ [0.8333,0.7954], [0.7754,0.8005] ] +,[ [0.8284,0.8145], [0.7754,0.8245] ] +,[ [0.8234,0.8336], [0.7754,0.8495] ] +,[ [0.8201,0.8527], [0.7754,0.8745] ] +,[ [0.8151,0.8704], [0.7754,0.8994] ] +,[ [0.8102,0.888], [0.7754,0.9257] ] +,[ [0.8333,0.1164], [0.8005,0.07432] ] +,[ [0.8383,0.134], [0.8005,0.1006] ] +,[ [0.8433,0.1517], [0.8005,0.1255] ] +,[ [0.8466,0.1693], [0.8005,0.1505] ] +,[ [0.8515,0.1899], [0.8005,0.1755] ] +,[ [0.8565,0.209], [0.8005,0.1995] ] +,[ [0.8614,0.2296], [0.8005,0.2246] ] +,[ [0.8664,0.2501], [0.8005,0.2497] ] +,[ [0.8714,0.2722], [0.8005,0.2748] ] +,[ [0.8763,0.2942], [0.8005,0.3] ] +,[ [0.8796,0.3178], [0.8005,0.3252] ] +,[ [0.8846,0.3427], [0.8005,0.3496] ] +,[ [0.8879,0.3671], [0.8005,0.3751] ] +,[ [0.8912,0.3929], [0.8005,0.4] ] +,[ [0.8929,0.419], [0.8005,0.425] ] +,[ [0.8945,0.4458], [0.8005,0.45] ] +,[ [0.8962,0.4728], [0.8005,0.475] ] +,[ [0.8962,0.5], [0.8005,0.5] ] +,[ [0.8962,0.5272], [0.8005,0.525] ] +,[ [0.8945,0.5542], [0.8005,0.55] ] +,[ [0.8929,0.581], [0.8005,0.575] ] +,[ [0.8912,0.6071], [0.8005,0.6] ] +,[ [0.8879,0.6329], [0.8005,0.6249] ] +,[ [0.8846,0.6573], [0.8005,0.6504] ] +,[ [0.8796,0.6822], [0.8005,0.6748] ] +,[ [0.8763,0.7058], [0.8005,0.7] ] +,[ [0.8714,0.7278], [0.8005,0.7252] ] +,[ [0.8664,0.7499], [0.8005,0.7503] ] +,[ [0.8614,0.7704], [0.8005,0.7754] ] +,[ [0.8565,0.791], [0.8005,0.8005] ] +,[ [0.8515,0.8101], [0.8005,0.8245] ] +,[ [0.8466,0.8307], [0.8005,0.8495] ] +,[ [0.8433,0.8483], [0.8005,0.8745] ] +,[ [0.8383,0.866], [0.8005,0.8994] ] +,[ [0.8333,0.8836], [0.8005,0.9257] ] +,[ [0.8598,0.1384], [0.8245,0.1006] ] +,[ [0.8647,0.1561], [0.8245,0.1255] ] +,[ [0.8697,0.1737], [0.8245,0.1505] ] +,[ [0.8747,0.1928], [0.8245,0.1755] ] +,[ [0.878,0.2134], [0.8245,0.1995] ] +,[ [0.8829,0.234], [0.8245,0.2246] ] +,[ [0.8879,0.2546], [0.8245,0.2497] ] +,[ [0.8929,0.2766], [0.8245,0.2748] ] +,[ [0.8978,0.2986], [0.8245,0.3] ] +,[ [0.9011,0.3222], [0.8245,0.3252] ] +,[ [0.9061,0.3457], [0.8245,0.3496] ] +,[ [0.9094,0.3701], [0.8245,0.3751] ] +,[ [0.9127,0.3952], [0.8245,0.4] ] +,[ [0.9144,0.4209], [0.8245,0.425] ] +,[ [0.916,0.4471], [0.8245,0.45] ] +,[ [0.9177,0.4734], [0.8245,0.475] ] +,[ [0.9177,0.5], [0.8245,0.5] ] +,[ [0.9177,0.5266], [0.8245,0.525] ] +,[ [0.916,0.5529], [0.8245,0.55] ] +,[ [0.9144,0.5791], [0.8245,0.575] ] +,[ [0.9127,0.6048], [0.8245,0.6] ] +,[ [0.9094,0.6299], [0.8245,0.6249] ] +,[ [0.9061,0.6543], [0.8245,0.6504] ] +,[ [0.9011,0.6778], [0.8245,0.6748] ] +,[ [0.8978,0.7014], [0.8245,0.7] ] +,[ [0.8929,0.7234], [0.8245,0.7252] ] +,[ [0.8879,0.7454], [0.8245,0.7503] ] +,[ [0.8829,0.766], [0.8245,0.7754] ] +,[ [0.878,0.7866], [0.8245,0.8005] ] +,[ [0.8747,0.8072], [0.8245,0.8245] ] +,[ [0.8697,0.8263], [0.8245,0.8495] ] +,[ [0.8647,0.8439], [0.8245,0.8745] ] +,[ [0.8598,0.8616], [0.8245,0.8994] ] +,[ [0.8862,0.1605], [0.8495,0.1255] ] +,[ [0.8912,0.1781], [0.8495,0.1505] ] +,[ [0.8962,0.1972], [0.8495,0.1755] ] +,[ [0.9011,0.2178], [0.8495,0.1995] ] +,[ [0.9044,0.2384], [0.8495,0.2246] ] +,[ [0.9094,0.259], [0.8495,0.2497] ] +,[ [0.9127,0.281], [0.8495,0.2748] ] +,[ [0.9177,0.3031], [0.8495,0.3] ] +,[ [0.921,0.3251], [0.8495,0.3252] ] +,[ [0.9259,0.3486], [0.8495,0.3496] ] +,[ [0.9292,0.373], [0.8495,0.3751] ] +,[ [0.9325,0.3977], [0.8495,0.4] ] +,[ [0.9342,0.4228], [0.8495,0.425] ] +,[ [0.9358,0.4483], [0.8495,0.45] ] +,[ [0.9375,0.4741], [0.8495,0.475] ] +,[ [0.9375,0.5], [0.8495,0.5] ] +,[ [0.9375,0.5259], [0.8495,0.525] ] +,[ [0.9358,0.5517], [0.8495,0.55] ] +,[ [0.9342,0.5772], [0.8495,0.575] ] +,[ [0.9325,0.6023], [0.8495,0.6] ] +,[ [0.9292,0.627], [0.8495,0.6249] ] +,[ [0.9259,0.6514], [0.8495,0.6504] ] +,[ [0.921,0.6749], [0.8495,0.6748] ] +,[ [0.9177,0.6969], [0.8495,0.7] ] +,[ [0.9127,0.719], [0.8495,0.7252] ] +,[ [0.9094,0.741], [0.8495,0.7503] ] +,[ [0.9044,0.7616], [0.8495,0.7754] ] +,[ [0.9011,0.7822], [0.8495,0.8005] ] +,[ [0.8962,0.8028], [0.8495,0.8245] ] +,[ [0.8912,0.8219], [0.8495,0.8495] ] +,[ [0.8862,0.8395], [0.8495,0.8745] ] +,[ [0.9044,0.1664], [0.8745,0.1255] ] +,[ [0.911,0.1825], [0.8745,0.1505] ] +,[ [0.916,0.2016], [0.8745,0.1755] ] +,[ [0.921,0.2208], [0.8745,0.1995] ] +,[ [0.9259,0.2413], [0.8745,0.2246] ] +,[ [0.9292,0.2619], [0.8745,0.2497] ] +,[ [0.9342,0.284], [0.8745,0.2748] ] +,[ [0.9375,0.306], [0.8745,0.3] ] +,[ [0.9408,0.3295], [0.8745,0.3252] ] +,[ [0.9458,0.3516], [0.8745,0.3496] ] +,[ [0.9491,0.3758], [0.8745,0.3751] ] +,[ [0.9507,0.3999], [0.8745,0.4] ] +,[ [0.954,0.4246], [0.8745,0.425] ] +,[ [0.9557,0.4496], [0.8745,0.45] ] +,[ [0.9557,0.4747], [0.8745,0.475] ] +,[ [0.9557,0.5], [0.8745,0.5] ] +,[ [0.9557,0.5253], [0.8745,0.525] ] +,[ [0.9557,0.5504], [0.8745,0.55] ] +,[ [0.954,0.5754], [0.8745,0.575] ] +,[ [0.9507,0.6001], [0.8745,0.6] ] +,[ [0.9491,0.6242], [0.8745,0.6249] ] +,[ [0.9458,0.6484], [0.8745,0.6504] ] +,[ [0.9408,0.6705], [0.8745,0.6748] ] +,[ [0.9375,0.694], [0.8745,0.7] ] +,[ [0.9342,0.716], [0.8745,0.7252] ] +,[ [0.9292,0.7381], [0.8745,0.7503] ] +,[ [0.9259,0.7587], [0.8745,0.7754] ] +,[ [0.921,0.7792], [0.8745,0.8005] ] +,[ [0.916,0.7984], [0.8745,0.8245] ] +,[ [0.911,0.8175], [0.8745,0.8495] ] +,[ [0.9044,0.8336], [0.8745,0.8745] ] +,[ [0.9276,0.1899], [0.8994,0.1505] ] +,[ [0.9358,0.2061], [0.8994,0.1755] ] +,[ [0.9408,0.2252], [0.8994,0.1995] ] +,[ [0.9458,0.2457], [0.8994,0.2246] ] +,[ [0.9507,0.2663], [0.8994,0.2497] ] +,[ [0.954,0.2869], [0.8994,0.2748] ] +,[ [0.9573,0.3089], [0.8994,0.3] ] +,[ [0.9606,0.3325], [0.8994,0.3252] ] +,[ [0.964,0.3549], [0.8994,0.3496] ] +,[ [0.9673,0.3783], [0.8994,0.3751] ] +,[ [0.9689,0.4021], [0.8994,0.4] ] +,[ [0.9722,0.4262], [0.8994,0.425] ] +,[ [0.9739,0.4506], [0.8994,0.45] ] +,[ [0.9739,0.4753], [0.8994,0.475] ] +,[ [0.9739,0.5], [0.8994,0.5] ] +,[ [0.9739,0.5247], [0.8994,0.525] ] +,[ [0.9739,0.5494], [0.8994,0.55] ] +,[ [0.9722,0.5738], [0.8994,0.575] ] +,[ [0.9689,0.5979], [0.8994,0.6] ] +,[ [0.9673,0.6217], [0.8994,0.6249] ] +,[ [0.964,0.6451], [0.8994,0.6504] ] +,[ [0.9606,0.6675], [0.8994,0.6748] ] +,[ [0.9573,0.6911], [0.8994,0.7] ] +,[ [0.954,0.7131], [0.8994,0.7252] ] +,[ [0.9507,0.7337], [0.8994,0.7503] ] +,[ [0.9458,0.7543], [0.8994,0.7754] ] +,[ [0.9408,0.7748], [0.8994,0.8005] ] +,[ [0.9358,0.7939], [0.8994,0.8245] ] +,[ [0.9276,0.8101], [0.8994,0.8495] ] +,[ [0.959,0.2296], [0.9257,0.1995] ] +,[ [0.964,0.2501], [0.9257,0.2246] ] +,[ [0.9689,0.2693], [0.9257,0.2497] ] +,[ [0.9739,0.2913], [0.9257,0.2748] ] +,[ [0.9772,0.3133], [0.9257,0.3] ] +,[ [0.9805,0.3354], [0.9257,0.3252] ] +,[ [0.9838,0.3576], [0.9257,0.3496] ] +,[ [0.9854,0.3805], [0.9257,0.3751] ] +,[ [0.9888,0.404], [0.9257,0.4] ] +,[ [0.9904,0.4277], [0.9257,0.425] ] +,[ [0.9904,0.4516], [0.9257,0.45] ] +,[ [0.9921,0.4757], [0.9257,0.475] ] +,[ [0.9921,0.5], [0.9257,0.5] ] +,[ [0.9921,0.5243], [0.9257,0.525] ] +,[ [0.9904,0.5484], [0.9257,0.55] ] +,[ [0.9904,0.5723], [0.9257,0.575] ] +,[ [0.9888,0.596], [0.9257,0.6] ] +,[ [0.9854,0.6195], [0.9257,0.6249] ] +,[ [0.9838,0.6424], [0.9257,0.6504] ] +,[ [0.9805,0.6646], [0.9257,0.6748] ] +,[ [0.9772,0.6867], [0.9257,0.7] ] +,[ [0.9739,0.7087], [0.9257,0.7252] ] +,[ [0.9689,0.7307], [0.9257,0.7503] ] +,[ [0.964,0.7499], [0.9257,0.7754] ] +,[ [0.959,0.7704], [0.9257,0.8005] ] +,[ [0.9805,0.2546], [0.9503,0.2246] ] +,[ [0.9871,0.2737], [0.9503,0.2497] ] +,[ [0.9921,0.2942], [0.9503,0.2748] ] +,[ [0.9954,0.3163], [0.9503,0.3] ] +,[ [0.9987,0.3383], [0.9503,0.3252] ] +,[ [1.002,0.3599], [0.9503,0.3496] ] +,[ [1.004,0.3827], [0.9503,0.3751] ] +,[ [1.007,0.4058], [0.9503,0.4] ] +,[ [1.009,0.429], [0.9503,0.425] ] +,[ [1.009,0.4525], [0.9503,0.45] ] +,[ [1.01,0.4762], [0.9503,0.475] ] +,[ [1.01,0.5], [0.9503,0.5] ] +,[ [1.01,0.5238], [0.9503,0.525] ] +,[ [1.009,0.5475], [0.9503,0.55] ] +,[ [1.009,0.571], [0.9503,0.575] ] +,[ [1.007,0.5942], [0.9503,0.6] ] +,[ [1.004,0.6173], [0.9503,0.6249] ] +,[ [1.002,0.6401], [0.9503,0.6504] ] +,[ [0.9987,0.6617], [0.9503,0.6748] ] +,[ [0.9954,0.6837], [0.9503,0.7] ] +,[ [0.9921,0.7058], [0.9503,0.7252] ] +,[ [0.9871,0.7263], [0.9503,0.7503] ] +,[ [0.9805,0.7454], [0.9503,0.7754] ] +,[ [1.007,0.2986], [0.9745,0.2748] ] +,[ [1.012,0.3192], [0.9745,0.3] ] +,[ [1.015,0.3413], [0.9745,0.3252] ] +,[ [1.019,0.3624], [0.9745,0.3496] ] +,[ [1.022,0.3848], [0.9745,0.3751] ] +,[ [1.023,0.4074], [0.9745,0.4] ] +,[ [1.025,0.4303], [0.9745,0.425] ] +,[ [1.027,0.4534], [0.9745,0.45] ] +,[ [1.027,0.4766], [0.9745,0.475] ] +,[ [1.028,0.5], [0.9745,0.5] ] +,[ [1.027,0.5234], [0.9745,0.525] ] +,[ [1.027,0.5466], [0.9745,0.55] ] +,[ [1.025,0.5697], [0.9745,0.575] ] +,[ [1.023,0.5926], [0.9745,0.6] ] +,[ [1.022,0.6152], [0.9745,0.6249] ] +,[ [1.019,0.6376], [0.9745,0.6504] ] +,[ [1.015,0.6587], [0.9745,0.6748] ] +,[ [1.012,0.6808], [0.9745,0.7] ] +,[ [1.007,0.7014], [0.9745,0.7252] ] +,[ [1.022,0.3251], [1,0.3] ] +,[ [1.028,0.3442], [1,0.3252] ] +,[ [1.033,0.3654], [1,0.3496] ] +,[ [1.037,0.3871], [1,0.3751] ] +,[ [1.04,0.4092], [1,0.4] ] +,[ [1.042,0.4317], [1,0.425] ] +,[ [1.043,0.4543], [1,0.45] ] +,[ [1.043,0.4771], [1,0.475] ] +,[ [1.043,0.5], [1,0.5] ] +,[ [1.043,0.5229], [1,0.525] ] +,[ [1.043,0.5457], [1,0.55] ] +,[ [1.042,0.5683], [1,0.575] ] +,[ [1.04,0.5908], [1,0.6] ] +,[ [1.037,0.6129], [1,0.6249] ] +,[ [1.033,0.6346], [1,0.6504] ] +,[ [1.028,0.6558], [1,0.6748] ] +,[ [1.022,0.6749], [1,0.7] ] +] + ] + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/directmode_HDK1.3_mesh_server.json b/installer/directmode_HDK1.3_mesh_server.json index 5f70812..0fd5609 100755 --- a/installer/directmode_HDK1.3_mesh_server.json +++ b/installer/directmode_HDK1.3_mesh_server.json @@ -1,97 +1,97 @@ -{ - "sleep": 0, - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 2, - "Version": "1.3", - "Note": "OSVR HDK 1.3 in DirectMode" - } - }, - "field_of_view": { - "monocular_horizontal": 92, - "monocular_vertical": 92, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 2, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "type": "mono_point_samples", - "mono_point_samples_external_file": "./server/bin/directmode_HDK1.3_mesh_client.json" - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} - +{ + "sleep": 0, + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 2, + "Version": "1.3", + "Note": "OSVR HDK 1.3 in DirectMode" + } + }, + "field_of_view": { + "monocular_horizontal": 92, + "monocular_vertical": 92, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 2, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "type": "mono_point_samples", + "mono_point_samples_external_file": "./server/bin/directmode_HDK1.3_mesh_client.json" + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} + diff --git a/installer/directmode_HDK2.0_built_in.json b/installer/directmode_HDK2.0_built_in.json index ffb7459..0055461 100644 --- a/installer/directmode_HDK2.0_built_in.json +++ b/installer/directmode_HDK2.0_built_in.json @@ -1,97 +1,97 @@ -{ - "sleep": 0, - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 1.2, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 180, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 0, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "2.0", - "Note": "OSVR HDK 2.0 in DirectMode" - } - }, - "field_of_view": { - "monocular_horizontal": 92, - "monocular_vertical": 92, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 2160, - "height": 1200, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "type": "mono_point_samples", - "mono_point_samples_built_in": "OSVR_HDK_20_V1" - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - }, - "aliases": {"/me/head":"/com_osvr_Multiserver/OSVRHackerDevKit0/semantic/hmd"} -} - +{ + "sleep": 0, + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 1.2, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 180, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 0, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "2.0", + "Note": "OSVR HDK 2.0 in DirectMode" + } + }, + "field_of_view": { + "monocular_horizontal": 92, + "monocular_vertical": 92, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 2160, + "height": 1200, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "type": "mono_point_samples", + "mono_point_samples_built_in": "OSVR_HDK_20_V1" + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + }, + "aliases": {"/me/head":"/com_osvr_Multiserver/OSVRHackerDevKit0/semantic/hmd"} +} + diff --git a/installer/directmode_Vuzix.json b/installer/directmode_Vuzix.json index 9b45bf3..069ff04 100755 --- a/installer/directmode_Vuzix.json +++ b/installer/directmode_Vuzix.json @@ -1,98 +1,98 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 0, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "Vuzix", - "model": "iWear", - "num_displays": 1, - "Version": "1.1", - "Note": "Vuzix iWear in landscape mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 101.25, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1 ], - "polynomial_coeffs_green": [ 0, 1 ], - "polynomial_coeffs_blue": [ 0, 1 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 0, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "Vuzix", + "model": "iWear", + "num_displays": 1, + "Version": "1.1", + "Note": "Vuzix iWear in landscape mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 101.25, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1 ], + "polynomial_coeffs_green": [ 0, 1 ], + "polynomial_coeffs_blue": [ 0, 1 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/directmode_dSight.json b/installer/directmode_dSight.json index 11e358e..adc8e88 100755 --- a/installer/directmode_dSight.json +++ b/installer/directmode_dSight.json @@ -1,121 +1,121 @@ -{ - "plugins": [], /* only need to list manual-load plugins */ - "drivers": [ - { - "plugin": "com_osvr_Multiserver", - "driver": "YEI_3Space_Sensor" - } - ], - "routes": [ - { - "destination": "/me/head", - "source": { - "changeBasis": { - "x": "y", - "y": "-z", - "z": "x" - }, - "child": "/com_osvr_Multiserver/YEI_3Space_Sensor0/tracker/1" - } - } - ], - - "sleep": 0, - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": true, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 1, - "verticalSyncEnabled": false, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 16, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 2, - "Version": "1.1", - "Note": "OSVR HDK on screen in landscape mode" - } - }, - "field_of_view": { - "monocular_horizontal": 95, - "monocular_vertical": 63.1, - "overlap_percent": 73.68, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "full_screen", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1 ], - "polynomial_coeffs_green": [ 0, 1 ], - "polynomial_coeffs_blue": [ 0, 1 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 1 - } - ] - } - } -} - +{ + "plugins": [], /* only need to list manual-load plugins */ + "drivers": [ + { + "plugin": "com_osvr_Multiserver", + "driver": "YEI_3Space_Sensor" + } + ], + "routes": [ + { + "destination": "/me/head", + "source": { + "changeBasis": { + "x": "y", + "y": "-z", + "z": "x" + }, + "child": "/com_osvr_Multiserver/YEI_3Space_Sensor0/tracker/1" + } + } + ], + + "sleep": 0, + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": true, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 1, + "verticalSyncEnabled": false, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 16, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 2, + "Version": "1.1", + "Note": "OSVR HDK on screen in landscape mode" + } + }, + "field_of_view": { + "monocular_horizontal": 95, + "monocular_vertical": 63.1, + "overlap_percent": 73.68, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "full_screen", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1 ], + "polynomial_coeffs_green": [ 0, 1 ], + "polynomial_coeffs_blue": [ 0, 1 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 1 + } + ] + } + } +} + diff --git a/installer/distortion_nondirect_HDK1.2.json b/installer/distortion_nondirect_HDK1.2.json index 0bd7ced..d0accc6 100755 --- a/installer/distortion_nondirect_HDK1.2.json +++ b/installer/distortion_nondirect_HDK1.2.json @@ -1,98 +1,98 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": false, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 32, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 6 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK on screen in portrait mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1.1, 2 ], - "polynomial_coeffs_green": [ 0, 1.1, 2 ], - "polynomial_coeffs_blue": [ 0, 1.1, 2 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": false, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 32, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 6 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK on screen in portrait mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1.1, 2 ], + "polynomial_coeffs_green": [ 0, 1.1, 2 ], + "polynomial_coeffs_blue": [ 0, 1.1, 2 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/nondirectmode_HDK1.2.json b/installer/nondirectmode_HDK1.2.json index 9600016..7014fef 100755 --- a/installer/nondirectmode_HDK1.2.json +++ b/installer/nondirectmode_HDK1.2.json @@ -1,98 +1,98 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": false, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": false, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 32, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 6 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK on screen in landscape mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1 ], - "polynomial_coeffs_green": [ 0, 1 ], - "polynomial_coeffs_blue": [ 0, 1 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": false, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": false, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 32, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 6 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK on screen in landscape mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1 ], + "polynomial_coeffs_green": [ 0, 1 ], + "polynomial_coeffs_blue": [ 0, 1 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/nondirectmode_HDK1.3.json b/installer/nondirectmode_HDK1.3.json index aea1037..541e42b 100755 --- a/installer/nondirectmode_HDK1.3.json +++ b/installer/nondirectmode_HDK1.3.json @@ -1,98 +1,98 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": false, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": false, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 32, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 6 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK on screen in landscape mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], - "polynomial_coeffs_green": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], - "polynomial_coeffs_blue": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.471, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.529, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": false, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": false, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 32, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 6 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK on screen in landscape mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], + "polynomial_coeffs_green": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ], + "polynomial_coeffs_blue": [ 0, 1, -1.74, 5.15, -1.27, -2.23 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.471, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.529, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/nondirectmode_dSight.json b/installer/nondirectmode_dSight.json index c9fc470..f50601d 100755 --- a/installer/nondirectmode_dSight.json +++ b/installer/nondirectmode_dSight.json @@ -1,121 +1,121 @@ -{ - "plugins": [], /* only need to list manual-load plugins */ - "drivers": [ - { - "plugin": "com_osvr_Multiserver", - "driver": "YEI_3Space_Sensor" - } - ], - "routes": [ - { - "destination": "/me/head", - "source": { - "changeBasis": { - "x": "y", - "y": "-z", - "z": "x" - }, - "child": "/com_osvr_Multiserver/YEI_3Space_Sensor0/tracker/1" - } - } - ], - - "sleep": 0, - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": false, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": true, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": true, - "xPosition": 1920, - "yPosition": 0 - }, - - "display": { - "rotation": 90, - "bitsPerColor": 8 - }, - - "prediction": { - "enabled": true, - "staticDelayMS": 32, - "leftEyeDelayMS": 7.5, - "rightEyeDelayMS": 0, - "localTimeOverride": true - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 5 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 2, - "Version": "1.1", - "Note": "OSVR HDK on screen in landscape mode" - } - }, - "field_of_view": { - "monocular_horizontal": 95, - "monocular_vertical": 63.1, - "overlap_percent": 73.68, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1920, - "height": 1080, - "video_inputs": 1, - "display_mode": "full_screen", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1 ], - "polynomial_coeffs_green": [ 0, 1 ], - "polynomial_coeffs_blue": [ 0, 1 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 1 - } - ] - } - } -} - +{ + "plugins": [], /* only need to list manual-load plugins */ + "drivers": [ + { + "plugin": "com_osvr_Multiserver", + "driver": "YEI_3Space_Sensor" + } + ], + "routes": [ + { + "destination": "/me/head", + "source": { + "changeBasis": { + "x": "y", + "y": "-z", + "z": "x" + }, + "child": "/com_osvr_Multiserver/YEI_3Space_Sensor0/tracker/1" + } + } + ], + + "sleep": 0, + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": false, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": true, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": true, + "xPosition": 1920, + "yPosition": 0 + }, + + "display": { + "rotation": 90, + "bitsPerColor": 8 + }, + + "prediction": { + "enabled": true, + "staticDelayMS": 32, + "leftEyeDelayMS": 7.5, + "rightEyeDelayMS": 0, + "localTimeOverride": true + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 5 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 2, + "Version": "1.1", + "Note": "OSVR HDK on screen in landscape mode" + } + }, + "field_of_view": { + "monocular_horizontal": 95, + "monocular_vertical": 63.1, + "overlap_percent": 73.68, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1920, + "height": 1080, + "video_inputs": 1, + "display_mode": "full_screen", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1 ], + "polynomial_coeffs_green": [ 0, 1 ], + "polynomial_coeffs_blue": [ 0, 1 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 1 + } + ] + } + } +} + diff --git a/installer/nondirectmode_window.json b/installer/nondirectmode_window.json index adb9ea4..da2f70d 100755 --- a/installer/nondirectmode_window.json +++ b/installer/nondirectmode_window.json @@ -1,90 +1,90 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": false, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": false, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": false, - "xPosition": 40, - "yPosition": 40 - }, - - "display": { - "rotation": 0, - "bitsPerColor": 8 - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 6 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK on screen in portrait mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1024, - "height": 576, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "distance_scale_x": 1, - "distance_scale_y": 1, - "polynomial_coeffs_red": [ 0, 1 ], - "polynomial_coeffs_green": [ 0, 1 ], - "polynomial_coeffs_blue": [ 0, 1 ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": false, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": false, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": false, + "xPosition": 40, + "yPosition": 40 + }, + + "display": { + "rotation": 0, + "bitsPerColor": 8 + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 6 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK on screen in portrait mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1024, + "height": 576, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "distance_scale_x": 1, + "distance_scale_y": 1, + "polynomial_coeffs_red": [ 0, 1 ], + "polynomial_coeffs_green": [ 0, 1 ], + "polynomial_coeffs_blue": [ 0, 1 ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/nondirectmode_window_angledistort.json b/installer/nondirectmode_window_angledistort.json index afd8eb6..4b85b79 100755 --- a/installer/nondirectmode_window_angledistort.json +++ b/installer/nondirectmode_window_angledistort.json @@ -1,87 +1,87 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": false, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": false, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": false, - "xPosition": 40, - "yPosition": 40 - }, - - "display": { - "rotation": 0, - "bitsPerColor": 8 - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 6 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK on screen in portrait mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1024, - "height": 576, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "type": "mono_point_samples", - "mono_point_samples_external_file": "C:/tmp/vs2013_64/AngleBasedDistortion/Debug/out.json" - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": false, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": false, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": false, + "xPosition": 40, + "yPosition": 40 + }, + + "display": { + "rotation": 0, + "bitsPerColor": 8 + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 6 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK on screen in portrait mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1024, + "height": 576, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "type": "mono_point_samples", + "mono_point_samples_external_file": "C:/tmp/vs2013_64/AngleBasedDistortion/Debug/out.json" + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/nondirectmode_window_angletest.json b/installer/nondirectmode_window_angletest.json index b8d2c35..6e47924 100755 --- a/installer/nondirectmode_window_angletest.json +++ b/installer/nondirectmode_window_angletest.json @@ -1,101 +1,101 @@ -{ - "renderManagerConfig": { - "meta": { - "schemaVersion": 1 - }, - "renderManagerConfig": { - "directModeEnabled": false, - "directDisplayIndex": 0, - "directHighPriorityEnabled": true, - "numBuffers": 2, - "verticalSyncEnabled": false, - "verticalSyncBlockRenderingEnabled": true, - "renderOverfillFactor": 2.0, - "renderOversampleFactor": 1.0, - - "window": { - "title": "OSVR", - "fullScreenEnabled": false, - "xPosition": 40, - "yPosition": 40 - }, - - "display": { - "rotation": 0, - "bitsPerColor": 8 - }, - - "timeWarp": { - "enabled": true, - "asynchronous": false, - "maxMsBeforeVSync": 6 - } - } - }, - - "display": { - "meta": { - "schemaVersion": 1 - }, - "hmd": { - "device": { - "properties": { - "vendor": "OSVR", - "model": "HDK", - "num_displays": 1, - "Version": "1.1", - "Note": "OSVR HDK on screen in portrait mode" - } - }, - "field_of_view": { - "monocular_horizontal": 90, - "monocular_vertical": 96.73, - "overlap_percent": 100, - "pitch_tilt": 0 - }, - "resolutions": [ - { - "width": 1024, - "height": 576, - "video_inputs": 1, - "display_mode": "horz_side_by_side", - "swap_eyes": 0 - } - ], - "distortion": { - "type": "mono_point_samples", - "mono_point_samples": [ -[ - [ [0,0], [0,0] ] -,[ [1,0], [1,0] ] -,[ [1,1], [1,1] ] -,[ [0,1], [0,1] ] -] -, -[ - [ [0,0], [0,0] ] -,[ [1,0], [1,0] ] -,[ [1,1], [1,1] ] -,[ [0,1], [0,1] ] -] - ] - }, - "rendering": { - "right_roll": 0, - "left_roll": 0 - }, - "eyes": [ - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - }, - { - "center_proj_x": 0.5, - "center_proj_y": 0.5, - "rotate_180": 0 - } - ] - } - } -} +{ + "renderManagerConfig": { + "meta": { + "schemaVersion": 1 + }, + "renderManagerConfig": { + "directModeEnabled": false, + "directDisplayIndex": 0, + "directHighPriorityEnabled": true, + "numBuffers": 2, + "verticalSyncEnabled": false, + "verticalSyncBlockRenderingEnabled": true, + "renderOverfillFactor": 2.0, + "renderOversampleFactor": 1.0, + + "window": { + "title": "OSVR", + "fullScreenEnabled": false, + "xPosition": 40, + "yPosition": 40 + }, + + "display": { + "rotation": 0, + "bitsPerColor": 8 + }, + + "timeWarp": { + "enabled": true, + "asynchronous": false, + "maxMsBeforeVSync": 6 + } + } + }, + + "display": { + "meta": { + "schemaVersion": 1 + }, + "hmd": { + "device": { + "properties": { + "vendor": "OSVR", + "model": "HDK", + "num_displays": 1, + "Version": "1.1", + "Note": "OSVR HDK on screen in portrait mode" + } + }, + "field_of_view": { + "monocular_horizontal": 90, + "monocular_vertical": 96.73, + "overlap_percent": 100, + "pitch_tilt": 0 + }, + "resolutions": [ + { + "width": 1024, + "height": 576, + "video_inputs": 1, + "display_mode": "horz_side_by_side", + "swap_eyes": 0 + } + ], + "distortion": { + "type": "mono_point_samples", + "mono_point_samples": [ +[ + [ [0,0], [0,0] ] +,[ [1,0], [1,0] ] +,[ [1,1], [1,1] ] +,[ [0,1], [0,1] ] +] +, +[ + [ [0,0], [0,0] ] +,[ [1,0], [1,0] ] +,[ [1,1], [1,1] ] +,[ [0,1], [0,1] ] +] + ] + }, + "rendering": { + "right_roll": 0, + "left_roll": 0 + }, + "eyes": [ + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + }, + { + "center_proj_x": 0.5, + "center_proj_y": 0.5, + "rotate_180": 0 + } + ] + } + } +} diff --git a/installer/osvrRenderManager.aip b/installer/osvrRenderManager.aip index c7a4302..86b6fa3 100755 --- a/installer/osvrRenderManager.aip +++ b/installer/osvrRenderManager.aip @@ -1,359 +1,359 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/osvr/RenderKit/RenderKitGraphicsTransforms.h b/osvr/RenderKit/RenderKitGraphicsTransforms.h index 55f7a36..4c429e6 100755 --- a/osvr/RenderKit/RenderKitGraphicsTransforms.h +++ b/osvr/RenderKit/RenderKitGraphicsTransforms.h @@ -144,12 +144,12 @@ namespace renderkit { /// near clipping plane set, then set it to 1 before calling this /// function. /// To put the result into an Unreal FMatrix, do the following: - /// float p[16]; - /// OSVR_Projection_to_D3D(p, projection_in); - /// FPlane row1(p[0], p[1], p[2], p[3]); - /// FPlane row2(p[4], p[5], p[6], p[7]); - /// FPlane row3(p[8], p[9], p[10], p[11]); - /// FPlane row4(p[12], p[13], p[14], p[15]); + /// float p[16]; + /// OSVR_Projection_to_D3D(p, projection_in); + /// FPlane row1(p[0], p[1], p[2], p[3]); + /// FPlane row2(p[4], p[5], p[6], p[7]); + /// FPlane row3(p[8], p[9], p[10], p[11]); + /// FPlane row4(p[12], p[13], p[14], p[15]); /// FMatrix ret = FMatrix(row1, row2, row3, row4); /// @brief Produce Unreal Projection transform from OSVR projection info /// @param projection_in Input projection description from RenderManager. diff --git a/osvr/RenderKit/RenderKitGraphicsTransformsC.h b/osvr/RenderKit/RenderKitGraphicsTransformsC.h index d8dcca3..8bc461b 100644 --- a/osvr/RenderKit/RenderKitGraphicsTransformsC.h +++ b/osvr/RenderKit/RenderKitGraphicsTransformsC.h @@ -113,12 +113,12 @@ extern "C" { /// near clipping plane set, then set it to 1 before calling this /// function. /// To put the result into an Unreal FMatrix, do the following: - /// float p[16]; - /// OSVR_Projection_to_D3D(p, projection_in); - /// FPlane row1(p[0], p[1], p[2], p[3]); - /// FPlane row2(p[4], p[5], p[6], p[7]); - /// FPlane row3(p[8], p[9], p[10], p[11]); - /// FPlane row4(p[12], p[13], p[14], p[15]); + /// float p[16]; + /// OSVR_Projection_to_D3D(p, projection_in); + /// FPlane row1(p[0], p[1], p[2], p[3]); + /// FPlane row2(p[4], p[5], p[6], p[7]); + /// FPlane row3(p[8], p[9], p[10], p[11]); + /// FPlane row4(p[12], p[13], p[14], p[15]); /// FMatrix ret = FMatrix(row1, row2, row3, row4); /// @brief Produce Unreal Projection transform from OSVR projection info /// @param projection_in Input projection description from RenderManager. diff --git a/osvr/RenderKit/RenderManagerBase.cpp b/osvr/RenderKit/RenderManagerBase.cpp index 862d5fa..bed7a34 100755 --- a/osvr/RenderKit/RenderManagerBase.cpp +++ b/osvr/RenderKit/RenderManagerBase.cpp @@ -1,125 +1,125 @@ -/** @file -@brief Implementation of the OSVR direct-to-device rendering interface - -@date 2015 - -@author -Russ Taylor - -*/ - -// Copyright 2015 Sensics, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Internal Includes -#include "RenderManager.h" -#include - -#ifdef RM_USE_D3D11 -#include "RenderManagerD3D.h" -#include "RenderManagerD3D11ATW.h" -#endif - -#ifdef RM_USE_NVIDIA_DIRECT_D3D11 -#include "RenderManagerNVidiaD3D.h" -#endif - -#ifdef RM_USE_NVIDIA_DIRECT_D3D11_OPENGL -#include "RenderManagerD3DOpenGL.h" -#endif - -#ifdef RM_USE_AMD_DIRECT_D3D11 -#include "RenderManagerAMDD3D.h" -#endif - -#ifdef RM_USE_OPENGL -#include "RenderManagerOpenGL.h" -#endif - -#include "VendorIdTools.h" - -// OSVR Includes -#include -#include -#include -#include -#include -#include -#include -#include - -// Library/third-party includes -#include -#include - -#include - -#include -#include - -// Standard includes -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -// @todo Consider pulling this function into Core. -/// @brief Predict a future pose based on initial and velocity. -// Predict the future pose of the head based on the velocity -// information and how long we should predict. Check the -// linear and angular velocity terms to see if we should be -// using each. Replace the pose with the predicted pose. -/// @param[in] poseIn The initial pose used for prediction. -/// @param[in] vel The pose velocity used to move the pose -/// forward in time. This function respects the valid -/// flags to make sure not to make use of parts of the state -/// that have not been filled in. -/// @param[in] predictionIntervalSec How long to integrate -/// the velocity to move the pose forward in time. -/// @param[out] poseOut The place to store the predicted -/// pose. May be a reference to the same structure as -/// poseIn. -static void PredictFuturePose( - const OSVR_PoseState &poseIn, - const OSVR_VelocityState &vel, - double predictionIntervalSec, - OSVR_PoseState &poseOut) -{ - // Make a copy of the pose state so that we can handle the - // case where the out and in pose are the same. - OSVR_PoseState out = poseIn; - - // If we have a change in orientation, make it. - if (vel.angularVelocityValid) { - - // Start out the new orientation at the original one - // from OSVR. +/** @file +@brief Implementation of the OSVR direct-to-device rendering interface + +@date 2015 + +@author +Russ Taylor + +*/ + +// Copyright 2015 Sensics, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Internal Includes +#include "RenderManager.h" +#include + +#ifdef RM_USE_D3D11 +#include "RenderManagerD3D.h" +#include "RenderManagerD3D11ATW.h" +#endif + +#ifdef RM_USE_NVIDIA_DIRECT_D3D11 +#include "RenderManagerNVidiaD3D.h" +#endif + +#ifdef RM_USE_NVIDIA_DIRECT_D3D11_OPENGL +#include "RenderManagerD3DOpenGL.h" +#endif + +#ifdef RM_USE_AMD_DIRECT_D3D11 +#include "RenderManagerAMDD3D.h" +#endif + +#ifdef RM_USE_OPENGL +#include "RenderManagerOpenGL.h" +#endif + +#include "VendorIdTools.h" + +// OSVR Includes +#include +#include +#include +#include +#include +#include +#include +#include + +// Library/third-party includes +#include +#include + +#include + +#include +#include + +// Standard includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +// @todo Consider pulling this function into Core. +/// @brief Predict a future pose based on initial and velocity. +// Predict the future pose of the head based on the velocity +// information and how long we should predict. Check the +// linear and angular velocity terms to see if we should be +// using each. Replace the pose with the predicted pose. +/// @param[in] poseIn The initial pose used for prediction. +/// @param[in] vel The pose velocity used to move the pose +/// forward in time. This function respects the valid +/// flags to make sure not to make use of parts of the state +/// that have not been filled in. +/// @param[in] predictionIntervalSec How long to integrate +/// the velocity to move the pose forward in time. +/// @param[out] poseOut The place to store the predicted +/// pose. May be a reference to the same structure as +/// poseIn. +static void PredictFuturePose( + const OSVR_PoseState &poseIn, + const OSVR_VelocityState &vel, + double predictionIntervalSec, + OSVR_PoseState &poseOut) +{ + // Make a copy of the pose state so that we can handle the + // case where the out and in pose are the same. + OSVR_PoseState out = poseIn; + + // If we have a change in orientation, make it. + if (vel.angularVelocityValid) { + + // Start out the new orientation at the original one + // from OSVR. q_type newOrientation; osvrQuatToQuatlib(newOrientation, &poseIn.rotation); - + // Rotate it by the amount to rotate once for every integral multiple // of the rotation time we've been asked to go. q_type rotationAmount; osvrQuatToQuatlib(rotationAmount, &vel.angularVelocity.incrementalRotation); - + double remaining = predictionIntervalSec; while (remaining > vel.angularVelocity.dt) { q_mult(newOrientation, rotationAmount, newOrientation); @@ -135,2175 +135,2175 @@ static void PredictFuturePose( // Then put it back into OSVR format in the output pose. osvrQuatFromQuatlib(&out.rotation, newOrientation); - } - - // If we have a linear velocity, apply it. - if (vel.linearVelocityValid) { - out.translation.data[0] += vel.linearVelocity.data[0] - * predictionIntervalSec; - out.translation.data[1] += vel.linearVelocity.data[1] - * predictionIntervalSec; - out.translation.data[2] += vel.linearVelocity.data[2] - * predictionIntervalSec; - } - - // Copy the resulting pose. - poseOut = out; -} - -/// Used to determine if we have three 2D points that are almost -/// in the same line. If so, they are not good for use as a -/// basis for interpolation. -static bool nearly_collinear(std::array const& p1, - std::array const& p2, - std::array const& p3) { - double dx1 = p2[0] - p1[0]; - double dy1 = p2[1] - p1[1]; - double dx2 = p3[0] - p1[0]; - double dy2 = p3[1] - p1[1]; - double len1 = sqrt(dx1 * dx1 + dy1 * dy1); - double len2 = sqrt(dx2 * dx2 + dy2 * dy2); - - // If either vector is zero length, they are collinear - if (len1 * len2 == 0) { - return true; - } - - // Normalize the vectors - dx1 /= len1; - dy1 /= len1; - dx2 /= len2; - dy2 /= len2; - - // See if the magnitude of their dot products is close to 1. - double dot = dx1 * dx2 + dy1 * dy2; - return fabs(dot) > 0.8; -} - -/// Interpolates the values at three 2D points to the -/// location of a third point. -static double interpolate(double p1X, double p1Y, double val1, double p2X, - double p2Y, double val2, double p3X, double p3Y, - double val3, double pointX, double pointY) { - // Fit a plane to three points, using their values as the - // third dimension. - q_vec_type p1, p2, p3; - q_vec_set(p1, p1X, p1Y, val1); - q_vec_set(p2, p2X, p2Y, val2); - q_vec_set(p3, p3X, p3Y, val3); - - // The normalized cross product of the vectors from the first - // point to each of the other two is normal to this plane. - q_vec_type v1, v2; - q_vec_subtract(v1, p2, p1); - q_vec_subtract(v2, p3, p1); - q_vec_type ABC; - q_vec_cross_product(ABC, v1, v2); - if (q_vec_magnitude(ABC) == 0) { - // We can't get a normal, degenerate points, just return the first - // value. - return val1; - } - q_vec_normalize(ABC, ABC); - - // Solve for the D associated with the plane by filling back - // in one of the points. This is done by taking the dot product - // of the ABC vector with the first point. We then solve for D. - // AX + BY + CZ + D = 0; D = -(AX + BY + CZ) - double D = -q_vec_dot_product(ABC, p1); - - // Evaluate the plane equations at our input point, which will interpolate - // or extrapolate our values. - // We're solving for Z in this case, so we get - // CZ = -(AX + BY + D); Z = -(AX + BY + D)/C; - return -(ABC[0] * pointX + ABC[1] * pointY + D) / ABC[2]; -} - -/// @brief Static helper function to make the identity xform -/// @todo Remove this once we use Eigen code below. -static void makeIdentity(q_xyz_quat_type& xform) { - xform.xyz[Q_X] = xform.xyz[Q_Y] = xform.xyz[Q_Z] = 0; - xform.quat[Q_X] = xform.quat[Q_Y] = xform.quat[Q_Z] = 0; - xform.quat[Q_W] = 1; -} - -/// @brief Static helper function to make the identity xform -/// @todo Remove this once we use Eigen code below. -static void q_from_OSVR(q_xyz_quat_type& xform, const OSVR_PoseState& pose) { - xform.xyz[Q_X] = pose.translation.data[0]; - xform.xyz[Q_Y] = pose.translation.data[1]; - xform.xyz[Q_Z] = pose.translation.data[2]; - xform.quat[Q_X] = osvrQuatGetX(&pose.rotation); - xform.quat[Q_Y] = osvrQuatGetY(&pose.rotation); - xform.quat[Q_Z] = osvrQuatGetZ(&pose.rotation); - xform.quat[Q_W] = osvrQuatGetW(&pose.rotation); -} - -/// @brief Static helper function to make the identity xform -/// @todo Remove this once we use Eigen code below. -static void OSVR_from_q(OSVR_PoseState& pose, const q_xyz_quat_type& xform) { - pose.translation.data[0] = xform.xyz[Q_X]; - pose.translation.data[1] = xform.xyz[Q_Y]; - pose.translation.data[2] = xform.xyz[Q_Z]; - osvrQuatSetX(&pose.rotation, xform.quat[Q_X]); - osvrQuatSetY(&pose.rotation, xform.quat[Q_Y]); - osvrQuatSetZ(&pose.rotation, xform.quat[Q_Z]); - osvrQuatSetW(&pose.rotation, xform.quat[Q_W]); -} - -namespace osvr { -namespace renderkit { - - RenderManager::RenderManager( - OSVR_ClientContext context, - const ConstructorParameters& p) { - - /// @todo Clone the passed-in context rather than creating our own, when - // this function is added to Core. - m_context = osvrClientInit("com.osvr.renderManager"); - - // Initialize all of the variables that don't have to be done in the - // list above, so we don't get warnings about out-of-order - // initialization if they are re-ordered in the header file. - m_params = p; - - /// Clear the callback for display, so it will - /// not be present until set - m_displayCallback.m_callback = nullptr; - m_displayCallback.m_userData = nullptr; - - /// Clear the callback for viewport/projection, so it will - /// not be present until set - m_viewCallback.m_callback = nullptr; - m_viewCallback.m_userData = nullptr; - - /// If we have been passed an empty headFromRoomName, then we - /// try /me/head. If that doesn't work, or if we can't get the - /// space we're asked for, print an error and the headFromWorld - /// transform will remain the identity transform. - std::string headSpaceName = "/me/head"; - if (p.m_roomFromHeadName.size() > 0) { - headSpaceName = p.m_roomFromHeadName; - } - - m_displayWidth = m_params.m_displayConfiguration.getDisplayWidth(); - m_displayHeight = m_params.m_displayConfiguration.getDisplayHeight(); - - if (osvrClientGetInterface(m_context, headSpaceName.c_str(), - &m_roomFromHeadInterface) == - OSVR_RETURN_FAILURE) { - std::cerr << "RenderManager::RenderManager(): Can't get interface " - << headSpaceName << std::endl; - throw std::runtime_error("Can't get head interface."); - } - osvrPose3SetIdentity(&m_roomFromHead); - - // We haven't yet registered our render buffers, so can't present them - m_renderBuffersRegistered = false; - } - - bool RenderManager::SetDisplayCallback(DisplayCallback callback, - void* userData) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - // Make sure we have valid data - if (callback == nullptr) { - std::cerr - << "RenderManager::SetDisplayCallback: NULL callback handler" - << std::endl; - return false; - } - - m_displayCallback.m_callback = callback; - m_displayCallback.m_userData = userData; - - return true; - } - - bool - RenderManager::SetViewProjectionCallback(ViewProjectionCallback callback, - void* userData) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - // Make sure we have valid data - if (callback == nullptr) { - std::cerr << "RenderManager::SetViewProjectionCallback: NULL " - "callback handler" - << std::endl; - return false; - } - - m_viewCallback.m_callback = callback; - m_viewCallback.m_userData = userData; - - return true; - } - - bool RenderManager::AddRenderCallback(const std::string& interfaceName, - RenderCallback callback, - void* userData) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - // Make sure we have valid data - if (callback == nullptr) { - std::cerr - << "RenderManager::AddRenderCallback: NULL callback handler" - << std::endl; - return false; - } - - // Create a new callback structure and fill it in. Make the - // pose be the identity pose until we hear otherwise. - RenderCallbackInfo cb; - cb.m_callback = callback; - cb.m_userData = userData; - cb.m_interfaceName = interfaceName; - cb.m_interface = nullptr; - osvrPose3SetIdentity(&cb.m_state); - - // If this is not world space, construct an interface - // description so we can render objects here. - if ((interfaceName.size() > 0) && (interfaceName != "/")) { - if (osvrClientGetInterface(m_context, interfaceName.c_str(), - &cb.m_interface) == - OSVR_RETURN_FAILURE) { - std::cerr << "RenderManager::AddRenderCallback(): Can't get " - "interface " - << interfaceName << std::endl; - } - } - - // Add this to the list of render callbacks. - m_callbacks.push_back(cb); - return true; - } - - bool RenderManager::RemoveRenderCallback(const std::string& interfaceName, - RenderCallback callback, - void* userData) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - // Look up an entry matching all three paramaters. If we - // find one, remove it from the list after removing its - // callback handler by freeing its interface object. - // If this callback does not have an interface, we don't - // free the interface. - for (size_t i = 0; i < m_callbacks.size(); i++) { - RenderCallbackInfo& ci = m_callbacks[i]; - if ((interfaceName == ci.m_interfaceName) && - (callback == ci.m_callback) && (userData == ci.m_userData)) { - if (ci.m_interface != nullptr) { - if (osvrClientFreeInterface(m_context, - ci.m_interface) == - OSVR_RETURN_FAILURE) { - std::cerr - << "RenderManager::RemoveRenderCallback(): Could " - "not free the interface for this callback." - << std::endl; - return false; - } - } - m_callbacks.erase(m_callbacks.begin() + i); - return true; - } - } - // We didn't fine one! - return false; - } - - RenderManager::~RenderManager() { - - // Unregister any remaining callback handlers for devices that - // are set to update our transformation matrices. - while (m_callbacks.size() > 0) { - RenderCallbackInfo& cb = m_callbacks.front(); - RemoveRenderCallback(cb.m_interfaceName, cb.m_callback, - cb.m_userData); - } - - // Close our roomFromHeadInterface - osvrClientFreeInterface(m_context, m_roomFromHeadInterface); - - // We're done with our context. - osvrClientShutdown(m_context); - } - - bool RenderManager::Render(const RenderParams& params) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - // Make sure we're doing okay. - if (!doingOkay()) { - std::cerr << "RenderManager::Render(): Display not opened." - << std::endl; - return false; - } - - // Make sure we've set up for the Render() path. - if (!m_renderPathSetupDone) { - if (!RenderPathSetup()) { - std::cerr << "RenderManager::Render(): RenderPathSetup() failed." - << std::endl; - return false; - } - m_renderPathSetupDone = true; - } - - // Update the transformations so that we have the most-recent - // state in them. - if (osvrClientUpdate(m_context) == OSVR_RETURN_FAILURE) { - std::cerr - << "RenderManager::Render(): client context update failed." - << std::endl; - return false; - } - - // Read the transformations - m_renderParamsForRender = params; - m_renderInfoForRender = GetRenderInfoInternal(params); - - // Initialize the rendering for the whole frame. - if (!RenderFrameInitialize()) { - return false; - } - - // One of the RenderDisplayInitialize() or RenderEyeInitialize() - // will call the client display-callback method, whichever is - // appropriate for the way it is rendering. This is because some - // renderers will do a different texture for each eye, so each is - // effectively its own display. - for (size_t display = 0; display < GetNumDisplays(); display++) { - - if (!RenderDisplayInitialize(display)) { - std::cerr - << "RenderManager::Render(): Could not initialize display " - << display << std::endl; - return false; - } - - // Render for each eye, setting up the appropriate projection matrix - // and viewport. - for (size_t eyeInDisplay = 0; eyeInDisplay < GetNumEyesPerDisplay(); - eyeInDisplay++) { - - // Figure out which overall eye this is. - size_t eye = eyeInDisplay + display * GetNumEyesPerDisplay(); - - // Initialize the projection matrix and viewport. - // Then call any user callback to handle whatever else - // needs doing (clearing the screen, for example). - // Compute and set the viewport and projection matrix. - // Use our internal member variables to store them so - // they will be available for the render space callbacks - // as well. - // Every eye is on its own display now, so we need to - // initialize and finalize the displays as well. - if (!RenderEyeInitialize(eye)) { - std::cerr - << "RenderManager::Render(): Could not initialize eye." - << std::endl; - return false; - } - if (m_viewCallback.m_callback != nullptr) { - m_viewCallback.m_callback( - m_viewCallback.m_userData, m_library, m_buffers, - m_renderInfoForRender[eye].viewport, - m_renderInfoForRender[eye].projection, eye); - } - - /// @todo Consider adding a shear to do with current - /// head velocity to the transform. Probably in - /// the RenderParams structure passed in. - - // Render objects in the callback spaces. - for (size_t i = 0; i < m_callbacks.size(); i++) { - - /// Construct the ModelView transform to use and then render - /// the - /// space. We can't just re-use the ones we got above - /// because - /// they are all done in world space. - /// If we don't get a modelview matrix for a particular - /// space, - /// we just don't render anything into that space. For - /// example, - /// the example demos look for left and right hands and they - /// might - /// not be defined. - OSVR_PoseState pose; - if (!ConstructModelView(i, eye, params, pose)) { - continue; - } - if (!RenderSpace(i, eye, pose, - m_renderInfoForRender[eye].viewport, - m_renderInfoForRender[eye].projection)) { - return false; - } - } - - // Done with this eye. - if (!RenderEyeFinalize(eye)) { - std::cerr - << "RenderManager::Render(): Could not finalize eye." - << std::endl; - return false; - } - } - - if (!RenderDisplayFinalize(display)) { - std::cerr - << "RenderManager::Render(): Could not finalize display " - << display << std::endl; - return false; - } - } - - // Finalize the rendering for the whole frame. - if (!RenderFrameFinalize()) { - return false; - } - - // Keep track of the timing information. - /// @todo - - return true; - } - - size_t RenderManager::LatchRenderInfo(const RenderParams& params) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - return LatchRenderInfoInternal(params); - } - - size_t RenderManager::LatchRenderInfoInternal(const RenderParams& params) { - m_latchedRenderInfo = GetRenderInfoInternal(params); - return m_latchedRenderInfo.size(); - } - - RenderInfo RenderManager::GetRenderInfo(size_t index) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - RenderInfo ret; - if (index < m_latchedRenderInfo.size()) { - ret = m_latchedRenderInfo[index]; - } - return ret; - } - - std::vector - RenderManager::GetRenderInfoInternal(const RenderParams& params) { - // Start with an empty vector, which will be returned as such on - // failure. - std::vector ret; - - // Make sure we're doing okay. - if (!doingOkay()) { - std::cerr << "RenderManager::GetRenderInfo(): Display not opened." - << std::endl; - ret.clear(); - return ret; - } - - // Update the transformations so that we have the most-recent - // state in them. - if (osvrClientUpdate(m_context) == OSVR_RETURN_FAILURE) { - std::cerr << "RenderManager::GetRenderInfo(): client context " - "update failed." - << std::endl; - ret.clear(); - return ret; - } - - // Determine parameters for each eye, filling in all relevant - // parameters. - size_t numEyes = GetNumEyes(); - for (size_t eye = 0; eye < numEyes; eye++) { - RenderInfo info; - info.library = m_library; - - // Compute the viewport. - // NOTE: The viewport needs to start at 0 and include the - // overfill border on all sides because this is the user's - // RenderTexture we are describing, not the final output - // screen. - OSVR_ViewportDescription v; - if (!ConstructViewportForRender(eye, v)) { - ret.clear(); - return ret; - } - info.viewport = v; - - // Construct the projection matrix. - if (!ConstructProjection(eye, params.nearClipDistanceMeters, - params.farClipDistanceMeters, - info.projection)) { - ret.clear(); - return ret; - } - - // Construct a ModelView transform for world space. - // By passing m_callbacks.size(), we guarantee world space. - if (!ConstructModelView(m_callbacks.size(), eye, params, - info.pose)) { - std::cerr << "RenderManagerBase::GetRenderInfo(): Could not " - "ConstructModelView" - << std::endl; - ret.clear(); - return ret; - } - - // Add this to the list of eyes to be rendered. - ret.push_back(info); - } - - return ret; - } - - bool RenderManager::RegisterRenderBuffers( - const std::vector& buffers, - bool appWillNotOverwriteBeforeNewPresent) { + } + + // If we have a linear velocity, apply it. + if (vel.linearVelocityValid) { + out.translation.data[0] += vel.linearVelocity.data[0] + * predictionIntervalSec; + out.translation.data[1] += vel.linearVelocity.data[1] + * predictionIntervalSec; + out.translation.data[2] += vel.linearVelocity.data[2] + * predictionIntervalSec; + } + + // Copy the resulting pose. + poseOut = out; +} + +/// Used to determine if we have three 2D points that are almost +/// in the same line. If so, they are not good for use as a +/// basis for interpolation. +static bool nearly_collinear(std::array const& p1, + std::array const& p2, + std::array const& p3) { + double dx1 = p2[0] - p1[0]; + double dy1 = p2[1] - p1[1]; + double dx2 = p3[0] - p1[0]; + double dy2 = p3[1] - p1[1]; + double len1 = sqrt(dx1 * dx1 + dy1 * dy1); + double len2 = sqrt(dx2 * dx2 + dy2 * dy2); + + // If either vector is zero length, they are collinear + if (len1 * len2 == 0) { + return true; + } + + // Normalize the vectors + dx1 /= len1; + dy1 /= len1; + dx2 /= len2; + dy2 /= len2; + + // See if the magnitude of their dot products is close to 1. + double dot = dx1 * dx2 + dy1 * dy2; + return fabs(dot) > 0.8; +} + +/// Interpolates the values at three 2D points to the +/// location of a third point. +static double interpolate(double p1X, double p1Y, double val1, double p2X, + double p2Y, double val2, double p3X, double p3Y, + double val3, double pointX, double pointY) { + // Fit a plane to three points, using their values as the + // third dimension. + q_vec_type p1, p2, p3; + q_vec_set(p1, p1X, p1Y, val1); + q_vec_set(p2, p2X, p2Y, val2); + q_vec_set(p3, p3X, p3Y, val3); + + // The normalized cross product of the vectors from the first + // point to each of the other two is normal to this plane. + q_vec_type v1, v2; + q_vec_subtract(v1, p2, p1); + q_vec_subtract(v2, p3, p1); + q_vec_type ABC; + q_vec_cross_product(ABC, v1, v2); + if (q_vec_magnitude(ABC) == 0) { + // We can't get a normal, degenerate points, just return the first + // value. + return val1; + } + q_vec_normalize(ABC, ABC); + + // Solve for the D associated with the plane by filling back + // in one of the points. This is done by taking the dot product + // of the ABC vector with the first point. We then solve for D. + // AX + BY + CZ + D = 0; D = -(AX + BY + CZ) + double D = -q_vec_dot_product(ABC, p1); + + // Evaluate the plane equations at our input point, which will interpolate + // or extrapolate our values. + // We're solving for Z in this case, so we get + // CZ = -(AX + BY + D); Z = -(AX + BY + D)/C; + return -(ABC[0] * pointX + ABC[1] * pointY + D) / ABC[2]; +} + +/// @brief Static helper function to make the identity xform +/// @todo Remove this once we use Eigen code below. +static void makeIdentity(q_xyz_quat_type& xform) { + xform.xyz[Q_X] = xform.xyz[Q_Y] = xform.xyz[Q_Z] = 0; + xform.quat[Q_X] = xform.quat[Q_Y] = xform.quat[Q_Z] = 0; + xform.quat[Q_W] = 1; +} + +/// @brief Static helper function to make the identity xform +/// @todo Remove this once we use Eigen code below. +static void q_from_OSVR(q_xyz_quat_type& xform, const OSVR_PoseState& pose) { + xform.xyz[Q_X] = pose.translation.data[0]; + xform.xyz[Q_Y] = pose.translation.data[1]; + xform.xyz[Q_Z] = pose.translation.data[2]; + xform.quat[Q_X] = osvrQuatGetX(&pose.rotation); + xform.quat[Q_Y] = osvrQuatGetY(&pose.rotation); + xform.quat[Q_Z] = osvrQuatGetZ(&pose.rotation); + xform.quat[Q_W] = osvrQuatGetW(&pose.rotation); +} + +/// @brief Static helper function to make the identity xform +/// @todo Remove this once we use Eigen code below. +static void OSVR_from_q(OSVR_PoseState& pose, const q_xyz_quat_type& xform) { + pose.translation.data[0] = xform.xyz[Q_X]; + pose.translation.data[1] = xform.xyz[Q_Y]; + pose.translation.data[2] = xform.xyz[Q_Z]; + osvrQuatSetX(&pose.rotation, xform.quat[Q_X]); + osvrQuatSetY(&pose.rotation, xform.quat[Q_Y]); + osvrQuatSetZ(&pose.rotation, xform.quat[Q_Z]); + osvrQuatSetW(&pose.rotation, xform.quat[Q_W]); +} + +namespace osvr { +namespace renderkit { + + RenderManager::RenderManager( + OSVR_ClientContext context, + const ConstructorParameters& p) { + + /// @todo Clone the passed-in context rather than creating our own, when + // this function is added to Core. + m_context = osvrClientInit("com.osvr.renderManager"); + + // Initialize all of the variables that don't have to be done in the + // list above, so we don't get warnings about out-of-order + // initialization if they are re-ordered in the header file. + m_params = p; + + /// Clear the callback for display, so it will + /// not be present until set + m_displayCallback.m_callback = nullptr; + m_displayCallback.m_userData = nullptr; + + /// Clear the callback for viewport/projection, so it will + /// not be present until set + m_viewCallback.m_callback = nullptr; + m_viewCallback.m_userData = nullptr; + + /// If we have been passed an empty headFromRoomName, then we + /// try /me/head. If that doesn't work, or if we can't get the + /// space we're asked for, print an error and the headFromWorld + /// transform will remain the identity transform. + std::string headSpaceName = "/me/head"; + if (p.m_roomFromHeadName.size() > 0) { + headSpaceName = p.m_roomFromHeadName; + } + + m_displayWidth = m_params.m_displayConfiguration.getDisplayWidth(); + m_displayHeight = m_params.m_displayConfiguration.getDisplayHeight(); + + if (osvrClientGetInterface(m_context, headSpaceName.c_str(), + &m_roomFromHeadInterface) == + OSVR_RETURN_FAILURE) { + std::cerr << "RenderManager::RenderManager(): Can't get interface " + << headSpaceName << std::endl; + throw std::runtime_error("Can't get head interface."); + } + osvrPose3SetIdentity(&m_roomFromHead); + + // We haven't yet registered our render buffers, so can't present them + m_renderBuffersRegistered = false; + } + + bool RenderManager::SetDisplayCallback(DisplayCallback callback, + void* userData) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + // Make sure we have valid data + if (callback == nullptr) { + std::cerr + << "RenderManager::SetDisplayCallback: NULL callback handler" + << std::endl; + return false; + } + + m_displayCallback.m_callback = callback; + m_displayCallback.m_userData = userData; + + return true; + } + + bool + RenderManager::SetViewProjectionCallback(ViewProjectionCallback callback, + void* userData) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + // Make sure we have valid data + if (callback == nullptr) { + std::cerr << "RenderManager::SetViewProjectionCallback: NULL " + "callback handler" + << std::endl; + return false; + } + + m_viewCallback.m_callback = callback; + m_viewCallback.m_userData = userData; + + return true; + } + + bool RenderManager::AddRenderCallback(const std::string& interfaceName, + RenderCallback callback, + void* userData) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + // Make sure we have valid data + if (callback == nullptr) { + std::cerr + << "RenderManager::AddRenderCallback: NULL callback handler" + << std::endl; + return false; + } + + // Create a new callback structure and fill it in. Make the + // pose be the identity pose until we hear otherwise. + RenderCallbackInfo cb; + cb.m_callback = callback; + cb.m_userData = userData; + cb.m_interfaceName = interfaceName; + cb.m_interface = nullptr; + osvrPose3SetIdentity(&cb.m_state); + + // If this is not world space, construct an interface + // description so we can render objects here. + if ((interfaceName.size() > 0) && (interfaceName != "/")) { + if (osvrClientGetInterface(m_context, interfaceName.c_str(), + &cb.m_interface) == + OSVR_RETURN_FAILURE) { + std::cerr << "RenderManager::AddRenderCallback(): Can't get " + "interface " + << interfaceName << std::endl; + } + } + + // Add this to the list of render callbacks. + m_callbacks.push_back(cb); + return true; + } + + bool RenderManager::RemoveRenderCallback(const std::string& interfaceName, + RenderCallback callback, + void* userData) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + // Look up an entry matching all three paramaters. If we + // find one, remove it from the list after removing its + // callback handler by freeing its interface object. + // If this callback does not have an interface, we don't + // free the interface. + for (size_t i = 0; i < m_callbacks.size(); i++) { + RenderCallbackInfo& ci = m_callbacks[i]; + if ((interfaceName == ci.m_interfaceName) && + (callback == ci.m_callback) && (userData == ci.m_userData)) { + if (ci.m_interface != nullptr) { + if (osvrClientFreeInterface(m_context, + ci.m_interface) == + OSVR_RETURN_FAILURE) { + std::cerr + << "RenderManager::RemoveRenderCallback(): Could " + "not free the interface for this callback." + << std::endl; + return false; + } + } + m_callbacks.erase(m_callbacks.begin() + i); + return true; + } + } + // We didn't fine one! + return false; + } + + RenderManager::~RenderManager() { + + // Unregister any remaining callback handlers for devices that + // are set to update our transformation matrices. + while (m_callbacks.size() > 0) { + RenderCallbackInfo& cb = m_callbacks.front(); + RemoveRenderCallback(cb.m_interfaceName, cb.m_callback, + cb.m_userData); + } + + // Close our roomFromHeadInterface + osvrClientFreeInterface(m_context, m_roomFromHeadInterface); + + // We're done with our context. + osvrClientShutdown(m_context); + } + + bool RenderManager::Render(const RenderParams& params) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + // Make sure we're doing okay. + if (!doingOkay()) { + std::cerr << "RenderManager::Render(): Display not opened." + << std::endl; + return false; + } + + // Make sure we've set up for the Render() path. + if (!m_renderPathSetupDone) { + if (!RenderPathSetup()) { + std::cerr << "RenderManager::Render(): RenderPathSetup() failed." + << std::endl; + return false; + } + m_renderPathSetupDone = true; + } + + // Update the transformations so that we have the most-recent + // state in them. + if (osvrClientUpdate(m_context) == OSVR_RETURN_FAILURE) { + std::cerr + << "RenderManager::Render(): client context update failed." + << std::endl; + return false; + } + + // Read the transformations + m_renderParamsForRender = params; + m_renderInfoForRender = GetRenderInfoInternal(params); + + // Initialize the rendering for the whole frame. + if (!RenderFrameInitialize()) { + return false; + } + + // One of the RenderDisplayInitialize() or RenderEyeInitialize() + // will call the client display-callback method, whichever is + // appropriate for the way it is rendering. This is because some + // renderers will do a different texture for each eye, so each is + // effectively its own display. + for (size_t display = 0; display < GetNumDisplays(); display++) { + + if (!RenderDisplayInitialize(display)) { + std::cerr + << "RenderManager::Render(): Could not initialize display " + << display << std::endl; + return false; + } + + // Render for each eye, setting up the appropriate projection matrix + // and viewport. + for (size_t eyeInDisplay = 0; eyeInDisplay < GetNumEyesPerDisplay(); + eyeInDisplay++) { + + // Figure out which overall eye this is. + size_t eye = eyeInDisplay + display * GetNumEyesPerDisplay(); + + // Initialize the projection matrix and viewport. + // Then call any user callback to handle whatever else + // needs doing (clearing the screen, for example). + // Compute and set the viewport and projection matrix. + // Use our internal member variables to store them so + // they will be available for the render space callbacks + // as well. + // Every eye is on its own display now, so we need to + // initialize and finalize the displays as well. + if (!RenderEyeInitialize(eye)) { + std::cerr + << "RenderManager::Render(): Could not initialize eye." + << std::endl; + return false; + } + if (m_viewCallback.m_callback != nullptr) { + m_viewCallback.m_callback( + m_viewCallback.m_userData, m_library, m_buffers, + m_renderInfoForRender[eye].viewport, + m_renderInfoForRender[eye].projection, eye); + } + + /// @todo Consider adding a shear to do with current + /// head velocity to the transform. Probably in + /// the RenderParams structure passed in. + + // Render objects in the callback spaces. + for (size_t i = 0; i < m_callbacks.size(); i++) { + + /// Construct the ModelView transform to use and then render + /// the + /// space. We can't just re-use the ones we got above + /// because + /// they are all done in world space. + /// If we don't get a modelview matrix for a particular + /// space, + /// we just don't render anything into that space. For + /// example, + /// the example demos look for left and right hands and they + /// might + /// not be defined. + OSVR_PoseState pose; + if (!ConstructModelView(i, eye, params, pose)) { + continue; + } + if (!RenderSpace(i, eye, pose, + m_renderInfoForRender[eye].viewport, + m_renderInfoForRender[eye].projection)) { + return false; + } + } + + // Done with this eye. + if (!RenderEyeFinalize(eye)) { + std::cerr + << "RenderManager::Render(): Could not finalize eye." + << std::endl; + return false; + } + } + + if (!RenderDisplayFinalize(display)) { + std::cerr + << "RenderManager::Render(): Could not finalize display " + << display << std::endl; + return false; + } + } + + // Finalize the rendering for the whole frame. + if (!RenderFrameFinalize()) { + return false; + } + + // Keep track of the timing information. + /// @todo + + return true; + } + + size_t RenderManager::LatchRenderInfo(const RenderParams& params) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + return LatchRenderInfoInternal(params); + } + + size_t RenderManager::LatchRenderInfoInternal(const RenderParams& params) { + m_latchedRenderInfo = GetRenderInfoInternal(params); + return m_latchedRenderInfo.size(); + } + + RenderInfo RenderManager::GetRenderInfo(size_t index) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + RenderInfo ret; + if (index < m_latchedRenderInfo.size()) { + ret = m_latchedRenderInfo[index]; + } + return ret; + } + + std::vector + RenderManager::GetRenderInfoInternal(const RenderParams& params) { + // Start with an empty vector, which will be returned as such on + // failure. + std::vector ret; + + // Make sure we're doing okay. + if (!doingOkay()) { + std::cerr << "RenderManager::GetRenderInfo(): Display not opened." + << std::endl; + ret.clear(); + return ret; + } + + // Update the transformations so that we have the most-recent + // state in them. + if (osvrClientUpdate(m_context) == OSVR_RETURN_FAILURE) { + std::cerr << "RenderManager::GetRenderInfo(): client context " + "update failed." + << std::endl; + ret.clear(); + return ret; + } + + // Determine parameters for each eye, filling in all relevant + // parameters. + size_t numEyes = GetNumEyes(); + for (size_t eye = 0; eye < numEyes; eye++) { + RenderInfo info; + info.library = m_library; + + // Compute the viewport. + // NOTE: The viewport needs to start at 0 and include the + // overfill border on all sides because this is the user's + // RenderTexture we are describing, not the final output + // screen. + OSVR_ViewportDescription v; + if (!ConstructViewportForRender(eye, v)) { + ret.clear(); + return ret; + } + info.viewport = v; + + // Construct the projection matrix. + if (!ConstructProjection(eye, params.nearClipDistanceMeters, + params.farClipDistanceMeters, + info.projection)) { + ret.clear(); + return ret; + } + + // Construct a ModelView transform for world space. + // By passing m_callbacks.size(), we guarantee world space. + if (!ConstructModelView(m_callbacks.size(), eye, params, + info.pose)) { + std::cerr << "RenderManagerBase::GetRenderInfo(): Could not " + "ConstructModelView" + << std::endl; + ret.clear(); + return ret; + } + + // Add this to the list of eyes to be rendered. + ret.push_back(info); + } + + return ret; + } + + bool RenderManager::RegisterRenderBuffers( + const std::vector& buffers, + bool appWillNotOverwriteBeforeNewPresent) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + return RegisterRenderBuffersInternal( + buffers, appWillNotOverwriteBeforeNewPresent); + } + + bool RenderManager::RegisterRenderBuffersInternal( + const std::vector& buffers, + bool /* appWillNotOverwriteBeforeNewPresent */) { + // Record that we registered our render buffers. + m_renderBuffersRegistered = true; + return true; + } + + bool RenderManager::PresentRenderBuffers( + const std::vector& buffers, + const std::vector& renderInfoUsed, + const RenderParams& renderParams, + const std::vector& + normalizedCroppingViewports, + bool flipInY) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + return PresentRenderBuffersInternal( + buffers, renderInfoUsed, renderParams, normalizedCroppingViewports, + flipInY); + } + + bool RenderManager::PresentRenderBuffersInternal( + const std::vector& buffers, + const std::vector& renderInfoUsed, + const RenderParams &renderParams, + const std::vector& + normalizedCroppingViewports, + bool flipInY) { + // Make sure we're doing okay. + if (!doingOkay()) { + std::cerr + << "RenderManager::PresentRenderBuffers(): Display not opened." + << std::endl; + return false; + } + + // Make sure we've registered some render buffers + if (!m_renderBuffersRegistered) { + std::cerr << "RenderManager::PresentRenderBuffers(): Buffers not " + "registered." + << std::endl; + return false; + } + + // Initialize the presentation for the whole frame. + if (!PresentFrameInitialize()) { + std::cerr << "RenderManager::PresentRenderBuffers(): " + "PresentFrameInitialize() failed." + << std::endl; + return false; + } + + // If we're doing Time Warp and we have a positive maximum + // milliseconds until vsync, and we are able to read the timing + // information needed to determine how far ahead of vsync we + // are, then we continue to update our context state until we're + // within the required threshold. + + if (m_params.m_enableTimeWarp && + (m_params.m_maxMSBeforeVsyncTimeWarp > 0)) { + int count = 0; + + // Compute the threshold interval we need to be below. + // Convert from milliseconds to seconds + float thresholdF = m_params.m_maxMSBeforeVsyncTimeWarp / 1e3f; + OSVR_TimeValue threshold; + threshold.seconds = static_cast(thresholdF); + thresholdF -= threshold.seconds; + threshold.microseconds = + static_cast(thresholdF * 1e6); + + bool proceed; + do { + // Go ahead unless something stops us. + proceed = true; + + // Update the client context so we keep getting all required + // callbacks called during our busy-wait. + if (osvrClientUpdate(m_context) == OSVR_RETURN_FAILURE) { + std::cerr << "RenderManager::PresentRenderBuffers(): " + "client context update failed." + << std::endl; + return false; + } + + // Check to see if we are able to determine the timing info. + // If so, see if we're within the threshold. If not, don't + // proceed. + // We use the first eye in the system and assume that all of the + // others are synchronized to it. + // @todo Consider what happens for non-genlocked displays + RenderTimingInfo info; + if (GetTimingInfo(0, info)) { + OSVR_TimeValue nextRetrace = info.hardwareDisplayInterval; + osvrTimeValueDifference(&nextRetrace, + &info.timeSincelastVerticalRetrace); + if (osvrTimeValueGreater(&nextRetrace, &threshold)) { + proceed = false; + } + } + + ++count; + } while (!proceed); + } + + // Use the current and previous parameters to construct info + // needed to perform Time Warp. + std::vector currentRenderInfo = + GetRenderInfoInternal(renderParams); + // @todo make the depth for time warp a parameter? + if (m_params.m_enableTimeWarp) { + if (!ComputeAsynchronousTimeWarps(renderInfoUsed, currentRenderInfo, + 2.0f)) { + std::cerr << "RenderManager::PresentRenderBuffers: Could not " + "compute time warps" + << std::endl; + return false; + } + } + + // Render into each display, setting up the display beforehand and + // finalizing it after. + for (size_t display = 0; display < GetNumDisplays(); display++) { + + // Set up the appropriate display before setting up its eye(s). + if (!PresentDisplayInitialize(display)) { + std::cerr << "RenderManager::PresentRenderBuffers(): " + "PresentDisplayInitialize() failed." + << std::endl; + return false; + } + + // Render for each eye, setting up the appropriate projection + // and viewport. + for (size_t eyeInDisplay = 0; eyeInDisplay < GetNumEyesPerDisplay(); + eyeInDisplay++) { + + // Figure out which overall eye this is. + size_t eye = eyeInDisplay + display * GetNumEyesPerDisplay(); + + /// @todo Consider adding a shear to do with current + /// head velocity to the transform. Probably in + /// the RenderParams structure passed in. + + // See if we need to rotate by 90 or 180 degrees about Z. If + // so, do so + // NOTE: This would adjust the distortion center of projection, + // but it is + // assumed that we're doing this to make scan-out circuitry + // behave + // rather than to change where the actual pixel location of the + // center + // of projection is. + float rotate_pixels_degrees = 0; + if (m_params.m_displayConfiguration.getEyes()[eye] + .m_rotate180 != 0) { + rotate_pixels_degrees = 180; + } + + // If we have display scan-out rotation, we add it to the amount + // of + // rotation we've already been asked to do. + switch (m_params.m_displayRotation) { + case ConstructorParameters::Display_Rotation::Ninety: + rotate_pixels_degrees += 90.0; + break; + case ConstructorParameters::Display_Rotation::OneEighty: + rotate_pixels_degrees += 180.0; + break; + case ConstructorParameters::Display_Rotation::TwoSeventy: + rotate_pixels_degrees += 270.0; + break; + default: + // Nothing to do here. + break; + } + + /// Pass rotate_pixels_degrees + PresentEyeParameters p; + p.m_index = eye; + p.m_rotateDegrees = rotate_pixels_degrees; + if (buffers.size() <= eye) { + std::cerr << "RenderManager::PresentRenderBuffers: Given " + << GetNumEyes() << " eyes, but only " + << buffers.size() << " buffers" << std::endl; + return false; + } + p.m_buffer = buffers[eye]; + p.m_flipInY = flipInY; + + // Pass in a pointer to the Asynchronous Time Warp matrix to + // use, or nullptr (default) if there is not one. + if (m_params.m_enableTimeWarp) { + // Apply the asynchronous time warp matrix for this eye. + if (m_asynchronousTimeWarps.size() <= eye) { + std::cerr << "RenderManager::PresentRenderBuffers: " + "Required Asynchronous Time " + << "Warp matrix not available" << std::endl; + return false; + } + p.m_timeWarp = &m_asynchronousTimeWarps[eye]; + } + + // Fill in the region to image within the buffer. If the client + // has + // mapped multiple eyes into the same texture, we need to aim at + // a subset of it for each according to the viewports they + // passed in. + // If they didn't pass anything, use the full buffer. + OSVR_ViewportDescription bufferCrop; + if (eye < normalizedCroppingViewports.size()) { + bufferCrop = normalizedCroppingViewports[eye]; + } else { + bufferCrop.left = 0; + bufferCrop.lower = 0; + bufferCrop.width = 1; + bufferCrop.height = 1; + } + p.m_normalizedCroppingViewport = bufferCrop; + + if (!PresentEye(p)) { + std::cerr << "RenderManager::PresentRenderBuffers(): " + "PresentEye failed." + << std::endl; + return false; + } + } + + // We're done with this display. + if (!PresentDisplayFinalize(display)) { + std::cerr << "RenderManager::PresentRenderBuffers(): " + "PresentDisplayFinalize failed." + << std::endl; + return false; + } + } + + // Finalize the rendering for the whole frame. + if (!PresentFrameFinalize()) { + std::cerr << "RenderManager::PresentRenderBuffers(): " + "PresentFrameFinalize failed." + << std::endl; + return false; + } + + // Keep track of the timing information. + /// @todo + + return true; + } + + bool RenderManager::PresentSolidColor( + const RGBColorf &color) { // All public methods that use internal state should be guarded // by a mutex. std::lock_guard lock(m_mutex); - return RegisterRenderBuffersInternal( - buffers, appWillNotOverwriteBeforeNewPresent); - } - - bool RenderManager::RegisterRenderBuffersInternal( - const std::vector& buffers, - bool /* appWillNotOverwriteBeforeNewPresent */) { - // Record that we registered our render buffers. - m_renderBuffersRegistered = true; - return true; - } - - bool RenderManager::PresentRenderBuffers( - const std::vector& buffers, - const std::vector& renderInfoUsed, - const RenderParams& renderParams, - const std::vector& - normalizedCroppingViewports, - bool flipInY) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - return PresentRenderBuffersInternal( - buffers, renderInfoUsed, renderParams, normalizedCroppingViewports, - flipInY); - } - - bool RenderManager::PresentRenderBuffersInternal( - const std::vector& buffers, - const std::vector& renderInfoUsed, - const RenderParams &renderParams, - const std::vector& - normalizedCroppingViewports, - bool flipInY) { - // Make sure we're doing okay. - if (!doingOkay()) { - std::cerr - << "RenderManager::PresentRenderBuffers(): Display not opened." - << std::endl; - return false; - } - - // Make sure we've registered some render buffers - if (!m_renderBuffersRegistered) { - std::cerr << "RenderManager::PresentRenderBuffers(): Buffers not " - "registered." - << std::endl; - return false; - } - - // Initialize the presentation for the whole frame. - if (!PresentFrameInitialize()) { - std::cerr << "RenderManager::PresentRenderBuffers(): " - "PresentFrameInitialize() failed." - << std::endl; - return false; - } - - // If we're doing Time Warp and we have a positive maximum - // milliseconds until vsync, and we are able to read the timing - // information needed to determine how far ahead of vsync we - // are, then we continue to update our context state until we're - // within the required threshold. - - if (m_params.m_enableTimeWarp && - (m_params.m_maxMSBeforeVsyncTimeWarp > 0)) { - int count = 0; - - // Compute the threshold interval we need to be below. - // Convert from milliseconds to seconds - float thresholdF = m_params.m_maxMSBeforeVsyncTimeWarp / 1e3f; - OSVR_TimeValue threshold; - threshold.seconds = static_cast(thresholdF); - thresholdF -= threshold.seconds; - threshold.microseconds = - static_cast(thresholdF * 1e6); - - bool proceed; - do { - // Go ahead unless something stops us. - proceed = true; - - // Update the client context so we keep getting all required - // callbacks called during our busy-wait. - if (osvrClientUpdate(m_context) == OSVR_RETURN_FAILURE) { - std::cerr << "RenderManager::PresentRenderBuffers(): " - "client context update failed." - << std::endl; - return false; - } - - // Check to see if we are able to determine the timing info. - // If so, see if we're within the threshold. If not, don't - // proceed. - // We use the first eye in the system and assume that all of the - // others are synchronized to it. - // @todo Consider what happens for non-genlocked displays - RenderTimingInfo info; - if (GetTimingInfo(0, info)) { - OSVR_TimeValue nextRetrace = info.hardwareDisplayInterval; - osvrTimeValueDifference(&nextRetrace, - &info.timeSincelastVerticalRetrace); - if (osvrTimeValueGreater(&nextRetrace, &threshold)) { - proceed = false; - } - } - - ++count; - } while (!proceed); - } - - // Use the current and previous parameters to construct info - // needed to perform Time Warp. - std::vector currentRenderInfo = - GetRenderInfoInternal(renderParams); - // @todo make the depth for time warp a parameter? - if (m_params.m_enableTimeWarp) { - if (!ComputeAsynchronousTimeWarps(renderInfoUsed, currentRenderInfo, - 2.0f)) { - std::cerr << "RenderManager::PresentRenderBuffers: Could not " - "compute time warps" - << std::endl; - return false; - } - } - - // Render into each display, setting up the display beforehand and - // finalizing it after. - for (size_t display = 0; display < GetNumDisplays(); display++) { - - // Set up the appropriate display before setting up its eye(s). - if (!PresentDisplayInitialize(display)) { - std::cerr << "RenderManager::PresentRenderBuffers(): " - "PresentDisplayInitialize() failed." - << std::endl; - return false; - } - - // Render for each eye, setting up the appropriate projection - // and viewport. - for (size_t eyeInDisplay = 0; eyeInDisplay < GetNumEyesPerDisplay(); - eyeInDisplay++) { - - // Figure out which overall eye this is. - size_t eye = eyeInDisplay + display * GetNumEyesPerDisplay(); - - /// @todo Consider adding a shear to do with current - /// head velocity to the transform. Probably in - /// the RenderParams structure passed in. - - // See if we need to rotate by 90 or 180 degrees about Z. If - // so, do so - // NOTE: This would adjust the distortion center of projection, - // but it is - // assumed that we're doing this to make scan-out circuitry - // behave - // rather than to change where the actual pixel location of the - // center - // of projection is. - float rotate_pixels_degrees = 0; - if (m_params.m_displayConfiguration.getEyes()[eye] - .m_rotate180 != 0) { - rotate_pixels_degrees = 180; - } - - // If we have display scan-out rotation, we add it to the amount - // of - // rotation we've already been asked to do. - switch (m_params.m_displayRotation) { - case ConstructorParameters::Display_Rotation::Ninety: - rotate_pixels_degrees += 90.0; - break; - case ConstructorParameters::Display_Rotation::OneEighty: - rotate_pixels_degrees += 180.0; - break; - case ConstructorParameters::Display_Rotation::TwoSeventy: - rotate_pixels_degrees += 270.0; - break; - default: - // Nothing to do here. - break; - } - - /// Pass rotate_pixels_degrees - PresentEyeParameters p; - p.m_index = eye; - p.m_rotateDegrees = rotate_pixels_degrees; - if (buffers.size() <= eye) { - std::cerr << "RenderManager::PresentRenderBuffers: Given " - << GetNumEyes() << " eyes, but only " - << buffers.size() << " buffers" << std::endl; - return false; - } - p.m_buffer = buffers[eye]; - p.m_flipInY = flipInY; - - // Pass in a pointer to the Asynchronous Time Warp matrix to - // use, or nullptr (default) if there is not one. - if (m_params.m_enableTimeWarp) { - // Apply the asynchronous time warp matrix for this eye. - if (m_asynchronousTimeWarps.size() <= eye) { - std::cerr << "RenderManager::PresentRenderBuffers: " - "Required Asynchronous Time " - << "Warp matrix not available" << std::endl; - return false; - } - p.m_timeWarp = &m_asynchronousTimeWarps[eye]; - } - - // Fill in the region to image within the buffer. If the client - // has - // mapped multiple eyes into the same texture, we need to aim at - // a subset of it for each according to the viewports they - // passed in. - // If they didn't pass anything, use the full buffer. - OSVR_ViewportDescription bufferCrop; - if (eye < normalizedCroppingViewports.size()) { - bufferCrop = normalizedCroppingViewports[eye]; - } else { - bufferCrop.left = 0; - bufferCrop.lower = 0; - bufferCrop.width = 1; - bufferCrop.height = 1; - } - p.m_normalizedCroppingViewport = bufferCrop; - - if (!PresentEye(p)) { - std::cerr << "RenderManager::PresentRenderBuffers(): " - "PresentEye failed." - << std::endl; - return false; - } - } - - // We're done with this display. - if (!PresentDisplayFinalize(display)) { - std::cerr << "RenderManager::PresentRenderBuffers(): " - "PresentDisplayFinalize failed." - << std::endl; - return false; - } - } - - // Finalize the rendering for the whole frame. - if (!PresentFrameFinalize()) { - std::cerr << "RenderManager::PresentRenderBuffers(): " - "PresentFrameFinalize failed." - << std::endl; - return false; - } - - // Keep track of the timing information. - /// @todo - - return true; - } - - bool RenderManager::PresentSolidColor( - const RGBColorf &color) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - return PresentSolidColorInternal(color); - } - - bool RenderManager::PresentSolidColorInternal( - const RGBColorf &color) { - // Make sure we're doing okay. - if (!doingOkay()) { - std::cerr - << "RenderManager::PresentSolidColorInternal(): Display not opened." - << std::endl; - return false; - } - - // Initialize the presentation for the whole frame. - if (!PresentFrameInitialize()) { - std::cerr << "RenderManager::PresentSolidColorInternal(): " - "PresentFrameInitialize() failed." - << std::endl; - return false; - } - - // Render into each display, setting up the display beforehand and - // finalizing it after. - for (size_t display = 0; display < GetNumDisplays(); display++) { - - // Set up the appropriate display before setting up its eye(s). - if (!PresentDisplayInitialize(display)) { - std::cerr << "RenderManager::PresentSolidColorInternal(): " - "PresentDisplayInitialize() failed." - << std::endl; - return false; - } - - // Render for each eye, setting up the appropriate projection - // and viewport. - for (size_t eyeInDisplay = 0; eyeInDisplay < GetNumEyesPerDisplay(); - eyeInDisplay++) { - - // Figure out which overall eye this is. - size_t eye = eyeInDisplay + display * GetNumEyesPerDisplay(); - - if (!SolidColorEye(eye, color)) { - std::cerr << "RenderManager::PresentSolidColorInternal(): " - "PresentEye failed." - << std::endl; - return false; - } - } - - // We're done with this display. - if (!PresentDisplayFinalize(display)) { - std::cerr << "RenderManager::PresentSolidColorInternal(): " - "PresentDisplayFinalize failed." - << std::endl; - return false; - } - } - - // Finalize the rendering for the whole frame. - if (!PresentFrameFinalize()) { - std::cerr << "RenderManager::PresentSolidColorInternal(): " - "PresentFrameFinalize failed." - << std::endl; - return false; - } - - return true; - } - - bool RenderManager::UpdateDistortionMeshes( - DistortionMeshType type //< Type of mesh to produce - , - std::vector const& - distort //< Distortion parameters - ) { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - return UpdateDistortionMeshesInternal(type, distort); - } - - void RenderManager::SetRoomRotationUsingHead() { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - osvrClientSetRoomRotationUsingHead(m_context); - } - - void RenderManager::ClearRoomToWorldTransform() { - // All public methods that use internal state should be guarded - // by a mutex. - std::lock_guard lock(m_mutex); - - osvrClientClearRoomToWorldTransform(m_context); - } - - size_t RenderManager::GetNumEyes() { - return m_params.m_displayConfiguration.getEyes().size(); - } - - size_t RenderManager::GetNumDisplays() { - switch (m_params.m_displayConfiguration.getEyes().size()) { - case 1: - return 1; - case 2: - if (m_params.m_displayConfiguration.getDisplayMode() == - OSVRDisplayConfiguration::DisplayMode::FULL_SCREEN) { - return 2; - } - return 1; - default: - std::cerr << "RenderManager::GetNumDisplays(): Unrecognized value: " - << m_params.m_displayConfiguration.getEyes().size() - << std::endl; - } - return 1; - } - - size_t RenderManager::GetNumEyesPerDisplay() { - if (GetNumDisplays() == 0) { - return 0; - } - return GetNumEyes() / GetNumDisplays(); - } - - size_t RenderManager::GetDisplayUsedByEye(size_t eye) { - if (GetNumDisplays() == 0) { - return 0; - } - return eye / GetNumEyesPerDisplay(); - } - - bool RenderManager::ConstructProjection(size_t whichEye, - double nearClipDistanceMeters, - double farClipDistanceMeters, - OSVR_ProjectionMatrix& projection) { - // Make sure that we have as many eyes as were asked for - if (whichEye >= GetNumEyes()) { - return false; - } - - //-------------------------------------------------------------------- - // Configure a projection transform based on the characteristics of the - // display we are using. - - // Scale the unit X and Y parameters based on the near - // plane to make the field of view match what we expect. - // The tangent of the view angle in either axis is the - // in-plane distance (left, right, top, or bottom) divided - // by the distance to the near clipping plane. We have - // the angle specified and for now we assume a unit distance - // to the window (we will adjust that later). Given - // this, we solve for the tangent of half the angle - // (each of left and right provide half, as do top and - // bottom). - double right = - tan(osvr::util::getRadians( - m_params.m_displayConfiguration.getHorizontalFOV()) / - 2.0); - double left = -right; - double top = tan(osvr::util::getRadians( - m_params.m_displayConfiguration.getVerticalFOV()) / - 2.0); - double bottom = -top; - - // Scale the in-plane positions based on the near plane to put - // the virtual viewing window on the near plane with the eye at the - // origin. - left *= nearClipDistanceMeters; - right *= nearClipDistanceMeters; - top *= nearClipDistanceMeters; - bottom *= nearClipDistanceMeters; - - // Incorporate the center-of-projection information for this - // eye, shifting so that 0.5,0.5 is in the center of the screen. - // We need to do this before we scale the viewport to add the amount - // needed for overfill, so we don't end up shifting past the edge of - // the actual screen. - double width = right - left; - double height = top - bottom; - double xCOP = - m_params.m_displayConfiguration.getEyes()[whichEye].m_CenterProjX; - double yCOP = - m_params.m_displayConfiguration.getEyes()[whichEye].m_CenterProjY; - double xOffset = (0.5 - xCOP) * width; - double yOffset = (0.5 - yCOP) * height; - left += xOffset; - right += xOffset; - top += yOffset; - bottom += yOffset; - - // Incorporate pitch_tilt (degrees, positive is downwards) - // We assume that this results in a shearing of the image that leaves - // the plane of the screen the same. - auto pitchTilt = m_params.m_displayConfiguration.getPitchTilt(); - if (pitchTilt != 0 * util::radians) { - /// @todo - } - - // Add in the extra space needed to handle the rendering overfill used - // to provide margin for distortion correction and Time - // Warp. We do in a way that can handle off-center projection by - // adding a margin (which is half of the total overfill) to each edge. - double xMargin = width / 2 * (m_params.m_renderOverfillFactor - 1); - double yMargin = height / 2 * (m_params.m_renderOverfillFactor - 1); - left -= xMargin; - right += xMargin; - top += yMargin; - bottom -= yMargin; - - // We handle rotation of the pixels on the way to the screen, - // due to the scan-out circuitry, in the code that reprojects the - // rendered texture into the screen. We don't need to handle - // it here (and should not, because it will rotate bitmapped - // textures). - - // Make sure that things won't blow up in the math below. - if ((nearClipDistanceMeters <= 0) || (farClipDistanceMeters <= 0) || - (nearClipDistanceMeters == farClipDistanceMeters) || - (left == right) || (top == bottom)) { - return false; - } - - /// @todo Figure out interactions between the above shifts and - /// distortions - /// and make sure to do them in the right order, or to adjust as needed - /// to - /// make them consistent when they are composed. - - // Set the values in the projection matrix - projection.left = left; - projection.right = right; - projection.top = top; - projection.bottom = bottom; - projection.nearClip = nearClipDistanceMeters; - projection.farClip = farClipDistanceMeters; - - return true; - } - - bool RenderManager::ConstructViewportForRender( - size_t whichEye, OSVR_ViewportDescription& viewport) { - // Zero the viewpoint to start with. - viewport.left = viewport.lower = viewport.width = viewport.height = 0; - - // Make sure that we have as many eyes as were asked for - if (whichEye >= GetNumEyes()) { - return false; - } - - // Figure out the fraction of the display we're rendering to based - // on the display mode. - // Set up the viewport based on the display resolution and the - // display configuration. - double xFactor = 1, yFactor = 1; - switch (m_params.m_displayConfiguration.getDisplayMode()) { - case OSVRDisplayConfiguration::DisplayMode::FULL_SCREEN: - // Already set. - break; - case OSVRDisplayConfiguration::DisplayMode::HORIZONTAL_SIDE_BY_SIDE: - xFactor = 0.5; - break; - case OSVRDisplayConfiguration::DisplayMode::VERTICAL_SIDE_BY_SIDE: - yFactor = 0.5; - break; - default: - std::cerr << "RenderManager::ConstructViewportForRender: " - "Unrecognized Display Mode" - << m_params.m_displayConfiguration.getDisplayMode() - << std::endl; - return false; - } - - // We always want to render to a full window, with non-rotated view, - // with overfill factor and the oversampling factor applied. This - // is the size of the buffer constructed for use in the Render pass. - viewport.width = xFactor * m_displayWidth * - m_params.m_renderOverfillFactor * - m_params.m_renderOversampleFactor; - viewport.height = yFactor * m_displayHeight * - m_params.m_renderOverfillFactor * - m_params.m_renderOversampleFactor; - - return true; - } - - bool RenderManager::ConstructViewportForPresent( - size_t whichEye, OSVR_ViewportDescription& viewport, bool swapEyes) { - // Zero the viewpoint to start with. - viewport.left = viewport.lower = viewport.width = viewport.height = 0; - - // Make sure that we have as many eyes as were asked for - if (whichEye >= GetNumEyes()) { - return false; - } - - // If we've been asked to swap the eyes, and we have an even - // number of eyes, we adjust the asked-for eye to have the - // opposite polarity. - if (swapEyes) { - if (GetNumEyes() % 2 == 0) { - whichEye = 2 * (whichEye / 2) + (1 - (whichEye % 2)); - } - } - - // Set up the viewport based on the display resolution and the - // display configuration. - switch (m_params.m_displayConfiguration.getDisplayMode()) { - case OSVRDisplayConfiguration::DisplayMode::FULL_SCREEN: - viewport.lower = viewport.left = 0; - viewport.width = m_displayWidth; - viewport.height = m_displayHeight; - break; - case OSVRDisplayConfiguration::DisplayMode::HORIZONTAL_SIDE_BY_SIDE: - viewport.lower = 0; - viewport.height = m_displayHeight; - viewport.width = m_displayWidth / 2; - // Zeroeth eye at left, first eye starts in the middle. - viewport.left = whichEye * viewport.width; - break; - case OSVRDisplayConfiguration::DisplayMode::VERTICAL_SIDE_BY_SIDE: - viewport.left = 0; - viewport.width = m_displayWidth; - viewport.height = m_displayHeight / 2; - // Zeroeth eye in the top half, first eye at the bottom. - if (whichEye == 0) { - viewport.lower = viewport.height; - } else { - viewport.lower = 0; - } - break; - default: - std::cerr << "RenderManager::ConstructViewportForPresent: " - "Unrecognized Display Mode" - << m_params.m_displayConfiguration.getDisplayMode() - << std::endl; - return false; - } - - return true; - } - - OSVR_ViewportDescription - RenderManager::RotateViewport(const OSVR_ViewportDescription& viewport) { - - // If we are not rotating, just return the viewport - // unchanged. - if (m_params.m_displayRotation == - ConstructorParameters::Display_Rotation::Zero) { - return viewport; - } - - // Compute the terms we'll need to construct the - // new viewpoint. - double radians; //< How much to rotate? - double scaleX; //< How much to scale in X in the new space? - double scaleY; //< How much to scale in Y in the new space? - switch (m_params.m_displayRotation) { - case ConstructorParameters::Display_Rotation::Ninety: - radians = 90.0 * M_PI / 180.0; - // Flip width and height - scaleX = m_displayHeight; - scaleY = m_displayWidth; - break; - case ConstructorParameters::Display_Rotation::OneEighty: - radians = 180.0 * M_PI / 180.0; - // Keep width and height the same - scaleX = m_displayWidth; - scaleY = m_displayHeight; - break; - case ConstructorParameters::Display_Rotation::TwoSeventy: - radians = 270.0 * M_PI / 180.0; - // Flip width and height - scaleX = m_displayHeight; - scaleY = m_displayWidth; - break; - default: - // The default is to do nothing, because there is no rotation. - return viewport; - } - - // Construct the four vertices of the viewport. We - // need to rotate all of them and then test which - // is the new lower-left corner and what the new width - // and height are. - std::vector LL = {viewport.left, viewport.lower}; - std::vector UL = {viewport.left + viewport.width, - viewport.lower}; - std::vector UU = {viewport.left + viewport.width, - viewport.lower + viewport.height}; - std::vector LU = {viewport.left, - viewport.lower + viewport.height}; - - std::vector > verts = {LL, UL, UU, LU}; - - // Normalize the vertex coordinates to the range -1..1 - for (auto& vert : verts) { - vert[0] = -1.0 + 2.0 * (vert[0] / m_displayWidth); - vert[1] = -1.0 + 2.0 * (vert[1] / m_displayHeight); - } - - // Rotate the vertices using the 2D rotation matrix - // matrix: - // X' = X * cos(angle) - Y * sin(angle) - // Y' = X * sin(angle) + Y * cos(angle) - double cR = cos(radians); - double sR = sin(radians); - std::vector > vertsRot = verts; - for (size_t i = 0; i < verts.size(); i++) { - vertsRot[i][0] = verts[i][0] * cR - verts[i][1] * sR; - vertsRot[i][1] = verts[i][0] * sR + verts[i][1] * cR; - } - - // Denormalize the vertices into the new viewport size, - // which may be the same (for 180 degree rotation) or - // swapped (for 90 degree rotation). - for (size_t i = 0; i < vertsRot.size(); i++) { - vertsRot[i][0] = ((vertsRot[i][0] + 1.0) / 2.0) * scaleX; - vertsRot[i][1] = ((vertsRot[i][1] + 1.0) / 2.0) * scaleY; - } - - // Find the min and max X and Y and use them to construct - // a new viewport. - OSVR_ViewportDescription out; - double left = vertsRot[0][0]; - double lower = vertsRot[0][1]; - double right = left; - double upper = lower; - for (size_t i = 1; i < vertsRot.size(); i++) { - double x = vertsRot[i][0]; - double y = vertsRot[i][1]; - if (x < left) { - left = x; - } - if (x > right) { - right = x; - } - if (y < lower) { - lower = y; - } - if (y > upper) { - upper = y; - } - } - out.left = left; - out.lower = lower; - out.width = right - left; - out.height = upper - lower; - - return out; - } - - bool RenderManager::ConstructModelView(size_t whichSpace, size_t whichEye, - RenderParams params, - OSVR_PoseState& eyeFromSpace) { - /// Set the identity transformation to start with, in case - /// we have to bail out with an error condition below. - osvrPose3SetIdentity(&eyeFromSpace); - - // Make sure that we have as many eyes as were asked for. - if (whichEye >= GetNumEyes()) { - std::cerr << "RenderManager::ConstructModelView(): Eye index " - << "out of bounds" << std::endl; - return false; - } - - /// @todo Replace all of the quatlib math with Eigen math below, - /// or with direct calls to the core library. - - /// We need to determine the transformation that takes points - /// in the space we're going to render in and moves them into - /// the space described by the projection matrix. That space - /// is eye space, which has the eye at the origin, X to the - /// right, Y up, and Z pointing into the camera (opposite to - /// the viewing direction). - - /// Include the impact of rotating the screen around the - // eye location for HMDs who have this feature. This is - // computed in terms of the percent overlap of the screen. - // We rotate each eye away from the other by half of the - // amount they should not overlap. NOTE: This assumes - // that both eyes are at the same location w.r.t. the - // overlap percent. - // @todo Verify this assumption. - q_xyz_quat_type q_rotatedEyeFromEye; - makeIdentity(q_rotatedEyeFromEye); - double rotateEyesApart = 0; - double overlapFrac = - m_params.m_displayConfiguration.getOverlapPercent(); - if (overlapFrac < 1.) { - const auto hfov = - m_params.m_displayConfiguration.getHorizontalFOV(); - const auto angularOverlap = hfov * overlapFrac; - rotateEyesApart = util::getDegrees((hfov - angularOverlap) / 2.); - } - // Right eyes should rotate the other way. - if (whichEye % 2 != 0) { - rotateEyesApart *= -1; - } - rotateEyesApart = Q_DEG_TO_RAD(rotateEyesApart); - q_from_axis_angle(q_rotatedEyeFromEye.quat, 0, 1, 0, rotateEyesApart); - - /// Include the impact of the eyeFromHead matrix. - // This is a translation along the X axis in head space by - // the IPD, or its negation, depending on the eye. - // We assume that even eyes are left eyes and odd eyes are - // right eyes. We further assume that head space is between - // the two eyes. If the display descriptor wants us to swap - // eyes, we do so by inverting the offset for each eye. - q_xyz_quat_type q_headFromRotatedEye; - makeIdentity(q_headFromRotatedEye); - if (whichEye % 2 == 0) { - // Left eye - q_headFromRotatedEye.xyz[Q_X] -= params.IPDMeters / 2; - } else { - // Right eye - q_headFromRotatedEye.xyz[Q_X] += params.IPDMeters / 2; - } - q_xyz_quat_type q_headFromEye; - q_xyz_quat_compose(&q_headFromEye, &q_headFromRotatedEye, - &q_rotatedEyeFromEye); - - /// Include the impact of RenderParams.headFromRoom - /// (which will override m_headFromRoom) or of m_headFromRoom. - q_xyz_quat_type q_roomFromHead; - if (params.roomFromHeadReplace != nullptr) { - /// Use the params.m_headFromRoom as our transform - q_from_OSVR(q_roomFromHead, *params.roomFromHeadReplace); - } else { - /// Use the state interface to read the most-recent - /// location of the head. It will have been updated - /// by the most-recent call to update() on the context. - /// DO NOT update the client here, so that we're using the - /// same state for all eyes. - OSVR_TimeValue timestamp; - if (osvrGetPoseState(m_roomFromHeadInterface, ×tamp, - &m_roomFromHead) == OSVR_RETURN_FAILURE) { - // This it not an error -- they may have put in an invalid - // state name for the head; we just ignore that case. - } - - // Do prediction of where this eye will be when it is presented - // if client-side prediction is enabled. - if (m_params.m_clientPredictionEnabled) { - // Get information about how long we have until the next present. - // If we can't get timing info, we just set its offset to 0. - float msUntilPresent = 0; - RenderTimingInfo timing; - if (GetTimingInfo(whichEye, timing)) { - msUntilPresent += - (timing.timeUntilNextPresentRequired.seconds * 1e3f) + - (timing.timeUntilNextPresentRequired.microseconds / 1e3f); - } - - // Adjust the time at which the most-recent tracking info was - // set based on whether we're supposed to override it with "now". - // If not, find out how long ago it was. - float msSinceTrackerReport = 0; - if (!m_params.m_clientPredictionLocalTimeOverride) { - OSVR_TimeValue now; - osvrTimeValueGetNow(&now); - msSinceTrackerReport = static_cast( - osvrTimeValueDurationSeconds(&now, ×tamp) * 1e3 - ); - } - - // The delay before rendering for each - // eye will be different because they are at different delays past - // the next vsync. The static delay common to both eyes has - // already been added into their offset. - float predictionIntervalms = msSinceTrackerReport + - msUntilPresent; - if (whichEye < m_params.m_eyeDelaysMS.size()) { - predictionIntervalms += m_params.m_eyeDelaysMS[whichEye]; - } - float predictionIntervalSec = predictionIntervalms / 1e3f; - - // Find out the pose velocity information, if available. - // Set the valid flags to false so that if to call to get - // velocity fails, we will not try and use the info. - OSVR_VelocityState vel; - vel.linearVelocityValid = false; - vel.angularVelocityValid = false; - if (osvrGetVelocityState(m_roomFromHeadInterface, ×tamp, - &vel) != OSVR_RETURN_SUCCESS) { - // We're okay with failure here, we just use a zero - // velocity to predict. - } - - // Predict the future pose of the head based on the velocity - // information and how long we should predict. Check the - // linear and angular velocity terms to see if we should be - // using each. Replace the pose with the predicted pose. - PredictFuturePose(m_roomFromHead, vel, - predictionIntervalSec, m_roomFromHead); - } - - // Bring the pose into quatlib world. - q_from_OSVR(q_roomFromHead, m_roomFromHead); - } - q_xyz_quat_type q_roomFromEye; - q_xyz_quat_compose(&q_roomFromEye, &q_roomFromHead, &q_headFromEye); - - // See if we are making a transform for world space. - // If don't have a callback defined for this space, we're in - // world space. This is used by GetRenderInfo() and - // PresentRenderBuffers() to get its world-space matrix. - // If we have a NULL interface pointer, we are - // in world space. - bool inWorldSpace = (whichSpace >= m_callbacks.size()) || - (m_callbacks[whichSpace].m_interface == nullptr); - - /// Include the impact of roomFromWorld, if it is specified. - /// If we are not going into world space, but rather into one - /// of the other OSVR spaces, then just leave this as the identity - /// transform so we don't need to undo it again on the way - /// back from room space. - q_xyz_quat_type q_worldFromRoom; - makeIdentity(q_worldFromRoom); - if (inWorldSpace && (params.worldFromRoomAppend != nullptr)) { - q_from_OSVR(q_worldFromRoom, *params.worldFromRoomAppend); - } - q_xyz_quat_type q_worldFromEye; - q_xyz_quat_compose(&q_worldFromEye, &q_worldFromRoom, &q_roomFromEye); - - /// Invert the above matrices, to produce eyeFromWorld. - q_xyz_quat_type q_eyeFromWorld; - q_xyz_quat_invert(&q_eyeFromWorld, &q_worldFromEye); - - /// Include the impact of the space we're rendering to. - /// This is spaceFromRoom; put on the right and multiply it on - /// the left by the above inverted matrix. (If we are going - /// into one of these spaces, worldFromRoom will be the - /// identity so we don't need to invert and reapply it.) - q_xyz_quat_type q_worldFromSpace; - if (inWorldSpace) { - makeIdentity(q_worldFromSpace); - } else { - OSVR_TimeValue timestamp; - if (osvrGetPoseState( - m_callbacks[whichSpace].m_interface, ×tamp, - &m_callbacks[whichSpace].m_state) == OSVR_RETURN_FAILURE) { - // They asked for a space that does not exist. Return false to - // let them know we didn't get the one they wanted. - return false; - } - q_from_OSVR(q_worldFromSpace, m_callbacks[whichSpace].m_state); - } - q_xyz_quat_type q_eyeFromSpace; - q_xyz_quat_compose(&q_eyeFromSpace, &q_eyeFromWorld, &q_worldFromSpace); - - /// Store the result into the output pose - OSVR_from_q(eyeFromSpace, q_eyeFromSpace); - return true; - } - - bool RenderManager::ComputeAsynchronousTimeWarps( - std::vector usedRenderInfo, - std::vector currentRenderInfo, float assumedDepth) { - // Empty out the time warp vector until we fill it again below. - m_asynchronousTimeWarps.clear(); - - size_t numEyes = GetNumEyes(); - if (assumedDepth <= 0) { - return false; - } - if ((currentRenderInfo.size() < numEyes) || - (usedRenderInfo.size() < numEyes)) { - return false; - } - - for (size_t eye = 0; eye < numEyes; eye++) { - /// @todo For CAVE displays and fish-tank VR, the projection matrix - /// will not be the same between frames. Make sure we're not - /// assuming here that it is. - - // Compute the scale to use during forward transform. - // Scale the coordinates in X and Y so that they match the width and - // height of a window at the specified distance from the origin. - // We divide by the near clip distance to make the result match that - // at - // a unit distance and then multiply by the assumed depth. - float xScale = static_cast( - (usedRenderInfo[eye].projection.right - - usedRenderInfo[eye].projection.left) / - usedRenderInfo[eye].projection.nearClip * assumedDepth); - float yScale = static_cast( - (usedRenderInfo[eye].projection.top - - usedRenderInfo[eye].projection.bottom) / - usedRenderInfo[eye].projection.nearClip * assumedDepth); - - // Compute the translation to use during forward transform. - // Translate the points so that their center lies in the middle of - // the - // view frustum pushed out to the specified distance from the - // origin. - // We take the mean coordinate of the two edges as the center that - // is - // to be moved to, and we move the space origin to there. - // We divide by the near clip distance to make the result match that - // at - // a unit distance and then multiply by the assumed depth. - // This assumes the default r texture coordinate of 0. - float xTrans = static_cast( - (usedRenderInfo[eye].projection.right + - usedRenderInfo[eye].projection.left) / - 2.0 / usedRenderInfo[eye].projection.nearClip * assumedDepth); - float yTrans = static_cast( - (usedRenderInfo[eye].projection.top + - usedRenderInfo[eye].projection.bottom) / - 2.0 / usedRenderInfo[eye].projection.nearClip * assumedDepth); - float zTrans = static_cast(-assumedDepth); - - // NOTE: These operations occur from the right to the left, so later - // actions on the list actually occur first because we're - // post-multiplying. - - // Translate the points back to a coordinate system with the - // center at (0,0); - Eigen::Affine3f postTranslation( - Eigen::Translation3f(0.5f, 0.5f, 0.0f)); - - /// Scale the points so that they will fit into the range - /// (-0.5,-0.5) - // to (0.5,0.5) (the inverse of the scale below). - Eigen::Affine3f postScale( - Eigen::Scaling(1.0f / xScale, 1.0f / yScale, 1.0f)); - - /// Translate the points so that the projection center will lie on - // the -Z axis (inverse of the translation below). - Eigen::Affine3f postProjectionTranslate( - Eigen::Translation3f(-xTrans, -yTrans, -zTrans)); - - /// Compute the forward last ModelView matrix. - OSVR_PoseState lastModelOSVR = usedRenderInfo[eye].pose; - Eigen::Quaternionf lastModelViewRotation( - static_cast(osvrQuatGetW(&lastModelOSVR.rotation)), - static_cast(osvrQuatGetX(&lastModelOSVR.rotation)), - static_cast(osvrQuatGetY(&lastModelOSVR.rotation)), - static_cast(osvrQuatGetZ(&lastModelOSVR.rotation))); - Eigen::Affine3f lastModelViewTranslation(Eigen::Translation3f( - static_cast(osvrVec3GetX(&lastModelOSVR.translation)), - static_cast(osvrVec3GetY(&lastModelOSVR.translation)), - static_cast(osvrVec3GetZ(&lastModelOSVR.translation)))); - // Pull the translation out from above and then plop in the rotation - // matrix parts by hand. - Eigen::Matrix3f lastRot3 = lastModelViewRotation.toRotationMatrix(); - Eigen::Matrix4f lastModelView = lastModelViewTranslation.matrix(); - for (size_t i = 0; i < 3; i++) { - for (size_t j = 0; j < 3; j++) { - lastModelView(i, j) = lastRot3(i, j); - } - } - Eigen::Projective3f lastModelViewTransform(lastModelView); - - /// Compute the inverse of the current ModelView matrix. - OSVR_PoseState currentModelOSVR = currentRenderInfo[eye].pose; - Eigen::Quaternionf currentModelViewRotation( - static_cast(osvrQuatGetW(¤tModelOSVR.rotation)), - static_cast(osvrQuatGetX(¤tModelOSVR.rotation)), - static_cast(osvrQuatGetY(¤tModelOSVR.rotation)), - static_cast(osvrQuatGetZ(¤tModelOSVR.rotation))); - Eigen::Affine3f currentModelViewTranslation(Eigen::Translation3f( - static_cast(osvrVec3GetX(¤tModelOSVR.translation)), - static_cast(osvrVec3GetY(¤tModelOSVR.translation)), - static_cast( - osvrVec3GetZ(¤tModelOSVR.translation)))); - // Pull the translation out from above and then plop in the rotation - // matrix parts by hand. - // @todo turn this into a transform catenation in the proper order. - Eigen::Matrix3f curRot3 = - currentModelViewRotation.toRotationMatrix(); - Eigen::Matrix4f currentModelView = - currentModelViewTranslation.matrix(); - for (size_t i = 0; i < 3; i++) { - for (size_t j = 0; j < 3; j++) { - currentModelView(i, j) = curRot3(i, j); - } - } - Eigen::Matrix4f currentModelViewInverse = - currentModelView.inverse(); - Eigen::Projective3f currentModelViewInverseTransform( - currentModelViewInverse); - - /// Translate the origin to the center of the projected rectangle - Eigen::Affine3f preProjectionTranslate( - Eigen::Translation3f(xTrans, yTrans, zTrans)); - - /// Scale from (-0.5,-0.5)/(0.5,0.5) to the actual frustum size - Eigen::Affine3f preScale(Eigen::Scaling(xScale, yScale, 1.0f)); - - // Translate the points from a coordinate system that has (0.5,0.5) - // as the origin to one that has (0,0) as the origin. - Eigen::Affine3f preTranslation( - Eigen::Translation3f(-0.5f, -0.5f, 0.0f)); - - /// Compute the full matrix by multiplying the parts. - Eigen::Projective3f full = - postTranslation * postScale * postProjectionTranslate * - lastModelView * currentModelViewInverse * - preProjectionTranslate * preScale * preTranslation; - - // Store the result. - matrix16 timeWarp; - memcpy(timeWarp.data, full.matrix().data(), sizeof(timeWarp.data)); - m_asynchronousTimeWarps.push_back(timeWarp); - } - return true; - } - - bool RenderManager::ComputeDisplayOrientationMatrix( - float rotateDegrees //< Rotation in degrees around Z - , - bool flipInY //< Flip in Y after rotating? - , - matrix16& outMatrix //< Matrix to use. - ) { - // NOTE: These operations occur from the right to the left, so later - // actions on the list actually occur first because we're - // post-multiplying. - - /// Scale the points to flip the Y axis if that is called for. - float yScale = 1; - if (flipInY) { - yScale = -1; - } - Eigen::Affine3f preScale(Eigen::Scaling(1.0f, yScale, 1.0f)); - - // Rotate by the specified number of degrees. - Eigen::Vector3f zAxis(0, 0, 1); - float rotateRadians = static_cast(rotateDegrees * M_PI / 180.0); - Eigen::Affine3f rotate(Eigen::AngleAxisf(rotateRadians, zAxis)); - - /// Compute the full matrix by multiplying the parts. - Eigen::Projective3f full = rotate * preScale; - - // Store the result. - memcpy(outMatrix.data, full.matrix().data(), sizeof(outMatrix.data)); - - return true; - } - - bool RenderManager::ComputeRenderBufferCropMatrix( - OSVR_ViewportDescription normalizedCroppingViewport, - matrix16& outMatrix) { - // NOTE: These operations occur from the right to the left, so later - // actions on the list actually occur first because we're - // post-multiplying. - - /// Translate so that the origin moves to the location of - /// the lower-left corner. - Eigen::Isometry3f translate(Eigen::Translation3f( - static_cast(normalizedCroppingViewport.left), - static_cast(normalizedCroppingViewport.lower), 0.0f)); - - /// Scale the points around the origin to reduce the - /// range in X and Y to match what was passed in. - Eigen::Affine3f scale(Eigen::Scaling( - static_cast(normalizedCroppingViewport.width), - static_cast(normalizedCroppingViewport.height), 1.0f)); - - /// Compute the full matrix by multiplying the parts. - Eigen::Matrix4f::Map(outMatrix.data) = - Eigen::Projective3f(translate * scale).matrix(); - - return true; - } - - static double pointDistance(double x1, double y1, double x2, double y2) { - return std::sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); - } - + + return PresentSolidColorInternal(color); + } + + bool RenderManager::PresentSolidColorInternal( + const RGBColorf &color) { + // Make sure we're doing okay. + if (!doingOkay()) { + std::cerr + << "RenderManager::PresentSolidColorInternal(): Display not opened." + << std::endl; + return false; + } + + // Initialize the presentation for the whole frame. + if (!PresentFrameInitialize()) { + std::cerr << "RenderManager::PresentSolidColorInternal(): " + "PresentFrameInitialize() failed." + << std::endl; + return false; + } + + // Render into each display, setting up the display beforehand and + // finalizing it after. + for (size_t display = 0; display < GetNumDisplays(); display++) { + + // Set up the appropriate display before setting up its eye(s). + if (!PresentDisplayInitialize(display)) { + std::cerr << "RenderManager::PresentSolidColorInternal(): " + "PresentDisplayInitialize() failed." + << std::endl; + return false; + } + + // Render for each eye, setting up the appropriate projection + // and viewport. + for (size_t eyeInDisplay = 0; eyeInDisplay < GetNumEyesPerDisplay(); + eyeInDisplay++) { + + // Figure out which overall eye this is. + size_t eye = eyeInDisplay + display * GetNumEyesPerDisplay(); + + if (!SolidColorEye(eye, color)) { + std::cerr << "RenderManager::PresentSolidColorInternal(): " + "PresentEye failed." + << std::endl; + return false; + } + } + + // We're done with this display. + if (!PresentDisplayFinalize(display)) { + std::cerr << "RenderManager::PresentSolidColorInternal(): " + "PresentDisplayFinalize failed." + << std::endl; + return false; + } + } + + // Finalize the rendering for the whole frame. + if (!PresentFrameFinalize()) { + std::cerr << "RenderManager::PresentSolidColorInternal(): " + "PresentFrameFinalize failed." + << std::endl; + return false; + } + + return true; + } + + bool RenderManager::UpdateDistortionMeshes( + DistortionMeshType type //< Type of mesh to produce + , + std::vector const& + distort //< Distortion parameters + ) { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + return UpdateDistortionMeshesInternal(type, distort); + } + + void RenderManager::SetRoomRotationUsingHead() { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + osvrClientSetRoomRotationUsingHead(m_context); + } + + void RenderManager::ClearRoomToWorldTransform() { + // All public methods that use internal state should be guarded + // by a mutex. + std::lock_guard lock(m_mutex); + + osvrClientClearRoomToWorldTransform(m_context); + } + + size_t RenderManager::GetNumEyes() { + return m_params.m_displayConfiguration.getEyes().size(); + } + + size_t RenderManager::GetNumDisplays() { + switch (m_params.m_displayConfiguration.getEyes().size()) { + case 1: + return 1; + case 2: + if (m_params.m_displayConfiguration.getDisplayMode() == + OSVRDisplayConfiguration::DisplayMode::FULL_SCREEN) { + return 2; + } + return 1; + default: + std::cerr << "RenderManager::GetNumDisplays(): Unrecognized value: " + << m_params.m_displayConfiguration.getEyes().size() + << std::endl; + } + return 1; + } + + size_t RenderManager::GetNumEyesPerDisplay() { + if (GetNumDisplays() == 0) { + return 0; + } + return GetNumEyes() / GetNumDisplays(); + } + + size_t RenderManager::GetDisplayUsedByEye(size_t eye) { + if (GetNumDisplays() == 0) { + return 0; + } + return eye / GetNumEyesPerDisplay(); + } + + bool RenderManager::ConstructProjection(size_t whichEye, + double nearClipDistanceMeters, + double farClipDistanceMeters, + OSVR_ProjectionMatrix& projection) { + // Make sure that we have as many eyes as were asked for + if (whichEye >= GetNumEyes()) { + return false; + } + + //-------------------------------------------------------------------- + // Configure a projection transform based on the characteristics of the + // display we are using. + + // Scale the unit X and Y parameters based on the near + // plane to make the field of view match what we expect. + // The tangent of the view angle in either axis is the + // in-plane distance (left, right, top, or bottom) divided + // by the distance to the near clipping plane. We have + // the angle specified and for now we assume a unit distance + // to the window (we will adjust that later). Given + // this, we solve for the tangent of half the angle + // (each of left and right provide half, as do top and + // bottom). + double right = + tan(osvr::util::getRadians( + m_params.m_displayConfiguration.getHorizontalFOV()) / + 2.0); + double left = -right; + double top = tan(osvr::util::getRadians( + m_params.m_displayConfiguration.getVerticalFOV()) / + 2.0); + double bottom = -top; + + // Scale the in-plane positions based on the near plane to put + // the virtual viewing window on the near plane with the eye at the + // origin. + left *= nearClipDistanceMeters; + right *= nearClipDistanceMeters; + top *= nearClipDistanceMeters; + bottom *= nearClipDistanceMeters; + + // Incorporate the center-of-projection information for this + // eye, shifting so that 0.5,0.5 is in the center of the screen. + // We need to do this before we scale the viewport to add the amount + // needed for overfill, so we don't end up shifting past the edge of + // the actual screen. + double width = right - left; + double height = top - bottom; + double xCOP = + m_params.m_displayConfiguration.getEyes()[whichEye].m_CenterProjX; + double yCOP = + m_params.m_displayConfiguration.getEyes()[whichEye].m_CenterProjY; + double xOffset = (0.5 - xCOP) * width; + double yOffset = (0.5 - yCOP) * height; + left += xOffset; + right += xOffset; + top += yOffset; + bottom += yOffset; + + // Incorporate pitch_tilt (degrees, positive is downwards) + // We assume that this results in a shearing of the image that leaves + // the plane of the screen the same. + auto pitchTilt = m_params.m_displayConfiguration.getPitchTilt(); + if (pitchTilt != 0 * util::radians) { + /// @todo + } + + // Add in the extra space needed to handle the rendering overfill used + // to provide margin for distortion correction and Time + // Warp. We do in a way that can handle off-center projection by + // adding a margin (which is half of the total overfill) to each edge. + double xMargin = width / 2 * (m_params.m_renderOverfillFactor - 1); + double yMargin = height / 2 * (m_params.m_renderOverfillFactor - 1); + left -= xMargin; + right += xMargin; + top += yMargin; + bottom -= yMargin; + + // We handle rotation of the pixels on the way to the screen, + // due to the scan-out circuitry, in the code that reprojects the + // rendered texture into the screen. We don't need to handle + // it here (and should not, because it will rotate bitmapped + // textures). + + // Make sure that things won't blow up in the math below. + if ((nearClipDistanceMeters <= 0) || (farClipDistanceMeters <= 0) || + (nearClipDistanceMeters == farClipDistanceMeters) || + (left == right) || (top == bottom)) { + return false; + } + + /// @todo Figure out interactions between the above shifts and + /// distortions + /// and make sure to do them in the right order, or to adjust as needed + /// to + /// make them consistent when they are composed. + + // Set the values in the projection matrix + projection.left = left; + projection.right = right; + projection.top = top; + projection.bottom = bottom; + projection.nearClip = nearClipDistanceMeters; + projection.farClip = farClipDistanceMeters; + + return true; + } + + bool RenderManager::ConstructViewportForRender( + size_t whichEye, OSVR_ViewportDescription& viewport) { + // Zero the viewpoint to start with. + viewport.left = viewport.lower = viewport.width = viewport.height = 0; + + // Make sure that we have as many eyes as were asked for + if (whichEye >= GetNumEyes()) { + return false; + } + + // Figure out the fraction of the display we're rendering to based + // on the display mode. + // Set up the viewport based on the display resolution and the + // display configuration. + double xFactor = 1, yFactor = 1; + switch (m_params.m_displayConfiguration.getDisplayMode()) { + case OSVRDisplayConfiguration::DisplayMode::FULL_SCREEN: + // Already set. + break; + case OSVRDisplayConfiguration::DisplayMode::HORIZONTAL_SIDE_BY_SIDE: + xFactor = 0.5; + break; + case OSVRDisplayConfiguration::DisplayMode::VERTICAL_SIDE_BY_SIDE: + yFactor = 0.5; + break; + default: + std::cerr << "RenderManager::ConstructViewportForRender: " + "Unrecognized Display Mode" + << m_params.m_displayConfiguration.getDisplayMode() + << std::endl; + return false; + } + + // We always want to render to a full window, with non-rotated view, + // with overfill factor and the oversampling factor applied. This + // is the size of the buffer constructed for use in the Render pass. + viewport.width = xFactor * m_displayWidth * + m_params.m_renderOverfillFactor * + m_params.m_renderOversampleFactor; + viewport.height = yFactor * m_displayHeight * + m_params.m_renderOverfillFactor * + m_params.m_renderOversampleFactor; + + return true; + } + + bool RenderManager::ConstructViewportForPresent( + size_t whichEye, OSVR_ViewportDescription& viewport, bool swapEyes) { + // Zero the viewpoint to start with. + viewport.left = viewport.lower = viewport.width = viewport.height = 0; + + // Make sure that we have as many eyes as were asked for + if (whichEye >= GetNumEyes()) { + return false; + } + + // If we've been asked to swap the eyes, and we have an even + // number of eyes, we adjust the asked-for eye to have the + // opposite polarity. + if (swapEyes) { + if (GetNumEyes() % 2 == 0) { + whichEye = 2 * (whichEye / 2) + (1 - (whichEye % 2)); + } + } + + // Set up the viewport based on the display resolution and the + // display configuration. + switch (m_params.m_displayConfiguration.getDisplayMode()) { + case OSVRDisplayConfiguration::DisplayMode::FULL_SCREEN: + viewport.lower = viewport.left = 0; + viewport.width = m_displayWidth; + viewport.height = m_displayHeight; + break; + case OSVRDisplayConfiguration::DisplayMode::HORIZONTAL_SIDE_BY_SIDE: + viewport.lower = 0; + viewport.height = m_displayHeight; + viewport.width = m_displayWidth / 2; + // Zeroeth eye at left, first eye starts in the middle. + viewport.left = whichEye * viewport.width; + break; + case OSVRDisplayConfiguration::DisplayMode::VERTICAL_SIDE_BY_SIDE: + viewport.left = 0; + viewport.width = m_displayWidth; + viewport.height = m_displayHeight / 2; + // Zeroeth eye in the top half, first eye at the bottom. + if (whichEye == 0) { + viewport.lower = viewport.height; + } else { + viewport.lower = 0; + } + break; + default: + std::cerr << "RenderManager::ConstructViewportForPresent: " + "Unrecognized Display Mode" + << m_params.m_displayConfiguration.getDisplayMode() + << std::endl; + return false; + } + + return true; + } + + OSVR_ViewportDescription + RenderManager::RotateViewport(const OSVR_ViewportDescription& viewport) { + + // If we are not rotating, just return the viewport + // unchanged. + if (m_params.m_displayRotation == + ConstructorParameters::Display_Rotation::Zero) { + return viewport; + } + + // Compute the terms we'll need to construct the + // new viewpoint. + double radians; //< How much to rotate? + double scaleX; //< How much to scale in X in the new space? + double scaleY; //< How much to scale in Y in the new space? + switch (m_params.m_displayRotation) { + case ConstructorParameters::Display_Rotation::Ninety: + radians = 90.0 * M_PI / 180.0; + // Flip width and height + scaleX = m_displayHeight; + scaleY = m_displayWidth; + break; + case ConstructorParameters::Display_Rotation::OneEighty: + radians = 180.0 * M_PI / 180.0; + // Keep width and height the same + scaleX = m_displayWidth; + scaleY = m_displayHeight; + break; + case ConstructorParameters::Display_Rotation::TwoSeventy: + radians = 270.0 * M_PI / 180.0; + // Flip width and height + scaleX = m_displayHeight; + scaleY = m_displayWidth; + break; + default: + // The default is to do nothing, because there is no rotation. + return viewport; + } + + // Construct the four vertices of the viewport. We + // need to rotate all of them and then test which + // is the new lower-left corner and what the new width + // and height are. + std::vector LL = {viewport.left, viewport.lower}; + std::vector UL = {viewport.left + viewport.width, + viewport.lower}; + std::vector UU = {viewport.left + viewport.width, + viewport.lower + viewport.height}; + std::vector LU = {viewport.left, + viewport.lower + viewport.height}; + + std::vector > verts = {LL, UL, UU, LU}; + + // Normalize the vertex coordinates to the range -1..1 + for (auto& vert : verts) { + vert[0] = -1.0 + 2.0 * (vert[0] / m_displayWidth); + vert[1] = -1.0 + 2.0 * (vert[1] / m_displayHeight); + } + + // Rotate the vertices using the 2D rotation matrix + // matrix: + // X' = X * cos(angle) - Y * sin(angle) + // Y' = X * sin(angle) + Y * cos(angle) + double cR = cos(radians); + double sR = sin(radians); + std::vector > vertsRot = verts; + for (size_t i = 0; i < verts.size(); i++) { + vertsRot[i][0] = verts[i][0] * cR - verts[i][1] * sR; + vertsRot[i][1] = verts[i][0] * sR + verts[i][1] * cR; + } + + // Denormalize the vertices into the new viewport size, + // which may be the same (for 180 degree rotation) or + // swapped (for 90 degree rotation). + for (size_t i = 0; i < vertsRot.size(); i++) { + vertsRot[i][0] = ((vertsRot[i][0] + 1.0) / 2.0) * scaleX; + vertsRot[i][1] = ((vertsRot[i][1] + 1.0) / 2.0) * scaleY; + } + + // Find the min and max X and Y and use them to construct + // a new viewport. + OSVR_ViewportDescription out; + double left = vertsRot[0][0]; + double lower = vertsRot[0][1]; + double right = left; + double upper = lower; + for (size_t i = 1; i < vertsRot.size(); i++) { + double x = vertsRot[i][0]; + double y = vertsRot[i][1]; + if (x < left) { + left = x; + } + if (x > right) { + right = x; + } + if (y < lower) { + lower = y; + } + if (y > upper) { + upper = y; + } + } + out.left = left; + out.lower = lower; + out.width = right - left; + out.height = upper - lower; + + return out; + } + + bool RenderManager::ConstructModelView(size_t whichSpace, size_t whichEye, + RenderParams params, + OSVR_PoseState& eyeFromSpace) { + /// Set the identity transformation to start with, in case + /// we have to bail out with an error condition below. + osvrPose3SetIdentity(&eyeFromSpace); + + // Make sure that we have as many eyes as were asked for. + if (whichEye >= GetNumEyes()) { + std::cerr << "RenderManager::ConstructModelView(): Eye index " + << "out of bounds" << std::endl; + return false; + } + + /// @todo Replace all of the quatlib math with Eigen math below, + /// or with direct calls to the core library. + + /// We need to determine the transformation that takes points + /// in the space we're going to render in and moves them into + /// the space described by the projection matrix. That space + /// is eye space, which has the eye at the origin, X to the + /// right, Y up, and Z pointing into the camera (opposite to + /// the viewing direction). + + /// Include the impact of rotating the screen around the + // eye location for HMDs who have this feature. This is + // computed in terms of the percent overlap of the screen. + // We rotate each eye away from the other by half of the + // amount they should not overlap. NOTE: This assumes + // that both eyes are at the same location w.r.t. the + // overlap percent. + // @todo Verify this assumption. + q_xyz_quat_type q_rotatedEyeFromEye; + makeIdentity(q_rotatedEyeFromEye); + double rotateEyesApart = 0; + double overlapFrac = + m_params.m_displayConfiguration.getOverlapPercent(); + if (overlapFrac < 1.) { + const auto hfov = + m_params.m_displayConfiguration.getHorizontalFOV(); + const auto angularOverlap = hfov * overlapFrac; + rotateEyesApart = util::getDegrees((hfov - angularOverlap) / 2.); + } + // Right eyes should rotate the other way. + if (whichEye % 2 != 0) { + rotateEyesApart *= -1; + } + rotateEyesApart = Q_DEG_TO_RAD(rotateEyesApart); + q_from_axis_angle(q_rotatedEyeFromEye.quat, 0, 1, 0, rotateEyesApart); + + /// Include the impact of the eyeFromHead matrix. + // This is a translation along the X axis in head space by + // the IPD, or its negation, depending on the eye. + // We assume that even eyes are left eyes and odd eyes are + // right eyes. We further assume that head space is between + // the two eyes. If the display descriptor wants us to swap + // eyes, we do so by inverting the offset for each eye. + q_xyz_quat_type q_headFromRotatedEye; + makeIdentity(q_headFromRotatedEye); + if (whichEye % 2 == 0) { + // Left eye + q_headFromRotatedEye.xyz[Q_X] -= params.IPDMeters / 2; + } else { + // Right eye + q_headFromRotatedEye.xyz[Q_X] += params.IPDMeters / 2; + } + q_xyz_quat_type q_headFromEye; + q_xyz_quat_compose(&q_headFromEye, &q_headFromRotatedEye, + &q_rotatedEyeFromEye); + + /// Include the impact of RenderParams.headFromRoom + /// (which will override m_headFromRoom) or of m_headFromRoom. + q_xyz_quat_type q_roomFromHead; + if (params.roomFromHeadReplace != nullptr) { + /// Use the params.m_headFromRoom as our transform + q_from_OSVR(q_roomFromHead, *params.roomFromHeadReplace); + } else { + /// Use the state interface to read the most-recent + /// location of the head. It will have been updated + /// by the most-recent call to update() on the context. + /// DO NOT update the client here, so that we're using the + /// same state for all eyes. + OSVR_TimeValue timestamp; + if (osvrGetPoseState(m_roomFromHeadInterface, ×tamp, + &m_roomFromHead) == OSVR_RETURN_FAILURE) { + // This it not an error -- they may have put in an invalid + // state name for the head; we just ignore that case. + } + + // Do prediction of where this eye will be when it is presented + // if client-side prediction is enabled. + if (m_params.m_clientPredictionEnabled) { + // Get information about how long we have until the next present. + // If we can't get timing info, we just set its offset to 0. + float msUntilPresent = 0; + RenderTimingInfo timing; + if (GetTimingInfo(whichEye, timing)) { + msUntilPresent += + (timing.timeUntilNextPresentRequired.seconds * 1e3f) + + (timing.timeUntilNextPresentRequired.microseconds / 1e3f); + } + + // Adjust the time at which the most-recent tracking info was + // set based on whether we're supposed to override it with "now". + // If not, find out how long ago it was. + float msSinceTrackerReport = 0; + if (!m_params.m_clientPredictionLocalTimeOverride) { + OSVR_TimeValue now; + osvrTimeValueGetNow(&now); + msSinceTrackerReport = static_cast( + osvrTimeValueDurationSeconds(&now, ×tamp) * 1e3 + ); + } + + // The delay before rendering for each + // eye will be different because they are at different delays past + // the next vsync. The static delay common to both eyes has + // already been added into their offset. + float predictionIntervalms = msSinceTrackerReport + + msUntilPresent; + if (whichEye < m_params.m_eyeDelaysMS.size()) { + predictionIntervalms += m_params.m_eyeDelaysMS[whichEye]; + } + float predictionIntervalSec = predictionIntervalms / 1e3f; + + // Find out the pose velocity information, if available. + // Set the valid flags to false so that if to call to get + // velocity fails, we will not try and use the info. + OSVR_VelocityState vel; + vel.linearVelocityValid = false; + vel.angularVelocityValid = false; + if (osvrGetVelocityState(m_roomFromHeadInterface, ×tamp, + &vel) != OSVR_RETURN_SUCCESS) { + // We're okay with failure here, we just use a zero + // velocity to predict. + } + + // Predict the future pose of the head based on the velocity + // information and how long we should predict. Check the + // linear and angular velocity terms to see if we should be + // using each. Replace the pose with the predicted pose. + PredictFuturePose(m_roomFromHead, vel, + predictionIntervalSec, m_roomFromHead); + } + + // Bring the pose into quatlib world. + q_from_OSVR(q_roomFromHead, m_roomFromHead); + } + q_xyz_quat_type q_roomFromEye; + q_xyz_quat_compose(&q_roomFromEye, &q_roomFromHead, &q_headFromEye); + + // See if we are making a transform for world space. + // If don't have a callback defined for this space, we're in + // world space. This is used by GetRenderInfo() and + // PresentRenderBuffers() to get its world-space matrix. + // If we have a NULL interface pointer, we are + // in world space. + bool inWorldSpace = (whichSpace >= m_callbacks.size()) || + (m_callbacks[whichSpace].m_interface == nullptr); + + /// Include the impact of roomFromWorld, if it is specified. + /// If we are not going into world space, but rather into one + /// of the other OSVR spaces, then just leave this as the identity + /// transform so we don't need to undo it again on the way + /// back from room space. + q_xyz_quat_type q_worldFromRoom; + makeIdentity(q_worldFromRoom); + if (inWorldSpace && (params.worldFromRoomAppend != nullptr)) { + q_from_OSVR(q_worldFromRoom, *params.worldFromRoomAppend); + } + q_xyz_quat_type q_worldFromEye; + q_xyz_quat_compose(&q_worldFromEye, &q_worldFromRoom, &q_roomFromEye); + + /// Invert the above matrices, to produce eyeFromWorld. + q_xyz_quat_type q_eyeFromWorld; + q_xyz_quat_invert(&q_eyeFromWorld, &q_worldFromEye); + + /// Include the impact of the space we're rendering to. + /// This is spaceFromRoom; put on the right and multiply it on + /// the left by the above inverted matrix. (If we are going + /// into one of these spaces, worldFromRoom will be the + /// identity so we don't need to invert and reapply it.) + q_xyz_quat_type q_worldFromSpace; + if (inWorldSpace) { + makeIdentity(q_worldFromSpace); + } else { + OSVR_TimeValue timestamp; + if (osvrGetPoseState( + m_callbacks[whichSpace].m_interface, ×tamp, + &m_callbacks[whichSpace].m_state) == OSVR_RETURN_FAILURE) { + // They asked for a space that does not exist. Return false to + // let them know we didn't get the one they wanted. + return false; + } + q_from_OSVR(q_worldFromSpace, m_callbacks[whichSpace].m_state); + } + q_xyz_quat_type q_eyeFromSpace; + q_xyz_quat_compose(&q_eyeFromSpace, &q_eyeFromWorld, &q_worldFromSpace); + + /// Store the result into the output pose + OSVR_from_q(eyeFromSpace, q_eyeFromSpace); + return true; + } + + bool RenderManager::ComputeAsynchronousTimeWarps( + std::vector usedRenderInfo, + std::vector currentRenderInfo, float assumedDepth) { + // Empty out the time warp vector until we fill it again below. + m_asynchronousTimeWarps.clear(); + + size_t numEyes = GetNumEyes(); + if (assumedDepth <= 0) { + return false; + } + if ((currentRenderInfo.size() < numEyes) || + (usedRenderInfo.size() < numEyes)) { + return false; + } + + for (size_t eye = 0; eye < numEyes; eye++) { + /// @todo For CAVE displays and fish-tank VR, the projection matrix + /// will not be the same between frames. Make sure we're not + /// assuming here that it is. + + // Compute the scale to use during forward transform. + // Scale the coordinates in X and Y so that they match the width and + // height of a window at the specified distance from the origin. + // We divide by the near clip distance to make the result match that + // at + // a unit distance and then multiply by the assumed depth. + float xScale = static_cast( + (usedRenderInfo[eye].projection.right - + usedRenderInfo[eye].projection.left) / + usedRenderInfo[eye].projection.nearClip * assumedDepth); + float yScale = static_cast( + (usedRenderInfo[eye].projection.top - + usedRenderInfo[eye].projection.bottom) / + usedRenderInfo[eye].projection.nearClip * assumedDepth); + + // Compute the translation to use during forward transform. + // Translate the points so that their center lies in the middle of + // the + // view frustum pushed out to the specified distance from the + // origin. + // We take the mean coordinate of the two edges as the center that + // is + // to be moved to, and we move the space origin to there. + // We divide by the near clip distance to make the result match that + // at + // a unit distance and then multiply by the assumed depth. + // This assumes the default r texture coordinate of 0. + float xTrans = static_cast( + (usedRenderInfo[eye].projection.right + + usedRenderInfo[eye].projection.left) / + 2.0 / usedRenderInfo[eye].projection.nearClip * assumedDepth); + float yTrans = static_cast( + (usedRenderInfo[eye].projection.top + + usedRenderInfo[eye].projection.bottom) / + 2.0 / usedRenderInfo[eye].projection.nearClip * assumedDepth); + float zTrans = static_cast(-assumedDepth); + + // NOTE: These operations occur from the right to the left, so later + // actions on the list actually occur first because we're + // post-multiplying. + + // Translate the points back to a coordinate system with the + // center at (0,0); + Eigen::Affine3f postTranslation( + Eigen::Translation3f(0.5f, 0.5f, 0.0f)); + + /// Scale the points so that they will fit into the range + /// (-0.5,-0.5) + // to (0.5,0.5) (the inverse of the scale below). + Eigen::Affine3f postScale( + Eigen::Scaling(1.0f / xScale, 1.0f / yScale, 1.0f)); + + /// Translate the points so that the projection center will lie on + // the -Z axis (inverse of the translation below). + Eigen::Affine3f postProjectionTranslate( + Eigen::Translation3f(-xTrans, -yTrans, -zTrans)); + + /// Compute the forward last ModelView matrix. + OSVR_PoseState lastModelOSVR = usedRenderInfo[eye].pose; + Eigen::Quaternionf lastModelViewRotation( + static_cast(osvrQuatGetW(&lastModelOSVR.rotation)), + static_cast(osvrQuatGetX(&lastModelOSVR.rotation)), + static_cast(osvrQuatGetY(&lastModelOSVR.rotation)), + static_cast(osvrQuatGetZ(&lastModelOSVR.rotation))); + Eigen::Affine3f lastModelViewTranslation(Eigen::Translation3f( + static_cast(osvrVec3GetX(&lastModelOSVR.translation)), + static_cast(osvrVec3GetY(&lastModelOSVR.translation)), + static_cast(osvrVec3GetZ(&lastModelOSVR.translation)))); + // Pull the translation out from above and then plop in the rotation + // matrix parts by hand. + Eigen::Matrix3f lastRot3 = lastModelViewRotation.toRotationMatrix(); + Eigen::Matrix4f lastModelView = lastModelViewTranslation.matrix(); + for (size_t i = 0; i < 3; i++) { + for (size_t j = 0; j < 3; j++) { + lastModelView(i, j) = lastRot3(i, j); + } + } + Eigen::Projective3f lastModelViewTransform(lastModelView); + + /// Compute the inverse of the current ModelView matrix. + OSVR_PoseState currentModelOSVR = currentRenderInfo[eye].pose; + Eigen::Quaternionf currentModelViewRotation( + static_cast(osvrQuatGetW(¤tModelOSVR.rotation)), + static_cast(osvrQuatGetX(¤tModelOSVR.rotation)), + static_cast(osvrQuatGetY(¤tModelOSVR.rotation)), + static_cast(osvrQuatGetZ(¤tModelOSVR.rotation))); + Eigen::Affine3f currentModelViewTranslation(Eigen::Translation3f( + static_cast(osvrVec3GetX(¤tModelOSVR.translation)), + static_cast(osvrVec3GetY(¤tModelOSVR.translation)), + static_cast( + osvrVec3GetZ(¤tModelOSVR.translation)))); + // Pull the translation out from above and then plop in the rotation + // matrix parts by hand. + // @todo turn this into a transform catenation in the proper order. + Eigen::Matrix3f curRot3 = + currentModelViewRotation.toRotationMatrix(); + Eigen::Matrix4f currentModelView = + currentModelViewTranslation.matrix(); + for (size_t i = 0; i < 3; i++) { + for (size_t j = 0; j < 3; j++) { + currentModelView(i, j) = curRot3(i, j); + } + } + Eigen::Matrix4f currentModelViewInverse = + currentModelView.inverse(); + Eigen::Projective3f currentModelViewInverseTransform( + currentModelViewInverse); + + /// Translate the origin to the center of the projected rectangle + Eigen::Affine3f preProjectionTranslate( + Eigen::Translation3f(xTrans, yTrans, zTrans)); + + /// Scale from (-0.5,-0.5)/(0.5,0.5) to the actual frustum size + Eigen::Affine3f preScale(Eigen::Scaling(xScale, yScale, 1.0f)); + + // Translate the points from a coordinate system that has (0.5,0.5) + // as the origin to one that has (0,0) as the origin. + Eigen::Affine3f preTranslation( + Eigen::Translation3f(-0.5f, -0.5f, 0.0f)); + + /// Compute the full matrix by multiplying the parts. + Eigen::Projective3f full = + postTranslation * postScale * postProjectionTranslate * + lastModelView * currentModelViewInverse * + preProjectionTranslate * preScale * preTranslation; + + // Store the result. + matrix16 timeWarp; + memcpy(timeWarp.data, full.matrix().data(), sizeof(timeWarp.data)); + m_asynchronousTimeWarps.push_back(timeWarp); + } + return true; + } + + bool RenderManager::ComputeDisplayOrientationMatrix( + float rotateDegrees //< Rotation in degrees around Z + , + bool flipInY //< Flip in Y after rotating? + , + matrix16& outMatrix //< Matrix to use. + ) { + // NOTE: These operations occur from the right to the left, so later + // actions on the list actually occur first because we're + // post-multiplying. + + /// Scale the points to flip the Y axis if that is called for. + float yScale = 1; + if (flipInY) { + yScale = -1; + } + Eigen::Affine3f preScale(Eigen::Scaling(1.0f, yScale, 1.0f)); + + // Rotate by the specified number of degrees. + Eigen::Vector3f zAxis(0, 0, 1); + float rotateRadians = static_cast(rotateDegrees * M_PI / 180.0); + Eigen::Affine3f rotate(Eigen::AngleAxisf(rotateRadians, zAxis)); + + /// Compute the full matrix by multiplying the parts. + Eigen::Projective3f full = rotate * preScale; + + // Store the result. + memcpy(outMatrix.data, full.matrix().data(), sizeof(outMatrix.data)); + + return true; + } + + bool RenderManager::ComputeRenderBufferCropMatrix( + OSVR_ViewportDescription normalizedCroppingViewport, + matrix16& outMatrix) { + // NOTE: These operations occur from the right to the left, so later + // actions on the list actually occur first because we're + // post-multiplying. + + /// Translate so that the origin moves to the location of + /// the lower-left corner. + Eigen::Isometry3f translate(Eigen::Translation3f( + static_cast(normalizedCroppingViewport.left), + static_cast(normalizedCroppingViewport.lower), 0.0f)); + + /// Scale the points around the origin to reduce the + /// range in X and Y to match what was passed in. + Eigen::Affine3f scale(Eigen::Scaling( + static_cast(normalizedCroppingViewport.width), + static_cast(normalizedCroppingViewport.height), 1.0f)); + + /// Compute the full matrix by multiplying the parts. + Eigen::Matrix4f::Map(outMatrix.data) = + Eigen::Projective3f(translate * scale).matrix(); + + return true; + } + + static double pointDistance(double x1, double y1, double x2, double y2) { + return std::sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + } + RenderManager::UnstructuredMeshInterpolator::UnstructuredMeshInterpolator( const MonoPointDistortionMeshDescription& points, int numSamplesX, int numSamplesY - ) : m_points(points), m_numSamplesX(numSamplesX), - m_numSamplesY(numSamplesY) { - - // Construct and fill in the grid of nearby points that is used by the - // interpolation function to accelerate the search for the three - // nearest non-collinear points. - std::vector< MonoPointDistortionMeshDescription> ySet; - MonoPointDistortionMeshDescription empty; - for (size_t y = 0; y < m_numSamplesY; y++) { - ySet.emplace_back(empty); - } - for (size_t x = 0; x < m_numSamplesX; x++) { - m_grid.emplace_back(ySet); - } - - // Go through each point in the unstructured grid and insert its index - // into all grid elements that are within 1/4th (rounded up) of the - // total span of the grid from its normalized location. - int xHalfSpan = static_cast(0.9 + (1.0/4.0)*0.5 * m_numSamplesX); - int yHalfSpan = static_cast(0.9 + (1.0/4.0)*0.5 * m_numSamplesY); - for (size_t i = 0; i < points.size(); i++) { - int xIndex, yIndex; - if (getIndex(points[i][0][0], points[i][0][1], xIndex, yIndex)) { - - // Get the range of locations to insert - int xMin = xIndex - xHalfSpan; - if (xMin < 0) { xMin = 0; } - int xMax = xIndex + xHalfSpan; - if (xMax >= m_numSamplesX) { xMax = m_numSamplesX - 1; } - int yMin = yIndex - yHalfSpan; - if (yMin < 0) { yMin = 0; } - int yMax = yIndex + yHalfSpan; - if (yMax >= m_numSamplesY) { yMax = m_numSamplesY - 1; } - - // Insert this point into each of these locations. - for (int x = xMin; x <= xMax; x++) { - for (int y = yMin; y <= yMax; y++) { - m_grid[x][y].push_back(points[i]); - } - } - } - } - } - - Float2 - RenderManager::UnstructuredMeshInterpolator::interpolateNearestPoints( - float xN, float yN) { - Float2 ret = {}; - - // Look in the spatial-acceleration grid to see if we can - // find three points without having to search the entire set of - // points. - int xIndex, yIndex; - if (!getIndex(xN, yN, xIndex, yIndex)) { - return ret; - } - MonoPointDistortionMeshDescription points; - points = getNearestPoints(xN, yN, m_grid[xIndex][yIndex]); - - // If we didn't get enough points from the acceleration - // structure, look in the whole points array - if (points.size() < 3) { - points = getNearestPoints(xN, yN, m_points); - } - - // If we didn't get three points, just return the output of - // the first point we found. - - if (points.size() < 3) { - float xNew = static_cast(points[0][1][0]); - float yNew = static_cast(points[0][1][1]); - ret[0] = xNew; - ret[1] = yNew; - return ret; - } - - // Found three points -- interpolate them. - float xNew = static_cast(interpolate( - points[0][0][0], points[0][0][1], points[0][1][0], - points[1][0][0], points[1][0][1], points[1][1][0], - points[2][0][0], points[2][0][1], points[2][1][0], xN, - yN)); - float yNew = static_cast(interpolate( - points[0][0][0], points[0][0][1], points[0][1][1], - points[1][0][0], points[1][0][1], points[1][1][1], - points[2][0][0], points[2][0][1], points[2][1][1], xN, - yN)); - ret[0] = xNew; - ret[1] = yNew; - return ret; - } - - MonoPointDistortionMeshDescription - RenderManager::UnstructuredMeshInterpolator::getNearestPoints( + ) : m_points(points), m_numSamplesX(numSamplesX), + m_numSamplesY(numSamplesY) { + + // Construct and fill in the grid of nearby points that is used by the + // interpolation function to accelerate the search for the three + // nearest non-collinear points. + std::vector< MonoPointDistortionMeshDescription> ySet; + MonoPointDistortionMeshDescription empty; + for (size_t y = 0; y < m_numSamplesY; y++) { + ySet.emplace_back(empty); + } + for (size_t x = 0; x < m_numSamplesX; x++) { + m_grid.emplace_back(ySet); + } + + // Go through each point in the unstructured grid and insert its index + // into all grid elements that are within 1/4th (rounded up) of the + // total span of the grid from its normalized location. + int xHalfSpan = static_cast(0.9 + (1.0/4.0)*0.5 * m_numSamplesX); + int yHalfSpan = static_cast(0.9 + (1.0/4.0)*0.5 * m_numSamplesY); + for (size_t i = 0; i < points.size(); i++) { + int xIndex, yIndex; + if (getIndex(points[i][0][0], points[i][0][1], xIndex, yIndex)) { + + // Get the range of locations to insert + int xMin = xIndex - xHalfSpan; + if (xMin < 0) { xMin = 0; } + int xMax = xIndex + xHalfSpan; + if (xMax >= m_numSamplesX) { xMax = m_numSamplesX - 1; } + int yMin = yIndex - yHalfSpan; + if (yMin < 0) { yMin = 0; } + int yMax = yIndex + yHalfSpan; + if (yMax >= m_numSamplesY) { yMax = m_numSamplesY - 1; } + + // Insert this point into each of these locations. + for (int x = xMin; x <= xMax; x++) { + for (int y = yMin; y <= yMax; y++) { + m_grid[x][y].push_back(points[i]); + } + } + } + } + } + + Float2 + RenderManager::UnstructuredMeshInterpolator::interpolateNearestPoints( + float xN, float yN) { + Float2 ret = {}; + + // Look in the spatial-acceleration grid to see if we can + // find three points without having to search the entire set of + // points. + int xIndex, yIndex; + if (!getIndex(xN, yN, xIndex, yIndex)) { + return ret; + } + MonoPointDistortionMeshDescription points; + points = getNearestPoints(xN, yN, m_grid[xIndex][yIndex]); + + // If we didn't get enough points from the acceleration + // structure, look in the whole points array + if (points.size() < 3) { + points = getNearestPoints(xN, yN, m_points); + } + + // If we didn't get three points, just return the output of + // the first point we found. + + if (points.size() < 3) { + float xNew = static_cast(points[0][1][0]); + float yNew = static_cast(points[0][1][1]); + ret[0] = xNew; + ret[1] = yNew; + return ret; + } + + // Found three points -- interpolate them. + float xNew = static_cast(interpolate( + points[0][0][0], points[0][0][1], points[0][1][0], + points[1][0][0], points[1][0][1], points[1][1][0], + points[2][0][0], points[2][0][1], points[2][1][0], xN, + yN)); + float yNew = static_cast(interpolate( + points[0][0][0], points[0][0][1], points[0][1][1], + points[1][0][0], points[1][0][1], points[1][1][1], + points[2][0][0], points[2][0][1], points[2][1][1], xN, + yN)); + ret[0] = xNew; + ret[1] = yNew; + return ret; + } + + MonoPointDistortionMeshDescription + RenderManager::UnstructuredMeshInterpolator::getNearestPoints( float xN, float yN, - const MonoPointDistortionMeshDescription &points) { - - MonoPointDistortionMeshDescription ret; - - // Find the three non-collinear points in the mesh that are nearest - // to the normalized point we are trying to look up. We start by - // sorting the points based on distance from our location, selecting - // the first two, and then looking through the rest until we find - // one that is not collinear with the first two (normalized dot - // product magnitude far enough from 1). If we don't find such - // points, we just go with the values from the closest point. - typedef std::multimap PointDistanceIndexMap; - PointDistanceIndexMap map; - //if (points.size() < 460 && points.size() > 0) std::cout << "XXX Sorting mesh of size " << points.size() << std::endl; - for (size_t i = 0; i < points.size(); i++) { - // Insertion into the multimap sorts them by distance. - map.insert(std::make_pair( - pointDistance(xN, yN, points[i][0][0], points[i][0][1]), i)); - } - - PointDistanceIndexMap::const_iterator it = map.begin(); - size_t first = it->second; - it++; - size_t second = it->second; - it++; - size_t third = first; - while (it != map.end()) { - if (!nearly_collinear(points[first][0], points[second][0], - points[it->second][0])) { - third = it->second; - break; - } - it++; - } - - // Push back all of the points we found, which may not include - // a third point if the first is the same as the third. - if (map.size() >= 1) { ret.push_back(points[first]); } - if (map.size() >= 2) { ret.push_back(points[second]); } - if (third != first) { - ret.push_back(points[third]); - } - return ret; - } - - Float2 RenderManager::DistortionCorrectTextureCoordinate( - size_t eye //< Which eye? - , Float2 const& inCoords //< Coordinates to modify - , DistortionParameters distort //< Distortion parameters - , size_t color //< 0 = red, 1 = green, 2 = blue - ) { - Float2 ret = inCoords; - - // Check for invalid parameters - if (color > 2) { - return ret; - } - using Eigen::Vector2f; - // Convert from coordinates in the overfilled texture to coordinates - // that will cover the range (0,0) to (1,1) on the screen. This is - // done by scaling around (0.5,0.5) to push the edges of the screen - // out to the (0,0) and (1,1) boundaries. - Eigen::Map retMap(ret.data()); - Eigen::Map inMap(inCoords.data()); - - Vector2f xyN = (inMap - Vector2f::Constant(0.5f)) * - m_params.m_renderOverfillFactor + - Vector2f::Constant(0.5f); - /// these are for mono point that hasn't been ported to eigen yet. - float x = inCoords[0]; - float y = inCoords[1]; - float xN = xyN.x(); - float yN = xyN.y(); - - switch (distort.m_type) { - case osvr::renderkit::RenderManager::DistortionParameters:: - rgb_symmetric_polynomials: { - if (distort.m_distortionPolynomialRed.size() < 2) { - return ret; - } - if (distort.m_distortionPolynomialGreen.size() < 2) { - return ret; - } - if (distort.m_distortionPolynomialBlue.size() < 2) { - return ret; - } - if (distort.m_distortionCOP.size() != 2) { - return ret; - } - if (distort.m_distortionD.size() != 2) { - return ret; - } - if (distort.m_distortionD[0] <= 0) { - return ret; - } - if (distort.m_distortionD[1] <= 0) { - return ret; - } - - // Convert from normalized range to (D[0], D[1]) range. Here, - // both coordinate systems share a common (0,0) boundary so we - // can just scale around the origin. - Vector2f xyD = - xyN.cwiseProduct(Vector2f::Map(distort.m_distortionD.data())); - - // Compute the distance from the COP in D space - // (direction and squared magnitude) - Vector2f xyDDiff = - xyD - Vector2f::Map(distort.m_distortionCOP.data()); - float rMag2 = xyDDiff.squaredNorm(); - if (rMag2 == 0) { // We're at the center -- no distortion - ret = inCoords; - return ret; - } - float rMag = sqrt(rMag2); - Vector2f xyDNorm = xyDDiff / rMag; - - // Compute the new location in D space based on the distortion - // parameters - std::vector const& params = - color == 0 ? distort.m_distortionPolynomialRed - : color == 1 ? distort.m_distortionPolynomialGreen - : distort.m_distortionPolynomialBlue; - - // The distance scaling factor needs to be applied as many times - // as the degree of the polynomial we are using. For the constant - // term, the factor is 1. - float rFactor = 1; - float rNew = params[0]; - - auto n = params.size(); - using index_type = decltype(n); - for (index_type i = 1; i < n; i++) { - rFactor *= rMag; - rNew += params[i] * rFactor; - } - Vector2f xyDNew = - Vector2f::Map(distort.m_distortionCOP.data()) + rNew * xyDNorm; - - // Convert from D space back to unit space - Vector2f xyNNew = xyDNew.cwiseQuotient( - Vector2f::Map(distort.m_distortionD.data())); - - Vector2f::Map(ret.data()) = xyNNew; - } break; - case osvr::renderkit::RenderManager::DistortionParameters:: - mono_point_samples: { - if (eye >= distort.m_monoPointSamples.size()) { - return ret; - } - - MonoPointDistortionMeshDescription& points = - distort.m_monoPointSamples[eye]; - if (points.size() < 3) { - return ret; - } - - // Find the three non-collinear points in the mesh that are nearest - // to the normalized point we are trying to look up. We start by - // sorting the points based on distance from our location, selecting - // the first two, and then looking through the rest until we find - // one that is not collinear with the first two (normalized dot - // product magnitude far enough from 1). If we don't find such - // points, we just go with the values from the closest point. - ret = m_interpolators[0]->interpolateNearestPoints(xN, yN); - } break; - case osvr::renderkit::RenderManager::DistortionParameters:: - rgb_point_samples: { - if (color >= 3) { - return ret; - } - if (eye >= distort.m_rgbPointSamples[color].size()) { - return ret; - } - - MonoPointDistortionMeshDescription& points = - distort.m_rgbPointSamples[color][eye]; - if (points.size() < 3) { - return ret; - } - - // Find the three non-collinear points in the mesh that are nearest - // to the normalized point we are trying to look up. We start by - // sorting the points based on distance from our location, selecting - // the first two, and then looking through the rest until we find - // one that is not collinear with the first two (normalized dot - // product magnitude far enough from 1). If we don't find such - // points, we just go with the values from the closest point. - ret = m_interpolators[color]->interpolateNearestPoints(xN, yN); - } break; - default: - break; - } - - // Convert from unit (normalized) space back into overfill space. - ret[0] = (ret[0] - 0.5f) / m_params.m_renderOverfillFactor + 0.5f; - ret[1] = (ret[1] - 0.5f) / m_params.m_renderOverfillFactor + 0.5f; - - return ret; - } - + const MonoPointDistortionMeshDescription &points) { + + MonoPointDistortionMeshDescription ret; + + // Find the three non-collinear points in the mesh that are nearest + // to the normalized point we are trying to look up. We start by + // sorting the points based on distance from our location, selecting + // the first two, and then looking through the rest until we find + // one that is not collinear with the first two (normalized dot + // product magnitude far enough from 1). If we don't find such + // points, we just go with the values from the closest point. + typedef std::multimap PointDistanceIndexMap; + PointDistanceIndexMap map; + //if (points.size() < 460 && points.size() > 0) std::cout << "XXX Sorting mesh of size " << points.size() << std::endl; + for (size_t i = 0; i < points.size(); i++) { + // Insertion into the multimap sorts them by distance. + map.insert(std::make_pair( + pointDistance(xN, yN, points[i][0][0], points[i][0][1]), i)); + } + + PointDistanceIndexMap::const_iterator it = map.begin(); + size_t first = it->second; + it++; + size_t second = it->second; + it++; + size_t third = first; + while (it != map.end()) { + if (!nearly_collinear(points[first][0], points[second][0], + points[it->second][0])) { + third = it->second; + break; + } + it++; + } + + // Push back all of the points we found, which may not include + // a third point if the first is the same as the third. + if (map.size() >= 1) { ret.push_back(points[first]); } + if (map.size() >= 2) { ret.push_back(points[second]); } + if (third != first) { + ret.push_back(points[third]); + } + return ret; + } + + Float2 RenderManager::DistortionCorrectTextureCoordinate( + size_t eye //< Which eye? + , Float2 const& inCoords //< Coordinates to modify + , DistortionParameters distort //< Distortion parameters + , size_t color //< 0 = red, 1 = green, 2 = blue + ) { + Float2 ret = inCoords; + + // Check for invalid parameters + if (color > 2) { + return ret; + } + using Eigen::Vector2f; + // Convert from coordinates in the overfilled texture to coordinates + // that will cover the range (0,0) to (1,1) on the screen. This is + // done by scaling around (0.5,0.5) to push the edges of the screen + // out to the (0,0) and (1,1) boundaries. + Eigen::Map retMap(ret.data()); + Eigen::Map inMap(inCoords.data()); + + Vector2f xyN = (inMap - Vector2f::Constant(0.5f)) * + m_params.m_renderOverfillFactor + + Vector2f::Constant(0.5f); + /// these are for mono point that hasn't been ported to eigen yet. + float x = inCoords[0]; + float y = inCoords[1]; + float xN = xyN.x(); + float yN = xyN.y(); + + switch (distort.m_type) { + case osvr::renderkit::RenderManager::DistortionParameters:: + rgb_symmetric_polynomials: { + if (distort.m_distortionPolynomialRed.size() < 2) { + return ret; + } + if (distort.m_distortionPolynomialGreen.size() < 2) { + return ret; + } + if (distort.m_distortionPolynomialBlue.size() < 2) { + return ret; + } + if (distort.m_distortionCOP.size() != 2) { + return ret; + } + if (distort.m_distortionD.size() != 2) { + return ret; + } + if (distort.m_distortionD[0] <= 0) { + return ret; + } + if (distort.m_distortionD[1] <= 0) { + return ret; + } + + // Convert from normalized range to (D[0], D[1]) range. Here, + // both coordinate systems share a common (0,0) boundary so we + // can just scale around the origin. + Vector2f xyD = + xyN.cwiseProduct(Vector2f::Map(distort.m_distortionD.data())); + + // Compute the distance from the COP in D space + // (direction and squared magnitude) + Vector2f xyDDiff = + xyD - Vector2f::Map(distort.m_distortionCOP.data()); + float rMag2 = xyDDiff.squaredNorm(); + if (rMag2 == 0) { // We're at the center -- no distortion + ret = inCoords; + return ret; + } + float rMag = sqrt(rMag2); + Vector2f xyDNorm = xyDDiff / rMag; + + // Compute the new location in D space based on the distortion + // parameters + std::vector const& params = + color == 0 ? distort.m_distortionPolynomialRed + : color == 1 ? distort.m_distortionPolynomialGreen + : distort.m_distortionPolynomialBlue; + + // The distance scaling factor needs to be applied as many times + // as the degree of the polynomial we are using. For the constant + // term, the factor is 1. + float rFactor = 1; + float rNew = params[0]; + + auto n = params.size(); + using index_type = decltype(n); + for (index_type i = 1; i < n; i++) { + rFactor *= rMag; + rNew += params[i] * rFactor; + } + Vector2f xyDNew = + Vector2f::Map(distort.m_distortionCOP.data()) + rNew * xyDNorm; + + // Convert from D space back to unit space + Vector2f xyNNew = xyDNew.cwiseQuotient( + Vector2f::Map(distort.m_distortionD.data())); + + Vector2f::Map(ret.data()) = xyNNew; + } break; + case osvr::renderkit::RenderManager::DistortionParameters:: + mono_point_samples: { + if (eye >= distort.m_monoPointSamples.size()) { + return ret; + } + + MonoPointDistortionMeshDescription& points = + distort.m_monoPointSamples[eye]; + if (points.size() < 3) { + return ret; + } + + // Find the three non-collinear points in the mesh that are nearest + // to the normalized point we are trying to look up. We start by + // sorting the points based on distance from our location, selecting + // the first two, and then looking through the rest until we find + // one that is not collinear with the first two (normalized dot + // product magnitude far enough from 1). If we don't find such + // points, we just go with the values from the closest point. + ret = m_interpolators[0]->interpolateNearestPoints(xN, yN); + } break; + case osvr::renderkit::RenderManager::DistortionParameters:: + rgb_point_samples: { + if (color >= 3) { + return ret; + } + if (eye >= distort.m_rgbPointSamples[color].size()) { + return ret; + } + + MonoPointDistortionMeshDescription& points = + distort.m_rgbPointSamples[color][eye]; + if (points.size() < 3) { + return ret; + } + + // Find the three non-collinear points in the mesh that are nearest + // to the normalized point we are trying to look up. We start by + // sorting the points based on distance from our location, selecting + // the first two, and then looking through the rest until we find + // one that is not collinear with the first two (normalized dot + // product magnitude far enough from 1). If we don't find such + // points, we just go with the values from the closest point. + ret = m_interpolators[color]->interpolateNearestPoints(xN, yN); + } break; + default: + break; + } + + // Convert from unit (normalized) space back into overfill space. + ret[0] = (ret[0] - 0.5f) / m_params.m_renderOverfillFactor + 0.5f; + ret[1] = (ret[1] - 0.5f) / m_params.m_renderOverfillFactor + 0.5f; + + return ret; + } + RenderManager::DistortionMesh - RenderManager::ComputeDistortionMesh( - size_t eye //< Which eye? - , DistortionMeshType type //< Type of mesh to produce - , DistortionParameters distort //< Distortion parameters - ) { + RenderManager::ComputeDistortionMesh( + size_t eye //< Which eye? + , DistortionMeshType type //< Type of mesh to produce + , DistortionParameters distort //< Distortion parameters + ) { RenderManager::DistortionMesh ret; - - // Clear any created interpolators, freeing up their memory - // first. These may have been left behind by a failed - // mesh-creation from before. - for (size_t clr = 0; clr < m_interpolators.size(); clr++) { - delete m_interpolators[clr]; - } - m_interpolators.clear(); - - // Check the validity of the parameters, based on the ones we're - // using. - if (distort.m_type == - RenderManager::DistortionParameters::rgb_symmetric_polynomials) { - if (distort.m_distortionPolynomialRed.size() < 2) { - std::cerr << "RenderManager::ComputeDistortionMesh: Need 2+ " - "red polynomial coefficients, found " - << distort.m_distortionPolynomialRed.size() - << std::endl; - return ret; - } - if (distort.m_distortionPolynomialGreen.size() < 2) { - std::cerr << "RenderManager::ComputeDistortionMesh: Need 2+ " - "green polynomial coefficients, found " - << distort.m_distortionPolynomialGreen.size() - << std::endl; - return ret; - } - if (distort.m_distortionPolynomialBlue.size() < 2) { - std::cerr << "RenderManager::ComputeDistortionMesh: Need 2+ " - "blue polynomial coefficients, found " - << distort.m_distortionPolynomialBlue.size() - << std::endl; - return ret; - } - if (distort.m_distortionD.size() != 2) { - std::cerr << "RenderManager::ComputeDistortionMesh: Need 2 " - "distortion coefficients, found " - << distort.m_distortionD.size() << std::endl; - return ret; - } - } else if (distort.m_type == - RenderManager::DistortionParameters::mono_point_samples) { - if (distort.m_monoPointSamples.size() != 2) { - std::cerr << "RenderManager::ComputeDistortionMesh: Need 2 " - "meshes, found " - << distort.m_monoPointSamples.size() << std::endl; - return ret; - } - // Add a new interpolator to be used when we're finding - // mesh coordinates. - if (distort.m_monoPointSamples[eye].size() < 3) { - std::cerr << "RenderManager::ComputeDistortionMesh: Need " - "3+ points, found " - << distort.m_monoPointSamples[eye].size() - << std::endl; - return ret; - } - for (size_t i = 0; i < distort.m_monoPointSamples[eye].size(); - i++) { - if (distort.m_monoPointSamples[eye][i].size() != 2) { - std::cerr - << "RenderManager::ComputeDistortionMesh: Need 2 " - << "points in the mesh, found " - << distort.m_monoPointSamples[eye][i].size() - << std::endl; - return ret; - } - if (distort.m_monoPointSamples[eye][i][0].size() != 2) { - std::cerr - << "RenderManager::ComputeDistortionMesh: Need 2 " - << "values in input point, found " - << distort.m_monoPointSamples[eye][i][0].size() - << std::endl; - return ret; - } - if (distort.m_monoPointSamples[eye][i][1].size() != 2) { - std::cerr - << "RenderManager::ComputeDistortionMesh: Need 2 " - << "values in output point, found " - << distort.m_monoPointSamples[eye][i][1].size() - << std::endl; - return ret; - } - } - // Add a new interpolator to be used when we're finding - // mesh coordinates. - m_interpolators.emplace_back(new - UnstructuredMeshInterpolator(distort.m_monoPointSamples[eye])); - } - else if (distort.m_type == - RenderManager::DistortionParameters::rgb_point_samples) { - if (distort.m_rgbPointSamples.size() != 3) { - std::cerr << "RenderManager::ComputeDistortionMesh: Need 3 " - "color meshes, found " - << distort.m_rgbPointSamples.size() << std::endl; - return ret; - } - for (size_t clr = 0; clr < 3; clr++) { - if (distort.m_rgbPointSamples[clr].size() != 2) { - std::cerr << "RenderManager::ComputeDistortionMesh: Need 2 " - "eye meshes, found " - << distort.m_rgbPointSamples[clr].size() - << std::endl; - return ret; - } - // Add a new interpolator to be used when we're finding - // mesh coordinates. - if (distort.m_rgbPointSamples[clr][eye].size() < 3) { - std::cerr - << "RenderManager::ComputeDistortionMesh: Need " - "3+ points, found " - << distort.m_rgbPointSamples[clr][eye].size() - << std::endl; - return ret; - } - for (size_t i = 0; - i < distort.m_rgbPointSamples[clr][eye].size(); i++) { - if (distort.m_rgbPointSamples[clr][eye][i].size() != - 2) { - std::cerr - << "RenderManager::ComputeDistortionMesh: Need " - "2 " - << "points in the mesh, found " - << distort.m_rgbPointSamples[clr][eye][i].size() - << std::endl; - return ret; - } - if (distort.m_rgbPointSamples[clr][eye][i][0].size() != - 2) { - std::cerr - << "RenderManager::ComputeDistortionMesh: Need " - "2 " - << "values in input point, found " - << distort.m_rgbPointSamples[clr][eye][i][0] - .size() - << std::endl; - return ret; - } - if (distort.m_rgbPointSamples[clr][eye][i][1].size() != - 2) { - std::cerr - << "RenderManager::ComputeDistortionMesh: Need " - "2 " - << "values in output point, found " - << distort.m_rgbPointSamples[clr][eye][i][1] - .size() - << std::endl; - return ret; - } - } - - // Add a new interpolator to be used when we're finding - // mesh coordinates, one per eye. - m_interpolators.emplace_back(new - UnstructuredMeshInterpolator(distort.m_rgbPointSamples[clr][eye])); - } - } else { - std::cerr << "RenderManager::ComputeDistortionMesh: Unrecognized " - << "distortion parameter type" << std::endl; - return ret; - } - - // See what kind of mesh we're supposed to produce. Make the - // appropriate one. - switch (type) { - case SQUARE: { - // Figure out how many quads we should use in each dimension. The - // minimum is 1. We have an even number in each. There are two - // triangles per quad. - int quadsPerSide = - static_cast(sqrt(distort.m_desiredTriangles / 2)); - if (quadsPerSide < 1) { - quadsPerSide = 1; - } - - // Figure out how large each quad will be. Recall that we're - // covering a range of 2 (from -1 to 1) in each dimension, so the - // quads will all be square in texture space. - float quadSide = 2.0f / quadsPerSide; - float quadTexSide = 1.0f / quadsPerSide; - - // Compute distorted texture coordinates and use those for each + + // Clear any created interpolators, freeing up their memory + // first. These may have been left behind by a failed + // mesh-creation from before. + for (size_t clr = 0; clr < m_interpolators.size(); clr++) { + delete m_interpolators[clr]; + } + m_interpolators.clear(); + + // Check the validity of the parameters, based on the ones we're + // using. + if (distort.m_type == + RenderManager::DistortionParameters::rgb_symmetric_polynomials) { + if (distort.m_distortionPolynomialRed.size() < 2) { + std::cerr << "RenderManager::ComputeDistortionMesh: Need 2+ " + "red polynomial coefficients, found " + << distort.m_distortionPolynomialRed.size() + << std::endl; + return ret; + } + if (distort.m_distortionPolynomialGreen.size() < 2) { + std::cerr << "RenderManager::ComputeDistortionMesh: Need 2+ " + "green polynomial coefficients, found " + << distort.m_distortionPolynomialGreen.size() + << std::endl; + return ret; + } + if (distort.m_distortionPolynomialBlue.size() < 2) { + std::cerr << "RenderManager::ComputeDistortionMesh: Need 2+ " + "blue polynomial coefficients, found " + << distort.m_distortionPolynomialBlue.size() + << std::endl; + return ret; + } + if (distort.m_distortionD.size() != 2) { + std::cerr << "RenderManager::ComputeDistortionMesh: Need 2 " + "distortion coefficients, found " + << distort.m_distortionD.size() << std::endl; + return ret; + } + } else if (distort.m_type == + RenderManager::DistortionParameters::mono_point_samples) { + if (distort.m_monoPointSamples.size() != 2) { + std::cerr << "RenderManager::ComputeDistortionMesh: Need 2 " + "meshes, found " + << distort.m_monoPointSamples.size() << std::endl; + return ret; + } + // Add a new interpolator to be used when we're finding + // mesh coordinates. + if (distort.m_monoPointSamples[eye].size() < 3) { + std::cerr << "RenderManager::ComputeDistortionMesh: Need " + "3+ points, found " + << distort.m_monoPointSamples[eye].size() + << std::endl; + return ret; + } + for (size_t i = 0; i < distort.m_monoPointSamples[eye].size(); + i++) { + if (distort.m_monoPointSamples[eye][i].size() != 2) { + std::cerr + << "RenderManager::ComputeDistortionMesh: Need 2 " + << "points in the mesh, found " + << distort.m_monoPointSamples[eye][i].size() + << std::endl; + return ret; + } + if (distort.m_monoPointSamples[eye][i][0].size() != 2) { + std::cerr + << "RenderManager::ComputeDistortionMesh: Need 2 " + << "values in input point, found " + << distort.m_monoPointSamples[eye][i][0].size() + << std::endl; + return ret; + } + if (distort.m_monoPointSamples[eye][i][1].size() != 2) { + std::cerr + << "RenderManager::ComputeDistortionMesh: Need 2 " + << "values in output point, found " + << distort.m_monoPointSamples[eye][i][1].size() + << std::endl; + return ret; + } + } + // Add a new interpolator to be used when we're finding + // mesh coordinates. + m_interpolators.emplace_back(new + UnstructuredMeshInterpolator(distort.m_monoPointSamples[eye])); + } + else if (distort.m_type == + RenderManager::DistortionParameters::rgb_point_samples) { + if (distort.m_rgbPointSamples.size() != 3) { + std::cerr << "RenderManager::ComputeDistortionMesh: Need 3 " + "color meshes, found " + << distort.m_rgbPointSamples.size() << std::endl; + return ret; + } + for (size_t clr = 0; clr < 3; clr++) { + if (distort.m_rgbPointSamples[clr].size() != 2) { + std::cerr << "RenderManager::ComputeDistortionMesh: Need 2 " + "eye meshes, found " + << distort.m_rgbPointSamples[clr].size() + << std::endl; + return ret; + } + // Add a new interpolator to be used when we're finding + // mesh coordinates. + if (distort.m_rgbPointSamples[clr][eye].size() < 3) { + std::cerr + << "RenderManager::ComputeDistortionMesh: Need " + "3+ points, found " + << distort.m_rgbPointSamples[clr][eye].size() + << std::endl; + return ret; + } + for (size_t i = 0; + i < distort.m_rgbPointSamples[clr][eye].size(); i++) { + if (distort.m_rgbPointSamples[clr][eye][i].size() != + 2) { + std::cerr + << "RenderManager::ComputeDistortionMesh: Need " + "2 " + << "points in the mesh, found " + << distort.m_rgbPointSamples[clr][eye][i].size() + << std::endl; + return ret; + } + if (distort.m_rgbPointSamples[clr][eye][i][0].size() != + 2) { + std::cerr + << "RenderManager::ComputeDistortionMesh: Need " + "2 " + << "values in input point, found " + << distort.m_rgbPointSamples[clr][eye][i][0] + .size() + << std::endl; + return ret; + } + if (distort.m_rgbPointSamples[clr][eye][i][1].size() != + 2) { + std::cerr + << "RenderManager::ComputeDistortionMesh: Need " + "2 " + << "values in output point, found " + << distort.m_rgbPointSamples[clr][eye][i][1] + .size() + << std::endl; + return ret; + } + } + + // Add a new interpolator to be used when we're finding + // mesh coordinates, one per eye. + m_interpolators.emplace_back(new + UnstructuredMeshInterpolator(distort.m_rgbPointSamples[clr][eye])); + } + } else { + std::cerr << "RenderManager::ComputeDistortionMesh: Unrecognized " + << "distortion parameter type" << std::endl; + return ret; + } + + // See what kind of mesh we're supposed to produce. Make the + // appropriate one. + switch (type) { + case SQUARE: { + // Figure out how many quads we should use in each dimension. The + // minimum is 1. We have an even number in each. There are two + // triangles per quad. + int quadsPerSide = + static_cast(sqrt(distort.m_desiredTriangles / 2)); + if (quadsPerSide < 1) { + quadsPerSide = 1; + } + + // Figure out how large each quad will be. Recall that we're + // covering a range of 2 (from -1 to 1) in each dimension, so the + // quads will all be square in texture space. + float quadSide = 2.0f / quadsPerSide; + float quadTexSide = 1.0f / quadsPerSide; + + // Compute distorted texture coordinates and use those for each // vertex, with appropriate spatial location and texture // coordinates. @@ -2332,12 +2332,12 @@ namespace renderkit { // Generate a pair of triangles for each quad, wound // counter-clockwise from the mesh grid - - // total of quadsPerSide * quadsPerSide * 6 vertices added: reserve - // that space to avoid excess copying during mesh generation. + + // total of quadsPerSide * quadsPerSide * 6 vertices added: reserve + // that space to avoid excess copying during mesh generation. ret.indices.reserve(quadsPerSide * quadsPerSide * 6); - for (int x = 0; x < quadsPerSide; x++) { - for (int y = 0; y < quadsPerSide; y++) { + for (int x = 0; x < quadsPerSide; x++) { + for (int y = 0; y < quadsPerSide; y++) { // Grid generated above is in column-major order int indexLL = x*numVertsPerSide + y; int indexHL = indexLL + numVertsPerSide; @@ -2353,598 +2353,598 @@ namespace renderkit { ret.indices.emplace_back(indexLL); ret.indices.emplace_back(indexHH); ret.indices.emplace_back(indexLH); - } - } - } break; - case RADIAL: { - std::cerr - << "RenderManager::ComputeDistortionMesh: Radial mesh type " - << "not yet implemented" << std::endl; - - // @todo Scale the aspect ratio of the rings around the center of - // projection so that they will be round in the visible display. - } break; - default: - std::cerr << "RenderManager::ComputeDistortionMesh: Unsupported " - "mesh type: " - << type << std::endl; - } - - // Clear any created interpolators, freeing up their memory - // first. - for (size_t clr = 0; clr < m_interpolators.size(); clr++) { - delete m_interpolators[clr]; - } - m_interpolators.clear(); - - return ret; - } - - static std::string osvrRenderManagerGetString(OSVR_ClientContext context, - const std::string& path) { - size_t len; - if (osvrClientGetStringParameterLength(context, path.c_str(), &len) == - OSVR_RETURN_FAILURE) { - std::string msg = - std::string("Couldn't get osvr string length for path ") + path; - std::cerr << msg << std::endl; - throw std::runtime_error(msg); - } - - // struct TempBuffer { - // char *buffer; - // TempBuffer(size_t len) { buffer = new char[len + 1]; } - // ~TempBuffer() { delete[] buffer; } - //} tempBuffer(len); - std::vector tempBuffer(len + 1); - - if (osvrClientGetStringParameter(context, path.c_str(), - tempBuffer.data(), - len + 1) == OSVR_RETURN_FAILURE) { - std::string msg = - std::string("Couldn't get osvr string buffer for path ") + path; - std::cerr << msg << std::endl; - throw std::runtime_error(msg); - } - return std::string(tempBuffer.data(), len); - } - - void - RenderManager::ConstructorParameters::addCandidatePNPID(const char* pnpid) { - auto id = std::string{pnpid}; - if (id.size() != 3) { - std::cerr << "RenderManager::ConstructorParameters::" - "addCandidatePNPID: Error: given '" - << pnpid << "' which cannot be valid due to its size!" - << std::endl; - return; - } - // Make the string all uppercase - not because pnpidToHex needs it, but - // because we might want it all caps for our own usage as a string. - // While we're iterating we can also check the validity. - bool valid = true; - std::transform(begin(id), end(id), begin(id), [&valid](char& c) { - auto ret = std::toupper(c); - if (ret > 'Z' || ret < 'A') { - valid = false; - } - return ret; - }); - - if (!valid) { - std::cerr << "RenderManager::ConstructorParameters::" - "addCandidatePNPID: Error: given '" - << pnpid - << "' which cannot be valid due to an invalid character!" - << std::endl; - return; - } - // Add the hex version - m_directVendorIds.push_back(common::integerByteSwap(pnpidToHex(pnpid))); - // Now add the string version - m_pnpIds.emplace_back(std::move(id)); - } - + } + } + } break; + case RADIAL: { + std::cerr + << "RenderManager::ComputeDistortionMesh: Radial mesh type " + << "not yet implemented" << std::endl; + + // @todo Scale the aspect ratio of the rings around the center of + // projection so that they will be round in the visible display. + } break; + default: + std::cerr << "RenderManager::ComputeDistortionMesh: Unsupported " + "mesh type: " + << type << std::endl; + } + + // Clear any created interpolators, freeing up their memory + // first. + for (size_t clr = 0; clr < m_interpolators.size(); clr++) { + delete m_interpolators[clr]; + } + m_interpolators.clear(); + + return ret; + } + + static std::string osvrRenderManagerGetString(OSVR_ClientContext context, + const std::string& path) { + size_t len; + if (osvrClientGetStringParameterLength(context, path.c_str(), &len) == + OSVR_RETURN_FAILURE) { + std::string msg = + std::string("Couldn't get osvr string length for path ") + path; + std::cerr << msg << std::endl; + throw std::runtime_error(msg); + } + + // struct TempBuffer { + // char *buffer; + // TempBuffer(size_t len) { buffer = new char[len + 1]; } + // ~TempBuffer() { delete[] buffer; } + //} tempBuffer(len); + std::vector tempBuffer(len + 1); + + if (osvrClientGetStringParameter(context, path.c_str(), + tempBuffer.data(), + len + 1) == OSVR_RETURN_FAILURE) { + std::string msg = + std::string("Couldn't get osvr string buffer for path ") + path; + std::cerr << msg << std::endl; + throw std::runtime_error(msg); + } + return std::string(tempBuffer.data(), len); + } + + void + RenderManager::ConstructorParameters::addCandidatePNPID(const char* pnpid) { + auto id = std::string{pnpid}; + if (id.size() != 3) { + std::cerr << "RenderManager::ConstructorParameters::" + "addCandidatePNPID: Error: given '" + << pnpid << "' which cannot be valid due to its size!" + << std::endl; + return; + } + // Make the string all uppercase - not because pnpidToHex needs it, but + // because we might want it all caps for our own usage as a string. + // While we're iterating we can also check the validity. + bool valid = true; + std::transform(begin(id), end(id), begin(id), [&valid](char& c) { + auto ret = std::toupper(c); + if (ret > 'Z' || ret < 'A') { + valid = false; + } + return ret; + }); + + if (!valid) { + std::cerr << "RenderManager::ConstructorParameters::" + "addCandidatePNPID: Error: given '" + << pnpid + << "' which cannot be valid due to an invalid character!" + << std::endl; + return; + } + // Add the hex version + m_directVendorIds.push_back(common::integerByteSwap(pnpidToHex(pnpid))); + // Now add the string version + m_pnpIds.emplace_back(std::move(id)); + } + +#ifdef RM_USE_D3D11 + /// Used to open a Direct3D DirectRender RenderManager based on + /// what kind of graphics card is installed in the machine. + static RenderManagerD3D11Base *openRenderManagerDirectMode( + OSVR_ClientContext context + , RenderManager::ConstructorParameters + params + ) + { + RenderManagerD3D11Base *ret = nullptr; +#if defined(RM_USE_NVIDIA_DIRECT_D3D11) || defined(RM_USE_AMD_DIRECT_D3D11) + #if defined(RM_USE_AMD_DIRECT_D3D11) + if ((ret == nullptr) && RenderManagerAMDD3D11::DirectModeAvailable() ) { + // See if we have an AMD card. This is done by + // creating an instance of an AMD RenderManager, which will only + // be doing okay if it could load the libraries it needs. + ret = new RenderManagerAMDD3D11(context, params); + if (!ret->doingOkay()) { + delete ret; + ret = nullptr; + } + } + #endif + #if defined(RM_USE_NVIDIA_DIRECT_D3D11) + if ((ret == nullptr) && RenderManagerNVidiaD3D11::DirectModeAvailable() ) { + ret = new RenderManagerNVidiaD3D11(context, params); + if (!ret->doingOkay()) { + delete ret; + ret = nullptr; + } + } + #endif +#else + std::cerr << "openRenderManagerDirectMode: No DirectRender libraries " + "compiled into RenderManager." + << std::endl; +#endif + return ret; + } +#endif + + //======================================================================= + // Factory to create a specific instance of a RenderManager is below. + // It determines which type to construct based on the configuration + // files. + + RenderManager* createRenderManager(OSVR_ClientContext contextParameter, + const std::string& renderLibraryName, + GraphicsLibrary graphicsLibrary) { + // Null pointer return in case we can't open one. + std::unique_ptr ret; + + // Wait until we get a connection to a display object, from which we + // will + // read information that we need about display device resolutions and + // distortion correction parameters. Once we hear from the display + // device, we presume that we will also be able to read our + // RenderManager parameters. Complain as we don't hear from the + // display device. + // @todo Verify that waiting for the display is sufficient to be + // sure we'll get the RenderManager string. + OSVR_ReturnCode displayReturnCode; + OSVR_DisplayConfig display; + std::chrono::time_point start, end; + start = std::chrono::system_clock::now(); + do { + osvrClientUpdate(contextParameter); + displayReturnCode = osvrClientGetDisplay(contextParameter, &display); + end = std::chrono::system_clock::now(); + std::chrono::duration elapsed = end - start; + if (elapsed.count() >= 1) { + std::cerr << "RenderManager::createRenderManager(): Waiting to " + "get Display from server..." + << std::endl; + start = end; + } + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + } while (displayReturnCode == OSVR_RETURN_FAILURE); + std::cerr << "RenderManager::createRenderManager(): Got Display info " + "from server " + "(ignore earlier errors that occured while we were " + "waiting to connect)" + << std::endl; + + // Check the information in the pipeline configuration to determine + // what kind of renderer to instantiate. Also fill in the parameters + // to pass to the renderer. + RenderManager::ConstructorParameters p; + p.m_graphicsLibrary = graphicsLibrary; + + osvr::client::RenderManagerConfigPtr pipelineConfig; + try { + // @todo + // this should be a temporary workaround to an issue with + // RenderManagerConfig APIin osvrClient. I think it's a + // C++ cross-dll boundary issue, and making it + // a header-only lib might fix it, but we're moving the code here + // for now. + std::string configString = osvrRenderManagerGetString(contextParameter, + "/renderManagerConfig"); + osvr::client::RenderManagerConfigPtr cfg( + new osvr::client::RenderManagerConfig(configString)); + pipelineConfig = cfg; + + // this is what the code should be doing: + // pipelineConfig = + // osvr::client::RenderManagerConfigFactory::createShared(context->get()); + } catch (std::exception& /*e*/) { + std::cerr << "createRenderManager: Could not parse " + "/render_manager_parameters string from server." + << std::endl; + return nullptr; + } + if (pipelineConfig == nullptr) { + std::cerr << "createRenderManager: Could not parse " + "/render_manager_parameters string from server (NULL " + "pipelineconfig)." + << std::endl; + return nullptr; + } + p.m_directMode = pipelineConfig->getDirectMode(); + p.m_directDisplayIndex = pipelineConfig->getDisplayIndex(); + p.m_directHighPriority = pipelineConfig->getDirectHighPriority(); + p.m_numBuffers = static_cast(pipelineConfig->getNumBuffers()); + p.m_verticalSync = pipelineConfig->getVerticalSync(); + p.m_verticalSyncBlocksRendering = + pipelineConfig->getVerticalSyncBlockRendering(); + p.m_renderLibrary = renderLibraryName; + + p.m_windowTitle = pipelineConfig->getWindowTitle(); + p.m_windowFullScreen = pipelineConfig->getWindowFullScreen(); + p.m_windowXPosition = pipelineConfig->getWindowXPosition(); + p.m_windowYPosition = pipelineConfig->getWindowYPosition(); + auto rotation = pipelineConfig->getDisplayRotation(); + switch (rotation) { + case 0: + p.m_displayRotation = + RenderManager::ConstructorParameters::Display_Rotation::Zero; + break; + case 90: + p.m_displayRotation = + RenderManager::ConstructorParameters::Display_Rotation::Ninety; + break; + case 180: + p.m_displayRotation = RenderManager::ConstructorParameters:: + Display_Rotation::OneEighty; + break; + case 270: + p.m_displayRotation = RenderManager::ConstructorParameters:: + Display_Rotation::TwoSeventy; + break; + default: + std::cerr << "createRenderManager: Unrecognized display rotation (" + << rotation << ") in rendermanager config file" + << std::endl; + return nullptr; + } + p.m_bitsPerColor = pipelineConfig->getBitsPerColor(); + p.m_asynchronousTimeWarp = pipelineConfig->getAsynchronousTimeWarp(); + p.m_enableTimeWarp = pipelineConfig->getEnableTimeWarp(); + p.m_maxMSBeforeVsyncTimeWarp = + pipelineConfig->getMaxMSBeforeVsyncTimeWarp(); + p.m_renderOverfillFactor = pipelineConfig->getRenderOverfillFactor(); + p.m_renderOversampleFactor = + pipelineConfig->getRenderOversampleFactor(); + p.m_clientPredictionEnabled = + pipelineConfig->getclientPredictionEnabled(); + p.m_eyeDelaysMS.push_back(pipelineConfig->getStaticDelayMS() + + pipelineConfig->getLeftEyeDelayMS()); + p.m_eyeDelaysMS.push_back(pipelineConfig->getStaticDelayMS() + + pipelineConfig->getRightEyeDelayMS()); + p.m_clientPredictionLocalTimeOverride = + pipelineConfig->getclientPredictionLocalTimeOverride(); + + std::string jsonString; + try { + std::string jsonString = + osvrRenderManagerGetString(contextParameter, "/display"); + OSVRDisplayConfiguration displayConfig(jsonString); + p.m_displayConfiguration = displayConfig; + } catch (std::exception& /*e*/) { + std::cerr << "createRenderManager: Could not parse /display string " + "from server." + << std::endl; + return nullptr; + } + + // Determine the appropriate display VendorIds based on the name of the + // display device. Don't push any back if we don't recognize the vendor + // name. + if (p.m_displayConfiguration.getVendor() == "Oculus") { + p.addCandidatePNPID("OVR"); // 0xD23E + } else if (p.m_displayConfiguration.getVendor() == "OSVR" || + p.m_displayConfiguration.getVendor() == "Sensics") { + // There are two possible vendor IDs for OSVR. We push them both + // here. + p.addCandidatePNPID("SVR"); // 0xD24E + p.addCandidatePNPID("SEN"); // 0xAE4C + } else if (p.m_displayConfiguration.getVendor() == "Dell") { + p.addCandidatePNPID("DEL"); // 0xAC10 - for testing + } else if (p.m_displayConfiguration.getVendor() == "VVR") { + p.addCandidatePNPID("VVR"); // 0xD25A + } else if (p.m_displayConfiguration.getVendor() == "Vuzix") { + p.addCandidatePNPID("IWR"); // 0xF226 + } else if (p.m_displayConfiguration.getVendor() == "HTC") { + p.addCandidatePNPID("HVR"); // 0xD222 + } else if (p.m_displayConfiguration.getVendor() == "VRGate") { + p.addCandidatePNPID("VRG"); // 0x475A + } + p.m_directModeIndex = -1; // -1 means select based on resolution + +#if 0 + // Construct the distortion parameters based on information from the + // Core display class. + + /// @todo Implement multiple viewers. + /// Get the number of viewers. + OSVR_ViewerCount viewers; + osvrClientGetNumViewers(display, &viewers); + if (viewers != 1) { + std::cerr << "RenderManager::createRenderManager(): Multiple viewers not " + << "yet implemented" << std::endl; + return nullptr; + } + OSVR_ViewerCount viewer; + for (viewer = 0; viewer < viewers; ++viewer) { + OSVR_EyeCount eyes; + osvrClientGetNumEyesForViewer(display, viewer, &eyes); + + /// @todo Handle multiple display surfaces per eye. + OSVR_SurfaceCount surfaces; + osvrClientGetNumSurfacesForViewerEye(display, viewer, 0 /* eye */, + &surfaces); + if (surfaces != 1) { + std::cerr << "RenderManager::createRenderManager(): Multiple surfaces " + << "per eye not yet implemented" << std::endl; + return nullptr; + } + + /// Get any radial distortion parameters for each eye. + /// If an eye does not have them, use the default parameters + /// that don't do distortion and turn off the request for + /// distortion. + OSVR_EyeCount eye; + p.m_distortionCorrection = false; + for (eye = 0; eye < eyes; ++eye) { + OSVR_RadialDistortionParameters rDP; + OSVR_ReturnCode ret; + ret = osvrClientGetViewerEyeSurfaceRadialDistortion(display, + viewer, eye, 0 /*surface*/, &rDP); + if (ret == OSVR_RETURN_SUCCESS) { + // Turn on distortion correction and set the parameters for + // this eye. We assume that the parameters are in the space + // that is the size of the display. + RenderManager::DistortionParameters dP; + dP.m_desiredTriangles = 800; + std::vector COP; + COP.push_back(static_cast(rDP.centerOfProjection.data[0])); + COP.push_back(static_cast(rDP.centerOfProjection.data[1])); + dP.m_distortionCOP = COP; + std::vector K1s; + K1s.push_back(static_cast(rDP.k1.data[0])); + K1s.push_back(static_cast(rDP.k1.data[1])); + K1s.push_back(static_cast(rDP.k1.data[2])); + dP.m_distortionK1s = K1s; + // Scale the D's so that the K unit for width is with respect + // to a unity D and the K value for height is adjusted by + // the aspect ratio. + std::vector Ds; + // @todo Fill in Ds based on display size from Core. + // Get viewport from ViewerEye, getViewerEyeSurface() + // Don't divide by 2 in this case, since the viewport + // is sized for each eye. + // @todo Figure out how to handle single vs. multiple eyes + // in the same display. + Ds.push_back(1.0f); + Ds.push_back(1.0f); + //Ds.push_back(static_cast( + // p.m_displayConfiguration.getDisplayWidth()/2)); + //Ds.push_back(static_cast( + // p.m_displayConfiguration.getDisplayHeight())); + dP.m_distortionD = Ds; + p.m_distortionParameters.push_back(dP); + p.m_distortionCorrection = true; + } else { + // Push back an empty set of parameters for this eye + p.m_distortionParameters.push_back(RenderManager::DistortionParameters()); + } + } + } + +#else + // Construct the distortion parameters based on the local display + // class. + // @todo Remove once we get a general polynomial from Core. + RenderManager::DistortionParameters distortion; + distortion.m_desiredTriangles = 200 * 64; + + if (p.m_displayConfiguration.getDistortionType() == + OSVRDisplayConfiguration::RGB_SYMMETRIC_POLYNOMIALS) { + distortion.m_type = osvr::renderkit::RenderManager:: + DistortionParameters::Type::rgb_symmetric_polynomials; + std::vector Ds; + Ds.push_back( + p.m_displayConfiguration.getDistortionDistanceScaleX()); + Ds.push_back( + p.m_displayConfiguration.getDistortionDistanceScaleY()); + distortion.m_distortionD = Ds; + distortion.m_distortionPolynomialRed = + p.m_displayConfiguration.getDistortionPolynomalRed(); + distortion.m_distortionPolynomialGreen = + p.m_displayConfiguration.getDistortionPolynomalGreen(); + distortion.m_distortionPolynomialBlue = + p.m_displayConfiguration.getDistortionPolynomalBlue(); + for (size_t i = 0; i < p.m_displayConfiguration.getEyes().size(); + i++) { + std::vector COP = { + static_cast( + p.m_displayConfiguration.getEyes()[i].m_CenterProjX), + static_cast( + p.m_displayConfiguration.getEyes()[i].m_CenterProjY)}; + distortion.m_distortionCOP = COP; + p.m_distortionParameters.push_back(distortion); + } + } else if (p.m_displayConfiguration.getDistortionType() == + OSVRDisplayConfiguration::MONO_POINT_SAMPLES) { + distortion.m_type = osvr::renderkit::RenderManager:: + DistortionParameters::Type::mono_point_samples; + distortion.m_monoPointSamples = + p.m_displayConfiguration.getDistortionMonoPointMeshes(); + // Push back the same parameter set for both eyes; the parameter has + // a vector that has info for each eye, and the code that uses this + // will select the right one. + // @todo Seems like it might make more sense to pull out the + // individual parameter sets here and push back one for each eye, + // rather than sending both sets in twice. + p.m_distortionParameters.assign( + p.m_displayConfiguration.getEyes().size(), distortion); + } else if (p.m_displayConfiguration.getDistortionType() == + OSVRDisplayConfiguration::RGB_POINT_SAMPLES) { + distortion.m_type = osvr::renderkit::RenderManager:: + DistortionParameters::Type::rgb_point_samples; + distortion.m_rgbPointSamples = + p.m_displayConfiguration.getDistortionRGBPointMeshes(); + // Push back the same parameter set for both eyes; the parameter has + // a vector that has info for each eye, and the code that uses this + // will select the right one. + // @todo Seems like it might make more sense to pull out the + // individual parameter sets here and push back one for each eye, + // rather than sending both sets in twice. + p.m_distortionParameters.assign( + p.m_displayConfiguration.getEyes().size(), distortion); + } else { + std::cerr << "createRenderManager: Unrecognized distortion " + "correction type (" + << p.m_displayConfiguration.getDistortionTypeString() + << ") in display config file" << std::endl; + } +#endif + + // @todo Read the info we need from Core. + + // Open the appropriate render manager based on the rendering library + // and DirectMode selected. + if (p.m_renderLibrary == "Direct3D11") { #ifdef RM_USE_D3D11 - /// Used to open a Direct3D DirectRender RenderManager based on - /// what kind of graphics card is installed in the machine. - static RenderManagerD3D11Base *openRenderManagerDirectMode( - OSVR_ClientContext context - , RenderManager::ConstructorParameters - params - ) - { - RenderManagerD3D11Base *ret = nullptr; -#if defined(RM_USE_NVIDIA_DIRECT_D3D11) || defined(RM_USE_AMD_DIRECT_D3D11) - #if defined(RM_USE_AMD_DIRECT_D3D11) - if ((ret == nullptr) && RenderManagerAMDD3D11::DirectModeAvailable() ) { - // See if we have an AMD card. This is done by - // creating an instance of an AMD RenderManager, which will only - // be doing okay if it could load the libraries it needs. - ret = new RenderManagerAMDD3D11(context, params); - if (!ret->doingOkay()) { - delete ret; - ret = nullptr; - } - } - #endif - #if defined(RM_USE_NVIDIA_DIRECT_D3D11) - if ((ret == nullptr) && RenderManagerNVidiaD3D11::DirectModeAvailable() ) { - ret = new RenderManagerNVidiaD3D11(context, params); - if (!ret->doingOkay()) { - delete ret; - ret = nullptr; - } - } - #endif -#else - std::cerr << "openRenderManagerDirectMode: No DirectRender libraries " - "compiled into RenderManager." - << std::endl; -#endif - return ret; - } + if (p.m_directMode) { + // If we've been asked for asynchronous time warp, we layer + // the request on top of a request for a DirectRender instance + // to harness. @todo This should be doable on top of a non- + // DirectMode interface as well. + if (p.m_asynchronousTimeWarp) { + RenderManager::ConstructorParameters pTemp = p; + pTemp.m_graphicsLibrary.D3D11 = nullptr; + auto wrappedRm = openRenderManagerDirectMode(contextParameter, pTemp); + ret.reset(new RenderManagerD3D11ATW(contextParameter, p, wrappedRm)); + } else { + // Try each available DirectRender library to see if we can + // get a pointer to a RenderManager that has access to the + // DirectMode display we want to use. + ret.reset(openRenderManagerDirectMode(contextParameter, p)); + } + if (ret == nullptr) { + std::cerr << "createRenderManager: Could not open the" + << " requested DirectMode display" << std::endl; + } + } else { + ret.reset(new RenderManagerD3D11(contextParameter, p)); + } +#else + std::cerr << "createRenderManager: D3D11 render library " + "not compiled in" + << std::endl; + return nullptr; #endif - - //======================================================================= - // Factory to create a specific instance of a RenderManager is below. - // It determines which type to construct based on the configuration - // files. - - RenderManager* createRenderManager(OSVR_ClientContext contextParameter, - const std::string& renderLibraryName, - GraphicsLibrary graphicsLibrary) { - // Null pointer return in case we can't open one. - std::unique_ptr ret; - - // Wait until we get a connection to a display object, from which we - // will - // read information that we need about display device resolutions and - // distortion correction parameters. Once we hear from the display - // device, we presume that we will also be able to read our - // RenderManager parameters. Complain as we don't hear from the - // display device. - // @todo Verify that waiting for the display is sufficient to be - // sure we'll get the RenderManager string. - OSVR_ReturnCode displayReturnCode; - OSVR_DisplayConfig display; - std::chrono::time_point start, end; - start = std::chrono::system_clock::now(); - do { - osvrClientUpdate(contextParameter); - displayReturnCode = osvrClientGetDisplay(contextParameter, &display); - end = std::chrono::system_clock::now(); - std::chrono::duration elapsed = end - start; - if (elapsed.count() >= 1) { - std::cerr << "RenderManager::createRenderManager(): Waiting to " - "get Display from server..." - << std::endl; - start = end; - } - std::this_thread::sleep_for(std::chrono::milliseconds(200)); - } while (displayReturnCode == OSVR_RETURN_FAILURE); - std::cerr << "RenderManager::createRenderManager(): Got Display info " - "from server " - "(ignore earlier errors that occured while we were " - "waiting to connect)" - << std::endl; - - // Check the information in the pipeline configuration to determine - // what kind of renderer to instantiate. Also fill in the parameters - // to pass to the renderer. - RenderManager::ConstructorParameters p; - p.m_graphicsLibrary = graphicsLibrary; - - osvr::client::RenderManagerConfigPtr pipelineConfig; - try { - // @todo - // this should be a temporary workaround to an issue with - // RenderManagerConfig APIin osvrClient. I think it's a - // C++ cross-dll boundary issue, and making it - // a header-only lib might fix it, but we're moving the code here - // for now. - std::string configString = osvrRenderManagerGetString(contextParameter, - "/renderManagerConfig"); - osvr::client::RenderManagerConfigPtr cfg( - new osvr::client::RenderManagerConfig(configString)); - pipelineConfig = cfg; - - // this is what the code should be doing: - // pipelineConfig = - // osvr::client::RenderManagerConfigFactory::createShared(context->get()); - } catch (std::exception& /*e*/) { - std::cerr << "createRenderManager: Could not parse " - "/render_manager_parameters string from server." - << std::endl; - return nullptr; - } - if (pipelineConfig == nullptr) { - std::cerr << "createRenderManager: Could not parse " - "/render_manager_parameters string from server (NULL " - "pipelineconfig)." - << std::endl; - return nullptr; - } - p.m_directMode = pipelineConfig->getDirectMode(); - p.m_directDisplayIndex = pipelineConfig->getDisplayIndex(); - p.m_directHighPriority = pipelineConfig->getDirectHighPriority(); - p.m_numBuffers = static_cast(pipelineConfig->getNumBuffers()); - p.m_verticalSync = pipelineConfig->getVerticalSync(); - p.m_verticalSyncBlocksRendering = - pipelineConfig->getVerticalSyncBlockRendering(); - p.m_renderLibrary = renderLibraryName; - - p.m_windowTitle = pipelineConfig->getWindowTitle(); - p.m_windowFullScreen = pipelineConfig->getWindowFullScreen(); - p.m_windowXPosition = pipelineConfig->getWindowXPosition(); - p.m_windowYPosition = pipelineConfig->getWindowYPosition(); - auto rotation = pipelineConfig->getDisplayRotation(); - switch (rotation) { - case 0: - p.m_displayRotation = - RenderManager::ConstructorParameters::Display_Rotation::Zero; - break; - case 90: - p.m_displayRotation = - RenderManager::ConstructorParameters::Display_Rotation::Ninety; - break; - case 180: - p.m_displayRotation = RenderManager::ConstructorParameters:: - Display_Rotation::OneEighty; - break; - case 270: - p.m_displayRotation = RenderManager::ConstructorParameters:: - Display_Rotation::TwoSeventy; - break; - default: - std::cerr << "createRenderManager: Unrecognized display rotation (" - << rotation << ") in rendermanager config file" - << std::endl; - return nullptr; - } - p.m_bitsPerColor = pipelineConfig->getBitsPerColor(); - p.m_asynchronousTimeWarp = pipelineConfig->getAsynchronousTimeWarp(); - p.m_enableTimeWarp = pipelineConfig->getEnableTimeWarp(); - p.m_maxMSBeforeVsyncTimeWarp = - pipelineConfig->getMaxMSBeforeVsyncTimeWarp(); - p.m_renderOverfillFactor = pipelineConfig->getRenderOverfillFactor(); - p.m_renderOversampleFactor = - pipelineConfig->getRenderOversampleFactor(); - p.m_clientPredictionEnabled = - pipelineConfig->getclientPredictionEnabled(); - p.m_eyeDelaysMS.push_back(pipelineConfig->getStaticDelayMS() + - pipelineConfig->getLeftEyeDelayMS()); - p.m_eyeDelaysMS.push_back(pipelineConfig->getStaticDelayMS() + - pipelineConfig->getRightEyeDelayMS()); - p.m_clientPredictionLocalTimeOverride = - pipelineConfig->getclientPredictionLocalTimeOverride(); - - std::string jsonString; - try { - std::string jsonString = - osvrRenderManagerGetString(contextParameter, "/display"); - OSVRDisplayConfiguration displayConfig(jsonString); - p.m_displayConfiguration = displayConfig; - } catch (std::exception& /*e*/) { - std::cerr << "createRenderManager: Could not parse /display string " - "from server." - << std::endl; - return nullptr; - } - - // Determine the appropriate display VendorIds based on the name of the - // display device. Don't push any back if we don't recognize the vendor - // name. - if (p.m_displayConfiguration.getVendor() == "Oculus") { - p.addCandidatePNPID("OVR"); // 0xD23E - } else if (p.m_displayConfiguration.getVendor() == "OSVR" || - p.m_displayConfiguration.getVendor() == "Sensics") { - // There are two possible vendor IDs for OSVR. We push them both - // here. - p.addCandidatePNPID("SVR"); // 0xD24E - p.addCandidatePNPID("SEN"); // 0xAE4C - } else if (p.m_displayConfiguration.getVendor() == "Dell") { - p.addCandidatePNPID("DEL"); // 0xAC10 - for testing - } else if (p.m_displayConfiguration.getVendor() == "VVR") { - p.addCandidatePNPID("VVR"); // 0xD25A - } else if (p.m_displayConfiguration.getVendor() == "Vuzix") { - p.addCandidatePNPID("IWR"); // 0xF226 - } else if (p.m_displayConfiguration.getVendor() == "HTC") { - p.addCandidatePNPID("HVR"); // 0xD222 - } else if (p.m_displayConfiguration.getVendor() == "VRGate") { - p.addCandidatePNPID("VRG"); // 0x475A - } - p.m_directModeIndex = -1; // -1 means select based on resolution - -#if 0 - // Construct the distortion parameters based on information from the - // Core display class. - - /// @todo Implement multiple viewers. - /// Get the number of viewers. - OSVR_ViewerCount viewers; - osvrClientGetNumViewers(display, &viewers); - if (viewers != 1) { - std::cerr << "RenderManager::createRenderManager(): Multiple viewers not " - << "yet implemented" << std::endl; - return nullptr; - } - OSVR_ViewerCount viewer; - for (viewer = 0; viewer < viewers; ++viewer) { - OSVR_EyeCount eyes; - osvrClientGetNumEyesForViewer(display, viewer, &eyes); - - /// @todo Handle multiple display surfaces per eye. - OSVR_SurfaceCount surfaces; - osvrClientGetNumSurfacesForViewerEye(display, viewer, 0 /* eye */, - &surfaces); - if (surfaces != 1) { - std::cerr << "RenderManager::createRenderManager(): Multiple surfaces " - << "per eye not yet implemented" << std::endl; - return nullptr; - } - - /// Get any radial distortion parameters for each eye. - /// If an eye does not have them, use the default parameters - /// that don't do distortion and turn off the request for - /// distortion. - OSVR_EyeCount eye; - p.m_distortionCorrection = false; - for (eye = 0; eye < eyes; ++eye) { - OSVR_RadialDistortionParameters rDP; - OSVR_ReturnCode ret; - ret = osvrClientGetViewerEyeSurfaceRadialDistortion(display, - viewer, eye, 0 /*surface*/, &rDP); - if (ret == OSVR_RETURN_SUCCESS) { - // Turn on distortion correction and set the parameters for - // this eye. We assume that the parameters are in the space - // that is the size of the display. - RenderManager::DistortionParameters dP; - dP.m_desiredTriangles = 800; - std::vector COP; - COP.push_back(static_cast(rDP.centerOfProjection.data[0])); - COP.push_back(static_cast(rDP.centerOfProjection.data[1])); - dP.m_distortionCOP = COP; - std::vector K1s; - K1s.push_back(static_cast(rDP.k1.data[0])); - K1s.push_back(static_cast(rDP.k1.data[1])); - K1s.push_back(static_cast(rDP.k1.data[2])); - dP.m_distortionK1s = K1s; - // Scale the D's so that the K unit for width is with respect - // to a unity D and the K value for height is adjusted by - // the aspect ratio. - std::vector Ds; - // @todo Fill in Ds based on display size from Core. - // Get viewport from ViewerEye, getViewerEyeSurface() - // Don't divide by 2 in this case, since the viewport - // is sized for each eye. - // @todo Figure out how to handle single vs. multiple eyes - // in the same display. - Ds.push_back(1.0f); - Ds.push_back(1.0f); - //Ds.push_back(static_cast( - // p.m_displayConfiguration.getDisplayWidth()/2)); - //Ds.push_back(static_cast( - // p.m_displayConfiguration.getDisplayHeight())); - dP.m_distortionD = Ds; - p.m_distortionParameters.push_back(dP); - p.m_distortionCorrection = true; - } else { - // Push back an empty set of parameters for this eye - p.m_distortionParameters.push_back(RenderManager::DistortionParameters()); - } - } - } - -#else - // Construct the distortion parameters based on the local display - // class. - // @todo Remove once we get a general polynomial from Core. - RenderManager::DistortionParameters distortion; - distortion.m_desiredTriangles = 200 * 64; - - if (p.m_displayConfiguration.getDistortionType() == - OSVRDisplayConfiguration::RGB_SYMMETRIC_POLYNOMIALS) { - distortion.m_type = osvr::renderkit::RenderManager:: - DistortionParameters::Type::rgb_symmetric_polynomials; - std::vector Ds; - Ds.push_back( - p.m_displayConfiguration.getDistortionDistanceScaleX()); - Ds.push_back( - p.m_displayConfiguration.getDistortionDistanceScaleY()); - distortion.m_distortionD = Ds; - distortion.m_distortionPolynomialRed = - p.m_displayConfiguration.getDistortionPolynomalRed(); - distortion.m_distortionPolynomialGreen = - p.m_displayConfiguration.getDistortionPolynomalGreen(); - distortion.m_distortionPolynomialBlue = - p.m_displayConfiguration.getDistortionPolynomalBlue(); - for (size_t i = 0; i < p.m_displayConfiguration.getEyes().size(); - i++) { - std::vector COP = { - static_cast( - p.m_displayConfiguration.getEyes()[i].m_CenterProjX), - static_cast( - p.m_displayConfiguration.getEyes()[i].m_CenterProjY)}; - distortion.m_distortionCOP = COP; - p.m_distortionParameters.push_back(distortion); - } - } else if (p.m_displayConfiguration.getDistortionType() == - OSVRDisplayConfiguration::MONO_POINT_SAMPLES) { - distortion.m_type = osvr::renderkit::RenderManager:: - DistortionParameters::Type::mono_point_samples; - distortion.m_monoPointSamples = - p.m_displayConfiguration.getDistortionMonoPointMeshes(); - // Push back the same parameter set for both eyes; the parameter has - // a vector that has info for each eye, and the code that uses this - // will select the right one. - // @todo Seems like it might make more sense to pull out the - // individual parameter sets here and push back one for each eye, - // rather than sending both sets in twice. - p.m_distortionParameters.assign( - p.m_displayConfiguration.getEyes().size(), distortion); - } else if (p.m_displayConfiguration.getDistortionType() == - OSVRDisplayConfiguration::RGB_POINT_SAMPLES) { - distortion.m_type = osvr::renderkit::RenderManager:: - DistortionParameters::Type::rgb_point_samples; - distortion.m_rgbPointSamples = - p.m_displayConfiguration.getDistortionRGBPointMeshes(); - // Push back the same parameter set for both eyes; the parameter has - // a vector that has info for each eye, and the code that uses this - // will select the right one. - // @todo Seems like it might make more sense to pull out the - // individual parameter sets here and push back one for each eye, - // rather than sending both sets in twice. - p.m_distortionParameters.assign( - p.m_displayConfiguration.getEyes().size(), distortion); - } else { - std::cerr << "createRenderManager: Unrecognized distortion " - "correction type (" - << p.m_displayConfiguration.getDistortionTypeString() - << ") in display config file" << std::endl; - } -#endif - - // @todo Read the info we need from Core. - - // Open the appropriate render manager based on the rendering library - // and DirectMode selected. - if (p.m_renderLibrary == "Direct3D11") { -#ifdef RM_USE_D3D11 - if (p.m_directMode) { - // If we've been asked for asynchronous time warp, we layer - // the request on top of a request for a DirectRender instance - // to harness. @todo This should be doable on top of a non- - // DirectMode interface as well. - if (p.m_asynchronousTimeWarp) { - RenderManager::ConstructorParameters pTemp = p; - pTemp.m_graphicsLibrary.D3D11 = nullptr; - auto wrappedRm = openRenderManagerDirectMode(contextParameter, pTemp); - ret.reset(new RenderManagerD3D11ATW(contextParameter, p, wrappedRm)); - } else { - // Try each available DirectRender library to see if we can - // get a pointer to a RenderManager that has access to the - // DirectMode display we want to use. - ret.reset(openRenderManagerDirectMode(contextParameter, p)); - } - if (ret == nullptr) { - std::cerr << "createRenderManager: Could not open the" - << " requested DirectMode display" << std::endl; - } - } else { - ret.reset(new RenderManagerD3D11(contextParameter, p)); - } -#else - std::cerr << "createRenderManager: D3D11 render library " - "not compiled in" - << std::endl; - return nullptr; -#endif - } else if (p.m_renderLibrary == "OpenGL") { - if (p.m_directMode) { -// DirectMode is currently only implemented under Direct3D11, -// so we wrap this with an OpenGL renderer. -#if defined(RM_USE_NVIDIA_DIRECT_D3D11_OPENGL) && !defined(RM_USE_OPENGLES20) - // Set the parameters on the harnessed renderer to not apply the - // rendering fixes that we're applying. Also set its render - // library - // to match. - RenderManager::ConstructorParameters p2 = p; - p2.m_renderLibrary = "Direct3D11"; - p2.m_directMode = true; - - // @todo This needs to be fixed elsewhere, and generalized to - // work with all forms of distortion correction. - // Flip y on the center of projection on the distortion - // correction, because we're going to be rendering in OpenGL - // but distorting in D3D, and they use a different texture - // orientation. - // When we do this, we need to take into account the D scaling - // factor being applied to the center of projection; first - // scaling back into unity, then flipping, then rescaling. - for (size_t eye = 0; eye < p.m_distortionParameters.size(); - ++eye) { - if (p2.m_distortionParameters[eye].m_distortionCOP.size() < - 2) { - std::cerr << "createRenderManager: Insufficient " - "distortion parameters" - << std::endl; - return nullptr; - } - if (p2.m_distortionParameters[eye].m_distortionD.size() < - 2) { - std::cerr << "createRenderManager: Insufficient " - "distortion parameters" - << std::endl; - return nullptr; - } - float original = - p2.m_distortionParameters[eye].m_distortionCOP[1]; - float normalized = - original / - p2.m_distortionParameters[eye].m_distortionD[1]; - float flipped = 1.0f - normalized; - float scaled = - flipped * - p2.m_distortionParameters[eye].m_distortionD[1]; - p2.m_distortionParameters[eye].m_distortionCOP[1] = scaled; - } - - // If we've been asked for asynchronous time warp, we layer - // the request on top of a request for a DirectRender instance - // to harness. @todo This should be doable on top of a non- - // DirectMode interface as well. - std::unique_ptr host = nullptr; - if (p.m_asynchronousTimeWarp) { - RenderManager::ConstructorParameters pTemp = p2; - pTemp.m_graphicsLibrary.D3D11 = nullptr; - auto wrappedRm = openRenderManagerDirectMode(contextParameter, pTemp); - host.reset(new RenderManagerD3D11ATW(contextParameter, p2, wrappedRm)); - } else { - // Try each available DirectRender library to see if we can - // get a pointer to a RenderManager that has access to the - // DirectMode display we want to use. - host.reset(openRenderManagerDirectMode(contextParameter, p2)); - } - if (host == nullptr) { - std::cerr << "createRenderManager: Could not open the" - << " requested harnessed DirectMode display" << std::endl; - } - - ret.reset( - new RenderManagerD3D11OpenGL(contextParameter, p, std::move(host))); -#else - std::cerr - << "createRenderManager: D3D11OpenGL render library not " - "compiled in" - << std::endl; - return nullptr; -#endif - } else { -#ifdef RM_USE_OPENGL - ret.reset(new RenderManagerOpenGL(contextParameter, p)); -#else - std::cerr << "createRenderManager: OpenGL render library not " - "compiled in" - << std::endl; - return nullptr; -#endif - } - } else { - std::cerr << "createRenderManager: Unrecognized render library: " - << p.m_renderLibrary << std::endl; - return nullptr; - } - - // Check and see if the render manager is doing okay. If not, return - // nullptr after deleting it. - if (!ret->doingOkay()) { - return nullptr; - } - - // Return the render manager. - return ret.release(); - } - -} // namespace renderkit -} // namespace osvr + } else if (p.m_renderLibrary == "OpenGL") { + if (p.m_directMode) { +// DirectMode is currently only implemented under Direct3D11, +// so we wrap this with an OpenGL renderer. +#if defined(RM_USE_NVIDIA_DIRECT_D3D11_OPENGL) && !defined(RM_USE_OPENGLES20) + // Set the parameters on the harnessed renderer to not apply the + // rendering fixes that we're applying. Also set its render + // library + // to match. + RenderManager::ConstructorParameters p2 = p; + p2.m_renderLibrary = "Direct3D11"; + p2.m_directMode = true; + + // @todo This needs to be fixed elsewhere, and generalized to + // work with all forms of distortion correction. + // Flip y on the center of projection on the distortion + // correction, because we're going to be rendering in OpenGL + // but distorting in D3D, and they use a different texture + // orientation. + // When we do this, we need to take into account the D scaling + // factor being applied to the center of projection; first + // scaling back into unity, then flipping, then rescaling. + for (size_t eye = 0; eye < p.m_distortionParameters.size(); + ++eye) { + if (p2.m_distortionParameters[eye].m_distortionCOP.size() < + 2) { + std::cerr << "createRenderManager: Insufficient " + "distortion parameters" + << std::endl; + return nullptr; + } + if (p2.m_distortionParameters[eye].m_distortionD.size() < + 2) { + std::cerr << "createRenderManager: Insufficient " + "distortion parameters" + << std::endl; + return nullptr; + } + float original = + p2.m_distortionParameters[eye].m_distortionCOP[1]; + float normalized = + original / + p2.m_distortionParameters[eye].m_distortionD[1]; + float flipped = 1.0f - normalized; + float scaled = + flipped * + p2.m_distortionParameters[eye].m_distortionD[1]; + p2.m_distortionParameters[eye].m_distortionCOP[1] = scaled; + } + + // If we've been asked for asynchronous time warp, we layer + // the request on top of a request for a DirectRender instance + // to harness. @todo This should be doable on top of a non- + // DirectMode interface as well. + std::unique_ptr host = nullptr; + if (p.m_asynchronousTimeWarp) { + RenderManager::ConstructorParameters pTemp = p2; + pTemp.m_graphicsLibrary.D3D11 = nullptr; + auto wrappedRm = openRenderManagerDirectMode(contextParameter, pTemp); + host.reset(new RenderManagerD3D11ATW(contextParameter, p2, wrappedRm)); + } else { + // Try each available DirectRender library to see if we can + // get a pointer to a RenderManager that has access to the + // DirectMode display we want to use. + host.reset(openRenderManagerDirectMode(contextParameter, p2)); + } + if (host == nullptr) { + std::cerr << "createRenderManager: Could not open the" + << " requested harnessed DirectMode display" << std::endl; + } + + ret.reset( + new RenderManagerD3D11OpenGL(contextParameter, p, std::move(host))); +#else + std::cerr + << "createRenderManager: D3D11OpenGL render library not " + "compiled in" + << std::endl; + return nullptr; +#endif + } else { +#ifdef RM_USE_OPENGL + ret.reset(new RenderManagerOpenGL(contextParameter, p)); +#else + std::cerr << "createRenderManager: OpenGL render library not " + "compiled in" + << std::endl; + return nullptr; +#endif + } + } else { + std::cerr << "createRenderManager: Unrecognized render library: " + << p.m_renderLibrary << std::endl; + return nullptr; + } + + // Check and see if the render manager is doing okay. If not, return + // nullptr after deleting it. + if (!ret->doingOkay()) { + return nullptr; + } + + // Return the render manager. + return ret.release(); + } + +} // namespace renderkit +} // namespace osvr diff --git a/osvr/RenderKit/RenderManagerD3D11ATW.h b/osvr/RenderKit/RenderManagerD3D11ATW.h index 07313a5..ec87cff 100644 --- a/osvr/RenderKit/RenderManagerD3D11ATW.h +++ b/osvr/RenderKit/RenderManagerD3D11ATW.h @@ -190,14 +190,14 @@ namespace osvr { // handing them over to the ATW thread. We flush our queue so that // rendering will get moving right away. if (m_completionQuery) { - m_D3D11Context->End(m_completionQuery); + m_D3D11Context->End(m_completionQuery); m_D3D11Context->Flush(); - while (S_FALSE == - m_D3D11Context->GetData(m_completionQuery, nullptr, 0, 0)) { - // We don't want to miss the completion because Windows has - // swapped us out, so we busy-wait here on the completion - // event. - } + while (S_FALSE == + m_D3D11Context->GetData(m_completionQuery, nullptr, 0, 0)) { + // We don't want to miss the completion because Windows has + // swapped us out, so we busy-wait here on the completion + // event. + } } // Lock our mutex so we don't adjust the buffers while rendering is happening. @@ -331,15 +331,15 @@ namespace osvr { // we use that. Otherwise, we set the threshold to 1ms // to give us some time to swap things out before vsync. bool timeToPresent = false; - - // Convert from milliseconds to seconds - float thresholdF = m_params.m_maxMSBeforeVsyncTimeWarp / 1e3f; - if (thresholdF == 0) { thresholdF = 1e-3f; } - OSVR_TimeValue threshold; - threshold.seconds = static_cast(thresholdF); - thresholdF -= threshold.seconds; - threshold.microseconds = - static_cast(thresholdF * 1e6); + + // Convert from milliseconds to seconds + float thresholdF = m_params.m_maxMSBeforeVsyncTimeWarp / 1e3f; + if (thresholdF == 0) { thresholdF = 1e-3f; } + OSVR_TimeValue threshold; + threshold.seconds = static_cast(thresholdF); + thresholdF -= threshold.seconds; + threshold.microseconds = + static_cast(thresholdF * 1e6); // We use the timing info from the first display to // determine when it is time to present. @@ -351,12 +351,12 @@ namespace osvr { if (!mRenderManager->GetTimingInfo(0, timing)) { std::cerr << "RenderManagerThread::threadFunc() = couldn't get timing info" << std::endl; } - OSVR_TimeValue nextRetrace = timing.hardwareDisplayInterval; - osvrTimeValueDifference(&nextRetrace, - &timing.timeSincelastVerticalRetrace); - if (osvrTimeValueGreater(&threshold, &nextRetrace)) { - timeToPresent = true; - } + OSVR_TimeValue nextRetrace = timing.hardwareDisplayInterval; + osvrTimeValueDifference(&nextRetrace, + &timing.timeSincelastVerticalRetrace); + if (osvrTimeValueGreater(&threshold, &nextRetrace)) { + timeToPresent = true; + } if (timeToPresent) { // Lock our mutex so that we're not rendering while new buffers are @@ -516,8 +516,8 @@ namespace osvr { // twice or more, with multiple eyes packed into the same one. We // don't want to duplicate that buffer more than once. - D3D11_TEXTURE2D_DESC info; - buffers[i].D3D11->colorBuffer->GetDesc(&info); + D3D11_TEXTURE2D_DESC info; + buffers[i].D3D11->colorBuffer->GetDesc(&info); D3D11_TEXTURE2D_DESC textureDesc = {}; textureDesc.Width = info.Width; diff --git a/osvr/RenderKit/RenderManagerD3DBase.cpp b/osvr/RenderKit/RenderManagerD3DBase.cpp index 44b8431..dfcc66c 100755 --- a/osvr/RenderKit/RenderManagerD3DBase.cpp +++ b/osvr/RenderKit/RenderManagerD3DBase.cpp @@ -1042,14 +1042,14 @@ namespace renderkit { (m_params.m_verticalSync || m_params.m_verticalSyncBlocksRendering))) { if (m_completionQuery) { - m_D3D11Context->End(m_completionQuery); + m_D3D11Context->End(m_completionQuery); m_D3D11Context->Flush(); - while (S_FALSE == - m_D3D11Context->GetData(m_completionQuery, nullptr, 0, 0)) { - // We don't want to miss the completion because Windows has - // swapped us out, so we busy-wait here on the completion - // event. - } + while (S_FALSE == + m_D3D11Context->GetData(m_completionQuery, nullptr, 0, 0)) { + // We don't want to miss the completion because Windows has + // swapped us out, so we busy-wait here on the completion + // event. + } } } @@ -1366,10 +1366,10 @@ namespace renderkit { // make things render correctly when working with Unity or // Unreal. When this was taken out, we got black screens on // both of them, even though the demo apps worked. - D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc = {}; - shaderResourceViewDesc.Format = shaderResourceViewFormat; - shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - shaderResourceViewDesc.Texture2D.MostDetailedMip = 0; + D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc = {}; + shaderResourceViewDesc.Format = shaderResourceViewFormat; + shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + shaderResourceViewDesc.Texture2D.MostDetailedMip = 0; shaderResourceViewDesc.Texture2D.MipLevels = 1; // We pass a nullptr to the description, resulting in a view that // can access the entire resource. diff --git a/osvr_server_config.RenderManager.sample.json b/osvr_server_config.RenderManager.sample.json index 6538be8..8e4207c 100755 --- a/osvr_server_config.RenderManager.sample.json +++ b/osvr_server_config.RenderManager.sample.json @@ -1,37 +1,37 @@ -{ - "plugins": [ - "com_osvr_VideoBasedHMDTracker" /* This is a manual-load plugin, so we must explicitly list it */ - ], - "drivers": [ - { - "plugin": "org_opengoggles_bundled_Multiserver", - "driver": "YEI_3Space_Sensor", - "params": { - "port": "COM3" - } - } - ], - "routes": [ - { - "destination": "/me/hands/left", - "source": { - "changeBasis": { - "x": "x", - "y": "z", - "z": "-y" - }, - "child": { - "tracker": "/org_opengoggles_bundled_Multiserver/YEI_3Space_Sensor0", - "sensor": 0 - } - } - }, - { - "destination": "/me/head", - "source": { - "tracker": "/com_osvr_VideoBasedHMDTracker/TrackedCamera0_0", - "sensor": 0 - } - } - ] -} +{ + "plugins": [ + "com_osvr_VideoBasedHMDTracker" /* This is a manual-load plugin, so we must explicitly list it */ + ], + "drivers": [ + { + "plugin": "org_opengoggles_bundled_Multiserver", + "driver": "YEI_3Space_Sensor", + "params": { + "port": "COM3" + } + } + ], + "routes": [ + { + "destination": "/me/hands/left", + "source": { + "changeBasis": { + "x": "x", + "y": "z", + "z": "-y" + }, + "child": { + "tracker": "/org_opengoggles_bundled_Multiserver/YEI_3Space_Sensor0", + "sensor": 0 + } + } + }, + { + "destination": "/me/head", + "source": { + "tracker": "/com_osvr_VideoBasedHMDTracker/TrackedCamera0_0", + "sensor": 0 + } + } + ] +} diff --git a/vendor/CMakeLists.txt b/vendor/CMakeLists.txt index 07b018a..1b0e19f 100644 --- a/vendor/CMakeLists.txt +++ b/vendor/CMakeLists.txt @@ -2,7 +2,7 @@ if(NOT (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/vrpn/vrpn_Connection.h")) message(FATAL_ERROR "You are missing the VRPN git submodule. You can get it now by running git submodule init vendor/vrpn; git submodule update from the root source directory.") endif() -set(BUILD_SHARED_LIBS OFF) +set(BUILD_SHARED_LIBS OFF) # Build VRPN as subproject set(VRPN_GPL_SERVER FALSE CACHE BOOL "" FORCE) @@ -12,13 +12,13 @@ set(VRPN_USE_LOCAL_HIDAPI FALSE CACHE BOOL "" FORCE) set(VRPN_USE_LOCAL_JSONCPP FALSE CACHE BOOL "" FORCE) add_subdirectory(vrpn) -# Create an interface target to more easily consume VRPN internally. -add_library(vendored-vrpn INTERFACE) -target_link_libraries(vendored-vrpn INTERFACE ${VRPN_CLIENT_LIBRARY}) -target_include_directories(vendored-vrpn INTERFACE ${VRPN_INCLUDE_DIRS}) -target_compile_definitions(vendored-vrpn INTERFACE ${VRPN_DEFINITIONS}) - -# Create an interface target to more easily consume quatlib internally. -add_library(vendored-quat INTERFACE) -target_link_libraries(vendored-quat INTERFACE quat) -target_include_directories(vendored-quat INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/vrpn/quat") +# Create an interface target to more easily consume VRPN internally. +add_library(vendored-vrpn INTERFACE) +target_link_libraries(vendored-vrpn INTERFACE ${VRPN_CLIENT_LIBRARY}) +target_include_directories(vendored-vrpn INTERFACE ${VRPN_INCLUDE_DIRS}) +target_compile_definitions(vendored-vrpn INTERFACE ${VRPN_DEFINITIONS}) + +# Create an interface target to more easily consume quatlib internally. +add_library(vendored-quat INTERFACE) +target_link_libraries(vendored-quat INTERFACE quat) +target_include_directories(vendored-quat INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/vrpn/quat")